summaryrefslogtreecommitdiff
path: root/systems/doc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/doc
Initial commit
Diffstat (limited to 'systems/doc')
-rw-r--r--systems/doc/aleph/News47
-rw-r--r--systems/doc/aleph/readme.txt4
-rw-r--r--systems/doc/chktex/ChkTeX.pdfbin0 -> 355998 bytes
-rw-r--r--systems/doc/dvipdfmx/README510
-rw-r--r--systems/doc/dvipdfmx/dvipdfmx-special.pdfbin0 -> 179950 bytes
-rw-r--r--systems/doc/dvipdfmx/dvipdfmx-special.tex608
-rw-r--r--systems/doc/dvipdfmx/dvipdfmx.pdfbin0 -> 261192 bytes
-rw-r--r--systems/doc/dvipdfmx/dvipdfmx.tex2240
-rw-r--r--systems/doc/dvipdfmx/fdl-1.3.txt451
-rw-r--r--systems/doc/dvipdfmx/tug2003-slides.pdfbin0 -> 279575 bytes
-rw-r--r--systems/doc/dvipdfmx/tug2005.pdfbin0 -> 2595371 bytes
-rw-r--r--systems/doc/dvipng/dvipng.html1523
-rw-r--r--systems/doc/dvipng/dvipng.pdfbin0 -> 220307 bytes
-rw-r--r--systems/doc/dvips/NEWS78
-rw-r--r--systems/doc/dvips/README43
-rw-r--r--systems/doc/dvips/dvips.html6250
-rw-r--r--systems/doc/dvips/dvips.pdfbin0 -> 405527 bytes
-rw-r--r--systems/doc/etex/NTS-FAQ1015
-rw-r--r--systems/doc/etex/etex_gen.tex286
-rw-r--r--systems/doc/etex/etex_man.pdf3135
-rw-r--r--systems/doc/etex/etex_man.sty92
-rw-r--r--systems/doc/etex/etex_man.tex1150
-rw-r--r--systems/doc/etex/etex_ref.html917
-rw-r--r--systems/doc/etex/etex_src.html540
-rw-r--r--systems/doc/etex/legal.html52
-rw-r--r--systems/doc/etex/nts-group.html42
-rw-r--r--systems/doc/etex/webmerge.tex392
-rw-r--r--systems/doc/kpathsea/kpathsea.html5241
-rw-r--r--systems/doc/kpathsea/kpathsea.pdfbin0 -> 301846 bytes
-rw-r--r--systems/doc/luatex/luatex-backend.tex1084
-rw-r--r--systems/doc/luatex/luatex-callbacks.tex1149
-rw-r--r--systems/doc/luatex/luatex-contents.tex19
-rw-r--r--systems/doc/luatex/luatex-enhancements.tex1371
-rw-r--r--systems/doc/luatex/luatex-export-titlepage.tex31
-rw-r--r--systems/doc/luatex/luatex-firstpage.tex32
-rw-r--r--systems/doc/luatex/luatex-fontloader.tex1164
-rw-r--r--systems/doc/luatex/luatex-fonts.tex858
-rw-r--r--systems/doc/luatex/luatex-graphics.tex831
-rw-r--r--systems/doc/luatex/luatex-introduction.tex174
-rw-r--r--systems/doc/luatex/luatex-languages.tex1113
-rw-r--r--systems/doc/luatex/luatex-logos.tex21
-rw-r--r--systems/doc/luatex/luatex-lua.tex760
-rw-r--r--systems/doc/luatex/luatex-math.tex1647
-rw-r--r--systems/doc/luatex/luatex-modifications.tex1380
-rw-r--r--systems/doc/luatex/luatex-nodes.tex2664
-rw-r--r--systems/doc/luatex/luatex-preamble.tex110
-rw-r--r--systems/doc/luatex/luatex-registers.tex47
-rw-r--r--systems/doc/luatex/luatex-statistics.tex17
-rw-r--r--systems/doc/luatex/luatex-style.tex443
-rw-r--r--systems/doc/luatex/luatex-tex.tex2774
-rw-r--r--systems/doc/luatex/luatex-titlepage.tex53
-rw-r--r--systems/doc/luatex/luatex.pdfbin0 -> 1560213 bytes
-rw-r--r--systems/doc/luatex/luatex.tex103
-rw-r--r--systems/doc/metapost/CHANGES1590
-rw-r--r--systems/doc/metapost/grdemo-doc.pdfbin0 -> 7430 bytes
-rw-r--r--systems/doc/metapost/grdemo.pdfbin0 -> 3044 bytes
-rw-r--r--systems/doc/metapost/mpboxes.pdfbin0 -> 376204 bytes
-rw-r--r--systems/doc/metapost/mpgraph.pdfbin0 -> 472517 bytes
-rw-r--r--systems/doc/metapost/mpintro.pdfbin0 -> 234831 bytes
-rw-r--r--systems/doc/metapost/mplibapi.pdfbin0 -> 280407 bytes
-rw-r--r--systems/doc/metapost/mpman.pdfbin0 -> 957617 bytes
-rw-r--r--systems/doc/metapost/source-manual/Makefile89
-rw-r--r--systems/doc/metapost/source-manual/README21
-rw-r--r--systems/doc/metapost/source-manual/TODO124
-rw-r--r--systems/doc/metapost/source-manual/agepop91.d85
-rw-r--r--systems/doc/metapost/source-manual/agepopm.d85
-rw-r--r--systems/doc/metapost/source-manual/charts.mp120
-rw-r--r--systems/doc/metapost/source-manual/cm2lm.map8
-rw-r--r--systems/doc/metapost/source-manual/countries.d60
-rw-r--r--systems/doc/metapost/source-manual/ctabbing.sty18
-rw-r--r--systems/doc/metapost/source-manual/demo.ms105
-rw-r--r--systems/doc/metapost/source-manual/energy.d75
-rw-r--r--systems/doc/metapost/source-manual/figs.1227
-rw-r--r--systems/doc/metapost/source-manual/figs.mp24
-rw-r--r--systems/doc/metapost/source-manual/grdemo-doc.ms184
-rw-r--r--systems/doc/metapost/source-manual/grdemo-doc.ps1025
-rw-r--r--systems/doc/metapost/source-manual/grdemo.eps779
-rw-r--r--systems/doc/metapost/source-manual/grdemo.mp37
-rw-r--r--systems/doc/metapost/source-manual/grdemo.ms124
-rw-r--r--systems/doc/metapost/source-manual/lead.d24
-rw-r--r--systems/doc/metapost/source-manual/matmul.d21
-rw-r--r--systems/doc/metapost/source-manual/mpboxes.bib19
-rw-r--r--systems/doc/metapost/source-manual/mpboxes.mp146
-rw-r--r--systems/doc/metapost/source-manual/mpboxes.tex572
-rw-r--r--systems/doc/metapost/source-manual/mpgraph.bib98
-rw-r--r--systems/doc/metapost/source-manual/mpgraph.mp141
-rw-r--r--systems/doc/metapost/source-manual/mpgraph.tex1044
-rw-r--r--systems/doc/metapost/source-manual/mplibapi.tex1572
-rw-r--r--systems/doc/metapost/source-manual/mpman-app-legacy.tex347
-rw-r--r--systems/doc/metapost/source-manual/mpman-app-numbersystems.tex98
-rw-r--r--systems/doc/metapost/source-manual/mpman-app-optab.tex156
-rw-r--r--systems/doc/metapost/source-manual/mpman-app-refman.tex1068
-rw-r--r--systems/doc/metapost/source-manual/mpman-charts.mp210
-rw-r--r--systems/doc/metapost/source-manual/mpman.bib135
-rw-r--r--systems/doc/metapost/source-manual/mpman.ist4
-rw-r--r--systems/doc/metapost/source-manual/mpman.mp851
-rw-r--r--systems/doc/metapost/source-manual/mpman.tex6008
-rw-r--r--systems/doc/metapost/source-manual/timepop.d21
-rw-r--r--systems/doc/metapost/source-tutorial/Makefile66
-rw-r--r--systems/doc/metapost/source-tutorial/abstract.tex17
-rw-r--r--systems/doc/metapost/source-tutorial/annulus.mp92
-rw-r--r--systems/doc/metapost/source-tutorial/arrows.tex34
-rw-r--r--systems/doc/metapost/source-tutorial/biblio.tex3
-rw-r--r--systems/doc/metapost/source-tutorial/circles.mp22
-rw-r--r--systems/doc/metapost/source-tutorial/commands.tex13
-rw-r--r--systems/doc/metapost/source-tutorial/compilation.tex56
-rw-r--r--systems/doc/metapost/source-tutorial/conclusion.tex13
-rw-r--r--systems/doc/metapost/source-tutorial/data.d6
-rw-r--r--systems/doc/metapost/source-tutorial/data.mp26
-rw-r--r--systems/doc/metapost/source-tutorial/data.tex159
-rw-r--r--systems/doc/metapost/source-tutorial/draw.mp44
-rw-r--r--systems/doc/metapost/source-tutorial/draw.tex46
-rw-r--r--systems/doc/metapost/source-tutorial/fill.mp22
-rw-r--r--systems/doc/metapost/source-tutorial/fill.tex108
-rw-r--r--systems/doc/metapost/source-tutorial/graph.tex52
-rw-r--r--systems/doc/metapost/source-tutorial/inclusion.tex23
-rw-r--r--systems/doc/metapost/source-tutorial/intro.tex56
-rw-r--r--systems/doc/metapost/source-tutorial/label.mp63
-rw-r--r--systems/doc/metapost/source-tutorial/label.tex99
-rw-r--r--systems/doc/metapost/source-tutorial/mpintro.bib35
-rw-r--r--systems/doc/metapost/source-tutorial/mpintro.ltx182
-rw-r--r--systems/doc/metapost/source-tutorial/paperclip.mp25
-rw-r--r--systems/doc/metapost/source-tutorial/parabola.mp45
-rw-r--r--systems/doc/metapost/source-tutorial/previewer.eps378
-rw-r--r--systems/doc/metapost/source-tutorial/previewer.pdfbin0 -> 20074 bytes
-rw-r--r--systems/doc/metapost/source-tutorial/previewer.pngbin0 -> 16035 bytes
-rw-r--r--systems/doc/pdftex/NEWS720
-rw-r--r--systems/doc/pdftex/README60
-rw-r--r--systems/doc/pdftex/manual/ChangeLog254
-rw-r--r--systems/doc/pdftex/manual/Makefile140
-rw-r--r--systems/doc/pdftex/manual/README29
-rw-r--r--systems/doc/pdftex/manual/makefiles.cmd13
-rw-r--r--systems/doc/pdftex/manual/pdftex-a.pdfbin0 -> 819006 bytes
-rw-r--r--systems/doc/pdftex/manual/pdftex-i.tex136
-rw-r--r--systems/doc/pdftex/manual/pdftex-syntax.txt220
-rw-r--r--systems/doc/pdftex/manual/pdftex-t.tex5151
-rw-r--r--systems/doc/pdftex/manual/pdftex-w.tex9
-rw-r--r--systems/doc/pdftex/manual/syntaxform.awk124
-rwxr-xr-xsystems/doc/pdftex/manual/syntaxform.pl131
-rw-r--r--systems/doc/pdftex/samplepdftex/cmr10.103255
-rw-r--r--systems/doc/pdftex/samplepdftex/obj.dat4
-rw-r--r--systems/doc/pdftex/samplepdftex/pdfcolor.tex158
-rw-r--r--systems/doc/pdftex/samplepdftex/pic.eps12486
-rw-r--r--systems/doc/pdftex/samplepdftex/pic.jpgbin0 -> 111645 bytes
-rw-r--r--systems/doc/pdftex/samplepdftex/pic.mps22
-rw-r--r--systems/doc/pdftex/samplepdftex/pic.pdfbin0 -> 36792 bytes
-rw-r--r--systems/doc/pdftex/samplepdftex/pic.pngbin0 -> 222357 bytes
-rw-r--r--systems/doc/pdftex/samplepdftex/pic16.pngbin0 -> 129987 bytes
-rw-r--r--systems/doc/pdftex/samplepdftex/rgb.iccbin0 -> 744 bytes
-rw-r--r--systems/doc/pdftex/samplepdftex/samplepdf.024
-rw-r--r--systems/doc/pdftex/samplepdftex/samplepdf.124
-rw-r--r--systems/doc/pdftex/samplepdftex/samplepdf.tex1295
-rw-r--r--systems/doc/pdftex/samplepdftex/supp-mis.tex695
-rw-r--r--systems/doc/pdftex/samplepdftex/supp-pdf.tex2191
-rw-r--r--systems/doc/pdftex/samplepdftex/tmp.pdfbin0 -> 3031 bytes
-rw-r--r--systems/doc/pdftex/tests/01-fake-interword-space/Makefile7
-rw-r--r--systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.pfbbin0 -> 2409 bytes
-rw-r--r--systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.tfmbin0 -> 152 bytes
-rw-r--r--systems/doc/pdftex/tests/01-fake-interword-space/fake-interword-space.tex34
-rw-r--r--systems/doc/pdftex/tests/02-pdfmatch/Makefile10
-rw-r--r--systems/doc/pdftex/tests/02-pdfmatch/test-pdfmatch.tex22
-rw-r--r--systems/doc/pdftex/tests/03-deterministic-output/Makefile48
-rw-r--r--systems/doc/pdftex/tests/03-deterministic-output/test-SOURCE_DATE_EPOCH.tex10
-rw-r--r--systems/doc/pdftex/tests/03-deterministic-output/test-fixed-date-id.tex16
-rw-r--r--systems/doc/pdftex/tests/03-deterministic-output/test-no-date-id.tex13
-rw-r--r--systems/doc/pdftex/tests/03-deterministic-output/test-prim.tex11
-rw-r--r--systems/doc/pdftex/tests/04-pdfsuppressptexinfo/Makefile40
-rw-r--r--systems/doc/pdftex/tests/04-pdfsuppressptexinfo/abc.tex10
-rw-r--r--systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfinfoomitdate.tex4
-rw-r--r--systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfsuppressptexinfo.tex18
-rw-r--r--systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdftrailer.tex6
-rw-r--r--systems/doc/pdftex/tests/05-mediabox/Makefile18
-rw-r--r--systems/doc/pdftex/tests/05-mediabox/test-normal.tex7
-rw-r--r--systems/doc/pdftex/tests/05-mediabox/test-omit-mediabox.tex8
-rw-r--r--systems/doc/pdftex/tests/06-pkmap/Makefile24
-rw-r--r--systems/doc/pdftex/tests/06-pkmap/cmb10.72pkbin0 -> 1952 bytes
-rw-r--r--systems/doc/pdftex/tests/06-pkmap/cmr10.72pkbin0 -> 1940 bytes
-rw-r--r--systems/doc/pdftex/tests/06-pkmap/prepatch.pdfbin0 -> 3045 bytes
-rw-r--r--systems/doc/pdftex/tests/06-pkmap/test-pkmap.tex37
-rw-r--r--systems/doc/pdftex/tests/07-mapwarn/Makefile12
-rw-r--r--systems/doc/pdftex/tests/07-mapwarn/test-mapwarn.tex18
-rw-r--r--systems/doc/pdftex/tests/Common.mak34
-rw-r--r--systems/doc/xetex/NEWS207
-rw-r--r--systems/doc/xetex/README15
-rw-r--r--systems/doc/xetex/XeTeX-notes.pdfbin0 -> 594620 bytes
-rw-r--r--systems/doc/xetex/XeTeX-notes.tex336
186 files changed, 86567 insertions, 0 deletions
diff --git a/systems/doc/aleph/News b/systems/doc/aleph/News
new file mode 100644
index 0000000000..d9ebd07d77
--- /dev/null
+++ b/systems/doc/aleph/News
@@ -0,0 +1,47 @@
+The build infrastructure continues to be maintained, and aleph sources
+and binaries included in TeX Live. This is primarily so that existing
+omega and aleph documents can still be processed. No significant new
+features have been added to Aleph for some years.
+
+20040322: RC2 released.
+ * TeX 3.141592
+ * no more dependency on the Omega 1.15 source tree
+ * rename e-Omega to Aleph
+ * Fix: crash when \overfullrule > 0pt
+ * Fix: \charit gives wrong result
+ * Fix: text is offset when typesetting non-TLT text
+ * Fix: leaders crashing or stalling the program
+ * Add: \boxdir to retrieve or set the direction
+ of a box
+ * Add: \pagerighoffset, \pagebottomoffset to set the
+ right and bottom margin in non-TLT text
+ * Add: a big set of commands to retrieve version
+ info:
+for each feature-set (Omega, eTeX, Aleph), the commands are:
+
+\<featureset>Version the expansion is a list of character
+tokens of category 12 (other) representing the featureset
+version number; (1.15 for \OmegaVersion, 0 (RC2) for
+\AlephVersion, 2.1 for \eTeXVersion) (inherited from Omega)
+
+\<featureset>revision the expansion is a list of character
+tokens of category 12 (other) representing the featureset
+minor version number; (.15 for \Omegarevision, (RC2) for
+\Alephrevision, .1 for \eTeXrevion) (inherited from e-TeX)
+
+\<featureset>version an integer value representing the
+featureset major version number (1 for \Omegaversion, 0 for
+\Alephversion, 2 for \eTeXversion) (inherited from e-TeX)
+
+\<featureset>minorversion an integer value representing the
+featureset minor version number (15 for \Omegaminorversion, 0
+for \Alephminorversion, 1 for \eTeXminorversion) (new)
+
+
+20030524: RC1 released.
+ * Fix: the "overfull box" crash bug
+
+20030106: RC0 released.
+ This release simply provides a binary providing
+ both Omega 1.15 features (all but the XML/SGML ones)
+ and e-TeX 2.1 features.
diff --git a/systems/doc/aleph/readme.txt b/systems/doc/aleph/readme.txt
new file mode 100644
index 0000000000..1e3e1133b2
--- /dev/null
+++ b/systems/doc/aleph/readme.txt
@@ -0,0 +1,4 @@
+Aleph, formerly known as e-Omega, is a project whose aim is to
+provide an extension to Knuth's TeX comprising both Omega 1.15
+and e-TeX 2.1 features. Its main goals are stability, speed and
+power.
diff --git a/systems/doc/chktex/ChkTeX.pdf b/systems/doc/chktex/ChkTeX.pdf
new file mode 100644
index 0000000000..443bb4f722
--- /dev/null
+++ b/systems/doc/chktex/ChkTeX.pdf
Binary files differ
diff --git a/systems/doc/dvipdfmx/README b/systems/doc/dvipdfmx/README
new file mode 100644
index 0000000000..2ab97e311a
--- /dev/null
+++ b/systems/doc/dvipdfmx/README
@@ -0,0 +1,510 @@
+dvipdfmx and xdvipdfmx for TeX Live
+===================================
+
+xdvipdfmx
+=========
+
+xdvipdfmx is an extended version of dvipdfmx, and is now incorporated in
+the same sources.
+
+The extensions provided by xdvipdfmx provide support for the Extended DVI
+(.xdv) format used by xetex, including support for platform-native fonts
+and the xetex graphics primitives, as well as Unicode/OpenType text.
+
+Like its direct ancestor dvipdfmx, this is free software and may be
+redistributed under the terms of the GNU General Public License,
+version 2 or (at your option) any later version.
+
+There is a hope to merge xdvipdfmx into dvipdfmx.
+
+Jonathan Kew mentions that in the past, XeTeX used a Mac-specific
+program xdv2pdf as the backend instead of xdvipdfmx. xdv2pdf supported
+a couple of special effects that are not yet available through
+xdvipdfmx: the Quartz graphics-based shadow support, AAT "variation"
+fonts like Skia, transparency as an attribute of font color, maybe other
+things. It would be nice for those things to continue to be supported,
+if anyone is looking for some nontrivial but not-impossible job and
+happens across this file.
+
+The dvipdfmx Project
+====================
+
+Copyright (C) 2002-2014 by Jin-Hwan Cho, Shunsaku Hirata,
+Matthias Franz, and the dvipdfmx project team. This package is released
+under the GNU GPL, version 2, or (at your option) any later version.
+
+dvipdfmx is now maintained as part of TeX Live.
+
+Contents
+--------
+
+1. Introduction
+
+2. Installation
+
+ 2.1. Compiling and Installation
+
+ 2.2. TeX Directory Structure (TDS)
+
+ 2.3. Auxiliary Files
+
+3. CJK Support
+
+ 3.1. Quick Test of Installation
+
+ 3.2. CJK-LaTeX and HLaTeX
+
+ 3.3. Omega and Other Extended TeX
+
+ 3.4. Vertical Typesetting
+
+4. Unicode Support
+
+ 4.1. Unicode Support in General
+
+ 4.2. ToUnicode CMap Support
+
+ 4.3. OpenType Support and Unicode
+
+ 4.4. Type1 Font Support and Unicode
+
+5. Graphics and Image Format
+
+ 5.1. Supported Graphics File Format
+
+ 5.2. Graphics Extension
+
+ 5.3. Using External Programs for Format Conversion
+
+6. DVI Specials
+
+ 6.1. Compatibility
+
+ 6.2. Additions to Dvipdfm's pdf: Special
+
+7. Font Mapping
+
+8. Incompatible Changes From Dvipdfm
+
+9. Other Improvement Over Dvipdfm
+
+10. Font Licensing and Embedding
+
+
+
+1. Introduction
+ ------------
+
+ The dvipdfmx (formerly dvipdfm-cjk) project provides an eXtended version
+ of the dvipdfm, a DVI to PDF translator developed by Mark A. Wicks.
+
+ The primary goal of this project is to support multi-byte character
+ encodings and large character sets for East Asian languages. The secondary
+ goal is to support as many features as pdfTeX developed by Han The Thanh.
+
+ This project is a combined work of the dvipdfm-jpn project by Shunsaku
+ Hirata and its modified one, dvipdfm-kor, by Jin-Hwan Cho.
+
+
+2. Installation
+ -----------------------
+
+ Typical usage and installation steps are not different from the original dvipdfm.
+ Please refer documents from dvipdfm distribution for detailed instruction on how
+ to install and how to use dvipdfm.
+
+
+2.1. Compiling and Installation
+
+
+ If you have obtained older version, please use latest version unless you have a
+ clear reason to choose older versions. The latest snapshot of dvipdfmx source is
+ available at:
+
+ http://project.ktug.or.kr/dvipdfmx/snapshot/
+
+ And the CVS repository for this project can be obtained through anonymous CVS
+ access with the following command:
+
+ cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot login
+ cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot co dvipdfmx
+
+ When prompted for a password, simply press the Enter key.
+
+
+ The kpathsea library is required to compile and install dvipdfmx in UNIX or
+ UNIX-like platforms. It is usually included for most of TeX distributions.
+ If you already have installed dvipdfm (the original) by yourself, you should
+ already have kpathsea library and it's headers. And zlib library is highly
+ recommended as dvipdfmx can't compress data without this.
+
+
+ Before starting things, you must check the location of your TeX installation.
+ If other TeX related programs are installed under, e.g., '/usr/local/TeX/bin',
+ you should specify directory '/usr/local/TeX' as an for ./configure script as
+
+ ./configure --prefix=/usr/local/TeX --with-kpathsea=/usr/local/TeX
+
+ If you are using libpaper to handle paper sizes for various program, you can
+ use --with-paper option to ./configure. The location of libpaper library can
+ be specified with this option as
+
+ --with-paper=DIR
+
+ Please note thath dvipdfmx uses JIS paper size for B-series paper instead of
+ ISO's one for historical reason. (too late to change the default behavior)
+ The most easiest way to fix this is to use libpaper if you already have that,
+ otherwise define ISO_PAPERSIZE macro at compilation time.
+
+ Dvipdfmx requires libpng library available from
+
+ http://www.libpng.org/pub/png/libpng.html
+
+ to read PNG format images. To tell dvipdfmx the location of libpng header
+ and library, use configure option
+
+ --with-png=DIR
+
+ After you have finished ./configure, just type
+
+ make && make install
+
+ then dvipdfmx will be installed under the directory specified by the --prefix
+ option to ./configure script. After you have successfully installed dvipdfmx,
+ you may need to install various auxiliary files and slightly adjust location
+ of files or configuration. Amount of additional files and modification depends
+ on your environment, and briefly described in the sections follows.
+
+
+2.2. TeX Directory Structure (TDS)
+
+
+ If your TeX installation is conforming with TDS version 1.1 described in
+
+ http://www.tug.org/ftp/tex/tds-1.1/
+
+ , then you'll need to adjust your dvipdfmx installtion. This also applies when
+ you have updated programs without modifying existing platform independent files
+ (files in texmf directory). Dvipdfmx installs few files in addition to dvipdfmx
+ program itself, dvipdfmx.cnf, cid-x.map and others, but it currently does not
+ choose installation directory as appropriate for TDS 1.1.
+
+ If your 'kpsewhich' program recognizes '.sfd' file format, i.e.,
+
+ kpsewhich --show-path --format=.sfd
+
+ does not answer as 'unknown format', then you should move several files under
+ appropriate locations or should modify texmf.cnf as follows:
+
+ * Subfont Definition (SFD) Files
+
+ Recommended location of SFD files (.sfd) is
+
+ $TEXMF/fonts/sfd/
+
+ and environmental variable for specifying additional search path for this
+ file format files is
+
+ SFDFONTS
+
+ . To make those files visible to dvipdfmx under TDS 1.1 installation, you
+ must move all .sfd files to the directory mentioned above or set SFDFONTS
+ variable in texmf.cnf. As some programs may not be updated to follow this
+ convention yet, it is recommended to preserve old installation directory.
+ If you have .sfd files under "$TEXMF/dvipdfm/", please do not use that,
+ please move all files to the directory mentioned above.
+
+ * PostScript CMap Resources
+
+ Recommended location of CMap files (no suffix or with suffix .cmap) is
+
+ $TEXMF/fonts/cmap/
+
+ and environmental variable for adding extra search path for this format files
+ is
+
+ CMAPFONTS
+
+ You may want to set CMAPFONTS to include GhostScript's Resource path, e.g.,
+
+ /usr/share/ghostscript/Resource/CMap//
+
+ in your texmf.cnf file as this resource can be used by various programs that
+ manipulates PS/PDF files. Dvipdfmx installs few additional files into the
+ directory "$TEXMF/dvipdfm/CMap", please move this files to the directory for
+ CMap files. But please note that file "Adobe-Identity-UCS2" is not meaningful
+ to other programs at all, so you should place at least this file in different
+ location than CMap files. (Or you can just remove this unless you see problems
+ in copy-and-pasting text from dvipdfmx output PDF.)
+
+ * Font Mapping Files
+
+ Suggested place for dvipdfm's font mapping files (.map) is
+
+ $TEXMF/fonts/map/dvipdfm/
+
+ and environmental variable for this format files is
+
+ TEXFONTMAPS
+
+ For files containing dvipdfmx extension to dvipdfm format, place them into
+
+ $TEXMF/fonts/map/dvipdfmx/
+
+ instead of sub-directory 'dvipdfm'.
+
+ * OpenType Fonts
+
+ Appropriate place for OpenType font with PostScript outline (.otf) is
+
+ $TEXMF/fonts/opentype/supplier/typeface/
+
+ where 'supplier' and 'typeface' should be replaced with font's supplier and
+ typeface identifier strings.
+
+
+2.3. Auxiliary Files
+
+
+ 1) CMap PostScript Resources
+
+ Dvipdfmx internally identifies glyphs in a font with identifier represented
+ as numbers ranging from 0 to 65535. CMap PostScript Resources defines how the
+ input character codes are translated to those ID's (CID). CID's should be
+ uniquely assigned to every glyphs contained in a collection of glyphs. Adobe
+ has defined several "character collection"s; Adobe-GB1 (Simplified Chinese),
+ Adobe-CNS1 (Traditional Chinese), Adobe-Japan1 (Japanese), and Adobe-Korea1
+ (Korean), which contains much of glyphs necessary for publishing for each
+ languages. Details on Adobe's character collections can be found at Adobe's
+ developer site:
+
+ http://partners.adobe.com/public/developer/font/index.html
+
+ Please install CMap resource files under the directory
+
+ ${TEXMF}/fonts/cmap
+
+ , or set CMAPFONTS variable to point the directory containing CMap resource
+ in texmf.cnf. If your TeX installation does not conforming TDS 1.1, then you
+ should set CMAPINPUTS variable to make those files visible to dvipdfmx. For
+ examples,
+
+ CMAPINPUTS= .;$TEXMF/fonts/cmap//
+
+ Adobe's "CMaps for PDF 1.4 CJK Fonts" are available from:
+
+ http://partners.adobe.com/public/developer/acrobat/index_advanced.html
+
+ or
+
+ ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+
+ You can find a short explanation of each CMap files in cid2code.txt contained
+ in the archive files found at the above FTP site.
+
+
+ 2) SubFont Definition Files
+
+ .....
+
+
+ 3) Adobe Glyph List and ToUnicode Mapping Files
+
+ The Adobe glyph list (AGL) file describes correspondence between PostScript
+ glyph names (e.g., AE, Aacute, ...) and it's Unicode character sequences.
+ Most features described in the section "Unicode Support" requires this file.
+
+ Dvipdfmx looks for file "glyphlist.txt" when conversion from PostScript glyph
+ names to Unicode is necessary. This conversion is done in various situations;
+ when creating ToUnicode CMap for 8bit encoded fonts, finding glyph description
+ from TrueType/OpenType fonts supporting Unicode when the font itself does not
+ provide the mapping from PostScript glyph names to glyph indices (version 2.0
+ "post" table), and when encoding "unicode" is specified for Type 1 font.
+
+ The "glyphlist.txt" file written by Adobe is found at
+
+ http://partners.adobe.com/asn/tech/type/glyphlist.txt
+
+ You should place file "glyphlist.txt" in a directory shown by
+
+ kpsewhich --progname=dvipdfm --show-path="other text files"
+
+ Please check kpathsea library can find this file by 'kpsewhich' command:
+
+ kpsewhich --progname=dvipdfm --format="other text files" glyphlist.txt
+
+ The 'progname' is not dvipdfmx but dvipdfm here.
+
+ ToUnicode mapping is similar to glyph list file but describes correspondence
+ between CID numbers and Unicode values. The content of this file look like a
+ CMap files and is contained in "CMaps for PDF 1.4 CJK Fonts" from Adobe (see
+ "CMap PostScript Resources" above). This file is required to support TrueType
+ font (including OpenType fonts with TrueType outline). Those files should be
+ installed same directory as ordinary CMap files.
+
+
+3. CJK Support
+
+3.1. Quick Test of Installation
+
+3.2. CJK-LaTeX and HLaTeX
+
+3.3. Omega and Other Extended TeX
+
+
+4. Unicode Support
+
+4.1. Unicode Support in General
+
+4.2. ToUnicode CMap Support
+
+4.3. OpenType Support and Unicode
+
+4.4. Type1 Font Support and Unicode
+
+
+5. Graphics and Image Format
+
+5.1. Supported Graphics File Format
+
+5.2. Graphics Extension
+
+5.3. Using External Programs for Format Conversion
+
+
+6. DVI Specials
+
+6.1. Compatibility
+
+6.2. Additions to Dvipdfm's pdf: Special
+
+
+7. Font Mapping
+
+
+7.1. Options for CJK Font
+
+ Few options are available in dvipdfmx (for CID-keyed fonts) in addition
+ to the original dvipdfm.
+
+
+ 1) TTC Index
+
+ You can specify TrueType Collection index number with :n: option in front
+ of TrueType font name.
+
+ min10 H :1:mincho
+
+ In this example, the option :1: tells dvipdfmx to select TrueType font #1
+ from TrueType collection font "mincho.ttc".
+
+
+ 2) No-embed Switch
+
+ It is possible to block embedding glyph data with the character `!'
+ in front of the font name in the font mapping file.
+
+ This feature reduces the size of the final PDF output, but the PDF file
+ may not be viewed exactly in other systems on which appropriate fonts
+ are not installed.
+
+ Use of this option is not recommended for fonts that contains unusual
+ characters (and characters having different width from default value).
+ Please note that glyph metric information is not written in the output
+ PDF file for TrueType fonts without embedding. It will be treated as
+ fixed-pitch with all widths equal to the default value (will be fixed
+ someday).
+
+
+ 3) Stylistic Variants
+
+ Keywords ",Bold", ",Italic", and ",BoldItalic" can be used to create
+ synthetic bold, italic, and bolditalic style variants from other font
+ using PDF viewer's (or OS's) function.
+
+ jbtmo@UKS@ UniKSCms-UCS2-H :0:!batang,Italic
+ jbtb@Unicode@ Identity-H !batang/UCS,Bold
+
+ Availability of this feature highly depends on the implementation of PDF
+ viewers. This feature is not supported for embedded fonts in the most of
+ PDF viewers, like Adobe Acrobat Reader and GNU Ghostscript.
+
+ Notice that this option automatically disable font embedding.
+
+
+
+8. Incompatible Changes From Dvipdfm
+
+
+
+9. Other Improvement Over Dvipdfm
+
+
+9.1. Encryption
+
+
+9.2. Font
+
+
+
+10. Font Licensing and Embedding
+
+ In OpenType format, information regarding how the font should be treated
+ when creating documents can be recorded. Dvipdfmx uses this information
+ to decide whether embedding font into the document is permitted.
+
+ This font embedding information is indicated by a flag called as "fsType"
+ flag; each bit representing different restrictions on font embedding.
+ If multiple flag bits are set in fsType, the least restrictive license
+ granted takes precedence in dvipdfmx. The fsType flag bits recognized by
+ dvipdfmx is as follows:
+
+ * Installable embedding
+
+ All font with this type of license can be embedded.
+
+ * Editable embedding
+
+ All font with this type of license can be embedded.
+
+ * Embedding for Preview & Print only
+
+ Dvipdfmx give the following warning message for fonts with this
+ type of license:
+
+ This document contains `Preview & Print' only licensed font
+
+ For the font with this type of licensing, font embedding is allowed
+ solely for the purpose of (on-screen) viewing and/or printing the
+ document; further editing of the document or extracting an embedded
+ font data for other purpose is not allowed. To ensure this condition,
+ you must at least protect your document with non-empty password.
+
+ All other flags are treated as more restrictive license than any of the
+ above flags and treated as "No embedding allowed"; e.g., if both of the
+ editable-embedding flag and unrecognized license flag is set, the font
+ is treated as editable-embedding allowed, however, if only unrecognized
+ flags are set, the font is not embedded.
+
+ Embedding flags are preserved in embedded font if the font is embedded
+ as a TrueType font or a CIDFontType 2 CIDFont. For all font embedded as
+ a PostScript font (CFF, CIDFontType 0 CIDFont), they are not preserved.
+ Only /Copyright and /Notice in the FontInfo dictionary are preserved in
+ this case.
+
+ Some font vendors put different embedding restrictions for different
+ condition; e.g., font embedding might be not permitted for commercial
+ materials unless you acquire "commercial license" separately.
+ Please read EULA carefully before making decision on font usage.
+
+
+ Adobe provide a font licensing FAQ and a list of embedding permissions
+ for Adobe Type Library fonts:
+
+ http://www.adobe.com/type/browser/legal/
+
+ For Japanese font in general, embedding permission tend to be somewhat
+ restrictive. Japanese users should read the statement regarding font
+ embedding from Japan Typography Association (in Japanese):
+
+ http://www.typography.or.jp/act/morals/moral4.html
diff --git a/systems/doc/dvipdfmx/dvipdfmx-special.pdf b/systems/doc/dvipdfmx/dvipdfmx-special.pdf
new file mode 100644
index 0000000000..5b64978c1a
--- /dev/null
+++ b/systems/doc/dvipdfmx/dvipdfmx-special.pdf
Binary files differ
diff --git a/systems/doc/dvipdfmx/dvipdfmx-special.tex b/systems/doc/dvipdfmx/dvipdfmx-special.tex
new file mode 100644
index 0000000000..64dbf22bd6
--- /dev/null
+++ b/systems/doc/dvipdfmx/dvipdfmx-special.tex
@@ -0,0 +1,608 @@
+%% tb94cho.ltx
+%% Copyright 2010 Jin-Hwan CHO
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Jin-Hwan CHO.
+
+\documentclass[final]{ltugboat}
+
+\usepackage{graphicx}
+\usepackage{url}
+%\usepackage{picins}
+\usepackage{microtype}
+
+\def\CFF{\acro{CFF}}
+\def\CID{\acro{CID}}
+\def\CJK{\acro{CJK}}
+\def\DTL{\acro{DTL}}
+\def\DVIasm{\acro{DVI}asm}
+\def\DVItype{\acro{DVI}type}
+\def\DPS{\acro{DVIPS}}
+\def\DPM{\acro{DVI\-PDFM}}
+\def\DPMx{\acro{DVI\-PDFM}($x$)}
+\let\DPX\DVIPDFMx
+\def\pdfmark{pdfmark}
+\def\GS{Ghostscript}
+\def\EPS{\acro{EPS}}
+\def\pdfTeX{pdf\/\TeX}
+\def\LuaTeX{Lua\TeX}
+\def\pTeX{p\kern-0.05em\TeX}
+\def\XObject{\acro{XO}bject}
+\def\fafter{1.5pt}
+
+\let\note=\footnote
+\def\ctanloc#1{\url{http://mirror.ctan.org/#1}}
+\setlength{\fboxsep}{1.5pt}
+
+%\divide\abovecaptionskip by 2
+
+% don't go to a float page so soon:
+%\renewcommand{\dbltopfraction}{.99}
+%\renewcommand{\dblfloatpagefraction}{.8}
+
+\title{\DVI\ specials for \PDF\ generation}
+\author{Jin-Hwan Cho}
+\address{Department of Mathematics \\ The University of Suwon \\ Republic of Korea}
+\netaddress{chofchof (at) ktug dot or dot kr}
+
+\begin{document}
+\sectitle{Software \& Tools}
+\maketitle
+
+\begin{abstract}%
+\acro{DVIPDFM}($x$) manages various \PDF\ effects by means of \DVI\ specials.
+Appropriate documentation of \DVI\ specials, however, is not easy to find, and exact functionality is not simple to catch without reading the source code of \DVI\ drivers.
+This paper deals with the \DVI\ specials defined in \acro{DVIPDFM}($x$) that are mainly used for \PDF\ generation.
+We discuss the features of those specials with some examples, many of which are not documented elsewhere.
+\end{abstract}
+
+\section{Introduction}
+
+\DVI, the output file format of D.~E.~Knuth's \TeX, is not widely used at present compared with \PDF, the output format of \pdfTeX.
+It is rather old\note{\DVI\ was designed by David R.~Fuchs in 1979.} and obsolete, but it has powerful aspects nonetheless: \emph{simplicity} and \emph{compactness}.
+
+These aspects make it possible to manipulate \DVI\ files in an easy and fast way.
+Many \DVI\ utilities were developed to convert the \DVI\ format to other file formats including \PS\ and \PDF.
+It is also possible to edit \DVI\ files directly by the use of \DVIasm~\cite{Cho07,Cho08,DVIasm}.
+
+Twenty years ago, at the time \PS\ dominated the printing world, nobody expected a new format would replace \PS.
+\PDF\ is not eternal either.
+In future, when a new format surpassing \PDF\ appears, \DVI\ will be the first format in the \TeX\ world that can be converted to the new format.
+Notice that \LuaTeX, considered to be the next generation of \pdfTeX, still supports the \DVI\ format.
+
+There are two popular ways to convert \DVI\ to \PDF.
+The first one is a two-way conversion, from \DVI\ to \PS\ with \DPS, and then from \PS\ to \PDF\ with a distiller.
+Adobe Acrobat Distiller is the oldest commercial program, and \GS\ is the most popular distiller in the \TeX\ world. \MacOSX\ also has its own distiller.
+
+Adobe designed the \pdfmark\ operator~\cite{pdfmark} for its distiller to support \PDF\ features that are not expressible using the standard \PS\ operators.
+The \pdfmark\ operator is given in the \TeX\ source by means of a \DVI\ special command.
+Note that it is not \DPS\ but a distiller that processes the \pdfmark\ operator.
+
+Mark A.~Wicks' \DPM~\cite{DVIPDFM} introduced the other way of converting \DVI\ directly to \PDF.
+He also designed new \DVI\ specials based on the \pdfmark\ operator to support various \PDF\ features.
+The new specials, however, lacked some functionality in practical use so that not many \PDF\ features could be obtained compared with \pdfTeX.
+
+One of the main goal of \DPX, an extension of \DPM\ that grew out of the \CJK\note{Chinese, Japanese, and Korean.} support, was to provide as many \PDF\ features as \pdfTeX~\cite{Cho03}.
+\DPX\ extended the functionality of some special commands of \DPM, and designed new special commands having a similar functionality of \pdfTeX's own primitives.
+Furthermore, \DPX\ has several powerful features not available in \DPM.
+ \begin{itemize}
+ \item Support 16-bit character sets (\CJK\ encodings and Unicode) with \CID-keyed font technology.
+ \item Support various font formats including OpenType, TrueType, etc.
+ \item Use \CFF\ font format for embedded Type1 \PS\ fonts so that the size of the \PDF\ output is quite small compared with \pdfTeX's output.
+ \item Support extended \TeX\ engines, e.g., Omega, Japanese \pTeX, \XeTeX\ (via \acro{XDVIPDFMX}).\note{Upcoming version of \DPX\ will support the \DVI\ output generated by \LuaTeX.}
+ \end{itemize}
+
+The \acro{TODO} list of \DPX\ had contained one outstanding item for a long time: supporting Till Tantau's beamer package~\cite{beamer}, that is widely used for \PDF\ presentation.
+In fact, this package does not handle \DVI\ specials in a direct way.
+Instead, the graphics part comes from the same author's \PGF\ package~\cite{PGF}, and the other \PDF\ effects come from the hyperref package~\cite{hyperref}.
+
+\DPX\ has supported full functionality of the \PGF\ package since June 2008.\note{The \DPX\ driver that works with the \PGF\ package included in \TeX\ Live 2008 can be downloaded from \url{http://project.ktug.or.kr/dvipdfmx/contrib/generic/}.}
+Nonetheless, the navigation buttons usually shown in the lower right corner of the presentation still did not work, although they were displayed correctly.
+The source code\note{\raggedright \ctanloc{macros/latex/contrib/beamer/base/beamerbasenavigation.sty}} implementing the buttons was
+
+\begin{verbatim}[\small]
+\def\beamer@linkspace#1{\vbox to7.5pt{}\kern#1}
+\end{verbatim}
+
+The code above generates an \emph{empty} box that will be surrounded by the two special commands, `\texttt{pdf:bann}' (before) and `\texttt{pdf:eann}' (after).
+Unfortunately, neither \DPM\ nor \DPX\ construct any annotation in the case of an empty box.
+Another special command `\texttt{pdf:ann}' must be used instead for this purpose.
+That was the exact reason why the navigation buttons did not work.
+
+Why did the author of the beamer package make such a mistake?
+As a matter of fact, it was not his fault because no statement could be found about that functionality in the manual of \DPM~\cite{DVIPDFM}.
+This unhappy story led to this paper.
+
+The author gave a presentation~\cite{Cho05} at \tug\ 2005, in which the different behaviors of \DVI\ specials of \DPS, \DPM, and \DPX\ were discussed.
+\DVI\ specials for \PDF\ generation, however, were not fully discussed at that time.
+The main objective of this paper is to bridge this gap.
+
+We will discuss in the following sections the features of \DVI\ specials defined in \DPM\ for \PDF\ generation, and the extended features given by \DPX.
+The author hopes this paper would be useful for package writers who are finding appropriate information on \DVI\ specials.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Named PDF objects}
+
+There are two kinds of named objects, built-in and user-defined \PDF\ objects.
+
+\subsection{Built-in named objects}
+
+Built-in objects defined in \DPMx{} are listed in Table~\ref{Table1}. We refer to~\cite[p.~12]{pdfmark} and~\cite[p.~5]{DVIPDFM} for \pdfmark\ and \DPM\ built-in objects, respectively.
+Notice that it is not allowed to modify the contents of the last five built-in objects in Table~\ref{Table1}.
+
+\begin{table}[h]
+\begin{tabular}{|l|p{1.95in}|} \hline
+\texttt{@catalog} & catalog dictionary~\cite[p.~139]{PDFReference} \\
+\texttt{@docinfo} & (\DPX\ only) document\newline information dictionary \cite[p.~844]{PDFReference} \\
+\texttt{@names} & name dictionary~\cite[p.~150]{PDFReference} \\
+\texttt{@pages} & root page tree node \cite[p.~143]{PDFReference} \\
+\texttt{@resources} & resource dictionary of current\newline page \cite[p.~154]{PDFReference} \\
+\texttt{@thispage} & current page object \cite[p.~145]{PDFReference} \\\hline
+\texttt{@prevpage} & reference only \\
+\texttt{@nextpage} & reference only \\
+\texttt{@page$n$} & reference only \\
+\texttt{@xpos} & reference only \\
+\texttt{@ypos} & reference only \\
+\hline
+\end{tabular}
+\caption{Built-in objects defined in \DPMx{}}
+\label{Table1}
+\end{table}
+
+
+\subsection{User-defined named objects}
+
+Two special commands are provided by \DPMx{} for user-defined objects.
+One is to define a named object, and the other is to add content to the previously defined object.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:obj @name PDFobject} \ creates a named object that can be referenced later by `\texttt{@name}'.
+\end{itemize}
+
+\noindent
+All possible object types for `\texttt{PDFobject}' are listed in Table~\ref{Table2}.
+In the case of indirect objects, the object number must be given explicitly, so that this feature is rarely used, especially to specify the objects in a different \PDF\ file.
+
+\begin{table}[h]
+\begin{tabular}{|l|p{2.1in}|} \hline
+boolean & \texttt{true}, \texttt{false} \\
+numeric & \texttt{123}, \texttt{34.5}, \texttt{-.002} \\
+string & \texttt{(This is a string)}, \texttt{<901FA3>} \\
+name & \texttt{/Name1}, \texttt{/.notdef} \\
+array & \texttt{[3.14 false (Ralph) /Name1]} \\
+dictionary & \texttt{<</Key1 (Value) /Key2 3.14>>} \\
+null & \texttt{null} \\\hline
+indirect & \texttt{12 0 R} \\
+stream & \texttt{stream ... endstream} \\
+\hline
+\end{tabular}
+\caption{\PDF\ object types~\cite[p.~51]{PDFReference}}
+\label{Table2}
+\end{table}
+
+It is not simple to construct a stream object with the special command `\texttt{pdf:obj}' because
+the length of the stream object must be specified explicitly, which is quite bothersome.
+Imagine that you are trying to construct a stream object whose source comes from a file.
+Is it possible with this special command?
+Moreover, any stream object requires the keyword `\texttt{stream}' followed by an end-of-line marker.\note{%
+An end-of-line marker consists of either a carriage return (\texttt{0x0d}) and a line feed (\texttt{0x0a}) or just a line feed, and not by a carriage return alone~\cite[pp.~60--61]{PDFReference}.}
+
+\DPX, therefore, provides new special commands for stream objects.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:stream @name (string) <<dict>>} \\[\fafter]
+constructs a stream object the source of which comes from the string object `\texttt{(string)}'.
+The stream dictionary `\texttt{<<dict>>}' is optional, and the dictionary entry `\texttt{/Length}' is created automatically.
+\end{itemize}
+
+\noindent
+The following two special commands, for instance, construct the same stream object.
+The stream data of the second object is represented in the \ASCII\ base-85 encoding.~\cite[p.~70]{PDFReference}
+
+\begin{verbatim}[\small]
+\special{pdf:stream @name (xxxxxxxx)}
+\special{pdf:stream @name (G^+IXG^+IX)
+ <</Filter/ASCII85Decode>>}
+\end{verbatim}
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:fstream @name (filename) <<dict>>} \\[\fafter]
+constructs a stream object in the same way as `\texttt{pdf:stream}', but the source of stream data comes from a file `\texttt{filename}'.
+\end{itemize}
+
+\noindent
+The following example shows how to include a source \TeX\ file inside the output \PDF\ file. (See~\cite[p.~637]{PDFReference} for more details on the file attachment annotation.)
+
+\begin{verbatim}[\small]
+\special{pdf:fstream @myfile (mytest.tex)}
+\special{pdf:ann bbox 0 0 10 10 <<
+ /Subtype /FileAttachment /FS <<
+ /Type /Filespec /F (mytest.tex)
+ /EF << /F @myfile >> >>
+ /Name /PushPin >>}
+\end{verbatim}
+
+
+\subsection{Adding content to named objects}
+
+We describe the special command for adding content to named objects. The type of the named object must be either array or dictionary.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:put @arrayobj object$_1$ $\ldots$ object$_n$} \\[\fafter]
+appends the $n$ objects at the end of the array object `\texttt{@arrayobj}'.
+\item\fbox{\ttfamily pdf:put @dictobj <<dict>>} \ merges the dictionary object `\texttt{<<dict>>}' into `\texttt{@dictobj}'. If both the dictionaries have a common key, the old value in `\texttt{@dictobj}' will be replaced by the new value in `\texttt{<<dict>>}'.
+\end{itemize}
+
+\noindent
+In the following example, the value of the key `\texttt{/X}' in the dictionary object `\texttt{@name}' is `\texttt{@Moon2}'.
+(See~\cite[p.~15]{pdfmark} for corresponding \pdfmark\ operators.)
+
+\begin{verbatim}[\small]
+\special{pdf:put @Moon1
+ [ (Earth to Moon) 238855 /mies ]}
+\special{pdf:obj @Moon2 []}
+\special{pdf:put @Moon2 (Moon to Earth)}
+\special{pdf:put @Moon2 238855}
+\special{pdf:put @Moon2 /miles}
+\special{pdf:obj @name <<>>}
+\special{pdf:put @name << /X @Moon1 >>}
+\special{pdf:put @name << /X @Moon2 >>}
+\end{verbatim}
+
+Note that \DPM\ does not allow adding content to a stream dictionary object, but \DPX\ does.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:put @streamobj <<dict>>} \ \ merges the dictionary object `\texttt{<<dict>>}' into the stream dictionary of `\texttt{@streamobj}'. The dictionary entries, `\texttt{/Length}' and `\texttt{/Filter}', in the object `\texttt{<<dict>>}' will be ignored.
+\end{itemize}
+
+Finally, \DPMx{} provides the special command
+\fbox{\ttfamily pdf:close @name} to prevent further modifying the content of `\texttt{@name}'. After closing the named object, it can only be referenced.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Annotations}
+
+An annotation is considered as an object with a location on a page.
+The type of the object is given by the value of the key `\texttt{/Subtype}', for instance, `\texttt{/Text}', `\texttt{/Link}', `\texttt{/Sound}', `\texttt{/Movie}', etc.
+(See~\cite[p.~615]{PDFReference} for the list of all annotation types.)
+The location is given by an array object associated to the key `\texttt{/Rect}'.
+\DPMx{} provides the following special command for annotations.
+
+\begin{itemize}
+\item\fbox{\hbadness=10000
+\parbox{.43\textwidth}{\ttfamily pdf:ann @name width [length] height [length] depth [length] <<dict>>}}
+\par\vspace{\fafter}\noindent
+The annotation dictionary is given by `\texttt{<<dict>>}' and the location relative to the current position is given by the three dimension parameters, `\texttt{width}', `\texttt{height}', and `\texttt{depth}'.
+\end{itemize}
+
+\noindent
+It is not possible to specify the location in an absolute way.
+Any value of the key `\texttt{/Rect}' in the annotation dictionary `\texttt{<<dict>>}' will be ignored if found.
+It is not allowed to modify the annotation dictionary with `\texttt{pdf:put}' command, so `\texttt{@name}' must be used as a reference.
+
+Note that \DPX\ allows the `\texttt{bp}' unit in the dimension parameters, but \DPM\ does not.
+Moreover, \DPX\ supports the following form.
+
+\begin{itemize}
+\item\fbox{\hbadness=10000
+\parbox{.425\textwidth}{\ttfamily pdf:ann @name bbox [ulx] [uly] [lrx] [lry] <<dict>>}}
+\par\vspace{\fafter}\noindent
+The relative location is given by the bounding box consisting of four numbers in `\texttt{bp}' units.
+\end{itemize}
+
+\noindent
+The following example shows a movie annotation that enables us to run the movie file `\texttt{mymovie.avi}' inside a \PDF\ viewer program.
+
+\begin{verbatim}
+\special{pdf:ann bbox 0 0 360 180 <<
+ /Subtype /Movie /Border [1 0 0]
+ /T (My Movie) /Movie <<
+ /F (mymovie.avi) /Aspect [720 360]
+ /Poster true >>
+ /A << /ShowControls false >> >>}
+\end{verbatim}
+
+\DPMx{} provides other special commands for \emph{breakable} annotations, e.g., an annotation broken over several lines or several pages.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:bann <<dict>>} \ begins a breakable annotation.
+Object name is not allowed for this command.
+\item\fbox{\ttfamily pdf:eann} \ terminates the previous breakable annotation.
+\end{itemize}
+
+\noindent
+These specials are mainly used for `\texttt{/Link}' annotation as the following example shows.
+
+\begin{verbatim}[\small]
+\special{pdf:bann << /Subtype /Link
+ /BS << /Type /Border /W 0.5 /S /S >>
+ /A << /S /URI
+ /URI (http://www.tug.org) >> >>}%
+http://www.tug.org%
+\special{pdf:eann}
+\end{verbatim}
+
+\noindent
+\emph{Warning:} No annotation will be constructed if the content between `\texttt{pdf:bann}' and `\texttt{pdf:eann}' is an empty box. For example:
+
+\begin{verbatim}[\small]
+\special{pdf:bann << /Subtype /Link ... >>}
+\vbox to 7.5pt{}\kern 10pt
+\sepcial{pdf:eann}
+\end{verbatim}
+
+Annotations constructed by \DPMx{} may happen to be slightly bigger than the expected size. This occurs when the annotation grow size is positive; this value is specified in the configuration file. To avoid this effect, either modify the configuration file or give `\texttt{-g 0}' on the command line when running \DPMx{}.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Outlines (or bookmarks)}
+
+The document outline consists of a tree-structured hierarchy of outline items (sometimes called bookmarks) for which \DPMx{} provides the following special command.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:out $n$ <<dict>>} \ adds an outline item to the document. The integer parameter $n$ represents the level of the outline entry (beginning with 1), and `\texttt{<<dict>>}' represents the outline item dictionary~\cite[p.~585]{PDFReference}.
+\end{itemize}
+
+Note that all the outline items generated by \DPM\ are closed.\note{The sign of the value of the key `\texttt{/Count}' in the outline item dictionary determines whether the item is open or closed.~\cite[p.~586]{PDFReference}}
+The `\texttt{bookmarksopen=true}' option of the hyperref package does not work if the \PDF\ output is generated by \DPM.
+
+\begin{verbatim}[\small]
+\usepackage[
+ dvipdfm,bookmarks=true,bookmarksopen=true
+]{hyperref}
+\end{verbatim}
+
+\DPX\ provides two solutions for this problem.
+The first one is to specify the option `\texttt{-O $n$}' when running \DPX.
+Up to level $n$, the outline entries will be open. The second, and complete, solution is to use this extended special command:
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:out [-] $n$ <<dict>>} \ The symbol `\texttt{[-]}' indicates that the outline item will be closed. On the other hand, `\texttt{[]}' without the minus sign indicates that the outline item will be open.
+\end{itemize}
+
+The hyperref package provides a new option `\texttt{dvipdfmx-outline-open}' that uses the extended command above. This option enables us to control the open level given by `\texttt{bookmarksopenlevel}'.
+
+\begin{verbatim}[\small]
+\usepackage[%
+ dvipdfmx,bookmarks=true,
+ bookmarksopen=true,
+ bookmarksopenlevel=1,
+ dvipdfmx-outline-open
+]{hyperref}
+\end{verbatim}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{External objects (or XObjects)}
+
+\DPMx{} supports two types of \emph{external objects},\note{%
+``A graphics object whose contents are defined by a self-contained content stream, separate from the content stream in which it is used.''~\cite[p.~332]{PDFReference}
+} an image \XObject{} and a form \XObject.
+
+\begin{itemize}
+\item\fbox{\hbadness=10000
+\parbox{.42\textwidth}{\ttfamily pdf:image @name width [length] height [length] depth [length] (imagefile)}}
+\par\vspace{\fafter}\noindent
+defines an image \XObject\ the source of which comes from the file `\texttt{imagefile}'. See~\cite[p.~216]{Cho07} for complete syntax provided by \DPX.
+\item\fbox{\hbadness=10000
+\parbox{.42\textwidth}{\ttfamily pdf:bxobj @name width [length] height [length] depth [length]}}
+\par\vspace{\fafter}\noindent
+begins the definition of a form \XObject.
+As with the command `\texttt{pdf:add}', \DPX\ allows bounding box `\texttt{bbox [ulx] [uly] [lrx] [lry]}' for dimension parameters.
+\item\fbox{\ttfamily pdf:exobj} \ ends the previous form \XObject\ definition.
+\item\fbox{\ttfamily pdf:uxobj @name} \ displays the image \XObject\ or the form \XObject\ previously defined and associated with `\texttt{@name}'.
+\DPM$x$ allows dimension parameters (same as `\texttt{pdf:image}') after `\texttt{@name}'.
+\end{itemize}
+
+\noindent
+Typical examples showing how to use image \XObject{}s and form \XObject{}s can be found in~\cite[pp.~15--16]{Cho05}.
+
+\begin{figure}[h]
+\centering\includegraphics{transparencygroup.pdf}
+\caption{Two form \XObject{}s with opacity 0.5; the right one is a group \XObject.}
+\label{Figure1}
+\end{figure}
+
+\DPX\ extended the command `\texttt{pdf:eann}' to support a group \XObject.\note{``A special type of form \XObject\ that can be used to group graphical elements together as a unit for various purposes.'' \cite[p.~360]{PDFReference}}
+Figure~\ref{Figure1} shows the difference between a normal \XObject\ and a group \XObject.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:exobj <<dict>>} \ merges the dictionary object `\texttt{<<dict>>}' into the type1 form dictionary~\cite[p.~358]{PDFReference} of the previous form \XObject\ and then close the \XObject.
+\end{itemize}
+
+\noindent
+The following code draws the right image in Figure~\ref{Figure1}.
+
+\begin{verbatim}[\small]
+\special{pdf:bxobj @group bbox 0 0 50 50}
+\special{pdf:code
+ 15 w 0 0 m 50 50 l S 50 0 m 0 50 l S}
+\special{pdf:exobj << /Group
+ << /S /Transparency >> >>}
+\special{pdf:obj @extgstate
+ << /CA0.5 <</CA 0.5>> /ca0.5 <</ca 0.5>> >>}
+\special{pdf:put @resources
+ << /ExtGState @extgstate >>}
+\special{pdf:code /CA0.5 gs /ca0.5 gs}
+\special{pdf:uxobj @group}
+\end{verbatim}
+
+\noindent We get the left image if \verb+\special{pdf:exobj}+ is used instead of the 4th and the 5th line.
+
+
+\section{Raw PDF Operators}
+
+This final section deals with writing raw \PDF\ operators in the output.
+\DPM\ provides a special command for this feature.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:content Operators} \vadjust{\vskip2pt} adds the list of operators ``\texttt{Operators}'' to the current page at the current location.
+The operator `\texttt{q}', saving the current graphics state, followed by a transformation matrix moving to the current location will be attached to the beginning of the list, and the operator `\texttt{Q}' restoring the saved graphics state at the end of the list.
+\end{itemize}
+
+For instance, the special command
+
+\begin{verbatim}
+\special{pdf:content 10 w 0 0 m 50 50 l S}
+\end{verbatim}
+
+\noindent
+inserts the following list of operators in the output.
+
+\smallskip\noindent
+{\fontsize{9pt}{11pt}\selectfont
+%\begin{verbatim}
+\ttfamily\ldots\,%
+\fbox{\strut q}\,\fbox{\strut 1 0 0 1 $x$ $y$ cm}\,%
+10 w 0 0 m 50 50 l S
+\fbox{\strut Q}\,%
+\ldots
+%\end{verbatim}
+}
+
+We sometimes need to insert \PDF\ operators without additional graphics state operators.
+The author of the \PGF\ package devised a trick:
+
+{\hfuzz=5pt
+\begin{verbatim}
+\special{pdf:content Q ... Operators ... q}
+\end{verbatim}
+}
+
+\noindent
+The first operator `\texttt{Q}' and the last operator `\texttt{q}' nullify the effects of graphics state operators that are attached.
+
+\DPX\ provides a new special command instead of the trick above.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:literal direct Operators}\note{%
+The idea of `\texttt{pdf:literal direct}' came from the primitive `\cs{pdfliteral direct}' of \pdfTeX.} \ or simply\\[\fafter]
+\fbox{\ttfamily pdf:code Operators} \ plays the same role as\\[\fafter]
+`\texttt{pdf:content}, but no graphics state operator and no
+transformation matrix will be added.
+\end{itemize}
+
+\begin{figure}[h]
+\centering\includegraphics{bcontent.pdf}
+\caption{The location of `23' in the left image varies according to the location of 1 in the current page.}
+\label{Figure2}
+\end{figure}
+
+Consider the following code, labelled Listing~\ref{Code1}. Which image in Figure~\ref{Figure2} does this code generate?
+
+\renewcommand{\tablename}{Listing}
+\setcounter{table}{0}
+\begin{table}[h]
+%{
+\hfuzz=5pt
+\fontsize{9pt}{11pt}\selectfont
+\begin{verbatim}
+\def\bpic{\special{pdf:content q}}
+\def\epic{\special{pdf:content Q}}
+\def\myop#1{\special{pdf:content Q #1 q}}
+1\bpic2\myop{.5 G 10 w 0 0 m 100 100 l S}3\epic4
+\end{verbatim}
+%}
+\caption{Which image in Figure~\ref{Figure2} is the result of this code, produced by \DPM($x$)?}
+\label{Code1}
+\end{table}
+
+The macro \cs{bpic} in Listing~\ref{Code1} nullifies the effect of the operator `\texttt{Q}' that will be attached after `\texttt{q}', and the macro \cs{epic} nullifies the effect of the list `\texttt{q 1 0 0 1 $x$ $y$ cm}' that will be attached before `\texttt{Q}'.
+
+Most people may choose the right-hand image in Figure~\ref{Figure2} as the result of Listing~\ref{Code1}, if they remember the fact that special commands are considered nothing by \TeX. However, the answer is the left-hand image.
+The reason is that the transformation matrix in the macro \cs{bpic} still has an effect on the characters `2' and `3'. The effect will be nullified by the macro \cs{epic}.
+
+To produce the right-hand image, \DPX\ provides the following new special commands.
+
+\begin{itemize}
+\item\fbox{\ttfamily pdf:bcontent} \ starts a block that works in the same way as `\texttt{pdf:content}' except that all text between this command and `\texttt{pdf:econtent}' will be placed in the right position.
+\item\fbox{\ttfamily pdf:econtent} \ ends the current block.
+\end{itemize}
+
+\noindent
+Moreover, `\texttt{pdf:bcontent}' and `\texttt{pdf:econtent}' can be nested.
+
+Finally, we can get the right-hand image in Figure~\ref{Figure2} as the result of Listing~\ref{Code2} following, produced by \DPX.
+
+\begin{table}[h]
+%{
+\hfuzz=5pt
+\fontsize{9pt}{11pt}\selectfont
+\begin{verbatim}
+\def\bpic{\special{pdf:bcontent}}
+\def\epic{\special{pdf:econtent}}
+\def\myop#1{\special{pdf:code #1}}
+1\bpic2\myop{.5 G 10 w 0 0 m 100 100 l S}3\epic4
+\end{verbatim}
+%}
+\caption{The right-hand image in Figure~\ref{Figure2} is the result of this example produced by \DPX.}
+\label{Code2}
+\end{table}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SetBibJustification\raggedright
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{thebibliography}{99}
+
+\bibitem{PDFReference} Adobe Systems, Inc., \emph{\PDF\ Reference}, \nth{6} edition (Version 1.7, November 2006).
+ \url{http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf}.
+
+\bibitem{pdfmark} Adobe Systems, Inc., \emph{\pdfmark\ Reference}
+(Version 8.0, November 2006).
+ \url{http://www.adobe.com/devnet/acrobat/pdfs/pdfmark_reference.pdf}.
+
+\bibitem{Cho03}
+Jin-Hwan Cho, \emph{\DPX, an extension of \DPM},
+ \tug\ 2003. Hawaii, United States.
+ \url{http://project.ktug.or.kr/dvipdfmx/doc/tug2003.pdf}.
+
+\bibitem{Cho05}
+Jin-Hwan Cho, \emph{Practical Use of Special Commands in \DPX},
+ \tug\ 2005, International Typesetting Conference. Wuhan, China.
+ \url{http://project.ktug.or.kr/dvipdfmx/doc/tug2005.pdf}.
+
+\bibitem{Cho07}
+Jin-Hwan Cho, \emph{Hacking \DVI\ files: Birth of \DVIasm}, The Prac\TeX\ Journal (2007), no.~1, and TUGboat 28:2, 2007, 210--217.
+ \url{http://tug.org/TUGboat/Articles/tb28-2/tb89cho.pdf}.
+
+\bibitem{Cho08}
+Jin-Hwan Cho, \emph{Handling Two-Byte Characters with \DVIasm}, The Asian Journal of \TeX\ \textbf{2} (2008), no.~1, 63--68.
+ \url{http://ajt.ktug.kr/assets/2008/5/1/0201cho.pdf}.
+
+\bibitem{DVIasm}
+Jin-Hwan Cho, \emph{The \DVIasm\ Python script}.
+ \ctanloc{dviware/dviasm/}.
+
+\bibitem{hyperref}
+Heiko Oberdiek, \emph{The hyperref package} (Version 6.78f, August 2008).
+ \ctanloc{macros/latex/contrib/hyperref/}
+
+\bibitem{beamer}
+Till Tantau, \emph{The beamer package} (Version 3.07, March 2007).
+ \ctanloc{macros/latex/contrib/beamer/}.
+
+\newpage
+\bibitem{PGF}
+Till Tantau, \emph{\PGF, A Portable Graphics Format for \TeX} (Version 2.00, February 2008).
+ \ctanloc{graphics/pgf/}.
+
+\bibitem{DVIPDFM} Mark A. Wicks, \emph{\DPM\ User's Manual}
+(Version 0.12.4, September 1999).
+ \url{http://gaspra.kettering.edu/dvipdfm/dvipdfm-0.12.4.pdf}.
+
+\end{thebibliography}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\medskip
+\makesignature
+\end{document}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/systems/doc/dvipdfmx/dvipdfmx.pdf b/systems/doc/dvipdfmx/dvipdfmx.pdf
new file mode 100644
index 0000000000..c3f78cec08
--- /dev/null
+++ b/systems/doc/dvipdfmx/dvipdfmx.pdf
Binary files differ
diff --git a/systems/doc/dvipdfmx/dvipdfmx.tex b/systems/doc/dvipdfmx/dvipdfmx.tex
new file mode 100644
index 0000000000..b346ef1315
--- /dev/null
+++ b/systems/doc/dvipdfmx/dvipdfmx.tex
@@ -0,0 +1,2240 @@
+\documentclass[a4paper,xetex,oneside]{book}
+\usepackage{xltxtra}
+\usepackage{fontspec}
+\usepackage{microtype}
+\usepackage{xunicode}
+\usepackage{unicode-math}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% PLATFORM DEPENDENT INSTRUCTION HERE
+%% Font setup for body text.
+\setmainfont{Constantia}
+\setsansfont{Cambria}
+\setmonofont[Scale=0.92]{Consolas}% Adjust xheight difference
+\setmathfont{Cambria Math}
+%% The following section is for showing some fancy examples.
+%% Some fonts used here may not be availabel on your system.
+%% Please modify this. Just replacing with empty macros is OK.
+\newcommand{\jpzerofourexamples}{{%
+\setmainfont[Scale=5,RawFeature=+jp04]{SourceHanSerifJP-Light.otf}葛祇逢}}
+\newcommand{\jpninezeroexamples}{{%
+\setmainfont[Scale=5,RawFeature=+jp90]{SourceHanSerifJP-Light.otf}葛祇逢}}
+%% We use PostScript raw code here to test dvipdfmx's capability.
+%% TFM files `uprml' and `uprmlv' are distributed with upTeX.
+%% TrueType font `yumindb.ttf' is bundled with Windows 10.
+\newcommand{\jphoritext}{%
+\makebox[112bp][l]{%
+\raisebox{88bp}[112bp][0bp]{%
+\special{pdf:mapline uprml UniJIS-UTF8-H yumindb.ttf}
+\special{ps: uprml findfont 16 scalefont setfont
+ currentpoint moveto (「こんにちは」) show}%
+}}}
+\newcommand{\jpverttext}{%
+\makebox[16bp][l]{%
+\raisebox{112bp}[112bp][0bp]{%
+\special{pdf:mapline uprmlv UniJIS-UTF8-V yumindb.ttf}
+\special{ps: uprmlv findfont 16 scalefont setfont
+ currentpoint moveto (「こんにちは」) show}%
+}}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{xcolor,hyperref,hyperxmp}
+\hypersetup{%
+ bookmarksnumbered=true,%
+ colorlinks=true,%
+ urlcolor=[rgb]{0.2,0.2,0.4},
+ linkcolor=[rgb]{0.2,0.2,0.4},
+ citecolor=[rgb]{0.2,0.2,0.4},
+ pdftitle={The Dvipdfmx User's Manual},%
+ pdfauthor={The dvipdfmx project team},%
+ pdfsubject={A User's Manual for Dvipdfmx and Xdvipdfmx.},%
+ pdfkeywords={dvipdfmx, XeTeX, TeX, LaTeX},
+ pdflang=en,
+ pdfcopyright={Copyright © The dvipdfmx project team.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".},
+ pdflicenseurl={http://www.gnu.org/licenses/fdl.html}
+}
+\usepackage{listings}
+\lstset{
+ keepspaces=true,
+ basicstyle={\ttfamily},
+ frame={tb},
+ breaklines=true,
+ columns=[l]{fullflexible},
+ numbers=none,
+ xrightmargin=2em,
+ xleftmargin=2em,
+ aboveskip=2em,
+ belowskip=2em
+}
+\usepackage{mflogo}
+\usepackage{lipsum}
+\usepackage{array}
+\usepackage{marginnote}
+\renewcommand*{\marginfont}{\footnotesize\itshape}
+\usepackage[noorphans,font=itshape]{quoting}
+\newcommand{\package}[1]{\textit{#1}}
+\newcommand{\code}[1]{\mbox{\texttt{#1}}}
+\newcommand{\keyword}[1]{\textit{#1}}
+\newcommand{\option}[1]{\mbox{`\texttt{#1}'}}
+\newcommand{\dvipdfm}{\texttt{dvipdfm}}
+\newcommand{\dvipdfmx}{\texttt{dvipdfmx}}
+\newcommand{\xdvipdfmx}{\texttt{xdvipdfmx}}
+\newcommand{\deprecated}[1]{\marginnote{\addfontfeatures{Color=CC3333}#1}}
+\newcommand{\newfeature}[1]{\marginnote{\addfontfeatures{Color=3366CC}#1}}
+\newcommand{\lnum}[1]{{\addfontfeatures{RawFeature=+lnum}#1}}
+% For placeing drawings via \special
+\newcommand{\specialbox}[3]{%
+\makebox[#1][l]{\raisebox{-#2}[0bp][#2]{\special{#3}}}}
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+%%DVIPDFMX SETTINGS
+\AtBeginDocument{%
+ \special{dvipdfmx:config O 1}%
+ \special{dvipdfmx:config V 7}
+}
+\begin{document}
+
+\begin{titlepage}
+ \begin{raggedleft}
+ {\Huge\bfseries The Dvipdfmx User's Manual}\\[\baselineskip]
+ \Large The Dvipdfmx Project Team\\
+ December 23, 2018\par
+ \end{raggedleft}
+\end{titlepage}
+
+\tableofcontents
+
+\chapter{Getting Started}
+
+\section{Introduction}
+
+The \dvipdfmx\ (formerly \dvipdfm-cjk) project provides an extended version of
+the \dvipdfm, a DVI to PDF translator developed by Mark~A.~Wicks.
+
+The primary goal of this project is to support multi-byte character encodings
+and large character sets such as for East Asian languages.
+This project started as a combined work of the \dvipdfm-jpn project by
+Shunsaku Hirata and its modified one, \dvipdfm-kor, by Jin-Hwan Cho.
+
+Extensions to \dvipdfm\ include,
+\begin{itemize}
+ \item Support for OpenType and TrueType font, including partial support
+ for the OpenType Layout for finding glyph variants and vertical writing.
+ \item Support for CJK-\LaTeX\ and H\LaTeX\ with Subfont Definition Files.
+ \item Support for various legacy multi-byte encodings via PostScript CMap
+ Resources.
+ \item Unicode related features: Unicode as an input encoding and
+ auto-creation of ToUnicode CMaps.
+ \item Support for p\TeX\ (a Japanese localized variant of \TeX) including
+ vertical writing extension.
+ \item Some extended DVI specials.
+ \item Reduction of output files size with on-the-fly Type1 to CFF (Type1C)
+ conversion and PDF object stream.
+ \item Advanced raster image support including alpha channels, embedded
+ ICC profiles, 16-bit bit-depth colors, and so on.
+ \item Basic PDF password security support for PDF output.
+\end{itemize}
+Some important features are still missing:
+\begin{itemize}
+ \item Linearization.
+ \item Color Management.
+ \item Resampling of images.
+ \item Selection of compression filters.
+ \item Variable font and OpenType 1.8.
+ \item and many more...
+\end{itemize}
+
+\dvipdfmx\ is now maintained as part of \TeX\ Live. Latest source code can
+be found at the \TeX\ Live SVN repository. For an instruction on accessing the
+development sources for \TeX\ Live, see,\medskip
+
+\url{http://www.tug.org/texlive/svn/}
+\medskip
+
+This document, ``The \dvipdfmx\ User's Manual'', was originally prepared for
+\TeX\ Live 2017. Current maintainer of this document is Shunsaku Hirata.
+Latest version and contact information can be found at:\medskip
+
+\url{http://github.com/shirat74/dvipdfm-x-doc}
+\medskip
+
+\noindent{}Please send questions or suggestions.
+
+\subsection{\xdvipdfmx}
+
+\xdvipdfmx\ is an extended version of \dvipdfmx, and is now incorporated into
+\dvipdfmx.
+
+The \xdvipdfmx\ extensions provides support for the Extended DVI (.xdv) format
+generated by \XeTeX\ which includes support for platform-native fonts and the
+\XeTeX\ graphics primitives, as well as Unicode text and OpenType font.
+
+\XeTeX\ originally used a Mac-specific program called \code{xdv2pdf} as a
+backend program instead of \xdvipdfmx. The \code{xdv2pdf} program supported
+a couple of special effects that are not yet available through \xdvipdfmx:
+The Quartz graphics-based shadow support, AAT ``variation'' fonts such as Skia,
+transparency as an attribute of font, and so on.
+It would be nice if they continue to be supported. Suggestions and help are
+welcomed.
+
+
+\subsection{Legal Notice}
+
+Copyright © The dvipdfmx project team.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperref[SEC:FDL]{GNU Free Documentation License}''.
+
+\section{Installation and Usage}
+
+Typical usage and installation steps are not different from the original
+\dvipdfm. Please refer documents from \dvipdfm\ distribution for detailed
+instruction on how to install and how to use \dvipdfm. The \dvipdfm\ manual is
+available from its CTAN site:\medskip
+
+\url{http://www.ctan.org/tex-archive/dviware/dvipdfm}
+\medskip
+
+The minimal requirements for building \dvipdfmx\ is the \keyword{kpathsea} library.
+the \keyword{zlib} library for compression and the \keyword{libpng} library for PNG
+inclusion are highly recommended.
+Optionally, the \keyword{libpaper} library might be used to handle paper size.
+
+This document mainly focuses on the additions and modifications to \dvipdfm.
+Please refer the
+``\href{http://mirrors.ctan.org/dviware/dvipdfm/dvipdfm.pdf}{Dvipdfm User's Manual}''
+available from the CTAN site mentioned above for basic usage.
+
+Some additional command line options recognized by \dvipdfmx\ are listed in
+Table~\ref{TABLE:options}. In addition to this, the \code{-V} option for specifying
+the output PDF version now accepts the version specification of a form \code{2.0}. Try
+\begin{lstlisting}
+dvipdfmx --help
+\end{lstlisting}
+for the list of command line options and their explanations.
+
+\begin{table}
+ \centering
+ \begin{tabular}{lp{8cm}}\hline
+ Option & Description \\ \hline\hline
+ \code{-C} \textit{number} & Specify miscellaneous option flags. See,
+ section of ``\hyperref[SEC:compatibility]{Incompatible Changes}'' for
+ details. \\
+ \code{-S} & Enable PDF encryption. \\
+ \code{-K} \textit{number} & Set encryption key length. The default value
+ is 40.\\
+ \code{-P} \textit{number} & Set permission flags for PDF encryption.
+ The \textit{number} is a 32-bit unsigned integer representing permission
+ flags.
+ See, section of ``\hyperref[SEC:encryption]{Encryption Support}''.
+ The default value is \code{0x003C}.\\
+ \code{-I} \textit{number} & Life of image cache in hours. By specifying
+ value \code{0} \dvipdfmx\ erases cached images, and value \code{-1}
+ erases all cached images and does not leave newly generated one. The
+ default value is \code{-2}. (ignore image cache) \\
+ \code{-M} & Process \MP\ generated PostScript file.\\
+ \code{-E} & Always try to embed fonts \emph{regardless of
+ licensing}.\\
+ \code{-O} \textit{number} & Set maximum depth of open bookmark item.\\
+ \hline
+ \end{tabular}
+ \caption{Additional command line options recognized by \dvipdfmx.}%
+ \label{TABLE:options}
+\end{table}
+
+
+\section{Quick Guide}
+
+\dvipdfmx\ is supposed to be used by users of \LaTeX\ packages for typesetting
+CJK languages like H\LaTeX\ and CJK-\LaTeX, and \TeX\ variants such as \XeTeX,
+p\TeX, and up\TeX.
+This section is intended to be a quick guide for each users.
+
+\subsection{\texorpdfstring{\XeTeX}{XeTeX}}
+
+\XeTeX\ users
+normally do not invoke the \dvipdfmx\ command directly. To control the
+behavior of \dvipdfmx, please consider using the \code{dvipdfmx:config}
+special explained in the section of ``\hyperref[SEC:specials]{Specials}''.
+Some part of this document is irrelevant for \XeTeX\ users.
+
+\subsection{p\TeX}
+p\TeX\ users are at least required to install several auxiliary files
+mentioned in the section of ``\hyperref[SEC:auxfiles]{Auxiliary Files}''
+and to setup font-mappings. Just install the \package{adobemappings} and
+\package{glyphlist} for auxiliary files. (As \TeX\ Live basic installation
+requires them, they are probably already installed for \TeX\ Live users.)
+
+For \TeX\ Live users, setting up fontmaps can be easily done with the help
+of the \package{ptex-fontmaps} package and the \keyword{updmap} program.
+To use with the IPAex fonts (contained in the \package{ipaex} package), for
+example, run,
+\begin{lstlisting}
+kanji-config-updmap --sys ipaex
+\end{lstlisting}
+where the \option{--sys} option indicates the system-wide configuration.
+After successful invocation of the above command, the IPAex fonts will
+be used by default. The current setting can be checked via,
+\begin{lstlisting}
+kanji-config-updmap --sys status
+\end{lstlisting}
+For more information on the updmap program, try,
+\begin{lstlisting}
+kanji-config-updmap --help
+\end{lstlisting}
+or refer the documentation of the updmap program.
+
+Alternatively, just for a quick test of installation, try the following:
+\begin{lstlisting}
+\documentclass{article}
+\begin{document}
+\special{pdf:mapline rml H KozMinProVI-Regular}
+...Some Japanese text goes here...
+\end{document}
+\end{lstlisting}
+In this example, PDF viewer which can handle substitute font is required since
+\dvipdfmx\ does not embed fonts.
+
+For using Japanese text in PDF document information and annotations, put
+the following \code{special} command,
+\begin{lstlisting}
+\AtBeginDocument{\special{pdf:tounicode 90ms-RKSJ-UCS2}}
+\end{lstlisting}
+in the preamble.
+The above \code{special} command instructs \dvipdfmx\ to convert text encoded
+in Shift-JIS to Unicode. For EUC-JP, replace 90ms-RKJK-UCS2 with EUC-UCS2.
+
+\subsection{up\TeX}
+up\TeX\ users are basically the same as p\TeX\ users but there are two choices
+for setting fontmaps. Setup fontmaps as mentioned above for p\TeX, or use
+keyword \code{unicode} in the encoding field of the fontmap file.
+
+The former might be easier as the auto-creation of fontmap files can be done
+with the updmap program and the \package{ptex-fontmaps} package. But in
+this method there are some difficulties when using fonts which employ character
+collections (glyph repertoire) other than Adobe-Japan\lnum{1} in the case of PostScript
+flavored OpenType fonts.
+In the later case, the \package{adobemappings} package is not required
+and newer PostScript flavored OpenType fonts which do not employ Adobe-Japan\lnum{1}
+can be easily used too.
+
+Using \code{unicode} is more simpler and intuitive thus it is recommended to
+use this method.\footnote{For \TeX\ Live 2017. Earlier versions have buggy
+support.}
+A typical example fontmap entries for using Adobe's SouceHan series
+might look like:
+\begin{lstlisting}
+urml unicode SourceHanSerifJP-Light.otf
+urmlv unicode SourceHanSerifJP-Light.otf -w 1
+ugbm unicode SourceHanSansJP-Medium.otf
+ugbmv unicode SourceHanSansJP-Medium.otf -w 1
+\end{lstlisting}
+
+As in p\TeX, the following \code{special} instruction might be necessary for PDF
+document information and annotations to be shown correctly:
+\begin{lstlisting}
+\AtBeginDocument{\special{pdf:tounicode UTF8-UCS2}}
+\end{lstlisting}
+Here, input encoding is assumed to be UTF-8.
+
+\subsection{CJK-\LaTeX}
+
+CJK-\LaTeX\ users are required to have \keyword{Subfont Definition Files}
+to be installed. They are available as part of the \package{ttfutils} package.
+
+To use TrueType Arphic fonts provided by the \package{arphic-ttf} package:
+\begin{lstlisting}
+\documentclass{article}
+\usepackage{CJKutf8}
+...Other packages loaded here...
+\AtBeginDocument{%
+ \special{pdf:tounicode UTF8-UCS2}%
+ \special{pdf:mapline bsmiu@Unicode@ unicode bsmi00lp.ttf}%
+ }
+\begin{document}
+\begin{CJK}{UTF8}{bsmi}
+...some Chinese text goes here...
+\end{CJK}
+\end{document}
+\end{lstlisting}
+Here, \code{pdf:mapline} special is used to setup a font-mapping.
+
+\section{Auxiliary Files}\label{SEC:auxfiles}
+
+This section is mostly for supporting legacy encodings and legacy font format
+such as PostScript Type1 font. \XeTeX\ users may skip this section.
+
+\dvipdfmx\ has a capacity to handle various input encodings from 7-bit
+encodings to variable-width multi-byte encodings. It also has some sort of
+Unicode support. Several auxiliary files which are not common to \TeX\ users
+are needed to enable those features. This section shortly describes about them.
+
+\subsection{PostScript CMap Resources}
+
+\keyword{PostScript CMap Resources}\footnote{See,
+``\href{http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5014.CIDFont\_Spec.pdf}%
+{Adobe CMap and CIDFont Files Specification}''}
+are required for supporting legacy encodings such as Shift-JIS, EUC-JP, \lnum{Big5},
+and other East Asian encodings. \dvipdfmx\ internally identifies glyphs with
+identifiers (CIDs\footnote{PostScript terminology ``Character IDentifier''.})
+represented as an integer ranging from 0 to 65535 in the CID-based glyph access.
+PostScript CMap Resources describes the mapping between sequences of input
+character codes and CIDs. \dvipdfmx\ has an extensible support for multi-byte
+encodings via PostScript CMap Resources.
+
+CMap files for standard East Asian encodings, for use with Adobe's character
+collections, are included in the \package{adobemapping} package.
+The latest version of those CMap files maintained by Adobe can be found at
+Adobe's GitHub Project page:\medskip
+
+\url{http://github.com/adobe-type-tools/cmap-resources}
+\medskip
+
+Those files are mandatory for supporting p\TeX. up\TeX\ users may also
+want to install them but they are not required.
+
+\subsection{Subfont Definition Files}
+
+CJK fonts usually contain several thousands of glyphs. For using such fonts
+with (original) \TeX, which can only handle 8-bit encodings, it is necessary to
+split a font into several \keyword{subfonts}. The Subfont Definition File (SFD)
+specify the way how those fonts are split into subfonts. \dvipdfmx\ uses SFD
+files to convert a set of subfonts back to a single font.
+
+SFD files are not required for use with \TeX\ variants which can handle
+multi-byte character encodings and large character sets such as p\TeX,
+up\TeX,\XeTeX, and Omega.
+H\LaTeX\ and CJK-\LaTeX\ users are required to have those files to be
+installed. SFD files are available as a part of the \package{ttfutils} package
+for \TeX\ Live users.
+
+\subsection{The Adobe Glyph List and ToUnicode Mappings}
+
+The Adobe Glyph List\footnote{See,
+``\href{http://github.com/adobe-type-tools/agl-specification}{Adobe Glyph List Specification}''}
+(AGL) describes correspondence between PostScript glyph names (e.g., \code{AE},
+\code{Aacute},...) and Unicode character sequences representing them.
+Some features described in the section ``Unicode Support'' requires AGL file.
+
+\dvipdfmx\ looks for the file \code{glyphlist.txt} when conversion from
+PostScript glyph names to Unicode sequences is necessary.
+This conversion is done in various situations; when creating ToUnicode CMaps
+for 8-bit encoding fonts, finding glyph descriptions from TrueType and OpenType
+fonts when the font itself does not provide a mapping from PostScript glyph
+names to glyph indices (version 2.0 ``post'' table), and when the encoding
+\code{unicode} is specified for Type1 font.
+
+The AGL file is included in the \package{glyphlist} package. The latest version
+can be found at Adobe's GitHub site:\medskip
+
+\url{http://github.com/adobe-type-tools/agl-aglfn}
+\medskip
+
+ToUnicode Mappings are similar to AGL but they describe correspondence
+between CID numbers (instead of glyph names) and Unicode values.
+The content of those files are the same as CMap Resources.
+They are required when using TrueType fonts emulated as a CID-keyed font.
+They should be found in the same directory as ordinary CMap files.
+
+ToUnicode Mapping files are included in the \package{adobemapping} package.
+Those files are not required for \XeTeX\ users.
+
+\section{Overview of Extensions}
+
+This section gives a quick overview of \dvipdfmx's extended capabilities.
+
+\subsection{CJK Support}
+
+There are many extensions made for supporting CJK languages. Features described
+here is mainly for CJK languages but their use is actually not limited to it.
+Those features are implemented in a generic way so that it can be beneficial to
+users who are not involved in CJK languages.
+
+\subsubsection{Legacy Multi-byte Encodings}
+
+\dvipdfmx\ has an extensible support for encodings by means of
+PostScript CMap Resources. Just like \code{enc} files are written for 8-bit
+encodings, one can write their own CMap files to support custom encodings.
+See, Adobe's technical notes\cite{ADOBE} for details on PostScript CMap Resources.
+
+\subsubsection{Vertical Writing}
+
+\dvipdfmx\ supports the vertical writing extension used by p\TeX\ and up\TeX.
+A DVI instruction to set the writing mode is supported. The OpenType Layout
+GSUB Feature is supported for selecting vertical version of glyphs.
+
+\begin{figure}
+\centering
+\jphoritext\hspace{24pt}\jpverttext%
+\caption{An example of horizontal and vertical text;
+left and right corner brackets are replaced with their vertical counterparts.}%
+\label{FIG:verttext}
+\end{figure}
+
+\subsection{Unicode Support}
+
+Unicode support here consists of two parts: Supporting Unicode as an input
+encoding and making output PDF files ``Unicode aware''.
+
+\subsubsection{Unicode as Input Encoding}
+
+\dvipdfmx\ recognizes an additional keyword \code{unicode} in fontmap files
+to declare that Unicode values are used in the input DVI file. Unicode support is
+basically limited to the Basic Multilingual Plane (BMP) since there are no
+support for code ranges that requires more than three bytes in TFM and extended
+TFM formats.
+
+\subsubsection{ToUnicode CMap Support}
+
+In PDF, it is often the case that text is not encoded in Unicode.
+However, modern applications usually want them represented in Unicode to make
+it usable as text information.
+The ToUnicode CMap is a bridge between PDF text string encodings and Unicode
+encodings, and makes it possible to extract text in PDF files as
+Unicode encoded strings. It is important to make resulting PDF search-able and
+copy-and-past-able. Dvipdfmx supports auto-creation of ToUnicode CMaps.
+
+It will not work properly for multiply encoded glyphs due to fundamental
+limitations of Unicode conversion mechanism with ToUnicode CMaps.
+
+\subsection{Other Extensions}
+
+\dvipdfmx\ can generate encrypted PDF documents to protect its contents from
+unauthorized access. It is limited to password-based authentication, and
+public-key based authentication is not supported. The 256-bit AES encryption is
+also supported for PDF version 1.7 and 2.0 setting although it may not be supported
+by PDF viewers.
+
+There are various other improvements over \dvipdfm. The most notable one is
+more improved PDF input and output support: The cross-reference stream and
+object stream introduced in \lnum{PDF-1.5} are also supported.
+
+
+\chapter{Graphics}\label{SEC:graphics}
+
+\section{Image Inclusion}
+
+The basics of incorporating images into output PDF is the same as in \dvipdfm.
+To do this, \LaTeX\ users can simply use the \package{graphicx} package.
+(possibly with the driver option \code{dvipdfmx})
+This section is \emph{not} for providing a how-to guide to include images but
+just for supported graphics and image formats along with supported features.
+
+Graphics support was mostly rewritten in \dvipdfmx.
+Support for BMP and JPEG\lnum{2000} was added. An effort to preserve more
+information originally found in included images, e.g., embedded ICC Profiles
+and XMP Metadata, was made.
+
+However, \dvipdfmx\ does not support various features common to graphics
+manipulation programs such as resampling, color conversion, and selection of
+compression filters. Thus, it is recommended to use other programs specialized
+in image manipulation for preparation of images.
+
+\subsection{Supported Graphics File Formats}
+
+Supported formats are, PNG, JPEG, \lnum{JPEG2000}, BMP, PDF, and \MP\ generated
+EPS. All other format images, such as SVG and PostScript, must be converted to
+PDF before inclusion. The \option{-D} option, as in \dvipdfm, can be used for
+filtering images.
+
+\subsubsection{Notes on PNG Support}
+
+PNG is supported as in \dvipdfm\ with many improvements.
+
+PNG support includes most of important features of PNG format such as color
+palette, transparency, 16-bit bit-depth color, embedded ICC Profiles,
+calibrated color, and embedded XMP Metadata.
+
+In including PNG images, \dvipdfmx\ first decompresses image data and then
+compresses (if requested) it again.
+For better compression ratio, a preprocessing filter (Predictor filter) might
+be applied before compression.
+\dvipdfmx\ supports the TIFF Predictor 2 and the PNG optimum filter.
+However, there is yet no way to specify which predictor function is to be used
+and currently PNG optimum filter is always employed.
+
+Predictor filter is a preprocessing filter to image data for improving compression.
+Using a predictor filter usually gives better compression
+but in many cases compression speed becomes significantly slower.
+Try \option{-C 0x20} command line option to disable predictor filters and to
+check if slowness is due to filtering.
+
+For the PNG optimum filter, a heuristic approach, ``minimum sum of absolute
+differences'', is employed for finding the most optimal filter to be used.
+See, discussion in the PNG Specification ''Filter selection'':\medskip
+
+\url{http://www.w3.org/TR/2003/REC-PNG-20031110/\#12Filter-selection}
+\medskip
+
+As built-in support for the sRGB color space is absent in PDF,
+the sRGB color can only be represented precisely by means of the sRGB ICC Profile.
+However, for sRGB color PNG images, \dvipdfmx\ uses an approximate calibrated
+RGB color space instead.
+For approximating the sRGB color, the gamma and CIE \lnum{1931} chromaticity values
+mentioned in the PNG Specification is used.
+See, the following page for more information:\medskip
+
+\url{http://www.w3.org/TR/2003/REC-PNG-20031110/\#11sRGB}
+\medskip
+
+\dvipdfmx\ also supports calibrated color with the \code{gAMA} and the \code{cHRM} chunk.
+These chunks carry information on more accurate color representation.
+Some software programs, however, write only \code{cHRM} but do not record the gamma value
+although the PNG specification recommends to do so. Gamma value 2.2 is assumed if only
+\code{cHRM} is present but \code{gAMA} is not.
+
+Some PNG features are unavailable depending on output PDF version setting. Please refer
+Table~\ref{TABLE:PNGfeat} for more details.
+
+\begin{table}
+ \centering
+ \begin{tabular}{lp{8cm}}\hline
+ Feature & PDF Version Required \\ \hline\hline
+ 16-bit Color Depth & Version 1.5 \\
+ Transparency & Full support for alpha channel requires PDF version 1.4.
+ Color key masking (a specific color is treated as fully transparent)
+ requires 1.3.\\
+ XMP Metadata & Version 1.4 \\
+ ICC Profile & Version 1.3 \\
+ \hline
+ \end{tabular}
+ \caption{PNG features and corresponding PDF versions required.}%
+ \label{TABLE:PNGfeat}
+\end{table}
+
+\subsubsection{JPEG and \lnum{JPEG2000}}
+
+JPEG format is supported as in \dvipdfm. In addition to this, \lnum{JPEG2000}
+is also supported.
+
+JPEG and \lnum{JPEG2000} image inclusion is basically done as ''pass-through'',
+that is, image data is not decompressed before inclusion. So, although these
+formats are basically lossy, there should be no quality loss when including
+images.
+
+JPEG is relatively well supported. \dvipdfmx\ supports embedded ICC Profiles
+and CMYK color. Embedded XMP metadata is also preserved in the output PDF.
+JFIF or Exif data might be used to determine image's physical size.
+
+As the PDF specification does not require information irrelevant to
+displaying images to be embedded, \dvipdfmx\ does not embed whole data.
+Especially, not all application specific data is retained. Application
+specific data such as JFIF, Exif, and \code{APP14} Adobe marker are
+preserved.
+Please note that XMP and Exif data which may contain location information
+where the photo was taken is always preserved in the output PDF file.
+
+\lnum{JPEG2000} is also supported. It is restricted to JP2 and JPX baseline
+subset as required by the PDF specification. It is not well supported and still in
+an experimental stage. J2C format and transparency are not supported.
+
+\subsubsection{PDF Support}
+
+PDF inclusion is supported as in \dvipdfm, with various important enhancement
+over \dvipdfm\ for more robust inclusion. \dvipdfmx\ can handle cross-reference
+streams and object streams introduced in \lnum{PDF-1.5}.
+\dvipdfmx\ also supports inclusion of PDF pages other than the first page.
+However, tagged PDF may cause problems and annotations are not kept.
+
+As there are no clear way to determine the natural extent of the graphics content
+to be clipped, \dvipdfmx\ preferably try to find the \emph{crop box} to decide
+image size. If there are no crop box \emph{explicitly} specified,%
+\footnote{There are some accusations by Japanese \TeX\ users as
+''violating the PDF spec.'' regarding this point. However, what we are
+talking about is how to guess the \emph{natural} or \emph{intended} size of
+images but not the default value of the PDF crop box itself.} then it
+tries to refer other boundary boxes such as the \emph{art box}. If there are no
+possible boundaries of the graphics content explicitly specified, the \emph{media box},
+which is the boundaries of the physical medium on which the page is to be printed,
+is used as the last resort.
+
+The \code{pdf:image} special supports additional keys, ``\code{page}'' and
+``\code{pagebox}''. The \code{page} key takes an integer value representing
+the page number of PDF page to be included, and the \code{pagebox} takes one
+of the keywords \code{mediabox}, \code{cropbox}, \code{artbox}, \code{bleedbox},
+or \code{trimbox} for selecting page's boundary box to be used. For example,
+\begin{lstlisting}
+\special{pdf:image pagebox artbox page 3 (foo.pdf)}
+\end{lstlisting}
+includes 3rd page of `foo.pdf' with the boundary box set to the art box.
+
+\subsubsection{Other Image Formats}
+
+For \MP\ generated Encapsulated PostScript (EPS) files, multi-byte encoding
+support is added.
+\dvipdfmx\ also supports ``\MP\ mode''. When \dvipdfmx\ is invoked with
+\option{-M} option, it enters in \MP\ mode and processes a \MP\
+generated EPS file as an input.%
+\footnote{\code{prologue} should be set to \code{2}.}
+
+BMP support is also added. It is limited to uncompressed or RLE-compressed
+raster images. Extensions are not (won't be) supported.
+
+For image formats not natively supported, the \code{-D} option can be
+used to convert images to PDF format before inclusion, as in \dvipdfm.
+In \dvipdfmx, the letter \code{v} in the \code{-D} option argument is expanded
+to the output PDF version.
+
+\subsection{Image Cache}
+
+Caching of images generated via filtering command specified with \option{-D}
+option is supported. It solves the problems that image inclusion becomes very
+slow when external filtering program such as GhostScript is invoked each time
+images are included.
+
+Use \option{-I} option to enable this feature:
+\begin{lstlisting}
+-I 24
+\end{lstlisting}
+where the integer represents the life of cache files, 24 hours in this example.
+Zero and negative values have a special meaning.
+Value 0 for ``erase old cached images while leaving newly created one'',
+-1 for ``erase all cached images'', and -2 for ``ignore image cache''.
+Default value is set to -2.
+
+\section{Graphics Drawing}
+
+\dvipdfmx\ does not offer a high level interface to draw graphics objects.
+A possible way to draw graphics is to write raw PDF graphics drawing codes and
+then to insert them into the output via \code{special} commands.
+
+To show an example, the following code:
+\begin{lstlisting}
+\special{pdf:content
+ 1 0 0 1 0 0 cm
+ 0 100 m
+ 80 100 120 80 120 0 c
+ S
+}
+\end{lstlisting}
+draws a Bézier curve,
+\begin{center}
+\specialbox{120bp}{100bp}{pdf:content 1 0 0 1 0 0 cm 0 100 m 80 100 120 80 120 0 c S}
+\end{center}
+The \code{pdf:content} special is used here which is useful for inserting an
+isolated graphics object.
+
+The above example illustrates a typical example of PDF graphics drawing.
+It consists of three parts; setting graphics state, constructing a path, and painting
+a path. A Graphic object are specified as a sequence of operators and their operands
+using \emph{postfix notation}. \keyword{Graphics state operators} comes first,
+\code{cm} in this example sets the current transformation matrix (CTM). Then,
+\keyword{path construction} operators follow; move to position $(0, 100)$,
+append a Bézier curve from current point to $(120, 0)$ with control points
+$(80, 100)$ and $(120, 80)$. Finally, a \keyword{path painting} operator
+comes to draw the constructed path.
+In this example the stroking operator \code{S}
+is used.
+
+\subsection{The \code{pdf:content} Special}
+
+The \code{pdf:content} special can be used for drawing an \emph{isolated}
+graphics object. It sets the origin of graphics drawing operators supplied to
+this command to the position where it is inserted.
+The whole content is enclosed by a pair of graphics state save-restore
+operators. So for example, a color change made within a \code{pdf:content}
+command takes an effect only within the content of this special.
+
+\subsection{Guide to PDF Graphics Operators}
+
+PDF employs essentially the same imaging model as PostScript.
+So, it is easy to learn about PDF graphics drawing for people who are
+well accustomed to PostScript. This section is intended to be a short guide
+for PDF graphics operators.
+
+\subsubsection{Graphics State Operators}
+
+The \code{cm} operator modifies CTM by concatenating the specified matrix.
+Operands given to this operators are six numbers each representing
+transformation matrix elements:
+translation represented as $[1, 0, 0, 1, t_x, t_y]$,
+scaling $[s_x, 0, 0, s_y, 0, 0]$,
+rotation $[\cos\theta, \sin\theta, -\sin\theta, \cos\theta, 0, 0]$.
+
+To uniformly scale the object, just use
+\begin{lstlisting}
+2.0 0 0 2.0 0 0 cm
+\end{lstlisting}
+
+The \code{w} operator sets the line width, e.g., `\code{2 w}' sets the line
+width to 2. Here is an example of drawing a rotated rectangle:
+\begin{lstlisting}
+0.866 0.5 -0.5 0.866 30 2 cm 5 w 0 0 100 50 re S
+\end{lstlisting}
+\begin{center}
+\specialbox{120bp}{96bp}{pdf:content 0.866 0.5 -0.5 0.866 30 2 cm 5 w 0 0 100 50 re S}%
+\end{center}
+
+Transformations can be sequentially applied; for the above example,
+\begin{lstlisting}
+1 0 0 1 30 2 cm 0.866 0.5 -0.5 0.866 0 0 cm
+5 w 0 0 100 50 re S
+\end{lstlisting}
+gives the same result.
+
+To specify colors, use \code{RG}, \code{rg}, \code{K}, and \code{k} operators,
+for RGB or CMYK color for stroking (upper-case) and nonstroking (lower-case).
+\begin{lstlisting}
+0.866 0.5 -0.5 0.866 30 2 cm 5 w
+1 0.4 0 0 K 1 0 0 0 k
+0 0 100 50 re B
+\end{lstlisting}
+where the \code{B} operator fill and then stroke the path.
+\begin{center}
+\specialbox{120bp}{96bp}{pdf:content 0.866 0.5 -0.5 0.866 30 2 cm 5 w
+1 0.4 0 0 K 1 0 0 0 k 0 0 100 50 re B}
+\end{center}
+
+A dash pattern can be specified with the \code{d} operator.
+Operands for this operator are the \keyword{dash array} and
+the \keyword{dash phase}.
+For example, to specify a dash pattern with 6-on 4-off starting with phase 0:
+\begin{lstlisting}
+[6 4] 0 d 2 w 0 0 m 320 0 l S
+\end{lstlisting}
+draws the following dashed line:
+\begin{center}
+\specialbox{320bp}{30bp}{pdf:content
+1 0 0 1 0 20 cm [6 4] 0 d 2 w 0 0 m 320 0 l S}
+\end{center}
+
+Other important operators are \code{q} and \code{Q}, which saves and restores
+the graphics state.
+\begin{lstlisting}
+1 0 0 1 30 2 cm
+q
+0.866 0.5 -0.5 0.866 0 0 cm
+[6 4] 0 d 2 w 0 0 100 50 re S
+Q
+-30 0 m 90 0 l S
+0 -2 m 0 96 l S
+\end{lstlisting}
+In the above example, \code{d}, \code{w}, and rotation only take effect within
+the \code{q}-\code{Q} block. The portion drawing two straight lines is unaffected
+by these graphics state change.
+\begin{center}
+\specialbox{120bp}{96bp}{pdf:content
+1 0 0 1 30 2 cm
+q
+0.866 0.5 -0.5 0.866 0 0 cm
+[6 4] 0 d 2 w 0 0 100 50 re S
+Q
+-30 0 m 90 0 l S
+0 -2 m 0 96 l S
+}
+\end{center}
+
+For a (incomplete) list of graphics state operators, see
+Talbe~\ref{TAB:operatorsGS}.
+
+\begin{table}
+ \centering
+ \begin{tabular}{llp{7.6cm}}\hline
+ Operands & Operator & Description\\ \hline\hline
+ --- & \code{q} & Save the current graphics state.\\
+ --- & \code{Q} & Restore the previously saved graphics state.\\
+ $a$ $b$ $c$ $d$ $e$ $f$ & \code{cm} & Modify the current transformation matrix
+ by concatenating the specified matrix.\\
+ \textit{width} & \code{w} & Set the line width.\\
+ \textit{array} \textit{phase} & \code{d} & Set the line dash pattern.\\
+ $r$ $g$ $b$ & \code{RG} & Set the stroking color space to RGB and
+ set the stroking color as specified.\\
+ $r$ $g$ $b$ & \code{rg} & Set the nonstroking color space to RGB and
+ set the nonstroking color as specified.\\
+ $c$ $m$ $y$ $k$ & \code{K} & Set the stroking color space to CMYK and
+ set the stroking color as specified.\\
+ $c$ $m$ $y$ $k$ & \code{k} & Set the nonstroking color space to CMYK and
+ set the nonstroking color as specified.\\
+ \hline
+ \end{tabular}
+ \caption{A few examples of graphics state operators and color operators.}%
+ \label{TAB:operatorsGS}
+\end{table}
+
+\subsubsection{Path Construction Operators}
+
+A path construction normally starts with a \code{m} operator which moves the
+current point to the specified position and then sequences of other path
+construction operators follow. The path currently under construction is
+called the \keyword{current path}. A sequence of path construction operators
+appends segments of path to the current path and then move the
+\keyword{current point} to the end point of appended path.
+A typical sequence of path construction looks like,
+\begin{lstlisting}
+100 50 m
+100 78 78 100 50 100 c
+22 100 0 78 0 50 c
+0 22 22 0 50 0 c
+78 0 100 22 100 50 c
+S
+\end{lstlisting}
+\begin{center}
+\specialbox{120bp}{80bp}{pdf:content
+100 50 m
+100 78 78 100 50 100 c
+22 100 0 78 0 50 c
+0 22 22 0 50 0 c
+78 0 100 22 100 50 c
+S}
+\end{center}
+This example is an approximated circle drawn by four Bézier curves.
+
+Table~\ref{TAB:operators} shows a list of path construction operators.
+Those who are accustomed to the PostScript language should note that in PDF
+the current path is not a part of the graphics state,
+and hence is \emph{not} saved and restored along with the other graphics state
+parameters.
+
+\begin{table}
+ \centering
+ \begin{tabular}{llp{6.9cm}}\hline
+ Operands & Operator & Description \\ \hline\hline
+ $x$ $y$ & \code{m} & Begin a new path by moving the current point specified by given operands.\\
+ $x$ $y$ & \code{l} & Append a line segment from the current point to the point specified.\\
+ $x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ & \code{c} & Append a Bézier curve to the current path.
+ Two Control points and the end point given as operands.\\
+ $x_2$ $y_2$ $x_3$ $y_3$ & \code{v} & Append a Bézier curve to the current path. Using the current
+ point and first two operand as the Bézier control points.\\
+ $x_1$ $y_1$ $x_3$ $y_3$ & \code{y} & Append a Bézier curve to the current path. The second
+ control point coincides with the end point.\\
+ --- & \code{h} & Close the current path by appending a straight line segment from the current point
+ to the starting point of the path.\\
+ $x$ $y$ \textit{width} \textit{height} & \code{re} & Append a rectangle. First two operands for the
+ position of lower-left corner, third and forth operand representing width and
+ height.\\
+ \hline
+ \end{tabular}
+ \caption{List of path construction operators. All operators move the current point to the end
+ point of appended path.}\label{TAB:operators}
+\end{table}
+
+\subsubsection{Path Painting Operators}
+
+There are basically four kind of path painting operators: \code{S}, \code{f},
+\code{B}, and \code{n}. The first three for ``stroke'', ``fill'', and
+``fill then stroke'' operators respectively, and the last one \code{n}
+paints nothing but end the path object. For filling operators, there are
+two kind of operators depending on how ``insideness'' of points are determined:
+the \keyword{non-zero winding number rule} and the \keyword{even-odd rule}.
+The even-odd rule operators are \code{f*} and \code{B*}.
+
+The following example illustrates the difference:
+\begin{lstlisting}
+0 0 100 100 re 20 20 60 60 re f
+1 0 0 1 120 0 cm
+0 0 100 100 re 20 20 60 60 re f*
+\end{lstlisting}
+\begin{center}
+\specialbox{220bp}{100bp}{pdf:content
+0 0 100 100 re 20 20 60 60 re f
+1 0 0 1 120 0 cm
+0 0 100 100 re 20 20 60 60 re f*}
+\end{center}
+The ``interior'' of the ``inner'' square has a non-zero even winding number.
+(In this example, counter-clockwise direction is assumed for both of
+two \code{re} operators.)
+
+\chapter{Specials}
+
+\section{PDF Specials}\label{SEC:specials}
+
+\dvipdfmx\ recognizes various special commands originally introduced in
+\dvipdfm. Please refer to the ``Dvipdfm User's Manual''\cite{DVIPDFM} for detailed
+information on PDF specials.
+
+\subsection{Additions to PDF Specials}
+
+Several \code{special} commands are added for more flexible PDF generation:
+creation of arbitrary stream objects, controlling \dvipdfmx\ behavior, and some
+specials which might be useful for graphics drawing.
+
+\subsubsection{PDF Object Manipulation}
+
+PDF object manipulation is a key feature of PDF specials.
+The \code{pdf:fstream} special is added in \dvipdfmx\ which enables creation of
+PDF stream object from an existing file. The syntax of this special is,
+\begin{lstlisting}
+pdf:fstream @identifier (filename) <<dictionary>>
+\end{lstlisting}
+where identifier and filename (specified as a PDF string object) are
+mandatory and a dictionary object, following the filename, which is to be added
+to the stream dictionary is optional.
+
+For example, to incorporate XMP Metadata from a file \code{test.xmp},
+\begin{lstlisting}
+\special{pdf:fstream @xmp (test.xmp) <<
+ /Type /Metadata
+ /Subtype /XML
+>>}
+\special{pdf:put @catalog << /Metadata @xmp >>}
+\end{lstlisting}
+
+Similarly, \code{pdf:stream} special can be used to create a PDF stream
+object from a PDF string instead of a file.
+\begin{lstlisting}
+pdf:stream @identifier (stream contents) <<dictionary>>
+\end{lstlisting}
+
+This special might be useful for creating a simple image inline.
+\begin{lstlisting}
+\special{pdf:stream @myim01
+ <5500AAC05500AAC05500AAC05500AAC05500>
+ <<
+ /Type /XObject
+ /Subtype /Image
+ /BitsPerComponent 1
+ /ColorSpace /DeviceGray
+ /Width 9
+ /Height 9
+ >>
+}
+\special{pdf:put @resources <<
+ /XObject << /MyIM01 @myim01 >>
+>>}
+\special{pdf:content 81 0 0 81 0 0 cm /MyIM01 Do}
+\end{lstlisting}
+The above example draws an image like Figure~\ref{FIG:stream}.
+\begin{figure}
+ \centering
+ \makebox[81bp][l]{\raisebox{-81bp}[0bp][81bp]{%
+ \special{pdf:stream @myim01 <5500AAC05500AAC05500AAC05500AAC05500>
+ <<
+ /Type /XObject
+ /Subtype /Image
+ /BitsPerComponent 1
+ /ColorSpace /DeviceGray
+ /Width 9
+ /Height 9
+ >>}
+ \special{pdf:put @resources <<
+ /XObject << /MyIM01 @myim01 >>
+ >>}
+ \special{pdf:content 81 0 0 81 0 0 cm /MyIM01 Do}
+}}
+\caption{An image created by \code{pdf:stream} special.}%
+\label{FIG:stream}
+\end{figure}
+
+\subsubsection{Controlling Font Mappings}
+
+\code{pdf:mapline} and \code{pdf:mapfile} specials can be used to append a
+fontmap entry or to load a fontmap file:
+\begin{lstlisting}
+pdf:mapline foo unicode bar
+pdf:mapfile foo.map
+\end{lstlisting}
+
+\subsubsection{Specifying Output PDF Version}
+
+\code{pdf:majorversion} and \code{pdf:minorversion} specials can be used to
+specify major and minor version of output PDF.
+\begin{lstlisting}
+pdf:minorversion 3
+\end{lstlisting}
+
+Please note that this command must appear on the first page,
+otherwise it will be ignored.
+
+\subsubsection{Custom File Identifiers}
+
+\newfeature{Addition in \TeX\ Live 2019}
+
+A custom file identifier (the \code{ID} entry in the trailer dictionary)
+can be specified via \code{pdf:trailerid} special as
+\begin{lstlisting}
+pdf:trailerid [(0123456789abcdef) (0123456789abcdef)]
+\end{lstlisting}
+An array of two 16-byte PDF string objects must be supplied as
+a file identifier. This special command must appear on the first page.
+
+\subsubsection{Encryption}
+
+To protect output PDF with encryption, use \code{pdf:encrypt} special
+\begin{lstlisting}
+pdf:encrypt userpw (foo) ownerpw (bar) length 128 perm 20
+\end{lstlisting}
+where user-password (\code{userpw}) and owner-password (\code{ownerpw}) must be
+specified as PDF string objects. (which can be empty)
+Numbers specifying key-length and permission flags here are decimal numbers.
+See, section ``\hyperref[SEC:encryption]{Encryption Support}'' for a brief
+description of permission flags.
+
+\subsubsection{PDF Document Creation}
+
+\newfeature{Addition in \TeX\ Live 2019}
+
+As a convenience, the \code{pageresources} special is added, which puts given page
+resources into subsequent page's \keyword{Resource Dictionary}. For example,
+\begin{lstlisting}
+\special{pdf:pageresources <<
+ /ExtGState << /MyGS01 << /ca 0.5 /CA 0.5 >> >>
+>>}
+\end{lstlisting}
+puts an ExtGState resource named \code{MyGS01} into the current page's and all
+subsequent pages' resource dictionary.
+
+Other notable extensions are \code{code}, \code{bcontent}, and
+\code{econtent}. The \code{code} special can be used to insert raw PDF graphics
+instructions into the output. It is different from \dvipdfm's
+\code{content} special in that it does not enclose contents with a \code{q}
+and \code{Q} (save-restore of graphics state) pair.
+A typical usage of this special is:
+\begin{lstlisting}
+\special{pdf:code q 1 Tr}
+...some text goes here...
+\special{pdf:code Q}
+\end{lstlisting}
+which changes text rendering mode to 1, as shown in Figure~\ref{FIG:trmode}.
+
+\begin{figure}
+\centering
+\mbox{\special{pdf:code q 1 w 1 Tr}%
+{\fontsize{200pt}{200pt}\selectfont\textchi}%
+\special{pdf:code Q}}%
+\caption{A character drawn in the PDF text rendering mode 1.}%
+\label{FIG:trmode}
+\end{figure}
+
+Be careful on using this special as it is very easy to generate
+broken PDF files. The \code{bcontent} and \code{econtent} pair is somewhat
+fragile and might be incompatible to other groups of special commands.
+It may not always be guaranteed to work as `expected'.
+
+\subsection{ToUnicode Special}
+
+PDF allows users to attach various additional information such as document information,
+annotation, and navigation information (like bookmarks) to their document.
+All human-readable text, \keyword{text string}, contained in such information must
+be encoded either in \keyword{PDFDocEncoding} or UTF-16BE with Unicode byte order
+marker. However, as many users can't prepare their document with text strings
+properly encoded, there is a special kind of special command, \code{pdf:tounicode},
+which can be used to convert text strings into the appropriate Unicode form.
+Note that this feature is provided just as a remedy for users incapable of encoding
+text strings properly.
+
+For example,
+\begin{lstlisting}
+\special{pdf:tounicode 90ms-RKSJ-UCS2}
+\end{lstlisting}
+declares that \emph{some} of text strings should be re-encoded according to specified
+conversion CMap \code{90ms-RKSJ-UCS2}.
+
+Conversion is done only for arguments to several PDF special commands such as
+\code{docinfo}, \code{ann}, and \code{out} but not for that of general object creation
+specials. Note that not all PDF string objects are subject to this conversion.
+By default, only dictionary entries listed below are converted.
+\begin{lstlisting}
+Title Author Subject Keywords Creator Producer Contents Subj
+TU T TM
+\end{lstlisting}
+
+\newfeature{Addition in \TeX\ Live 2019}
+
+The list of dictionary entries subject to conversion can be extended by supplying
+additional dictionary keys as an array object:
+\begin{lstlisting}
+ \special{pdf:tounicode 90ms-RKSJ-UCS2 [/RC /DS]}
+\end{lstlisting}
+
+If the name of conversion CMap contains one of the keywords RKSJ, \lnum{B5}, GBK, and KSC,
+PDF string objects are treated specially when they are parsed. A two byte sequence
+starting with the first byte's high bit set is treated ``as is'' so that
+the \code{0x5c} byte appears in the second byte is not treated as an escape sequence.
+This behavior is not compliant to the PDF specification.
+
+\subsection{PDF Special Examples}
+
+This section shows several examples of special command usage.
+It is intended to be a hint for advanced users, so uninterested users can safely skip
+this section. In many cases, using \dvipdfmx\ PDF specials requires knowledge on PDF.
+Please refer to Adobe's ``PDF Reference''\cite{ADOBE}.
+
+\subsubsection{Annotations}
+
+In this section, some useful special commands for creating \keyword{annotations}
+are explained. Note that viewer support is required for annotations to be
+displayed correctly.
+
+First start with a very simple \keyword{Text Annotation} for attaching a comment.
+This feature is supported by many PDF viewer applications.
+\marginnote{\special{pdf:ann width 20bp height 20bp
+ <<
+ /Type /Annot
+ /Subtype /Text
+ /Name /Comment
+ /T (Text Annotation Example)
+ /Subj (An Example of Text Annotations)
+ /Contents (A Quick Brown Fox Jumped Over The Lazy Dog.)
+ >>
+}}
+
+\begin{lstlisting}
+\special{pdf:ann width 20bp height 20bp
+ <<
+ /Type /Annot
+ /Subtype /Text
+ /Name /Comment
+ /T (Text Annotation Example)
+ /Subj (An Example of Text Annotations)
+ /Contents (A Quick Brown Fox Jumped Over The Lazy Dog.)
+ >>
+}
+\end{lstlisting}
+\code{pdf:ann} special is used to create an annotation. A small icon shall
+be shown on the side margin. Here, dictionary entry \code{T} is for the tilte,
+\code{Subj} for the subject of this annotation, and \code{Contents} for
+the text string to be shown in the body of this annotation.
+
+Likewise, \keyword{Rubber Stamp Annotation}, which places a rubber stamp
+like figure,
+\begin{center}
+\specialbox{150bp}{50bp}{pdf:ann width 150bp height 50bp
+ <<
+ /Type /Annot
+ /Subtype /Stamp
+ /Name /Approved
+ >>
+}
+\end{center}
+
+\begin{lstlisting}
+\special{pdf:ann width 150bp height 50bp
+ <<
+ /Type /Annot
+ /Subtype /Stamp
+ /Name /Approved
+ >>
+}
+\end{lstlisting}
+Other keywords such as \code{Expired}, \code{Final}, \code{Draft}, and so on,
+can be used in place of \code{Approved}.
+
+One can create stamps of their own style. For this purpose, other specials
+\code{pdf:bxobj} and \code{pdf:exobj} can be used for designing stamps.
+Those specials ``capture'' all typeset material enclosed by them into a PDF
+\keyword{Form XObject}, which is a reusable graphics object like included images.
+
+For a simple example,
+\begin{lstlisting}
+\special{pdf:bxobj @MyStamp
+ width 280pt height 0pt depth 40pt}
+\addfontfeature{Scale=4,Color=FF9933}My Own Stamp
+\special{pdf:exobj}
+\end{lstlisting}
+It captures typeset material ``My Own Stamp'' (this example uses \code{fontspec}
+package's command for changing font size and text color) into the object labeled as
+\code{MyStamp} for later reuse.
+Then, \code{AP} (\keyword{appearance dictionary}) entry for controlling the appearance
+of annotations is used as,
+\begin{lstlisting}
+\special{pdf:ann width 280pt height 40pt
+ <<
+ /Type /Annot
+ /Subtype /Stamp
+ /AP << /N @MyStamp >>
+ >>
+}
+\end{lstlisting}
+The image captured into the object \code{MyStamp} is used as ``Normal''
+(\code{AP} dictionary entry \code{N}) appearance.
+(\code{R} for ``Rollover'' and \code{D} for ``Down'' can be used.)
+
+\parbox[t][0pt][c]{280pt}{%
+\special{pdf:bxobj @MyStamp width 280pt height 0pt depth 40pt}%
+\addfontfeature{Scale=4,Color=FF9933}My Own Stamp%
+\special{pdf:exobj}%
+}%
+
+The result is:
+\begin{center}
+\specialbox{280bp}{40bp}{pdf:ann width 280pt height 40pt
+ <<
+ /Type /Annot
+ /Subtype /Stamp
+ /AP << /N @MyStamp >>
+ >>
+}
+\end{center}
+
+With the following code, \dvipdfmx\ reads the source file and creates a stream
+object named \code{SourceFile}, and then creates file attachment annotation.
+\marginnote{%
+\special{pdf:fstream @SourceFile (\jobname.tex)}%
+\special{pdf:ann width 10bp height 20bp
+ <<
+ /Type /Annot
+ /Subtype /FileAttachment
+ /FS <<
+ /Type /Filespec
+ /F (\jobname.tex)
+ /EF << /F @SourceFile >>
+ >>
+ /Name /PushPin
+ /C [0.8 0.2 0.2]
+ /T (The Dvipdfmx User's Manual)
+ /Subj (The Dvipdmfx User's Manual)
+ /Contents (XeLaTeX source file of this manual.)
+ >>
+}}%
+\begin{lstlisting}
+\special{pdf:fstream @SourceFile (\jobname.tex)}%
+\special{pdf:ann width 10bp height 20bp
+ <<
+ /Type /Annot
+ /Subtype /FileAttachment
+ /FS <<
+ /Type /Filespec
+ /F (\jobname.tex)
+ /EF << /F @SourceFile >>
+ >>
+ /Name /PushPin
+ /C [0.8 0.2 0.2]
+ /T (The Dvipdfmx User's Manual)
+ /Subj (The Dvipdfmx User's Manual)
+ /Contents (XeLaTeX source file of the manual.)
+ >>
+}
+\end{lstlisting}
+A push-pin image must be shown on the margin if viewer supports this kind of
+annotation.
+PDF viewer applications are required to provide predefined icon appearances
+at least for the following standard icons: \code{Graph}, \code{PushPin},
+\code{PaperClip}, and \code{Tag}.
+
+\subsubsection{Special Color Space}
+
+This section shows various examples of using \keyword{Special color spaces}.
+Examples in this section have a common structure. They consist of essentially
+three parts. The first part is for defining color space itself.
+PDF object creation commands like \code{pdf:obj} and \code{pdf:stream} are used
+for this purpose. Next is for registering color space resources in the page's
+\keyword{Resource Dictionary}. It can be done via \code{pdf:put} command as,
+\begin{lstlisting}
+\special{pdf:put @resource <<
+ /Category << ...key-value pairs... >>
+>>}
+\end{lstlisting}
+where \code{@resource} is a special keyword representing current page's
+Resource Dictionary and \code{Category} (to be replaced by actual category
+name) is a category name such as \code{ColorSpace}.
+Finally, graphics objects are placed, with or with a combination of
+text and, PDF drawing operators inserted by the \code{pdf:code} or the
+\code{pdf:contents} special.
+
+%%EXAMPLE: Separation Color Space
+The first example is the \keyword{Separation} color space:
+\special{pdf:stream @TintTransform1
+ ({0 exch dup 0.62 mul exch 0})
+ << /FunctionType 4
+ /Domain [0.0 1.0]
+ /Range [0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]
+ >>
+}%
+\special{pdf:stream @TintTransform2
+ ({dup 0.78 mul exch dup 0.05 mul exch 0.71 mul 0})
+ << /FunctionType 4
+ /Domain [0.0 1.0]
+ /Range [0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]
+ >>
+}%
+\special{pdf:obj @Orange [
+ /Separation /Orange /DeviceCMYK @TintTransform1
+ ]
+}%
+\special{pdf:obj @Green [
+ /Separation /Green /DeviceCMYK @TintTransform2
+ ]
+}%
+\begin{center}
+\mbox{%
+\special{pdf:put @resources <<
+ /ColorSpace << /CS01 @Orange /CS02 @Green >>
+ >>
+}%
+\fontsize{40pt}{40pt}\selectfont
+\special{pdf:code q /CS01 cs 1.0 scn}Orange\special{pdf:code Q} and
+\special{pdf:code q /CS02 cs 1.0 scn}Green\special{pdf:code Q}
+}
+\end{center}
+\begin{lstlisting}
+\special{pdf:stream @TintTransform1
+ ({0 exch dup 0.62 mul exch 0})
+ << /FunctionType 4
+ /Domain [ 0.0 1.0 ]
+ /Range [ 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 ]
+ >>
+}
+\special{pdf:stream @TintTransform2
+ ({dup 0.78 mul exch dup 0.05 mul exch 0.71 mul 0})
+ << /FunctionType 4
+ /Domain [ 0.0 1.0 ]
+ /Range [ 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 ]
+ >>
+}
+\special{pdf:obj @Orange [
+ /Separation /Orange /DeviceCMYK @TintTransform1
+ ]
+}
+\special{pdf:obj @Green [
+ /Separation /Green /DeviceCMYK @TintTransform2
+ ]
+}
+\mbox{%
+ \special{pdf:put @resources <<
+ /ColorSpace << /CS01 @Orange /CS02 @Green >>
+ >>
+ }%
+ \special{pdf:code q /CS01 cs 1.0 scn}
+ Orange
+ \special{pdf:code Q}
+ and
+ \special{pdf:code q /CS02 cs 1.0 scn}
+ Green
+ \special{pdf:code Q}
+}
+\end{lstlisting}
+
+\code{TintTransform}'s defined here are functions for transforming
+\keyword{tint} values into approximate colors in the
+\keyword{alternate color space}
+(\code{DeviceCMYK} in this example). PostScript calculator functions are used
+for converting a single component value representing ``Orange'' or ``Green''
+into four component CMYK values to approximate those colors. The ``Orange''
+color $v$ is approximated as $(0, 0.62v, v, 0)$ in CMYK color space for
+alternate display here.
+
+The \code{cs} operator for selecting color space and the \code{scn} operator
+for color values are used in the \code{pdf:code} special.
+Be sure that the \code{pdf:put} command, which puts color space resources
+into the current page's Resource Dictionary, goes into the same page as
+subsequent drawing commands.
+
+\dvipdfmx\ currently does not have an easy interface for using various color
+space families such as CIE-Based color spaces (e.g., calibrated colors and
+color space with an ICC profile) and Special color spaces (e.g., indexed,
+separation, shading and patterns).
+
+%%EXAMPLE: Shading
+Another example is a \keyword{shading pattern}:
+\begin{lstlisting}
+\special{pdf:put @resources <<
+ /Shading <<
+ /SH01 <<
+ /ShadingType 2
+ /ColorSpace @Orange
+ /Coords [0 0 320 20]
+ /Extend [true true]
+ /Function << /FunctionType 2 /Domain [0 1] /N 1.0 >>
+ >>
+ >>
+>>}
+\special{pdf:content 0 0 320 20 re W n /SH01 sh}
+\end{lstlisting}
+where the ``Orange'' separation color space defined before is used again.
+This example shows an axial shading (\code{ShadingType} 2) pattern.
+\begin{center}
+\makebox[320pt][l]{
+ \special{pdf:put @resources <<
+ /Shading <<
+ /SH01 <<
+ /ShadingType 2
+ /ColorSpace @Orange
+ /Coords [0 0 320 20]
+ /Extend [true true]
+ /Function << /FunctionType 2 /Domain [0 1] /N 1.0 >>
+ >>
+ >>
+ >>}
+ \raisebox{-20pt}[0pt][20pt]{\special{pdf:content 0 0 320 20 re W n /SH01 sh}}
+}
+\end{center}
+
+The shading pattern requires coordinate values to be mapped into color values.
+Type 2 (Exponential Interpolation) \keyword{Function} is used for defining how
+this mapping should occur here.
+The above example, with the exponent $N=1$, is just a simple linear-gradient.
+
+The final examples is a \keyword{tiling pattern}.
+\begin{lstlisting}
+\special{pdf:stream @MyPattern
+ (0.16 0 0 0.16 0 0 cm 4 w
+ 50 0 m 50 28 28 50 0 50 c S 100 50
+ m 72 50 50 28 50 0 c S
+ 50 100 m 50 72 72 50 100 50 c S
+ 0 50 m 28 50 50 72 50 100 c S
+ 100 50 m 100 78 78 100 50 100 c 22 100 0 78 0 50 c
+ 0 22 22 0 50 0 c 78 0 100 22 100 50 c S
+ 0 0 m 20 10 25 5 25 0 c f 0 0 m 10 20 5 25 0 25 c f
+ 100 0 m 80 10 75 5 75 0 c f
+ 100 0 m 90 20 95 25 100 25 c f
+ 100 100 m 80 90 75 95 75 100 c f
+ 100 100 m 90 80 95 75 100 75 c f
+ 0 100 m 20 90 25 95 25 100 c f
+ 0 100 m 10 80 5 75 0 75 c f
+ 50 50 m 70 60 75 55 75 50 c 75 45 70 40 50 50 c f
+ 50 50 m 60 70 55 75 50 75 c 45 75 40 70 50 50 c f
+ 50 50 m 30 60 25 55 25 50 c
+ 25 45 30 40 50 50 c f
+ 50 50 m 60 30 55 25 50 25 c 45 25 40 30 50 50 c f)
+ <<
+ /BBox [0 0 16 16]
+ /PaintType 2
+ /PatternType 1
+ /Resources <<
+ /ProcSet [/PDF]
+ >>
+ /TilingType 3
+ /Type /Pattern
+ /XStep 16
+ /YStep 16
+ >>
+}
+\end{lstlisting}
+
+The above example defines a tiling pattern. The content stream containing
+painting operators, \code{m} for ``move-to'', \code{c} for ``curve-to'',
+\code{f} for ``fill'', and \code{S} for ``stroke'', defines the appearance of
+the \keyword{pattern cell} for this tiling pattern. With the following code,
+\begin{lstlisting}
+\special{pdf:put @resources
+ <<
+ /ColorSpace << /CS01 [/Pattern /DeviceRGB] >>
+ /Pattern << /PT01 @MyPattern >>
+ >>
+}
+\special{pdf:content
+ q 0.8 0.3 0.3 RG /CS01 cs 0.8 0.3 0.3 /PT01 scn
+ 0 0 320 100 re f
+}
+\end{lstlisting}
+a box filled with the tiling pattern defined above is drawn.
+\special{pdf:stream @MyPattern
+ (0.16 0 0 0.16 0 0 cm 4 w
+ 50 0 m 50 28 28 50 0 50 c S 100 50
+ m 72 50 50 28 50 0 c S
+ 50 100 m 50 72 72 50 100 50 c S
+ 0 50 m 28 50 50 72 50 100 c S
+ 100 50 m 100 78 78 100 50 100 c 22 100 0 78 0 50 c
+ 0 22 22 0 50 0 c 78 0 100 22 100 50 c S
+ 0 0 m 20 10 25 5 25 0 c f 0 0 m 10 20 5 25 0 25 c f
+ 100 0 m 80 10 75 5 75 0 c f
+ 100 0 m 90 20 95 25 100 25 c f
+ 100 100 m 80 90 75 95 75 100 c f
+ 100 100 m 90 80 95 75 100 75 c f
+ 0 100 m 20 90 25 95 25 100 c f
+ 0 100 m 10 80 5 75 0 75 c f
+ 50 50 m 70 60 75 55 75 50 c 75 45 70 40 50 50 c f
+ 50 50 m 60 70 55 75 50 75 c 45 75 40 70 50 50 c f
+ 50 50 m 30 60 25 55 25 50 c
+ 25 45 30 40 50 50 c f
+ 50 50 m 60 30 55 25 50 25 c 45 25 40 30 50 50 c f)
+ <<
+ /BBox [0 0 16 16]
+ /PaintType 2
+ /PatternType 1
+ /Resources <<
+ /ProcSet [/PDF]
+ >>
+ /TilingType 3
+ /Type /Pattern
+ /XStep 16
+ /YStep 16
+ >>
+}%
+\begin{center}
+\raisebox{-100bp}[0bp][100bp]{\makebox[320bp][l]{\special{pdf:put @resources
+ <<
+ /ColorSpace << /CS01 [/Pattern /DeviceRGB] >>
+ /Pattern << /PT01 @MyPattern >>
+ >>
+}%
+\special{pdf:content
+ 0.8 0.3 0.3 RG /CS01 cs 0.8 0.3 0.3 /PT01 scn
+ 0 0 320 100 re f
+}}}%
+\end{center}
+
+\subsubsection{Transparency}
+
+%%EXAMPLE: Transparency
+\XeTeX's transparency feature is currently lost in \xdvipdfmx, but the same
+effect can be achieved by setting graphics state parameters with
+\code{ExtGState} resources and \code{gs} operator. Here is a simple
+transparency example:
+\special{pdf:obj @gs01 <<
+ /Type /ExtGState /CA 0.5 /ca 0.5 /AIS false
+>>}%
+\begin{figure}[ht]
+\centering
+\mbox{%
+ %\raisebox{120pt}{\parbox[t]{0.8\textwidth}{%
+ % \addfontfeature{Color=444444}\lipsum[1]}%
+ %}%
+ %\hspace{-0.8\textwidth}%
+ \special{pdf:put @resources <<
+ /ExtGState << /GS01 @gs01 >>
+ >>}%
+ \fontsize{220pt}{220pt}\selectfont
+ \special{pdf:code q /GS01 gs 1.0 0.8 0.2 rg}%
+ α%
+ \special{pdf:code 0.4 0.8 0.4 rg}%
+ \hspace{-0.3em}%
+ β%
+ \hspace{-0.3em}\raisebox{0.5ex}{%
+ \special{pdf:code 0.4 0.4 0.8 rg}%
+ π%
+ }%
+ \special{pdf:code 0.6 0.2 0.8 rg}%
+ \hspace{-0.2em}%
+ γ%
+ \special{pdf:code Q}%
+}
+\end{figure}
+\begin{lstlisting}
+\special{pdf:obj @GS01 <<
+ /Type /ExtGState /CA 0.5 /ca 0.5 /AIS false
+>>}%
+\mbox{%
+ \special{pdf:put @resources <<
+ /ExtGState << /GS01 @GS01 >>
+ >>}%
+ \special{pdf:code q /GS01 gs 1.0 0.8 0.2 rg}%
+ α%
+ \special{pdf:code 0.4 0.8 0.4 rg}%
+ \hspace{-0.3em}%
+ β%
+ \hspace{-0.3em}\raisebox{0.5ex}{%
+ \special{pdf:code 0.4 0.4 0.8 rg}%
+ π%
+ }%
+ \special{pdf:code 1.0 0.2 0.4 rg}%
+ \hspace{-0.2em}%
+ γ%
+ \special{pdf:code Q}%
+}
+\end{lstlisting}
+where values for \code{CA} and \code{ca} represent opacity of stroke and
+fill color respectively. Again, \code{pdf:put} command must go into the same
+page as subsequent graphics and text drawing operators.
+
+\section{Dvipdfmx Extensions}
+
+\newfeature{Addition in \TeX\ Live 2016}
+
+\noindent{}A new special \code{dvipdfmx:config} was introduced in
+\TeX Live 2016 which makes it possible to invoke a command line option.
+Several single letter command line options except \option{D} are supported.
+For example,
+\begin{lstlisting}
+dvipdfmx:config C 0x10
+\end{lstlisting}
+sets the \dvipdfmx's compatibility flags. See, the section
+``\hyperref[SEC:compatibility]{Incompatible Changes}'' for an explanation of
+compatibility flags.
+
+\section{PS Specials}
+
+PS (PostScript) specials can be used to insert a raw PostScript code for drawing
+graphics objects and transforming subsequent text and graphics.
+Please note that support for PostScript operators in \dvipdfmx\ is very
+limited. It is just enough for interpreting PostScript figures output by \MP.
+Only a basic set of operators for arithmetic and math, stack operation and manipulation,
+graphics state, path construction and painting, glyph and font, are supported.
+See, Table~\ref{TABLE:PS} for the list of
+recognized PostScript operators.
+
+\begin{table}
+ \centering
+ \begin{tabular}{p{3cm}>{\raggedright\arraybackslash}p{8cm}}\hline
+ Classification & Operators \\ \hline\hline
+ Arithmetic \& Math & \code{add} \code{sub} \code{mul} \code{div} \code{neg} \code{truncate}\\
+ Stack Operation & \code{clear} \code{pop} \code{exch}\\
+ Graphis State & \code{gsave} \code{grestore}
+ \code{setlinewidth} \code{setdash} \code{setlinecap} \code{setlinejoin} \code{setmiterlimit} \code{setgray} \code{setrgbcolor} \code{setcmykcolor} \\
+ Coordinate System & \code{concat} \code{scale} \code{translate} \code{rotate} \code{idtransform} \code{dtransform}\\
+ Path Construction & \code{currentpoint} \code{newpath} \code{closepath} \code{moveto} \code{rmoveto} \code{lineto} \code{rlineto} \code{curveto} \code{rcurveto} \code{arc} \code{arcn} \code{clip} \code{eoclip} \\
+ Painting & \code{stroke} \code{fill} \\
+ Glyph \& Font & \code{show} \code{findfont} \code{scalefont} \code{setfont} \code{currentfont} \code{stringwidth}\\
+ \hline
+ \end{tabular}
+ \caption{List of PostScript operators recognized by \dvipdfmx.}%
+ \label{TABLE:PS}
+\end{table}
+
+It might be enough for the purpose of basic graphics drawings but as there are
+no support for conditionals and controls it is not enough for complicated tasks,
+especially, the PSTricks package is not supported.
+
+In \dvipdfmx, text handling is extended to support CJK text.
+The following code draws Japanese text like shown in Figure~\ref{FIG:verttext}:
+\begin{lstlisting}
+\special{pdf:mapline uprml UniJIS-UTF8-H yumindb.ttf}
+\special{ps: uprml findfont 16 scalefont setfont
+ currentpoint moveto
+ (...some Japanese text goes here...) show
+}
+\end{lstlisting}
+
+\chapter{Fonts and Encodings}
+
+\section{Fonts and Encodings Support}
+
+In \dvipdfmx, all font formats supported by \dvipdfm\ are also supported with
+many improvements: The CFF conversion for PostScript Type1 fonts\footnote{PostScript
+Type1 font support is restricted to the binary format as in \dvipdfm.} is
+implemented which greatly reduces the output file size. Embedded TrueType fonts are
+now subsetted. The OpenType font format is also supported.\footnote{Its
+implementation is based on the OpenType specification version 1.4.
+Newly added features such as color fonts and variable fonts are not supported yet.}
+
+There are various enhancements made for supporting Unicode and legacy multi-byte
+character encodings for East Asian languages.
+
+
+\section{Font Mappings}
+
+The Syntax of font-mapping (fontmap) files is basically the same as in \dvipdfm.
+There are few extensions available in \dvipdfmx. In addition to the 8-bit \code{enc}
+file and keywords \code{builtin} and \code{none}, \dvipdfmx\ accepts a PostScript CMap
+Resource name and the keyword \code{unicode} in the encoding field.
+
+When the keyword \code{unicode} is specified in the encoding field of fontmap
+files, it is assumed that Unicode values are used in the input DVI file.
+
+\begin{lstlisting}
+ urml unicode SourceHanSerifJP-Light.otf
+\end{lstlisting}
+
+Although the DVI format allows 3-byte and 4-byte character codes to be used,
+\dvipdfmx\ only supports up to 2-byte range since there is no TFM format supporting
+3-byte or 4-byte codes.
+
+For PostScript Type1 fonts which do not support Unicode natively, an auxiliary file,
+the Adobe Glyph List, is required to make it possible to use fonts with Unicode access.
+
+As a general framework for supporting legacy multi-byte encodings, \dvipdfmx\ employs
+PostScript CMap Resources for handling input strings encoded in various
+character encodings. A CMap name can be specified in the encoding field just like
+the encoding name for 8-bit encodings. For example, to specify the CMap ``UniJIS-UCS2-H'',
+
+\begin{lstlisting}
+ urml UniJIS-UCS2-H HiraMinPro-W3.otf
+\end{lstlisting}
+
+For information on the Adobe Glyph List and PostScript CMap Resources, see,
+the section \ref{SEC:auxfiles}, ``Auxiliary Files''.
+
+\subsection{Extended Syntax and Options}
+
+Few options are available in \dvipdfmx\ in addition to the original dvipdfm's
+one. Please note that all features which makes \dvipdfmx\ to use
+non-embedded fonts are deprecated, as by doing so it makes \dvipdfmx\ to create
+PDF files which can be non-compliant to the ISO standards.
+
+\subsubsection{SFD Specification}
+
+For bundling up a font split into multiple subfonts via SFD back into
+a single font, dvipdfmx supports extended syntax of the form
+\begin{lstlisting}
+tfm_name@SFD@ encoding filename options
+\end{lstlisting}
+A typical example looks like:
+\begin{lstlisting}
+gbsn@EUC@ GB-EUC-H gbsn00lp
+\end{lstlisting}
+where TFMs \code{gbsn00}, \code{gbsn01}, \code{gbsn02}... are mapped into a
+single font named \code{gbsn00lp} via the rule described in the SFD file
+\code{EUC}.
+
+\subsubsection{TrueType Collection Index}
+
+TrueType Collection index number can be specified with \code{:n:}
+in front of the TrueType font name:
+\begin{lstlisting}
+min10 H :1:mincho
+\end{lstlisting}
+In this example, the option \code{:1:} tells \dvipdfmx\ to select first
+TrueType font from the TTC font \code{mincho.ttc}. Alternatively, the
+\option{-i} option can be used in the option field to specify TTC index:
+\begin{lstlisting}
+min10 H mincho -i 1
+\end{lstlisting}
+
+\subsubsection{Non-embedding Switch}
+
+\deprecated{Use of this option is deprecated.}
+\noindent{}The character \option{!} in front of the font name can be used to
+indicate that the font shall not be embedded. This feature greatly reduces the
+size of the final PDF output, but the PDF file may not be viewed exactly the same
+in other systems on which appropriate fonts are not installed.
+\bigskip
+
+\noindent{}NOTE: \dvipdfmx\ always converts input encodings to CIDs and then
+uses Identity CMaps\footnote{Predefined CMaps \code{Identity-H} and
+\code{Identity-V} for the identity mapping.}
+in the output PDF. However, \lnum{ISO~32000-1:2008} describes as
+\begin{quoting}
+The Identity-H and Identity-V CMaps shall not be used with a non-embedded font.
+Only standardized character sets may be used.
+\end{quoting}
+which had never appeared in Adobe's PDF References. This makes all PDF files
+generated by \dvipdfmx\ with non-embedded CID-keyed fonts non-compliant to
+the ISO standards.
+
+\subsubsection{`Standard' CJK Fonts}
+
+\deprecated{This feature is deprecated.}
+\noindent{}Use of this feature shall be avoided for new documents. It is
+described here since it might still be useful for some situations.
+
+\dvipdfmx\ recognizes several `Standard' CJK fonts although there are no such
+notion in PDF. In older days where there were not so many freely available CJK
+fonts, it was sometimes useful to create PDF files without embedding fonts and
+let PDF viewers or printers to use substitute fonts (tend to be higher quality)
+installed in their systems. \dvipdfmx\ `knows' several fonts which might be
+available in PostScript printers and PDF applications such as Acrobat Reader,
+and uses them without actually having it.
+See, Table~\ref{TABLE:StdCJKFont}, for the list of available `Standard' CJK
+fonts.
+
+\begin{table}
+ \centering
+ \begin{tabular}{lll}\hline
+ Character Collection & Font Family & Description \\ \hline\hline
+ Adobe-Japan1 & Ryumin-Light & PS printers \\
+ & GothicBBB-Medium & \\
+ Adobe-CNS1 & MHei-Medium-Acro & Acrobat Reader 4 \\
+ & MSung-Light-Acro & \\
+ Adobe-GB1 & STSong-Light-Acro & \\
+ & STHeiti-Regular-Acro & \\
+ Adobe-Japan1 & HeiseiMin-W3-Acro & \\
+ & HeiseiKakuGO-W5-Acro & \\
+ Adobe-Korea1 & HYGoThic-Medium-Acro & \\
+ & HYSMyeongJo-Medium-Acro & \\
+ Adobe-CNS1 & MSungStd-Light-Acro & Acrobat Reader 5 \\
+ Adobe-GB1 & STSongStd-Light-Acro & \\
+ Adobe-Korea1 & HYSMyeongJoStd-Medium-Acro \\
+ Adobe-CNS1 & AdobeMingStd-Light-Acro & Adobe Reader 6 \\
+ Adobe-GB1 & AdobeSongStd-Light-Acro & \\
+ Adobe-Japan1 & KozMinPro-Regular-Acro & \\
+ & KozGoPro-Medium-Acro & \\
+ Adobe-Korea1 & AdobeMyungjoStd-Medium-Acro & \\
+ Adobe-CNS1 & AdobeHeitiStd-Regular & Adobe Reader 7 \\
+ Adobe-Japan1 & KozMinProVI-Regular & Adobe Reader 8\\
+ \hline
+ \end{tabular}
+ \caption{List of available `Standard' CJK font. Most of them are
+ available as a part of Adobe Asian Font Packs for each versions of
+ Adobe or Acrobat Reader.}\label{TABLE:StdCJKFont}
+\end{table}
+
+Only fixed-pitch glyphs (i.e., quarter, third, half, and full widths) are
+supported for those fonts.
+
+\subsubsection{Stylistic Variants}
+
+\deprecated{Use of this option is deprecated.}
+\noindent{}Keywords \code{,Bold}, \code{,Italic}, and \code{,BoldItalic} can be
+used to create synthetic bold, italic, and bolditalic style variants from other
+font using PDF viewer's (or OS's) function.
+\begin{lstlisting}
+jbtmo@UKS@ UniKSCms-UCS2-H :0:!batang,Italic
+\end{lstlisting}
+
+Availability of this feature highly depends on the implementation of PDF
+viewers. This feature is usually not supported for embedded fonts.
+Notice that this option automatically disables font embedding thus
+use of it is deprecated.
+
+\subsection{Specifying Unicode Plane}
+
+As there are no existing TFM formats supporting 3-byte or 4-byte character
+encodings, the only way to use Unicode characters other than the BMP is to
+map the code range 0-65535 to different planes via (e.g., to plane 1)
+the \option{-p 1} fontmap option. This option is
+available only when \code{unicode} is specified in the encoding field.
+
+\subsection{OpenType Layout Feature}
+
+The OpenType Layout Feature fontmap options mentioned below are only meaningful
+when \code{unicode} is specified in the encoding field.
+
+With the \option{-w} option, writing mode can be specified.
+\option{-w 1} denotes the font is for vertical writing. It automatically
+enables an OpenType Layout Feature related to vertical writing, namely,
+\code{vert} or \code{vrt2}, to choose proper glyphs for vertical text.
+
+\newfeature{Addition in \TeX\ Live 2017.}
+
+The \option{-l} (lower case el) option can be used to enable various
+OpenType Layout GSUB Features. For example, \option{-l jp04} enables
+\code{jp04} feature to select \lnum{JIS2004} forms for Kanjis.
+Features can be specified as a ``:'' separated list of OpenType Layout
+Feature tags like \option{-l vkna:jp04}. Script and language may be
+additionally specified as
+\option{-l kana.JAN.ruby}.
+
+An example can be
+\begin{lstlisting}
+uprml-v unicode SourceHanSerifJP-Light.otf -w 1 -l jp90
+\end{lstlisting}
+which declares that font should be treated as for vertical writing and
+use \lnum{JIS1990} form for Kanjis.
+
+\begin{figure}
+\centering
+\jpzerofourexamples\hspace{30pt}\jpninezeroexamples%
+\caption{\lnum{JIS2004} vs. \lnum{JIS1990} form.}\label{FIG:jp90}
+\end{figure}
+
+This feature is limited to the single substitution, there are no way to select
+a glyph from multiple candidates, such as in the \code{aalt} feature, and specifying
+general many-to-many glyph substitutions does not take effect.
+
+\section{Other Improvements}
+
+This section briefly describes other improvements made for \dvipdfmx.
+There is an extension to glyph name handling in the \code{enc} file for
+seamless support of both PostScript Type1 and TrueType fonts.
+PostScript Type1 font support is enhanced although this format might be
+considered obsolete.
+
+\subsection{Extended Glyph Name Syntax}
+
+\dvipdfmx\ accepts the following syntax for glyph names in the \code{enc} file:
+\code{uni0130}, \code{zero.onum} and \code{T\_h.liga}.
+Each represents a glyph accessed with Unicode value \code{U+0130},
+oldstyle number for zero and ``Th'' ligature accessed via the OpenType
+Layout GSUB Feature \code{onum} and \code{liga}, respectively.
+Note that \dvipdfmx\ does not understand glyph names which directly
+use a glyph index such as \code{index0102} or \code{gid2104}.
+
+When \dvipdfmx\ encounters a glyph name, e.g., \code{T\_h.liga}, it first looks
+for OpenType \code{post} table if such glyph name exists; if it exists, then
+\dvipdfmx\ simply uses \code{post} table and maps the glyph name to the glyph index;
+if not, \dvipdfmx\ tries to convert \code{T\_h} to a Unicode sequence (U+0054
+U+0068 in this example) via the AGL mapping; then, OpenType \code{cmap} table is used
+to further convert the resulting Unicode sequence to the sequence of glyph indices;
+finally, the OpenType Layout Feature \code{liga} is applied to get the desired glyph.
+
+A glyph name of a form \code{a.swsh2} can be specified to denote the 2nd swash
+variant form of the letter `a'.
+
+\subsection{CFF Conversion}
+
+\dvipdfmx\ supports on-the-fly PostScript Type1 to CFF (Type1C) conversion
+which greatly reduces size of the resulting PDF file when using Type1 fonts.
+Conversion is essentially `lossless' and there should not be any quality loss.
+However, due to differences in the ability of rasterizers, there might be
+noticeable differences on rendering result.
+
+When an older Type1 font is used, \dvipdfmx\ may give the following warning
+message:
+\begin{lstlisting}
+Obsolete four arguments of "endchar" will be used for Type1
+"seac" operator.
+\end{lstlisting}
+It happens when there is an accented character made as a composite glyph using
+the ``seac'' operator.
+This warning is issued as conversion can't be done without relying on the
+\emph{deprecated} usage of the \code{endchar} operator. However, as mentioned in
+``Appendix C Compatibility and Deprecated Operators'' of Adobe Technical
+Note \#5177,
+``\href{http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5177.Type2.pdf}{Type 2 Charstring Format}'',
+PDF applications should support this operator and hence this warning
+message can be ignored.
+
+Use of Type1 font should be avoided as much as possible.
+Please consider using OpenType version instead.
+
+\section{Font Licensing}
+
+In OpenType font format, information regarding how a font should be treated
+when creating a document can be recorded.%
+\footnote{See,
+``\href{http://www.microsoft.com/typography/otspec/os2.htm}{OpenType Specification:
+OS/2 -- OS/2 and Windows Metrics Table}''}.
+\dvipdfmx\ uses this information to decide whether font embedding is permitted.
+
+This font licensing information is indicated by the flag called \code{fsType}
+recorded in OpenType font files; each bits representing different restrictions on
+font embedding. If multiple flag bits are set in \code{fsType}, the least restrictive
+license granted takes precedence in \dvipdfmx.
+The \code{fsType} flag bit recognized by \dvipdfmx\ is as follows:
+\begin{itemize}
+ \item Installable embedding
+ \item Editable embedding
+ \item Embedding for Preview \& Print only
+\end{itemize}
+\dvipdfmx\ issues the following warning message for fonts with `Preview \& Print only'
+setting:
+\begin{verbatim}
+ This document contains 'Preview & Print' only licensed font
+\end{verbatim}
+
+For a font with this type of licensing, font embedding is allowed solely for the
+purpose of (on-screen) viewing and/or printing; further editing of the document
+or extracting embedded font data for other purposes are not allowed.
+One way to ensure this condition is to protect your document with a non-empty
+password.
+
+All other flags are treated as more restrictive license than any of
+the above flags and treated as ``No embedding allowed''; e.g., if both
+of the editable-embedding flag and unrecognized license flag is set,
+the font is treated as editable-embedding allowed, however, if only
+unrecognized flags are set, the font is not embedded.
+
+Font Embedding flags are preserved in the embedded font if they are embedded
+as a TrueType font or a CIDFontType2 CID-keyed font.
+For all fonts embedded as a PostScript font (Type1C and CIDFontType0
+CID-keyed font), they are not preserved.
+Only \code{Copyright} and \code{Notice} in the \keyword{FontInfo} dictionary
+are preserved in this case.
+
+Some font vendors put different embedding restrictions for different
+condition; e.g., font embedding might not be permitted for the commercial
+use unless you acquire the ``commercial license'' separately.
+Please read EULA carefully before making decision on the font usage.
+
+See, for example,
+\href{http://www.adobe.com/products/type/font-licensing/font-embedding-permissions.html}{Adobe's site on font embedding permissions}
+for the font in the Adobe Type Library.
+Microsoft also has a
+\href{http://www.microsoft.com/typography/RedistributionFAQ.mspx}{FAQ page on Font Redistribution}.
+
+For Japanese font in general, embedding permission tend to be somewhat
+restrictive. Japanese users should read the statement regarding font
+embedding from Japan Typography Association (in Japanese):\medskip
+
+\url{http://www.typography.or.jp/act/morals/moral4.html}
+\medskip
+
+\dvipdfmx\ does not support full embedding. Only subset embedding is supported.
+
+\chapter{Encryption}
+
+\section{Encryption Support}\label{SEC:encryption}
+
+\dvipdfmx\ offers basic PDF password security support including the 256-bit AES encryption.
+Only the ``Standard'' security handler is supported and the Public-key security handler is not
+supported.
+
+Encryption is enabled by \option{-S} command line option.
+\begin{lstlisting}
+ dvipdfmx -S -K 128 -P 0x14
+\end{lstlisting}
+where \code{-K} and \code{-P} options are used to specify encryption key length and
+permission flags respectively, and are briefly explained in Table~\ref{TABLE:enc-options}.
+
+\begin{table}
+ \centering
+ \begin{tabular}{lp{8cm}}\hline
+ Option & Description \\ \hline\hline
+ \code{-S} & Enable PDF encryption. \\
+ \code{-K} \textit{number} & Set encryption key length. The default value
+ is 40.\\
+ \code{-P} \textit{number} & Set permission flags for PDF encryption.
+ The \textit{number} is a 32-bit unsigned integer representing permission
+ flags.
+ See, Table~\ref{TABLE:flags}. The default value is \code{0x003C}.\\
+ \hline
+ \end{tabular}
+ \caption{Command line options for encryption.}%
+ \label{TABLE:enc-options}
+\end{table}
+
+When \dvipdfmx\ is invoked with encryption via the \code{-S} option,
+passwords will be asked.
+However, in some circumstances, it might be desirable to avoid being prompted for
+passwords. In that case, use the \code{pdf:encrypt} special to supply passwords in
+the \TeX\ file, as,
+\begin{lstlisting}
+ \special{pdf:encrypt userpw (foo) ownerpw (bar) length 128 perm 20}
+\end{lstlisting}
+Here, user and owner passwords are supplied as PDF string objects (\code{foo} and \code{bar}
+in the example above) which can be empty.
+
+Up to two passwords can be specified for a document -- an owner password and a user password.
+If a user attempts to open an encrypted document with user password being set, PDF application
+should prompt for a password. Users are allowed to access the contents of the document only when
+either password is correctly supplied.
+Depending on which password (user or owner) was supplied, additional operations
+allowed for the opened document is determined; full access for users who opened
+with the correct owner password or additional operations
+controlled by permission flags for users who opened with the correct user password.
+
+Although PDF specification allows various character encodings other than \code{US-ASCII}
+for entering password, \dvipdfmx\ is unable to handle it properly.
+Thus it must be assumed that \code{US-ASCII} is used for password strings.
+
+Access permission flags can be specified via \option{-P} command-line option.
+Each bits of (32-bit unsigned) integer number given to this option represents user
+access permissions; e.g., bit position 3 for allowing ``print'', 4 for
+``modify'', 5 for ``copy or extract'', and so on. See, Table~\ref{TABLE:flags}.
+For example, \code{-P 0x34} allows printing, copying and extraction of text, and adding and
+modifying text annotation and filling in interactive form fields (but disallows
+modification of the contents of the document).
+\begin{table}
+ \centering
+ \begin{tabular}{lp{8.3cm}}\hline
+ Bit Position & Meaning \\ \hline\hline
+ 3 & (Revision 2) Print the document. \\
+ & (Revision 3 or greater) Print the document. Print quality depending on bit 12.\\
+ 4 & Modify the contents of the document by operations other than those controlled
+ by bits 6, 9, and 11. \\
+ 5 & Copy or extract text and graphics from the document. \\
+ 6 & Add or modify text annotations, fill in interactive form fields.
+ Creation and modification of interactive form field is also
+ allowed if bit 4 is set.\\
+ 9 & (Revision 3 or greater) Fill in existing interactive form fields
+ (including signature fields), even if bit 6 is clear.\\
+ 10 & \em{Deprecated in PDF 2.0} \\
+ & (Revision 3 or greater) Extract text and graphics (in support of accessibility to
+ users with disabilities or for other purposes).\\
+ 11 & (Revision 3 or greater) Assemble the document
+ (insert, rotate, or delete pages and create document outline items or thumbnail
+ images), even if bit 4 is clear.\\
+ 12 & (Revision 3 or greater) High-quality printing.
+ When this bit is clear (and bit 3 is set), printing shall be limited to a low-level,
+ possibly of degraded quality.\\
+ \hline
+ \end{tabular}
+ \caption{Flag bits and their short explanation.
+ Revision 2 is used when encryption key length is 40 bits or when PDF output
+ version is less than 1.5. Otherwise, Revision 3 or greater is used.}\label{TABLE:flags}
+\end{table}
+
+The \option{-K} option can be used to specify the encryption key length.
+The key length must be multiple of 8 in the range 40 to 128, or 256 (for PDF
+version 1.7 plus Adobe Extension or PDF version 2.0). Please note
+that when key length 256 is specified for PDF version 1.7 output, it requires
+Adobe's Extension to \lnum{PDF-1.7} and hence PDF applications may not support it.
+PDF version 1.4 is required for key length more than 40 bits. AES encryption algorithm requires
+PDF version 1.6.
+
+To show some examples:\\
+128-bit AES encryption with print-only (high-quality) setting,
+\begin{lstlisting}
+ dvipdfmx -V 5 -S -K 128 -P 0x804 input.dvi
+\end{lstlisting}
+256-bit AES encryption with print (low-quality), adding and modifying text annotations
+allowed,
+\begin{lstlisting}
+ dvipdfmx -V 2.0 -S -K 256 -P 0x24 input.dvi
+\end{lstlisting}
+
+The default value for \option{-K} is 40 and for \option{-P} is \code{0x003C0}
+(all bits from bit-position 3 to 6 set).
+
+\chapter{Compatibility}
+
+\section{Incompatible Changes}\label{SEC:compatibility}
+
+There are various minor incompatible changes to \dvipdfm.
+
+The \option{-C} command line option may be used for compatibility to
+\dvipdfm\ or older versions of \dvipdfmx. The \option{-C} option takes flags
+meaning
+\begin{itemize}
+ \item bit position 2: Use semi-transparent filling for tpic shading
+ command, instead of opaque gray color. (requires PDF 1.4)
+ \item bit position 3: Treat all CID-keyed font as fixed-pitch font. This is
+ only for compatibility.
+ \item bit position 4: Do not replace duplicate fontmap entries.
+ \dvipdfm\ behavior.
+ \item bit position 5: Do not optimize PDF destinations. Use this if you
+ want to refer from other files to destinations in the current file.
+ \item bit position 6: Do not use predictor filter for Flate compression.
+ \item bit position 7: Do not use object stream.
+\end{itemize}
+
+The remap option \option{-r} in fontmaps is no longer supported and is
+silently ignored. The command line option \option{-e} to disable partial
+(subset) font embedding is not supported.
+
+\section{Important Changes}
+
+Here is a list of important changes since the \TeX\ Live 2016 release:
+\begin{itemize}
+\item Changes to make PDF/A creation easier: Always write CIDSet and CharSet
+for embedded fonts. Do not compress XMP metadata.
+\item Merge from libdpx for p\TeX-ng by Clerk Ma.
+\item Addition of \code{STHeiti-Regular-Acro} for CJK `Standard' fonts.
+\item Command line option \option{-p} takes precedence over \code{papersize}
+and \code{pagesize} specials.
+\item Fixed serious bugs in supporting `\code{unicode}' encoding:
+OpenType Layout Feature \code{vert} and \code{vrt2} was not enabled.
+Support for format 2 CFF charsets was broken.
+\item Added simplified version of OpenType Layout support: The `\option{-l}'
+option in fontmaps.
+\end{itemize}
+The full \code{ChangeLog} entries can be viewed via the web interface of the
+\TeX\ Live SVN repository:
+\medskip
+
+\url{http://www.tug.org/svn/texlive/trunk/Build/source/texk/dvipdfm-x}
+\medskip
+
+There was an undocumented feature for supporting OpenType Layout but it was
+dropped. Simplified support for the OpenType Layout was introduced instead.
+
+
+%\renewcommand{\refname}{Further Reading}
+\renewcommand{\bibname}{Further Reading}
+\begin{thebibliography}{99}
+\bibitem{DVIPDFM} ``\href{http://mirrors.ctan.org/dviware/dvipdfm/dvipdfm.pdf}%
+{Dvipdfm User's Manual}'' written by Mark~A.~Wicks.
+\bibitem{ADOBE} Adobe's PDF References and a free copy of
+\lnum{ISO 32000-1:2008} standard are available from
+``\href{http://www.adobe.com/devnet/pdf.html}{PDF Technology Center}''
+on \href{http://www.adobe.com/devnet.html}{Adobe Developer Connection}.
+\bibitem{MICROSOFT} The OpenType Specification is available from Microsoft's
+site:
+``\href{http://www.microsoft.com/en-us/Typography/OpenTypeSpecification.aspx}%
+{OpenType Specification}''.
+\bibitem{PNGSPEC} ``\href{https://www.w3.org/TR/2003/REC-PNG-20031110/}%
+{Portable Network Graphics (PNG) Specification (Second Edition)}''.
+\bibitem{CHOF} An article regarding DVI specials: Jin-Hwan Cho,
+``\href{http://www.tug.org/TUGboat/tb30-1/tb94cho.pdf}{DVI specials for PDF generation}'',
+TUGboat, 30(1):6-11, 2009.
+\end{thebibliography}
+
+\appendix
+
+\chapter{GNU Free Documentation License}\label{SEC:FDL}
+
+This document is distributed under the term of the GNU Free Documentation
+License. See, the attached file for copying conditions.%
+\marginnote{%
+\special{pdf:fstream @fileobj (fdl-1.3.txt)}%
+\special{pdf:ann width 10bp height 20bp
+ << /Type /Annot
+ /Subtype /FileAttachment
+ /FS <<
+ /Type /Filespec
+ /F (fdl-1.3.txt)
+ /EF << /F @fileobj >>
+ >>
+ /Name /PushPin
+ /C [0.8 0.2 0.2]
+ /T (GNU Free Documentation License)
+ /Subj (GNU FDL)
+ /Contents (Plain text version of the GNU Free Documentation License.)
+ >>
+}}%
+
+Or, in case that PDF viewers can not extract attached files, please visit the
+following site:
+\medskip
+
+\url{http://www.gnu.org/licenses/fdl.html}
+
+
+\end{document}
diff --git a/systems/doc/dvipdfmx/fdl-1.3.txt b/systems/doc/dvipdfmx/fdl-1.3.txt
new file mode 100644
index 0000000000..2f7e03ca51
--- /dev/null
+++ b/systems/doc/dvipdfmx/fdl-1.3.txt
@@ -0,0 +1,451 @@
+
+ GNU Free Documentation License
+ Version 1.3, 3 November 2008
+
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The "publisher" means any person or entity that distributes copies of
+the Document to the public.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no
+other conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to
+give them a chance to provide you with an updated version of the
+Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other
+documents released under this License, and replace the individual
+copies of this License in the various documents with a single copy
+that is included in the collection, provided that you follow the rules
+of this License for verbatim copying of each of the documents in all
+other respects.
+
+You may extract a single document from such a collection, and
+distribute it individually under this License, provided you insert a
+copy of this License into the extracted document, and follow this
+License in all other respects regarding verbatim copying of that
+document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions of the
+GNU Free Documentation License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+11. RELICENSING
+
+"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+"Massive Multiauthor Collaboration" (or "MMC") contained in the site
+means any set of copyrightable works thus published on the MMC site.
+
+"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+"Incorporate" means to publish or republish a Document, in whole or in
+part, as part of another Document.
+
+An MMC is "eligible for relicensing" if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole or
+in part into the MMC, (1) had no cover texts or invariant sections, and
+(2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/systems/doc/dvipdfmx/tug2003-slides.pdf b/systems/doc/dvipdfmx/tug2003-slides.pdf
new file mode 100644
index 0000000000..ce1536a718
--- /dev/null
+++ b/systems/doc/dvipdfmx/tug2003-slides.pdf
Binary files differ
diff --git a/systems/doc/dvipdfmx/tug2005.pdf b/systems/doc/dvipdfmx/tug2005.pdf
new file mode 100644
index 0000000000..b82a445b0f
--- /dev/null
+++ b/systems/doc/dvipdfmx/tug2005.pdf
Binary files differ
diff --git a/systems/doc/dvipng/dvipng.html b/systems/doc/dvipng/dvipng.html
new file mode 100644
index 0000000000..5125d4c479
--- /dev/null
+++ b/systems/doc/dvipng/dvipng.html
@@ -0,0 +1,1523 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Created by GNU Texinfo 6.6, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>A DVI-to-PNG translator</title>
+
+<meta name="description" content="A DVI-to-PNG translator">
+<meta name="keywords" content="A DVI-to-PNG translator">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<link href="#Top" rel="start" title="Top">
+<link href="#Index" rel="index" title="Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="http://tug.org/texinfohtml" rel="up" title="(dir)">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">A DVI-to-PNG translator</h1>
+
+
+
+
+
+
+
+<span id="SEC_Contents"></span>
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Introduction-1" href="#Introduction">1 Introduction</a></li>
+ <li><a id="toc-Installation-1" href="#Installation">2 Installation</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Prerequisites-1" href="#Prerequisites">2.1 Prerequisites</a></li>
+ <li><a id="toc-Configure-1" href="#Configure">2.2 Configure</a></li>
+ <li><a id="toc-Build_002finstall-1" href="#Build_002finstall">2.3 Build/install</a></li>
+ <li><a id="toc-Installation-outside-the-texmf-tree-1" href="#Installation-outside-the-texmf-tree">2.4 Installation outside the texmf tree</a></li>
+ <li><a id="toc-Installation-for-non_002dprivileged-users" href="#Advice-for-non_002dprivileged-users">2.5 Installation for non-privileged users</a></li>
+ </ul></li>
+ <li><a id="toc-Basic-usage-of-dvipng" href="#Basic-usage">3 Basic usage of dvipng</a></li>
+ <li><a id="toc-Command_002dline-options-1" href="#Command_002dline-options">4 Command-line options</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Option-summary-1" href="#Option-summary">4.1 Option summary</a></li>
+ <li><a id="toc-Option-details-1" href="#Option-details">4.2 Option details</a></li>
+ </ul></li>
+ <li><a id="toc-Graphics-1" href="#Graphics">5 Graphics</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Encapsulated-PostScript-1" href="#Encapsulated-PostScript">5.1 Encapsulated PostScript</a></li>
+ <li><a id="toc-Bitmapped-graphics-1" href="#Bitmapped-graphics">5.2 Bitmapped graphics</a></li>
+ <li><a id="toc-Raw-PostScript-1" href="#Raw-PostScript">5.3 Raw PostScript</a></li>
+ </ul></li>
+ <li><a id="toc-Color-1" href="#Color">6 Color</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Color-specifications-1" href="#Color-specifications">6.1 Color specifications</a></li>
+ <li><a id="toc-Color-specials-1" href="#Color-specials">6.2 Color specials</a></li>
+ </ul></li>
+ <li><a id="toc-Diagnosing-problems-1" href="#Diagnosing-problems">7 Diagnosing problems</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Contact-information-1" href="#Contact-information">7.1 Contact information</a></li>
+ <li><a id="toc-Debug-options-1" href="#Debug-options">7.2 Debug options</a></li>
+ </ul></li>
+ <li><a id="toc-Credits-1" href="#Credits">8 Credits</a></li>
+ <li><a id="toc-Copying-1" href="#Copying">9 Copying</a></li>
+ <li><a id="toc-Index-1" href="#Index">Index</a></li>
+</ul>
+</div>
+
+
+<span id="Top"></span><div class="header">
+<p>
+Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Up: <a href="http://tug.org/texinfohtml" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="dvipng"></span><h1 class="top">dvipng</h1>
+
+<p>This manual documents dvipng, a program to translate a DVI (DeVice
+Independent) file into PNG (Portable Network Graphics).
+</p>
+<p>This file documents dvipng version 1.16
+</p>
+<p>Corrections or perhaps rewrites of sections are <em>very welcome</em>.
+</p>
+<p>Jan-&Aring;ke Larsson
+</p>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Introduction" accesskey="1">Introduction</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Introduction
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Installation" accesskey="2">Installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How to compile and install dvipng
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Basic-usage" accesskey="3">Basic usage</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">First things first
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Command_002dline-options" accesskey="4">Command-line options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Advanced usage
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Graphics" accesskey="5">Graphics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Including PostScript and/or bitmaps
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color" accesskey="6">Color</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using color with dvipng
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Diagnosing-problems" accesskey="7">Diagnosing problems</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Problems?
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Credits" accesskey="8">Credits</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">People who have contributed
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Copying" accesskey="9">Copying</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">GNU Lesser General Public License
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index">Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General index
+</td></tr>
+</table>
+
+
+
+<hr>
+<span id="Introduction"></span><div class="header">
+<p>
+Next: <a href="#Installation" accesskey="n" rel="next">Installation</a>, Previous: <a href="#Top" accesskey="p" rel="prev">Top</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-1"></span><h2 class="chapter">1 Introduction</h2>
+
+
+
+
+<p>This program makes PNG and/or GIF graphics from DVI files as obtained
+from TeX and its relatives.
+</p>
+<p>If GIF support is enabled, GIF output is chosen by using the
+&lsquo;<samp>dvigif</samp>&rsquo; binary or with the &lsquo;<samp>--gif</samp>&rsquo; option.
+</p>
+
+<p>It is intended to produce anti-aliased screen-resolution images as fast
+as is possible. The target audience is people who need to generate and
+regenerate many images again and again. The primary target is the
+preview-latex (X)Emacs package, a package to preview formulas from
+within (X)Emacs. Yes, you get to see your formulas in the (X)Emacs
+buffer, see <a href="http://www.gnu.org/software/auctex/preview-latex.html">http://www.gnu.org/software/auctex/preview-latex.html</a>.
+</p>
+<p>Another example is WeBWorK, an internet-based method for delivering
+homework problems to students over the internet, giving students
+instant feedback as to whether or not their answers are correct, see
+<a href="http://webwork.math.rochester.edu">http://webwork.math.rochester.edu</a>.
+</p>
+<p>A more recent addition to the dvipng-using applications out there is
+MediaWiki, the software behind Wikipedia and many other wikis out
+there. Dvipng is used to render mathematical formulae from version
+1.8.0 of MediaWiki, see <a href="http://www.mediawiki.org">http://www.mediawiki.org</a>.
+</p>
+<p>Other applications may also benefit, like web applications as latex2html
+and WYSIWYG editors like LyX.
+</p>
+
+<p>The benefits of &lsquo;<samp>dvipng</samp>&rsquo;/&lsquo;<samp>dvigif</samp>&rsquo; include
+</p>
+<ul>
+<li> Speed. It is a very fast bitmap-rendering code for DVI files, which
+makes it suitable for generating large amounts of images on-the-fly,
+as needed in preview-latex, WeBWorK and others.
+
+</li><li> It does not read the postamble, so it can be started before TeX
+finishes. There is a &lsquo;<samp>--follow</samp>&rsquo; switch that makes dvipng wait at
+end-of-file for further output, unless it finds the POST marker that
+indicates the end of the DVI.
+
+</li><li> Interactive query of options. dvipng can read options interactively
+through stdin, and all options are usable. It is even possible to change
+the input file through this interface.
+
+</li><li> Supports PK, VF, PostScript Type1, and TrueType fonts, subfonts (i.e.,
+as used in CJK-LaTeX), color specials, and inclusion of PostScript,
+PNG, JPEG or GIF images.
+
+</li><li> and more...
+
+</li></ul>
+
+
+<hr>
+<span id="Installation"></span><div class="header">
+<p>
+Next: <a href="#Basic-usage" accesskey="n" rel="next">Basic usage</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Installation-1"></span><h2 class="chapter">2 Installation</h2>
+
+<span id="index-configuration_002c-of-dvipng"></span>
+<span id="index-compilation"></span>
+<span id="index-installation_002c-of-dvipng"></span>
+
+
+
+<p>Installing dvipng should be simple: merely <code>./configure</code>,
+<code>make</code>, and <code>make install</code>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Prerequisites" accesskey="1">Prerequisites</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Configure" accesskey="2">Configure</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Build_002finstall" accesskey="3">Build/install</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Installation-outside-the-texmf-tree" accesskey="4">Installation outside the texmf tree</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Advice-for-non_002dprivileged-users" accesskey="5">Advice for non-privileged users</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr>
+<span id="Prerequisites"></span><div class="header">
+<p>
+Next: <a href="#Configure" accesskey="n" rel="next">Configure</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Prerequisites-1"></span><h3 class="section">2.1 Prerequisites</h3>
+
+<ul>
+<li> The GD Graphics Draw library, libgd
+
+<p>The drawing library &lsquo;<samp>libgd</samp>&rsquo; is necessary, and is downloadable at
+<a href="https://bitbucket.org/libgd/gd-libgd/downloads">https://bitbucket.org/libgd/gd-libgd/downloads</a>, and there are
+binary packages for most operating systems from their respective
+distributors. In any case, the library installs using &lsquo;<samp>autoconf</samp>&rsquo; so
+it should not be difficult for you to install it from source, and then
+proceed with installing dvipng.
+</p>
+</li><li> The path-searching library kpathsea
+
+<p>Kpathsea is most likely included in your LaTeX installation, but it
+may happen that ./configure does not find it; see below. If you do not
+have it, download it from <a href="http://www.ctan.org">http://www.ctan.org</a> and compile it.
+I have no experience with this, so I cannot help much here.
+</p>
+</li><li> The font-rendering library FreeType 2
+
+<p>While not strictly necessary, a recent FreeType 2 is recommended since
+dvipng currently will produce better-quality images when this library is
+available. To take advantage of this, you should have at least FreeType
+2.1.9.
+</p>
+<p>FreeType 2 will enable direct support for PostScript and TrueType fonts,
+so that dvipng will not need to generate bitmapped variants on disk of
+the TeX fonts since modern TeX distributions include PostScript
+versions of them. Then, you can render images at different (and unusual)
+resolutions without cluttering the disk with lots of bitmapped fonts.
+</p>
+<p>Finally, it will enable subfont support in dvipng. That is, if you want
+to render CJK-LaTeX characters, you must have FreeType 2 installed.
+</p>
+</li><li> libpng and libz
+
+<p>To be able to compress and write PNG files to disk, dvipng (or really
+libgd) uses libpng which in turn uses libz. These should be available on
+any modern system, if not, download them and install them.
+</p>
+</li><li> The <code>texinfo</code> package
+
+<p>This is needed for building the documentation.
+</p></li></ul>
+
+<hr>
+<span id="Configure"></span><div class="header">
+<p>
+Next: <a href="#Build_002finstall" accesskey="n" rel="next">Build/install</a>, Previous: <a href="#Prerequisites" accesskey="p" rel="prev">Prerequisites</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Configure-1"></span><h3 class="section">2.2 Configure</h3>
+
+<p>The first step is to configure the source code, telling it where
+various files will be. To do so, run
+</p>
+<div class="example">
+<pre class="example">./configure <var>options</var>
+</pre></div>
+
+<p>(Note: if you have fetched dvipng from CVS rather than a regular
+release, you will have to first generate <samp>./configure</samp> by running
+<code>autoconf</code> 2.53 or later.)
+</p>
+<p>On many machines, you will not need to specify any options, but if
+<code>configure</code> cannot determine something on its own, you&rsquo;ll need to
+help it out. For a list of the options type
+</p>
+<div class="example">
+<pre class="example">./configure --help
+</pre></div>
+
+<p>On some machines, the libraries will be installed in directories that
+are not in the linker&rsquo;s search path. This will generate an error when
+running <samp>./configure</samp>, indicating that it cannot find libgd or
+libkpathsea (most likely). You then need to specify the path to the
+respective library&rsquo;s object files. They are typically called e.g.,
+<samp>libgd.a</samp> or <samp>libgd.so</samp>. If they are located in e.g.,
+<samp>/sw/local/lib</samp>, do
+</p>
+<div class="example">
+<pre class="example">./configure LDFLAGS=-L/sw/local/lib
+</pre></div>
+
+<p>If the library is available as a shared object file (<samp>.so</samp>), the
+runtime linker may also need to be told where to find the library,
+then use
+</p>
+<div class="example">
+<pre class="example">./configure LDFLAGS='-L/sw/local/lib -R/sw/local/lib'
+</pre></div>
+
+<p>When either of these is necessary, it is likely that the C header
+files are also installed in directories that are not in the C
+preprocessor&rsquo;s search path. This will also generate an error when
+running <samp>./configure</samp>, indicating that it cannot find e.g.,
+<samp>gd.h</samp> or <samp>kpathsea.h</samp> (most likely). You then need to
+specify the path to the respective library&rsquo;s C header files. If they
+are located in e.g., <samp>/sw/local/include</samp>, do
+</p>
+<div class="example">
+<pre class="example">./configure CPPFLAGS=-I/sw/local/include
+</pre></div>
+
+<p>On my SUN Solaris workstation, I had to combine this into
+</p>
+<div class="example">
+<pre class="example">./configure CPPFLAGS='-I/sw/local/include -I/sw/tex/teTeX/1.0/include'\
+ LDFLAGS='-L/sw/local/lib -R/sw/local/lib -L/sw/tex/teTeX/1.0/lib/'
+</pre></div>
+
+<p>where the backslash denotes a continuation of the line.
+</p>
+<hr>
+<span id="Build_002finstall"></span><div class="header">
+<p>
+Next: <a href="#Installation-outside-the-texmf-tree" accesskey="n" rel="next">Installation outside the texmf tree</a>, Previous: <a href="#Configure" accesskey="p" rel="prev">Configure</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Build_002finstall-1"></span><h3 class="section">2.3 Build/install</h3>
+
+<p>Once <samp>configure</samp> has been run, simply enter
+</p>
+<div class="example">
+<pre class="example">make
+</pre></div>
+
+<p>at the prompt to compile the C code, and build the documentation files.
+To install the files into the locations chosen earlier, type
+</p>
+<div class="example">
+<pre class="example">make install
+</pre></div>
+
+<p>You may need special privileges to install, e.g., if you are installing
+into system directories.
+</p>
+<hr>
+<span id="Installation-outside-the-texmf-tree"></span><div class="header">
+<p>
+Next: <a href="#Advice-for-non_002dprivileged-users" accesskey="n" rel="next">Advice for non-privileged users</a>, Previous: <a href="#Build_002finstall" accesskey="p" rel="prev">Build/install</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Installation-outside-the-texmf-tree-1"></span><h3 class="section">2.4 Installation outside the texmf tree</h3>
+
+<p>In some cases, a dvipng binary installed outside the texmf tree will
+not be able to find virtual fonts, or the PostScript font maps
+(normally used by dvips). This may be because <em>only</em>
+$SELFAUTOLOC, $SELFAUTODIR, and $SELFAUTOPARENT are used in the texmf
+tree configuration file &lsquo;<samp>texmf.cnf</samp>&rsquo;. If so, give the switch
+&lsquo;<samp>--enable-selfauto-set</samp>&rsquo; to &lsquo;<samp>./configure</samp>&rsquo;. This will make
+dvipng adjust these three internally so that kpathsea thinks that
+dvipng <em>is</em> installed in the texmf tree.
+</p>
+<hr>
+<span id="Advice-for-non_002dprivileged-users"></span><div class="header">
+<p>
+Previous: <a href="#Installation-outside-the-texmf-tree" accesskey="p" rel="prev">Installation outside the texmf tree</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Installation-for-non_002dprivileged-users"></span><h3 class="section">2.5 Installation for non-privileged users</h3>
+
+<p>Often people without system administration privileges want to install
+software for their private use. In that case you need to specify more
+options to the <samp>configure</samp> script, usually this is done by using
+the &lsquo;<samp>--prefix</samp>&rsquo; option to the <samp>configure</samp> script, and let it
+point to the personal home directory. In that way, resulting binaries
+will be installed under the <samp>bin</samp> subdirectory of your home
+directory, manual pages under <samp>man</samp> and so on. That way, it is
+reasonably easy to maintain a bunch of additional packages, since the
+prefix argument is supported by most <samp>configure</samp> scripts.
+</p>
+<p>You&rsquo;ll have to add something like <samp>/home/myself/bin</samp> to your
+<code>PATH</code> shell variable, if it isn&rsquo;t there already, and similarly
+set the <code>INFOPATH</code> and <code>MANPATH</code> variables to be able to
+access the documentation.
+</p>
+
+<hr>
+<span id="Basic-usage"></span><div class="header">
+<p>
+Next: <a href="#Command_002dline-options" accesskey="n" rel="next">Command-line options</a>, Previous: <a href="#Installation" accesskey="p" rel="prev">Installation</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Basic-usage-of-dvipng"></span><h2 class="chapter">3 Basic usage of dvipng</h2>
+
+<span id="index-invoking-dvipng"></span>
+
+<p>To use dvipng at its simplest, simply type
+</p>
+<div class="example">
+<pre class="example">dvipng foo
+</pre></div>
+
+<p>where <samp>foo.dvi</samp> is the output of TeX that you want to convert to
+PNG format. If there are four pages in <samp>foo.dvi</samp>, those pages will
+be output as <samp>foo1.png</samp>, <samp>foo2.png</samp>, <samp>foo3.png</samp>, and
+<samp>foo4.png</samp>, respectively.
+</p>
+<p>If you have enabled the PostScript font support (via FreeType),
+fonts will be rendered as they are needed. Otherwise, dvipng will use
+bitmapped (PK) fonts, and if you use PK fonts that have not been used on
+your system before, they may be automatically generated; this process
+can take a few minutes, so progress reports appear by default. The next
+time the same font is used, it will have been saved on disk, so
+rendering will go much faster. (If dvipng tries to endlessly generate
+the same fonts over and over again, something is wrong. See <a href="https://tug.org/texinfohtml/kpathsea.html#Unable-to-generate-fonts">Unable to
+generate fonts</a> in <cite>Kpathsea</cite>.)
+</p>
+<p>Many options are available (see the next section). For a brief summary
+of available options, just type
+</p>
+<div class="example">
+<pre class="example">dvipng --help
+</pre></div>
+
+<hr>
+<span id="Command_002dline-options"></span><div class="header">
+<p>
+Next: <a href="#Graphics" accesskey="n" rel="next">Graphics</a>, Previous: <a href="#Basic-usage" accesskey="p" rel="prev">Basic usage</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Command_002dline-options-1"></span><h2 class="chapter">4 Command-line options</h2>
+
+<span id="index-command_002dline-options"></span>
+<span id="index-options_002c-dvipng"></span>
+
+<p>dvipng has a plethora of command line options. Reading through this
+section will give a good idea of the capabilities of the driver.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Option-summary" accesskey="1">Option summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Quick listing, from dvipng &ndash;help.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Option-details" accesskey="2">Option details</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">More information about each option.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Option-summary"></span><div class="header">
+<p>
+Next: <a href="#Option-details" accesskey="n" rel="next">Option details</a>, Up: <a href="#Command_002dline-options" accesskey="u" rel="up">Command-line options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Option-summary-1"></span><h3 class="section">4.1 Option summary</h3>
+
+<span id="index-options_002c-summary"></span>
+<p>Here is a handy summary of the options; it is printed out when you run
+dvipng with no arguments or with the standard &lsquo;<samp>--help</samp>&rsquo; option.
+</p>
+<div class="example">
+<pre class="example">This is ./dvipng 1.16 Copyright 2002-2015, 2019 Jan-Ake Larsson
+
+Usage: ./dvipng [OPTION]... FILENAME[.dvi]
+Options are chosen to be similar to dvips' options where possible:
+ -d # Debug (# is the debug bitmap, 1 if not given)
+ -D # Output resolution
+ -l # Last page to be output
+ -o f Output file, '%d' is pagenumber
+ -O c Image offset
+ -p # First page to be output
+ -pp #,#.. Page list to be output
+ -q* Quiet operation
+ -T c Image size (also accepts '-T bbox' and '-T tight')
+ -v* Verbose operation
+ - Interactive query of options
+
+These do not correspond to dvips options:
+ -bd # Transparent border width in dots
+ -bd s Transparent border fallback color (TeX-style color)
+ -bg s Background color (TeX-style color or 'Transparent')
+ --depth* Output the image depth on stdout
+ --dvinum* Use TeX page numbers in output filenames
+ -fg s Foreground color (TeX-style color)
+ --follow* Wait for data at end-of-file
+ --freetype* FreeType font rendering (preferred, default on)
+ --gamma # Control color interpolation
+ --gif Output GIF images (dvigif default)
+ --height* Output the image height on stdout
+ --nogs* Don't use ghostscript for PostScript specials
+ --nogssafer* Don't use -dSAFER in ghostscript calls
+ --norawps* Don't convert raw PostScript specials
+ --palette* Force palette output
+ --picky When a warning occurs, don't output image
+ --png Output PNG images (dvipng default)
+ --strict When a warning occurs, exit
+ --truecolor* Truecolor output
+ -Q # Quality (PK subsampling)
+ --width* Output the image width on stdout
+ -z # PNG compression level
+
+ # = number f = file s = string * = suffix, '0' to turn off
+ c = comma-separated dimension pair (e.g., 3.2in,-32.1cm)
+
+</pre></div>
+
+
+<hr>
+<span id="Option-details"></span><div class="header">
+<p>
+Previous: <a href="#Option-summary" accesskey="p" rel="prev">Option summary</a>, Up: <a href="#Command_002dline-options" accesskey="u" rel="up">Command-line options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Option-details-1"></span><h3 class="section">4.2 Option details</h3>
+
+<span id="index-option_002c-details-of"></span>
+
+<p>Many of the parameterless options listed here can be turned off by
+suffixing the option with a zero (&lsquo;<samp>0</samp>&rsquo;); for instance, to turn off
+page reversal, use &lsquo;<samp>-r0</samp>&rsquo;. Such options are marked with a trailing
+&lsquo;<samp>*</samp>&rsquo;.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>-</samp>&rsquo;</dt>
+<dd><span id="index-options_002c-reading-from-standard-input"></span>
+<span id="index-standard-input_002c-reading-options-from"></span>
+<p>Read additional options from standard input after processing the command
+line.
+</p>
+</dd>
+<dt>&lsquo;<samp>--help</samp>&rsquo;</dt>
+<dd><p>Print a usage message and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp>--version</samp>&rsquo;</dt>
+<dd><p>Print the version number and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp>-bd <var>num</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp>-bd <var>color_spec</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp>-bd '<var>num</var> <var>color_spec</var>'</samp>&rsquo;</dt>
+<dd><span id="index-transparent-border-width"></span>
+<span id="index-transparent-border-fallback-color"></span>
+<p>Set the pixel width of the transparent border (default 0). Using this
+option will make the image edges transparent, but it only affects pixels
+with the background color. Giving a <var>color_spec</var> will set the
+fallback color, to be used in viewers that cannot handle transparency
+(the default is the background color). The color spec should be in
+TeX color \special syntax, e.g., &rsquo;rgb 1.0 0.0 0.0&rsquo;. Setting the
+fallback color makes the default border width 1 px. See <a href="#Color">Color</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--bdpi <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-base-resolution_002c-setting"></span>
+<p>This option only has an effect when using bitmapped (PK) fonts. The
+option sets the base (Metafont) resolution, both horizontal and
+vertical, to <var>num</var> dpi (dots per inch). This option is necessary
+when manually selecting Metafont mode with the &ndash;mode option (see
+below).
+</p>
+</dd>
+<dt>&lsquo;<samp>-bg <var>color_spec</var></samp>&rsquo;</dt>
+<dd><span id="index-background-color-_0028option_0029"></span>
+<p>Choose background color for the images. This option will be ignored if
+there is a background color \special in the DVI. The color spec should
+be in TeX color \special syntax, e.g., &rsquo;rgb 1.0 0.0 0.0&rsquo;. You can
+also specify &rsquo;Transparent&rsquo; or &rsquo;transparent&rsquo; which will give you a
+transparent background with the normal background as a fallback color. A
+capitalized &rsquo;Transparent&rsquo; will give a full-alpha transparency, while an
+all-lowercase &rsquo;transparent&rsquo; will give a simple fully transparent
+background with non-transparent antialiased pixels. The latter would be
+suitable for viewers who cannot cope with a true alpha channel. GIF
+images do not support full alpha transparency, so in case of GIF output,
+both variants will use the latter behaviour. See <a href="#Color">Color</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-d <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-debugging"></span>
+<p>Set the debug flags, showing what dvipng (thinks it) is doing. This will
+work unless dvipng has been compiled without the <code>DEBUG</code> option
+(not recommended). Set the flags as you need them, use &lsquo;<samp>-d -1</samp>&rsquo; as
+the first option for maximum output. See <a href="#Debug-options">Debug options</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-D <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-output-resolution_002c-setting"></span>
+<p>Set the output resolution, both horizontal and vertical, to <var>num</var>
+dpi (dots per inch).
+</p>
+<p>One may want to adjust this to fit a certain text font size (e.g., on
+a web page), and for a text font height of <var>font_px</var> pixels (in
+Mozilla) the correct formula is
+</p><div class="example">
+<pre class="example"><var>dpi</var> = <var>font_px</var> * 72.27 / 10 [px * TeXpt/in / TeXpt]
+</pre></div>
+<p>The last division by ten is due to the standard font height 10pt in
+your document, if you use 12pt, divide by 12. Unfortunately, some
+proprietary browsers have font height in pt (points), not pixels. You
+have to rescale that to pixels, using the screen resolution (default
+is usually 96 dpi) which means the formula is
+</p><div class="example">
+<pre class="example"><var>font_px</var> = <var>font_pt</var> * 96 / 72 [pt * px/in / (pt/in)]
+</pre></div>
+<p>On some high-res screens, the value is instead 120 dpi. Good luck!
+</p>
+</dd>
+<dt>&lsquo;<samp>--depth*</samp>&rsquo;</dt>
+<dd><span id="index-baseline-reporting"></span>
+<span id="index-depth-reporting"></span>
+<p>Report the depth of the image. This only works reliably when the
+LaTeX style <samp>preview.sty</samp> from preview-latex is used with
+the &lsquo;<samp>active</samp>&rsquo; option. It reports the number of pixels from the
+bottom of the image to the baseline of the image. This can be used for
+vertical positioning of the image in, e.g., web documents, where one
+would use (Cascading StyleSheets 1)
+</p><div class="example">
+<pre class="example">&lt;IMG SRC=&quot;<var>filename.png</var>&quot; STYLE=&quot;vertical-align: -<var>depth</var>px&quot;&gt;
+</pre></div>
+<p>The depth is a negative offset in this case, so the minus sign is
+necessary, and the unit is pixels (px).
+</p>
+</dd>
+<dt>&lsquo;<samp>--dvinum*</samp>&rsquo;</dt>
+<dd><p>Set this option to make the output page number be the TeX page
+numbers rather than the physical page number. See the &lsquo;<samp>-o</samp>&rsquo; switch.
+</p>
+
+</dd>
+<dt>&lsquo;<samp>-fg <var>color_spec</var></samp>&rsquo;</dt>
+<dd><span id="index-foreground-color-_0028option_0029"></span>
+<p>Choose foreground color for the images. This option will be ignored if
+there is a foreground color \special in the DVI. The color spec should
+be in TeX color \special syntax, e.g., &rsquo;rgb 1.0 0.0 0.0&rsquo;.
+See <a href="#Color">Color</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--follow*</samp>&rsquo;</dt>
+<dd><span id="index-follow-mode"></span>
+<p>Wait for data at end-of-file. One of the benefits of dvipng is that it
+does not read the postamble, so it can be started before TeX
+finishes. This switch makes dvipng wait at end-of-file for further
+output, unless it finds the POST marker that indicates the end of the
+DVI. This is similar to &lsquo;<samp>tail -f</samp>&rsquo; but for DVI-to-PNG conversion.
+</p>
+</dd>
+<dt>&lsquo;<samp>--freetype*</samp>&rsquo;</dt>
+<dd><span id="index-FreeType-font-rendering"></span>
+<p>Enable/disable FreeType font rendering (default on). This option is
+available if the FreeType2 font library was present at compilation time.
+If this is the case, dvipng will have direct support for PostScript
+Type1 and TrueType fonts internally, rather than using &lsquo;<samp>gsftopk</samp>&rsquo;
+for rendering the fonts. If you have PostScript versions of Computer
+Modern installed, there will be no need to generate bitmapped (PK)
+variants on disk of these. Then, you can render images at different (and
+unusual) resolutions without cluttering the disk with lots of bitmapped
+fonts.
+One reason to disable FreeType font rendering would be to generate
+identical output on different platforms, since FreeType uses the native
+renderer and therefore can give slightly different output on each platform.
+</p>
+</dd>
+<dt>&lsquo;<samp>--gamma <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-gamma"></span>
+<span id="index-dark-fonts"></span>
+<span id="index-light-fonts"></span>
+<span id="index-fuzzy-images"></span>
+<p>Control the interpolation of colors in the greyscale anti-aliasing
+color palette. Default value is 1.0. For 0 &lt; <var>num</var> &lt; 1, the
+fonts will be lighter (more like the background), and for <var>num</var> &gt;
+1, the fonts will be darker (more like the foreground).
+</p>
+</dd>
+<dt>&lsquo;<samp>--gif*</samp>&rsquo;</dt>
+<dd><span id="index-GIF-image-format"></span>
+<p>The images are output in the GIF format, if GIF support is enabled.
+This is the default for the &lsquo;<samp>dvigif</samp>&rsquo; binary, which only will be
+available when GIF support is enabled. GIF images are palette images
+(see the &lsquo;<samp>--palette</samp>&rsquo; option) and does not support true alpha
+channels (see the &lsquo;<samp>--bg</samp>&rsquo; option). See also the &lsquo;<samp>--png</samp>&rsquo;
+option.
+</p>
+</dd>
+<dt>&lsquo;<samp>--height*</samp>&rsquo;</dt>
+<dd><span id="index-baseline-reporting-1"></span>
+<span id="index-height-reporting"></span>
+<p>Report the height of the image. This only works reliably when the
+LaTeX style <samp>preview.sty</samp> from preview-latex is used with
+the &lsquo;<samp>active</samp>&rsquo; option. It reports the number of pixels from the top
+of the image to the baseline of the image. The total height of the
+image is obtained as the sum of the values reported from
+&lsquo;<samp>--height</samp>&rsquo; and &lsquo;<samp>--depth</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-l [=]<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-last-page-printed"></span>
+<span id="index-page_002c-last-printed"></span>
+<span id="index-physical-page-number_002c-and-_002dl"></span>
+<span id="index-absolute-page-number_002c-and-_002dl"></span>
+<p>The last page printed will be the first one numbered <var>num</var>. Default
+is the last page in the document. If <var>num</var> is prefixed by an equals
+sign, then it (and the argument to the &lsquo;<samp>-p</samp>&rsquo; option, if specified)
+is treated as a physical (absolute) page number, rather than a value to
+compare with the TeX &lsquo;<samp>\count0</samp>&rsquo; values stored in the DVI file.
+Thus, using &lsquo;<samp>-l =9</samp>&rsquo; will end with the ninth page of the document,
+no matter what the pages are actually numbered.
+</p>
+</dd>
+<dt>&lsquo;<samp>--mode <var>mode</var></samp>&rsquo;</dt>
+<dd><span id="index-mode-name_002c-specifying"></span>
+<span id="index-Metafont-mode_002c-specifying"></span>
+<p>This option only has an effect when using bitmapped (PK) fonts. Use
+<var>mode</var> as the Metafont device name for the PK fonts (both for path
+searching and font generation). This needs to be augmented with the base
+device resolution, given with the &lsquo;<samp>--bdpi</samp>&rsquo; option. See the file
+<a href="ftp://ftp.tug.org/tex/modes.mf">ftp://ftp.tug.org/tex/modes.mf</a> for a list of resolutions and mode
+names for most devices. See <a href="https://tug.org/texinfohtml/kpathsea.html#Unable-to-generate-fonts">Unable to generate fonts</a> in <cite>Kpathsea</cite>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-M*</samp>&rsquo;</dt>
+<dd><span id="index-font-generation_002c-avoiding"></span>
+<span id="index-mktexpk_002c-avoiding"></span>
+<p>This option only has an effect when using bitmapped (PK) fonts. It turns
+off automatic PK font generation (<samp>mktexpk</samp>).
+</p>
+</dd>
+<dt>&lsquo;<samp>--nogs*</samp>&rsquo;</dt>
+<dd><span id="index-GhostScript_002c-turning-off"></span>
+<p>This switch prohibits the internal call to GhostScript for displaying
+PostScript specials. &lsquo;<samp>--nogs0</samp>&rsquo; turns the call back on.
+</p>
+</dd>
+<dt>&lsquo;<samp>--nogssafer*</samp>&rsquo;</dt>
+<dd><span id="index-GhostScript-and-_002ddSAFER"></span>
+<span id="index-_002ddSAFER"></span>
+<p>Normally, if GhostScript is used to render PostScript specials, the
+GhostScript interpreter is run with the option &lsquo;<samp>-dSAFER</samp>&rsquo;. The
+&lsquo;<samp>--nogssafer</samp>&rsquo; option runs GhostScript without &lsquo;<samp>-dSAFER</samp>&rsquo;. The
+&lsquo;<samp>-dSAFER</samp>&rsquo; option in Ghostscript disables PostScript operators such
+as deletefile, to prevent possibly malicious PostScript programs from
+having any effect.
+</p>
+</dd>
+<dt>&lsquo;<samp>--norawps*</samp>&rsquo;</dt>
+<dd><span id="index-PostScript_002c-turning-off-raw-PostScript-specials"></span>
+<p>Some packages generate raw PostScript specials, even non-rendering such
+specials. This switch turns off the internal call to GhostScript
+intended to display these raw PostScript specials. &lsquo;<samp>--norawps0</samp>&rsquo;
+turns the call back on.
+</p>
+</dd>
+<dt>&lsquo;<samp>-o <var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-output_002c-redirecting"></span>
+<span id="index-standard-output_002c-output-to"></span>
+<p>Send output to the file <var>name</var>. A single occurrence of &lsquo;<samp>%d</samp>&rsquo; or
+&lsquo;<samp>%01d</samp>&rsquo;, &hellip;, &lsquo;<samp>%09d</samp>&rsquo; will be exchanged for the physical
+page number (this can be changed, see the &lsquo;<samp>--dvinum</samp>&rsquo; switch). The
+default output filename is &lsquo;<samp><var>file</var>%d.png</samp>&rsquo; where the input DVI
+file was &lsquo;<samp><var>file</var>.dvi</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-O <var>x-offset</var>,<var>y-offset</var></samp>&rsquo;</dt>
+<dd><span id="index-offset-pages"></span>
+<p>Move the origin by <var>x-offset</var>,<var>y-offset</var>, a comma-separated
+pair of dimensions such as &lsquo;<samp>.1in,-.3cm</samp>&rsquo;.
+The origin of the page is shifted from the default position
+(of one inch down, one inch to the right from the upper left corner of
+the paper) by this amount.
+</p>
+</dd>
+<dt>&lsquo;<samp>-p [=]<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-first-page-printed"></span>
+<span id="index-page_002c-first-printed"></span>
+<span id="index-physical-page-number_002c-and-_002dp"></span>
+<span id="index-absolute-page-number_002c-and-_002dp"></span>
+<p>The first page printed will be the first one numbered <var>num</var>. Default
+is the first page in the document. If <var>num</var> is prefixed by an
+equals sign, then it (and the argument to the &lsquo;<samp>-l</samp>&rsquo; option, if
+specified) is treated as a physical (absolute) page number, rather than
+a value to compare with the TeX &lsquo;<samp>\count0</samp>&rsquo; values stored in the
+DVI file. Thus, using &lsquo;<samp>-p =3</samp>&rsquo; will start with the third page of
+the document, no matter what the pages are actually numbered.
+</p>
+</dd>
+<dt>&lsquo;<samp>--palette*</samp>&rsquo;</dt>
+<dd><span id="index-forcing-palette-output"></span>
+<p>When an external image is included, &lsquo;<samp>dvipng</samp>&rsquo; will automatically
+switch to truecolor mode, to avoid unnecessary delay and quality
+reduction, and enable the EPS translator to draw on a transparent
+background and outside of the boundingbox. This switch will force
+palette (256-color) output and make &lsquo;<samp>dvipng</samp>&rsquo; revert to opaque
+clipped image inclusion. This will also override the &lsquo;<samp>--truecolor</samp>&rsquo;
+switch if present.
+</p>
+</dd>
+<dt>&lsquo;<samp>--picky*</samp>&rsquo;</dt>
+<dd><span id="index-no-erroneous-images"></span>
+<p>No images are output when a warning occurs. Normally, dvipng will
+output an image in spite of a warning, but there may be something
+missing in this image. One reason to use this option would be if you
+have a more complete but slower fallback converter. Mainly, this is
+useful for failed figure inclusion and unknown \special occurrences,
+but warnings will also occur for missing or unknown color specs and
+missing PK fonts.
+</p>
+</dd>
+<dt>&lsquo;<samp>--png*</samp>&rsquo;</dt>
+<dd><span id="index-PNG-image-format"></span>
+<p>The images are output in the PNG format. This is the default for the
+&lsquo;<samp>dvipng</samp>&rsquo; binary. See also the &lsquo;<samp>--gif</samp>&rsquo; option.
+</p>
+</dd>
+<dt>&lsquo;<samp>-pp <var>firstpage</var>-<var>lastpage</var></samp>&rsquo;</dt>
+<dd><span id="index-page-range"></span>
+<p>Print pages <var>firstpage</var> through <var>lastpage</var>; but not quite
+equivalent to &lsquo;<samp>-p <var>firstpage</var> -l <var>lastpage</var></samp>&rsquo;. For example,
+when rendering a book, there may be several instances of a page in the
+DVI file (one in <code>\frontmatter</code>, one in <code>\mainmatter</code>, and one
+in <code>\backmatter</code>). In case of several pages matching, &lsquo;<samp>-pp
+<var>firstpage</var>-<var>lastpage</var></samp>&rsquo; will render <em>all</em> pages that
+matches the specified range, while &lsquo;<samp>-p <var>firstpage</var> -l
+<var>lastpage</var></samp>&rsquo; will render the pages from the <em>first</em> occurrence
+of <var>firstpage</var> to the <em>first</em> occurrence of <var>lastpage</var>.
+This is the (undocumented) behaviour of dvips. In dvipng you can give
+both kinds of options, in which case you get all pages that matches the
+range in &lsquo;<samp>-pp</samp>&rsquo; between the pages from &lsquo;<samp>-p</samp>&rsquo; to &lsquo;<samp>-l</samp>&rsquo;. Also
+multiple &lsquo;<samp>-pp</samp>&rsquo; options accumulate, unlike &lsquo;<samp>-p</samp>&rsquo; and &lsquo;<samp>-l</samp>&rsquo;.
+The &lsquo;<samp>-</samp>&rsquo; separator can also be &lsquo;<samp>:</samp>&rsquo;. Note that &lsquo;<samp>-pp -1</samp>&rsquo;
+will be interpreted as &quot;all pages up to and including 1&quot;, if you want a
+page numbered -1 (only the table of contents, say) put &lsquo;<samp>-pp -1--1</samp>&rsquo;,
+or more readable, &lsquo;<samp>-pp -1:-1</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-q*</samp>&rsquo;</dt>
+<dd><span id="index-quiet-operation"></span>
+<span id="index-silent-operation"></span>
+<span id="index-warnings_002c-suppressing"></span>
+<p>Run quietly. Don&rsquo;t chatter about pages converted, etc. to standard
+output; report no warnings (only errors) to standard error.
+</p>
+</dd>
+<dt>&lsquo;<samp>-Q <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-antialiasing-levels_002c-number-of"></span>
+<span id="index-quality"></span>
+<p>Set the quality to <var>num</var>. That is, choose the number of antialiasing
+levels for bitmapped fonts (PK), to be
+<var>num</var>*<var>num</var>+1. The default value is 4 which gives 17 levels of
+antialiasing for antialiased fonts from these two. If FreeType is
+available, its rendering is unaffected by this option.
+</p>
+</dd>
+<dt>&lsquo;<samp>-r*</samp>&rsquo;</dt>
+<dd><span id="index-reverse-pagination"></span>
+<p>Toggle output of pages in reverse/forward order. By default, the first
+page in the DVI is output first.
+</p>
+
+</dd>
+<dt>&lsquo;<samp>--strict*</samp>&rsquo;</dt>
+<dd><span id="index-exit-on-erroneous-images"></span>
+<p>The program exits when a warning occurs. Normally, dvipng will output
+an image in spite of a warning, but there may be something missing in
+this image. One reason to use this option would be if you have a more
+complete but slower fallback converter. See the &lsquo;<samp>--picky</samp>&rsquo; option
+above for a list of when warnings occur.
+</p>
+</dd>
+<dt>&lsquo;<samp>-T <var>image_size</var></samp>&rsquo;</dt>
+<dd><p>Set the image size to <var>image_size</var> which can be either of
+&lsquo;<samp>bbox</samp>&rsquo;, &lsquo;<samp>tight</samp>&rsquo;, or a comma-separated pair of dimensions
+<var>hsize</var>,<var>vsize</var> such as &lsquo;<samp>.1in,.3cm</samp>&rsquo;. The default is
+&lsquo;<samp>bbox</samp>&rsquo; which produces a PNG that includes all ink put on the page
+and in addition the DVI origin, located 1in from the top and 1in from
+the left edge of the paper. This usually gives whitespace above and to
+the left in the produced image. The value &lsquo;<samp>tight</samp>&rsquo; will make dvipng
+only include all ink put on the page, producing neat images.
+</p>
+</dd>
+<dt>&lsquo;<samp>--truecolor*</samp>&rsquo;</dt>
+<dd><span id="index-truecolor-output"></span>
+<p>This will make &lsquo;<samp>dvipng</samp>&rsquo; generate truecolor output. Note that
+truecolor output is automatic if you include an external image in your
+DVI, e.g., via a PostScript special (i.e., the &lsquo;<samp>graphics</samp>&rsquo; or
+&lsquo;<samp>graphicx</samp>&rsquo; package). This switch is overridden by the
+&lsquo;<samp>--palette</samp>&rsquo; switch.
+</p>
+</dd>
+<dt>&lsquo;<samp>-v*</samp>&rsquo;</dt>
+<dd><p>Enable verbose operation. This will currently indicate what fonts is
+used, in addition to the usual output.
+</p>
+</dd>
+<dt>&lsquo;<samp>--width*</samp>&rsquo;</dt>
+<dd><span id="index-width-reporting"></span>
+<p>Report the width of the image. See also &lsquo;<samp>--height</samp>&rsquo; and
+&lsquo;<samp>--depth</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-x <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-magnification_002c-overriding-DVI"></span>
+<p>This option is deprecated; it should not be used. It is much better to
+select the output resolution directly with the &lsquo;<samp>-D</samp>&rsquo; option. This
+option sets the magnification ratio to <em><var>num</var>/1000</em> and
+overrides the magnification specified in the DVI file. Must be between
+10 and 100000. It is recommended that you use standard magstep values
+(1095, 1200, 1440, 1728, 2074, 2488, 2986, and so on) to help reduce the
+total number of PK files generated. <var>num</var> may be a real number, not
+an integer, for increased precision.
+</p>
+</dd>
+<dt>&lsquo;<samp>-z <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-compression"></span>
+<p>Set the PNG compression level to <var>num</var>. This option is enabled if
+your &lsquo;<samp>libgd</samp>&rsquo; is new enough. The default compression level is 1,
+which selects maximum speed at the price of slightly larger PNGs. For an
+older &lsquo;<samp>libgd</samp>&rsquo;, the hard-soldered value 5 is used. The include file
+&lsquo;<samp>png.h</samp>&rsquo; says
+</p><blockquote>
+<p>Currently, valid values range from 0 - 9, corresponding directly to the
+zlib compression levels 0 - 9 (0 - no compression, 9 - &quot;maximal&quot;
+compression). Note that tests have shown that zlib compression levels
+3-6 usually perform as well as level 9 for PNG images, and do
+considerably fewer calculations. In the future, these values may not
+correspond directly to the zlib compression levels.
+</p></blockquote>
+</dd>
+</dl>
+
+<hr>
+<span id="Graphics"></span><div class="header">
+<p>
+Next: <a href="#Color" accesskey="n" rel="next">Color</a>, Previous: <a href="#Command_002dline-options" accesskey="p" rel="prev">Command-line options</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Graphics-1"></span><h2 class="chapter">5 Graphics</h2>
+
+<p>&lsquo;<samp>dvipng</samp>&rsquo; attempts to handle graphics as included by the
+&lsquo;<samp>graphicx</samp>&rsquo; and &lsquo;<samp>graphics</samp>&rsquo; packages, without the need of
+specifying a driver to these packages. This means that it recognizes
+the encapsulated postscript inclusion meant for &lsquo;<samp>dvips</samp>&rsquo;, but is
+also able (from version 1.8) to include bitmapped graphics. It also
+tries to handle some of the raw PostScript that is output from various
+packages. Some of the possibilities and problems are mentioned below.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Encapsulated-PostScript" accesskey="1">Encapsulated PostScript</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">An internal call to GhostScript
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Bitmapped-graphics" accesskey="2">Bitmapped graphics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">PNG, JPEG and GIF
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Raw-PostScript" accesskey="3">Raw PostScript</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Ignore or give to GhostScript
+</td></tr>
+</table>
+
+<hr>
+<span id="Encapsulated-PostScript"></span><div class="header">
+<p>
+Next: <a href="#Bitmapped-graphics" accesskey="n" rel="next">Bitmapped graphics</a>, Up: <a href="#Graphics" accesskey="u" rel="up">Graphics</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Encapsulated-PostScript-1"></span><h3 class="section">5.1 Encapsulated PostScript</h3>
+
+<p>When an EPS file is included, a call to GhostScript is performed to
+produce a bitmapped image that can be included. The default is to
+produce an image with transparent background, at the same size as the
+DVI page currently being converted to PNG, and include that as
+foreground on the PNG. Of course, if the image is to be cropped, that
+is done. The included image will be a truecolor image, so for maximum
+performance the output PNG will be in truecolor mode as well.
+</p>
+<p>This conversion needs the &lsquo;<samp>pngalpha</samp>&rsquo; output device to be present
+in your copy of GhostScript. If that device is not present, or you use
+the &lsquo;<samp>--palette</samp>&rsquo; switch or request GIF output, the fallback is to
+use the &lsquo;<samp>png16m</samp>&rsquo; device to produce a cropped opaque image for
+inclusion. Other relevant switches are &lsquo;<samp>--noghostscript</samp>&rsquo; and
+&lsquo;<samp>--nogssafer</samp>&rsquo;. See <a href="#Option-details">Option details</a>.
+</p>
+<span id="index-PostScript-inclusion-problems"></span>
+<p>The most common problem with including graphics is an incorrect
+bounding box. Complain to whoever wrote the software that generated
+the file if the bounding box is indeed incorrect. An adjusted
+boundingbox can be specified in the &lsquo;<samp>\includegraphics</samp>&rsquo; call, as
+in this example (using &lsquo;<samp>graphicx</samp>&rsquo;):
+</p>
+<div class="example">
+<pre class="example">\includegraphics[bb=10 20 100 200]{imagename.eps}
+</pre></div>
+
+
+<hr>
+<span id="Bitmapped-graphics"></span><div class="header">
+<p>
+Next: <a href="#Raw-PostScript" accesskey="n" rel="next">Raw PostScript</a>, Previous: <a href="#Encapsulated-PostScript" accesskey="p" rel="prev">Encapsulated PostScript</a>, Up: <a href="#Graphics" accesskey="u" rel="up">Graphics</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Bitmapped-graphics-1"></span><h3 class="section">5.2 Bitmapped graphics</h3>
+
+<p>dvipng can include PNG, JPEG and GIF graphics. When including such
+images via &lsquo;<samp>\includegraphics</samp>&rsquo; you need to specify the bounding
+box since TeX itself cannot read them from the files in question.
+The bounding box size should be given as &lsquo;<samp>0 0 w h</samp>&rsquo; in pixels,
+e.g., if the file &lsquo;<samp>imagename.png</samp>&rsquo; is 300x400 pixels, the
+inclusion would read
+</p>
+<div class="example">
+<pre class="example">\includegraphics[bb=0 0 300 400]{imagename.png}
+</pre></div>
+
+<p>The default size is the image size in bp (&ldquo;big points&rdquo; in TeX
+nomenclature or PostScript points as other people have it, 72 per inch).
+That is, default resolution will be 72 dpi for included bitmaps, which
+is the default size in the few other bitmap-capable drivers that are
+known to me (dvipdfm and PDFLaTeX).
+</p>
+<p>If you want 100 dpi you need to specify the width accordingly. You
+just divide your image width by 100: a 135 pixel wide image at 100 dpi
+will take up 1.35 inches. If you want 200 dpi you divide by 200, and
+so on. Simple, eh? The example above at 200 dpi would be 1.5 inches
+wide:
+</p>
+<div class="example">
+<pre class="example">\includegraphics[bb=0 0 300 400,witdh=1.5in]{imagename.png}
+</pre></div>
+
+<hr>
+<span id="Raw-PostScript"></span><div class="header">
+<p>
+Previous: <a href="#Bitmapped-graphics" accesskey="p" rel="prev">Bitmapped graphics</a>, Up: <a href="#Graphics" accesskey="u" rel="up">Graphics</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Raw-PostScript-1"></span><h3 class="section">5.3 Raw PostScript</h3>
+
+<p>dvipng attempts to handle raw PostScript. Rendering raw PostScript
+specials is done on top of the page by including a transparent image
+generated by the &lsquo;<samp>pngalpha</samp>&rsquo; device in GhostScript (automatically
+selecting &lsquo;<samp>truecolor</samp>&rsquo; mode in dvipng).
+</p>
+<p>Included PostScript headers are respected, and if the header
+&lsquo;<samp>tex.pro</samp>&rsquo; is included, dvipng also throws in &lsquo;<samp>color.pro</samp>&rsquo; and
+&lsquo;<samp>special.pro</samp>&rsquo;. The package &lsquo;<samp>xcolor</samp>&rsquo; includes its own headers
+with color names, and this is not only kept as a PostScript header, but
+is also read and interpreted by dvipng itself. An attempt is also made
+to respect the PGF header. The non-rendering specials from
+&lsquo;<samp>hyperref</samp>&rsquo; are handled via some heuristics and do not give an
+error.
+</p>
+<p>Really rendering and moving things with raw PostScript specials is more
+troublesome. The \rotatebox macro serves as a good example. The dvips
+driver of the graphicx package surrounds DVI glyphs with PostScript code
+so that after conversion by dvips, the glyphs (now themselves in
+PostScript) will be rotated in the desired way. dvipng does not handle
+this, at present. An attempt has been made to handle the rendering
+specials output by PGF (tikz), and also PSTricks. Some things work, but
+others do not. This is especially clear when mixing PostScript and DVI
+rendering commands such as glyphs. dvipng cannot at present detect if
+PostScript code moves &lsquo;<samp>currentpoint</samp>&rsquo; or rotates the frame since
+GhostScript does not return such information. A recommendation would be
+to produce images from these packages as EPS files and include them into
+your document in the standard manner.
+</p>
+<p>Another way to handle this would be to use a slower fallback (with dvips
+and gs, for example). If you want to disable raw PostScript handling in
+dvipng, use the switch &lsquo;<samp>--norawps</samp>&rsquo;. This switch turns off the
+internal call to GhostScript intended to display these raw PostScript
+specials. Further, when dvipng encounters raw PostScript and the gs call
+is turned off, it gives a warning. It is now possible to use the switch
+&lsquo;<samp>--picky</samp>&rsquo; to disable page rendering of pages with warnings, and use
+the slower fallback for these pages.
+</p>
+<hr>
+<span id="Color"></span><div class="header">
+<p>
+Next: <a href="#Diagnosing-problems" accesskey="n" rel="next">Diagnosing problems</a>, Previous: <a href="#Graphics" accesskey="p" rel="prev">Graphics</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-1"></span><h2 class="chapter">6 Color</h2>
+
+<p>To support color, dvipng recognizes a certain set of specials as
+generated by the &lsquo;<samp>color</samp>&rsquo; and &lsquo;<samp>xcolor</samp>&rsquo; style files. These
+specials start with the keyword &lsquo;<samp>color</samp>&rsquo; or the keyword
+&lsquo;<samp>background</samp>&rsquo;, followed by a color specification.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Color-specifications" accesskey="1">Color specifications</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color-specials" accesskey="2">Color specials</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Color-specifications"></span><div class="header">
+<p>
+Next: <a href="#Color-specials" accesskey="n" rel="next">Color specials</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-specifications-1"></span><h3 class="section">6.1 Color specifications</h3>
+
+<span id="index-color-specifications"></span>
+
+<p>The color specification supported by dvipng is by-value or by-name. The
+by-value spec starts with the name of a color model (one of &lsquo;<samp>rgb</samp>&rsquo;,
+&lsquo;<samp>hsb</samp>&rsquo;, &lsquo;<samp>cmy</samp>&rsquo;, &lsquo;<samp>cmyk</samp>&rsquo;, or &lsquo;<samp>gray</samp>&rsquo;) followed by the
+appropriate number of parameters. Thus, the color specification
+&lsquo;<samp>rgb 0.3 0.4 0.5</samp>&rsquo; would correspond to the color that is &lsquo;<samp>0.3
+0.4 0.5</samp>&rsquo; in its red, blue and green values. The color model used
+internally in dvipng is &lsquo;<samp>RGB</samp>&rsquo; (discretized to 256 levels), for
+details on the formulas used in conversion, see the &lsquo;<samp>xcolor</samp>&rsquo;
+documentation.
+</p>
+<p>By-name color specifications are single (case-dependent) words and are
+compared with color names defined in &lsquo;<samp>dvipsnam.def</samp>&rsquo; (from the
+&lsquo;<samp>graphics</samp>&rsquo; bundle), &lsquo;<samp>svgnam.def</samp>&rsquo; and &lsquo;<samp>xcolor.sty</samp>&rsquo; (from
+the &lsquo;<samp>xcolor</samp>&rsquo; bundle). See the &lsquo;<samp>xcolor</samp>&rsquo; documentation for a
+list of names and the corresponding colors.
+</p>
+<p>On the command-line, the name &lsquo;<samp>Transparent</samp>&rsquo; can also be used as
+an argument to &lsquo;<samp>--bg</samp>&rsquo; to choose transparent background.
+See <a href="#Option-details">Option details</a>.
+</p>
+<hr>
+<span id="Color-specials"></span><div class="header">
+<p>
+Previous: <a href="#Color-specifications" accesskey="p" rel="prev">Color specifications</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-specials-1"></span><h3 class="section">6.2 Color specials</h3>
+
+<p>We will describe &lsquo;<samp>background</samp>&rsquo; first, since it is the simplest. The
+&lsquo;<samp>background</samp>&rsquo; keyword must be followed by a color specification.
+That color specification is used as a fill color for the background. The
+last &lsquo;<samp>background</samp>&rsquo; special on a page is the one that gets used, and
+is used for the whole of the page image. (This is possible because the
+prescan phase of dvipng notices all of the color specials so that the
+appropriate information can be written out during the second phase.)
+</p>
+<p>The &lsquo;<samp>color</samp>&rsquo; special itself has three forms. The first is just
+&lsquo;<samp>color</samp>&rsquo; followed by a color specification. In this case, the
+current global color is set to that color; the color stack must be empty
+when such a command is executed.
+</p>
+<p>The second form is &lsquo;<samp>color push</samp>&rsquo; followed by a color specification.
+This saves the current color on the color stack and sets the color to be
+that given by the color specification. This is the most common way to
+set a color.
+</p>
+<p>The final form of the &lsquo;<samp>color</samp>&rsquo; special is just &lsquo;<samp>color pop</samp>&rsquo;,
+with no color specification; this says to pop the color last pushed on
+the color stack from the color stack and set the current color to be
+that color.
+</p>
+<p>dvipng correctly handles these color specials across pages, even when
+the pages are rendered repeatedly or in reverse order.
+</p>
+<hr>
+<span id="Diagnosing-problems"></span><div class="header">
+<p>
+Next: <a href="#Credits" accesskey="n" rel="next">Credits</a>, Previous: <a href="#Color" accesskey="p" rel="prev">Color</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Diagnosing-problems-1"></span><h2 class="chapter">7 Diagnosing problems</h2>
+
+<span id="index-problems"></span>
+<span id="index-trouble"></span>
+<span id="index-debugging-1"></span>
+
+<p>You&rsquo;ve gone through all the trouble of installing dvipng, carefully read
+all the instructions in this manual, and still can&rsquo;t get something to
+work. The following sections provide some helpful hints if you find
+yourself in such a situation.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Contact-information" accesskey="1">Contact information</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Who to ask.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Debug-options" accesskey="2">Debug options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Getting diagnostics.
+</td></tr>
+</table>
+
+<hr>
+<span id="Contact-information"></span><div class="header">
+<p>
+Next: <a href="#Debug-options" accesskey="n" rel="next">Debug options</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Contact-information-1"></span><h3 class="section">7.1 Contact information</h3>
+
+<p>Bug reports should be sent to
+<a href="mailto:dvipng@nongnu.org">dvipng@nongnu.org</a>.
+</p>
+<p>Questions, suggestions for new features, pleas for help, and/or praise
+should go to <a href="mailto:dvipng@nongnu.org">dvipng@nongnu.org</a>. For more information on this
+mailing list, send a message with just the word &lsquo;help&rsquo; as subject or
+body to <a href="mailto:dvipng-request@nongnu.org">dvipng-request@nongnu.org</a> or look at
+<a href="http://lists.nongnu.org/mailman/listinfo/dvipng">http://lists.nongnu.org/mailman/listinfo/dvipng</a>.
+</p>
+<p>Offers to support further development will be appreciated. For developer
+access, ask on <a href="mailto:dvipng@nongnu.org">dvipng@nongnu.org</a>.
+</p>
+<p>For details on the TeX path-searching library, and <code>mktexpk</code>
+problems, see <a href="https://tug.org/texinfohtml/kpathsea.html#Common-problems">Common problems</a> in <cite>Kpathsea</cite>.
+</p>
+
+<hr>
+<span id="Debug-options"></span><div class="header">
+<p>
+Previous: <a href="#Contact-information" accesskey="p" rel="prev">Contact information</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Debug-options-1"></span><h3 class="section">7.2 Debug options</h3>
+
+<p>The &lsquo;<samp>-d</samp>&rsquo; flag to dvipng helps in tracking down certain errors. The
+parameter to this flag is an integer that tells what errors are
+currently being tracked. To track a certain class of debug messages,
+simply provide the appropriate number given below; if you wish to track
+multiple classes, sum the numbers of the classes you wish to track. To
+track all classes, you can use <code>-1</code>.
+</p>
+<p>Some of these debugging options are actually provided by Kpathsea
+(see <a href="https://tug.org/texinfohtml/kpathsea.html#Debugging">Debugging</a> in <cite>Kpathsea</cite>).
+</p>
+<p>The classes are:
+</p><dl compact="compact">
+<dt>1</dt>
+<dd><p>Normal dvi op-codes
+</p></dd>
+<dt>2</dt>
+<dd><p>Virtual fonts
+</p></dd>
+<dt>4</dt>
+<dd><p>PK fonts
+</p></dd>
+<dt>8</dt>
+<dd><p>TFM files
+</p></dd>
+<dt>16</dt>
+<dd><p>Glyph rendering
+</p></dd>
+<dt>32</dt>
+<dd><p>FreeType calls
+</p></dd>
+<dt>64</dt>
+<dd><p>Encoding loads
+</p></dd>
+<dt>128</dt>
+<dd><p>Color specials
+</p></dd>
+<dt>256</dt>
+<dd><p>GhostScript specials
+</p></dd>
+<dt>512</dt>
+<dd><p>Kpathsea <code>stat</code> calls
+</p></dd>
+<dt>1024</dt>
+<dd><p>Kpathsea hash table lookups
+</p></dd>
+<dt>2048</dt>
+<dd><p>Kpathsea path element expansion
+</p></dd>
+<dt>4096</dt>
+<dd><p>Kpathsea path searches
+</p>
+</dd>
+</dl>
+
+<hr>
+<span id="Credits"></span><div class="header">
+<p>
+Next: <a href="#Copying" accesskey="n" rel="next">Copying</a>, Previous: <a href="#Diagnosing-problems" accesskey="p" rel="prev">Diagnosing problems</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Credits-1"></span><h2 class="chapter">8 Credits</h2>
+
+<p>A number of persons have contributed, if I forget to mention someone,
+I apologize. First and foremost we have David Kastrup whose
+preview-latex project provided the incentive to write this program.
+There is also a number of people who have contributed by reporting
+bugs and suggesting improvements as the thing has evolved. These
+include but is perhaps not limited to (in semi-random order): Thomas
+Esser (teTeX), Christian Schenk (MIKTeX), Brian R Furry (debian
+package), Angus Leeming (LyX), Thomas Boutell (libgd), John Jones
+(first user report), Uwe Kern (xcolor), Karl Berry and Peter
+Breitenlohner (TeX Live), David Harvey (hinting in Freetype), Neal
+Harmon, Alan Shutko, Reiner Stieb, Nick Alcock, Adam Buchbinder, Svend
+Tollak Munkejord, James Longstreet, Bernhard Simon, Bob McElrath,
+Georg Schwarz, Jason Farmer, Brian V. Smith, Samuel Hathaway, Thomas
+R. Shemanske, Stephen Gibson, Christian Ridderstr&ouml;m, Ezra Peisach,
+William H Wheeler, Thomas Klausner, Harald Koenig, Adrian Bunk, Kevin
+Smith, Jason Riedy, Wolfram Krause, Reinhard Kotucha, Takeshi Abe,
+Waldeck Schutzer, and Andy Nguyen.
+</p>
+
+<hr>
+<span id="Copying"></span><div class="header">
+<p>
+Next: <a href="#Index" accesskey="n" rel="next">Index</a>, Previous: <a href="#Credits" accesskey="p" rel="prev">Credits</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Copying-1"></span><h2 class="chapter">9 Copying</h2>
+
+<p>This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+</p>
+<p>This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+</p>
+<p>You should have received a copy of the GNU Lesser General Public
+License along with this program. If not, see
+&lt;http://www.gnu.org/licenses/&gt;.
+</p>
+<br>
+<br>
+<p>Copyright &copy; 2002-2015, 2019 Jan-&Aring;ke Larsson
+</p>
+<hr>
+<span id="Index"></span><div class="header">
+<p>
+Previous: <a href="#Copying" accesskey="p" rel="prev">Copying</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-1"></span><h2 class="unnumbered">Index</h2>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-1">-</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ddSAFER">-dSAFER</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-page-number_002c-and-_002dl">absolute page number, and &lsquo;<samp>-l</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-page-number_002c-and-_002dp">absolute page number, and &lsquo;<samp>-p</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-antialiasing-levels_002c-number-of">antialiasing levels<span class="roman">, number of</span></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-background-color-_0028option_0029">background color (option)</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-base-resolution_002c-setting">base resolution, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-baseline-reporting">baseline reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-baseline-reporting-1">baseline reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-specifications">color specifications</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-specifications">Color specifications</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-command_002dline-options">command-line options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Command_002dline-options">Command-line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compilation">compilation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compression">compression</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration_002c-of-dvipng">configuration, of dvipng</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dark-fonts">dark fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging">debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging-1">debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-depth-reporting">depth reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-exit-on-erroneous-images">exit on erroneous images</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-first-page-printed">first page printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-follow-mode">follow mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-generation_002c-avoiding">font generation, avoiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-forcing-palette-output">forcing palette output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-foreground-color-_0028option_0029">foreground color (option)</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FreeType-font-rendering">FreeType font rendering</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fuzzy-images">fuzzy images</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gamma">gamma</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GhostScript-and-_002ddSAFER">GhostScript and -dSAFER</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GhostScript_002c-turning-off">GhostScript, turning off</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GIF-image-format">GIF image format</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-height-reporting">height reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installation_002c-of-dvipng">installation, of dvipng</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-invoking-dvipng">invoking dvipng</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-usage">Basic usage</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-last-page-printed">last page printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-light-fonts">light fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magnification_002c-overriding-DVI">magnification, overriding DVI</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-mode_002c-specifying">Metafont mode, specifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexpk_002c-avoiding"><code>mktexpk<span class="roman">, avoiding</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mode-name_002c-specifying">mode name, specifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-no-erroneous-images">no erroneous images</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-offset-pages">offset pages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-option_002c-details-of">option, details of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-dvipng">options, dvipng</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Command_002dline-options">Command-line options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-reading-from-standard-input">options, reading from standard input</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-summary">options, summary</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-summary">Option summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output-resolution_002c-setting">output resolution, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002c-redirecting">output, redirecting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-range">page range</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002c-first-printed">page, first printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002c-last-printed">page, last printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-physical-page-number_002c-and-_002dl">physical page number, and &lsquo;<samp>-l</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-physical-page-number_002c-and-_002dp">physical page number, and &lsquo;<samp>-p</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PNG-image-format">PNG image format</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-inclusion-problems">PostScript inclusion problems</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encapsulated-PostScript">Encapsulated PostScript</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript_002c-turning-off-raw-PostScript-specials">PostScript, turning off raw PostScript specials</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-problems">problems</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quality">quality</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quiet-operation">quiet operation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reverse-pagination">reverse pagination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-silent-operation">silent operation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-input_002c-reading-options-from">standard input, reading options from</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-output_002c-output-to">standard output, output to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-transparent-border-fallback-color">transparent border fallback color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-transparent-border-width">transparent border width</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trouble">trouble</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-truecolor-output">truecolor output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warnings_002c-suppressing">warnings, suppressing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-width-reporting">width reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>-</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<hr>
+
+
+
+</body>
+</html>
diff --git a/systems/doc/dvipng/dvipng.pdf b/systems/doc/dvipng/dvipng.pdf
new file mode 100644
index 0000000000..08d644f0d3
--- /dev/null
+++ b/systems/doc/dvipng/dvipng.pdf
Binary files differ
diff --git a/systems/doc/dvips/NEWS b/systems/doc/dvips/NEWS
new file mode 100644
index 0000000000..5389f7c95b
--- /dev/null
+++ b/systems/doc/dvips/NEWS
@@ -0,0 +1,78 @@
+$Id: NEWS 46759 2018-02-27 23:14:55Z karl $
+This file records noteworthy changes. (Public domain.)
+
+dvips 5.998 (TeX Live 2018):
+ New JFM (Japanese font metrics) spec supported; compiler portability fixes.
+
+dvips 5.997 (TeX Live 2017):
+ Make the last papersize special win, to match dvipdfmx; the -L0 option
+ or L0 config restores the previous behavior of the first special winning.
+
+dvips 5.996 (TeX Live 2016):
+ afm2tfm 8.4: only adjust heights of base characters upward for accent
+ position, and new option -a to omit all adjustments.
+
+dvips 5.995 (TeX Live 2015):
+ Remove psfig support, as it is nonfree.
+
+dvips 5.994 (TeX Live 2014):
+ Omit UniqueID from subsets.
+
+dvips 5.993 (TeX Live 2013):
+ `m' value <= 0 now means no limit on vm.
+
+dvips 5.992 (TeX Live 2012):
+ `c' config file include directive.
+
+dvips 5.991 (TeX Live 2011):
+ Type 1 parsing bug fixes.
+ Integer overflow bug fix.
+
+dvips 5.99 (TeX Live 2010):
+ Use the type1 path to search for Type 1 fonts.
+ Support for Japanese pTeX.
+ Numeric overflow and sprintf checks.
+ Reformat sources.
+
+
+dvips 5.86 notes:
+ Minor improvements to epsf style file.
+ Another patch to t1part.c to make it more liberal in accepting pfb/pfa
+ font files.
+ Added PS reencoding reimplementation by Rob Hutchings.
+ Added 'F' in config file to send controlD.
+ Added quick exit if -? or -v.
+ Improved tex.lpro to fix a bug that showed up in distiller.
+ Improved tex.lpro to work around a problem in certain Windows
+ environments.
+ Made dvips complain if it had to section a document.
+ Eliminated use-after-free bug in hps.c.
+ Fixed a problem in t1part for the Euro fonts with partial font downloading.
+ Fixed a big problem in t1part for some font downloading due to
+ uninitialized allocations.
+ Added `unknown' paper size back to config.ps.
+ Made t1part munge the UniqueID to prevent cache problems in Acrobat and
+ other programs.
+ Fixed parsing error when whitespace following '<' in psfonts.map.
+ Made '<<' work correctly (disable partial font downloading for that
+ particular font) in psfonts.map.
+
+dvips 5.74 notes:
+
+ The epsf.sty and epsf.tex files are now in the public domain.
+ The t1part.c has been updated to support binary files with
+ multiple binary sections.
+
+dvips 5.72 notes:
+
+ Bug fix in t1part.c??? I hope so!
+
+ Debugging now turned on by default. No real reason to turn it off.
+ (Too many Linux versions of dvips without debugging have been
+ distributed, and it makes it very difficult to help the users with
+ their problems . . .)
+
+dvips 5.62 notes:
+
+ The makefile and config.ps and MakeTeXPK need to be modified to fit
+ your site!
diff --git a/systems/doc/dvips/README b/systems/doc/dvips/README
new file mode 100644
index 0000000000..8f373b1a03
--- /dev/null
+++ b/systems/doc/dvips/README
@@ -0,0 +1,43 @@
+$Id: README 17566 2010-03-26 17:29:02Z karl $
+This directory contains Dvips, Tom Rokicki's dvips, a DVI-to-PostScript
+translator. It requires the Kpathsea library for path searching.
+
+See `NEWS' for changes by release, `ChangeLog` for all changes.
+See `../kpathsea/BUGS' for details on reporting bugs.
+
+Dvips is free software; Tom's original files are public domain. The
+files Karl wrote (originally for the Free Software Foundation) are
+covered by the GNU General Public License -- see the files COPYING*.
+-------------------------------------------------------------------------
+The documentation is in the file dvips.texi.
+
+You can read and run the file testdata/dvipstst.tex that to test some
+basic capabilities of dvips. Some of the other files in testdata:
+intoverflow.dvi (CVE-2010-0739)
+vfnameoverflow.dvi (CVE-2010-0827)
+See also the *.test* scripts.
+
+If you enjoy using dvips, you will probably enjoy being a member of
+the TeX Users Group. To join or contribute to TUG, see http://tug.org.
+
+This is a list of people who have contributed substantially to dvips.
+I'm sure I've forgotten many. Thanks to all!
+
+Karl Berry
+Peter Breitenlohner
+P. W. Daly
+Mark Doyle
+Edward J. Groth
+James Hafner
+John Hobby
+Rob Hutchings
+David Jones
+Akira Kakuto
+Donald E. Knuth
+Russell Lang
+Sergey Lesenko
+Art Ogawa
+Melissa O'Neill
+Sebastian Rahtz
+Andrew Trevorrow
+Staszek Wawrykiewicz
diff --git a/systems/doc/dvips/dvips.html b/systems/doc/dvips/dvips.html
new file mode 100644
index 0000000000..c090e788a6
--- /dev/null
+++ b/systems/doc/dvips/dvips.html
@@ -0,0 +1,6250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- This manual documents Dvips version 5.999
+(February 2019), a program to translate a DVI file into
+PostScript. You may freely use, modify and/or distribute this file. -->
+<!-- Created by GNU Texinfo 6.6, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Dvips: A DVI-to-PostScript translator</title>
+
+<meta name="description" content="Dvips: A DVI-to-PostScript translator">
+<meta name="keywords" content="Dvips: A DVI-to-PostScript translator">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<link href="#Top" rel="start" title="Top">
+<link href="#Index" rel="index" title="Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="http://tug.org/texinfohtml" rel="up" title="(dir)">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">Dvips: A DVI-to-PostScript translator</h1>
+
+
+
+
+
+
+
+<span id="SEC_Overview"></span>
+<h2 class="shortcontents-heading">Short Table of Contents</h2>
+
+<div class="shortcontents">
+<ul class="no-bullet">
+<li><a id="stoc-Why-use-Dvips_003f" href="#toc-Why-use-Dvips_003f">1 Why use Dvips?</a></li>
+<li><a id="stoc-Installation-1" href="#toc-Installation-1">2 Installation</a></li>
+<li><a id="stoc-Invoking-Dvips-1" href="#toc-Invoking-Dvips-1">3 Invoking Dvips</a></li>
+<li><a id="stoc-Paper-size-and-landscape-orientation" href="#toc-Paper-size-and-landscape-orientation">4 Paper size and landscape orientation</a></li>
+<li><a id="stoc-Interaction-with-PostScript-1" href="#toc-Interaction-with-PostScript-1">5 Interaction with PostScript</a></li>
+<li><a id="stoc-PostScript-fonts-1" href="#toc-PostScript-fonts-1">6 PostScript fonts</a></li>
+<li><a id="stoc-Color-1" href="#toc-Color-1">7 Color</a></li>
+<li><a id="stoc-Index-1" href="#toc-Index-1">Index</a></li>
+</ul>
+</div>
+
+<span id="SEC_Contents"></span>
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Why-use-Dvips_003f" href="#Why-Dvips">1 Why use Dvips?</a></li>
+ <li><a id="toc-Installation-1" href="#Installation">2 Installation</a>
+ <ul class="no-bullet">
+ <li><a id="toc-config_002eps-installation-1" href="#config_002eps-installation">2.1 <samp>config.ps</samp> installation</a></li>
+ <li><a id="toc-PostScript-font-installation-1" href="#PostScript-font-installation">2.2 PostScript font installation</a></li>
+ <li><a id="toc-Ghostscript-installation-1" href="#Ghostscript-installation">2.3 Ghostscript installation</a></li>
+ <li><a id="toc-Diagnosing-problems-1" href="#Diagnosing-problems">2.4 Diagnosing problems</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Debug-options-1" href="#Debug-options">2.4.1 Debug options</a></li>
+ <li><a id="toc-No-output-at-all" href="#No-output">2.4.2 No output at all</a></li>
+ <li><a id="toc-Output-too-small-or-inverted" href="#Small-or-inverted">2.4.3 Output too small or inverted</a></li>
+ <li><a id="toc-Error-messages-from-printer" href="#Printer-errors">2.4.4 Error messages from printer</a></li>
+ <li><a id="toc-Long-documents-fail-to-print" href="#Long-documents-fail">2.4.5 Long documents fail to print</a></li>
+ <li><a id="toc-Including-graphics-fails-1" href="#Including-graphics-fails">2.4.6 Including graphics fails</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Invoking-Dvips-1" href="#Invoking-Dvips">3 Invoking Dvips</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Basic-usage-of-Dvips" href="#Basic-usage">3.1 Basic usage of Dvips</a></li>
+ <li><a id="toc-Command_002dline-options-1" href="#Command_002dline-options">3.2 Command-line options</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Option-summary-1" href="#Option-summary">3.2.1 Option summary</a></li>
+ <li><a id="toc-Option-details-1" href="#Option-details">3.2.2 Option details</a></li>
+ </ul></li>
+ <li><a id="toc-Environment-variables-1" href="#Environment-variables">3.3 Environment variables</a></li>
+ <li><a id="toc-Dvips-configuration-files" href="#Config-files">3.4 Dvips configuration files</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Configuration-file-searching-1" href="#Configuration-file-searching">3.4.1 Configuration file searching</a></li>
+ <li><a id="toc-Configuration-file-commands-1" href="#Configuration-file-commands">3.4.2 Configuration file commands</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Paper-size-and-landscape-orientation" href="#Paper-size-and-landscape">4 Paper size and landscape orientation</a>
+ <ul class="no-bullet">
+ <li><a id="toc-papersize-special-1" href="#papersize-special">4.1 &lsquo;<samp>papersize</samp>&rsquo; special</a></li>
+ <li><a id="toc-Configuration-file-paper-size-command" href="#Config-file-paper-sizes">4.2 Configuration file paper size command</a></li>
+ <li><a id="toc-Paper-trays-1" href="#Paper-trays">4.3 Paper trays</a></li>
+ </ul></li>
+ <li><a id="toc-Interaction-with-PostScript-1" href="#Interaction-with-PostScript">5 Interaction with PostScript</a>
+ <ul class="no-bullet">
+ <li><a id="toc-PostScript-figures-1" href="#PostScript-figures">5.1 PostScript figures</a>
+ <ul class="no-bullet">
+ <li><a id="toc-The-bounding-box-comment" href="#Bounding-box">5.1.1 The bounding box comment</a></li>
+ <li><a id="toc-The-_005cincludegraphics-macro-for-LaTeX" href="#g_t_005cincludegraphics">5.1.2 The \includegraphics macro for LaTeX</a></li>
+ <li><a id="toc-Using-the-EPSF-macros" href="#EPSF-macros">5.1.3 Using the EPSF macros</a>
+ <ul class="no-bullet">
+ <li><a id="toc-EPSF-scaling-1" href="#EPSF-scaling">5.1.3.1 EPSF scaling</a></li>
+ <li><a id="toc-EPSF-clipping-1" href="#EPSF-clipping">5.1.3.2 EPSF clipping</a></li>
+ </ul></li>
+ <li><a id="toc-psfile-special-1" href="#psfile-special">5.1.4 &lsquo;<samp>psfile</samp>&rsquo; special</a></li>
+ <li><a id="toc-Dynamic-creation-of-PostScript-graphics-files" href="#Dynamic-creation-of-graphics">5.1.5 Dynamic creation of PostScript graphics files</a></li>
+ <li><a id="toc-Fonts-in-figures-1" href="#Fonts-in-figures">5.1.6 Fonts in figures</a></li>
+ </ul></li>
+ <li><a id="toc-PostScript-header-files" href="#Header-files">5.2 PostScript header files</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Including-headers-from-TeX-1" href="#Including-headers-from-TeX">5.2.1 Including headers from TeX</a></li>
+ <li><a id="toc-Including-headers-from-the-command-line-1" href="#Including-headers-from-the-command-line">5.2.2 Including headers from the command line</a></li>
+ <li><a id="toc-Headers-and-memory-usage-1" href="#Headers-and-memory-usage">5.2.3 Headers and memory usage</a></li>
+ </ul></li>
+ <li><a id="toc-Literal-PostScript" href="#Literal-PS">5.3 Literal PostScript</a>
+ <ul class="no-bullet">
+ <li><a id="toc-_0022-special_003a-Literal-PostScript" href="#g_t_0022-special">5.3.1 <code>&quot;</code> special: Literal PostScript</a></li>
+ <li><a id="toc-ps-special-1" href="#ps-special">5.3.2 &lsquo;<samp>ps</samp>&rsquo; special</a></li>
+ <li><a id="toc-Literal-headers_003a-_0021-_005cspecial" href="#Literal-headers">5.3.3 Literal headers: &lsquo;<samp>!</samp>&rsquo; <code>\special</code></a></li>
+ <li><a id="toc-PostScript-hooks-1" href="#PostScript-hooks">5.3.4 PostScript hooks</a></li>
+ <li><a id="toc-Literal-examples-1" href="#Literal-examples">5.3.5 Literal examples</a></li>
+ </ul></li>
+ <li><a id="toc-HyperTeXt" href="#Hypertext">5.4 HyperTeXt</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Hypertext-caveats-1" href="#Hypertext-caveats">5.4.1 Hypertext caveats</a></li>
+ <li><a id="toc-Hypertext-specials-1" href="#Hypertext-specials">5.4.2 Hypertext specials</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-PostScript-fonts-1" href="#PostScript-fonts">6 PostScript fonts</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Font-concepts-1" href="#Font-concepts">6.1 Font concepts</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Metric-files-1" href="#Metric-files">6.1.1 Metric files</a></li>
+ <li><a id="toc-Glyph-files-1" href="#Glyph-files">6.1.2 Glyph files</a></li>
+ <li><a id="toc-Virtual-fonts-1" href="#Virtual-fonts">6.1.3 Virtual fonts</a></li>
+ <li><a id="toc-Encodings-1" href="#Encodings">6.1.4 Encodings</a></li>
+ <li><a id="toc-How-PostScript-typesets-a-character" href="#PostScript-typesetting">6.1.5 How PostScript typesets a character</a></li>
+ </ul></li>
+ <li><a id="toc-Making-a-PostScript-font-available" href="#Making-a-font-available">6.2 Making a PostScript font available</a></li>
+ <li><a id="toc-Invoking-Afm2tfm" href="#Invoking-afm2tfm">6.3 Invoking Afm2tfm</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Changing-font-encodings-1" href="#Changing-font-encodings">6.3.1 Changing font encodings</a>
+ <ul class="no-bullet">
+ <li><a id="toc-_002dt_003a-Changing-TeX-encodings" href="#Changing-TeX-encodings">6.3.1.1 &lsquo;<samp>-t</samp>&rsquo;: Changing TeX encodings</a></li>
+ <li><a id="toc-_002dp_003a-Changing-PostScript-encodings" href="#Changing-PostScript-encodings">6.3.1.2 &lsquo;<samp>-p</samp>&rsquo;: Changing PostScript encodings</a></li>
+ <li><a id="toc-_002dT_003a-Changing-both-TeX-and-PostScript-encodings" href="#Changing-both-encodings">6.3.1.3 &lsquo;<samp>-T</samp>&rsquo;: Changing both TeX and PostScript encodings</a></li>
+ <li><a id="toc-Reencoding-with-Afm2tfm-1" href="#Reencoding-with-Afm2tfm">6.3.1.4 Reencoding with Afm2tfm</a></li>
+ <li><a id="toc-Encoding-file-format-1" href="#Encoding-file-format">6.3.1.5 Encoding file format</a></li>
+ </ul></li>
+ <li><a id="toc-Special-font-effects-1" href="#Special-font-effects">6.3.2 Special font effects</a></li>
+ <li><a id="toc-Afm2tfm-options-1" href="#Afm2tfm-options">6.3.3 Afm2tfm options</a></li>
+ </ul></li>
+ <li><a id="toc-psfonts_002emap_003a-PostScript-font-catalog" href="#psfonts_002emap">6.4 <samp>psfonts.map</samp>: PostScript font catalog</a></li>
+ </ul></li>
+ <li><a id="toc-Color-1" href="#Color">7 Color</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Color-macro-files-1" href="#Color-macro-files">7.1 Color macro files</a></li>
+ <li><a id="toc-User_002ddefinable-colors-1" href="#User_002ddefinable-colors">7.2 User-definable colors</a></li>
+ <li><a id="toc-Color-subtleties-1" href="#Color-subtleties">7.3 Color subtleties</a></li>
+ <li><a id="toc-Printing-in-black_002fwhite-after-colorizing" href="#Ted-Turner">7.4 Printing in black/white after colorizing</a></li>
+ <li><a id="toc-Color-device-configuration-1" href="#Color-device-configuration">7.5 Color device configuration</a></li>
+ <li><a id="toc-Color-support-details-1" href="#Color-support-details">7.6 Color support details</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Color-specifications-1" href="#Color-specifications">7.6.1 Color specifications</a></li>
+ <li><a id="toc-Color-specials-1" href="#Color-specials">7.6.2 Color specials</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Index-1" href="#Index">Index</a></li>
+</ul>
+</div>
+
+
+<span id="Top"></span><div class="header">
+<p>
+Next: <a href="#Why-Dvips" accesskey="n" rel="next">Why Dvips</a>, Up: <a href="http://tug.org/texinfohtml" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Dvips"></span><h1 class="top">Dvips</h1>
+
+<p>This manual documents Dvips version 5.999
+(February 2019), a program to translate a DVI file into
+PostScript. You may freely use, modify and/or distribute this file.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Why-Dvips" accesskey="1">Why Dvips</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Why use Dvips?
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Installation" accesskey="2">Installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How to compile and install Dvips.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Invoking-Dvips" accesskey="3">Invoking Dvips</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Command-line options, configuration files, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Paper-size-and-landscape" accesskey="4">Paper size and landscape</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the paper dimensions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Interaction-with-PostScript" accesskey="5">Interaction with PostScript</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">TeX meets Dvips meets PostScript.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#PostScript-fonts" accesskey="6">PostScript fonts</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Installing and using PostScript fonts.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color" accesskey="7">Color</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using color with Dvips.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index" accesskey="8">Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General index.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Why-Dvips"></span><div class="header">
+<p>
+Next: <a href="#Installation" accesskey="n" rel="next">Installation</a>, Previous: <a href="#Top" accesskey="p" rel="prev">Top</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Why-use-Dvips_003f"></span><h2 class="chapter">1 Why use Dvips?</h2>
+
+<p>The Dvips program has a number of features that set it apart from
+other PostScript drivers for TeX. This rather long section describes
+the advantages of using Dvips, and may be skipped if you are just
+interested in learning how to use the program. See <a href="#Installation">Installation</a>, for
+details of compilation and installation.
+</p>
+<p>The Dvips driver generates excellent, standard PostScript, that
+can be included in other documents as figures or printed through a
+variety of spoolers. The generated PostScript requires very little
+printer memory, so very complex documents with a lot of fonts can easily
+be printed even on PostScript printers without much memory, such as the
+original Apple LaserWriter. The PostScript output is also compact,
+requiring less disk space to store and making it feasible as a transfer
+format.
+</p>
+<p>Even those documents that are too complex to print in their entirety on
+a particular printer can be printed, since Dvips will
+automatically split such documents into pieces, reclaiming the printer
+memory between each piece.
+</p>
+<p>The Dvips program supports graphics in a natural way, allowing
+PostScript graphics to be included and automatically scaled and
+positioned in a variety of ways.
+</p>
+<p>Printers with any resolution are supported, even if they have different
+resolutions in the horizontal and vertical directions. High resolution
+output is supported for typesetters, including an option that compresses
+the bitmap fonts so that typesetter virtual memory is not exhausted.
+This option also significantly reduces the size of the PostScript file
+and decoding in the printer is very fast.
+</p>
+<p>Missing fonts can be automatically generated if Metafont exists on
+the system, or fonts can be converted from GF to PK format
+on demand. If a font cannot be generated, a scaled version of the same
+font at a different size can be used instead, although Dvips will
+complain loudly about the poor aesthetics of the resulting output.
+</p>
+<p>One of the most important features is the support of virtual fonts,
+which add an entirely new level of flexibility to TeX. Virtual fonts
+are used to give Dvips its excellent PostScript font support, handling
+all the font remapping in a natural, portable, elegant, and extensible
+way. Dvips even comes with its own Afm2tfm program that creates
+the necessary virtual fonts and TeX font metric files automatically
+from the Adobe font metric files.
+</p>
+<p>Source is provided and freely distributable, so adding a site-specific feature
+is possible. Adding such features is made easier by the highly modular
+structure of the program.
+</p>
+<p>There is really no reason to use another driver, and the more people use
+Dvips, the less time will be spent fighting with PostScript and the
+more time will be available to create beautiful documents.
+So if you don&rsquo;t use Dvips on your system, get it today.
+</p>
+<span id="index-Rokicki_002c-Tomas"></span>
+<p>Tom Rokicki wrote and maintains the original Dvips program.
+</p>
+
+<hr>
+<span id="Installation"></span><div class="header">
+<p>
+Next: <a href="#Invoking-Dvips" accesskey="n" rel="next">Invoking Dvips</a>, Previous: <a href="#Why-Dvips" accesskey="p" rel="prev">Why Dvips</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Installation-1"></span><h2 class="chapter">2 Installation</h2>
+
+<span id="index-configuration_002c-of-Dvips"></span>
+<span id="index-compilation"></span>
+<span id="index-installation_002c-of-Dvips"></span>
+
+
+<p>Installing Dvips is mostly the same as installing any Kpathsea-using
+program. Therefore, for the basic steps involved,
+see <a href="https://tug.org/texinfohtml/kpathsea.html#Installation">Installation</a> in <cite>Kpathsea</cite>.
+</p>
+<p>For solutions to common installation problems and information on how to
+report a bug, see the file <samp>kpathsea/BUGS</samp> (see <a href="https://tug.org/texinfohtml/kpathsea.html#Bugs">Bugs</a> in <cite>Kpathsea</cite>). For solutions to Dvips-specific problems,
+see <a href="#Debug-options">Debug options</a>. Also see the Dvips home page at
+<a href="http://www.radicaleye.com/dvips">http://www.radicaleye.com/dvips</a>.
+</p>
+<p>Dvips does require some additional installation, detailed in the
+sections below. Also, to configure color devices, see <a href="#Color-device-configuration">Color device configuration</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#config_002eps-installation" accesskey="1">config.ps installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Printer and site Dvips configuration.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#PostScript-font-installation" accesskey="2">PostScript font installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Many PostScript fonts are freely available.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Ghostscript-installation" accesskey="3">Ghostscript installation</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">A free PostScript interpreter.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Diagnosing-problems" accesskey="4">Diagnosing problems</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Some common runtime difficulties.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="config_002eps-installation"></span><div class="header">
+<p>
+Next: <a href="#PostScript-font-installation" accesskey="n" rel="next">PostScript font installation</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="config_002eps-installation-1"></span><h3 class="section">2.1 <samp>config.ps</samp> installation</h3>
+
+<span id="index-config_002eps-installation"></span>
+<span id="index-installation-of-config_002eps"></span>
+<span id="index-printer-configuration"></span>
+<span id="index-paper-size_002c-default"></span>
+<span id="index-configuration-files_002c-creating"></span>
+
+<p>Dvips has its own configuration files: a file <samp>config.ps</samp> for
+sitewide defaults, and a file <samp>config.<var>printer</var></samp> for each
+printer (output device). Since these are site-specific, <code>make
+install</code> does not create them; you must create them yourself.
+</p>
+<p>(These Dvips configuration files are independent of the Kpathsea
+configuration file <samp>texmf.cnf</samp> (see <a href="https://tug.org/texinfohtml/kpathsea.html#Config-files">Config files</a> in <cite>Kpathsea</cite>).
+</p>
+<span id="index-config_002eproto"></span>
+<span id="index-prototype-printer-configuration-file"></span>
+<span id="index-printer-configuration-file_002c-prototype"></span>
+<span id="index-configuration-files_002c-prototype"></span>
+<p>Dvips configuration files contents and searching are described fully in
+<a href="#Config-files">Config files</a>. The simplest way to create a new configuration file
+is to copy and modify the file <samp>dvipsk/contrib/config.proto</samp>,
+seasoning with options to your taste from <a href="#Config-files">Config files</a>. Here is
+<samp>config.proto</samp>
+for your reading pleasure:
+</p><div class="example">
+<pre class="example">% Prototype Dvips configuration file. (Public domain.)
+
+% How to print, maybe with lp instead lpr, etc.
+o |lpr
+
+% Default resolution of this device, in dots per inch.
+D 600
+
+% Metafont mode. (This is completely different from the -M command-line
+% option, which controls whether MakeTeXPK is invoked.) Get
+% <a href="ftp://ftp.tug.org/tex/modes.mf">ftp://ftp.tug.org/tex/modes.mf</a> for a list of mode names. This mode
+% and the D number above must agree, or MakeTeXPK will get confused.
+M ljfour
+
+% Memory available. Download the three-line PostScript file:
+% %! Hey, we're PostScript
+% /Times-Roman findfont 30 scalefont setfont 144 432 moveto
+% vmstatus exch sub 40 string cvs show pop showpage
+% to determine this number. (It will be the only thing printed.)
+m 3500000
+
+% Correct printer offset. You can use testpage.tex from the LaTeX
+% distribution to find these numbers. Print testpage.dvi more than once.
+O 0pt,0pt
+
+% Partially download Type 1 fonts by default. Only reason not to do
+% this is if you encounter bugs. (Please report them to
+% <a href="mailto:tex-k@tug.org">tex-k@tug.org</a> if you do.)
+j
+
+% Also look for fonts at these resolutions.
+R 300 600
+
+% With a high resolution and a RISC cpu, better to compress the bitmaps.
+Z
+
+% Uncomment these if you have and want to use PostScript versions of the
+% fonts.
+%p +cmfonts.map
+%p +lafonts.map
+%p +cyrfonts.map
+%p +eufonts.map
+
+% To include another configuration file here.
+%c FILENAME
+
+% You will also want definitions for alternative paper sizes -- A4,
+% legal, and such. Examples in <samp>contrib/papersize.level2</samp> and
+% <samp>contrib/papersize.simple</samp>.
+</pre></div>
+
+
+<hr>
+<span id="PostScript-font-installation"></span><div class="header">
+<p>
+Next: <a href="#Ghostscript-installation" accesskey="n" rel="next">Ghostscript installation</a>, Previous: <a href="#config_002eps-installation" accesskey="p" rel="prev">config.ps installation</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="PostScript-font-installation-1"></span><h3 class="section">2.2 PostScript font installation</h3>
+
+<span id="index-installation-of-PostScript-fonts"></span>
+<span id="index-fonts_002c-installation-of-PostScript"></span>
+<span id="index-PostScript-fonts_002c-installing"></span>
+
+<p>To use PostScript fonts with TeX and Dvips, you need both metric
+files (<samp>.tfm</samp> and <samp>.vf</samp>) and the outlines (<samp>.pfa</samp> or
+<samp>.pfb</samp>). See <a href="#Font-concepts">Font concepts</a>. Current TeX systems
+come with support for 35 base PostScript fonts and many more.
+</p>
+<span id="index-fonts_002c-system-PostScript"></span>
+<span id="index-PostScript-fonts_002c-on-your-system"></span>
+<span id="index-psfonts_002emap"></span>
+<p>If you have additional PostScript fonts, you can make them available
+to Dvips by (1)&nbsp;giving them appropriate filenames; and
+(2)&nbsp;running Afm2tfm (see <a href="#Making-a-font-available">Making a font available</a>) to make TFM
+and VF metrics for TeX and Dvips to use. Also add them to
+<samp>psfonts.map</samp> (see <a href="#psfonts_002emap">psfonts.map</a>); this file must contain
+everything available in the system. The <code>updmap</code> program is
+usually used to maintain <samp>psfonts.map</samp>; run &lsquo;<samp>updmap --help</samp>&rsquo;
+for lots of information about how it works.
+</p>
+
+<hr>
+<span id="Ghostscript-installation"></span><div class="header">
+<p>
+Next: <a href="#Diagnosing-problems" accesskey="n" rel="next">Diagnosing problems</a>, Previous: <a href="#PostScript-font-installation" accesskey="p" rel="prev">PostScript font installation</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Ghostscript-installation-1"></span><h3 class="section">2.3 Ghostscript installation</h3>
+
+<span id="index-Ghostscript-installation"></span>
+<span id="index-gs-installation"></span>
+
+<span id="index-Deutsch_002c-Peter"></span>
+<span id="index-Epson-printers"></span>
+<span id="index-previewing-Dvips-output"></span>
+<span id="index-PostScript-previewers"></span>
+<span id="index-PDF-files_002c-making"></span>
+<span id="index-Aladdin-Ghostscript"></span>
+<p>Ghostscript is a PostScript interpreter freely available to end-users,
+originally written by Peter Deutsch. It can read the PostScript
+produced by Dvips and render it on your monitor, or for another device
+(e.g., an Epson printer) that does not support PostScript, or in PDF
+format. The latest version is available via
+<a href="http://ghostscript.com">http://ghostscript.com</a>.
+</p>
+<span id="index-Theisen_002c-Tim"></span>
+<span id="index-ghostview"></span>
+<span id="index-Ghostview_002c-and-no-N"></span>
+<span id="index-EPS_002c-and-Ghostview"></span>
+<span id="index-standard-PostScript_002c-required-by-Ghostview"></span>
+<span id="index-_0025_0025Page_002c-required-by-Ghostview"></span>
+<p>The program Ghostview, originally written by Johannes Plass and Tim
+Theisen, provides typical previewing capabilities (next page/previous
+page, magnification, etc.). It requires Ghostscript to run, and files
+in structured Postscript, specifically with &lsquo;<samp>%%Page</samp>&rsquo; comments (no
+&lsquo;<samp>N</samp>&rsquo; in <samp>config.ps</samp>). The current version is known as GV,
+and is available from <a href="http://www.gnu.org/software/gv">http://www.gnu.org/software/gv</a>.
+</p>
+
+<hr>
+<span id="Diagnosing-problems"></span><div class="header">
+<p>
+Previous: <a href="#Ghostscript-installation" accesskey="p" rel="prev">Ghostscript installation</a>, Up: <a href="#Installation" accesskey="u" rel="up">Installation</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Diagnosing-problems-1"></span><h3 class="section">2.4 Diagnosing problems</h3>
+
+<span id="index-problems"></span>
+<span id="index-trouble"></span>
+<span id="index-debugging"></span>
+
+<p>You&rsquo;ve gone through all the trouble of installing Dvips, carefully read
+all the instructions in this manual, and still can&rsquo;t get something to
+work. The following sections provide some helpful hints if you find
+yourself in such a situation.
+</p>
+<p>For details on effective bug reporting, common installation problems,
+and <code>mktexpk</code> problems, see <a href="https://tug.org/texinfohtml/kpathsea.html#Bugs">Bugs</a> in <cite>Kpathsea</cite>.
+</p>
+<p>A good first debugging operation is to set the environment variable
+<code>DVIPSDEBUG</code>, which will display any configuration and map files
+read by Dvips. This way you can be sure it&rsquo;s finding the files and
+settings you expect.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Debug-options" accesskey="1">Debug options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Getting diagnostics.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#No-output" accesskey="2">No output</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">No output at all.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Small-or-inverted" accesskey="3">Small or inverted</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Output too small or inverted.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Printer-errors" accesskey="4">Printer errors</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The printer sends back errors.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Long-documents-fail" accesskey="5">Long documents fail</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Long documents fail to print.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Including-graphics-fails" accesskey="6">Including graphics fails</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Figures don&rsquo;t work.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Debug-options"></span><div class="header">
+<p>
+Next: <a href="#No-output" accesskey="n" rel="next">No output</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Debug-options-1"></span><h4 class="subsection">2.4.1 Debug options</h4>
+
+<span id="index-debugging-options"></span>
+<span id="index-options_002c-debugging"></span>
+
+<p>The &lsquo;<samp>-d</samp>&rsquo; flag to Dvips helps in tracking down certain errors.
+The parameter to this flag is an integer that tells what errors are
+currently being tracked. To track a certain class of debug messages,
+specify the appropriate number given below; if you wish to track
+multiple classes, sum the numbers of the classes you wish to track.
+To track all classes, you can use <code>-1</code>.
+</p>
+<p>You can also set the environment variable <code>KPATHSEA_DEBUG</code> instead
+of using &lsquo;<samp>-d</samp>&rsquo;. Some of these debugging options are actually
+provided by Kpathsea (see <a href="https://tug.org/texinfohtml/kpathsea.html#Debugging">Debugging</a> in <cite>Kpathsea</cite>).
+</p>
+<p>The classes are:
+</p>
+<dl compact="compact">
+<dt>1</dt>
+<dd><p>specials
+</p></dd>
+<dt>2</dt>
+<dd><p>paths
+</p></dd>
+<dt>4</dt>
+<dd><p>fonts
+</p></dd>
+<dt>8</dt>
+<dd><p>pages
+</p></dd>
+<dt>16</dt>
+<dd><p>headers
+</p></dd>
+<dt>32</dt>
+<dd><p>font compression
+</p></dd>
+<dt>64</dt>
+<dd><p>files
+</p></dd>
+<dt>128</dt>
+<dd><p>(omitted)
+</p></dd>
+<dt>256</dt>
+<dd><p>config files
+</p></dd>
+<dt>512</dt>
+<dd><p>Kpathsea <code>stat</code> calls
+</p></dd>
+<dt>1024</dt>
+<dd><p>Kpathsea hash table lookups
+</p></dd>
+<dt>2048</dt>
+<dd><p>Kpathsea path element expansion
+</p></dd>
+<dt>4096</dt>
+<dd><p>Kpathsea path searches
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="No-output"></span><div class="header">
+<p>
+Next: <a href="#Small-or-inverted" accesskey="n" rel="next">Small or inverted</a>, Previous: <a href="#Debug-options" accesskey="p" rel="prev">Debug options</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="No-output-at-all"></span><h4 class="subsection">2.4.2 No output at all</h4>
+
+<span id="index-output_002c-none"></span>
+<span id="index-no-output-at-all"></span>
+<span id="index-failure_002c-to-print-at-all"></span>
+
+<p>If you are not getting any output at all, even from the simplest
+one-character file (for instance, &lsquo;<samp>\ \bye</samp>&rsquo;), then something is very
+wrong. Practically any file sent to a PostScript laser printer should
+generate some output, at the very least a page detailing what error
+occurred, if any. Talk to your system administrator about downloading a
+PostScript error handler. (Adobe distributes a good one called
+&lsquo;<samp>ehandler.ps</samp>&rsquo;.)
+<span id="index-ehandler_002eps"></span>
+</p>
+<span id="index-PowerPage-PostScript-implementation"></span>
+<span id="index-Shinko-CHC_002dS446i-printer"></span>
+<span id="index-Mitsubishi-Shinko-CHC_002dS446i-printer"></span>
+<p>It is possible, especially if you are using non-Adobe PostScript, that
+your PostScript interpreter is broken. Even then it should generate an
+error message. Dvips tries to work around as many bugs as possible in
+common non-Adobe PostScript interpreters, but doubtless it misses a few.
+PowerPage Revision 1, Interpreter Version 20001.001, on a Mitsubishi
+Shinko CHC-S446i color thermal dye sublimation printer is known to be
+unable to print with any but builtin fonts.
+</p>
+<p>If Dvips gives any strange error messages, or compilation on your
+machine generated a lot of warnings, perhaps the Dvips program itself is
+broken. Try using the debug options to determine where the error
+occurred (see <a href="#Debug-options">Debug options</a>).
+</p>
+<p>It is possible your spooler is broken and is misinterpreting the
+structured comments. Try the &lsquo;<samp>-N</samp>&rsquo; flag to turn off structured
+comments and see what happens.
+</p>
+
+<hr>
+<span id="Small-or-inverted"></span><div class="header">
+<p>
+Next: <a href="#Printer-errors" accesskey="n" rel="next">Printer errors</a>, Previous: <a href="#No-output" accesskey="p" rel="prev">No output</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Output-too-small-or-inverted"></span><h4 class="subsection">2.4.3 Output too small or inverted</h4>
+
+<span id="index-output_002c-too-small"></span>
+<span id="index-output_002c-inverted"></span>
+<span id="index-inverted-output"></span>
+<span id="index-too_002dsmall-output"></span>
+
+<span id="index-save_002frestore_002c-and-inverted-output"></span>
+<p>If some documents come out inverted or too small, probably your spooler
+is not supplying an end of job indicator at the end of each file. (This
+commonly happens on small machines that don&rsquo;t have spoolers.) You can
+force Dvips to do this with the &lsquo;<samp>-F</samp>&rsquo; flag (or &lsquo;<samp>F</samp>&rsquo; config file
+option), but this generates files with a terminating binary character
+(control-D). You can also try using the &lsquo;<samp>-s</samp>&rsquo; flag (or &lsquo;<samp>s</samp>&rsquo;
+config file option) to enclose the entire job in a save/restore pair.
+See <a href="#Command_002dline-options">Command-line options</a>, and <a href="#Config-files">Config files</a>.
+</p>
+
+<hr>
+<span id="Printer-errors"></span><div class="header">
+<p>
+Next: <a href="#Long-documents-fail" accesskey="n" rel="next">Long documents fail</a>, Previous: <a href="#Small-or-inverted" accesskey="p" rel="prev">Small or inverted</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Error-messages-from-printer"></span><h4 class="subsection">2.4.4 Error messages from printer</h4>
+
+<span id="index-printer-errors"></span>
+<span id="index-error-messages-from-printer"></span>
+<span id="index-failure_002c-and-printer-errors"></span>
+
+<span id="index-bop-undefined-error"></span>
+<p>If your printer returns error messages, the error message gives very
+good information on what might be going wrong. One of the most common
+error messages is &lsquo;<samp>bop undefined</samp>&rsquo;. This is caused by old versions
+of Transcript and other spoolers that do not properly parse the setup
+section of the PostScript. To fix this, turn off structured comments
+with the &lsquo;<samp>-N</samp>&rsquo; option, but it&rsquo;d be best to get your spooling
+software updated.
+</p>
+<span id="index-VM-exhausted"></span>
+<span id="index-printer-memory-exhausted"></span>
+<span id="index-memory-of-printer-exhausted"></span>
+<p>Another error message is &lsquo;<samp>VM exhausted</samp>&rsquo;. Some printers indicate
+this error by locking up, others quietly reset. This is caused by Dvips
+thinking that the printer has more memory than it actually does, and
+then printing a complicated document. To fix this, try lowering the
+&lsquo;<samp>m</samp>&rsquo; parameter in the configuration file; use the debug option to
+make sure you adjust the correct file.
+</p>
+<p>Other errors may indicate you are trying to include graphics that don&rsquo;t
+nest properly in other PostScript documents, among other things. Try
+the PostScript file on a QMS PS-810 or other Adobe PostScript printer if
+you have one, or Ghostscript (see <a href="#Ghostscript-installation">Ghostscript installation</a>); it
+might be a problem with the printer itself.
+</p>
+
+<hr>
+<span id="Long-documents-fail"></span><div class="header">
+<p>
+Next: <a href="#Including-graphics-fails" accesskey="n" rel="next">Including graphics fails</a>, Previous: <a href="#Printer-errors" accesskey="p" rel="prev">Printer errors</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Long-documents-fail-to-print"></span><h4 class="subsection">2.4.5 Long documents fail to print</h4>
+
+<span id="index-long-documents-not-printing"></span>
+<span id="index-failure_002c-of-long-documents"></span>
+
+<p>This is usually caused by incorrectly specifying the amount of memory
+the printer has in the configuration file; see the previous section.
+</p>
+
+<hr>
+<span id="Including-graphics-fails"></span><div class="header">
+<p>
+Previous: <a href="#Long-documents-fail" accesskey="p" rel="prev">Long documents fail</a>, Up: <a href="#Diagnosing-problems" accesskey="u" rel="up">Diagnosing problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Including-graphics-fails-1"></span><h4 class="subsection">2.4.6 Including graphics fails</h4>
+
+<span id="index-including-graphics-fails"></span>
+<span id="index-graphics-inclusion-fails"></span>
+<span id="index-failure_002c-to-include-graphics"></span>
+
+<p>The most common problem with including graphics is an incorrect bounding
+box (see <a href="#Bounding-box">Bounding box</a>). Complain to whoever wrote the software that
+generated the file if the bounding box is indeed incorrect.
+</p>
+<span id="index-Illustrator_002c-workaround-for"></span>
+<p>Another possible problem is that the figure you are trying to include
+does not nest properly; there are certain rules PostScript applications
+must follow when generating files to be included. The Dvips program
+includes work-arounds for such errors in Adobe Illustrator and other
+programs, but there are certainly applications that haven&rsquo;t been tested.
+</p>
+<p>One possible thing to try is the &lsquo;<samp>-K</samp>&rsquo; flag which strips the comments
+from an included figure. This might be necessary if the PostScript
+spooling software does not read the structured comments correctly. Use
+of this flag will break graphics from some applications, though, since
+some applications read the PostScript file from the input stream,
+looking for a particular comment.
+</p>
+<span id="index-binary-files_002c-not-supported"></span>
+<p>Any application which generates graphics output containing raw binary
+(not ASCII hex) will probably fail with Dvips.
+</p>
+
+<hr>
+<span id="Invoking-Dvips"></span><div class="header">
+<p>
+Next: <a href="#Paper-size-and-landscape" accesskey="n" rel="next">Paper size and landscape</a>, Previous: <a href="#Installation" accesskey="p" rel="prev">Installation</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Invoking-Dvips-1"></span><h2 class="chapter">3 Invoking Dvips</h2>
+
+<span id="index-command_002dline-options"></span>
+<span id="index-options_002c-Dvips"></span>
+<span id="index-invoking-Dvips"></span>
+
+<p>Dvips reads a DVI file as output by (for example) TeX, and converts
+it to PostScript, taking care of builtin or downloaded PostScript fonts,
+font reencoding, color, etc. These features are described in other
+chapters in this document.
+</p>
+<p>There many ways to control Dvips&rsquo; behavior: configuration files,
+environment variables, and command-line options.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Basic-usage" accesskey="1">Basic usage</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Command_002dline-options" accesskey="2">Command-line options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Environment-variables" accesskey="3">Environment variables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Config-files" accesskey="4">Config files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Basic-usage"></span><div class="header">
+<p>
+Next: <a href="#Command_002dline-options" accesskey="n" rel="next">Command-line options</a>, Up: <a href="#Invoking-Dvips" accesskey="u" rel="up">Invoking Dvips</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Basic-usage-of-Dvips"></span><h3 class="section">3.1 Basic usage of Dvips</h3>
+
+<span id="index-usage_002c-basic"></span>
+
+<p>To use Dvips at its simplest, simply type
+</p>
+<div class="example">
+<pre class="example">dvips foo
+</pre></div>
+
+<p>where <samp>foo.dvi</samp> is the output of TeX that you want to print.
+The default output is to a corresponding file <samp>foo.ps</samp>; Dvips may
+also have been locally configured to output directly to a printer by
+default.
+</p>
+<p>If you use fonts that have not been used on your system before, they may
+be automatically generated; this process can take a few minutes, so
+progress reports appear by default. The next time that document is
+printed, these fonts will have been saved in the proper directories, so
+printing will go much faster. (If Dvips tries to endlessly generate the
+same fonts over and over again, it hasn&rsquo;t been installed properly.
+See <a href="https://tug.org/texinfohtml/kpathsea.html#Unable-to-generate-fonts">Unable to generate fonts</a> in <cite>Kpathsea</cite>.)
+</p>
+<p>Many options are available (see the next section). For a brief summary
+of available options, just type
+</p>
+<div class="example">
+<pre class="example">dvips --help
+</pre></div>
+
+
+<hr>
+<span id="Command_002dline-options"></span><div class="header">
+<p>
+Next: <a href="#Environment-variables" accesskey="n" rel="next">Environment variables</a>, Previous: <a href="#Basic-usage" accesskey="p" rel="prev">Basic usage</a>, Up: <a href="#Invoking-Dvips" accesskey="u" rel="up">Invoking Dvips</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Command_002dline-options-1"></span><h3 class="section">3.2 Command-line options</h3>
+
+<p>Dvips has a plethora of command line options. Reading through this
+section will give a good idea of the capabilities of the driver.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Option-summary" accesskey="1">Option summary</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Quick listing, from Dvips &ndash;help.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Option-details" accesskey="2">Option details</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">More information about each option.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Option-summary"></span><div class="header">
+<p>
+Next: <a href="#Option-details" accesskey="n" rel="next">Option details</a>, Up: <a href="#Command_002dline-options" accesskey="u" rel="up">Command-line options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Option-summary-1"></span><h4 class="subsection">3.2.1 Option summary</h4>
+
+<span id="index-options_002c-summary"></span>
+<p>Here is a handy summary of the options; it is printed out when you run
+Dvips with no arguments or with the standard &lsquo;<samp>--help</samp>&rsquo; option.
+<span id="index-_002d_002dhelp"></span>
+</p>
+<pre class="verbatim">Usage: dvips [OPTION]... FILENAME[.dvi]
+Convert DVI input files to PostScript.
+See http://tug.org/dvips/ for the full manual and other information.
+
+Options:
+-a* Conserve memory, not time -A Print only odd (TeX) pages
+-b # Page copies, for posters e.g. -B Print only even (TeX) pages
+-c # Uncollated copies -C # Collated copies
+-d # Debugging -D # Resolution
+-e # Maxdrift value -E* Try to create EPSF
+-f* Run as filter -F* Send control-D at end
+ -G* Shift low chars to higher pos.
+-h f Add header file
+-i* Separate file per section
+-j* Download fonts partially
+-k* Print crop marks -K* Pull comments from inclusions
+-l # Last page -L* Last special papersize wins
+-m* Manual feed -M* Don't make fonts
+-mode s Metafont device name
+-n # Maximum number of pages -N* No structured comments
+-noomega Disable Omega extensions
+-noptex Disable pTeX extensions
+-o f Output file -O c Set/change paper offset
+-p # First page -P s Load config.$s
+-pp l Print only pages listed
+-q* Run quietly
+-r* Reverse order of pages -R* Run securely
+-s* Enclose output in save/restore -S # Max section size in pages
+-t s Paper format -T c Specify desired page size
+-u s PS mapfile -U* Disable string param trick
+-v Print version number and quit -V* Send downloadable PS fonts as PK
+-x # Override dvi magnification -X # Horizontal resolution
+-y # Multiply by dvi magnification -Y # Vertical resolution
+-z* Hyper PS -Z* Compress bitmap fonts
+ # = number f = file s = string * = suffix, `0' to turn off
+ c = comma-separated dimension pair (e.g., 3.2in,-32.1cm)
+ l = comma-separated list of page ranges (e.g., 1-4,7-9)
+
+Email bug reports to tex-k@mail.tug.org.
+</pre>
+
+<hr>
+<span id="Option-details"></span><div class="header">
+<p>
+Previous: <a href="#Option-summary" accesskey="p" rel="prev">Option summary</a>, Up: <a href="#Command_002dline-options" accesskey="u" rel="up">Command-line options</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Option-details-1"></span><h4 class="subsection">3.2.2 Option details</h4>
+
+<span id="index-option_002c-details-of"></span>
+
+<p>Many of the parameterless options listed here can be turned off by
+suffixing the option with a zero (&lsquo;<samp>0</samp>&rsquo;); for instance, to turn off
+page reversal, use &lsquo;<samp>-r0</samp>&rsquo;. Such options are marked with a trailing
+&lsquo;<samp>*</samp>&rsquo;.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>-</samp>&rsquo;</dt>
+<dd><span id="index-_002d"></span>
+<span id="index-options_002c-reading-from-standard-input"></span>
+<span id="index-standard-input_002c-reading-options-from"></span>
+<p>Read additional options from standard input after processing the command
+line.
+</p>
+</dd>
+<dt>&lsquo;<samp>--help</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dhelp-1"></span>
+<p>Print a usage message and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp>--version</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dversion"></span>
+<p>Print the version number and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp>-a*</samp>&rsquo;</dt>
+<dd><span id="index-_002da"></span>
+<span id="index-memory_002c-conserving"></span>
+<p>Conserve memory by making three passes over the DVI file instead
+of two and only loading those characters actually used. Generally only
+useful on machines with a very limited amount of memory, like some PCs.
+</p>
+</dd>
+<dt>&lsquo;<samp>-A</samp>&rsquo;</dt>
+<dd><span id="index-_002dA"></span>
+<span id="index-odd-pages-only"></span>
+<p>Print only the odd pages. This option uses TeX
+page numbers, not physical page numbers.
+</p>
+</dd>
+<dt>&lsquo;<samp>-b <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002db-num"></span>
+<span id="index-_002f_0023copies"></span>
+<span id="index-copies_002c-duplicated-page-bodies"></span>
+<span id="index-color-separations"></span>
+<p>Generate <var>num</var> copies of each page, but duplicating the page body
+rather than using the &lsquo;<samp>/#copies</samp>&rsquo; PostScript variable. This can
+be useful in conjunction with a header file setting &lsquo;<samp>bop-hook</samp>&rsquo; to
+do color separations or other neat tricks.
+</p>
+</dd>
+<dt>&lsquo;<samp>-B</samp>&rsquo;</dt>
+<dd><span id="index-_002dB"></span>
+<span id="index-even-pages-only"></span>
+<span id="index-double_002dsided-printing"></span>
+<p>Print only the even pages. This option uses TeX page numbers, not
+physical page numbers.
+</p>
+</dd>
+<dt>&lsquo;<samp>-c <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dc-num"></span>
+<span id="index-_002f_0023copies-1"></span>
+<span id="index-copies_002c-uncollated"></span>
+<span id="index-uncollated-copies"></span>
+<p>Generate <var>num</var> consecutive copies of every page, i.e., the output is
+uncollated. This merely sets the builtin PostScript variable
+&lsquo;<samp>/#copies</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-C <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dC-num"></span>
+<span id="index-copies_002c-collated"></span>
+<span id="index-collated-copies"></span>
+<p>Generate <var>num</var> copies, but collated (by replicating the data in the
+PostScript file). Slower than the &lsquo;<samp>-c</samp>&rsquo; option, but easier on the
+hands, and faster than resubmitting the same PostScript file multiple
+times.
+</p>
+</dd>
+<dt>&lsquo;<samp>-d <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dd-num"></span>
+<span id="index-debugging-1"></span>
+<p>Set the debug flags, showing what Dvips (thinks it) is doing. This will
+work unless Dvips has been compiled without the &lsquo;<samp>DEBUG</samp>&rsquo; option (not
+recommended). See <a href="#Debug-options">Debug options</a>, for the possible values of
+<var>num</var>. Use &lsquo;<samp>-d -1</samp>&rsquo; as the first option for maximum output.
+</p>
+</dd>
+<dt>&lsquo;<samp>-D <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dD-num"></span>
+<span id="index-resolution_002c-setting"></span>
+<p>Set both the horizontal and vertical resolution to <var>num</var>, given in
+dpi (dots per inch). This affects the choice of bitmap fonts that are
+loaded and also the positioning of letters in resident PostScript
+fonts. Must be between 10 and 10000. This affects both the horizontal
+and vertical resolution. If a high resolution (something greater than
+400 dpi, say) is selected, the &lsquo;<samp>-Z</samp>&rsquo; flag should probably also be
+used. If you are using fonts made with Metafont, such as Computer
+Modern, <samp>mktexpk</samp> needs to know about the value for <var>num</var>
+that you use or Metafont will fail. See the file
+<a href="ftp://ftp.tug.org/tex/modes.mf">ftp://ftp.tug.org/tex/modes.mf</a> for a list of resolutions and mode
+names for most devices.
+</p>
+</dd>
+<dt>&lsquo;<samp>-e <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002de-num"></span>
+<span id="index-maxdrift"></span>
+<span id="index-accuracy-in-positioning"></span>
+<span id="index-positioning-accuracy"></span>
+<p>Maximum drift in pixels of each character from its &lsquo;true&rsquo;
+resolution-independent position on the page. The default value of this
+parameter is resolution dependent (it is the number of entries in the
+list [100, 200, 300, 400, 500, 600, 800, 1000, 1200, 1600, 2000, 2400,
+2800, 3200, &hellip;] that are less than or equal to the resolution in
+dots per inch). Allowing individual characters to &lsquo;drift&rsquo; from their
+correctly rounded positions by a few pixels, while regaining the true
+position at the beginning of each new word, improves the spacing of
+letters in words.
+</p>
+</dd>
+<dt>&lsquo;<samp>-E*</samp>&rsquo;</dt>
+<dd><span id="index-_002dE"></span>
+<span id="index-EPSF_002c-generating"></span>
+<span id="index-tight-bounding-box_002c-finding"></span>
+<span id="index-bounding-box_002c-finding-tight"></span>
+<p>Generate an EPSF file with a tight bounding box. This only looks at
+marks made by characters and rules, not by any included graphics. In
+addition, it gets the glyph metrics from the TFM file, so characters
+that print outside their enclosing TFM box may confuse it. In addition,
+the bounding box might be a bit too loose if the character glyph has
+significant left or right side bearings. Nonetheless, this option works
+well enough for creating small EPSF files for equations or tables or the
+like. (Of course, Dvips output, especially when using bitmap fonts, is
+resolution-dependent and thus does not make very good EPSF files,
+especially if the images are to be scaled; use these EPSF files with
+care.) For multiple page input files, also specify &lsquo;<samp>-i</samp>&rsquo; to get
+each page as a separate EPSF file; otherwise, all the pages are overlaid
+in the single output file.
+</p>
+</dd>
+<dt>&lsquo;<samp>-f*</samp>&rsquo;</dt>
+<dd><span id="index-_002df"></span>
+<span id="index-filter_002c-running-as-a"></span>
+<span id="index-standard-I_002fO"></span>
+<span id="index-pipes_002c-not-readable"></span>
+<span id="index-PRINTER_002c-avoided-with-_002df"></span>
+<p>Run as a filter. Read the DVI file from standard input and write the
+PostScript to standard output. The standard input must be seekable, so
+it cannot be a pipe. If your input must be a pipe, write a shell script
+that copies the pipe output to a temporary file and then points Dvips at
+this file. This option also disables the automatic reading of the
+<code>PRINTER</code> environment variable; use &lsquo;<samp>-P$PRINTER</samp>&rsquo; after the
+&lsquo;<samp>-f</samp>&rsquo; to read it anyway. It also turns off the automatic sending of
+control-D if it was turned on with the &lsquo;<samp>-F</samp>&rsquo; option or in the
+configuration file; use &lsquo;<samp>-F</samp>&rsquo; after the &lsquo;<samp>-f</samp>&rsquo; to send it anyway.
+</p>
+</dd>
+<dt>&lsquo;<samp>-F*</samp>&rsquo;</dt>
+<dd><span id="index-_002dF"></span>
+<span id="index-EOF"></span>
+<span id="index-control_002dD"></span>
+<span id="index-printer_002c-driving-directly"></span>
+<span id="index-spooler_002c-lacking"></span>
+<p>Write control-D (ASCII code 4) as the very last character of the
+PostScript file. This is useful when Dvips is driving the printer
+directly instead of working through a spooler, as is common on personal
+systems. On systems shared by more than one person, this is not
+recommended.
+</p>
+</dd>
+<dt>&lsquo;<samp>-G*</samp>&rsquo;</dt>
+<dd><span id="index-_002dG"></span>
+<span id="index-low-characters_002c-shifting"></span>
+<span id="index-non_002dprinting-characters_002c-shifting"></span>
+<p>Shift non-printing characters (ASCII 0-32, 127) to higher-numbered positions.
+This was useful to work around bugs in old versions of Adobe&rsquo;s PDF
+reader. It&rsquo;s more likely to cause problems nowadays.
+</p>
+</dd>
+<dt>&lsquo;<samp>-h <var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dh-name"></span>
+<span id="index-header-file_002c-downloading"></span>
+<span id="index-userdict_002c-used-for-header-files"></span>
+<p>Prepend <var>name</var> as an additional header file, or, if <var>name</var> is
+&lsquo;<samp>-</samp>&rsquo;, suppress all header files. Any definitions in the header file
+get added to the PostScript &lsquo;<samp>userdict</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-i*</samp>&rsquo;</dt>
+<dd><span id="index-_002di"></span>
+<span id="index-sections-output_002c-in-separate-files"></span>
+<span id="index-multiple-output-files"></span>
+<span id="index-output-files_002c-multiple"></span>
+<p>Make each section be a separate file; a <em>section</em> is a part of the
+document processed independently, most often created to avoid memory
+overflow. The filenames are created replacing the suffix of the
+supplied output file name by a three-digit sequence number. This option
+is most often used in conjunction with the &lsquo;<samp>-S</samp>&rsquo; option which sets
+the maximum section length in pages; if &lsquo;<samp>-i</samp>&rsquo; is specified and
+&lsquo;<samp>-S</samp>&rsquo; is not, each page is output as a separate file. For instance,
+some phototypesetters cannot print more than ten or so consecutive pages
+before running out of steam; these options can be used to automatically
+split a book into ten-page sections, each to its own file.
+</p>
+<p>On the other hand, if your document uses very large fonts or very
+large included figures, Dvips might take it upon itself to split the
+output into unwanted sections, to try to avoid overflowing printer
+memory. See <a href="#Headers-and-memory-usage">Headers and memory usage</a>, for ways to handle this.
+</p>
+</dd>
+<dt>&lsquo;<samp>-j*</samp>&rsquo;</dt>
+<dd><span id="index-_002dj-for-partial-font-downloading"></span>
+<p>Download only needed characters from Type 1 fonts. This is the
+default in the current release. Some debugging flags trace this operation
+(see <a href="#Debug-options">Debug options</a>). You can also control partial downloading on a
+per-font basis (see <a href="#psfonts_002emap">psfonts.map</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>-k*</samp>&rsquo;</dt>
+<dd><span id="index-_002dk-for-cropmarks"></span>
+<span id="index-cropmarks"></span>
+<span id="index-crop_002epro"></span>
+<p>Print crop marks. This option increases the paper size (which should be
+specified, either with a paper size special or with the &lsquo;<samp>-T</samp>&rsquo;
+option) by a half inch in each dimension. It translates each page by a
+quarter inch and draws cross-style crop marks. It is mostly useful with
+typesetters that can set the page size automatically. This works by
+downloading <samp>crop.pro</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-K*</samp>&rsquo;</dt>
+<dd><span id="index-_002dK"></span>
+<span id="index-comments_002c-removing-included"></span>
+<span id="index-_0025_0025Page_002c-removing"></span>
+<p>Remove comments in included PostScript graphics, font files, and
+headers; only necessary to get around bugs in spoolers or PostScript
+post-processing programs. Specifically, the &lsquo;<samp>%%Page</samp>&rsquo;
+comments, when left in, often cause difficulties. Use of this flag can
+cause other graphics to fail, however, since the PostScript header
+macros from some software packages read portion the input stream line by
+line, searching for a particular comment.
+</p>
+</dd>
+<dt>&lsquo;<samp>-l [=]<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dl-_005b_003d_005dnum"></span>
+<span id="index-last-page-printed"></span>
+<span id="index-page_002c-last-printed"></span>
+<span id="index-physical-page-number_002c-and-_002dl"></span>
+<span id="index-absolute-page-number_002c-and-_002dl"></span>
+<p>The last page printed will be the first one numbered <var>num</var>. Default
+is the last page in the document. If <var>num</var> is prefixed by an equals
+sign, then it (and the argument to the &lsquo;<samp>-p</samp>&rsquo; option, if specified)
+is treated as a physical (absolute) page number, rather than a value to
+compare with the TeX &lsquo;<samp>\count0</samp>&rsquo; values stored in the DVI file.
+Thus, using &lsquo;<samp>-l =9</samp>&rsquo; will end with the ninth page of the document,
+no matter what the pages are actually numbered.
+</p>
+</dd>
+<dt>&lsquo;<samp>-L*</samp>&rsquo;</dt>
+<dd><span id="index-_002dL"></span>
+<span id="index-papersize-special_002c-first-vs_002e-last"></span>
+<p>By default or with <code>-L1</code>, the last &lsquo;<samp>papersize</samp>&rsquo; special wins;
+with <code>-L0</code>, the first special wins. See <a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-m*</samp>&rsquo;</dt>
+<dd><span id="index-_002dm"></span>
+<span id="index-manual-feed"></span>
+<p>Specify manual feed, if supported by the output device.
+</p>
+</dd>
+<dt>&lsquo;<samp>-mode <var>mode</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dmode-mode"></span>
+<span id="index-_002dmode"></span>
+<span id="index-mode-name_002c-specifying"></span>
+<span id="index-Metafont-mode_002c-specifying"></span>
+<p>Use <var>mode</var> as the Metafont device name for path searching and font
+generation. This overrides any value from configuration files. With
+the default paths, explicitly specifying the mode also makes the program
+assume the fonts are in a subdirectory named <var>mode</var>.
+See <a href="https://tug.org/texinfohtml/kpathsea.html#TeX-directory-structure">TeX directory structure</a> in <cite>Kpathsea</cite>. If Metafont does not understand the <var>mode</var> name, see
+<a href="https://tug.org/texinfohtml/kpathsea.html#Unable-to-generate-fonts">Unable to generate fonts</a> in <cite>Kpathsea</cite>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-M*</samp>&rsquo;</dt>
+<dd><span id="index-_002dM"></span>
+<span id="index-font-generation_002c-avoiding"></span>
+<span id="index-mktexpk_002c-avoiding"></span>
+<span id="index-missfont_002elog"></span>
+<p>Turns off automatic font generation (<samp>mktexpk</samp>). If
+<code>mktexpk</code>, the invocation is appended to a file
+<samp>missfont.log</samp> (by default) in the current directory. You can then
+execute the log file to create the missing files after fixing the
+problem.
+<span id="index-TEXMFOUTPUT"></span>
+<span id="index-MISSFONT_005fLOG"></span>
+If the current directory is not writable and the environment variable or
+configuration file value &lsquo;<samp>TEXMFOUTPUT</samp>&rsquo; is set, its value is used.
+Otherwise, nothing is written. The name &lsquo;<samp>missfont.log</samp>&rsquo; is
+overridden by the &lsquo;<samp>MISSFONT_LOG</samp>&rsquo; environment variable or
+configuration file value.
+</p>
+</dd>
+<dt>&lsquo;<samp>-n <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dn-num"></span>
+<span id="index-maximum-pages-printed"></span>
+<span id="index-pages_002c-maximum-printed"></span>
+<p>Print at most <var>num</var> pages. Default is 100000.
+</p>
+</dd>
+<dt>&lsquo;<samp>-N*</samp>&rsquo;</dt>
+<dd><span id="index-_002dN"></span>
+<span id="index-structured-comments"></span>
+<span id="index-TranScript"></span>
+<span id="index-_0025_0025Page_002c-not-generating"></span>
+<p>Turns off generation of structured comments such as &lsquo;<samp>%%Page</samp>&rsquo;; this
+may be necessary on some systems that try to interpret PostScript
+comments in weird ways, or on some PostScript printers. Old versions of
+TranScript in particular cannot handle modern Encapsulated PostScript.
+Beware: This also disables page movement, etc., in PostScript viewers
+such as Ghostview.
+</p>
+</dd>
+<dt>&lsquo;<samp>-noomega</samp>&rsquo;</dt>
+<dd><span id="index-_002dnoomega"></span>
+<span id="index-Omega-extensions"></span>
+<span id="index-pTeX-extensions"></span>
+<p>Disable the use of Omega extensions when interpreting DVI
+files. By default, the additional opcodes &lsquo;<samp>129</samp>&rsquo; and &lsquo;<samp>134</samp>&rsquo;
+are recognized by Dvips as Omega or pTeX extensions and interpreted as
+requests to set 2-byte characters.
+</p>
+</dd>
+<dt>&lsquo;<samp>-noptex</samp>&rsquo;</dt>
+<dd><span id="index-_002dnoptex"></span>
+<span id="index-pTeX-extensions-1"></span>
+<p>Disable the use of pTeX extensions when interpreting DVI files. By
+default, the additional opcodes &lsquo;<samp>130</samp>&rsquo; and &lsquo;<samp>135</samp>&rsquo; are
+recognized by Dvips as Omega extensions and interpreted as requests to
+set 3-byte characters, and &lsquo;<samp>255</samp>&rsquo; as request to change the
+typesetting direction.
+</p>
+<p>The only drawback is that the virtual font array will (at least
+temporarily) require 65536 or more positions instead of the default
+256 positions, i.e., the memory requirements of Dvips will be somewhat
+larger. If you find this unacceptable or encounter another problem
+with the Omega or pTeX extensions, you can switch off the pTeX
+extension by using &lsquo;<samp>-noptex</samp>&rsquo;, or both by using &lsquo;<samp>-noomega</samp>&rsquo;
+(but please do send a bug report if you find such problems,
+see <a href="https://tug.org/texinfohtml/kpathsea.html#Bugs">Bugs</a> in <cite>Kpathsea</cite>).
+</p>
+</dd>
+<dt>&lsquo;<samp>-o <var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002do-name"></span>
+<span id="index-output_002c-redirecting"></span>
+<span id="index-standard-output_002c-output-to"></span>
+<p>Send output to the file <var>name</var>. If &lsquo;<samp>-o</samp>&rsquo; is specified without
+<var>name</var> (i.e., it is the last thing on the command line), the
+default is &lsquo;<samp><var>file</var>.ps</samp>&rsquo; where the input DVI file was
+&lsquo;<samp><var>file</var>.dvi</samp>&rsquo;. If &lsquo;<samp>-o</samp>&rsquo; isn&rsquo;t given at all, the
+configuration file default is used.
+</p>
+<span id="index-popen-for-output"></span>
+<span id="index-_002d-as-output-filename"></span>
+<span id="index-_0021-starting-output-filename"></span>
+<span id="index-_007c-starting-output-filename"></span>
+<span id="index-lpr-spooler_002c-MS_002dDOS-emulation"></span>
+<span id="index-spooling-to-lpr-on-MS_002dDOS"></span>
+<p>If <var>name</var> is &lsquo;<samp>-</samp>&rsquo;, output goes to standard output. If the first
+character of <var>name</var> is &lsquo;<samp>!</samp>&rsquo; or &lsquo;<samp>|</samp>&rsquo;, then the remainder will
+be used as an argument to <code>popen</code>; thus, specifying &lsquo;<samp>|lpr</samp>&rsquo; as
+the output file will automatically queue the file for printing as
+usual. (The MS-DOS version will print to the local printer device
+<samp>PRN</samp> when <var>name</var> is &lsquo;<samp>|lpr</samp>&rsquo; and a program by that name
+cannot be found.)
+</p>
+<p>&lsquo;<samp>-o</samp>&rsquo; disables the automatic reading of the <code>PRINTER</code>
+environment variable, and turns off the automatic sending of control-D.
+See the &lsquo;<samp>-f</samp>&rsquo; option for how to override this.
+</p>
+</dd>
+<dt>&lsquo;<samp>-O <var>x-offset</var>,<var>y-offset</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dO-x_002doffset_002cy_002doffset"></span>
+<span id="index-offset-pages"></span>
+<span id="index-printer-offset"></span>
+<p>Move the origin by <var>x-offset</var>,<var>y-offset</var>, a comma-separated
+pair of dimensions such as &lsquo;<samp>.1in,-.3cm</samp>&rsquo; (see <a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a>). The origin of the page is shifted from the default position
+(of one inch down, one inch to the right from the upper left corner of
+the paper) by this amount. This is usually best specified in the
+printer-specific configuration file.
+</p>
+<span id="index-testpage_002etex"></span>
+<p>This is useful for a printer that consistently offsets output pages by a
+certain amount. You can use the file <samp>testpage.tex</samp> to determine
+the correct value for your printer. Be sure to do several runs with the
+same <code>O</code> value&mdash;some printers vary widely from run to run.
+</p>
+<span id="index-bop_002dhook_002c-and-offset-pages"></span>
+<p>If your printer offsets every other page consistently, instead of every
+page, your best recourse is to use &lsquo;<samp>bop-hook</samp>&rsquo; (see <a href="#PostScript-hooks">PostScript hooks</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>-p [=]<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dp-_005b_003d_005dnum"></span>
+<span id="index-first-page-printed"></span>
+<span id="index-page_002c-first-printed"></span>
+<span id="index-physical-page-number_002c-and-_002dp"></span>
+<span id="index-absolute-page-number_002c-and-_002dp"></span>
+<p>The first page printed will be the first one numbered <var>num</var>. Default
+is the first page in the document. If <var>num</var> is prefixed by an
+equals sign, then it (and the argument to the &lsquo;<samp>-l</samp>&rsquo; option, if
+specified) is treated as a physical (absolute) page number, rather than
+a value to compare with the TeX &lsquo;<samp>\count0</samp>&rsquo; values stored in the
+DVI file. Thus, using &lsquo;<samp>-p =3</samp>&rsquo; will start with the third page of
+the document, no matter what the pages are actually numbered.
+</p>
+</dd>
+<dt>&lsquo;<samp>-pp <var>first</var>-<var>last</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dpp-first_002dlast"></span>
+<span id="index-page-range"></span>
+<span id="index-_002dpp-range"></span>
+<p>Print pages <var>first</var> through <var>last</var>; equivalent to &lsquo;<samp>-p
+<var>first</var> -l <var>last</var></samp>&rsquo;, except that multiple &lsquo;<samp>-pp</samp>&rsquo; options
+accumulate, unlike &lsquo;<samp>-p</samp>&rsquo; and &lsquo;<samp>-l</samp>&rsquo;. The &lsquo;<samp>-</samp>&rsquo; separator can
+also be &lsquo;<samp>:</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-P <var>printer</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dP-printer"></span>
+<span id="index-config_002eps"></span>
+<p>Read the configuration file <samp>config.<var>printer</var></samp>
+(<samp><var>printer</var>.cfg</samp> on MS-DOS), which typically sets the output
+name (most likely &lsquo;<samp>o |lpr -P<var>printer</var></samp>&rsquo;), resolution, Metafont
+mode, and perhaps other printer-specific defaults. It works best to
+put sitewide defaults in the one master &lsquo;<samp>config.ps</samp>&rsquo; file and only
+things that vary from printer to printer in the
+&lsquo;<samp>config.<var>printer</var></samp>&rsquo; files; &lsquo;<samp>config.ps</samp>&rsquo; is read before
+&lsquo;<samp>config.<var>printer</var></samp>&rsquo;.
+</p>
+<p>A configuration file for eventual creation of Adobe PDF files is
+provided in &lsquo;<samp>config.pdf</samp>&rsquo; and thus can be loaded with
+&lsquo;<samp>-Ppdf</samp>&rsquo;. It will try to include Type 1 outline fonts into the
+PostScript file (see <a href="#Hypertext-caveats">Hypertext caveats</a>).
+</p>
+<p>If no &lsquo;<samp>-P</samp>&rsquo; or &lsquo;<samp>-o</samp>&rsquo; is given, the environment variable
+<code>PRINTER</code> is checked. If that variable exists, and a corresponding
+<samp>config.<var>printer</var></samp> (<samp><var>printer</var>.cfg</samp> on MS-DOS) file
+exists, it is read.
+See <a href="#Configuration-file-searching">Configuration file searching</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-q*</samp>&rsquo;</dt>
+<dd><span id="index-_002dq"></span>
+<span id="index-quiet-operation"></span>
+<span id="index-silent-operation"></span>
+<span id="index-warnings_002c-suppressing"></span>
+<p>Run quietly. Don&rsquo;t chatter about pages converted, etc.,
+and report no warnings (only errors) to standard error.
+</p>
+</dd>
+<dt>&lsquo;<samp>-r*</samp>&rsquo;</dt>
+<dd><span id="index-_002dr"></span>
+<span id="index-reverse-pagination"></span>
+<p>Output pages in reverse order. By default, page 1 is output first.
+</p>
+</dd>
+<dt>&lsquo;<samp>-R</samp>&rsquo;</dt>
+<dd><span id="index-_002dR"></span>
+<span id="index-security"></span>
+<span id="index-shell-command-execution_002c-disabling"></span>
+<span id="index-absolute-filenames_002c-disabling"></span>
+<span id="index-_002e_002e_002drelative-filenames"></span>
+<p>Run securely. &lsquo;<samp>-R2</samp>&rsquo; disables both shell command execution in
+<code>\special</code> (via &lsquo;<samp>`</samp>&rsquo;, see <a href="#Dynamic-creation-of-graphics">Dynamic creation of graphics</a>)
+and config files (via the &lsquo;<samp>E</samp>&rsquo; option, see <a href="#Configuration-file-commands">Configuration file commands</a>) and opening of any absolute or <samp>..</samp>-relative
+filenames. &lsquo;<samp>-R1</samp>&rsquo;, the default, forbids shell escapes but allows
+absolute filenames. &lsquo;<samp>-R0</samp>&rsquo; allows both.
+</p>
+</dd>
+<dt>&lsquo;<samp>-s*</samp>&rsquo;</dt>
+<dd><span id="index-_002ds"></span>
+<span id="index-save_002frestore_002c-generating-global"></span>
+<p>Enclose the output in a global save/restore pair. This causes the file
+to not be truly conformant, and is thus not recommended, but is useful
+if you are driving a deficient printer directly and thus don&rsquo;t care too
+much about the portability of the output to other environments.
+</p>
+</dd>
+<dt>&lsquo;<samp>-S <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dS-num"></span>
+<p>Set the maximum number of pages in each &lsquo;section&rsquo;. This option is most
+commonly used with the &lsquo;<samp>-i</samp>&rsquo; option; see its description above for
+more information.
+</p>
+</dd>
+<dt>&lsquo;<samp>-t <var>papertype</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dt-papertype"></span>
+<span id="index-paper-type"></span>
+<span id="index-media"></span>
+<span id="index-letter-papertype"></span>
+<span id="index-legal-papertype"></span>
+<span id="index-ledger-papertype"></span>
+<span id="index-a4-papertype"></span>
+<span id="index-a3-papertype"></span>
+<span id="index-landscape-papertype"></span>
+<span id="index-papersize-special_002c-and-no-_002dt"></span>
+<p>Set the paper type to <var>papertype</var>, usually defined in one of the
+configuration files, along with the appropriate PostScript code to
+select it (see <a href="#Config-file-paper-sizes">Config file paper sizes</a>).
+</p><ul class="no-bullet">
+<li>- You can also specify a <var>papertype</var> of &lsquo;<samp>landscape</samp>&rsquo;,
+which rotates a document by 90 degrees.
+</li><li>- To rotate a document whose paper type is not the default, you
+can use the &lsquo;<samp>-t</samp>&rsquo; option twice, once for the paper type, and once
+for &lsquo;<samp>landscape</samp>&rsquo;.
+</li><li>- In general, you should not use any &lsquo;<samp>-t</samp>&rsquo; option when
+using a &lsquo;<samp>papersize</samp>&rsquo; special, which some LaTeX packages (e.g.,
+&lsquo;<samp>hyperref</samp>&rsquo;) insert.
+</li><li>- One exception is when using a nonstandard paper size that is not
+already defined in <samp>config.ps</samp>; in this case, you need to specify
+&lsquo;<samp>-t&nbsp;unknown</samp>&rsquo;.
+</li><li>- Another exception is when producing multi-page files for further
+processing; use &lsquo;<samp>-t&nbsp;nopaper</samp>&rsquo; to omit any paper size
+information in the output. (If you just have a single page document,
+you can use &lsquo;<samp>-E</samp>&rsquo; to get pure EPSF output.)
+</li></ul>
+
+</dd>
+<dt>&lsquo;<samp>-T <var>hsize</var>,<var>vsize</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dT-hsize_002cvsize"></span>
+<p>Set the paper size to (<var>hsize</var>,<var>vsize</var>), a comma-separated
+pair of dimensions such as &lsquo;<samp>.1in,-.3cm</samp>&rsquo; (see <a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a>). It overrides any paper size special in the DVI file. Be
+careful, as the paper size will stick to a predefined size if there is
+one close enough. To disable this behavior, use &lsquo;<samp>-tunknown</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-u <var>psmapfile</var></samp>&rsquo;</dt>
+<dd><span id="index-_002du-psmapfile"></span>
+<span id="index-PostScript-font-alias-file"></span>
+<span id="index-resident-fonts_002c-different-in-different-printers"></span>
+<p>Set <var>psmapfile</var> to be the file that dvips uses for looking up
+PostScript font aliases. If <var>psmapfile</var> begins with a &lsquo;<samp>+</samp>&rsquo;
+character, then the rest of the name is used as the name of the map file,
+and the map file is appended to the list of map files (instead of replacing
+the list). In either case, if the name has no extension, then &lsquo;<samp>.map</samp>&rsquo;
+is added at the end.
+</p>
+</dd>
+<dt>&lsquo;<samp>-U*</samp>&rsquo;</dt>
+<dd><span id="index-_002dU"></span>
+<span id="index-Xerox-4045"></span>
+<p>Disable a PostScript virtual memory-saving optimization that stores the
+character metric information in the same string that is used to store
+the bitmap information. This is only necessary when driving the Xerox
+4045 PostScript interpreter, which has a bug that puts garbage on the
+bottom of each character. Not recommended unless you must drive this
+printer.
+</p>
+</dd>
+<dt>&lsquo;<samp>-v</samp>&rsquo;</dt>
+<dd><span id="index-_002dv"></span>
+<p>Print the dvips version number and exit.
+</p>
+</dd>
+<dt>&lsquo;<samp>-V*</samp>&rsquo;</dt>
+<dd><span id="index-_002dV"></span>
+<p>Download non-resident PostScript fonts as bitmaps. This requires use
+<span id="index-mtpk"></span>
+<span id="index-gsftopk"></span>
+<span id="index-pstopk"></span>
+of <code>mtpk</code> or <code>gsftopk</code> or <code>pstopk</code> or some combination
+thereof to generate the required bitmap fonts; these programs are
+supplied with Dvips. The bitmap must be put into <samp>psfonts.map</samp> as
+the downloadable file for that font. This is useful only for those
+fonts for which you do not have real outlines, being downloaded to
+printers that have no resident fonts, i.e., very rarely.
+</p>
+
+</dd>
+<dt>&lsquo;<samp>-x <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dx-num"></span>
+<span id="index-magnification_002c-overriding-DVI"></span>
+<p>Set the magnification ratio to <em><var>num</var>/1000</em>. Overrides
+the magnification specified in the DVI file. Must be between 10 and
+100000. It is recommended that you use standard magstep values (1095,
+1200, 1440, 1728, 2074, 2488, 2986, and so on) to help reduce the total
+number of PK files generated. <var>num</var> may be a real number, not an
+integer, for increased precision.
+</p>
+</dd>
+<dt>&lsquo;<samp>-X <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dX-num"></span>
+<span id="index-resolution"></span>
+<p>Set the horizontal resolution in dots per inch to <var>num</var>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-y <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-magnification_002c-vertical"></span>
+<p>Set the magnification ratio to <em><var>num</var>/1000</em> times the
+magnification specified in the DVI file. See
+&lsquo;<samp>-x</samp>&rsquo; above.
+</p>
+</dd>
+<dt>&lsquo;<samp>-Y <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dY-num"></span>
+<p>Set the vertical resolution in dots per inch to <var>num.</var>
+<span id="index-resolution-1"></span>
+</p>
+</dd>
+<dt>&lsquo;<samp>-z*</samp>&rsquo;</dt>
+<dd><span id="index-_002dz-for-recognizing-hyperdvi"></span>
+<span id="index-hyperdvi-extensions_002c-enabling"></span>
+<span id="index-distillation_002c-and-_002dz"></span>
+<span id="index-PDF-files_002c-option-for"></span>
+<span id="index-html-specials_002c-and-_002dz"></span>
+<p>Pass &lsquo;<samp>html</samp>&rsquo; hyperdvi specials through to the output for eventual
+distillation into PDF. This is not enabled by default to avoid
+including the header files unnecessarily, and use of temporary files in
+creating the output. See <a href="#Hypertext">Hypertext</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-Z*</samp>&rsquo;</dt>
+<dd><span id="index-_002dZ-for-compressing-bitmap-fonts"></span>
+<span id="index-compressing-bitmap-fonts"></span>
+<p>Compress bitmap fonts in the output file, thereby reducing the size of
+what gets downloaded. Especially useful at high resolutions or when
+very large fonts are used. May slow down printing, especially on early
+68000-based PostScript printers. Generally recommend today, and can be
+enabled in the configuration file (see <a href="#Configuration-file-commands">Configuration file commands</a>).
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Environment-variables"></span><div class="header">
+<p>
+Next: <a href="#Config-files" accesskey="n" rel="next">Config files</a>, Previous: <a href="#Command_002dline-options" accesskey="p" rel="prev">Command-line options</a>, Up: <a href="#Invoking-Dvips" accesskey="u" rel="up">Invoking Dvips</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Environment-variables-1"></span><h3 class="section">3.3 Environment variables</h3>
+
+<span id="index-environment-variables"></span>
+
+<p>Dvips looks for many environment variables, to define search paths and
+other things. The path variables are read as needed, after all
+configuration files are read, so they override values in the
+configuration files. (Except for <code>TEXCONFIG</code>, which defines where
+the configuration files themselves are found.)
+</p>
+<p>See <a href="https://tug.org/texinfohtml/kpathsea.html#Path-specifications">Path specifications</a> in <cite>Kpathsea</cite>, for details of
+interpretation of path and other environment variables common to all
+Kpathsea-using programs. Only the environment variables specific to
+Dvips are mentioned here.
+</p>
+<dl compact="compact">
+<dt><code>DVIPSDEBUG</code>
+<span id="index-DVIPSDEBUG"></span>
+</dt>
+<dd><span id="index-KPATHSEA_005fDEBUG"></span>
+<p>Write the absolute path names of any configuration or map files to
+standard output, for debugging. This isn&rsquo;t done by default because
+these files are read even before the banner is printed. For
+voluminous additional debugging, set the environment variable
+<code>KPATHSEA_DEBUG</code> to &lsquo;<samp>-1</samp>&rsquo;
+(see <a href="https://tug.org/texinfohtml/kpathsea.html#Debugging">Debugging</a> in <cite>Kpathsea</cite>). (If <code>KPATHSEA_DEBUG</code> is
+set to any value, it automatically turns on <code>DVIPSDEBUG</code>.)
+</p>
+</dd>
+<dt><code>DVIPSFONTS</code>
+<span id="index-DVIPSFONTS"></span>
+</dt>
+<dd><p>Default path to search for all fonts. Overrides all the font path
+config file options and other environment variables (see <a href="https://tug.org/texinfohtml/kpathsea.html#Supported-file-formats">Supported
+file formats</a> in <cite>Kpathsea</cite>).
+</p>
+</dd>
+<dt><code>DVIPSHEADERS</code>
+<span id="index-DVIPSHEADERS"></span>
+</dt>
+<dd><p>Default path to search for PostScript header files. Overrides the &lsquo;<samp>H</samp>&rsquo;
+config file option (see <a href="#Configuration-file-commands">Configuration file commands</a>).
+</p>
+</dd>
+<dt><code>DVIPSMAKEPK</code>
+<span id="index-DVIPSMAKEPK"></span>
+</dt>
+<dd><span id="index-mktexpk_002c-changing-name"></span>
+<p>Overrides &lsquo;<samp>mktexpk</samp>&rsquo; as the name of the program to invoke to
+create missing PK fonts. You can change the arguments passed to the
+<code>mktexpk</code> program with the <code>MAKETEXPK</code> environment
+variable; see <a href="https://tug.org/texinfohtml/kpathsea.html#MakeTeX-script-arguments">MakeTeX script arguments</a> in <cite>Kpathsea</cite>.
+</p>
+</dd>
+<dt><code>DVIPSRC</code>
+<span id="index-DVIPSRC"></span>
+</dt>
+<dd><p>Specifies the name of the startup file (see <a href="#Configuration-file-searching">Configuration file searching</a>) which is read after <samp>config.ps</samp> but before any
+printer-specific configuration files.
+</p>
+</dd>
+<dt><code>DVIPSSIZES</code>
+<span id="index-DVIPSSIZES"></span>
+</dt>
+<dd><span id="index-last_002dresort-font-scaling_002c-with-DVIPSSIZES"></span>
+<p>Last-resort sizes for scaling of unfound fonts. Overrides the &lsquo;<samp>R</samp>&rsquo;
+definition in config files (see <a href="#Configuration-file-commands">Configuration file commands</a>).
+</p>
+</dd>
+<dt><code>PRINTER</code>
+<span id="index-PRINTER"></span>
+</dt>
+<dd><p>Determine the default printer configuration file. (Dvips itself does
+not use <code>PRINTER</code> to determine the output destination in any way.)
+</p>
+</dd>
+<dt><code>TEXCONFIG</code>
+<span id="index-TEXCONFIG"></span>
+</dt>
+<dd><span id="index-configuration-file-path"></span>
+<p>Path to search for Dvips&rsquo; <samp>config.<var>printer</var></samp> configuration
+files, including the base <samp>config.ps</samp>. Using this single
+environment variable, you can override everything else. (The
+printer-specific configuration files are called <samp><var>printer</var>.cfg</samp>
+on MS-DOS, but <samp>config.ps</samp> is called by that name on all
+platforms.)
+</p>
+</dd>
+<dt><code>TEXPICTS</code>
+<span id="index-TEXPICTS"></span>
+</dt>
+<dd><p>Path to search for included graphics files. Overrides the &lsquo;<samp>S</samp>&rsquo;
+config file option (see <a href="#Configuration-file-commands">Configuration file commands</a>). If not set,
+<code>TEXINPUTS</code> is looked for. See <a href="https://tug.org/texinfohtml/kpathsea.html#Supported-file-formats">Supported file formats</a> in <cite>Kpathsea</cite>.
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Config-files"></span><div class="header">
+<p>
+Previous: <a href="#Environment-variables" accesskey="p" rel="prev">Environment variables</a>, Up: <a href="#Invoking-Dvips" accesskey="u" rel="up">Invoking Dvips</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Dvips-configuration-files"></span><h3 class="section">3.4 Dvips configuration files</h3>
+
+<span id="index-configuration-files"></span>
+
+<p>This section describes in detail the Dvips-specific <samp>config.*</samp>
+device configuration files (called <samp>*.cfg</samp> on MS-DOS), which
+override the <samp>texmf.cnf</samp>
+configuration files generic to Kpathsea which Dvips also reads
+(see <a href="https://tug.org/texinfohtml/kpathsea.html#Config-files">Config files</a> in <cite>Kpathsea</cite>).
+</p>
+<p>For information about installing these files, including a prototype file
+you can copy, see <a href="#config_002eps-installation">config.ps installation</a>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Configuration-file-searching" accesskey="1">Configuration file searching</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Where config.* files are searched for.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Configuration-file-commands" accesskey="2">Configuration file commands</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">What can go in a config.* file.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Configuration-file-searching"></span><div class="header">
+<p>
+Next: <a href="#Configuration-file-commands" accesskey="n" rel="next">Configuration file commands</a>, Up: <a href="#Config-files" accesskey="u" rel="up">Config files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Configuration-file-searching-1"></span><h4 class="subsection">3.4.1 Configuration file searching</h4>
+
+<span id="index-configuration-file-searching"></span>
+<span id="index-searching-config-files_002c-order-of"></span>
+
+<p>The Dvips program loads many different configuration files, so that
+parameters can be set globally across the system, on a per-device basis,
+or individually by each user.
+</p>
+<ol>
+<li> <span id="index-config_002eps_002c-searched-for"></span>
+Dvips first reads (if it exists) <samp>config.ps</samp>; it is searched for
+along the path for Dvips configuration files, as described in
+<a href="https://tug.org/texinfohtml/kpathsea.html#Supported-file-formats">Supported file formats</a> in <cite>Kpathsea</cite>.
+
+</li><li> <span id="index-_002edvipsrc_002c-searched-for"></span>
+A user-specific startup file is loaded, so individual users can override
+any options set in the global file. The environment variable
+<code>DVIPSRC</code>, if defined, is used as the specification of the startup
+file. If this variable is undefined, Dvips uses a platform-specific
+default name. On Unix Dvips looks for the default startup file under
+the name <samp>$HOME/.dvipsrc</samp>, which is in the user&rsquo;s home directory.
+On MS-DOS and MS-Windows, where users generally don&rsquo;t have their private
+directories, the startup file is called <samp>dvips.ini</samp> and it is
+searched for along the path for Dvips configuration files (as described
+in <a href="https://tug.org/texinfohtml/kpathsea.html#Supported-file-formats">Supported file formats</a> in <cite>Kpathsea</cite>.); users are
+expected to set this path as they see fit for their taste.
+
+</li><li> <span id="index-_002dPprinter_002c-and-config-file-searching"></span>
+The command line is read and parsed: if the &lsquo;<samp>-P<var>device</var></samp>&rsquo; option
+is encountered, at that point <samp>config.<var>device</var></samp> is loaded.
+Thus, the printer configuration file can override anything in the
+site-wide or user configuration file, and it can also override options
+in the command line up to the point that the &lsquo;<samp>-P</samp>&rsquo; option was
+encountered. (On MS-DOS, the printer configuration files are called
+<samp><var>device</var>.cfg</samp>, since DOS doesn&rsquo;t allow more than 3 characters
+after the dot in filenames.)
+
+</li><li> <span id="index-PRINTER_002c-and-config-file-searching"></span>
+If no &lsquo;<samp>-P</samp>&rsquo; option was specified, and also the &lsquo;<samp>-o</samp>&rsquo; and
+&lsquo;<samp>-f</samp>&rsquo; command line options were not used, Dvips checks the
+environment variable <code>PRINTER</code>. If it exists, then
+<samp>config.<var>$PRINTER</var></samp> (<samp><var>$PRINTER</var>.cfg</samp> on MS-DOS) is
+loaded (if it exists).
+
+</li></ol>
+
+<p>Because the <samp>.dvipsrc</samp> file is read before the printer-specific
+configuration files, individual users cannot override settings in the
+latter. On the other hand, the <code>TEXCONFIG</code> path can be set to
+anything, so the users can always define their own printer-specific
+configuration files to be found before the system&rsquo;s.
+</p>
+<p>A few command-line options are treated specially, in that they are not
+overridden by configuration files:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>-D</samp>&rsquo;</dt>
+<dd><p>As well as setting the resolution, this unsets the mode, if the mode was
+previously set from a configuration file. If <samp>config.$PRINTER</samp> is
+read, however, any &lsquo;<samp>D</samp>&rsquo; or &lsquo;<samp>M</samp>&rsquo; lines from there will take
+effect.
+</p>
+</dd>
+<dt>&lsquo;<samp>-mode</samp>&rsquo;</dt>
+<dd><p>This overrides any mode setting (&lsquo;<samp>M</samp>&rsquo; line) in configuration files.
+&lsquo;<samp>-mode</samp>&rsquo; does not affect the resolution.
+</p>
+</dd>
+<dt>&lsquo;<samp>-o</samp>&rsquo;</dt>
+<dd><p>This overrides any output setting (&lsquo;<samp>o</samp>&rsquo; line) in configuration files.
+</p>
+</dd>
+</dl>
+
+<p>The purpose of these special cases is to (1) minimize the chance of
+having a mismatched mode and resolution (which &lsquo;<samp>mktexpk</samp>&rsquo; cannot
+resolve), and (2) let command-line options override config files where
+possible.
+</p>
+
+<hr>
+<span id="Configuration-file-commands"></span><div class="header">
+<p>
+Previous: <a href="#Configuration-file-searching" accesskey="p" rel="prev">Configuration file searching</a>, Up: <a href="#Config-files" accesskey="u" rel="up">Config files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Configuration-file-commands-1"></span><h4 class="subsection">3.4.2 Configuration file commands</h4>
+
+<span id="index-configuration-file-options"></span>
+<span id="index-Dvips-configuration-file-options"></span>
+
+<p>Most of the configuration file commands are similar to corresponding
+command line options, but there are a few exceptions. When they are the
+same, we omit the description here.
+</p>
+<p>As with command line options, many may be turned off by suffixing the
+letter with a zero (&lsquo;<samp>0</samp>&rsquo;).
+</p>
+<span id="index-comments_002c-in-configuration-files"></span>
+<span id="index-continuation-lines_002c-not-supported"></span>
+<p>Within a configuration file, empty lines, and lines starting with a
+space, asterisk, equal sign, percent sign, or pound sign are ignored.
+There is no provision for continuation lines.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>@ <var>name hsize vsize</var></samp>&rsquo;</dt>
+<dd><span id="index-_0040-config-command-_0028define-paper-sizes_0029"></span>
+<p>Define paper sizes. See <a href="#Config-file-paper-sizes">Config file paper sizes</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>a*</samp>&rsquo;</dt>
+<dd><span id="index-a-config-command-_0028conserve-memory_0029"></span>
+<p>Memory conservation. Same as &lsquo;<samp>-a</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>b <var>#copies</var></samp>&rsquo;</dt>
+<dd><span id="index-b-config-command-_0028_0023copies_0029"></span>
+<p>Multiple copies. Same as &lsquo;<samp>-b</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>c <var>filename</var></samp>&rsquo;</dt>
+<dd><span id="index-c-config-command-_0028include-another-config-file_0029"></span>
+<p>Include <var>filename</var> as an additional configuration file, read
+immediately.
+</p>
+</dd>
+<dt>&lsquo;<samp>D <var>dpi</var></samp>&rsquo;</dt>
+<dd><span id="index-D-config-command-_0028dpi_0029"></span>
+<p>Output resolution. Same as &lsquo;<samp>-D</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>e <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-e-config-command-_0028maxdrift_0029"></span>
+<p>Max drift. Same as &lsquo;<samp>-e</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>E <var>command</var></samp>&rsquo;</dt>
+<dd><span id="index-E-config-command-_0028shell-escape_0029"></span>
+<span id="index-system-in-config-file"></span>
+<span id="index-datestamp_002c-in-output"></span>
+<span id="index-shell-escape_002c-in-config-file"></span>
+<p>Executes the command listed with <code>system</code>(3); can be used to get
+the current date into a header file for inclusion, for instance.
+Possibly dangerous; this may be disabled, in which case a warning will
+be printed if the option is used (and warnings are not suppressed).
+</p>
+</dd>
+<dt>&lsquo;<samp>f*</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>F</samp>&rsquo;</dt>
+<dd><span id="index-f-config-command-_0028filter_0029"></span>
+<span id="index-F-config-command-_0028filter_0029"></span>
+<p>Run as a filter. Same as &lsquo;<samp>-f</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>G*</samp>&rsquo;</dt>
+<dd><span id="index-G-config-command-_0028character-shifting_0029"></span>
+<p>Shift low-numbered characters; obsolete. Same as &lsquo;<samp>-G</samp>&rsquo;,
+see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>h <var>header</var></samp>&rsquo;</dt>
+<dd><span id="index-h-config-command-_0028download-additional-header_0029"></span>
+<p>Prepend <var>header</var> to output. Same as &lsquo;<samp>h-</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>H <var>path</var></samp>&rsquo;</dt>
+<dd><span id="index-H-config-command-_0028PostScript-header-path_0029"></span>
+<span id="index-header-path_002c-defining"></span>
+<span id="index-DVIPSHEADERS_002c-overrides-H"></span>
+<p>Use <var>path</var> to search for PostScript header files. The environment
+variable <code>DVIPSHEADERS</code> overrides this.
+</p>
+</dd>
+<dt>&lsquo;<samp>i <var>n</var></samp>&rsquo;</dt>
+<dd><span id="index-i-config-command-_0028pages_002fsection_0029"></span>
+<p>Make multiple output files. Same as &lsquo;<samp>-i -S <var>n</var></samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>j*</samp>&rsquo;</dt>
+<dd><span id="index-j-config-command-_0028partial-font-downloading_0029"></span>
+<p>Partially download Type 1 fonts. Same as &lsquo;<samp>-j</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>K*</samp>&rsquo;</dt>
+<dd><span id="index-K-config-command-_0028comment-removal_0029"></span>
+<p>Remove comments from included PostScript files. Same as &lsquo;<samp>-K</samp>&rsquo;,
+see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>L*</samp>&rsquo;</dt>
+<dd><span id="index-L-config-command-_0028last-paper-size-wins_0029"></span>
+<p>If zero, the first paper size specified is effective, else the last.
+Same as &lsquo;<samp>-L</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>m <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-m-config-command-_0028available-memory_0029"></span>
+<span id="index-memory-available"></span>
+<span id="index-printer-memory"></span>
+<p>Declare <var>num</var> as the memory available for fonts and strings in the
+printer. The compile-time default is 180000, but this is typically
+overridden by <samp>config.ps</samp> or other configuration files. This
+value must be accurate if memory conservation and document splitting
+is to work correctly. To determine this value, send the following
+file to the printer:
+</p>
+<div class="example">
+<pre class="example">%! Hey, we're PostScript
+/Times-Roman findfont 30 scalefont setfont 144 432 moveto
+vmstatus exch sub 40 string cvs show pop showpage
+</pre></div>
+
+<p>The number printed by this file is the total memory free; it is usually
+best to tell Dvips that the printer has slightly less memory, because
+many programs download permanent macros that can reduce the memory in
+the printer. Some systems or printers can dynamically increase the
+memory available to a PostScript interpreter, in which case this file
+might return a ridiculously low number; for example, the NeXT computer
+and Ghostscript. In these cases, a value of, say, 10 million is
+likely fine.
+</p>
+<p>To go all out: If <var>num</var> is zero or negative, Dvips sets the
+available memory to a very large number (the maximum integer value in
+C), the idea being that output is not to a printer and thus no
+splitting of the output is desirable. The Dvips config file
+<samp>config.maxmem</samp> is provided to do this conveniently, namely with
+&lsquo;<samp>dvips -Pmaxmem</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>M <var>mode</var></samp>&rsquo;</dt>
+<dd><span id="index-M-config-command-_0028mf-mode_0029"></span>
+<p>Metafont mode. Same as &lsquo;<samp>-mode</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>N*</samp>&rsquo;</dt>
+<dd><span id="index-N--config-command-_0028disable-EPS_0029"></span>
+<p>Disable structured comments. Beware: This also turns off displaying
+page numbers or changing to specific pagenumbers in PostScript viewers.
+Same as &lsquo;<samp>-N</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>o <var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-o-config-command-_0028output-destination_0029"></span>
+<span id="index-output-file_002c-setting"></span>
+<p>Send output to <var>name</var>. Same as &lsquo;<samp>-o</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+In the file <samp>config.foo</samp>, a setting like this is probably
+appropriate:
+</p><div class="example">
+<pre class="example">o |lpr -Pfoo
+</pre></div>
+<p>The MS-DOS version will emulate spooling to <code>lpr</code> by printing to
+the local printer device <samp>PRN</samp> if it doesn&rsquo;t find an executable
+program by that name in the current directory or along the <code>PATH</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>O <var>xoff</var>,<var>yoff</var></samp>&rsquo;</dt>
+<dd><span id="index-O-config-command-_0028page-offsets_0029"></span>
+<p>Origin offset. Same as &lsquo;<samp>-O</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>p <span class="roman">[+]</span><var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-p-config-command-_0028font-aliases_0029"></span>
+<span id="index-PostScript-font-alias-file-1"></span>
+<span id="index-resident-fonts_002c-different-in-different-printers-1"></span>
+<span id="index-_002bpsmapfile"></span>
+<p>Examine <var>name</var> for PostScript font aliases. Default is
+<samp>psfonts.map</samp>. This option allows you to specify different resident
+fonts that different printers may have. If <var>name</var> starts with a
+&lsquo;<samp>+</samp>&rsquo; character, then the rest of the name (after any leading spaces)
+is used as an additional map file; thus, it is possible to have local
+map files pointed to by local configuration files that append to the
+global map file. This can be used for font families.
+</p>
+</dd>
+<dt>&lsquo;<samp>P <var>path</var></samp>&rsquo;</dt>
+<dd><span id="index-P-config-command-_0028PK-path_0029"></span>
+<span id="index-PKFONTS_002c-overrides-P"></span>
+<span id="index-TEXPKS_002c-overrides-P"></span>
+<span id="index-GLYPHFONTS_002c-overrides-P"></span>
+<span id="index-TEXFONTS_002c-overrides-P"></span>
+<p>Use <var>path</var> to search for bitmap PK font files is <var>path</var>. The
+<code>PKFONTS</code>, <code>TEXPKS</code>, <code>GLYPHFONTS</code>, and <code>TEXFONTS</code>
+environment variables override this. See <a href="https://tug.org/texinfohtml/kpathsea.html#Supported-file-formats">Supported file formats</a> in <cite>Kpathsea</cite>.
+</p>
+</dd>
+<dt>&lsquo;<samp>q*</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>Q</samp>&rsquo;</dt>
+<dd><span id="index-q-config-command-_0028quiet_0029"></span>
+<span id="index-Q-config-command-_0028quiet_0029"></span>
+<p>Run quietly. Same as &lsquo;<samp>-q</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>r*</samp>&rsquo;</dt>
+<dd><span id="index-r-config-command-_0028page-reversal_0029"></span>
+<p>Page reversal. Same as &lsquo;<samp>-r</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>R <var>num1 num2 &hellip;</var></samp>&rsquo;</dt>
+<dd><span id="index-R-config-command-_0028fallback-resolution_0029"></span>
+<span id="index-fallback-resolutions"></span>
+<span id="index-default-resolutions"></span>
+<span id="index-last_002dresort-scaling_002c-with-R"></span>
+<p>Define the list of default resolutions for PK fonts. If a font size
+actually used in a document is not available and cannot be created,
+Dvips will scale the font found at the closest of these resolutions to
+the requested size, using PostScript scaling. The resulting output may
+be ugly, and thus a warning is issued. To turn this last-resort scaling
+off, use a line with just the &lsquo;<samp>R</samp>&rsquo; and no numbers.
+</p>
+<p>The given numbers must be sorted in increasing order; any number smaller
+than the preceding one is ignored. This is because it is better to
+scale a font up than down; scaling down can obliterate small features in
+the character shape.
+</p>
+<span id="index-DVIPSSIZES_002c-overrides-R"></span>
+<span id="index-TEXSIZES_002c-overrides-R"></span>
+<p>The environment and config file values &lsquo;<samp>DVIPSSIZES</samp>&rsquo; or
+&lsquo;<samp>TEXSIZES</samp>&rsquo; override this configuration file setting.
+</p>
+<span id="index-default_005ftexsizes-Make-variable"></span>
+<p>If no &lsquo;<samp>R</samp>&rsquo; settings or environment variables are specified, a list
+compiled in during installation is used. This default list is defined by
+the Makefile variable &lsquo;<samp>default_texsizes</samp>&rsquo;, defined in the file
+<samp>make/paths.make</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp>s*</samp>&rsquo;</dt>
+<dd><span id="index-s-config-command-_0028global-save_002frestore_0029"></span>
+<p>Output global save/restore. Same as &lsquo;<samp>-s</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>S <var>path</var></samp>&rsquo;</dt>
+<dd><span id="index-S-config-command-_0028pict-path_0029"></span>
+<span id="index-TEXPICTS_002c-overrides-S"></span>
+<span id="index-TEXINPUTS_002c-overrides-S"></span>
+<p>Use <var>path</var> to search for special illustrations (Encapsulated
+PostScript files or psfiles). The <code>TEXPICTS</code> and then
+<code>TEXINPUTS</code> environment variables override this.
+</p>
+</dd>
+<dt>&lsquo;<samp>T <var>path</var></samp>&rsquo;</dt>
+<dd><span id="index-T-config-command-_0028TFM-path_0029"></span>
+<span id="index-TFMFONTS_002c-overrides-T"></span>
+<span id="index-TEXFONTS_002c-overrides-T"></span>
+<p>Use <var>path</var> to search for TFM files. The <code>TFMFONTS</code> and then
+<code>TEXFONTS</code> environment variables overrides this. This path is used
+for resident fonts and fonts that can&rsquo;t otherwise be found.
+</p>
+</dd>
+<dt>&lsquo;<samp>U*</samp>&rsquo;</dt>
+<dd><span id="index-U-config-command-_0028Xerox-4045_0029"></span>
+<p>Work around bug in Xerox 4045 printer. Same as &lsquo;<samp>-U</samp>&rsquo;, see <a href="#Option-details">Option details</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>V <var>path</var></samp>&rsquo;</dt>
+<dd><span id="index-V-config-command-_0028vf-path_0029"></span>
+<span id="index-virtual-font-path"></span>
+<span id="index-device-dependency_002c-and-virtual-fonts"></span>
+<p>Use <var>path</var> to search for virtual font files. This may be
+device-dependent if you use virtual fonts to simulate actual fonts on
+different devices.
+</p>
+</dd>
+<dt>&lsquo;<samp>W <span class="roman">[<var>string</var>]</span></samp>&rsquo;</dt>
+<dd><span id="index-W-config-command-_0028emit-warning_0029"></span>
+<span id="index-warning-messages_002c-defining"></span>
+<p>If <var>string</var> is supplied, write it to standard error after reading
+all the configuration files; with no <var>string</var>, cancel any previous
+&lsquo;<samp>W</samp>&rsquo; message. This is useful in the default configuration file to
+remind users to specify a printer, for instance, or to notify users
+about special characteristics of a particular printer.
+</p>
+</dd>
+<dt>&lsquo;<samp>X <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-X-config-command-_0028horizontal-resolution_0029"></span>
+<p>Horizontal resolution. Same as &lsquo;<samp>-X</samp>&rsquo; (see <a href="#Option-details">Option details</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>Y <var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-Y-config-command-_0028vertical-resolution_0029"></span>
+<p>Vertical resolution. Same as &lsquo;<samp>-Y</samp>&rsquo; (see <a href="#Option-details">Option details</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>Z*</samp>&rsquo;</dt>
+<dd><span id="index-Z-config-command-_0028compress-fonts_0029"></span>
+<p>Compress bitmap fonts. Same as &lsquo;<samp>-Z</samp>&rsquo; (see <a href="#Option-details">Option details</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>z*</samp>&rsquo;</dt>
+<dd><span id="index-z-config-command-_0028secure-mode_0029"></span>
+<p>Disables execution of system commands, like &lsquo;<samp>-R</samp>&rsquo;
+(see <a href="#Option-details">Option details</a>). If &lsquo;<samp>-R</samp>&rsquo; is specified
+on the command line, that takes precedence.
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Paper-size-and-landscape"></span><div class="header">
+<p>
+Next: <a href="#Interaction-with-PostScript" accesskey="n" rel="next">Interaction with PostScript</a>, Previous: <a href="#Invoking-Dvips" accesskey="p" rel="prev">Invoking Dvips</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Paper-size-and-landscape-orientation"></span><h2 class="chapter">4 Paper size and landscape orientation</h2>
+
+<span id="index-paper-size_002c-general"></span>
+
+<p>Most TeX documents at a particular site are designed to use the
+local standard paper size (letter size in the United States, A4
+elsewhere). The Dvips program can be customized either sitewide or
+for a particular printer.
+</p>
+<span id="index-landscape-orientation_002c-defined"></span>
+<span id="index-portrait-orientation_002c-defined"></span>
+<p>On the other hand, plenty of documents are designed for other paper
+sizes. For instance, you may want to design a document that has the
+long edge of the paper horizontal. This can be useful when
+typesetting booklets, brochures, complex tables, or many other
+documents. This type of paper orientation is called <em>landscape</em>
+orientation (the default orientation is called <em>portrait</em>).
+Alternatively, a document might be designed for ledger or A3 paper.
+</p>
+<p>Since the intended paper size in these cases is a document design
+decision, not a printing decision, such information should be given in
+the TeX file and not on the Dvips command line. For this reason,
+Dvips supports a &lsquo;<samp>papersize</samp>&rsquo; special. It is hoped that this
+special will become standard over time for TeX previewers and other
+printer drivers.
+</p>
+<p>Some LaTeX packages, e.g., &lsquo;<samp>hyperref.sty</samp>&rsquo;, write a
+&lsquo;<samp>papersize</samp>&rsquo; special into the DVI file. In this case, you need
+not and should not attempt to override it manually.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#papersize-special" accesskey="1">&lsquo;<samp>papersize</samp>&rsquo; special</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifying the paper size in TeX.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Config-file-paper-sizes" accesskey="2">Config file paper sizes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifying printer- and site-specific sizes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Paper-trays" accesskey="3">Paper trays</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing paper trays automatically.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="papersize-special"></span><div class="header">
+<p>
+Next: <a href="#Config-file-paper-sizes" accesskey="n" rel="next">Config file paper sizes</a>, Up: <a href="#Paper-size-and-landscape" accesskey="u" rel="up">Paper size and landscape</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="papersize-special-1"></span><h3 class="section">4.1 &lsquo;<samp>papersize</samp>&rsquo; special</h3>
+
+<span id="index-papersize-special"></span>
+
+<p>The format of the &lsquo;<samp>papersize</samp>&rsquo; special is
+</p>
+<div class="example">
+<pre class="example">\special{papersize=<var>width</var>,<var>height</var>}
+</pre></div>
+
+<p><var>width</var> is the horizontal size of the page, and <var>height</var> is the
+vertical size. The dimensions supported are the same as for TeX;
+namely, in (inches), cm (centimeters), mm (millimeters), pt (points), sp
+(scaled points), bp (big points, the same as the default PostScript
+unit), pc (picas), dd (didot points), and cc (ciceros).
+</p>
+<span id="index-landscape_002c-as-_005cspecial"></span>
+<p>For a US letter size landscape document, the &lsquo;<samp>papersize</samp>&rsquo; would be:
+</p><div class="example">
+<pre class="example">\special{papersize=11in,8.5in}
+</pre></div>
+
+<p>An alternate specification of <code>landscape</code>:
+</p><div class="example">
+<pre class="example">\special{landscape}
+</pre></div>
+
+<p>This is supported for backward compatibility, but it is hoped that
+reventually the &lsquo;<samp>papersize</samp>&rsquo; comment will dominate.
+</p>
+<p>Of course, such a <code>\special</code> only informs Dvips of the desired
+paper size; you must also adjust <code>\hsize</code> and <code>\vsize</code> in your
+TeX document typeset to those dimensions.
+</p>
+<span id="index-unknown_002c-paper-format-for-_002dt"></span>
+<p>When using the &lsquo;<samp>papersize</samp>&rsquo; special, you generally should not also
+specify <code>-t</code> on the command line (see <a href="#Option-details">Option details</a>). The
+exception is when using a nonstandard paper size that isn&rsquo;t
+predefined; in this case, use <code>-t&nbsp;unknown</code>.
+</p>
+<p>The &lsquo;<samp>papersize</samp>&rsquo; special must occur somewhere on the first page of
+the document. Some packages, notably &lsquo;<samp>hyperref</samp>&rsquo;, insert this special.
+</p>
+<p>By default, if a DVI file contains multiple &lsquo;<samp>papersize</samp>&rsquo; specials,
+the last one wins; this is also the behavior of the <code>dvipdfmx</code>
+driver. If the <code>-L0</code> command line option or <code>L0</code> config
+file command is specified, the first special wins&mdash;this was the
+behavior of Dvips prior to the 2017 release.
+</p>
+
+<hr>
+<span id="Config-file-paper-sizes"></span><div class="header">
+<p>
+Next: <a href="#Paper-trays" accesskey="n" rel="next">Paper trays</a>, Previous: <a href="#papersize-special" accesskey="p" rel="prev">&lsquo;<samp>papersize</samp>&rsquo; special</a>, Up: <a href="#Paper-size-and-landscape" accesskey="u" rel="up">Paper size and landscape</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Configuration-file-paper-size-command"></span><h3 class="section">4.2 Configuration file paper size command</h3>
+
+<span id="index-paper-size-configuration-file-command"></span>
+<span id="index-configuration-file-paper-size-command"></span>
+
+<p>The &lsquo;<samp>@</samp>&rsquo; command in a configuration file sets the paper size
+defaults and options. The first &lsquo;<samp>@</samp>&rsquo; command defines the default
+paper size. It has three possible parameters:
+</p>
+<div class="example">
+<pre class="example">@ <span class="roman">[</span><var>name</var> <span class="roman">[</span><var>hsize</var> <var>vsize</var><span class="roman">]]</span>
+</pre></div>
+
+<p>If &lsquo;<samp>@</samp>&rsquo; is specified on a line by itself, with no parameters, it
+instructs Dvips to discard all previous paper size information (possibly
+from another configuration file).
+</p>
+<p>If three parameters are given, with the first parameter being a name and
+the second and third being a dimension (as in &lsquo;<samp>8.5in</samp>&rsquo; or
+&lsquo;<samp>3.2cc</samp>&rsquo;, just like in the &lsquo;<samp>papersize</samp>&rsquo; special), then the
+option is interpreted as starting a new paper size description, where
+<var>name</var> is the name and <var>hsize</var> and <var>vsize</var> define the
+horizontal and vertical size of the sheet of paper, respectively. For
+example:
+</p>
+<div class="example">
+<pre class="example">@ letterSize 8.5in 11in
+</pre></div>
+
+<p>If both <var>hsize</var> and <var>vsize</var> are zero (you must still specify
+units!) then any page size will match. If the &lsquo;<samp>@</samp>&rsquo; character is
+immediately followed by a &lsquo;<samp>+</samp>&rsquo; sign, then the remainder of the line
+(after skipping any leading blanks) is treated as PostScript code to
+send to the printer, presumably to select that particular paper size:
+</p>
+<div class="example">
+<pre class="example">@ letter 8.5in 11in
+@+ %%BeginPaperSize: Letter
+@+ letter
+@+ %%EndPaperSize
+</pre></div>
+
+<p>After all that, if the first character of the line is an exclamation
+point, then the line is put in the initial comments section of the final
+output file; else, it is put in the setup section of the output file.
+For example:
+</p>
+<div class="example">
+<pre class="example">@ legal 8.5in 14in
+@+ ! %%DocumentPaperSizes: Legal
+@+ %%BeginPaperSize: Legal
+@+ legal
+@+ %%EndPaperSize
+</pre></div>
+
+<p>When Dvips has a paper format name given on the command line, it looks
+for a match by the <var>name</var>; when it has a &lsquo;<samp>papersize</samp>&rsquo; special,
+it looks for a match by dimensions. The best match found (from the
+paper size information in the configuration file) is used. The
+dimensions must match within 5bp.
+</p>
+<p>If nothing matches, a warning is printed and the first paper size with
+zero dimensions is used; this should be the <code>unknown</code> paper size
+definition mentioned below, resulting in the actual dimensions being
+used.
+</p>
+<p>Landscape mode for all paper sizes is automatically supported.
+</p>
+<p>If your printer has a command to set a special paper size, then give
+dimensions of &lsquo;<samp>0in 0in</samp>&rsquo;; the PostScript code that sets the paper
+size can refer to the dimensions the user requested as &lsquo;<samp>hsize</samp>&rsquo;
+and &lsquo;<samp>vsize</samp>&rsquo;; these will be macros defined in the PostScript that
+return the requested size in default PostScript units. Also, some
+printers want &lsquo;<samp>BeginPaperSize</samp>&rsquo; comments and paper size setting
+commands; others (such as the NeXT) want &lsquo;<samp>PaperSize</samp>&rsquo; comments and
+they will handle setting the paper size. So paper size entries should
+typically specify both.
+</p>
+<span id="index-unknown_002c-paper-format-for-_002dt-1"></span>
+<p>When using a paper size that is not already defined in
+<samp>config.ps</samp>, you probably want to say &lsquo;<samp>-t&nbsp;unknown</samp>&rsquo; on
+the command line; the <code>unknown</code> paper size definition in
+<samp>config.ps</samp> has the requisite PostScript incantation to set the
+PostScript page size, as just described.
+</p>
+<span id="index-nopaper_002c-paper-format-for-_002dt"></span>
+<p>If you want no paper size information in the output at all, use
+&lsquo;<samp>-t&nbsp;nopaper</samp>&rsquo;. This is useful with multi-page output that
+will be processed further. If you just have a single page document,
+you can use &lsquo;<samp>-E</samp>&rsquo; to get pure EPSF output.
+</p>
+<span id="index-mkdvipspapers"></span>
+<p>The Perl 5 script <samp>contrib/configs/mkdvipspapers</samp> in the
+distribution directory may help in determining appropriate paper size
+definitions.
+</p>
+<span id="index-config_002eps-paper-sizes"></span>
+<span id="index-letter-paper-size"></span>
+<span id="index-a4-paper-size"></span>
+<p>Notwithstanding the above, the default <code>letter</code> and <code>a4</code>
+paper size definitions in <samp>config.ps</samp> execute the
+<code>setpagedevice</code> operator if it exists (it was defined in
+PostScript Level&nbsp;2), or the &lsquo;<samp>letter</samp>&rsquo; or &lsquo;<samp>a4</samp>&rsquo; operator
+if they exist (they are nonstandard and thus perhaps cause failures on
+certain (unknown) printers). Not executing any page size definition
+at all confuses PostScript conversion programs such as
+<code>ps2pdf</code>, so we want to execute one if we can.
+</p>
+<span id="index-letterSize-paper-size"></span>
+<span id="index-A4size-paper-size"></span>
+<p>The <code>letterSize</code> and <code>A4Size</code> paper size definitions are now
+synonyms for <code>letter</code> and <code>a4</code>.
+</p>
+
+<hr>
+<span id="Paper-trays"></span><div class="header">
+<p>
+Previous: <a href="#Config-file-paper-sizes" accesskey="p" rel="prev">Config file paper sizes</a>, Up: <a href="#Paper-size-and-landscape" accesskey="u" rel="up">Paper size and landscape</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Paper-trays-1"></span><h3 class="section">4.3 Paper trays</h3>
+
+<span id="index-paper-trays"></span>
+<span id="index-dual-paper-trays"></span>
+<span id="index-multiple-paper-trays"></span>
+<span id="index-HP4Si-printer-and-paper-trays"></span>
+
+<span id="index-bop_002dhook"></span>
+<p>Some printers, such as the Hewlett-Packard HP4si, have multiple paper
+trays. You can set up Dvips to take advantage of this using the
+<code>bop-hook</code> PostScript variable (see <a href="#PostScript-hooks">PostScript hooks</a>).
+</p>
+<span id="index-letterhead-tray"></span>
+<p>For example, suppose you have an alternate tray stocked with letterhead
+paper; the usual tray has the usual paper. You have a document where
+you want the first page printed on letterhead, and the remaining pages
+on the usual paper. You can create a header file, say
+<samp>firstletterhead.PS</samp>, with the following (PostScript) code
+(<code>bop-hook</code> is passed the current physical page number, which
+starts at zero):
+</p>
+<div class="example">
+<pre class="example">/bop-hook { dup 0 eq { <var>alternatetray</var> } { <var>normaltray</var> } ifelse } def
+</pre></div>
+
+<p>where <var>alternatetray</var> and <var>normaltray</var> are the appropriate
+commands to select the paper trays. On the 4SI, <var>alternatetray</var> is
+&lsquo;<samp>statusdict begin 1 setpapertray end</samp>&rsquo; and <var>normaltray</var> is
+&lsquo;<samp>statusdict begin 0 setpapertray end</samp>&rsquo;.
+</p>
+<p>Then, include the file with either
+</p><ul>
+<li> the &lsquo;<samp>-h</samp>&rsquo; command-line option (see <a href="#Option-details">Option details</a>); or
+
+</li><li> the &lsquo;<samp>h</samp>&rsquo; config file option (see <a href="#Configuration-file-commands">Configuration file commands</a>); or
+
+</li><li> &lsquo;<samp>\special{header=<var>file</var>}</samp>&rsquo; in your TeX document
+(see <a href="#Including-headers-from-TeX">Including headers from TeX</a>).
+
+</li></ul>
+
+
+<hr>
+<span id="Interaction-with-PostScript"></span><div class="header">
+<p>
+Next: <a href="#PostScript-fonts" accesskey="n" rel="next">PostScript fonts</a>, Previous: <a href="#Paper-size-and-landscape" accesskey="p" rel="prev">Paper size and landscape</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Interaction-with-PostScript-1"></span><h2 class="chapter">5 Interaction with PostScript</h2>
+
+<span id="index-interaction-with-PostScript"></span>
+<span id="index-PostScript-interaction"></span>
+
+<p>Dvips supports inclusion of PostScript figure files (e.g., Encapsulated
+PostScript), downloading other header files (e.g., fonts), including
+literal PostScript code, and hypertext.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#PostScript-figures" accesskey="1">PostScript figures</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Including an Encapsulated PostScript figure.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Header-files" accesskey="2">Header files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Downloading extra definitions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Literal-PS" accesskey="3">Literal PS</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Writing literal PostScript code.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hypertext" accesskey="4">Hypertext</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Producing HyperPostScript to make PDF.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="PostScript-figures"></span><div class="header">
+<p>
+Next: <a href="#Header-files" accesskey="n" rel="next">Header files</a>, Up: <a href="#Interaction-with-PostScript" accesskey="u" rel="up">Interaction with PostScript</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="PostScript-figures-1"></span><h3 class="section">5.1 PostScript figures</h3>
+
+<p>Scaling and including PostScript graphics is a breeze&mdash;if the PostScript
+file is correctly formed. Even if it is not, however, the file can usually
+be accommodated with just a little more work.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Bounding-box" accesskey="1">Bounding box</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The %%BoundingBox EPS comment.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#g_t_005cincludegraphics" accesskey="2">\includegraphics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The LaTeX \includegraphics macro.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#EPSF-macros" accesskey="3">EPSF macros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Including the file in TeX.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#psfile-special" accesskey="4">psfile special</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The basic special.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Dynamic-creation-of-graphics" accesskey="5">Dynamic creation of graphics</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Handling compressed or generated figures.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Fonts-in-figures" accesskey="6">Fonts in figures</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The %*Font comment.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Bounding-box"></span><div class="header">
+<p>
+Next: <a href="#g_t_005cincludegraphics" accesskey="n" rel="next">\includegraphics</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="The-bounding-box-comment"></span><h4 class="subsection">5.1.1 The bounding box comment</h4>
+
+<span id="index-bounding-box_002c-comment-for"></span>
+
+<p>The most important feature of a good PostScript file from the standpoint
+of including it in another document is an accurate bounding box comment.
+Every well-formed PostScript file has a comment describing where on the
+page the graphic is located, and how big that graphic is.
+</p>
+<span id="index-big-points"></span>
+<span id="index-PostScript-units"></span>
+<span id="index-bounding-box_002c-defined"></span>
+<p>This information is given as the lower left and upper right corners of
+the box just enclosing the graphic, and is thus referred to as the
+<em>bounding box</em>. These coordinates are given in the default
+PostScript units (there are precisely 72 PostScript units to the inch,
+like TeX big points) with respect to the lower left corner of the
+sheet of paper.
+</p>
+<span id="index-_0025_0025BoundingBox"></span>
+<p>To see if a PostScript file has a bounding box comment, just look at the
+first few lines of the file. PostScript files are standard ASCII, so
+you can use any text editor to do this. If within the first few dozen
+lines there is a line like
+</p>
+<div class="example">
+<pre class="example">%%BoundingBox: 25 50 400 300
+</pre></div>
+
+<p>(with any reasonable numbers), chances are very good that the file is
+Encapsulated PostScript and will work easily with Dvips. If the file
+contains instead a line like
+</p>
+<span id="index-atend_002c-bounding-box-specification"></span>
+<span id="index-_0028atend_0029_002c-bounding-box-specification"></span>
+<div class="example">
+<pre class="example">%%BoundingBox: (atend)
+</pre></div>
+
+<p>the file is still probably Encapsulated PostScript, but the bounding box
+is given at the end of the file. Dvips needs it at the beginning. You
+can move it with that same text editor, or a simple script. (The
+bounding box is given in this way when the program that generated the
+PostScript couldn&rsquo;t know the size in advance, or was too lazy to compute
+it.)
+</p>
+<span id="index-bbfig"></span>
+<span id="index-bounding-box_002c-determining"></span>
+<p>If the document lacks a &lsquo;<samp>%%BoundingBox:</samp>&rsquo; altogether, you can
+determine one in a couple of ways. One is to use the &lsquo;<samp>bbfig</samp>&rsquo;
+program distributed with Dvips in the <samp>contrib</samp> directory. This can
+usually find the correct bounding box automatically; it works best with
+Ghostscript.
+</p>
+<span id="index-612-792-bounding-box-size"></span>
+<p>If the comment looks like this:
+</p><div class="example">
+<pre class="example">%%BoundingBox: 0 0 612 792
+</pre></div>
+
+<p>the graphic claims to take up an entire sheet of paper. This is
+usually a symptom of a bug in the program that generated it.
+</p>
+<p>The other is to do it yourself: print the file. Now, take a ruler, and
+make the following measurements (in PostScript units, so measure in
+inches and multiply by 72): From the left edge of the paper to the
+leftmost mark on the paper is <var>llx</var>, the first number. From the
+bottom edge of the paper to the bottommost mark on the paper is
+<var>lly</var>, the second number. From the left edge of the paper to the
+rightmost mark on the paper is <var>urx</var>, the third number. The fourth
+and final number, <var>ury</var>, is the distance from the bottom of the page
+to the uppermost mark on the paper.
+</p>
+<p>Once you have the numbers, add a comment of the following form as the
+second line of the document. (The first line should already be a line
+starting with the two characters &lsquo;<samp>%!</samp>&rsquo;; if it is not, the file
+probably isn&rsquo;t PostScript.)
+</p>
+<div class="example">
+<pre class="example">%%BoundingBox: <var>llx</var> <var>lly</var> <var>urx</var> <var>ury</var>
+</pre></div>
+
+<p>Or, if you don&rsquo;t want to modify the file, you can simply write these
+numbers down in a convenient place and give them in your TeX document
+when you import the graphic, as described in the next section.
+</p>
+<p>If the document does not have such a bounding box, or if the bounding
+box is given at the end of the document, or the bounding box is wrong,
+please complain to the authors of the software package that generated
+the file.
+</p>
+
+<hr>
+<span id="g_t_005cincludegraphics"></span><div class="header">
+<p>
+Next: <a href="#EPSF-macros" accesskey="n" rel="next">EPSF macros</a>, Previous: <a href="#Bounding-box" accesskey="p" rel="prev">Bounding box</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="The-_005cincludegraphics-macro-for-LaTeX"></span><h4 class="subsection">5.1.2 The \includegraphics macro for LaTeX</h4>
+
+<span id="index-_005cincludegraphics-LaTeX-macro"></span>
+<span id="index-macros-for-epsf-inclusion"></span>
+
+<p>Once the figure file has a bounding box comment (see the previous
+section) you are ready to import the graphic into a LaTeX
+document. For LaTeX 2e, you can use the epsf, graphics or graphicx
+packages, but the last is recommended&mdash;it has the most flexible
+syntax, and is briefly described here. Further information can be
+found in <samp>grfguide</samp> or <samp>epslatex</samp>, which should be included
+in your LaTeX distribution in DVI, PDF, or other formats. (If you
+are still using LaTeX 2.09, use epsf.sty).
+</p>
+<p>Just put the following command into your preamble:
+</p>
+<div class="example">
+<pre class="example">\usepackage[dvips]{graphicx}
+</pre></div>
+
+<p>Depending on your system, a suitable driver setup may already be
+present, so that LaTeX automatically produces DVI files suitable for
+Dvips. In this case you can leave out the &lsquo;<samp>[dvips]</samp>&rsquo; parameter.
+</p>
+<p>Now, at the point you want to include a file <samp>foo.eps</samp>, enter a
+line such as:
+</p>
+<div class="example">
+<pre class="example">\includegraphics{foo.eps}
+</pre></div>
+
+<p>However, it is usually best to omit the file extension and only use
+</p>
+<div class="example">
+<pre class="example">\includegraphics{foo}
+</pre></div>
+
+<p>because then you can process the same LaTeX file with
+different TeX engines or DVI converters if you also provide
+suitable graphics files for them, e.g., <samp>foo.pdf</samp> or
+<samp>foo.png</samp>.
+</p>
+<span id="index-bounding-box_002c-supplying-to-TeX"></span>
+<p>The \includegraphics command has many options, specified in
+&lsquo;<samp>key=value</samp>&rsquo; syntax, to allow you to resize, rotate or trim the
+included graphic&mdash;see <samp>grfguide</samp> or <samp>epslatex</samp>. If your
+file does not have a bounding box comment, you can supply the numbers
+as determined in the previous section, in the same order they would
+have been in a normal bounding box comment:
+</p>
+<div class="example">
+<pre class="example">\includegraphics[bb=100 100 500 500]{foo.ps}
+</pre></div>
+
+<p>Now, save your changes and run LaTeX and Dvips; the output should
+have your graphic positioned at precisely the point you indicated,
+occupying the proper amount of space.
+</p>
+<p>PostScript graphics have their origin in the lower left
+corner. Therefore, in TeX, a graphic will occupy a box that extends
+far above the line where it is put in, but has depth zero below it.
+Combining &lsquo;<samp>\includegraphics</samp>&rsquo; with &lsquo;<samp>\parbox</samp>&rsquo; commands or
+minipages can sometimes be confusing when this is not taken into
+account.
+</p>
+
+<hr>
+<span id="EPSF-macros"></span><div class="header">
+<p>
+Next: <a href="#psfile-special" accesskey="n" rel="next">psfile special</a>, Previous: <a href="#g_t_005cincludegraphics" accesskey="p" rel="prev">\includegraphics</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Using-the-EPSF-macros"></span><h4 class="subsection">5.1.3 Using the EPSF macros</h4>
+
+<span id="index-EPSF-macros"></span>
+<span id="index-macros-for-epsf-inclusion-1"></span>
+
+<p>If you are using LaTeX 2e, use the &lsquo;<samp>graphics</samp>&rsquo; or &lsquo;<samp>graphicx</samp>&rsquo;
+package. See <a href="#g_t_005cincludegraphics">\includegraphics</a>.
+</p>
+<p>If you are using plain TeX or LaTeX 2.09, you need <samp>epsf.tex</samp>
+(for plain TeX) and <samp>epsf.sty</samp> (for LaTeX). For plain
+TeX, add a line like this near the top of your input file:
+</p>
+<span id="index-epsf_002etex"></span>
+<div class="example">
+<pre class="example">\input epsf
+</pre></div>
+
+<p><span id="index-epsf_002esty"></span>
+If you are using LaTeX 2.09, add the &lsquo;<samp>epsf</samp>&rsquo; style option, as in:
+</p>
+<div class="example">
+<pre class="example">\documentstyle[12pt,epsf]{article}
+</pre></div>
+
+<p>In any case, the above only needs to be done once, no matter how many
+figures you plan to include.
+</p>
+<p>Now, at the point you want to include a file, enter a line such as:
+</p>
+<div class="example">
+<pre class="example">\epsffile{foo.eps}
+</pre></div>
+
+<span id="index-_005cleavevmode"></span>
+<span id="index-bounding-box_002c-supplying-to-TeX-1"></span>
+<p>If you are using LaTeX, you may need to add <code>\leavevmode</code>
+immediately before the <code>\epsffile</code> command to get certain
+environments to work correctly. If your file does not have a bounding
+box comment, you can supply the numbers as determined in the previous
+section, in the same order they would have been in a normal bounding box
+comment:
+</p>
+<div class="example">
+<pre class="example">\epsffile[100 100 500 500]{foo.ps}
+</pre></div>
+
+<p>Now, save your changes and run TeX and Dvips; the output should have
+your graphic positioned at precisely the point you indicated, occupying
+the proper amount of space.
+</p>
+<span id="index-_005cepsffile-macro"></span>
+<span id="index-figures_002c-natural-size"></span>
+<p>The <code>\epsffile</code> macro typesets the figure as a TeX <code>\vbox</code>
+at the point of the page that the command is executed. By default, the
+graphic will have its &lsquo;natural&rsquo; width (namely, the width of its bounding
+box). The TeX box will have depth zero and its natural height. By
+default, the graphic will be scaled by any DVI magnification in effect,
+just as is everything else in your document. See the next section for
+more information on scaling.
+</p>
+<span id="index-_005cepsfverbosetrue"></span>
+<span id="index-verbose-EPSF-processing"></span>
+<p>If you want TeX to report the size of the figure as a message on your
+terminal when it processes each figure, give the command:
+</p>
+<div class="example">
+<pre class="example">\epsfverbosetrue
+</pre></div>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#EPSF-scaling" accesskey="1">EPSF scaling</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#EPSF-clipping" accesskey="2">EPSF clipping</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="EPSF-scaling"></span><div class="header">
+<p>
+Next: <a href="#EPSF-clipping" accesskey="n" rel="next">EPSF clipping</a>, Up: <a href="#EPSF-macros" accesskey="u" rel="up">EPSF macros</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="EPSF-scaling-1"></span><h4 class="subsubsection">5.1.3.1 EPSF scaling</h4>
+
+<span id="index-scaling-of-figures"></span>
+<span id="index-figures_002c-scaling"></span>
+
+<p>Usually, you will want to scale an EPSF figure to some size appropriate
+for your document, since its natural size is determined by the creator
+of the EPS file.
+</p>
+<p>The best way to do this is to assign the desired size to the TeX
+<code>\epsfxsize</code> or <code>\epsfysize</code> variables, whichever is more
+convenient for you. That is, put
+</p>
+<span id="index-_005cepsfxsize"></span>
+<div class="example">
+<pre class="example">\epsfxsize=<var>dimen</var>
+</pre></div>
+
+<p>right before the call to <code>\epsffile</code>. Then the width of the TeX
+box will be <var>dimen</var> and its height will be scaled proportionately.
+Similarly, you can set the vertical size with
+</p>
+<span id="index-_005cepsfysize"></span>
+<div class="example">
+<pre class="example">\epsfysize=<var>dimen</var>
+</pre></div>
+
+<p>in which case the height will be set and the width scaled
+proportionally.
+</p>
+<p>If you set both, both will be honored, but the aspect ratio of the
+included graphic may necessarily be distorted, i.e., its contents
+stretched in one direction or the other.
+</p>
+<span id="index-_005cepsfsize"></span>
+<p>You can resize graphics in a more general way by redefining the
+<code>\epsfsize</code> macro. <code>\epsffile</code> calls this with two
+parameters: the natural horizontal and vertical sizes of the PostScript
+graphic. <code>\epsfsize</code> must expand to the desired horizontal size,
+that is, the width of the <code>\vbox</code>. Schematically:
+</p>
+<div class="example">
+<pre class="example">\def\epsfsize#1#2{<var>body</var>}
+</pre></div>
+
+<p>Some useful definitions of <var>body</var>:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>\epsfxsize</samp>&rsquo;</dt>
+<dd><p>This definition (the default) enables the default features listed above,
+by setting <code>\epsfxsize</code> to the same value it had before the macro
+was called.
+</p>
+</dd>
+<dt>&lsquo;<samp>#1</samp>&rsquo;</dt>
+<dd><p>Force the natural size by returning the first parameter (the original
+width).
+</p>
+</dd>
+<dt>&lsquo;<samp>0pt</samp>&rsquo;</dt>
+<dd><p>A special case, equivalent to &lsquo;<samp>#1</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>0.5#1</samp>&rsquo;</dt>
+<dd><p>Scale to half the natural size.
+</p>
+</dd>
+<dt>&lsquo;<samp>\hsize</samp>&rsquo;</dt>
+<dd><p>Scale to the current <code>\hsize</code>. (In LaTeX, use <code>\textwidth</code>
+instead of <code>\hsize</code>.)
+</p>
+</dd>
+<dt>&lsquo;<samp>\ifnum#1&gt;\hsize\hsize\else#1\fi</samp>&rsquo;</dt>
+<dd><p>If the natural width is greater than the current <code>\hsize</code>, scale to
+<code>\hsize</code>, otherwise use the natural width.
+</p>
+</dd>
+</dl>
+
+<span id="index-DVI-magnification"></span>
+<span id="index-magnification_002c-DVI"></span>
+<span id="index-_005cmagnification"></span>
+<p>For compatibility with other PostScript drivers, it is possible to turn
+off the default scaling of included figures by the DVI magnification
+with the following TeX command:
+</p>
+<span id="index-_002fmagscale"></span>
+<div class="example">
+<pre class="example">\special{! /magscale false def}
+</pre></div>
+
+<p>Use of this command is not recommended because it will make the
+<code>\epsffile</code> graphics the &ldquo;wrong&rdquo; size if global magnification is
+being used, and it will cause any PostScript graphics to appear
+improperly scaled and out of position if a DVI to DVI program is used to
+scale or otherwise modify the document.
+</p>
+<span id="index-bop_002dhook-1"></span>
+<p>DVI magnification is not applied to any output from code you write in
+&lsquo;<samp>bop-hook</samp>&rsquo; or its ilk (see <a href="#PostScript-hooks">PostScript hooks</a>),
+</p>
+
+<hr>
+<span id="EPSF-clipping"></span><div class="header">
+<p>
+Previous: <a href="#EPSF-scaling" accesskey="p" rel="prev">EPSF scaling</a>, Up: <a href="#EPSF-macros" accesskey="u" rel="up">EPSF macros</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="EPSF-clipping-1"></span><h4 class="subsubsection">5.1.3.2 EPSF clipping</h4>
+
+<span id="index-clipping-of-EPSF"></span>
+<span id="index-bounding-box_002c-inaccurate"></span>
+<span id="index-text-in-figures_002c-chopped-off"></span>
+<span id="index-lines-in-figures_002c-wrong-width"></span>
+
+<p>By default, clipping is disabled for included EPSF images. This is
+because clipping to the bounding box dimensions often cuts off a
+small portion of the figure, due to slightly inaccurate bounding
+box arguments. The problem might be subtle; lines around the boundary
+of the image might be half their intended width, or the tops or
+bottoms of some text annotations might be sliced off. If you want to
+turn clipping on, just use the command
+</p>
+<div class="example">
+<pre class="example">\epsfclipon
+</pre></div>
+
+<p>and to turn clipping back off, use
+</p>
+<div class="example">
+<pre class="example">\epsfclipoff
+</pre></div>
+
+
+<hr>
+<span id="psfile-special"></span><div class="header">
+<p>
+Next: <a href="#Dynamic-creation-of-graphics" accesskey="n" rel="next">Dynamic creation of graphics</a>, Previous: <a href="#EPSF-macros" accesskey="p" rel="prev">EPSF macros</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="psfile-special-1"></span><h4 class="subsection">5.1.4 &lsquo;<samp>psfile</samp>&rsquo; special</h4>
+
+<span id="index-psfile-special"></span>
+
+<p>The basic special for file inclusion is as follows:
+</p>
+<div class="example">
+<pre class="example">\special{psfile=<var>filename</var>.ps <span class="roman">[</span><var>key</var>=<var>value</var><span class="roman">]</span> &hellip; }
+</pre></div>
+
+<p>This downloads the PostScript file <samp><var>filename</var>.ps</samp> such that
+the current point will be the origin of the PostScript coordinate
+system. The optional <var>key</var><tt>=</tt><var>value</var> assignments allow you to
+specify transformations on the PostScript.
+</p>
+<p>The possible <var>key</var>s are:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>hoffset</samp>&rsquo;</dt>
+<dd><span id="index-hoffset-_0028psfile-special-option_0029"></span>
+<p>The horizontal offset (default 0).
+</p>
+</dd>
+<dt>&lsquo;<samp>voffset</samp>&rsquo;</dt>
+<dd><span id="index-voffset-_0028psfile-special-option_0029"></span>
+<p>The vertical offset (default 0).
+</p>
+</dd>
+<dt>&lsquo;<samp>hsize</samp>&rsquo;</dt>
+<dd><span id="index-hsize-_0028psfile-special-option_0029"></span>
+<p>The horizontal clipping size (default 612).
+</p>
+</dd>
+<dt>&lsquo;<samp>vsize</samp>&rsquo;</dt>
+<dd><span id="index-vsize-_0028psfile-special-option_0029"></span>
+<p>The vertical clipping size (default 792).
+</p>
+</dd>
+<dt>&lsquo;<samp>hscale</samp>&rsquo;</dt>
+<dd><span id="index-hscale-_0028psfile-special-option_0029"></span>
+<p>The horizontal scaling factor, as a percentage (default 100).
+</p>
+</dd>
+<dt>&lsquo;<samp>vscale</samp>&rsquo;</dt>
+<dd><span id="index-vscale-_0028psfile-special-option_0029"></span>
+<p>The vertical scaling factor, as a percentage (default 100).
+</p>
+</dd>
+<dt>&lsquo;<samp>angle</samp>&rsquo;</dt>
+<dd><span id="index-angle-_0028psfile-special-option_0029"></span>
+<p>The rotation, in degrees (default 0).
+</p>
+</dd>
+<dt>&lsquo;<samp>clip</samp>&rsquo;</dt>
+<dd><span id="index-clip-_0028psfile-special-option_0029"></span>
+<p>Enable clipping to the bounding box (default disabled).
+</p>
+</dd>
+<dt>&lsquo;<samp>llx, lly, urx, ury</samp>&rsquo;</dt>
+<dd><span id="index-llx-_0028psfile-special-option_0029"></span>
+<span id="index-lly-_0028psfile-special-option_0029"></span>
+<span id="index-urx-_0028psfile-special-option_0029"></span>
+<span id="index-ury-_0028psfile-special-option_0029"></span>
+<p>Bounding box of the included image, just as in a <code>%%BoundingBox</code>
+comment. Values are in big points, and may be fractional.
+</p>
+</dd>
+<dt>&lsquo;<samp>rhi, rwi</samp>&rsquo;</dt>
+<dd><span id="index-rhi-_0028psfile-special-option_0029"></span>
+<span id="index-rwi-_0028psfile-special-option_0029"></span>
+<p>Desired width and height of the resulting figure in the output, in
+tenths of big points (720 to the inch); may be fractional.
+</p>
+<p>If both <code>rwi</code> and <code>rhi</code> are nonzero, the picture is scaled,
+possibly losing aspect ratio. If only one of <code>rwi</code> and
+<code>rhi</code> is nonzero, the picture is scaled, preserving aspect ratio.
+</p>
+</dd>
+</dl>
+
+<p>The offsets and sizes are given in PostScript units (big points).
+Thus, for example:
+</p>
+<div class="example">
+<pre class="example">\special{psfile=foo.ps hoffset=72 hscale=90 vscale=90}
+</pre></div>
+
+<p>will shift the graphics produced by file <samp>foo.ps</samp> right by one inch
+and will draw it at 0.9 times normal size. Offsets are given relative
+to the point of the special command, and are unaffected by scaling or
+rotation. Rotation is counterclockwise about the origin. The order of
+operations is to rotate the figure, scale it, then offset it.
+</p>
+<p>For compatibility with older PostScript drivers, it is possible to change
+the units that &lsquo;<samp>hscale</samp>&rsquo; and &lsquo;<samp>vscale</samp>&rsquo; are given in. This can be
+done by redefining &lsquo;<samp>@scaleunit</samp>&rsquo;
+<span id="index-scaleunit"></span>
+in &lsquo;<samp>SDict</samp>&rsquo;
+<span id="index-SDict"></span>
+by a TeX command such as
+</p>
+<div class="example">
+<pre class="example">\special{! /@scaleunit 1 def}
+</pre></div>
+
+<p>The &lsquo;<samp>@scaleunit</samp>&rsquo; variable, which is by default 100, is what
+&lsquo;<samp>hscale</samp>&rsquo; and &lsquo;<samp>vscale</samp>&rsquo; are divided by to yield an absolute
+scale factor.
+</p>
+
+<hr>
+<span id="Dynamic-creation-of-graphics"></span><div class="header">
+<p>
+Next: <a href="#Fonts-in-figures" accesskey="n" rel="next">Fonts in figures</a>, Previous: <a href="#psfile-special" accesskey="p" rel="prev">psfile special</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Dynamic-creation-of-PostScript-graphics-files"></span><h4 class="subsection">5.1.5 Dynamic creation of PostScript graphics files</h4>
+
+<span id="index-dynamic-creation-of-graphics"></span>
+<span id="index-compressed-PostScript"></span>
+<span id="index-uncompressing-PostScript"></span>
+
+<p>PostScript is an excellent page description language&mdash;but it does tend
+to be rather verbose. Compressing PostScript graphics files can reduce
+them by factor of five or more. For this reason, if the name of an
+included PostScript file ends with <samp>.Z</samp> or <samp>.gz</samp>, Dvips
+automatically runs &lsquo;<samp>gzip -d</samp>&rsquo;. For example:
+</p>
+<div class="example">
+<pre class="example">\epsffile[72 72 540 720]{foo.ps.gz}
+</pre></div>
+
+<p>Since the results of such a command are not accessible to TeX, if you
+use this facility with the <samp>epsf</samp> macros, you need to supply the
+bounding box parameter yourself, as shown.
+</p>
+<p>More generally, if the filename parameter to one of the graphics
+inclusion techniques starts with a left quote (&lsquo;<samp>`</samp>&rsquo;), the parameter
+is instead interpreted as a command to execute that will send the actual
+file to standard output. For example:
+</p>
+<div class="example">
+<pre class="example">\special{psfile=&quot;`gnuplot foo&quot;}
+</pre></div>
+
+<p><span id="index-gnuplot"></span>
+to include the file <samp>foo</samp>. Of course, the command to be executed
+can be anything, including using a file conversion utility such as
+<samp>tek2ps</samp> or whatever is appropriate. This feature can be disabled
+with the &lsquo;<samp>-R</samp>&rsquo; command-line option or &lsquo;<samp>R</samp>&rsquo; configuration option.
+</p>
+
+<hr>
+<span id="Fonts-in-figures"></span><div class="header">
+<p>
+Previous: <a href="#Dynamic-creation-of-graphics" accesskey="p" rel="prev">Dynamic creation of graphics</a>, Up: <a href="#PostScript-figures" accesskey="u" rel="up">PostScript figures</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Fonts-in-figures-1"></span><h4 class="subsection">5.1.6 Fonts in figures</h4>
+
+<span id="index-figures-and-fonts"></span>
+<span id="index-fonts_002c-in-PostScript-figures"></span>
+<span id="index-_0025_002aFont"></span>
+
+<p>You can use any font available to TeX and Dvips within a graphics
+file by putting a <code>%*Font:</code> line in the leading commentary of the
+file. Schematically, this looks like:
+</p>
+<div class="example">
+<pre class="example">%*Font: <var>tfmname</var> <var>scaledbp</var> <var>designbp</var> <var>hex-start</var>:<var>hex-bitstring</var>
+</pre></div>
+
+<p>Here is the meaning of each of these elements:
+</p>
+<dl compact="compact">
+<dt><var>tfmname</var></dt>
+<dd><p>The TeX TFM filename, e.g., <samp>cmr10</samp>. You can give the same
+<var>tfmname</var> on more than one &lsquo;<samp>%*Font</samp>&rsquo; line; this is useful when
+the number of characters from the font used needs a longer
+<var>hex-bitstring</var> (see item below) than conveniently fits on one line.
+</p>
+</dd>
+<dt><var>scaledbp</var></dt>
+<dd><p>The size at which you are using the font, in PostScript points (TeX
+big points). 72bp = 72.27pt = 1in.
+</p>
+</dd>
+<dt><var>designbp</var></dt>
+<dd><p>The designsize of the font, again in PostScript points. This should
+match the value in the TFM file <var>tfmname</var>. Thus, for <samp>cmr10</samp>,
+it should be &lsquo;<samp>9.96265</samp>&rsquo;.
+</p>
+</dd>
+<dt><var>hex-start</var></dt>
+<dd><p>The character code of the first character used from the font, specified
+as two ASCII hexadecimal characters, e.g., &lsquo;<samp>4b</samp>&rsquo; or &lsquo;<samp>4B</samp>&rsquo; for
+&lsquo;<samp>K</samp>&rsquo;.
+</p>
+</dd>
+<dt><var>hex-bitstring</var></dt>
+<dd><p>An arbitrary number of ASCII hexadecimal digits specifying which
+characters following (and including) <var>hex-start</var> are used. This is
+treated as a bitmap. For example, if your figure used the single letter
+&lsquo;<samp>K</samp>&rsquo;, you would use &lsquo;<samp>4b:8</samp>&rsquo; for <var>hex-start</var> and
+<var>hex-bitstring</var>. If it used &lsquo;<samp>KLMNP</samp>&rsquo;, you would use
+&lsquo;<samp>4b:f4</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+<p>MetaPost&rsquo;s output figures contain lines like this for bitmap fonts used
+in a MetaPost label (see <a href="https://tug.org/texinfohtml/web2c.html#MetaPost">MetaPost</a> in <cite>Web2c</cite>).
+</p>
+
+<hr>
+<span id="Header-files"></span><div class="header">
+<p>
+Next: <a href="#Literal-PS" accesskey="n" rel="next">Literal PS</a>, Previous: <a href="#PostScript-figures" accesskey="p" rel="prev">PostScript figures</a>, Up: <a href="#Interaction-with-PostScript" accesskey="u" rel="up">Interaction with PostScript</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="PostScript-header-files"></span><h3 class="section">5.2 PostScript header files</h3>
+
+<span id="index-header-files_002c-defined"></span>
+<span id="index-PostScript-header-files"></span>
+
+<p><em>Header files</em> are bits of PostScript included in the output file;
+generally they provide support for special features, rather than
+producing any printed output themselves. You can explicitly request
+downloading header files if necessary for some figure, or to achieve
+some special effect.
+</p>
+<span id="index-psheaderdir"></span>
+<span id="index-_002epro-prologue-files"></span>
+<span id="index-_002elpro-long-prologue-files"></span>
+<p>Dvips includes some headers on its own initiative, to implement features
+such as PostScript font reencoding, bitmap font downloading, handling of
+<code>\special</code>&rsquo;s, and so on. These standard headers are the
+<samp>.pro</samp> files (for &ldquo;prologue&rdquo;) in the installation directory
+&lsquo;<samp>$(psheaderdir)</samp>&rsquo;; they are created from the <samp>.lpro</samp> (&ldquo;long
+prologue&rdquo;) files in the distribution by stripping
+comments, squeezing blank lines, etc., for maximum efficiency. If you
+want to peruse one of the standard header files, read the <samp>.lpro</samp>
+version.
+</p>
+<span id="index-userdict_002c-and-dictionary-files"></span>
+<span id="index-dictionary_002c-userdict"></span>
+<p>The PostScript dictionary stack will be at the &lsquo;<samp>userdict</samp>&rsquo; level
+when header files are included.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Including-headers-from-TeX" accesskey="1">Including headers from TeX</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Including-headers-from-the-command-line" accesskey="2">Including headers from the command line</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Headers-and-memory-usage" accesskey="3">Headers and memory usage</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Including-headers-from-TeX"></span><div class="header">
+<p>
+Next: <a href="#Including-headers-from-the-command-line" accesskey="n" rel="next">Including headers from the command line</a>, Up: <a href="#Header-files" accesskey="u" rel="up">Header files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Including-headers-from-TeX-1"></span><h4 class="subsection">5.2.1 Including headers from TeX</h4>
+
+<span id="index-including-headers-in-TeX"></span>
+<span id="index-header_003dfile-_005cspecial"></span>
+<span id="index-TeX_002c-including-headers-in"></span>
+
+<span id="index-headers_002c-including-in-TeX"></span>
+<p>In order to get a particular graphic file to work, a certain font or
+header file might need to be sent first. The Dvips program provides
+support for this with the &lsquo;<samp>header</samp>&rsquo; <code>\special</code>. For instance,
+to ensure that <samp>foo.ps</samp> gets downloaded:
+</p>
+<div class="example">
+<pre class="example">\special{header=foo.ps}
+</pre></div>
+
+<span id="index-fonts_002c-as-header-files"></span>
+<p>As another example, if you have some PostScript code that uses a
+PostScript font not built into your printer, you must download it to the
+printer. If the font isn&rsquo;t used elsewhere in the document, Dvips can&rsquo;t
+know you&rsquo;ve used it, so you must include it in the same way, as in:
+</p>
+<div class="example">
+<pre class="example">\special{header=putr.pfa}
+</pre></div>
+
+<p>to include the font definition file for Adobe Utopia Roman.
+</p>
+<p>The <code>header</code> also special allows for specifying some additional
+code that should be inserted into the PostScript document before and after
+the file itself, as follows:
+</p>
+<div class="example">
+<pre class="example">\special{header={foo.ps} pre={pre code} post={post code}}
+</pre></div>
+
+<span id="index-before-header_002c-inserting-code"></span>
+<span id="index-after-header_002c-inserting-code"></span>
+<span id="index-pre-code-before-headers"></span>
+<span id="index-post-code-after-headers"></span>
+<p>This will insert <code>pre code</code> just before <samp>foo.ps</samp> and
+<code>post code</code> just after. It is required to use the (balanced)
+braces in <em>all</em> of the arguments, including the <code>header</code>,
+when using this extended syntax.
+</p>
+<p>This allows, for instance, dynamic headers, where some of the content
+depends on settings from the user in (La)TeX. Another application
+is the inclusion of graphics inside the PostScript header, so that
+they can be reused throughout the document, as with logs. That avoids
+including the same graphic several times. This is implemented in the
+<samp>graphics/graphicx-psmin</samp> package.
+</p>
+<p>This extended syntax has one additional feature. When Dvips finds the
+extended syntax, it will also look in the installed <samp>tex/</samp>
+tree(s) for the header file (<samp>foo.ps</samp> in our example), and not
+only in the current directory and dvips tree as the original syntax
+does. This is because common graphics may well come with packages
+which are installed in the <samp>tex/</samp> tree.
+</p>
+
+<hr>
+<span id="Including-headers-from-the-command-line"></span><div class="header">
+<p>
+Next: <a href="#Headers-and-memory-usage" accesskey="n" rel="next">Headers and memory usage</a>, Previous: <a href="#Including-headers-from-TeX" accesskey="p" rel="prev">Including headers from TeX</a>, Up: <a href="#Header-files" accesskey="u" rel="up">Header files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Including-headers-from-the-command-line-1"></span><h4 class="subsection">5.2.2 Including headers from the command line</h4>
+
+<span id="index-including-headers-from-the-command-line"></span>
+<span id="index-command-line_002c-including-headers-from"></span>
+<span id="index-headers_002c-including-from-the-command-line"></span>
+
+<p>You can include headers when you run Dvips, as well as from your
+document (see the previous section). To do this, run Dvips with the
+option &lsquo;<samp>-P <var>header</var></samp>&rsquo;; this will read the file
+<samp>config.<var>header</var></samp>, which in turn can specify a header file to
+be downloaded with the &lsquo;<samp>h</samp>&rsquo; option. See <a href="#Configuration-file-commands">Configuration file commands</a>. These files are called <samp><var>header</var>.cfg</samp> on MS-DOS.
+</p>
+<span id="index-duplex-printers"></span>
+<span id="index-simplex-mode-on-duplex-printers"></span>
+<span id="index-screen-frequencies_002c-setting"></span>
+<p>You can arrange for the same file to serve as a &lsquo;<samp>-P</samp>&rsquo; config file
+and the downloadable header file, by starting the lines of PostScript
+code with a space, leaving only the &lsquo;<samp>h</samp>&rsquo; line and any comments
+starting in the first column. As an example, see
+<samp>contrib/volker/config.*</samp> (<samp>contrib/volker/*.cfg</samp> on MS-DOS).
+(These files also perform useful functions: controlling duplex/simplex
+mode on duplex printers, and setting various screen frequencies;
+<samp>contrib/volker/README</samp> explains further.)
+</p>
+
+<hr>
+<span id="Headers-and-memory-usage"></span><div class="header">
+<p>
+Previous: <a href="#Including-headers-from-the-command-line" accesskey="p" rel="prev">Including headers from the command line</a>, Up: <a href="#Header-files" accesskey="u" rel="up">Header files</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Headers-and-memory-usage-1"></span><h4 class="subsection">5.2.3 Headers and memory usage</h4>
+
+<span id="index-headers-and-memory-usage"></span>
+<span id="index-memory-usage_002c-and-headers"></span>
+
+<span id="index-sections-of-output-file_002c-and-memory"></span>
+<span id="index-output-file_002c-sectioning-of"></span>
+<p>Dvips tries to avoid overflowing the printer&rsquo;s memory by splitting the
+output files into &ldquo;sections&rdquo; (see the &lsquo;<samp>-i</samp>&rsquo; option in <a href="#Option-details">Option details</a>). Therefore, for all header files, Dvips debits the printer VM
+budget by some value. If the header file has, in its leading
+commentary a line of the form
+</p>
+<span id="index-VMusage"></span>
+<span id="index-_0025_0025VMusage"></span>
+<div class="example">
+<pre class="example">%%VMusage: <var>min</var> <var>max</var>
+</pre></div>
+
+<p>then <var>max</var> is used. If there is no <code>%%VMusage</code> line, then
+the size (in bytes) of the header file is used as an approximation.
+If you want a file to be ignored in the sectioning calculations, use
+&lsquo;<samp>%%VMusage: 0 0</samp>&rsquo;.
+</p>
+<p>Illustrations (figure files) are also checked for <code>%%VMusage</code> line.
+</p>
+<p>Therefore, if your document uses very large fonts or very large
+included figures, Dvips might take it upon itself to split the output
+into unwanted sections. If this causes problems, the simplest
+solution is to use &lsquo;<samp>dvips -Pmaxmem</samp>&rsquo;, which reads the Dvips file
+<samp>config.maxmem</samp>, which sets Dvips&rsquo;s idea of the memory available
+to a very large number. (See the &lsquo;<samp>m</samp>&rsquo; item in <a href="#Configuration-file-commands">Configuration file commands</a>.)
+</p>
+
+<hr>
+<span id="Literal-PS"></span><div class="header">
+<p>
+Next: <a href="#Hypertext" accesskey="n" rel="next">Hypertext</a>, Previous: <a href="#Header-files" accesskey="p" rel="prev">Header files</a>, Up: <a href="#Interaction-with-PostScript" accesskey="u" rel="up">Interaction with PostScript</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Literal-PostScript"></span><h3 class="section">5.3 Literal PostScript</h3>
+
+<span id="index-literal-PostScript_002c-using"></span>
+<span id="index-PostScript-code_002c-literal"></span>
+
+<p>You can include literal PostScript code in your document in several ways.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#g_t_0022-special" accesskey="1">&quot; special</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">To include inline PostScript code.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#ps-special" accesskey="2">ps special</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Inline PostScript without save/restore.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Literal-headers" accesskey="3">Literal headers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Literal PostScript for the whole document.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#PostScript-hooks" accesskey="4">PostScript hooks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifying code to run in the PS interpreter.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Literal-examples" accesskey="5">Literal examples</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Neat example.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="g_t_0022-special"></span><div class="header">
+<p>
+Next: <a href="#ps-special" accesskey="n" rel="next">ps special</a>, Up: <a href="#Literal-PS" accesskey="u" rel="up">Literal PS</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_0022-special_003a-Literal-PostScript"></span><h4 class="subsection">5.3.1 <code>&quot;</code> special: Literal PostScript</h4>
+
+<span id="index-_0022-special-_0028literal-PostScript_0029"></span>
+
+<p>For simple graphics, or just for experimentation, literal PostScript
+code can be included. Simply use a <code>\special</code> beginning with a
+double quote character &lsquo;<samp>&quot;</samp>&rsquo;; there is no matching closing &lsquo;<samp>&quot;</samp>&rsquo;.
+</p>
+<p>For instance, the following (simple) graphic:
+</p>
+
+<p>was created by typing:
+</p>
+<div class="example">
+<pre class="example">\vbox to 100bp{\vss % a bp is the same as a PostScript unit
+ \special{&quot; newpath 0 0 moveto 100 100 lineto 394 0 lineto
+ closepath gsave 0.8 setgray fill grestore stroke}}
+</pre></div>
+
+<p>You are responsible for leaving space for such literal graphics, as with
+the <code>\vbox</code> above.
+</p>
+
+<hr>
+<span id="ps-special"></span><div class="header">
+<p>
+Next: <a href="#Literal-headers" accesskey="n" rel="next">Literal headers</a>, Previous: <a href="#g_t_0022-special" accesskey="p" rel="prev">&quot; special</a>, Up: <a href="#Literal-PS" accesskey="u" rel="up">Literal PS</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="ps-special-1"></span><h4 class="subsection">5.3.2 &lsquo;<samp>ps</samp>&rsquo; special</h4>
+
+<span id="index-ps-special"></span>
+
+<span id="index-save_002frestore_002c-and-specials"></span>
+<p>Generally, Dvips encloses specials in a PostScript save/restore pair,
+guaranteeing that the special will have no effect on the rest of the
+document. The &lsquo;<samp>ps</samp>&rsquo; special, however, allows you to insert literal
+PostScript instructions without this protective shield; you should
+understand what you&rsquo;re doing (and you shouldn&rsquo;t change the PostScript
+graphics state unless you are willing to take the consequences). This
+command can take many forms because it has had a torturous history; any
+of the following will work:
+</p>
+<div class="example">
+<pre class="example">\special{ps:<var>text</var>}
+\special{ps::<var>text</var>}
+\special{ps::[begin]<var>text</var>}
+\special{ps::[end]<var>text</var>}
+\special{ps::[nobreak]<var>text</var>}
+</pre></div>
+
+<p>(with longer forms taking precedence over shorter forms, when they are
+present). &lsquo;<samp>ps::</samp>&rsquo; and &lsquo;<samp>ps::[end]</samp>&rsquo; do no positioning, so they
+can be used to continue PostScript literals started with &lsquo;<samp>ps:</samp>&rsquo; or
+&lsquo;<samp>ps::[begin]</samp>&rsquo;.
+</p>
+<p>Literal PostScript instructions after &lsquo;<samp>ps::[nobreak]</samp>&rsquo; are
+<em>not</em> broken into lines. This feature may be used to include
+PostScript comments, for example.
+</p>
+<span id="index-plotfile_002c-ps-subspecial"></span>
+<p>In addition, the variant
+</p>
+<div class="example">
+<pre class="example">\special{ps: plotfile <var>filename</var>}
+</pre></div>
+
+<p><span id="index-rotate_002etex"></span>
+inserts the contents of <var>filename</var> verbatim into the output (except
+for omitting lines that begin with %). An example of the proper use of
+literal specials can be found in the file <samp>rotate.tex</samp>, which makes
+it easy to typeset text turned in multiples of 90 degrees.
+</p>
+
+<hr>
+<span id="Literal-headers"></span><div class="header">
+<p>
+Next: <a href="#PostScript-hooks" accesskey="n" rel="next">PostScript hooks</a>, Previous: <a href="#ps-special" accesskey="p" rel="prev">ps special</a>, Up: <a href="#Literal-PS" accesskey="u" rel="up">Literal PS</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Literal-headers_003a-_0021-_005cspecial"></span><h4 class="subsection">5.3.3 Literal headers: &lsquo;<samp>!</samp>&rsquo; <code>\special</code></h4>
+
+<span id="index-literal-headers"></span>
+<span id="index-SDict-dictionary"></span>
+
+<span id="index-_0021-special-_0028literal-PS-header_0029"></span>
+<span id="index-dictionary_002c-SDict"></span>
+<p>You can download literal PostScript header code in your TeX document,
+for use with (for example) literal graphics code that you include later.
+The text of a <code>\special</code> beginning with an &lsquo;<samp>!</samp>&rsquo; is copied into
+the output file. A dictionary <code>SDict</code> will be current when this
+code is executed; Dvips arranges for <code>SDict</code> to be first on the
+dictionary stack when any PostScript graphic is included, whether
+literally (the &lsquo;<samp>&quot;</samp>&rsquo; special) or through macros (e.g.,
+<samp>epsf.tex</samp>).
+</p>
+<p>For example:
+</p>
+<div class="example">
+<pre class="example">\special{! /reset { 0 0 moveto} def}
+</pre></div>
+
+
+<hr>
+<span id="PostScript-hooks"></span><div class="header">
+<p>
+Next: <a href="#Literal-examples" accesskey="n" rel="next">Literal examples</a>, Previous: <a href="#Literal-headers" accesskey="p" rel="prev">Literal headers</a>, Up: <a href="#Literal-PS" accesskey="u" rel="up">Literal PS</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="PostScript-hooks-1"></span><h4 class="subsection">5.3.4 PostScript hooks</h4>
+
+<span id="index-PostScript-hooks"></span>
+
+<p>Besides including literal PostScript at a particular place in your
+document (as described in the previous section), you can also arrange to
+execute arbitrary PostScript code at particular times while the
+PostScript is printing.
+</p>
+<span id="index-bop_002dhook-2"></span>
+<span id="index-eop_002dhook"></span>
+<span id="index-start_002dhook"></span>
+<span id="index-end_002dhook"></span>
+<p>If any of the PostScript names <code>bop-hook</code>, <code>eop-hook</code>,
+<code>start-hook</code>, or <code>end-hook</code> are defined in <code>userdict</code>,
+they will be executed at the beginning of a page, end of a page, start
+of the document, and end of a document, respectively.
+</p>
+<span id="index-draft-copies"></span>
+<span id="index-dated-output"></span>
+<p>When these macros are executed, the default PostScript coordinate system
+and origin is in effect. Such macros can be defined in headers added by
+the &lsquo;<samp>-h</samp>&rsquo; option or the &lsquo;<samp>header=</samp>&rsquo; special, and might be useful
+for writing, for instance, &lsquo;DRAFT&rsquo; across the entire page, or, with the
+aid of a shell script, dating the document. These macros are executed
+outside of the save/restore context of the individual pages, so it is
+possible for them to accumulate information, but if a document must be
+divided into sections because of memory constraints, such added
+information will be lost across section breaks.
+</p>
+<span id="index-physical-page-number_002c-and-bop_002dhook"></span>
+<p>The single argument to <code>bop-hook</code> is the physical page number; the
+first page gets zero, the second one, etc. <code>bop-hook</code> must leave
+this number on the stack. None of the other hooks are passed arguments.
+</p>
+<p>As an example of what can be done, the following special will write
+a light grey &lsquo;DRAFT&rsquo; across each page in the document:
+</p>
+<div class="example">
+<pre class="example">\special{!userdict begin /bop-hook{gsave 200 30 translate
+65 rotate /Times-Roman findfont 216 scalefont setfont
+0 0 moveto 0.7 setgray (DRAFT) show grestore}def end}
+</pre></div>
+
+<span id="index-_0025_0025Page_002c-and-multi_002dpage-information"></span>
+<p>Using <code>bop-hook</code> or <code>eop-hook</code> to preserve information across
+pages breaks compliance with the Adobe document structuring conventions,
+so if you use any such tricks, you may also want to use the &lsquo;<samp>-N</samp>&rsquo;
+option to turn off structured comments (such as &lsquo;<samp>%%Page</samp>&rsquo;).
+Otherwise, programs that read your file will assume its pages are
+independent.
+</p>
+
+<hr>
+<span id="Literal-examples"></span><div class="header">
+<p>
+Previous: <a href="#PostScript-hooks" accesskey="p" rel="prev">PostScript hooks</a>, Up: <a href="#Literal-PS" accesskey="u" rel="up">Literal PS</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Literal-examples-1"></span><h4 class="subsection">5.3.5 Literal examples</h4>
+
+<span id="index-literal-PostScript_002c-examples"></span>
+<span id="index-examples-of-literal-PostScript"></span>
+
+<p>To finish off this section, the following examples of literal PostScript
+are presented without explanation:
+</p>
+<div class="example">
+<pre class="example">\def\rotninety{\special{ps:currentpoint currentpoint translate 90
+rotate neg exch neg exch translate}}\font\huge=cmbx10 at 14.4truept
+\setbox0=\hbox to0pt{\huge A\hss}\vskip16truept\centerline{\copy0
+\special{ps:gsave}\rotninety\copy0\rotninety\copy0\rotninety
+\box0\special{ps:grestore}}\vskip16truept
+</pre></div>
+
+
+
+<div class="example">
+<pre class="example">\vbox to 2truein{\special{ps:gsave 0.3 setgray}\hrule height 2in
+width\hsize\vskip-2in\special{ps:grestore}\font\big=cminch\big
+\vss\special{ps:gsave 1 setgray}\vbox to 0pt{\vskip2pt
+\line{\hss\hskip4pt NEAT\hss}\vss}\special{ps:0 setgray}%
+\hbox{\raise2pt\line{\hss NEAT\hss}\special{ps:grestore}}\vss}
+</pre></div>
+
+
+<span id="index-_005crotninety"></span>
+<span id="index-gsave_002fgrestore_002c-and-literal-PS"></span>
+<span id="index-save_002frestore_002c-and-literal-PS"></span>
+<p>Some caveats are in order, however. Make sure that each <code>gsave</code> is
+matched with a <code>grestore</code> on the same page. Do not use <code>save</code>
+and <code>restore</code>; they can interact with the PostScript generated by
+Dvips if care is not taken. Try to understand what the above macros are
+doing before writing your own. The <code>\rotninety</code> macro especially
+has a useful trick that appears again and again.
+</p>
+
+<hr>
+<span id="Hypertext"></span><div class="header">
+<p>
+Previous: <a href="#Literal-PS" accesskey="p" rel="prev">Literal PS</a>, Up: <a href="#Interaction-with-PostScript" accesskey="u" rel="up">Interaction with PostScript</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="HyperTeXt"></span><h3 class="section">5.4 HyperTeXt</h3>
+
+<span id="index-hypertext-support"></span>
+
+<span id="index-_002dz"></span>
+<span id="index-html-specials"></span>
+<span id="index-pdfmark"></span>
+<p>Dvips has support for producing hypertext PostScript documents. If you
+specify the &lsquo;<samp>-z</samp>&rsquo; option, the <samp>html:</samp> specials described below
+will be converted into &lsquo;<samp>pdfmark</samp>&rsquo; PostScript operators to specify
+links. Without &lsquo;<samp>-z</samp>&rsquo;, <samp>html:</samp> specials are ignored.
+</p>
+<span id="index-distiller_002c-for-PDF-files"></span>
+<span id="index-PDF-files_002c-making-1"></span>
+<p>The resulting PostScript can then be processed by a distiller program to
+make a PDF file. (It can still be handled by ordinary PostScript
+interpreters as well.) Various versions of both PC and Unix distillers
+are supported; Ghostscript includes limited distiller support
+(see <a href="#Ghostscript-installation">Ghostscript installation</a>).
+</p>
+<p>Macros you can use in your TeX document to insert the specials in the
+first place are available from <samp><var>CTAN:</var>/support/hypertex</samp>. For
+CTAN info, see <a href="https://tug.org/texinfohtml/kpathsea.html#unixtex_002eftp">unixtex.ftp</a> in <cite>Kpathsea</cite>.
+</p>
+<span id="index-http_003a_002f_002fwww_002ewin_002etue_002enl_002f_007edickie_002fidvi"></span>
+<span id="index-http_003a_002f_002fxxx_002elanl_002egov_002fhypertex"></span>
+<span id="index-Doyle_002c-Mark"></span>
+<span id="index-Bhattacharya_002c-Tanmoy"></span>
+<span id="index-Java-DVI-reader"></span>
+<span id="index-idvi-Java-DVI-reader"></span>
+<span id="index-dvihps_002c-hyperdvi-to-PostScript"></span>
+<p>This hypertext support (and original form of the documentation) was
+written by Mark Doyle and Tanmoy Bhattacharya as the &lsquo;<samp>dvihps</samp>&rsquo;
+program. You can retrieve their software and additional documentation
+via the CTAN reference above.
+</p>
+
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Hypertext-caveats" accesskey="1">Hypertext caveats</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Font quality, missing character psi.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Hypertext-specials" accesskey="2">Hypertext specials</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The details on the specials.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Hypertext-caveats"></span><div class="header">
+<p>
+Next: <a href="#Hypertext-specials" accesskey="n" rel="next">Hypertext specials</a>, Up: <a href="#Hypertext" accesskey="u" rel="up">Hypertext</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hypertext-caveats-1"></span><h4 class="subsection">5.4.1 Hypertext caveats</h4>
+
+<span id="index-hypertext-caveats"></span>
+
+<span id="index-Computer-Modern-in-PostScript"></span>
+<span id="index-hypertext-and-bitmap-fonts"></span>
+<span id="index-hypertext-caveats-1"></span>
+<span id="index-embedding-Type-1-fonts"></span>
+<span id="index-PDF-files_002c-font-quality"></span>
+<p>If you intend to go all the way to PDF, you may want to use the standard
+35 PostScript fonts exclusively, since other fonts are embedded as
+bitmaps by default. The Adobe PDF readers are extremely slow when
+dealing with bitmap fonts and the results look terrible on the screen.
+Printouts will probably look fine, but may not take full advantage of a
+high-resolution printer. Alternatively, you can have your fonts
+embedded as Type 1 scalable outlines. The resulting PostScript files
+may be larger, but can be effectively rasterized at any resolution.
+They can also be converted to PDF files that can be used effectively at
+any screen or printer resolution.
+</p>
+<p>To get the TeX fonts embedded in the PostScript file as Type 1 fonts,
+add &lsquo;<samp>-Ppdf</samp>&rsquo; to the dvips command line switches. The printout
+for a run should look something like this:
+</p>
+<div class="example">
+<pre class="example"> dvips report -Ppdf -o report.ps
+ This is dvips(k) 5.86 Copyright 1999 Radical Eye Software (www.radicaleye.com)
+ ' TeX output 2001.06.15:0837' -&gt; report.ps
+ &lt;tex.pro&gt;&lt;alt-rule.pro&gt;&lt;texc.pro&gt;&lt;texps.pro&gt;&lt;special.pro&gt;.
+ &lt;cmbx9.pfb&gt;&lt;cmsy6.pfb&gt;&lt;cmsy7.pfb&gt;&lt;cmr5.pfb&gt;&lt;cmex10.pfb&gt;&lt;cmr9.pfb&gt;
+ &lt;cmmi7.pfb&gt;&lt;cmsy10.pfb&gt;&lt;cmmib10.pfb&gt;&lt;cmmi10.pfb&gt;&lt;cmti10.pfb&gt;
+ &lt;cmr7.pfb&gt;&lt;cmbx10.pfb&gt;&lt;cmr10.pfb&gt;&lt;cmti9.pfb&gt;&lt;cmr12.pfb&gt;&lt;cmbx12.pfb&gt;
+ [1] [2&lt;mean1.ps&gt;] [3&lt;bounce1-00.ps&gt;] [4]
+</pre></div>
+
+<p>An entry like &quot;&lt;cmr10.pfb&gt;&quot; indicates success: dvips found the Computer
+Modern Roman 10 point font in a PostScript Font Binary file, translated
+it to an ASCII encoding, and embedded it. You can confirm this by
+examining the PostScript output file, looking for the section starting
+<code>%%BeginFont: CMR10</code> followed by an entry <code>/FontType 1 def</code>.
+</p>
+<p>The &lsquo;<samp>-Ppdf</samp>&rsquo; option requires that the relevant outline
+(<samp>.pfa</samp> or <samp>.pfb</samp>) files be installed (see <a href="#Font-concepts">Font concepts</a>). For example, the <samp>cmr10</samp> file might be in
+<samp>/usr/share/texmf/fonts/type1/bluesky/cm/cmr10.pfb</samp>. Your TeX
+distribution may make those fonts available in a separate optional
+package (e.g., <code>tetex-extra</code> in Debian). Failing that,
+commercial versions of the Computer Modern fonts are available from
+Blue Sky; public domain versions - in particular, the lm fonts, and
+the cm-super fonts, are available from CTAN sites (for CTAN info,
+see <a href="https://tug.org/texinfohtml/kpathsea.html#unixtex_002eftp">unixtex.ftp</a> in <cite>Kpathsea</cite>).
+</p>
+<p>You can convert a PostScript file to PDF using <code>distill</code>, which
+comes with Adobe Acrobat, or <code>ps2pdf</code>, which comes with
+Ghostscript. The <code>ps2pdf</code> that comes with <code>Ghostscript</code>
+version 6.0 or earlier will not embed Type 1 fonts. Current
+recommendations are GNU Ghostscript 6.51 or Aladdin Ghostscript 7.0.
+You can check the fonts in a PDF file with Acrobat Reader by selecting
+the menu entries &lsquo;<samp>File|Document Info|Fonts</samp>&rsquo;.
+</p>
+<span id="index-psi-character-missing"></span>
+<span id="index-trailing-spaces_002c-dropped"></span>
+<span id="index-spaces_002c-dropped-trailing"></span>
+<p>Also, the Adobe distillers prior to 2.1 drop trailing space characters
+(character code 32) from strings. Unfortunately, the PostScript fonts
+use this character code for characters other than space (notably the
+Greek letter psi in the <code>Symbol</code> font), and so these characters are
+dropped. This bug is fixed in version 2.1.
+</p>
+<p>If you can&rsquo;t upgrade, one workaround is to change all the trailing
+blanks in strings to a character code that isn&rsquo;t in the font. This works
+because the default behavior is to substitute a blank for a missing
+character, i.e., the distiller is fooled into substituting the right
+character. For instance, with the Blue Sky fonts, you can globally
+replace &lsquo;<samp> )</samp>&rsquo; with &lsquo;<samp>\200)</samp>&rsquo; (with <code>sed</code>, for example) and
+get the desired result. With the public domain fonts, you will probably
+have to use a character code in the range 128 to 191 since these fonts
+duplicate the first 32 characters starting at 192 to avoid MS-DOS
+problems.
+</p>
+<p>For more information on the use of TeX to produce PDF files, see the
+article &ldquo;Creating quality Adobe PDF files from TeX with DVIPS&rdquo; by
+Kendall Whitehouse of Adobe. Adobe seems not to offer the article any
+more, but copies are available elsewhere:
+</p><div class="display">
+<pre class="display"><a href="http://www.math.hawaii.edu/~ralph/MathOnWeb/TeXPDF.html">http://www.math.hawaii.edu/~ralph/MathOnWeb/TeXPDF.html</a>
+<a href="http://www.utdallas.edu/~cantrell/online/543e.html">http://www.utdallas.edu/~cantrell/online/543e.html</a>
+</pre></div>
+
+<p>You may also want to check &ldquo;Notes on converting (La)TeX documents
+to robust PDF using Rokicki&rsquo;s dvips and Acrobat Distiller&rdquo; by Timothy
+P. Van Zandt:<br>
+<a href="http://www.emrg.com/texpdf.htmlhttp://zandtwerk.insead.fr/tex2pdf.html">http://www.emrg.com/texpdf.htmlhttp://zandtwerk.insead.fr/tex2pdf.html</a>.
+</p>
+
+<hr>
+<span id="Hypertext-specials"></span><div class="header">
+<p>
+Previous: <a href="#Hypertext-caveats" accesskey="p" rel="prev">Hypertext caveats</a>, Up: <a href="#Hypertext" accesskey="u" rel="up">Hypertext</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Hypertext-specials-1"></span><h4 class="subsection">5.4.2 Hypertext specials</h4>
+
+<span id="index-hypertext-specials"></span>
+<span id="index-specials_002c-hypertext"></span>
+
+<span id="index-Smith_002c-Arthur"></span>
+<p>Current support for the World Wide Web in the TeX system does not
+involve modifying TeX itself. We need only define some specials;
+Arthur Smith (<a href="mailto:apsmith@aps.org">apsmith@aps.org</a>), Tanmoy Bhattacharya, and Paul
+Ginsparg originally proposed and implemented the following:
+</p><div class="example">
+<pre class="example">html:&lt;a href=&quot;<var>xurl</var>&quot;&gt;
+html:&lt;a name=&quot;<var>name</var>&quot;&gt;
+html:&lt;/a&gt;
+html:&lt;img src=&quot;<var>xurl</var>&quot;&gt;
+html:&lt;base href=&quot;<var>xurl</var>&quot;&gt;
+</pre></div>
+
+<p>Like all TeX <code>\special</code>&rsquo;s, these produce no visible output, and
+are uninterpreted by TeX itself. They are instructions to DVI
+processors only.
+</p>
+<span id="index-uniform-resource-locator"></span>
+<span id="index-extended-URL"></span>
+<span id="index-URL_002c-extended-for-TeX"></span>
+<span id="index-Murphy_002c-Tim"></span>
+<p>Here, <var>xurl</var> is a standard WWW uniform resource locator (URL),
+possibly extended with a &lsquo;<samp>#<var>type</var>.<var>string</var></samp>&rsquo; construct,
+where <var>type</var> is &lsquo;<samp>page</samp>&rsquo;, &lsquo;<samp>section</samp>&rsquo;, &lsquo;<samp>equation</samp>&rsquo;,
+&lsquo;<samp>reference</samp>&rsquo; (for bibliographic references), &lsquo;<samp>figure</samp>&rsquo;,
+&lsquo;<samp>table</samp>&rsquo;, etc. For example,
+</p><div class="example">
+<pre class="example">\special{html:&lt;a href=&quot;http://www.maths.tcd.ie/~tim/ch1.dvi#equation.1.1&quot;&gt;}
+</pre></div>
+<p>is a link to equation (1.1) in an example document by Tim Murphy.
+</p>
+<span id="index-URL_002c-definition"></span>
+<p>See the URL <a href="http://www.w3.org/hypertext/WWW/Addressing/Addressing.html">http://www.w3.org/hypertext/WWW/Addressing/Addressing.html</a>
+for a precise description of base URL&rsquo;s.
+</p>
+<p>Descriptions of the <code>\special</code>&rsquo;s:
+</p><dl compact="compact">
+<dt>&lsquo;<samp>href</samp>&rsquo;
+<span id="index-href"></span>
+</dt>
+<dd><span id="index-links_002c-hypertext"></span>
+<p>Creates links in your TeX document. For example:
+</p><div class="example">
+<pre class="example">\special{html:&lt;a href=&quot;http://www.tug.org/&quot;&gt;}\TeX\ Users
+Group\special{html:&lt;/a&gt;}
+</pre></div>
+<p>The user will be able to click on the text &lsquo;TeX Users
+Group&rsquo; while running Xdvi and get to the TUG home page. (By the way,
+this is for illustration. In practice, you most likely want to use
+macros to insert the <code>\special</code> commands; reference above.)
+</p>
+</dd>
+<dt>&lsquo;<samp>name</samp>&rsquo;
+<span id="index-name"></span>
+</dt>
+<dd><span id="index-Anderson_002c-Laurie"></span>
+<p>Defines URL targets in your TeX documents, so links can be
+resolved. For example:
+</p><div class="example">
+<pre class="example">\special{html:&lt;a name=&quot;paradise&quot;&gt;}Paradise\special{html:&lt;/a&gt;}
+is exactly where you are right now.
+</pre></div>
+<p>This will resolve an &lsquo;<samp>href=&quot;#paradise&quot;</samp>&rsquo;. You&rsquo;ll also have to
+change the catcode of &lsquo;<samp>#</samp>&rsquo;, etc. It&rsquo;s usually easiest to use
+existing macro packages which take care of all the details, such as
+<samp>hyperref</samp> for LaTeX. The <a href="http://arxiv.org/hypertex/">HyperTeX FAQ</a> has more information.
+</p>
+</dd>
+<dt>&lsquo;<samp>img</samp>&rsquo;
+<span id="index-img"></span>
+</dt>
+<dd><span id="index-mailcap-and-hypertext"></span>
+<p>Links to an arbitrary external file. Interactively, a viewer is spawned
+to read the file according to the file extension and your <samp>mailcap</samp>
+file (see the Xdvi documentation).
+</p>
+</dd>
+<dt>&lsquo;<samp>base</samp>&rsquo;
+<span id="index-base"></span>
+</dt>
+<dd><p>Defines a base URL that is prepended to all the <code>name</code> targets.
+Typically unnecessary, as the name of the DVI file being read is used by
+default.
+</p></dd>
+</dl>
+
+<p>The &lsquo;<samp>img</samp>&rsquo; and &lsquo;<samp>base</samp>&rsquo; tags are not yet implemented in Dvips or
+the NeXTSTEP DVI viewer.
+</p>
+
+<hr>
+<span id="PostScript-fonts"></span><div class="header">
+<p>
+Next: <a href="#Color" accesskey="n" rel="next">Color</a>, Previous: <a href="#Interaction-with-PostScript" accesskey="p" rel="prev">Interaction with PostScript</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="PostScript-fonts-1"></span><h2 class="chapter">6 PostScript fonts</h2>
+
+<span id="index-PostScript-fonts"></span>
+
+<p>Dvips supports the use of PostScript fonts in TeX documents. To use
+a PostScript font conveniently, you need to prepare a corresponding
+virtual font; the program Afm2tfm, supplied with Dvips, helps
+with that.
+</p>
+<p>All the necessary support for the standard 35 PostScript fonts
+(&lsquo;<samp>AvantGarde-Book</samp>&rsquo; through &lsquo;<samp>ZapfDingbats</samp>&rsquo;), plus other freely
+or commonly available PostScript fonts is available along with Dvips.
+To use these fonts, you need do nothing beyond what is mentioned in the
+installation procedure (see <a href="#Installation">Installation</a>). This chapter is
+therefore relevant only if you are installing new PostScript fonts not
+supplied with Dvips. (Or if you&rsquo;re curious.)
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Font-concepts" accesskey="1">Font concepts</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Metrics, glyphs, virtual fonts, and encodings.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Making-a-font-available" accesskey="2">Making a font available</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Installing and using a PostScript font.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Invoking-afm2tfm" accesskey="3">Invoking afm2tfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Creating TFM and AFM files for a virtual font.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#psfonts_002emap" accesskey="4">psfonts.map</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Defining available PostScript fonts.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Font-concepts"></span><div class="header">
+<p>
+Next: <a href="#Making-a-font-available" accesskey="n" rel="next">Making a font available</a>, Up: <a href="#PostScript-fonts" accesskey="u" rel="up">PostScript fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Font-concepts-1"></span><h3 class="section">6.1 Font concepts</h3>
+
+<span id="index-font-concepts"></span>
+
+<p>The information needed to typeset using a particular font is contained
+in two files: a <em>metric file</em> that contains shape-independent
+information and a <em>glyph file</em> that contains the actual shapes of
+the font&rsquo;s characters. A <em>virtual font</em> is an optional additional
+file that can specify special ways to construct the characters. TeX
+itself (or LaTeX) look only at the metric file, but DVI drivers such
+as Dvips look at all three of these files.
+</p>
+<p>An <em>encoding file</em> defines the correspondence between the code
+numbers of the characters in a font and their descriptive names. Two
+encoding files used together can describe a reencoding that rearranges,
+i.e., renumbers, the characters of a font.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Metric-files" accesskey="1">Metric files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Shape-independent font information.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Glyph-files" accesskey="2">Glyph files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Character shapes.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Virtual-fonts" accesskey="3">Virtual fonts</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Constructing one font from others.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Encodings" accesskey="4">Encodings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Character codes and character names.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#PostScript-typesetting" accesskey="5">PostScript typesetting</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How PostScript typesets a character.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Metric-files"></span><div class="header">
+<p>
+Next: <a href="#Glyph-files" accesskey="n" rel="next">Glyph files</a>, Up: <a href="#Font-concepts" accesskey="u" rel="up">Font concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Metric-files-1"></span><h4 class="subsection">6.1.1 Metric files</h4>
+
+<span id="index-metric-files"></span>
+
+<p>A <em>metric file</em> describes properties of the font that are
+independent of what the characters actually look like. Aside from
+general information about the font itself, a metric file has two kinds
+of information: information about individual characters, organized by
+character code, and information about sequences of characters.
+</p>
+<p>The per-character information specifies the width, height, depth, and
+italic correction of each character in the font. Any might be zero.
+</p>
+<span id="index-kerning_002c-defined"></span>
+<span id="index-ligature_002c-defined"></span>
+<p>In addition to information on individual characters, the metric file
+specifies <em>kerning</em>, i.e., adding or removing space between
+particular character pairs. It further specifies <em>ligature</em>
+information: when a sequence of input characters should be typeset as a
+single (presumably different) &ldquo;ligature&rdquo; character. For example, it&rsquo;s
+traditional for the input &lsquo;<samp>fi</samp>&rsquo; to be typeset as &lsquo;fi&rsquo;, not as
+&lsquo;<span class="roman">f</span><span class="roman">i</span>&rsquo; (with the dot of the &lsquo;i&rsquo; colliding with &lsquo;f&rsquo;). (In English,
+the only common ligatures are fi, fl, ff, ffi, and ffl.)
+</p>
+<p>Different typesetting systems use different metric file formats:
+</p>
+<ul>
+<li> <span id="index-afm-files"></span>
+<span id="index-_002eafm-Adobe-metric-files"></span>
+Each Postscript font has an <em>Adobe font metrics</em> (&lsquo;<samp>.afm</samp>&rsquo;)
+file. These files are plain text, so you can inspect them easily. You
+can get AFM files for Adobe&rsquo;s fonts from
+<a href="ftp://ftp.adobe.com/pub/adobe/Fonts/AFMs">ftp://ftp.adobe.com/pub/adobe/Fonts/AFMs</a>.
+
+</li><li> <span id="index-tfm-files"></span>
+<span id="index-_002etfm-TeX-font-metric-files"></span>
+TeX uses <em>TeX font metrics</em> (&lsquo;<samp>.tfm</samp>&rsquo;) files. When you say
+&lsquo;<samp>\font = <var>font</var></samp>&rsquo; in your TeX document, TeX reads a file
+named &lsquo;<samp><var>font</var>.tfm</samp>&rsquo;. (Well, except for the <samp>texfonts.map</samp>
+feature; see <a href="https://tug.org/texinfohtml/kpathsea.html#Fontmap">Fontmap</a> in <cite>Kpathsea</cite>). TeX can then
+calculate the space occupied by characters from the font when
+typesetting. In addition, the DVI drivers you use to print or view the
+DVI file produced by TeX may need to look at the TFM file.
+
+<span id="index-property-list-files"></span>
+<span id="index-tftopl"></span>
+<span id="index-pltotf"></span>
+<span id="index-_002epl-property-list-files"></span>
+<p>TFM files are binary (and hence are typically much smaller than AFM
+files). You can use the <code>tftopl</code> program (see <a href="https://tug.org/texinfohtml/web2c.html#tftopl-invocation">tftopl
+invocation</a> in <cite>Web2c</cite>) that comes with TeX to transform a TFM
+file into a human-readable &ldquo;property list&rdquo; (&lsquo;<samp>.pl</samp>&rsquo;) file. You can
+also edit a PL file and transform it back to a TeX-readable TFM with
+the companion program <code>pltotf</code> (see <a href="https://tug.org/texinfohtml/web2c.html#pltotf-invocation">pltotf invocation</a> in <cite>Web2c</cite>). Editing metrics by hand is not something you&rsquo;re likely to want
+to do often, but the capability is there.
+</p>
+</li><li> <span id="index-pfm-files"></span>
+<span id="index-_002epfm-printer-font-metric-files"></span>
+ATM and other typesetting systems use <em>printer font metric</em>
+(&lsquo;<samp>.pfm</samp>&rsquo;) files. These are binary files. They are irrelevant in the
+TeX world, and not freely available, so we will not discuss them
+further.
+
+</li></ul>
+
+<p>The Afm2tfm program distributed with Dvips converts an AFM file
+to a TFM file and performs other useful transformations as well.
+See <a href="#Invoking-afm2tfm">Invoking afm2tfm</a>.
+</p>
+
+<hr>
+<span id="Glyph-files"></span><div class="header">
+<p>
+Next: <a href="#Virtual-fonts" accesskey="n" rel="next">Virtual fonts</a>, Previous: <a href="#Metric-files" accesskey="p" rel="prev">Metric files</a>, Up: <a href="#Font-concepts" accesskey="u" rel="up">Font concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Glyph-files-1"></span><h4 class="subsection">6.1.2 Glyph files</h4>
+
+<span id="index-glyph-files"></span>
+
+<p>Although a metric file (see the previous section) contains information
+about the spatial and other properties of the character at position 75,
+say, it contains nothing about what the character at position 75
+actually looks like. The glyphs&mdash;the actual shapes of the letterforms
+in a font&mdash;are defined by other files, which we call glyph files.
+TeX itself only reads the TFM file for a font; it does not need to
+know character shapes.
+</p>
+<p>A <em>glyph file</em> is a file that defines the shapes of the characters
+in a font. The shapes can be defined either by outlines or by bitmaps.
+</p>
+<span id="index-outline-fonts"></span>
+<span id="index-arcs"></span>
+<span id="index-splines"></span>
+<p>PostScript fonts are defined as <em>outline fonts</em>: Each character in
+the font is defined by giving the mathematical curves (lines, arcs, and
+splines) that define its contours. Different sizes of a character are
+generated by linearly scaling a single shape. For example, a 10-point
+&lsquo;A&rsquo; is simply half the size of a 20-point &lsquo;A&rsquo;. Nowadays, outline fonts
+usually also contain <em>hints</em>&mdash;additional information to improve the
+appearance of the font at small sizes or low resolutions.
+</p>
+<span id="index-Type-1-fonts"></span>
+<span id="index-pfa-files"></span>
+<span id="index-pfb-files"></span>
+<span id="index-_002epfa-printer-font-ascii-files"></span>
+<span id="index-_002epfb-printer-font-binary-files"></span>
+<p>Although various kinds of PostScript outline fonts exist, by far the
+most common, and the only one we will consider, is called <em>Type 1</em>.
+The glyph files for Postscript Type 1 fonts typically have names ending
+in &lsquo;<samp>.pfa</samp>&rsquo; (&ldquo;printer font ASCII&rdquo;) or &lsquo;<samp>.pfb</samp>&rsquo; (&ldquo;printer font
+binary&rdquo;).
+</p>
+<span id="index-bitmap-fonts"></span>
+<span id="index-_002emf-Metafont-source-files"></span>
+<span id="index-Metafont-source-files"></span>
+<p>In contrast, glyph files for Computer Modern and the other standard
+TeX fonts are <em>bitmap fonts</em>, generated from Metafont
+(&lsquo;<samp>.mf</samp>&rsquo;) descriptions. The Metafont program distributed with TeX
+generates bitmaps from these descriptions.
+</p>
+<span id="index-pk-files"></span>
+<span id="index-_002ennnpk-packed-font-bitmaps"></span>
+<p>The glyph files for TeX bitmap fonts are usually stored in
+<em>packed font</em> (PK) files. The names of these files end in
+&lsquo;<samp>.<var>nnn</var>pk</samp>&rsquo;, where <var>nnn</var> is the resolution of the font in
+dots per inch. For example, <samp>cmr10.600pk</samp> contains the bitmaps for
+the &lsquo;<samp>cmr10</samp>&rsquo; font at a resolution of 600dpi. (On DOS
+filesystems, it&rsquo;s more likely <samp>dpi600\cmr10.pk</samp>.)
+</p>
+<span id="index-gf-files"></span>
+<span id="index-gftopk"></span>
+<p>Metafont actually outputs <em>generic font</em> (GF) files, e.g.,
+<samp>cmr10.600gf</samp>, but the GF files are usually converted immediately
+to PK format (using the <code>gftopk</code> utility that comes with TeX)
+since PK files are smaller and contain the same information. (The GF
+format is a historical artifact.)
+</p>
+
+<hr>
+<span id="Virtual-fonts"></span><div class="header">
+<p>
+Next: <a href="#Encodings" accesskey="n" rel="next">Encodings</a>, Previous: <a href="#Glyph-files" accesskey="p" rel="prev">Glyph files</a>, Up: <a href="#Font-concepts" accesskey="u" rel="up">Font concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Virtual-fonts-1"></span><h4 class="subsection">6.1.3 Virtual fonts</h4>
+
+<span id="index-virtual-fonts"></span>
+
+<p>A <em>virtual font</em> is constructed by extracting characters from one or
+more existing fonts and rearranging them, or synthesizing new characters
+in various ways. The explanation in this manual is intended to suffice
+for understanding enough about virtual fonts to use them with Dvips. It
+isn&rsquo;t a reference manual on virtual fonts. For more information: The
+primary document on virtual fonts is Donald E. Knuth, <cite>TUGboat</cite>
+11(1), Apr. 1990, pp. 13&ndash;23, &ldquo;Virtual Fonts: More Fun for Grand
+Wizards&rdquo; (<samp><var>CTAN:</var>/info/virtual-fonts.knuth</samp>; for CTAN info,
+see <a href="https://tug.org/texinfohtml/kpathsea.html#unixtex_002eftp">unixtex.ftp</a> in <cite>Kpathsea</cite>). (Don&rsquo;t be intimidated by
+the subtitle.)
+</p>
+<span id="index-vf-files"></span>
+<span id="index-vpl-files"></span>
+<p>A virtual font (&lsquo;<samp>.vf</samp>&rsquo;) file specifies, for each character in the
+virtual font, a recipe for typesetting that character. A VF file, like
+a TFM file, is in a compressed binary format. The <code>vftovp</code> and
+<code>vptovf</code> programs convert a VF file to a human-readable VPL
+(virtual property list) format and back again. See <a href="https://tug.org/texinfohtml/web2c.html#vftovp-invocation">vftovp
+invocation</a> in <cite>Web2c</cite>, and <a href="https://tug.org/texinfohtml/web2c.html#vptovf-invocation">vptovf invocation</a> in <cite>Web2c</cite>.
+</p>
+<span id="index-base-fonts"></span>
+<p>In the case of a PostScript font <var>f</var> being used in a straightforward
+way, the recipe says: character <var>i</var> in the VF font is character
+<var>j</var> in font <var>f</var>. The font <var>f</var> is called a <em>base font</em>.
+For example, the VF file could remap the characters of the PostScript
+font to the positions where TeX expects to find them.
+See <a href="#Encodings">Encodings</a>.
+</p>
+<p>Since TeX reads only TFM files, not VF&rsquo;s, each VF must have a
+corresponding TFM for use with TeX. This corresponding TFM is
+created when you run <code>vptovf</code>.
+</p>
+<span id="index-expansion_002c-of-virtual-fonts"></span>
+<span id="index-virtual-font-expansion"></span>
+<p>You can <em>expand</em> virtual fonts into their base fonts with DVIcopy
+(see <a href="https://tug.org/texinfohtml/web2c.html#dvicopy-invocation">dvicopy invocation</a> in <cite>Web2c</cite>). This is useful if you are
+using a DVI translator that doesn&rsquo;t understand vf&rsquo;s itself.
+</p>
+
+<hr>
+<span id="Encodings"></span><div class="header">
+<p>
+Next: <a href="#PostScript-typesetting" accesskey="n" rel="next">PostScript typesetting</a>, Previous: <a href="#Virtual-fonts" accesskey="p" rel="prev">Virtual fonts</a>, Up: <a href="#Font-concepts" accesskey="u" rel="up">Font concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Encodings-1"></span><h4 class="subsection">6.1.4 Encodings</h4>
+
+<span id="index-encodings"></span>
+
+<p>Every font, whatever its type, has an <em>encoding</em>, that specifies the
+correspondence between &ldquo;logical&rdquo; characters and character codes. For
+example, the ASCII encoding specifies that the character numbered 65
+(decimal) is an uppercase &lsquo;A&rsquo;. The encoding does not specify what the
+character at that position looks like; there are lots of ways to draw an
+&lsquo;A&rsquo;, and a glyph file (see <a href="#Glyph-files">Glyph files</a>) tells how. Nor does it
+specify how much space that character occupies; that information is in a
+metric file (see <a href="#Metric-files">Metric files</a>).
+</p>
+<span id="index-Computer-Modern_002c-encoding-of"></span>
+<p>TeX implicitly assumes a particular encoding for the fonts you use
+with it. For example, the plain TeX macro <code>\'</code>, which typesets
+an acute accent over the following letter, assumes the acute accent is
+at position 19 (decimal). This happens to be true of standard TeX
+fonts such as Computer Modern, as you might expect, but it is not true
+of normal PostScript fonts.
+</p>
+<p>It&rsquo;s possible but painful to change all the macros that assume
+particular character positions. A better solution is to create a new
+font with the information for the acute accent at position 19, where
+TeX expects it to be. See <a href="#Making-a-font-available">Making a font available</a>.
+</p>
+<span id="index-PostScript-encoding"></span>
+<span id="index-encoding-files"></span>
+<span id="index-encoding-vectors_002c-defined"></span>
+
+<p>PostScript represents encodings as a sequence of 256 character names
+called an <em>encoding vector</em>. An <em>encoding file</em> (&lsquo;<samp>.enc</samp>&rsquo;)
+gives such a vector, together with ligature and kerning information
+(with which we are not concerned at the moment). These encoding files
+are used by the Afm2tfm program. Encoding files are also downloaded to
+the PostScript interpreter in your printer if you use one of them in
+place of the default encoding vector for a particular PostScript font.
+</p>
+<span id="index-dvips_002eenc"></span>
+<span id="index-8r_002eenc"></span>
+<span id="index-texmext_002eenc"></span>
+<span id="index-texmital_002eenc"></span>
+<span id="index-texmsym_002eenc"></span>
+<span id="index-reencode_002f_002a_002eenc"></span>
+<p>Examples of encodings: the <samp>dvips.enc</samp> encoding file that comes
+with the Fontname distribution (<a href="http://tug.org/fontname">http://tug.org/fontname</a>) is a
+good (but not perfect) approximation to the TeX encoding for
+TeX&rsquo;s Computer Modern text fonts. This is the encoding of the
+fonts that originated with Dvips, such as <samp>ptmr.tfm</samp>. The
+distribution includes many other encoding files; for example,
+<samp>8r.enc</samp>, which is the base font for the current PostScript font
+distribution, and three corresponding to the TeX mathematics fonts:
+<samp>texmext.enc</samp> for math extensions, <samp>texmital.enc</samp> for math
+italics, and <samp>texmsym.enc</samp> for math symbols.
+</p>
+
+<hr>
+<span id="PostScript-typesetting"></span><div class="header">
+<p>
+Previous: <a href="#Encodings" accesskey="p" rel="prev">Encodings</a>, Up: <a href="#Font-concepts" accesskey="u" rel="up">Font concepts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="How-PostScript-typesets-a-character"></span><h4 class="subsection">6.1.5 How PostScript typesets a character</h4>
+
+<span id="index-typesetting-in-PostScript"></span>
+<span id="index-character-lookup-procedure-in-PostScript"></span>
+
+<p>The output of Dvips is a program in the PostScript language that
+instructs your (presumably PostScript-capable) printer how to typeset
+your document by transforming it into toner on paper. Your printer, in
+turn, contains a PostScript interpreter that carries out the
+instructions in this typesetting program.
+</p>
+<p>The program must include the definition of any PostScript fonts that you
+use in your document. Fonts built into your printer (probably the
+standard 35: &lsquo;<samp>Times-Roman</samp>&rsquo;, &lsquo;<samp>ZapfDingbats</samp>&rsquo;, &hellip;) are
+defined within the interpreter itself. Other fonts must be downloaded
+as pfa or pfb files (see <a href="#Glyph-files">Glyph files</a>) from your host (the computer
+on which you&rsquo;re running Dvips).
+</p>
+<p>You may be wondering exactly how a PostScript interpreter figures out
+what character to typeset, with this mass of metrics, glyphs, encodings,
+and other information. (If you&rsquo;re not wondering, skip this section
+&hellip;)
+</p>
+<span id="index-show-PostScript-operator"></span>
+<p>The basic PostScript operator for imaging characters is
+<code>show</code>. Suppose you&rsquo;ve asked TeX to typeset an &lsquo;S&rsquo;. This will
+eventually wind up in the Dvips output as the equivalent of this
+PostScript operation:
+</p>
+<div class="example">
+<pre class="example">(S) show
+</pre></div>
+
+<p>Here is how PostScript typesets the &lsquo;S&rsquo;:
+</p>
+<ol>
+<li> <span id="index-ASCII-character-codes_002c-used-by-PostScript"></span>
+PostScript interpreters use ASCII; therefore &lsquo;S&rsquo; is represented as the
+integer 83. (Any of the 256 possible characters representable in a
+standard 8-bit byte can be typeset.)
+
+</li><li> <span id="index-current-font_002c-in-PostScript"></span>
+<span id="index-dictionary_002c-PostScript-language"></span>
+A PostScript <em>dictionary</em> is a mapping of names to arbitrary values.
+A font, to the interpreter, is a dictionary which contains entries for
+certain names. (If these entries are missing, the interpreter refuses
+to do anything with that font.)
+
+<p>PostScript has a notion of &ldquo;the current font&rdquo;&mdash;whatever font is
+currently being typeset in.
+</p>
+</li><li> <span id="index-encoding-vectors_002c-in-Type-1-fonts"></span>
+<span id="index-Encoding-Type-1-dictionary"></span>
+One of the mandatory entries in a font dictionary is &lsquo;<samp>Encoding</samp>&rsquo;,
+which defines the encoding vector (see <a href="#Encodings">Encodings</a>) for that font.
+This vector of 256 names maps each possible input character to a name.
+
+</li><li> The interpreter retrieves the entry at position 83 of the encoding
+vector. This value is a PostScript name: <code>/S</code>.
+
+</li><li> <span id="index-CharStrings-Type-1-dictionary"></span>
+<span id="index-dictionary_002c-CharStrings"></span>
+For Type 1 fonts (we&rsquo;re not going to discuss anything else), the
+interpreter now looks up <code>/S</code> as a key in a dictionary named
+<code>CharStrings</code>, another mandatory entry in a font dictionary.
+
+</li><li> <span id="index-hints"></span>
+<span id="index-character-definitions-in-PostScript"></span>
+The value of <code>S</code> in <code>CharStrings</code> is the equivalent of a
+series of standard PostScript commands like &lsquo;<samp>curveto</samp>&rsquo;,
+&lsquo;<samp>lineto</samp>&rsquo;, &lsquo;<samp>fill</samp>&rsquo;, and so on. These commands are executed to
+draw the character. There can also be <em>hint information</em> that helps
+adapt the character to low-resolution rasters. (See <a href="#Glyph-files">Glyph files</a>.)
+The commands are actually represented in a more compact way than
+standard PostScript source; see the Type 1 book for details.
+
+</li></ol>
+
+<p>This method for typesetting characters is used in both Level 1 and Level
+2 PostScript. See the PostScript reference manuals for more
+information.
+</p>
+
+<hr>
+<span id="Making-a-font-available"></span><div class="header">
+<p>
+Next: <a href="#Invoking-afm2tfm" accesskey="n" rel="next">Invoking afm2tfm</a>, Previous: <a href="#Font-concepts" accesskey="p" rel="prev">Font concepts</a>, Up: <a href="#PostScript-fonts" accesskey="u" rel="up">PostScript fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Making-a-PostScript-font-available"></span><h3 class="section">6.2 Making a PostScript font available</h3>
+
+<span id="index-installing-fonts"></span>
+<span id="index-fonts_002c-installing"></span>
+
+<p>To make a PostScript font available in a TeX document, you need to
+install the font on your system and then define it within the document.
+Once you have installed the font, of course, it is available for any
+document thereafter and you don&rsquo;t need to reinstall it. You must have
+an AFM file for any font you install. Unless the font is built into your
+printer, you must also have a PFA or PFB file.
+</p>
+<p>In the following examples, we use the font &lsquo;<samp>Times-Roman</samp>&rsquo; to
+illustrate the process. But you should use the prebuilt fonts for Times
+and the other standard fonts, rather than rebuilding them. The prebuilt
+fonts are made using a more complicated process than that described
+here, to make them work as well as possible with TeX. So following
+the steps in this manual will not generate files identical to the
+distributed ones. See <a href="#PostScript-font-installation">PostScript font installation</a>, for pointers to
+the prebuilt fonts.
+</p>
+<p>Installation of a PostScript font proceeds in three steps. See <a href="#Font-concepts">Font concepts</a>, for descriptions of the various files involved.
+</p>
+<ol>
+<li> Run <code>afm2tfm</code> to create a TFM file for the original font,
+and the VPL form of the virtual font:
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -v ptmr rptmr
+</pre></div>
+
+</li><li> Run <code>vptovf</code> to generate a VF and TFM file for the virtual font
+from the VPL file:
+<div class="example">
+<pre class="example">vptovf ptmr.vpl ptmr.vf ptmr.tfm
+</pre></div>
+
+</li><li> Insert an entry for the font in <samp>psfonts.map</samp> (see <a href="#psfonts_002emap">psfonts.map</a>):
+<div class="example">
+<pre class="example">rptmr Times-Roman &lt;ptmr8a.pfa
+</pre></div>
+
+</li><li> Install the files in the standard locations, as in:
+<div class="example">
+<pre class="example">cp ptmr.vf <var>fontdir</var>/vf/&hellip;
+cp *ptmr.tfm <var>fontdir</var>/tfm/&hellip;
+cp ptmr.afm <var>fontdir</var>/afm/&hellip;
+cp ptmr.pf? <var>fontdir</var>/type1/&hellip;
+</pre></div>
+</li></ol>
+
+<p>The simplest invocation of Afm2tfm to make virtual fonts goes something
+like this:
+</p>
+<span id="index-afm2tfm"></span>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -v ptmr rptmr
+</pre></div>
+
+<p>This reads the file <samp>Times-Roman.afm</samp>, and produces two files as
+output, namely the virtual property list&rsquo;file <samp>ptmr.vpl</samp>, and the
+&ldquo;raw&rdquo; font metric file <samp>rptmr.tfm</samp>. To use the font in TeX,
+you first run
+</p>
+<span id="index-vptovf"></span>
+<div class="example">
+<pre class="example">vptovf ptmr.vpl ptmr.vf ptmr.tfm
+</pre></div>
+
+<p>You should then install the virtual font file <samp>ptmr.vf</samp> where Dvips
+will see it and install <samp>ptmr.tfm</samp> and <samp>rptmr.tfm</samp> where
+TeX and Dvips will see them.
+</p>
+<p>Using these raw fonts is not recommended; there are no raw fonts in the
+prebuilt PostScript fonts distributed along with Dvips. But
+nevertheless, that&rsquo;s how Afm2tfm presently operates, so that&rsquo;s what we
+document here. The &lsquo;<samp>r</samp>&rsquo; prefix convention is likewise historical
+accident.
+</p>
+<p>You can also make more complex virtual fonts by editing <samp>ptmr.vpl</samp>
+before running &lsquo;<samp>vptovf</samp>&rsquo;; such editing might add the uppercase Greek
+characters in the standard TeX positions, for instance. (This has
+already been done for the prebuilt fonts.)
+</p>
+<p>Once the files have been installed, you&rsquo;re all set. You can now do
+things like this in TeX:
+</p><div class="example">
+<pre class="example">\font\myfont = ptmr at 12pt
+\myfont Hello, I am being typeset in 12-point Times-Roman.
+</pre></div>
+
+<p>Thus, we have two fonts, one actual (&lsquo;<samp>rptmr</samp>&rsquo;, which is analogous to
+the font in the printer) and one virtual (&lsquo;<samp>ptmr</samp>&rsquo;, which has been
+remapped to the standard TeX encoding (almost)), and has typesetting
+know-how added. You could also say
+</p>
+<div class="example">
+<pre class="example">\font\raw = rptmr at 10pt
+</pre></div>
+
+<p>and typeset directly with that, but then you would have no ligatures or
+kerning, and you would have to use Adobe character positions for special
+letters like
+The virtual font &lsquo;<samp>ptmr</samp>&rsquo; not only has ligatures and kerning, and
+most of the standard accent conventions of TeX, it also has a few
+additional features not present in the Computer Modern fonts. For
+example, it includes all the Adobe characters (such as the Polish ogonek
+and the French guillemots). The only things you lose from ordinary
+TeX text fonts are the dotless &lsquo;j&rsquo; (which can be hacked into the VPL
+file with literal PostScript specials if you have the patience) and
+uppercase Greek letters (which just don&rsquo;t exist unless you buy them
+separately). See <a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a>.
+</p>
+<p>As a final step you need to record information about both the virtual
+font and the original font (if you ever might want to use it) in the
+<samp>psfonts.map</samp> file (see <a href="#psfonts_002emap">psfonts.map</a>). For our example, you&rsquo;d
+insert the following into <samp>psfonts.map</samp>:
+</p><div class="example">
+<pre class="example">rptmr Times-Roman &lt;ptmr8a.pfa
+</pre></div>
+
+<p>Of course, <code>Times-Roman</code> is already built in to most every
+printer, so there&rsquo;s no need to download any Type 1 file for it. But if
+you are actually following these instructions for new fonts, most likely
+they are not built in to the printer.
+</p>
+<span id="index-memory_002c-used-by-PostScript-fonts"></span>
+<span id="index-efficiency_002c-and-fonts"></span>
+<p>These PostScript fonts can be scaled to any size. Go wild! Using
+PostScript fonts, however, does use up a great deal of the printer&rsquo;s
+memory and it does take time. You may find downloading bitmap fonts
+(possibly compressed, with the &lsquo;<samp>Z</samp>&rsquo; option) to be faster than using
+the built-in PostScript fonts.
+</p>
+
+<hr>
+<span id="Invoking-afm2tfm"></span><div class="header">
+<p>
+Next: <a href="#psfonts_002emap" accesskey="n" rel="next">psfonts.map</a>, Previous: <a href="#Making-a-font-available" accesskey="p" rel="prev">Making a font available</a>, Up: <a href="#PostScript-fonts" accesskey="u" rel="up">PostScript fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Invoking-Afm2tfm"></span><h3 class="section">6.3 Invoking Afm2tfm</h3>
+
+<span id="index-afm2tfm-1"></span>
+
+<p>The Afm2tfm program converts an AFM file for a PostScript font to a TFM
+file and a VPL file for a corresponding virtual font (or, in its
+simplest form, to a TFM file for the PostScript font itself). The
+results of the conversion are affected by the command-line options and
+especially by the reencodings you can specify with those options. You
+can also obtain special effects such as an oblique font.
+</p>
+<span id="index-fontinst"></span>
+<span id="index-virtual-fonts_002c-creating"></span>
+<span id="index-Jeffrey_002c-Alan"></span>
+<p>Alternatives to Afm2tfm for creating virtual fonts include
+<code>fontinst</code> <a href="http://ctan.org/pkg/fontinst">http://ctan.org/pkg/fontinst</a>,
+<code>lcdf-typetools</code>, particularly <code>otftotfm</code>
+(<a href="http://ctan.org/pkg/lcdf-typetools">http://ctan.org/pkg/lcdf-typetools</a>), and <code>afm2p</code>
+(<a href="http://tex.aanhet.net/afm2pl/">http://tex.aanhet.net/afm2pl/</a>), among others.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Changing-font-encodings" accesskey="1">Changing font encodings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Reencoding with -t, -p, -T.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Special-font-effects" accesskey="2">Special font effects</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Oblique fonts, small caps, and such.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Afm2tfm-options" accesskey="3">Afm2tfm options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">afm2tfm command-line options.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Changing-font-encodings"></span><div class="header">
+<p>
+Next: <a href="#Special-font-effects" accesskey="n" rel="next">Special font effects</a>, Up: <a href="#Invoking-afm2tfm" accesskey="u" rel="up">Invoking afm2tfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Changing-font-encodings-1"></span><h4 class="subsection">6.3.1 Changing font encodings</h4>
+
+<span id="index-encoding-changes"></span>
+<span id="index-fonts_002c-changing-encoding-of"></span>
+
+<p>Afm2tfm allows you to specify a different encoding for a PostScript font
+(for a general introduction to encodings, see <a href="#Encodings">Encodings</a>). The
+&lsquo;<samp>-t</samp>&rsquo; option changes the TeX encoding, &lsquo;<samp>-p</samp>&rsquo; changes the
+PostScript encoding, and &lsquo;<samp>-T</samp>&rsquo; changes both simultaneously, as
+detailed in the sections below.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Changing-TeX-encodings" accesskey="1">Changing TeX encodings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Where TeX finds a character.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Changing-PostScript-encodings" accesskey="2">Changing PostScript encodings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Where PostScript finds a character.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Changing-both-encodings" accesskey="3">Changing both encodings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">One and the same, simultaneously.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Reencoding-with-Afm2tfm" accesskey="4">Reencoding with Afm2tfm</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Problems with the default encoding.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Encoding-file-format" accesskey="5">Encoding file format</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Syntax of an encoding file.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Changing-TeX-encodings"></span><div class="header">
+<p>
+Next: <a href="#Changing-PostScript-encodings" accesskey="n" rel="next">Changing PostScript encodings</a>, Up: <a href="#Changing-font-encodings" accesskey="u" rel="up">Changing font encodings</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_002dt_003a-Changing-TeX-encodings"></span><h4 class="subsubsection">6.3.1.1 &lsquo;<samp>-t</samp>&rsquo;: Changing TeX encodings</h4>
+
+<span id="index-changing-TeX-encodings"></span>
+<span id="index-TeX-encoding_002c-changing"></span>
+
+<span id="index-_002dt-tex_002denc"></span>
+<p>To build a virtual font with Afm2tfm, you specify the &lsquo;<samp>-v</samp>&rsquo; or
+&lsquo;<samp>-V</samp>&rsquo; option. You can then specify an encoding for that virtual font
+with &lsquo;<samp>-t <var>tex-enc</var></samp>&rsquo;. (&lsquo;<samp>-t</samp>&rsquo; is ignored if neither
+&lsquo;<samp>-v</samp>&rsquo; nor &lsquo;<samp>-V</samp>&rsquo; is present.) Any ligature and kerning
+information you specify in <var>tex-enc</var> will be used in the VPL, in
+addition to the ligature and kerning information from the AFM file.
+</p>
+<p>If the AFM file has no entry for a character specified in <var>tex-enc</var>,
+that character will be omitted from the output VPL.
+</p>
+<span id="index-texmsym_002eenc-1"></span>
+<p>The &lsquo;<samp>-t</samp>&rsquo; option is likely to be needed when you have a PostScript
+font corresponding to a TeX font other than a normal text font such
+as Computer Modern. For instance, if you have a PostScript font that
+contains math symbols, you&rsquo;d probably want to use the encoding in the
+<samp>texmsym.enc</samp> file supplied with Dvips. (For a start; to actually
+get usable math fonts, you have to define much more than just an
+encoding.)
+</p>
+
+<hr>
+<span id="Changing-PostScript-encodings"></span><div class="header">
+<p>
+Next: <a href="#Changing-both-encodings" accesskey="n" rel="next">Changing both encodings</a>, Previous: <a href="#Changing-TeX-encodings" accesskey="p" rel="prev">Changing TeX encodings</a>, Up: <a href="#Changing-font-encodings" accesskey="u" rel="up">Changing font encodings</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_002dp_003a-Changing-PostScript-encodings"></span><h4 class="subsubsection">6.3.1.2 &lsquo;<samp>-p</samp>&rsquo;: Changing PostScript encodings</h4>
+
+<span id="index-changing-PostScript-encodings"></span>
+<span id="index-PostScript-encoding_002c-changing"></span>
+<span id="index-_002dp-ps_002denc"></span>
+
+<p>By default, Afm2tfm uses the encoding it finds in the AFM file. You can
+specify a different PostScript encoding with &lsquo;<samp>-p <var>ps-enc</var></samp>&rsquo;.
+This makes the raw TFM file (the one output by Afm2tfm) have the
+encoding specified in the encoding file <var>ps-enc</var>. Any ligature or
+kern information specified in <var>ps-enc</var> is ignored by Afm2tfm, since
+ligkern info is always omitted from the raw TFM.
+</p>
+<p>If you use this option, you must also arrange to download <var>ps-enc</var>
+as part of any document that uses this font. You do this by adding a
+line like the following one to <samp>psfonts.map</samp> (see <a href="#psfonts_002emap">psfonts.map</a>):
+</p><div class="example">
+<pre class="example">zpopr Optima &quot;MyEncoding ReEncodeFont&quot; &lt;myenc.enc
+</pre></div>
+
+<span id="index-trademark-character_002c-accessing"></span>
+<span id="index-registered-character_002c-accessing"></span>
+<span id="index-extra-characters_002c-accessing"></span>
+<p>Using &lsquo;<samp>-p</samp>&rsquo; is the only way to access characters in a PostScript
+font that are neither encoded in the AFM file nor constructed from other
+characters. For instance, Adobe&rsquo;s &lsquo;<samp>Times-Roman</samp>&rsquo; font contains the
+extra characters &lsquo;<samp>trademark</samp>&rsquo; and &lsquo;<samp>registered</samp>&rsquo; (among others);
+these can only be accessed through such a PostScript reencoding.
+</p>
+<span id="index-8r-encoding_002c-and-extra-characters"></span>
+<p>The &lsquo;8r&rsquo; base encoding used for the current PostScript font
+distribution does do this reencoding, for precisely this reason.
+</p>
+
+<hr>
+<span id="Changing-both-encodings"></span><div class="header">
+<p>
+Next: <a href="#Reencoding-with-Afm2tfm" accesskey="n" rel="next">Reencoding with Afm2tfm</a>, Previous: <a href="#Changing-PostScript-encodings" accesskey="p" rel="prev">Changing PostScript encodings</a>, Up: <a href="#Changing-font-encodings" accesskey="u" rel="up">Changing font encodings</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="g_t_002dT_003a-Changing-both-TeX-and-PostScript-encodings"></span><h4 class="subsubsection">6.3.1.3 &lsquo;<samp>-T</samp>&rsquo;: Changing both TeX and PostScript encodings</h4>
+
+<span id="index-_002dT-enc_002dfile"></span>
+
+<p>The option &lsquo;<samp>-T <var>enc-file</var></samp>&rsquo; is equivalent to &lsquo;<samp>-p
+<var>enc-file</var> -t <var>enc-file</var></samp>&rsquo;. If you make regular use of a private
+non-standard reencoding &lsquo;<samp>-T</samp>&rsquo; is usually a better idea than the
+individual options, to avoid unexpected inconsistencies in mapping
+otherwise. An example of when you might use this option is a dingbats
+font: when you have a TeX encoding that is designed to be used with a
+particular PostScript font.
+</p>
+
+<hr>
+<span id="Reencoding-with-Afm2tfm"></span><div class="header">
+<p>
+Next: <a href="#Encoding-file-format" accesskey="n" rel="next">Encoding file format</a>, Previous: <a href="#Changing-both-encodings" accesskey="p" rel="prev">Changing both encodings</a>, Up: <a href="#Changing-font-encodings" accesskey="u" rel="up">Changing font encodings</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Reencoding-with-Afm2tfm-1"></span><h4 class="subsubsection">6.3.1.4 Reencoding with Afm2tfm</h4>
+
+<span id="index-reencoding"></span>
+<span id="index-remapping"></span>
+
+<p>The Afm2tfm program creates the TFM and VF files for the virtual font
+corresponding to a PostScript font by <em>reencoding</em> the PostScript
+font. Afm2tfm generates these files from two encodings: one for TeX
+and one for PostScript. The TeX encoding is used to map character
+numbers to character names while the PostScript encoding is used to map
+each character name to a possibly different number. In combination, you
+can get access to any character of a PostScript font at any position for
+TeX typesetting.
+</p>
+<p>In the default case, when you specify none of the <code>-t</code>, <code>-p</code>,
+or <code>-T</code> options, Afm2tfm uses a default TeX encoding (which
+mostly corresponds to the Computer Modern text fonts) and the PostScript
+encoding found in the AFM file being read. The reencoding is also
+sometimes called a <em>remapping</em>.
+</p>
+<p>For example, the default encodings reencode the acute accent in two
+steps: first the default TeX encoding maps the number 19 to the
+character name &lsquo;<samp>acute</samp>&rsquo;; then the default PostScript encoding, as
+found in the AFM file for an ordinary PostScript font, maps the
+character name &lsquo;<samp>acute</samp>&rsquo; to the number 194. (The PostScript encoding
+works in reverse, by looking in the encoding vector for the name and
+then yielding the corresponding number.) The combined mapping of 19 to
+194 shows up explicitly in the VF file and also implicitly in the fact
+that the properties of PostScript character 194 appear in position 19 of
+the TFM file for the virtual font.
+</p>
+<span id="index-accents_002c-in-wrong-position"></span>
+<span id="index-Hungarian-umlaut"></span>
+<span id="index-dot-accent"></span>
+<span id="index-Scandinavian-A-ring"></span>
+<span id="index-A-ring_002c-Scandinavian-letter"></span>
+<p>The default encoding of the distributed fonts (e.g., <samp>ptmr.tfm</samp>)
+mostly follows plain TeX conventions for accents. The exceptions:
+the Hungarian umlaut (which is at position <code>0x7D</code> in &lsquo;<samp>cmr10</samp>&rsquo;,
+but position <code>0xCD</code> in &lsquo;<samp>ptmr</samp>&rsquo;); the dot accent (at positions
+<code>0x5F</code> and <code>0xC7</code>, respectively); and the Scandinavian A ring
+<code>\AA</code>, whose definition needs different tweaking. In order to use
+these accents with PostScript fonts or in math mode when
+<code>\textfont0</code> is a PostScript font, you will need to use the
+following definitions. These definitions will not work with the
+Computer Modern fonts for the relevant accents. They are already part
+of the distributed <samp>psfonts.sty</samp> for use with LaTeX.
+</p>
+<span id="index-_005cH"></span>
+<span id="index-_005c_002e"></span>
+<span id="index-_005cdot"></span>
+<span id="index-_005cAA"></span>
+<div class="example">
+<pre class="example">\def\H#1{{\accent&quot;CD #1}}
+\def\.#1{{\accent&quot;C7 #1}}
+\def\dot{\mathaccent&quot;70C7 }
+\newdimen\aadimen
+\def\AA{\leavevmode\setbox0\hbox{h}\aadimen\ht0
+ \advance\aadimen-1ex\setbox0\hbox{A}\rlap{\raise.67\aadimen
+ \hbox to \wd0{\hss\char'27\hss}}A}
+</pre></div>
+
+<span id="index-CODINGSCHEME"></span>
+<p>As a kind of summary, here are the &lsquo;<samp>CODINGSCHEME</samp>&rsquo;s that result from
+the various possible choices for reencoding.
+</p>
+<dl compact="compact">
+<dt>default encoding</dt>
+<dd><div class="example">
+<pre class="example">(CODINGSCHEME TeX text + AdobeStandardEncoding)
+</pre></div>
+
+</dd>
+<dt>&lsquo;<samp>-p dc.enc</samp>&rsquo;</dt>
+<dd><div class="example">
+<pre class="example">(CODINGSCHEME TeX text + DCEncoding)
+</pre></div>
+
+</dd>
+<dt>&lsquo;<samp>-t dc.enc</samp>&rsquo;</dt>
+<dd><div class="example">
+<pre class="example">(CODINGSCHEME DCEncoding + AdobeStandardEncoding)
+</pre></div>
+
+</dd>
+<dt>&lsquo;<samp>-T dc.enc</samp>&rsquo;</dt>
+<dd><div class="example">
+<pre class="example">(CODINGSCHEME DCEncoding + DCEncoding)
+</pre></div>
+
+</dd>
+</dl>
+
+<p>The &lsquo;<samp>CODINGSCHEME</samp>&rsquo; line appears in the VPL file but is
+ignored by Dvips.
+</p>
+
+<hr>
+<span id="Encoding-file-format"></span><div class="header">
+<p>
+Previous: <a href="#Reencoding-with-Afm2tfm" accesskey="p" rel="prev">Reencoding with Afm2tfm</a>, Up: <a href="#Changing-font-encodings" accesskey="u" rel="up">Changing font encodings</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Encoding-file-format-1"></span><h4 class="subsubsection">6.3.1.5 Encoding file format</h4>
+
+<span id="index-encoding-file-format"></span>
+
+<p>Afm2tfm&rsquo;s encoding files have the same format as an encoding vector in a
+PostScript font. Here is a skeletal example:
+</p>
+<div class="example">
+<pre class="example">% <span class="roman">Comments are ignored, unless the first word after the percent sign</span>
+% <span class="roman">is &lsquo;<samp>LIGKERN</samp>&rsquo;; see below.</span>
+/MyEncoding [ % <span class="roman">exactly 256 entries follow, each with a leading &lsquo;<samp>/</samp>&rsquo;</span>
+ /Alpha /Beta /Gamma /Delta &hellip;
+ /A /B &hellip; /Z
+ &hellip; /.notdef /xfooaccent /yfooaccent /zfooaccent
+] def
+</pre></div>
+
+<p>These encoding files are downloaded as part of changing the encoding at
+the PostScript level (see the previous section).
+</p>
+<span id="index-comments_002c-in-encoding-files"></span>
+<p>Comments, which start with a percent sign and continue until the end
+of the line, are ignored unless they start with &lsquo;<samp>LIGKERN</samp>&rsquo; (see below).
+</p>
+<p>The first non-comment word of the file must start with a forward slash
+&lsquo;<samp>/</samp>&rsquo; (i.e., a PostScript literal name) and defines the name of the
+encoding. The next word must be an left bracket &lsquo;<samp>[</samp>&rsquo;. Following
+that must be precisely 256 character names; use &lsquo;<samp>/.notdef</samp>&rsquo; for any
+that you want to leave undefined. Then there must be a matching right
+bracket <code>]</code>. A final &lsquo;<samp>def</samp>&rsquo; token is optional. All names are
+case-sensitive.
+</p>
+<p>Any ligature or kern information is given as a comment. If the first
+word after the &lsquo;<samp>%</samp>&rsquo; is &lsquo;<samp>LIGKERN</samp>&rsquo;, then the entire rest of the
+line is parsed for ligature and kern information. This ligature and
+kern information is given in groups of words: each group is terminated
+by a space and a semicolon and (unless the semicolon is at the end of a
+line) another space.
+</p>
+<span id="index-LIGKERN-encoding-file-command"></span>
+<p>In these <code>LIGKERN</code> statements, three types of information may be
+specified. These three types are ligature pairs, kerns to ignore, and
+the character value of this font&rsquo;s boundary character.
+</p>
+<span id="index-boundary-character"></span>
+<p>Throughout a <code>LIGKERN</code> statement, the boundary character is
+specified as &lsquo;<samp>||</samp>&rsquo;. To set the font&rsquo;s boundary character value for
+TeX:
+</p>
+<div class="example">
+<pre class="example">% LIGKERN || = 39 ;
+</pre></div>
+
+<p>To indicate a kern to remove, give the names of the two characters
+(without the leading slash) separated by &lsquo;<samp>{}</samp>&rsquo;, as in &lsquo;<samp>one
+{} one ;</samp>&rsquo;. This is intended to be reminiscent of the way you might
+use &lsquo;<samp>{}</samp>&rsquo; in a TeX file to turn off ligatures or kerns at a
+particular location. Either or both of the character names can be given
+as &lsquo;<samp>*</samp>&rsquo;, which is a wild card matching any character; thus, all
+kerns can be removed with &lsquo;<samp>* {} * ;</samp>&rsquo;.
+</p>
+<span id="index-ligature-operations"></span>
+<span id="index-Metafont-ligature-operations"></span>
+<p>To specify a ligature, specify the names of the pair of characters,
+followed by the ligature operation (as in Metafont), followed by the
+replacing character name. Either (but not both) of the first two
+characters can be &lsquo;<samp>||</samp>&rsquo; to indicate a word boundary.
+</p>
+<span id="index-_003d_003a-ligature-operation"></span>
+<p>The most common operation is &lsquo;<samp>=:</samp>&rsquo; meaning that both characters are
+removed and replaced by the third character, but by adding the &lsquo;<samp>|</samp>&rsquo;
+character on either side of the &lsquo;<samp>=:</samp>&rsquo;, you can retain either or both
+of the two leading characters. In addition, by suffixing the ligature
+operation with one or two &lsquo;<samp>&gt;</samp>&rsquo; signs, you can make the ligature
+scanning operation skip that many resulting characters before
+proceeding. This works just like in Metafont. For example, the &lsquo;fi&rsquo;
+ligature is specified with &lsquo;<samp>f&nbsp;i&nbsp;=:&nbsp;fi&nbsp;;</samp>&rsquo;<!-- /@w -->. A more convoluted
+ligature is &lsquo;<samp>one one |=:|&gt;&gt; exclam ;</samp>&rsquo; which separates a pair of
+adjacent <code>1</code>&rsquo;s with an exclamation point, and then skips over two
+of the resulting characters before continuing searching for ligatures
+and kerns. You cannot give more <tt>&gt;</tt>&rsquo;s than <tt>|</tt>&rsquo;s in an ligature
+operation, so there are a total of eight possibilities:
+</p>
+<div class="example">
+<pre class="example">=: |=: |=:&gt; =:| =:|&gt; |=:| |=:|&gt; |=:|&gt;&gt;
+</pre></div>
+
+<p>The default set of ligatures and kerns built in to Afm2tfm is:
+</p>
+<div class="example">
+<pre class="example">% LIGKERN question quoteleft =: questiondown ;
+% LIGKERN exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN space {} * ; * {} space ; 0 {} * ; * {} 0 ;
+% LIGKERN 1 {} * ; * {} 1 ; 2 {} * ; * {} 2 ; 3 {} * ; * {} 3 ;
+% LIGKERN 4 {} * ; * {} 4 ; 5 {} * ; * {} 5 ; 6 {} * ; * {} 6 ;
+% LIGKERN 7 {} * ; * {} 7 ; 8 {} * ; * {} 8 ; 9 {} * ; * {} 9 ;
+</pre></div>
+
+
+<hr>
+<span id="Special-font-effects"></span><div class="header">
+<p>
+Next: <a href="#Afm2tfm-options" accesskey="n" rel="next">Afm2tfm options</a>, Previous: <a href="#Changing-font-encodings" accesskey="p" rel="prev">Changing font encodings</a>, Up: <a href="#Invoking-afm2tfm" accesskey="u" rel="up">Invoking afm2tfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Special-font-effects-1"></span><h4 class="subsection">6.3.2 Special font effects</h4>
+
+<span id="index-oblique-fonts"></span>
+<span id="index-slanted-fonts"></span>
+<span id="index-fonts_002c-slanted"></span>
+<p>Besides the reencodings described in the previous section, Afm2tfm can
+do other manipulations. (Again, it&rsquo;s best to use the prebuilt fonts
+rather than attempting to remake them.)
+</p>
+<p>&lsquo;<samp>-s <var>slant</var></samp>&rsquo; makes an obliqued variant, as in:
+</p>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -s .167 -v ptmro rptmro
+</pre></div>
+
+<p>This creates <samp>ptmro.vpl</samp> and <samp>rptmro.tfm</samp>. To use this font,
+put the line
+</p>
+<span id="index-SlantFont"></span>
+<div class="example">
+<pre class="example">rptmro Times-Roman &quot;.167 SlantFont&quot;
+</pre></div>
+
+<p><span id="index-psfonts_002emap-1"></span>
+into <samp>psfonts.map</samp>. Then &lsquo;<samp>rptmro</samp>&rsquo; (our name for the obliqued
+Times) will act as if it were a resident font, although it is actually
+constructed from Times-Roman via the PostScript routine <code>SlantFont</code>
+(which will slant everything 1/6 to the right, in this case).
+</p>
+<span id="index-expanded-fonts"></span>
+<span id="index-fonts_002c-expanded"></span>
+<p>Similarly, you can get an expanded font with
+</p>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -e 1.2 -v ptmrre rptmrre
+</pre></div>
+
+<p>and by recording the pseudo-resident font
+<span id="index-ExtendFont"></span>
+</p>
+<div class="example">
+<pre class="example">rptmrre Times-Roman &quot;1.2 ExtendFont&quot;
+</pre></div>
+
+<p>in <samp>psfonts.map</samp>.
+</p>
+<p>You can also create a small caps font with a command such as
+<span id="index-small-caps-fonts"></span>
+<span id="index-fonts_002c-small-caps"></span>
+</p>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -V ptmrc rptmrc
+</pre></div>
+
+<p>This will generate a set of pseudo-small caps mapped into the usual
+lowercase positions and scaled down to 0.8 of the normal cap
+dimensions. You can also specify the scaling as something other than
+the default 0.8:
+</p>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman -c 0.7 -V ptmrc rptmrc
+</pre></div>
+
+<p>It is unfortunately not possible to increase the width of the small caps
+independently of the rest of the font. If you want a really
+professional looking set of small caps, you need to acquire a small caps
+font.
+</p>
+<span id="index-PaintType"></span>
+<span id="index-outline-fonts-1"></span>
+<span id="index-fonts_002c-outlined"></span>
+<p>To change the <code>PaintType</code> in a font from filled (0) to outlined
+(2), you can add <code>&quot;/PaintType 2 store&quot;</code> to <samp>psfonts.map</samp>, as
+in the following:
+</p>
+<div class="example">
+<pre class="example">rphvrl Helvetica &quot;/PaintType 2 store&quot;
+</pre></div>
+
+<p>Afm2tfm writes to standard output the line you need to add to
+<samp>psfonts.map</samp> to use that font, assuming the font is resident in
+the printer; if the font is not resident, you must add the
+&lsquo;<samp>&lt;<var>filename</var></samp>&rsquo; command to download the font. Each identical
+line only needs to be specified once in the &lsquo;<samp>psfonts.map</samp>&rsquo; file,
+even though many different fonts (small caps variants, or ones with
+different output encodings) may be based on it.
+</p>
+
+<hr>
+<span id="Afm2tfm-options"></span><div class="header">
+<p>
+Previous: <a href="#Special-font-effects" accesskey="p" rel="prev">Special font effects</a>, Up: <a href="#Invoking-afm2tfm" accesskey="u" rel="up">Invoking afm2tfm</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Afm2tfm-options-1"></span><h4 class="subsection">6.3.3 Afm2tfm options</h4>
+
+<span id="index-options_002c-to-Afm2tfm"></span>
+<span id="index-afm2tfm-options"></span>
+
+<p>Synopsis:
+</p><div class="example">
+<pre class="example">afm2tfm [<var>option</var>]&hellip; <var>afmfile</var>[.afm] [<var>tfmfile</var>[.tfm]]
+</pre></div>
+
+<p>Afm2tfm reads <var>afmfile</var> and writes a corresponding (but &ldquo;raw&rdquo;,
+see below) TFM file. If <var>tfmfile</var> is not supplied, the base name
+of the AFM file is extended with &lsquo;<samp>.tfm</samp>&rsquo; to get the output
+filename.
+</p>
+<p>The simplest example:
+</p>
+<div class="example">
+<pre class="example">afm2tfm Times-Roman rptmr
+</pre></div>
+
+<span id="index-accents_002c-wrong"></span>
+<span id="index-raw-tfm-files"></span>
+<p>The TFM file thus created is <em>raw</em> because it omits ligature and
+kern information, and does no character remapping; it contains only
+the character information in the AFM file in TFM format, which is the form
+that TeX understands. The characters have the same code in the TFM
+file as in the AFM file. For text fonts, this means printable ASCII
+characters will work ok, but little else, because standard PostScript
+fonts have a different encoding scheme than the one that plain TeX
+expects (see <a href="#Encodings">Encodings</a>). Although the encodings agree for most
+printable ASCII characters, other characters such as ligatures and
+accents vary. Thus, in practice, it&rsquo;s almost always desirable to create
+a virtual font as well with the &lsquo;<samp>-v</samp>&rsquo; or &lsquo;<samp>-V</samp>&rsquo; option.
+See <a href="#Making-a-font-available">Making a font available</a>.
+</p>
+<p>The command line options to Afm2tfm:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>-a</samp>&rsquo;</dt>
+<dd><span id="index-_002da-1"></span>
+<span id="index-accent-height-adjustment_002c-omitting"></span>
+<p>By default, Afm2tfm looks for precomposed accented characters, such as
+tdieresis, and possibly adjusts the height of the basic letter (t)
+upward so that the result of using <code>\accent</code> (as in <code>\&quot;t</code>)
+is visually the same as the precomposed characters. The <code>-a</code>
+option omits such adjustments, so that all characters&rsquo; heights remain
+as they are given in the AFM file. (Until Afm2tfm 8.4, released in
+2016, heights could also be adjusted downward, but this is no longer
+the case.)
+</p>
+</dd>
+<dt>&lsquo;<samp>-c <var>ratio</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dc-ratio"></span>
+<span id="index-scaling-small-caps"></span>
+<p>See &lsquo;<samp>-V</samp>&rsquo;; overrides the default ratio of 0.8 for the
+scaling of small caps.
+</p>
+</dd>
+<dt>&lsquo;<samp>-e <var>ratio</var></samp>&rsquo;</dt>
+<dd><span id="index-_002de-ratio"></span>
+<span id="index-expanded-fonts-1"></span>
+<span id="index-condensed-fonts"></span>
+<p>Stretch characters horizontally by <var>ratio</var>; if less than 1.0, you
+get a condensed font.
+</p>
+</dd>
+<dt>&lsquo;<samp>-O</samp>&rsquo;</dt>
+<dd><span id="index-_002dO"></span>
+<span id="index-octal-character-codes"></span>
+<p>Output all character codes in the &lsquo;<samp>vpl</samp>&rsquo; file as octal numbers, not
+names; this is useful for symbol or other special-purpose fonts where
+character names such as &lsquo;<samp>A</samp>&rsquo; have no meaning.
+</p>
+</dd>
+<dt>&lsquo;<samp>-p <var>ps-enc</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dp-ps_002denc-1"></span>
+<p>Use <var>ps-enc</var> for the destination (PostScript) encoding of the font;
+<var>ps-enc</var> must be mentioned as a header file for the font in
+&lsquo;<samp>psfonts.map</samp>&rsquo;.
+See <a href="#Changing-PostScript-encodings">Changing PostScript encodings</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-s <var>slant</var></samp>&rsquo;</dt>
+<dd><span id="index-_002ds-slant"></span>
+<span id="index-slanted-fonts_002c-making"></span>
+<p>Slant characters to the right by <var>slant</var>. If <var>slant</var> is
+negative, the letters slope to the left (or they might be upright if you
+start with an italic font).
+</p>
+</dd>
+<dt>&lsquo;<samp>-t <var>tex-enc</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dt-tex_002denc-1"></span>
+<p>Use <var>tex-enc</var> for the target (TeX) encoding of the font.
+Ligature and kern information may also be specified in <var>file</var>.
+<var>file</var> is not mentioned in <samp>psfonts.map</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp>-T <var>ps-tex-enc</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dT-ps_002dtex_002denc"></span>
+<p>Use <var>ps-tex-enc</var> for both the PostScript and target TeX encodings
+of the font. Equivalent to &lsquo;<samp>-p <var>file</var> -t <var>file</var></samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>-u</samp>&rsquo;</dt>
+<dd><span id="index-_002du"></span>
+<p>Use only those characters specified in the TeX encoding, and no
+others. By default, Afm2tfm tries to include all characters in the
+input font, even those not present in the TeX encoding (it puts them
+into otherwise-unused positions, arbitrarily).
+</p>
+</dd>
+<dt>&lsquo;<samp>-v <var>vpl-file</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dv-vpl_002dfile"></span>
+<p>Output a VPL (virtual property list) file, as well as a TFM file.
+</p>
+</dd>
+<dt>&lsquo;<samp>-V <var>vpl-file</var></samp>&rsquo;</dt>
+<dd><span id="index-_002dV-vpl_002dfile"></span>
+<p>Same as &lsquo;<samp>-v</samp>&rsquo;, but the virtual font generated is a pseudo small caps
+font obtained by scaling uppercase letters by 0.8 to typeset
+lowercase. This font handles accented letters and retains proper
+kerning.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="psfonts_002emap"></span><div class="header">
+<p>
+Previous: <a href="#Invoking-afm2tfm" accesskey="p" rel="prev">Invoking afm2tfm</a>, Up: <a href="#PostScript-fonts" accesskey="u" rel="up">PostScript fonts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="psfonts_002emap_003a-PostScript-font-catalog"></span><h3 class="section">6.4 <samp>psfonts.map</samp>: PostScript font catalog</h3>
+
+<span id="index-psfonts_002emap-2"></span>
+<span id="index-non_002dresident-fonts"></span>
+<span id="index-downloading-PostScript-fonts"></span>
+<span id="index-fonts_002c-downloading"></span>
+
+<p>The <samp>psfonts.map</samp> file associates a PostScript font with related
+files and constructs. Each line has the format:
+</p>
+<div class="example">
+<pre class="example"><var>filename</var> <var>PostScript-name</var> <var>options</var>
+</pre></div>
+
+<span id="index-_003c-font-downloading"></span>
+<p>For example, the line
+</p><div class="example">
+<pre class="example">rpstrn StoneInformal &lt;StoneInformal.pfb
+</pre></div>
+<p>causes Dvips to download <samp>StoneInformal.pfb</samp> (just as if it were
+a header file, see <a href="#Header-files">Header files</a>) if the DVI file (or a virtual
+font, see <a href="#Virtual-fonts">Virtual fonts</a>) references the TFM file &lsquo;<samp>rpstrn</samp>&rsquo;.
+The PostScript <code>/FontName</code> of the font defined inside the &lsquo;<samp>pfb</samp>&rsquo;
+file should be <code>StoneInformal</code>.
+</p>
+<span id="index-transforming-downloaded-fonts"></span>
+<span id="index-expanded-fonts-2"></span>
+<span id="index-wide-fonts"></span>
+<span id="index-narrow-fonts"></span>
+<p>You can generate transformed fonts with a line like this:
+</p><div class="example">
+<pre class="example">rpstrc StoneInformal &lt;StoneInformal.pfb &quot;.8 ExtendFont&quot;
+</pre></div>
+
+<p>See <a href="#Special-font-effects">Special font effects</a>, for a
+complete list of font effects.
+</p>
+<span id="index-reencoding-PostScript-fonts"></span>
+<p>You can change the encoding of the Type 1 font at the PostScript
+level with a &lsquo;<samp>ReEncodeFont</samp>&rsquo; instruction, plus the name of the
+encoding file. This allows you access to characters that may be present
+in the Type 1 font file, but not encoded by default&mdash;most of the
+preaccented characters, for example. An example:
+</p><div class="example">
+<pre class="example">pstrn8r StoneInformal &quot;TeXBase1Encoding ReEncodeFont&quot; &lt;8r.enc &lt;pstrn8a.pfb
+</pre></div>
+
+<span id="index-8r-font-encoding"></span>
+<span id="index-base-encoding_002c-recommended"></span>
+<p>The &lsquo;<samp>8r</samp>&rsquo; encoding mentioned here has been designed to serve as a
+base for all downloadable fonts; it allows access to all the characters
+commonly present in a Type 1 font. For more details, see the
+<samp>8r.enc</samp> source file that comes with (and is installed with) Dvips.
+</p>
+<span id="index-_003c_005b-encoding-vector-downloading"></span>
+<p>You may notice that the same syntax is used for downloading encoding
+vectors and Type 1 font files. To make your intentions clear, you can
+also use &lsquo;<samp>&lt;[</samp>&rsquo; to explicitly indicate you are downloading an
+encoding vector, as in:
+</p><div class="example">
+<pre class="example">pstrn8r StoneInformal &quot;TeXBase1Encoding ReEncodeFont&quot; &lt;[8r.enc &lt;pstrn8a.pfb
+</pre></div>
+
+<span id="index-_002eenc-extension-for-encoding-vectors"></span>
+<p>If the filename of your encoding vector does not end in &lsquo;<samp>.enc</samp>&rsquo;, and
+you are using partial font downloading, you must use the &lsquo;<samp>&lt;[</samp>&rsquo;
+syntax, or Dvips will not download the font properly.
+</p>
+<span id="index-_002epfa-extension-required-for-partial-downloading"></span>
+<span id="index-_002epfb-extension-required-for-partial-downloading"></span>
+<p>Similarly, the name of the Type 1 font file itself must have extension
+<samp>.pfa</samp> or <samp>.pfb</samp> for partial downloading to work properly.
+</p>
+<span id="index-pfb-files_002c-automatically-unpacked"></span>
+<p>When using PFB files, Dvips is smart enough to unpack the binary PFB
+format into printable ASCII so there is no need to perform this
+conversion yourself. In addition, Dvips scans the font to determine its
+memory usage, just as it does for other header files (see <a href="#Header-files">Header files</a>).
+</p>
+<span id="index-partial-font-downloading"></span>
+<span id="index-downloading-fonts-partially"></span>
+<p>If the &lsquo;<samp>j</samp>&rsquo; config file or command-line option is enabled (as it
+is by default), <samp>StoneInformal.pfb</samp> will be <em>partially
+downloaded</em>&mdash;only those characters your document actually uses will
+be extracted and downloaded, and the remainder discarded.
+See <a href="#Option-details">Option details</a>.
+</p>
+<span id="index-whole-font-downloading"></span>
+<span id="index-multiple-master-fonts"></span>
+<span id="index-Minion-typeface-family"></span>
+<span id="index-_003c_003c-whole-font-downloading"></span>
+<p>Adobe Multiple Master fonts, such as Minion, cannot be partially
+downloaded. To partially download in general, but avoid partial
+downloading for individual fonts, use &lsquo;<samp>&lt;&lt;</samp>&rsquo; instead &lsquo;<samp>&lt;</samp>&rsquo;:
+</p><div class="example">
+<pre class="example">pmnr8r Minion &lt;&lt;Minion.pfb
+</pre></div>
+
+<p>Here is a brief summary of how <samp>psfonts.map</samp> is read:
+</p>
+<ol>
+<li> If a line is empty or begins with a space, percent, asterisk,
+semicolon, or hash mark, it is ignored.
+
+</li><li> Otherwise, the line is separated into words, where words are
+separated by spaces or tabs, except that if a word begins with a double
+quote, it extends until the next double quote or the end of the line.
+
+</li><li> If a word starts with &lsquo;<samp>&lt;&lt;</samp>&rsquo;, it is taken as a font file to be
+wholly downloaded. Use this to avoid partial downloading, as described
+above.
+
+</li><li> If a word starts with &lsquo;<samp>&lt;[</samp>&rsquo;, it is taken as an encoding file
+to be downloaded. Use this if the name of the encoding file does end in
+&lsquo;<samp>.enc</samp>&rsquo;, also as described above.
+
+</li><li> If a word starts with a &lsquo;<samp>&lt;</samp>&rsquo; character, it is
+treated as a header file that needs to be downloaded. If the name ends
+in &lsquo;<samp>.pfa</samp>&rsquo; or &lsquo;<samp>.pfb</samp>&rsquo;, it is taken as Type 1 font file that will
+be partially downloaded if the &lsquo;<samp>j</samp>&rsquo; option is in effect. There can
+be more than one such header for a given font. If a &lsquo;<samp>&lt;</samp>&rsquo; is a word
+by itself, the next word is taken as the name of the header file.
+
+</li><li> If a word starts with a &lsquo;<samp>&quot;</samp>&rsquo; character, it is taken as PostScript
+code used in generating that font, and is inserted into the output
+verbatim at the appropriate point. (And the double quotes beginning and
+ending the word are removed.)
+
+</li><li> Otherwise the word is a name. The first such name is the TFM
+file, that either a DVI file or a virtual font file can refer to. If
+there is a second name, it is used as the PostScript name and should
+match what is defined in the downloaded file; if there is only one
+name, it is used for both the TeX name and the PostScript name.
+
+</li></ol>
+
+
+<hr>
+<span id="Color"></span><div class="header">
+<p>
+Next: <a href="#Index" accesskey="n" rel="next">Index</a>, Previous: <a href="#PostScript-fonts" accesskey="p" rel="prev">PostScript fonts</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-1"></span><h2 class="chapter">7 Color</h2>
+
+<span id="index-color"></span>
+
+<span id="index-Hafner_002c-Jim"></span>
+<p>Dvips supports one-pass multi-color printing of TeX documents on any
+color PostScript device. Initially added by Jim Hafner, IBM Research,
+<a href="mailto:hafner@almaden.ibm.com">hafner@almaden.ibm.com</a>, the color support has gone through many
+changes by Tomas Rokicki. Besides the source code support itself, there
+are additional TeX macro files: &lsquo;<samp>colordvi.tex</samp>&rsquo; and
+&lsquo;<samp>blackdvi.tex</samp>&rsquo;, and corresponding &lsquo;<samp>.sty</samp>&rsquo; versions for use with
+LaTeX.
+</p>
+<p>In this section we describe the use of color from the document
+preparer&rsquo;s point of view and then add some instructions on installation
+for the TeX administrator.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Color-macro-files" accesskey="1">Color macro files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">TeX macro definitions.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#User_002ddefinable-colors" accesskey="2">User-definable colors</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Adding your own colors.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color-subtleties" accesskey="3">Color subtleties</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Subtleties in using color.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Ted-Turner" accesskey="4">Ted Turner</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Printing in black/white after colorizing.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color-device-configuration" accesskey="5">Color device configuration</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Configuring Dvips for color devices.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color-support-details" accesskey="6">Color support details</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Color support details
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Color-macro-files"></span><div class="header">
+<p>
+Next: <a href="#User_002ddefinable-colors" accesskey="n" rel="next">User-definable colors</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-macro-files-1"></span><h3 class="section">7.1 Color macro files</h3>
+
+<span id="index-macros-for-color"></span>
+<span id="index-color-macros"></span>
+
+<p>All the color macro commands are defined in &lsquo;<samp>colordvi.tex</samp>&rsquo; (or
+&lsquo;<samp>colordvi.sty</samp>&rsquo;). To access these macros simply add to the top of
+your plain TeX file the command:
+</p><div class="example">
+<pre class="example">\input colordvi
+</pre></div>
+<p>For (the obsolete) LaTeX 2.09, add the &lsquo;<samp>colordvi</samp>&rsquo; style option as in:
+</p><div class="example">
+<pre class="example">\documentstyle[12pt,colordvi]{article}
+</pre></div>
+<p>For LaTeX 2e, these examples are not applicable. Instead, please see
+the documentation for the graphics package, available from
+<samp><var>CTAN</var>:doc/latex/graphics/</samp>. See also
+<samp><var>CTAN</var>:doc/epslatex.ps</samp>.
+</p>
+<span id="index-Crayola-crayon-box"></span>
+<span id="index-Pantone-colors"></span>
+<span id="index-color-names_002c-mixed-case"></span>
+<p>These macros provide two basic kinds of color macros: ones for local
+color changes (a few words, a single symbol) and one for global color
+changes (the whole document). All the color names use a mixed case
+scheme to avoid conflicts with other macros. There are 68 predefined
+colors, with names taken primarily from the Crayola crayon box of 64
+colors, and one pair of macros for the user to set his own color pattern
+(see <a href="#User_002ddefinable-colors">User-definable colors</a>). You can browse the file
+&lsquo;<samp>colordvi.tex</samp>&rsquo; for a list of the predefined colors. The comments
+in this file also show a rough correspondence between the crayon names
+and Pantones.
+</p>
+<p>A local color command has the form
+</p>
+<div class="example">
+<pre class="example">\<var>ColorName</var>{this is the color <var>ColorName</var>}
+</pre></div>
+
+<span id="index-_005cColorName"></span>
+<p>where <var>ColorName</var> is the name of a predefined color, e.g.,
+&lsquo;<samp>Blue</samp>&rsquo;. As shown, these macros take one argument, the text to
+print in the specified color. This can be used for nested color changes
+since it restores the original color state when it completes. For
+example:
+</p>
+<div class="example">
+<pre class="example">This text is normal but here we are \Red{switching to red,
+\Blue{nesting blue}, recovering the red} and back to original.
+</pre></div>
+
+<p><span id="index-color-nesting-level"></span>
+The color nesting level has no hard limit, but it is not advisable to
+nest too deeply lest you and the reader lose track of the color history.
+</p>
+<p>The global color command has the form
+</p>
+<div class="example">
+<pre class="example">\text<var>ColorName</var>
+</pre></div>
+
+<p><span id="index-_005ctextColorName"></span>
+These macros take no arguments and changes the default color from that
+point on to <var>ColorName</var>. This of course can be overridden globally
+by another such command or locally by local color commands. For example,
+expanding on the example above, we might have
+</p>
+<div class="example">
+<pre class="example">\textGreen
+This text is green but here we are \Red{switching to red,
+\Blue{nesting blue}, recovering the red} and back to
+original green.
+\textCyan
+The text from here on will be cyan until
+\Yellow{locally changed to yellow}. Now we are back to cyan.
+</pre></div>
+
+<p>The color commands will even work in math mode and across math mode
+boundaries. This means that if you have a color before going into math
+mode, the mathematics will be set in that color as well. In alignment
+environments like <code>\halign</code>, &lsquo;<samp>tabular</samp>&rsquo; or &lsquo;<samp>eqnarray</samp>&rsquo;,
+local color commands cannot extend beyond the alignment characters.
+</p>
+<p>Because local color commands respect only some environment and
+delimiter changes besides their own, care must be taken in setting
+their scope. It is best not to have them stretch too far.
+</p>
+<p>At the present time there are no macros for color environments in LaTeX
+which might have a larger range. This is primarily to keep the TeX
+and LaTeX use compatible.
+</p>
+
+<hr>
+<span id="User_002ddefinable-colors"></span><div class="header">
+<p>
+Next: <a href="#Color-subtleties" accesskey="n" rel="next">Color subtleties</a>, Previous: <a href="#Color-macro-files" accesskey="p" rel="prev">Color macro files</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="User_002ddefinable-colors-1"></span><h3 class="section">7.2 User-definable colors</h3>
+
+<span id="index-user_002ddefinable-colors"></span>
+<span id="index-colors_002c-user_002ddefinable"></span>
+
+<p>There are two ways for the user to specify colors not already defined.
+For local changes, there is the command <code>\Color</code> which takes two
+arguments. The first argument is four numbers between zero and one and
+specifies the intensity of cyan, magenta, yellow and black (CMYK) in
+that order. The second argument is the text that should appear in the
+given color. For example, suppose you want the words &ldquo;this color is
+pretty&rdquo; to appear in a color which is 50% cyan, 85% magenta, 40% yellow
+and 20% black. You would use the command
+</p>
+<div class="example">
+<pre class="example">\Color{.5 .85 .4 .2}{this color is pretty}
+</pre></div>
+
+<p>For global color changes, there is a command <code>\textColor</code> which
+takes one argument, the CMYK quadruple of relative color intensities.
+For example, if you want the default color to be as above, then the
+command
+</p>
+<div class="example">
+<pre class="example">\textColor{.5 .85 .4 .2}
+The text from now on will be this pretty color
+</pre></div>
+
+<p>will do the trick.
+</p>
+<p>Making a global color change in the midst of nested local colors is
+highly discouraged. Consequently, Dvips will give you warning message
+and do its best to recover by discarding the current color history.
+</p>
+
+<hr>
+<span id="Color-subtleties"></span><div class="header">
+<p>
+Next: <a href="#Ted-Turner" accesskey="n" rel="next">Ted Turner</a>, Previous: <a href="#User_002ddefinable-colors" accesskey="p" rel="prev">User-definable colors</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-subtleties-1"></span><h3 class="section">7.3 Color subtleties</h3>
+
+<span id="index-color-subtleties"></span>
+
+<p>Color macros are defined via <code>\special</code> keywords. As such, they
+are put in the &lsquo;<samp>.dvi</samp>&rsquo; file only as explicit message strings to the
+driver. The (unpleasant) result is that certain unprotected regions of
+the text can have unwanted color side effects. For example, if a color
+region is split by TeX across a page boundary, then the footers of
+the current page (e.g., the page number) and the headers of the next
+page can inherit that color. To avoid this effect globally, users
+should make sure that these special regions of the text are defined with
+their own local color commands. For example, to protect the
+header and footer in plain TeX, use
+</p>
+<div class="example">
+<pre class="example">\headline{\Black{My Header}}
+\footline{\Black{\hss\tenrm\folio\hss}}
+</pre></div>
+
+<p>This warning also applies to figures and other insertions, so be careful!
+</p>
+<p>Of course, in LaTeX, this is much more difficult to do because of the
+complexity of the macros that control these regions. This is
+unfortunate but inevitable, because TeX and LaTeX were
+not written with color in mind.
+</p>
+<p>Even when writing your own macros, much care must be taken. The macros
+that &lsquo;colorize&rsquo; a portion of the text work prefix the text work by
+outputting one <code>\special</code> command to turn the color on before the
+text, and outputting another <code>\special</code> command afterwards to
+restore the original color. It is often useful to ensure that TeX is
+in horizontal mode before the first special command is issued; this can
+be done by prefixing the color command with <code>\leavevmode</code>.
+</p>
+
+<hr>
+<span id="Ted-Turner"></span><div class="header">
+<p>
+Next: <a href="#Color-device-configuration" accesskey="n" rel="next">Color device configuration</a>, Previous: <a href="#Color-subtleties" accesskey="p" rel="prev">Color subtleties</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Printing-in-black_002fwhite-after-colorizing"></span><h3 class="section">7.4 Printing in black/white after colorizing</h3>
+
+<p>If you have a TeX or LaTeX document written with color macros and
+you want to print it in black and white there are two options. On all
+(good) PostScript devices, printing a color file will print in
+corresponding gray levels. This is useful to get a rough idea of the
+colors without using expensive color printing devices. The second
+option is to replace the call to input <samp>colordvi.tex</samp> with
+&lsquo;<samp>blackdvi.tex</samp>&rsquo; (and similarly for the &lsquo;<samp>.sty</samp>&rsquo; files). So in
+the above example, replacing the word &lsquo;<samp>colordvi</samp>&rsquo; with
+&lsquo;<samp>blackdvi</samp>&rsquo; suffices. <samp>blackdvi.tex</samp> defines the color macros
+as no-ops, and so will produce normal black/white printing. By this
+simple mechanism, the user can switch to all black/white printing
+without having to ferret out the color commands. Also, some device
+drivers, particularly non-PostScript ones like screen previewers, will
+simply ignore the color commands and so print in black/white.
+Hopefully, in the future screen previewers for color displays will be
+compatible with some form of color support.
+</p>
+
+<hr>
+<span id="Color-device-configuration"></span><div class="header">
+<p>
+Next: <a href="#Color-support-details" accesskey="n" rel="next">Color support details</a>, Previous: <a href="#Ted-Turner" accesskey="p" rel="prev">Ted Turner</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-device-configuration-1"></span><h3 class="section">7.5 Color device configuration</h3>
+
+<span id="index-color-configuration"></span>
+<span id="index-configuration_002c-of-color-devices"></span>
+
+<p>To configure Dvips for a particular color device you need to fine tune
+the color parameters to match your device&rsquo;s color rendition. To do this,
+you will need a Pantone chart for your device. The header file
+&lsquo;<samp>color.lpro</samp>&rsquo; shows a (rough) correspondence between the Crayola
+crayon names and the Pantone numbers and also defines default CMYK
+values for each of the colors. Note that these colors must be defined
+in CMYK terms and not RGB, as Dvips outputs PostScript color commands in
+CMYK. This header file also defines (if they are not known to the
+interpreter) the PostScript commands &lsquo;<samp>setcmykcolor</samp>&rsquo; and
+&lsquo;<samp>currentcmykcolor</samp>&rsquo; in terms of a RGB equivalent so if your device
+only understands RGB, there should be no problem.
+</p>
+<span id="index-Phaser-printer_002c-used-for-color-calibration"></span>
+<span id="index-Tektronix-Phaser-printer_002c-used-for-color-calibration"></span>
+<p>The parameters set in this file were determined by comparing the Pantone
+chart of a Tektronix Phaser printer with the actual Crayola Crayons.
+Because these were defined for a particular device, the actual color
+rendition on your device may be very different. There are two ways to
+adjust this. One is to use the PAntone chart for your device to rewrite
+&lsquo;<samp>color.lpro</samp>&rsquo; prior to compilation and installation. A better
+alternative, which supports multiple devices, is to add a header file
+option in the configuration file (see <a href="#Configuration-file-commands">Configuration file commands</a>)
+for each device that defines, in &lsquo;<samp>userdict</samp>&rsquo;, the color parameters
+for those colors that need redefining.
+</p>
+<p>For example, if you need to change the parameters defining
+&lsquo;<samp>Goldenrod</samp>&rsquo; (approximately Pantone 109 on the Phaser) for your
+device &lsquo;<samp>mycolordev</samp>&rsquo;, do the following. In the Pantone chart for
+your device, find the CMYK values for Pantone 109. Let&rsquo;s say they are
+&lsquo;<samp>{\ 0 0.10 0.75 0.03 }</samp>&rsquo;. Then create a header file named
+&lsquo;<samp>mycolordev.pro</samp>&rsquo; with the commands
+</p>
+<div class="example">
+<pre class="example">userdict begin
+/Goldenrod { 0 0.10 0.75 0.03 setcmykcolor} bind def
+</pre></div>
+
+<p>Finally, in &lsquo;<samp>config.mycolordev</samp>&rsquo; add the line
+</p>
+<div class="example">
+<pre class="example">h mycolordev.pro
+</pre></div>
+
+<p>This will then define &lsquo;<samp>Goldenrod</samp>&rsquo; in your device&rsquo;s CMYK values in
+<samp>userdict</samp> which is checked before defining it in <samp>TeXdict</samp> by
+<samp>color.pro</samp>. (On MS-DOS, you will have to call this file
+<samp>mycolordev.cfg</samp>.)
+</p>
+<p>This mechanism, together with additions to <samp>colordvi.tex</samp> and
+<samp>blackdvi.tex</samp> (and the &lsquo;<samp>.sty</samp>&rsquo; files), can also be used to
+predefine other colors for your users.
+</p>
+
+<hr>
+<span id="Color-support-details"></span><div class="header">
+<p>
+Previous: <a href="#Color-device-configuration" accesskey="p" rel="prev">Color device configuration</a>, Up: <a href="#Color" accesskey="u" rel="up">Color</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-support-details-1"></span><h3 class="section">7.6 Color support details</h3>
+
+<p>To support color, Dvips recognizes a certain set of specials. These
+specials start with the keyword &lsquo;<samp>color</samp>&rsquo; or the keyword
+&lsquo;<samp>background</samp>&rsquo;, followed by a color specification.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Color-specifications" accesskey="1">Color specifications</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Color-specials" accesskey="2">Color specials</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Color-specifications"></span><div class="header">
+<p>
+Next: <a href="#Color-specials" accesskey="n" rel="next">Color specials</a>, Up: <a href="#Color-support-details" accesskey="u" rel="up">Color support details</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-specifications-1"></span><h4 class="subsection">7.6.1 Color specifications</h4>
+
+<span id="index-color-specifications"></span>
+
+<p>What is a color specification? One of three things. First, it might be
+a PostScript procedure as defined in a PostScript header file. The
+<samp>color.pro</samp> file defines 64 of these, including &lsquo;<samp>Maroon</samp>&rsquo;.
+This PostScript procedure must set the current color to be some value;
+in this case, &lsquo;<samp>Maroon</samp>&rsquo; is defined as &lsquo;<samp>0 0.87 0.68 0.32
+setcmykcolor</samp>&rsquo;.
+</p>
+<p>The second possibility is the name of a color model (initially, one of
+&lsquo;<samp>rgb</samp>&rsquo;, &lsquo;<samp>hsb</samp>&rsquo;, &lsquo;<samp>cmyk</samp>&rsquo;, or &lsquo;<samp>gray</samp>&rsquo;) followed by the
+appropriate number of parameters. When Dvips encounters such a macro,
+it sends out the parameters first, followed by the string created by
+prefixing &lsquo;<samp>TeXcolor</samp>&rsquo; to the color model. Thus, the color
+specification &lsquo;<samp>rgb 0.3 0.4 0.5</samp>&rsquo; would generate the PostScript code
+&lsquo;<samp>0.3 0.4 0.5 TeXrgbcolor</samp>&rsquo;. Note that the case of zero arguments is
+disallowed, as that is handled by the single keyword case
+(&lsquo;<samp>Maroon</samp>&rsquo;) above, where no changes to the name are made before it
+is sent to the PostScript file.
+</p>
+<p>The third and final type of color specification is a double quote
+followed by any sequence of PostScript. The double quote is stripped
+from the output. For instance, the color specification
+&lsquo;<samp>&quot;AggiePattern setpattern</samp>&rsquo; will set the &lsquo;color&rsquo; to the Aggie logo
+pattern (assuming such exists.)
+</p>
+
+<hr>
+<span id="Color-specials"></span><div class="header">
+<p>
+Previous: <a href="#Color-specifications" accesskey="p" rel="prev">Color specifications</a>, Up: <a href="#Color-support-details" accesskey="u" rel="up">Color support details</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Color-specials-1"></span><h4 class="subsection">7.6.2 Color specials</h4>
+
+<p>We will describe &lsquo;<samp>background</samp>&rsquo; first, since it is the simplest. The
+&lsquo;<samp>background</samp>&rsquo; keyword must be followed by a color specification.
+That color specification is used as a fill color for the background.
+The last &lsquo;<samp>background</samp>&rsquo; special on a page is the one that gets
+issued, and it gets issued at the very beginning of the page, before any
+text or specials are sent. (This is possible because the prescan phase
+of Dvips notices all of the color specials so that the appropriate
+information can be written out during the second phase.)
+</p>
+<p>The &lsquo;<samp>color</samp>&rsquo; special itself has three forms.
+The first is just &lsquo;<samp>color</samp>&rsquo; followed by a color specification. In
+this case, the current global color is set to that color; the color stack
+must be empty when such a command is executed.
+</p>
+<p>The second form is &lsquo;<samp>color push</samp>&rsquo; followed by a color specification.
+This saves the current color on the color stack and sets the color to be
+that given by the color specification. This is the most common way to
+set a color.
+</p>
+<p>The final version of the &lsquo;<samp>color</samp>&rsquo; special is just &lsquo;<samp>color pop</samp>&rsquo;,
+with no color specification; this says to pop the color last pushed on
+the color stack from the color stack and set the current color to be
+that color.
+</p>
+<p>Dvips correctly handles these color specials across pages, even when the
+pages are repeated or reversed.
+</p>
+<p>These color specials can be used for things such as patterns or screens
+as well as simple colors. However, note that in the PostScript, only
+one color specification can be active at a time. For instance, at the
+beginning of a page, only the bottommost entry on the color stack is
+sent; also, when a color is popped, all that is done is that the color
+specification from the previous stack entry is sent. No &lsquo;<samp>gsave</samp>&rsquo; or
+&lsquo;<samp>grestore</samp>&rsquo; is used. This means that you cannot easily mix usage of
+the &lsquo;<samp>color</samp>&rsquo; specials for screens and colors, just one or the other.
+This may be addressed in the future by adding support for different
+categories of color-like state.
+</p>
+
+<hr>
+<span id="Index"></span><div class="header">
+<p>
+Previous: <a href="#Color" accesskey="p" rel="prev">Color</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-1"></span><h2 class="unnumbered">Index</h2>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-2"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-3"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-5"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-6"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-7"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-8"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-9"><b>6</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-10"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-12"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-13"><b>@</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-14"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-15"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021-special-_0028literal-PS-header_0029"><code>! <span class="roman">special (literal PS header)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-headers">Literal headers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021-starting-output-filename"><code>! <span class="roman">starting output filename</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-2">&quot;</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0022-special-_0028literal-PostScript_0029"><code>&quot; <span class="roman">special (literal PostScript)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_0022-special">&quot; special</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-3">%</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025BoundingBox"><code>%%BoundingBox</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025Page_002c-and-multi_002dpage-information"><code>%%Page<span class="roman">, and multi-page information</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025Page_002c-not-generating"><code>%%Page<span class="roman">, not generating</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025Page_002c-removing"><code>%%Page<span class="roman">, removing</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025Page_002c-required-by-Ghostview"><code>%%Page<span class="roman">, required by Ghostview</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_0025VMusage"><code>%%VMusage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0025_002aFont"><code>%*Font</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fonts-in-figures">Fonts in figures</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-4">(</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0028atend_0029_002c-bounding-box-specification"><code>(atend)<span class="roman">, bounding box specification</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-5">+</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002bpsmapfile"><code>+<var>psmapfile</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-6">-</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d"><code>-</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d-as-output-filename"><code>- <span class="roman">as output filename</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dhelp"><code>--help</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-summary">Option summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dhelp-1"><code>--help</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dversion"><code>--version</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002da"><code>-a</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dA"><code>-A</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002da-1"><code>-a</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dB"><code>-B</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002db-num"><code>-b <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dc-num"><code>-c <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dC-num"><code>-C <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dc-ratio"><code>-c <var>ratio</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dd-num"><code>-d <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dD-num"><code>-D <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dE"><code>-E</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002de-num"><code>-e <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002de-ratio"><code>-e <var>ratio</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002df"><code>-f</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dF"><code>-F</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dG"><code>-G</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dh-name"><code>-h <var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002di"><code>-i</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dj-for-partial-font-downloading"><code>-j <span class="roman">for partial font downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dK"><code>-K</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dk-for-cropmarks"><code>-k <span class="roman">for cropmarks</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dL"><code>-L</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dl-_005b_003d_005dnum"><code>-l [=]<var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dm"><code>-m</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dM"><code>-M</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dmode"><code>-mode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dmode-mode"><code>-mode <var>mode</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dN"><code>-N</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dn-num"><code>-n <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dnoomega"><code>-noomega</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dnoptex"><code>-noptex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dO"><code>-O</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002do-name"><code>-o <var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dO-x_002doffset_002cy_002doffset"><code>-O <var>x-offset</var>,<var>y-offset</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dP-printer"><code>-P <var>printer</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dp-ps_002denc"><code>-p <var>ps-enc</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dp-ps_002denc-1"><code>-p <var>ps-enc</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dp-_005b_003d_005dnum"><code>-p [=]<var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dpp-first_002dlast"><code>-pp <var>first</var>-<var>last</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dpp-range"><code>-pp <var>range</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dPprinter_002c-and-config-file-searching"><code>-P<var>printer</var><span class="roman">, and config file searching</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dq"><code>-q</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dr"><code>-r</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dR"><code>-R</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ds"><code>-s</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dS-num"><code>-S <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ds-slant"><code>-s <var>slant</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dT-enc_002dfile"><code>-T <var>enc-file</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-both-encodings">Changing both encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dT-hsize_002cvsize"><code>-T <var>hsize</var>,<var>vsize</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dt-papertype"><code>-t <var>papertype</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dT-ps_002dtex_002denc"><code>-T <var>ps-tex-enc</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dt-tex_002denc"><code>-t <var>tex-enc</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-TeX-encodings">Changing TeX encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dt-tex_002denc-1"><code>-t <var>tex-enc</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dU"><code>-U</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002du"><code>-u</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002du-psmapfile"><code>-u <var>psmapfile</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dv"><code>-v</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dV"><code>-V</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dv-vpl_002dfile"><code>-v <var>vpl-file</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dV-vpl_002dfile"><code>-V <var>vpl-file</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dx-num"><code>-x <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dX-num"><code>-X <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dY-num"><code>-Y <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dz"><code>-z</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dZ-for-compressing-bitmap-fonts"><code>-Z <span class="roman">for compressing bitmap fonts</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dz-for-recognizing-hyperdvi"><code>-z <span class="roman">for recognizing hyperdvi</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-7">.</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002e_002e_002drelative-filenames"><samp>..</samp>-relative filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eafm-Adobe-metric-files"><code>.afm <span class="roman">Adobe metric files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002edvipsrc_002c-searched-for"><code>.dvipsrc<span class="roman">, searched for</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eenc-extension-for-encoding-vectors"><code>.enc <span class="roman">extension for encoding vectors</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002elpro-long-prologue-files"><code>.lpro <span class="roman">long prologue files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emf-Metafont-source-files"><code>.mf <span class="roman">Metafont source files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ennnpk-packed-font-bitmaps"><code>.<var>nnn</var>pk <span class="roman">packed font bitmaps</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfa-extension-required-for-partial-downloading"><code>.pfa <span class="roman">extension required for partial downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfa-printer-font-ascii-files"><code>.pfa <span class="roman">printer font ascii files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfb-extension-required-for-partial-downloading"><code>.pfb <span class="roman">extension required for partial downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfb-printer-font-binary-files"><code>.pfb <span class="roman">printer font binary files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfm-printer-font-metric-files"><code>.pfm <span class="roman">printer font metric files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epl-property-list-files"><code>.pl <span class="roman">property list files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epro-prologue-files"><code>.pro <span class="roman">prologue files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002etfm-TeX-font-metric-files"><code>.tfm <span class="roman">TeX font metric files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-8">/</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002f_0023copies"><code>/#copies</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002f_0023copies-1"><code>/#copies</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002fmagscale"><code>/magscale</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-9">6</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-612-792-bounding-box-size"><code>612 792 <span class="roman">bounding box size</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-10">8</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-8r-encoding_002c-and-extra-characters"><code>8r <span class="roman">encoding, and extra characters</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-8r-font-encoding">8r font encoding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-8r_002eenc"><code>8r.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-11">&lt;</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003c-font-downloading"><code>&lt; <span class="roman">font downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003c_003c-whole-font-downloading"><code>&lt;&lt; <span class="roman">whole font downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003c_005b-encoding-vector-downloading"><code>&lt;[ <span class="roman">encoding vector downloading</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-12">=</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003d_003a-ligature-operation"><code>=: <span class="roman">ligature operation</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-13">@</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0040-config-command-_0028define-paper-sizes_0029"><code>@ <span class="roman">config command (define paper sizes)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-14">\</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005c_002e"><code>\.</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cAA"><code>\AA</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cColorName"><code>\<var>ColorName</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cdot"><code>\dot</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cepsffile-macro"><code>\epsffile <span class="roman">macro</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cepsfsize"><code>\epsfsize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cepsfverbosetrue"><code>\epsfverbosetrue</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cepsfxsize"><code>\epsfxsize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cepsfysize"><code>\epsfysize</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cH"><code>\H</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cincludegraphics-LaTeX-macro">\includegraphics LaTeX macro</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cincludegraphics">\includegraphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cleavevmode"><code>\leavevmode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cmagnification"><code>\magnification</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005crotninety"><code>\rotninety</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-examples">Literal examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005ctextColorName"><code>\text<var>ColorName</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-15">|</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_007c-starting-output-filename"><code>| <span class="roman">starting output filename</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-a-config-command-_0028conserve-memory_0029"><code>a <span class="roman">config command (conserve memory)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-A-ring_002c-Scandinavian-letter">A ring, Scandinavian letter</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-a3-papertype">a3 papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-a4-paper-size"><code>a4 <span class="roman">paper size</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-a4-papertype">a4 papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-A4size-paper-size"><code>A4size <span class="roman">paper size</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-filenames_002c-disabling">absolute filenames, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-page-number_002c-and-_002dl">absolute page number, and &lsquo;<samp>-l</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-page-number_002c-and-_002dp">absolute page number, and &lsquo;<samp>-p</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-accent-height-adjustment_002c-omitting">accent height adjustment, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-accents_002c-in-wrong-position">accents, in wrong position</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-accents_002c-wrong">accents, wrong</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-accuracy-in-positioning">accuracy in positioning</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afm-files">afm files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afm2tfm"><code>afm2tfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afm2tfm-1"><code>afm2tfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-afm2tfm">Invoking afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-afm2tfm-options">afm2tfm options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-after-header_002c-inserting-code">after header, inserting code</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Aladdin-Ghostscript">Aladdin Ghostscript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Anderson_002c-Laurie">Anderson, Laurie</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-angle-_0028psfile-special-option_0029"><code>angle <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arcs">arcs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ASCII-character-codes_002c-used-by-PostScript">ASCII character codes, used by PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-atend_002c-bounding-box-specification"><code>atend<span class="roman">, bounding box specification</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-b-config-command-_0028_0023copies_0029"><code>b <span class="roman">config command (#copies)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-base"><code>base</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-base-encoding_002c-recommended">base encoding, recommended</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-base-fonts">base fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bbfig"><code>bbfig</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-before-header_002c-inserting-code">before header, inserting code</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bhattacharya_002c-Tanmoy">Bhattacharya, Tanmoy</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-big-points">big points</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-binary-files_002c-not-supported">binary files, not supported</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-graphics-fails">Including graphics fails</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bitmap-fonts">bitmap fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bop-undefined-error"><tt>bop undefined</tt> error</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bop_002dhook"><code>bop-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bop_002dhook-1"><code>bop-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bop_002dhook-2"><code>bop-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bop_002dhook_002c-and-offset-pages"><code>bop-hook<span class="roman">, and offset pages</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-boundary-character">boundary character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-comment-for">bounding box, comment for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-defined">bounding box, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-determining">bounding box, determining</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-finding-tight">bounding box, finding tight</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-inaccurate">bounding box, inaccurate</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-clipping">EPSF clipping</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-supplying-to-TeX">bounding box, supplying to TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cincludegraphics">\includegraphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bounding-box_002c-supplying-to-TeX-1">bounding box, supplying to TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-c-config-command-_0028include-another-config-file_0029"><code>c <span class="roman">config command (include another config file)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-changing-PostScript-encodings">changing PostScript encodings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-changing-TeX-encodings">changing TeX encodings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-TeX-encodings">Changing TeX encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-character-definitions-in-PostScript">character definitions in PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-character-lookup-procedure-in-PostScript">character lookup procedure in PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CharStrings-Type-1-dictionary"><code>CharStrings <span class="roman">Type 1 dictionary</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-clip-_0028psfile-special-option_0029"><code>clip <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-clipping-of-EPSF">clipping of EPSF</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-clipping">EPSF clipping</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CODINGSCHEME"><code>CODINGSCHEME</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-collated-copies">collated copies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color">color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color">Color</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-configuration">color configuration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-device-configuration">Color device configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-macros">color macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-names_002c-mixed-case">color names, mixed case</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-nesting-level">color nesting level</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-separations">color separations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-specifications">color specifications</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-specifications">Color specifications</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-color-subtleties">color subtleties</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-subtleties">Color subtleties</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-colors_002c-user_002ddefinable">colors, user-definable</a>:</td><td>&nbsp;</td><td valign="top"><a href="#User_002ddefinable-colors">User-definable colors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-command-line_002c-including-headers-from">command line, including headers from</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-command_002dline-options">command-line options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Dvips">Invoking Dvips</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-in-configuration-files">comments, in configuration files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-in-encoding-files">comments, in encoding files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-removing-included">comments, removing included</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compilation">compilation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compressed-PostScript">compressed PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Dynamic-creation-of-graphics">Dynamic creation of graphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compressing-bitmap-fonts">compressing bitmap fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Computer-Modern-in-PostScript">Computer Modern in PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Computer-Modern_002c-encoding-of">Computer Modern, encoding of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-condensed-fonts">condensed fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eproto"><code>config.proto</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps"><code>config.ps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps-installation"><code>config.ps <span class="roman">installation</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps-paper-sizes"><code>config.ps <span class="roman">paper sizes</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps_002c-searched-for"><code>config.ps<span class="roman">, searched for</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-file-options">configuration file options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-file-paper-size-command">configuration file paper size command</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-file-path">configuration file path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-file-searching">configuration file searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-files">configuration files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-files_002c-creating">configuration files, creating</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-files_002c-prototype">configuration files, prototype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration_002c-of-color-devices">configuration, of color devices</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-device-configuration">Color device configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration_002c-of-Dvips">configuration, of Dvips</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-continuation-lines_002c-not-supported">continuation lines, not supported</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-control_002dD">control-D</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copies_002c-collated">copies, collated</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copies_002c-duplicated-page-bodies">copies, duplicated page bodies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-copies_002c-uncollated">copies, uncollated</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Crayola-crayon-box">Crayola crayon box</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-crop_002epro"><code>crop.pro</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cropmarks">cropmarks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-current-font_002c-in-PostScript">current font, in PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-D-config-command-_0028dpi_0029"><code>D <span class="roman">config command (dpi)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dated-output">dated output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-datestamp_002c-in-output">datestamp, in output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging">debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging-1">debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging-options">debugging options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debug-options">Debug options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-resolutions">default resolutions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default_005ftexsizes-Make-variable"><code>default_texsizes <span class="roman">Make variable</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Deutsch_002c-Peter">Deutsch, Peter</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-device-dependency_002c-and-virtual-fonts">device dependency, and virtual fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dictionary_002c-CharStrings">dictionary, <code>CharStrings</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dictionary_002c-PostScript-language">dictionary, PostScript language</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dictionary_002c-SDict">dictionary, <code>SDict</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-headers">Literal headers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dictionary_002c-userdict">dictionary, <code>userdict</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-distillation_002c-and-_002dz">distillation, and &lsquo;<samp>-z</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-distiller_002c-for-PDF-files">distiller, for PDF files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dot-accent">dot accent</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-double_002dsided-printing">double-sided printing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-downloading-fonts-partially">downloading fonts partially</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-downloading-PostScript-fonts">downloading PostScript fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Doyle_002c-Mark">Doyle, Mark</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-draft-copies">draft copies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dual-paper-trays">dual paper trays</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-duplex-printers">duplex printers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVI-magnification">DVI magnification</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvihps_002c-hyperdvi-to-PostScript"><code>dvihps<span class="roman">, hyperdvi to PostScript</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Dvips-configuration-file-options">Dvips configuration file options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvips_002eenc"><code>dvips.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSDEBUG"><code>DVIPSDEBUG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSFONTS"><code>DVIPSFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSHEADERS"><code>DVIPSHEADERS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSHEADERS_002c-overrides-H"><code>DVIPSHEADERS<span class="roman">, overrides</span> H</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSMAKEPK"><code>DVIPSMAKEPK</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSRC"><code>DVIPSRC</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSSIZES"><code>DVIPSSIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSSIZES_002c-overrides-R"><code>DVIPSSIZES<span class="roman">, overrides</span> R</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dynamic-creation-of-graphics">dynamic creation of graphics</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Dynamic-creation-of-graphics">Dynamic creation of graphics</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-e-config-command-_0028maxdrift_0029"><code>e <span class="roman">config command (maxdrift)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-E-config-command-_0028shell-escape_0029"><code>E <span class="roman">config command (shell escape)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-efficiency_002c-and-fonts">efficiency, and fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ehandler_002eps"><code>ehandler.ps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-embedding-Type-1-fonts">embedding Type 1 fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encoding-changes">encoding changes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-font-encodings">Changing font encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encoding-file-format">encoding file format</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encoding-files">encoding files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Encoding-Type-1-dictionary"><code>Encoding <span class="roman">Type 1 dictionary</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encoding-vectors_002c-defined">encoding vectors, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encoding-vectors_002c-in-Type-1-fonts">encoding vectors, in Type 1 fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-encodings">encodings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-end_002dhook"><code>end-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environment-variables">environment variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EOF">EOF</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-eop_002dhook"><code>eop-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EPS_002c-and-Ghostview">EPS, and Ghostview</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EPSF-macros">EPSF macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EPSF_002c-generating">EPSF, generating</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-epsf_002esty"><code>epsf.sty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-epsf_002etex"><code>epsf.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Epson-printers">Epson printers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-error-messages-from-printer">error messages from printer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-even-pages-only">even pages only</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-examples-of-literal-PostScript">examples of literal PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-examples">Literal examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expanded-fonts">expanded fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expanded-fonts-1">expanded fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expanded-fonts-2">expanded fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-of-virtual-fonts">expansion, of virtual fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-extended-URL">extended URL</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ExtendFont"><code>ExtendFont</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-extra-characters_002c-accessing">extra characters, accessing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-f-config-command-_0028filter_0029"><code>f <span class="roman">config command (filter)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-F-config-command-_0028filter_0029"><code>F <span class="roman">config command (filter)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-failure_002c-and-printer-errors">failure, and printer errors</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-failure_002c-of-long-documents">failure, of long documents</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Long-documents-fail">Long documents fail</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-failure_002c-to-include-graphics">failure, to include graphics</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-graphics-fails">Including graphics fails</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-failure_002c-to-print-at-all">failure, to print at all</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fallback-resolutions">fallback resolutions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-figures-and-fonts">figures and fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fonts-in-figures">Fonts in figures</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-figures_002c-natural-size">figures, natural size</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-figures_002c-scaling">figures, scaling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filter_002c-running-as-a">filter, running as a</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-first-page-printed">first page printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-concepts">font concepts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Font-concepts">Font concepts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-generation_002c-avoiding">font generation, avoiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontinst"><code>fontinst</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-afm2tfm">Invoking afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-as-header-files">fonts, as header files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-changing-encoding-of">fonts, changing encoding of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-font-encodings">Changing font encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-downloading">fonts, downloading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-expanded">fonts, expanded</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-in-PostScript-figures">fonts, in PostScript figures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fonts-in-figures">Fonts in figures</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-installation-of-PostScript">fonts, installation of PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-installing">fonts, installing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-outlined">fonts, outlined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-slanted">fonts, slanted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-small-caps">fonts, small caps</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fonts_002c-system-PostScript">fonts, system PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-G-config-command-_0028character-shifting_0029"><code>G <span class="roman">config command (character shifting)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gf-files">gf files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gftopk"><code>gftopk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Ghostscript-installation">Ghostscript installation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ghostview"><code>ghostview</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Ghostview_002c-and-no-N">Ghostview, and no &lsquo;<samp>N</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-glyph-files">glyph files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GLYPHFONTS_002c-overrides-P"><code>GLYPHFONTS<span class="roman">, overrides</span> P</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gnuplot"><code>gnuplot</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Dynamic-creation-of-graphics">Dynamic creation of graphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-graphics-inclusion-fails">graphics inclusion fails</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-graphics-fails">Including graphics fails</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gs-installation"><code>gs <span class="roman">installation</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gsave_002fgrestore_002c-and-literal-PS"><code>gsave<span class="roman">/</span>grestore<span class="roman">, and literal PS</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-examples">Literal examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gsftopk"><code>gsftopk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-h-config-command-_0028download-additional-header_0029"><code>h <span class="roman">config command (download additional header)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-H-config-command-_0028PostScript-header-path_0029"><code>H <span class="roman">config command (PostScript header path)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hafner_002c-Jim">Hafner, Jim</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color">Color</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-header-file_002c-downloading">header file, downloading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-header-files_002c-defined">header files, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-header-path_002c-defining">header path, defining</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-header_003dfile-_005cspecial"><code>header=<var>file</var> \special</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-headers-and-memory-usage">headers and memory usage</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-headers_002c-including-from-the-command-line">headers, including from the command line</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-headers_002c-including-in-TeX">headers, including in TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hints">hints</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hoffset-_0028psfile-special-option_0029"><code>hoffset <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-HP4Si-printer-and-paper-trays">HP4Si printer and paper trays</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-href"><code>href</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hscale-_0028psfile-special-option_0029"><code>hscale <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hsize-_0028psfile-special-option_0029"><code>hsize <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-html-specials"><code>html <span class="roman">specials</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-html-specials_002c-and-_002dz"><code>html <span class="roman">specials, and &lsquo;<samp>-z</samp>&rsquo;</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-http_003a_002f_002fwww_002ewin_002etue_002enl_002f_007edickie_002fidvi"><code><code>http://www.win.tue.nl/~dickie/idvi</code></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-http_003a_002f_002fxxx_002elanl_002egov_002fhypertex"><code><code>http://xxx.lanl.gov/hypertex</code></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hungarian-umlaut">Hungarian umlaut</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hyperdvi-extensions_002c-enabling">hyperdvi extensions, enabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-and-bitmap-fonts">hypertext and bitmap fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-caveats">hypertext caveats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-caveats-1">hypertext caveats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-specials">hypertext specials</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hypertext-support">hypertext support</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-i-config-command-_0028pages_002fsection_0029"><code>i <span class="roman">config command (pages/section)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-idvi-Java-DVI-reader"><code>idvi <span class="roman">Java DVI reader</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Illustrator_002c-workaround-for">Illustrator, workaround for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-graphics-fails">Including graphics fails</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-img"><code>img</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-including-graphics-fails">including graphics fails</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-graphics-fails">Including graphics fails</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-including-headers-from-the-command-line">including headers from the command line</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-including-headers-in-TeX">including headers in TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installation-of-config_002eps">installation of <samp>config.ps</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installation-of-PostScript-fonts">installation of PostScript fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installation_002c-of-Dvips">installation, of Dvips</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Installation">Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-installing-fonts">installing fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interaction-with-PostScript">interaction with PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Interaction-with-PostScript">Interaction with PostScript</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-inverted-output">inverted output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Small-or-inverted">Small or inverted</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-invoking-Dvips">invoking Dvips</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Dvips">Invoking Dvips</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-J">J</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-j-config-command-_0028partial-font-downloading_0029"><code>j <span class="roman">config command (partial font downloading)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Java-DVI-reader">Java DVI reader</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Jeffrey_002c-Alan">Jeffrey, Alan</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-afm2tfm">Invoking afm2tfm</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-K-config-command-_0028comment-removal_0029"><code>K <span class="roman">config command (comment removal)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kerning_002c-defined">kerning, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPATHSEA_005fDEBUG"><code>KPATHSEA_DEBUG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-L-config-command-_0028last-paper-size-wins_0029"><code>L <span class="roman">config command (last paper size wins)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-landscape-orientation_002c-defined">landscape orientation, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-size-and-landscape">Paper size and landscape</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-landscape-papertype">landscape papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-landscape_002c-as-_005cspecial"><code>landscape<span class="roman">, as <code>\special</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-last-page-printed">last page printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-last_002dresort-font-scaling_002c-with-DVIPSSIZES">last-resort font scaling, with <code>DVIPSSIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-last_002dresort-scaling_002c-with-R">last-resort scaling, with <code>R</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ledger-papertype">ledger papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-legal-papertype">legal papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letter-paper-size"><code>letter <span class="roman">paper size</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letter-papertype">letter papertype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letterhead-tray">letterhead tray</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-letterSize-paper-size"><code>letterSize <span class="roman">paper size</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ligature-operations">ligature operations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ligature_002c-defined">ligature, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LIGKERN-encoding-file-command"><code>LIGKERN <span class="roman">encoding file command</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lines-in-figures_002c-wrong-width">lines in figures, wrong width</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-clipping">EPSF clipping</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-links_002c-hypertext">links, hypertext</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-literal-headers">literal headers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-headers">Literal headers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-literal-PostScript_002c-examples">literal PostScript, examples</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-examples">Literal examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-literal-PostScript_002c-using">literal PostScript, using</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-PS">Literal PS</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-llx-_0028psfile-special-option_0029"><code>llx <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lly-_0028psfile-special-option_0029"><code>lly <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-long-documents-not-printing">long documents not printing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Long-documents-fail">Long documents fail</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-low-characters_002c-shifting">low characters, shifting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lpr-spooler_002c-MS_002dDOS-emulation">lpr spooler, MS-DOS emulation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-m-config-command-_0028available-memory_0029"><code>m <span class="roman">config command (available memory)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-M-config-command-_0028mf-mode_0029"><code>M <span class="roman">config command (mf mode)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-macros-for-color">macros for color</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-macros-for-epsf-inclusion">macros for epsf inclusion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#g_t_005cincludegraphics">\includegraphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-macros-for-epsf-inclusion-1">macros for epsf inclusion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magnification_002c-DVI">magnification, DVI</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magnification_002c-overriding-DVI">magnification, overriding DVI</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magnification_002c-vertical">magnification, vertical</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mailcap-and-hypertext"><code>mailcap <span class="roman">and hypertext</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-manual-feed">manual feed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-maxdrift">maxdrift</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-maximum-pages-printed">maximum pages printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-media">media</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory-available">memory available</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory-of-printer-exhausted">memory of printer exhausted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory-usage_002c-and-headers">memory usage, and headers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory_002c-conserving">memory, conserving</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory_002c-used-by-PostScript-fonts">memory, used by PostScript fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-ligature-operations">Metafont ligature operations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encoding-file-format">Encoding file format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-mode_002c-specifying">Metafont mode, specifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-source-files">Metafont source files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-metric-files">metric files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Minion-typeface-family">Minion typeface family</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-missfont_002elog"><code>missfont.log</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MISSFONT_005fLOG"><code>MISSFONT_LOG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Mitsubishi-Shinko-CHC_002dS446i-printer">Mitsubishi Shinko CHC-S446i printer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mkdvipspapers"><code>mkdvipspapers</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexpk_002c-avoiding"><code>mktexpk<span class="roman">, avoiding</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexpk_002c-changing-name"><code>mktexpk<span class="roman">, changing name</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mode-name_002c-specifying">mode name, specifying</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mtpk"><code>mtpk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-master-fonts">multiple master fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-output-files">multiple output files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-paper-trays">multiple paper trays</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Murphy_002c-Tim">Murphy, Tim</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-N--config-command-_0028disable-EPS_0029"><code>N <span class="roman"> config command (disable EPS)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-name"><code>name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-narrow-fonts">narrow fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-no-output-at-all">no output at all</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-non_002dprinting-characters_002c-shifting">non-printing characters, shifting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-non_002dresident-fonts">non-resident fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nopaper_002c-paper-format-for-_002dt"><code>nopaper<span class="roman">, paper format for &lsquo;<samp>-t</samp>&rsquo;</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-o-config-command-_0028output-destination_0029"><code>o <span class="roman">config command (output destination)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-O-config-command-_0028page-offsets_0029"><code>O <span class="roman">config command (page offsets)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-oblique-fonts">oblique fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-octal-character-codes">octal character codes</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-odd-pages-only">odd pages only</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-offset-pages">offset pages</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Omega-extensions">Omega extensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-option_002c-details-of">option, details of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-debugging">options, debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debug-options">Debug options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-Dvips">options, Dvips</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-Dvips">Invoking Dvips</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-reading-from-standard-input">options, reading from standard input</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-summary">options, summary</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-summary">Option summary</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options_002c-to-Afm2tfm">options, to Afm2tfm</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-outline-fonts">outline fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-outline-fonts-1">outline fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output-file_002c-sectioning-of">output file, sectioning of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output-file_002c-setting">output file, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output-files_002c-multiple">output files, multiple</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002c-inverted">output, inverted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Small-or-inverted">Small or inverted</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002c-none">output, none</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002c-redirecting">output, redirecting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-output_002c-too-small">output, too small</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Small-or-inverted">Small or inverted</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-p-config-command-_0028font-aliases_0029"><code>p <span class="roman">config command (font aliases)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-P-config-command-_0028PK-path_0029"><code>P <span class="roman">config command (PK path)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page-range">page range</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002c-first-printed">page, first printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-page_002c-last-printed">page, last printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pages_002c-maximum-printed">pages, maximum printed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PaintType"><code>PaintType</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Pantone-colors">Pantone colors</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-macro-files">Color macro files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paper-size-configuration-file-command">paper size configuration file command</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paper-size_002c-default">paper size, default</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paper-size_002c-general">paper size, general</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-size-and-landscape">Paper size and landscape</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paper-trays">paper trays</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-trays">Paper trays</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-paper-type">paper type</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-papersize-special"><code>papersize <span class="roman">special</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-papersize-special_002c-and-no-_002dt">papersize special, and no &lsquo;<samp>-t</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-papersize-special_002c-first-vs_002e-last">&lsquo;<samp>papersize</samp>&rsquo; special, first vs. last</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-partial-font-downloading">partial font downloading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-files_002c-font-quality">PDF files, font quality</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-files_002c-making">PDF files, making</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-files_002c-making-1">PDF files, making</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDF-files_002c-option-for">PDF files, option for</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfmark"><code>pdfmark</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext">Hypertext</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pfa-files">pfa files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pfb-files">pfb files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pfb-files_002c-automatically-unpacked">pfb files, automatically unpacked</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pfm-files">pfm files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Phaser-printer_002c-used-for-color-calibration">Phaser printer, used for color calibration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-device-configuration">Color device configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-physical-page-number_002c-and-_002dl">physical page number, and &lsquo;<samp>-l</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-physical-page-number_002c-and-_002dp">physical page number, and &lsquo;<samp>-p</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-physical-page-number_002c-and-bop_002dhook">physical page number, and <code>bop-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pipes_002c-not-readable">pipes, not readable</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pk-files">pk files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PKFONTS_002c-overrides-P"><code>PKFONTS<span class="roman">, overrides</span> P</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-plotfile_002c-ps-subspecial"><code>plotfile<span class="roman">, &lsquo;<samp>ps</samp>&rsquo; subspecial</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ps-special">ps special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pltotf"><code>pltotf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-popen-for-output"><code>popen <span class="roman">for output</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-portrait-orientation_002c-defined">portrait orientation, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Paper-size-and-landscape">Paper size and landscape</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-positioning-accuracy">positioning accuracy</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-post-code-after-headers"><code>post <span class="roman">code after headers</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-code_002c-literal">PostScript code, literal</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-PS">Literal PS</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-encoding">PostScript encoding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-encoding_002c-changing">PostScript encoding, changing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-font-alias-file">PostScript font alias file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-font-alias-file-1">PostScript font alias file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-fonts">PostScript fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-fonts">PostScript fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-fonts_002c-installing">PostScript fonts, installing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-fonts_002c-on-your-system">PostScript fonts, on your system</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-header-files">PostScript header files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-hooks">PostScript hooks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-interaction">PostScript interaction</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Interaction-with-PostScript">Interaction with PostScript</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-previewers">PostScript previewers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PostScript-units">PostScript units</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bounding-box">Bounding box</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PowerPage-PostScript-implementation">PowerPage PostScript implementation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pre-code-before-headers"><code>pre <span class="roman">code before headers</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-previewing-Dvips-output">previewing Dvips output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PRINTER"><code>PRINTER</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-configuration">printer configuration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-configuration-file_002c-prototype">printer configuration file, prototype</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-errors">printer errors</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-memory">printer memory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-memory-exhausted">printer memory exhausted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer-offset">printer offset</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PRINTER_002c-and-config-file-searching"><code>PRINTER<span class="roman">, and config file searching</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PRINTER_002c-avoided-with-_002df"><code>PRINTER<span class="roman">, avoided with &lsquo;<samp>-f</samp>&rsquo;</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-printer_002c-driving-directly">printer, driving directly</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-problems">problems</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-property-list-files">property list files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-prototype-printer-configuration-file">prototype printer configuration file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#config_002eps-installation">config.ps installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ps-special"><code>ps <span class="roman">special</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ps-special">ps special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psfile-special"><code>psfile <span class="roman">special</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psfonts_002emap"><code>psfonts.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-font-installation">PostScript font installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psfonts_002emap-1"><code>psfonts.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psfonts_002emap-2"><code>psfonts.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psheaderdir"><code>psheaderdir</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-psi-character-missing">psi character missing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pstopk"><code>pstopk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pTeX-extensions">pTeX extensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pTeX-extensions-1">pTeX extensions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-q-config-command-_0028quiet_0029"><code>q <span class="roman">config command (quiet)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Q-config-command-_0028quiet_0029"><code>Q <span class="roman">config command (quiet)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quiet-operation">quiet operation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-R-config-command-_0028fallback-resolution_0029"><code>R <span class="roman">config command (fallback resolution)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-r-config-command-_0028page-reversal_0029"><code>r <span class="roman">config command (page reversal)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-raw-tfm-files">raw tfm files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reencode_002f_002a_002eenc"><code>reencode/*.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reencoding">reencoding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reencoding-PostScript-fonts">reencoding PostScript fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-registered-character_002c-accessing"><code>registered <span class="roman">character, accessing</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-remapping">remapping</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resident-fonts_002c-different-in-different-printers">resident fonts, different in different printers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resident-fonts_002c-different-in-different-printers-1">resident fonts, different in different printers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resolution">resolution</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resolution-1">resolution</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resolution_002c-setting">resolution, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reverse-pagination">reverse pagination</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rhi-_0028psfile-special-option_0029"><code>rhi <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Rokicki_002c-Tomas">Rokicki, Tomas</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Why-Dvips">Why Dvips</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rotate_002etex"><code>rotate.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ps-special">ps special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rwi-_0028psfile-special-option_0029"><code>rwi <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-s-config-command-_0028global-save_002frestore_0029"><code>s <span class="roman">config command (global save/restore)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-S-config-command-_0028pict-path_0029"><code>S <span class="roman">config command (pict path)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-save_002frestore_002c-and-inverted-output">save/restore, and inverted output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Small-or-inverted">Small or inverted</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-save_002frestore_002c-and-literal-PS"><code>save<span class="roman">/</span>restore<span class="roman">, and literal PS</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-examples">Literal examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-save_002frestore_002c-and-specials">save/restore, and specials</a>:</td><td>&nbsp;</td><td valign="top"><a href="#ps-special">ps special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-save_002frestore_002c-generating-global">save/restore, generating global</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scaleunit"><code>scaleunit</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scaling-of-figures">scaling of figures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-scaling">EPSF scaling</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scaling-small-caps">scaling small caps</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Scandinavian-A-ring">Scandinavian A ring</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reencoding-with-Afm2tfm">Reencoding with Afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-screen-frequencies_002c-setting">screen frequencies, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SDict"><code>SDict</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SDict-dictionary"><code>SDict <span class="roman">dictionary</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Literal-headers">Literal headers</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-config-files_002c-order-of">searching config files, order of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-searching">Configuration file searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sections-of-output-file_002c-and-memory">sections of output file, and memory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sections-output_002c-in-separate-files">sections output, in separate files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-security">security</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell-command-execution_002c-disabling">shell command execution, disabling</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell-escape_002c-in-config-file">shell escape, in config file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Shinko-CHC_002dS446i-printer">Shinko CHC-S446i printer</a>:</td><td>&nbsp;</td><td valign="top"><a href="#No-output">No output</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-show-PostScript-operator"><code>show <span class="roman">PostScript operator</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-silent-operation">silent operation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-simplex-mode-on-duplex-printers">simplex mode on duplex printers</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-the-command-line">Including headers from the command line</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-slanted-fonts">slanted fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-slanted-fonts_002c-making">slanted fonts, making</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Afm2tfm-options">Afm2tfm options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SlantFont"><code>SlantFont</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-small-caps-fonts">small caps fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Special-font-effects">Special font effects</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Smith_002c-Arthur">Smith, Arthur</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spaces_002c-dropped-trailing">spaces, dropped trailing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-specials_002c-hypertext">specials, hypertext</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-splines">splines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spooler_002c-lacking">spooler, lacking</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-spooling-to-lpr-on-MS_002dDOS">spooling to lpr on MS-DOS</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-I_002fO">standard I/O</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-input_002c-reading-options-from">standard input, reading options from</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-output_002c-output-to">standard output, output to</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-PostScript_002c-required-by-Ghostview">standard PostScript, required by Ghostview</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-start_002dhook"><code>start-hook</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-hooks">PostScript hooks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-structured-comments">structured comments</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-system-in-config-file"><code>system <span class="roman">in config file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-T-config-command-_0028TFM-path_0029"><code>T <span class="roman">config command (TFM path)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Tektronix-Phaser-printer_002c-used-for-color-calibration">Tektronix Phaser printer, used for color calibration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Color-device-configuration">Color device configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-testpage_002etex"><code>testpage.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-encoding_002c-changing">TeX encoding, changing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-TeX-encodings">Changing TeX encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX_002c-including-headers-in">TeX, including headers in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Including-headers-from-TeX">Including headers from TeX</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXCONFIG"><code>TEXCONFIG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS_002c-overrides-P"><code>TEXFONTS<span class="roman">, overrides</span> P</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS_002c-overrides-T"><code>TEXFONTS<span class="roman">, overrides</span> T</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXINPUTS_002c-overrides-S"><code>TEXINPUTS<span class="roman">, overrides</span> S</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmext_002eenc"><code>texmext.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFOUTPUT"><code>TEXMFOUTPUT</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmital_002eenc"><code>texmital.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmsym_002eenc"><code>texmsym.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Encodings">Encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmsym_002eenc-1"><code>texmsym.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-TeX-encodings">Changing TeX encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPICTS"><code>TEXPICTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Environment-variables">Environment variables</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPICTS_002c-overrides-S"><code>TEXPICTS<span class="roman">, overrides</span> S</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPKS_002c-overrides-P"><code>TEXPKS<span class="roman">, overrides</span> P</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXSIZES_002c-overrides-R"><code>TEXSIZES<span class="roman">, overrides</span> R</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-text-in-figures_002c-chopped-off">text in figures, chopped off</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-clipping">EPSF clipping</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tfm-files">tfm files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TFMFONTS_002c-overrides-T"><code>TFMFONTS<span class="roman">, overrides</span> T</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tftopl"><code>tftopl</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Metric-files">Metric files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Theisen_002c-Tim">Theisen, Tim</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Ghostscript-installation">Ghostscript installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tight-bounding-box_002c-finding">tight bounding box, finding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-too_002dsmall-output">too-small output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Small-or-inverted">Small or inverted</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trademark-character_002c-accessing"><code>trademark <span class="roman">character, accessing</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Changing-PostScript-encodings">Changing PostScript encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trailing-spaces_002c-dropped">trailing spaces, dropped</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-caveats">Hypertext caveats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TranScript">TranScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-transforming-downloaded-fonts">transforming downloaded fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trouble">trouble</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Diagnosing-problems">Diagnosing problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Type-1-fonts">Type 1 fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-files">Glyph files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-typesetting-in-PostScript">typesetting in PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#PostScript-typesetting">PostScript typesetting</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-U-config-command-_0028Xerox-4045_0029"><code>U <span class="roman">config command (Xerox 4045)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uncollated-copies">uncollated copies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uncompressing-PostScript">uncompressing PostScript</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Dynamic-creation-of-graphics">Dynamic creation of graphics</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uniform-resource-locator">uniform resource locator</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unknown_002c-paper-format-for-_002dt"><code>unknown<span class="roman">, paper format for &lsquo;<samp>-t</samp>&rsquo;</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#papersize-special">&lsquo;<samp>papersize</samp>&rsquo; special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unknown_002c-paper-format-for-_002dt-1"><code>unknown<span class="roman">, paper format for &lsquo;<samp>-t</samp>&rsquo;</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-file-paper-sizes">Config file paper sizes</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL_002c-definition">URL, definition</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-URL_002c-extended-for-TeX">URL, extended for TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Hypertext-specials">Hypertext specials</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-urx-_0028psfile-special-option_0029"><code>urx <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ury-_0028psfile-special-option_0029"><code>ury <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-usage_002c-basic">usage, basic</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-usage">Basic usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-user_002ddefinable-colors">user-definable colors</a>:</td><td>&nbsp;</td><td valign="top"><a href="#User_002ddefinable-colors">User-definable colors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-userdict_002c-and-dictionary-files"><code>userdict<span class="roman">, and dictionary files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Header-files">Header files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-userdict_002c-used-for-header-files">userdict<span class="roman">, used for header files</span></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-V-config-command-_0028vf-path_0029"><code>V <span class="roman">config command (vf path)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-verbose-EPSF-processing">verbose EPSF processing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#EPSF-macros">EPSF macros</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vf-files">vf files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-virtual-font-expansion">virtual font expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-virtual-font-path">virtual font path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-virtual-fonts">virtual fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-virtual-fonts_002c-creating">virtual fonts, creating</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-afm2tfm">Invoking afm2tfm</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VM-exhausted">VM exhausted</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Printer-errors">Printer errors</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VMusage"><code>VMusage</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Headers-and-memory-usage">Headers and memory usage</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-voffset-_0028psfile-special-option_0029"><code>voffset <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vpl-files">vpl files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Virtual-fonts">Virtual fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vptovf"><code>vptovf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Making-a-font-available">Making a font available</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vscale-_0028psfile-special-option_0029"><code>vscale <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-vsize-_0028psfile-special-option_0029"><code>vsize <span class="roman">(&lsquo;<samp>psfile</samp>&rsquo; special option)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfile-special">psfile special</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-W-config-command-_0028emit-warning_0029"><code>W <span class="roman">config command (emit warning)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warning-messages_002c-defining">warning messages, defining</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warnings_002c-suppressing">warnings, suppressing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whole-font-downloading">whole font downloading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-wide-fonts">wide fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#psfonts_002emap">psfonts.map</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-X-config-command-_0028horizontal-resolution_0029"><code>X <span class="roman">config command (horizontal resolution)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Xerox-4045">Xerox 4045</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Option-details">Option details</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Y">Y</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Y-config-command-_0028vertical-resolution_0029"><code>Y <span class="roman">config command (vertical resolution)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Z-config-command-_0028compress-fonts_0029"><code>Z <span class="roman">config command (compress fonts)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-z-config-command-_0028secure-mode_0029"><code>z <span class="roman">config command (secure mode)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Configuration-file-commands">Configuration file commands</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-2"><b>&quot;</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-3"><b>%</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-4"><b>(</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-5"><b>+</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-6"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-7"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-8"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-9"><b>6</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-10"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-11"><b>&lt;</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-12"><b>=</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-13"><b>@</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-14"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-15"><b>|</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-J"><b>J</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Y"><b>Y</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr>
+
+
+
+</body>
+</html>
diff --git a/systems/doc/dvips/dvips.pdf b/systems/doc/dvips/dvips.pdf
new file mode 100644
index 0000000000..7f9608ceec
--- /dev/null
+++ b/systems/doc/dvips/dvips.pdf
Binary files differ
diff --git a/systems/doc/etex/NTS-FAQ b/systems/doc/etex/NTS-FAQ
new file mode 100644
index 0000000000..1dd051f1e8
--- /dev/null
+++ b/systems/doc/etex/NTS-FAQ
@@ -0,0 +1,1015 @@
+Date: Tue, 31 Jan 1995 21:15:16 +0100
+Sender: NTS-L Distribution list <NTS-L@DHDURZ1.EARN>
+From: "J%org Knappen, Mainz" <KNAPPEN@VKPMZD.KPH.UNI-MAINZ.DE>
+Subject: Frequently asked questions of NTS-L, 5th edition
+X-To: nts-l <nts-l@dhdurz1.bitnet>
+To: Multiple recipients of list NTS-L <NTS-L@DHDURZ1.EARN>
+
+ Frequently Asked Questions of NTS-L
+
+Fifth edition
+Date: 31-JAN-1995
+Archive name: nts-l-faq
+Currently maintained by: knappen@vkpmzd.kph.uni-mainz.de (J%org Knappen)
+
+Remark about the format:
+
+This faq is divided into several sections and subsections. Each section
+contains a subsection general with some ideas which have not yet been
+discussed. I added a date to some subsections to allow you to retrieve
+fuller discussions from the archives. The transactions of this group are
+archived on
+
+ ftp.th-darmstadt.de [130.83.55.75] *)
+ directory pub/tex/documentation/nts-l
+
+Each file in this directory is named yymm, where (guess :-) yy is the
+year and mm is the month when the mail arrived. (I.e., all postings
+of one month are bundled in one file.)
+*) Avoid using the number above ... it is subject to changes.
+
+Related stuff which is very worth reading you can find on the CTAN archives
+under tex/info/tex-implementors. In addition, I recommend reading the list
+of TeX bugs (tex-archive/systems/knuth/errata/tex82.bug).
+
+-1. Contents
+
+0. About NTS
+1. Proposed features of a New Typesetting system
+1.1. Improvement of Quality
+1.2. Internationality
+1.3. New Look and Feel
+1.4. Changing the ligaturing algorithm
+1.5. Writing more than one dvi-file
+1.6. Anchors
+1.7. dump/restore mechanism
+2. Proposed additions to TeX (concrete new primitives)
+2.1. \lastmark etc.
+2.2. \system
+2.3. \skylineskiplimit, \skylinehorizontallimit
+2.4. \directioncode
+2.5. \textcode
+2.6. \afterfi
+2.7. \interactionmode
+2.8. \mathspacing
+2.9. \inputescapechar
+2.10. \middle
+2.11. \outputunit
+2.12. \protected
+2.13. \scantokens
+2.14. \deferred
+2.15. \everyeof
+2.16. \readline
+2.17. \evaluate
+2.18. \ifevaluate
+2.19. \everyeof
+2.20. \fancyprompt
+3. Metaremarks
+3.1. TeX is not perfect
+3.2. In which language shall NTS be written
+3.3. The TeX language
+3.4. The TeX engine
+3.5. Extensions and Enhancements
+4. Deviations
+4.1. Automated Kerning
+4.2. About Lout
+5. Proposed changes to METAFONT
+5.1. Writing to auxiliary files
+6. Proposed changes to the tfm file format
+6.1. Vertical kerning
+6.2. Cross-font ligatures
+7. Proposed changes to the dvi file format
+7.1. Horizontal and Vertical Mirroring
+7.2. Rotation of a glphy by 180 degrees
+8. Additions to the TeX kit
+8.1. dvicopy
+8.2. dv2dp and dp2dv
+8.3. gftotxt
+8.4. qdtexvpl
+8.5. fontinst
+8.6. afmtotfm
+8.7. dvipaste
+8.8. METAPOST
+8.9. Tie
+8.10. dvi2dvi
+9. Existing extensions to TeX
+9.1. TeX-XeT
+9.2. TeX--XeT
+9.3. MLTeX
+9.4. SiSiSi
+9.5. Japanese TeX
+
+0. About NTS (Mar 93, see also Jul 92)
+
+ At DANTE '93, held at the Technical University Chemnitz last week, Joachim
+ Lammarsch, President of Dante, announced that the NTS project which had been
+ started under the aegis of DANTE, was to be re-formed under a new
+ co-ordinator, Philip Taylor. The old core group, announced at the previous
+ annual DANTE meeting, was to be dissolved, and a new core group established.
+ Membership of the new core group will not be restricted to DANTE members,
+ but will instead be offered to various well-known names (and some
+ lesser-known!) in the international TeX community.
+
+ see also:
+ F. Mittelbach: E-TeX Guidelines for future TeX, TUGboat v11n3 (1990)
+ P. Taylor: The future of TeX, EuroTeX'92 Prag (Proceedings); reprinted
+ in TUGboat v13n4, 433 (1992)
+
+ As of September 1994, there are two activities going on, the ETeX group
+ is working on a extension of TeX and is going to produce a first ETeX soon.
+ The NTS group takes the path to reimplement TeX in common LISP to get
+ a deeper understanding of how the modules of TeX are cooperating which
+ eachother.
+
+ Independently, the Omega project was launched to produce a typesetting system
+ which uses unicode as internal code and can handle arbitrarily encoded input
+ via filters.
+
+ The beforementioned projects were presented at the 1994 TUG meeting at Santa
+ Barbara and at the EuroTeX'94 conference at Gdansk. For more information,
+ consult the respective proceedings. For the Omega project exists a mailing
+ list, omega@ens.fr. To subscribe, send an e-mail to LISTSERV@ens.fr.
+
+ Omega is now announced to be presented at March 16, 1995 at CERN (Geneva).
+
+1. Proposed features of a New Typesetting system
+
+1.1. Improvement of Quality
+
+1.1.0 General:
+ Optimised page breaking, avoiding ``rivers'', letterspacing (see also 4.1),
+ Hyphenation (Haupt- und Nebentrennstellen), grid typesetting
+
+1.1.1 Skyline approach to line breaking (Mar 93)
+
+You can break paragraphs as usual with the current model, where all
+lines are simple rectangular boxes. If there's no necessity to insert
+\lineskip, then you don't have to look at the skyline. Only if two
+lines are too near (e.g. distance<\lineskiplimit), you have to look
+into the two rectangular boxes and to check if the boxes inside
+overlap at one or more places.
+For the worst case (i.e., you have to look at the skyline for all
+pairs of lines) processing the skyline model consumes a lot of process
+time, but this shouldn't hinder us to test this idea and look at the
+results.
+
+Btw, the skyline model seems to be easy to implement in the current
+TeX, because we need only some changes when the finally broken lines
+of the paragraph are put on the vertical list. There are more changes
+needed in the code, if the line break should be changed for the cases
+where it is possible to avoid an overlap with other break points, but
+IMHO it's nonetheless a relatively small change.
+
+Additionally you have to introduce some new parameters. I think of
+something like:
+ \skylineskiplimit (b)
+ minimum vertical distance between two boxes
+ \skylinehorizontallimit (a)
+ minimum horizontal distance
+
+
+line 1: ------------
+ % %
+ % % ----------
+ ------- <== (a) ==> % %
+ ~ % %
+ (b) % -------
+ v %
+ ----------------------
+line 2:
+
+and other parameters, but the necessary parameter set, realization,
+etc. for "skylines" are subject of discussion.
+
+
+1.2. Internationality
+
+1.2.0 General:
+ Typesetting in arbitrary directions, unicode support (16bits), ISO10646
+ support (32bits), ligatures pointing to other fonts, vertical kerning,
+ better accent handling (\topaccent and \botaccent)
+
+ Remark: UTF-8 (UNICODE) can be handled with `TeX classic', LaTeX2e
+ support is provided by the CJK package written by Werner Lemberg.
+
+1.2.1 Supporting TeX--XeT primitives for right to left typesetting
+ TeX--XeT is an existing extension to TeX supporting right-to-left
+ typesetting an producing a usual dvi-file. TeX--XeT is written by
+ P. Breitenlohner and freely available. It is different from TeX-XeT
+ (one hyphen only). Allthough TeX will be frozen at version $\pi$,
+ this is not true for TeX--XeT. (see also 9.2)
+
+1.3. New Look and Feel
+
+1.3.0 General
+ Windows support, wysiwyg-like features
+
+1.3.1 Interaction with the operating system and other programmes
+ see 2.2. \system
+
+1.4. Changing the ligaturing algorithm
+ Replace the (IMHO over-)optimized ligature builder/kerning routines in
+ TeX by routines which separate between the building of ligatures and
+ the insertion of kerns between the characters/ligatures.
+
+ This can be realized in a simple way by using two passes: in the
+ first pass the ligatures are built and in the second pass the
+ resulting ligatures and remaining single characters are used to
+ determine the necessary kerns.
+
+ To ensure compatibility between e-TeX and TeX, it will be possible to
+ switch between the new and the current behaviour.
+
+ Additionally a flag in the TFM file of each font can be used to
+ specify which behaviour is to be used for the font. This ensures that
+ "old" fonts with some tricky ligature/kerning programs depending on
+ the old behaviour can still be used with e-TeX. (I don't know if this
+ font dependent switching is really necessary. Comments, please!!)
+
+ Example:
+
+ A font contains the following ligatures and kerns:
+
+ o " => ligature (o") (= \"{o})
+ V o => kern(-smallkern)
+ V lig(o") => nothing
+
+ Input: V o "
+ Output of current TeX: V kern(-smallkern) ligature(o")
+ Output with change: V ligature(o")
+
+ Status:
+
+ Bernd Raichle has written a simple, but running reimplementation of TeX's
+ ligature/kerning routine (in CommonLisp), which still waits to be
+ rewritten as a TeX.web change file.
+ The ligature builder/kerning routine is realized in one pass; kerns
+ are introduced in a delayed manner, i.e., after we are sure that
+ there's no possibility for a ligature.
+ Additionally there's a switch between the current TeX and the new
+ behaviour. (The TRIP test fails with the new behaviour.)
+
+PS: IMHO the ligature/kerning routines should be further changed to
+ remove the `shelf{}ful' anomaly (see TeXbook, exercise 5.1), i.e.,
+ reinserting ligatures when words are hyphenated.
+ The change should allow ligatures for inputs like `f{}f' or
+ `f\relax f', which will simplify the macros in `german.sty',
+ Babel and changed macros for \", \', ... which are used to select
+ characters from DC fonts or other fonts with national characters.
+
+1.5. Writing more than one dvi-file (Nov 94)
+ I want to have TeX ready in the memory and avoid loading it anew and anew
+ for each run again which costs lots of startup time, if you have to load
+ every file via NFSS.
+ The idea I am toying with is to have something like
+ \level
+ which clones the current state of TeX and allows to start a new dvi-file.
+ Then you do anything you want (start even another \level) and at last you say
+ \exit
+ which performes like \end, except that it restores exactly the state before
+ the last cloning.
+ To communicate some information to the waiting lion, there may be one
+ exeption. You say
+ \exit{some_integer_number}
+ and this number can be read by using
+ \exitstatus.
+ Applications are many. If you have a format which usually requires several
+ runs, you can do all the runs within one job, and automatically decide,
+ whether a further run is necessary. Of course, you should device your format
+ to have a counter maxruns to avoid endless looping...
+
+1.6. Anchors (Nov 94)
+ Proposed by Jiri, an ``anchor point'' would be in some senses
+ be analogous to a mark, but rather than recording textual information it
+ would instead record the co-ordinates of itself, relative to the reference
+ point of the smallest surrounding box. Additional new primitives would
+ be required to return the co-ordinates of a specified anchor point.
+
+1.7. dump/restore mechanism
+ I'd suggest something much simpler, but also more general: Include \dump in
+ all versions of TeX. The initex/virtex distinction is simply not worth the
+ bother of retaining any more - the memory differences are trivial in modern
+ terms. \dump should ideally also be extended to allow dumping from inside of
+ a group.
+ Once you do this, it becomes possible to write programs to analyze format
+ files. Since the analysis programs would not be part of TeX proper, they can
+ be as elaborate as anyone might want to make them. Sorting would be no
+ problem, for example.
+ None of this would cost anything in TeX itself, and except for the ability
+ to \dump inside a group, if added, would not even have an effect on whether
+ the resulting E-TeX is properly "TeX", since it would be invisible to any
+ possible trip test.
+
+2. Proposed additions to TeX (concrete new primitives)
+
+2.0. General (Jun 92, Jul 92, Aug 93, Nov 94)
+ A rather long list of proposed primitives (more or less worked out) was
+ posted by Karl Berry on 10-Jun-1992. It contains suggestions like:
+ \elseif (selfexplaining), \format{foo} (allow the author to select a format),
+ \host{name} \host{os} \host{type} \getenv to extract host information
+ \TeXversion, \usertime, \everyeof, and others.
+
+ It is currently not possible to get some information about the current
+ mode of TeX and make conditionals dependent on it and/or restore it after
+ some action (see 2.7. \interactionmode). More of this kind are a
+ conditional or primitive to signal, when TeX is in "expand only" mode
+ (\edef, \mark, \write, ...), when TeX is scanning numbers (here I'm
+ thinking---and hating---german.sty's active doublequote, which can also
+ be used as a marker for hexadecimal numbers), when TeX is peeking for
+ some special tokens (first column in an \halign), etc...
+
+ A list of new primitives, enhancements and extensions has been prepared
+ on the NTS meeting at Lindau in October 1994. It was posted to this list in
+ November 1994 and provoked plenty of discussions and additional suggestions.
+ Under the discussed primitves were \bind, \contents<box#>, \futuredef,
+ \ifdefined, \ifcsname ... \endcsname, \unless, \OSname, \defaultextension.
+
+2.1. \lastmark etc. (Jun 92, Jul 92)
+ Currently you cannot remove a \write or \mark or
+ \insert or rule from any list at all. If we allow them to removed, how
+ will the commands appear to the user? If we have \lastmark like
+ \lastbox, then perhaps we need a mark data type so that we can say something
+ like \setmark0=\lastmark. It will probably be difficult
+ in the case of \insert's to think of a good command syntax.
+
+ Perhaps \lastpenalty, \lastkern, \lastskip should
+ remove the penalty, kern, skip, ... so that they are consistent with
+ \lastbox. Then \unpenalty, \unkern, and \unskip would be unnecessary.
+ (Of course most macro packages would probably want to reimplement them,
+ as macros: \def\unpenalty{\count@\lastpenalty},
+ \def\unkern{\dimen@\lastkern}, \def\unskip{\skip@\lastskip}.)
+
+2.2. \system (Mar 93)
+
+2.2.0 General
+ Oops, this got rather longish, but this topic has caused plenty of traffic.
+ I decided to quote directly the positions of both sides. The subpoints are
+ 1. Pro 2. Contra 3. Syntax
+
+2.2.1 Pro
+ First comes the proposal as formulated by Phil Taylor:
+
+ There has been much discussion on how a \system primitive might interact
+ with different operating systems, each with different functionality and a
+ different syntax. My idea was to extend the concept of a `TeX
+ implementation', which at the moment implies the creation and application
+ of a change-file to the master TeX source, to include an implementation-
+ specific macro library. Thus each implementor, as well as creating and
+ applying a change file, would also be responsible for mapping a well-defined
+ set of macros, through the \system primitive, to the syntax and
+ functionality of the operating system for which he or she has assumed
+ responsibility. To cite a specific example:
+
+ Assume that in e-Lib (a hypothetical macro library to accompany e-TeX),
+ a macro \sys$delete_file {<parameters>} is partially defined; then each
+ implementor would be responsible for mapping \sys$delete_file {<parameters}>
+ to his or her own implementation of \system. e-Lib would define the effect
+ and the result(s), \system would provide the interface, and the implementor
+ would be responsible for providing the mapping.
+
+ The question has been asked: ``Why via \system and macros? Why not via
+ explicit primitives to carry out the various functions that are envisaged?''
+
+ To which I would suggest that the answer is ``Because `the various functions
+ which are envisaged' is both enormous (requiring many new primitives), and
+ yet not large enough (because no matter what functionality we posit, someone
+ will come up with an idea that has not been considered).'' By implementing
+ just one \system primitive, and an extensible e-Lib macro library, one can
+ create a robust and well-tested e-TeX whilst allowing new system interactions
+ to be added at the simplest points: through the implementation-independent
+ and implementation-specific components of e-Lib.
+
+2.2.2 Contra
+ And here's from the ``Minority Report'' (Tim Murphy and J"org Knappen)
+
+ May I recall the immortal words of Ken Thompson,
+ "A program should do one thing, and do it well." (TM)
+
+ I don't like the hackers to decide, making eTeX yet another programme from
+ which I can send e-mail and read news :-) Maybe people will tell me eTeX is
+ a fine operating system, but TeX version $\pi$ is the better typesetter :-)
+
+ But there is another side of \system, I want to call it the monstrosity
+ side. Many people are thinking now, that TeX is a monster and difficult to
+ tame. \system will add to this monstrosity. It will create a new paradise
+ for hackers creating system hacks. And it will make people turn away from
+ eTeX and use other products, even if they are far less secure. (JK)
+
+2.2.3 Syntax
+ If a \system command is required, should it not have a similar syntax
+ and semantics to the a similar TeX command. I can't think of anything
+ else in TeX (prepares to be shown wrong) that expands in the mouth and
+ has side-effects. Should it not be like \read, \write etc. that is it
+ generates a whatsit that is obeyed at shipout, unless preceded by an
+ \immediate, in which case it is done immediately by the stomach.
+ There seem to be two obvious syntaxes, one like \write:
+ \system{foo} or \immediate\system{foo}
+ and one like \read:
+ \system{foo} to \baz or \immediate\system{foo} to \baz
+ The latter one would produce the exit code into \baz. Should this be
+ done with catcode 12 characters, or should it be done like \read, with
+ the current catcodes?
+
+2.3. \skylineskiplimit, \skylinehorizontallimit
+ see section 1.1.1
+
+2.4. \directioncode (May 1993)
+ A \directioncode (with syntax analogous to \uccode, \lccode, sfcode) to be
+ assigned to each input character. The basic ones are
+ 0 -- transparent (space, full stop...)
+ 1 -- left-to-right (latin letters, digits...)
+ 2 -- right-to-left (hebrew letters, arab letters...),
+ a truly international NTS will also have codes for vertical typesetting
+ and some special cases.
+
+ The question is how to use this idea consistently. One could extend the
+ notion of TeX's modes. Horizontal mode is in fact left-to-right mode, a
+ right-to-left mode is missing. To be complete, this mode will be equipped
+ with boxen and all the stuff TeX's left-to-right (aka horizontal) mode has.
+
+ At the beginning of a paragraph NTS decides which mode to choose by the
+ \directioncode of the first input character. Sometimes the first character
+ will have the wrong code, in this case the insertion of an explicit
+ control sequence (like \lrbox{}) is necessary. If a character with another
+ directioncode occurs, NTS starts a \rlbox and finishes it as soon as a
+ character with the original \directioncode appears or at the end of the
+ paragraph.
+
+ For the building of right-to-left tables a \rlalign is needed.
+
+2.5. \textcode (Sep 93, Nov 93)
+ Some of the character coding discussions in the Technical Working
+ Group on Multiple Language Coordination and some experiences I've made
+ with `german.sty' (specially the problems with an active doublequote
+ and hex integer constants!) lead to this _incomplete_ proposal/idea
+ for the following addition:
+ Introduce something like
+ \textcode (and \textchar & \textchardef)
+ which are the text (hmode) equivalent of TeX's \mathcode (and
+ \mathchar/\mathchardef) primitives.
+
+ With an equivalent and appropriate implemented \textcode primitive
+ (with the choice to define a character as "pseudo-active"), it would
+ be possible to
+ * relate characters to different fonts
+ (using a generalized `fam' of \mathcode)
+
+ * suppress expansion of active characters (it will only be
+ expanded, if it is read to form the hlist)
+ (using an equivalent \mathcode="8000 value)
+ [This point allows the use of e.g. a pseudo-active "
+ which expands to non-expandable tokens and it removes
+ the special construct \relax\ifmmode... for active
+ characters, too.]
+
+2.6. \afterfi (August 1993)
+ In the answer to an exercise of the ``Around the Bend'' series, Michael Downes
+ realised the non-existence of an \afterfi primitive (Note: He did not
+ demand it nor really miss it). Perhaps an \afterfi can
+ simplify some obscure mouth-only macros with nested conditionals???
+ \afterfi should be expandable, because \if...\fi is expandable.
+
+2.7. \interactionmode (Nov 93, was: \currentinteractionmode)
+ Add a new count register \interactionmode, which reflects the user
+ interaction level with the following values:
+ <= 0 batch_mode
+ = 1 nonstop_mode
+ = 2 scroll_mode
+ >= 3 error_stop_mode
+
+ The commands \batchmode...\errorstopmode, the "options" 'Q', 'R', 'S'
+ in the interactive error routine and all other TeX internal
+ interaction level changes (e.g. after an interruption) access this new
+ register. The level changes in the interactive error routine and the
+ old commands should always work, even if the symbol \interactionmode is
+ redefined (this means that the user can redefine \interactionmode, but the
+ commands \batchmode...\errorstopmode still work).
+
+ Examples:
+
+ \ifnum\interactionmode<1 \AskUser \else \UseDefault \fi
+
+ {\interactionmode=0 % switch to \batchmode
+ \global\font\test=xyz10 % try to load font
+ }% % restore former interaction level
+ % ... now test if font has been loaded
+ % without error (i.e. != nullfont)
+
+2.8. \mathspacing (Nov 93)
+ Add a new count register array \mathspacing with 64 entries (we really
+ need only 64-8=56 entries, because some of them are never used, but to
+ simplify things 64 are used) with the following syntax:
+
+ \mathspacing <num1>=<num2> % 0 <= <num1> <= 63
+
+ The spacing specified in number <num2> is inserted between the two
+ math atom types specified in number <num1>. The two numbers are coded
+ as
+
+ <num1> = <left_atom_type> * 8 + <right_atom_type>
+ <num2> = ( (<display_spacing> * 256 + <text_spacing>) * 256
+ + <script_spacing> ) * 256 + <scriptscript_spacing>
+
+ This means that <num1> is easily expressed in octal and <num2> in
+ hexadecimal notation.
+
+ <..._atom_type> is one of the following seven types:
+
+ 0 ordinary 1 large operator
+ 2 binary operation 3 relation
+ 4 opening 5 closing
+ 6 punctuation 7 delimited subformula
+
+ <..._spacing> can be specified separately for each of the four math
+ styles (display, text, script and scriptscript) with the following
+ values:
+
+ 0 no space
+ 1 thin space (specified by \thinmuskip)
+ 2 medium space ( -- " -- \medmuskip)
+ 3 thick space ( -- " -- \thickmuskip)
+
+ 4-255 reserved for other things
+ (e.g. other spacings and/or additional penalties,
+ like \relpenalty, \binoppenalty, ...)
+
+ For more information see TeXbook, pp. 170f & Appendix G and TeX--The
+ Program, \S 764ff.
+
+ Examples: (using TeX's standard spacing)
+
+ Between an `ordinary' (= 0) and a `relation' (= 3) atom a thick
+ space (= 3) is inserted, but not in script or scriptscript style.
+
+ \mathspacing '03 = "0033
+
+ Between a large operator (= 1) and an ordinary (= 0) atom a thin
+ space (= 1) is inserted:
+
+ \mathspacing '10 = "1111
+
+ Necessary changes for the sketched proposal are very simple to
+ implement.
+ The syntax of \mathspacing is awful, but this is true for \mathcode,
+ \delimitercode, etc.etc., too.
+
+2.9. \inputescapechar (Nov 93, alternative names were proposed during
+ discussion)
+ Use two new internal count registers \inputescapechar and
+ \outputescapechar to specify the "escape" character to be used for
+ unprintable characters.
+ If \inputescapechar is not in [0..255], TeX's behaviour is used,
+ i.e., two equal characters with category 7 are used as a prefix for a
+ ~~x notated character, otherwise two characters with code
+ \inputescapechar are used for this prefix.
+ If \outputescapechar is not in [0..255], the character `~' is used
+ when an unprintable character has to be written.
+
+ The default values of these two registers are
+ \inputescapechar = -1
+ \outputescapechar = `~
+ to be compatible with TeX's standard behaviour.
+
+2.10. \middle (Jan 94)
+ Generalize the syntax of \left<delimiter> <formula> \right<delimiter>
+ to allow one or more optional \middle delimiters,
+ \left<delimiter> <formula> \middle<delimiter> <formula> \right<delimiter>.
+
+ The middle delimiter grows to the same height as the left and right ones.
+ Constructions of this kind are used throughout quantum mechanics (Dirac
+ notation), e.g.
+ $$
+ \left\langle A \middle% \hat{O} \middle% B \right\rangle
+ $$
+ By default, the \middle element is \mathrel, you can make it
+ \mathord by embracing it {\middle %}.
+
+
+2.11. \outputunit (Dec 93)
+ \outputunit unit to be used when e-TeX shows some dimen or glue
+ value
+ Usage: \outputunit=<unit of measure> (s. TeXbook p. 270)
+ Rationale:
+
+ Currently TeX forces the user to think in points when it outputs any
+ dimen or glue value (e.g. when issueing an overfull hbox warning).
+ But a program should adapt to the conventions of the user instead the
+ other way round. The addition of \outputunit whould make TeX much
+ more user-friendly, since only a few people are thinking in points.
+
+2.12. \protected (new prefix for macro definitions) (Nov 94)
+ Analogous to \long, \outer, etc., causes the associated macro to be
+ non-expanding in contexts where such behaviour is likely to be undesirable
+ (in particular in \writes and \edefs); an explicit \expandafter \empty
+ may be used to force expansion in these circumstances.
+
+2.13. \scantokens (Nov 94)
+ Allows an existing token-list to be re-input under a different catcode regime
+ from that under which it was created; as it uses all of TeX's present \input
+ mechanism, even %%ff notation will be interpreted as if \input. Causes an
+ `empty filename' to be input, resulting in `( )' appearing in the log file
+ if \tracingscantokens (q.v.) is strictly greater than zero. If the token
+ list represents more than one line of input, and if an error occurs, then
+ \inputlinenumber will reflect the logical input line from the token list
+ rather than the current input line number from the current file.
+
+2.14. \deferred (Nov 94)
+ At the moment, only \writes are deferred; there are cases when it would
+ be desirable for other things, too, to be expanded only during \shipout,
+ and \specials are one of these. (See also 2.2.3)
+
+2.15. \everyeof {<balanced text>}
+ Provides a hook whereby the contents of a token list register may be
+ inserted into TeX's reading orifice when end-of-file is encountered
+ during file reading. Would not be invoked of the file indicated
+ logical e-o-f through the medium of \endinput. Proposed by Phil
+ to allow clean processing of file-handling code which requires
+ a (sequence of characters yielding) \else or fi to be found in a
+ file, where no such sequence can be guaranteed.
+
+2.16. \readline <integer> to <cs> (Nov 94)
+ Allows a single line to be read from an input file as if each character
+ therein had catcode 12. Intended to be used for verbatim copying
+ operations, in conjunction with \scantokens, or to allow error-free parsing
+ of `foreign' (non-TeX) files.
+
+2.17. \evaluate {<arithmetic expression>} (Nov 94)
+ Intended for use on the r-h-s of \count, \dimen and \skip assignments,
+ it would allow the use of infix arithmetic operators such as +, -, * and /;
+ the type of the result would, in general, be the type of the simplest operand
+ forming a part of the expression, and the normal semantics of TeX would allow
+ this to be further coerced where necessary. Parenthesised sub-expressions
+ would be allowed.
+
+ Additional operations were proposed: trigonometric functions, square
+ root, pythagorean addition (METAFONT's `++'), angle{<delta_x, delta_y>}.
+
+2.18. \ifevaluate{<boolean expression>}....\else....\fi (Nov 94)
+ The boolean expression should allow for the usual operators like
+ .not., .and., .or., .xor., =, >, <, <=, etc., if feasable it should also
+ allow the evaluation of arithmetic expressions. Some functions are needed
+ to get information old TeX \if's know now, I propose the name
+ \query<whatever> to these functions.
+
+ At the moment I see need for the following \query<whatever> functions:
+ \queryeof returns `1' if eof, `0' else
+ \querymode returns `0' in the infamous `no mode' (do we need to
+ differentiate finer here?
+ `1' in vertical mode
+ `2' in restricted vertical mode
+ `3' in horizontal mode
+ `4' in restricted horizontal mode
+ `5' in math mode
+ `6' in restricted math mode
+ With \querymode \ifmmode, \ifhmode, \ifvmode, and \ifinner can be emulated.
+ \querydefined{\cs} `1' if defined, `0' else
+ \querycsname...\endcsname (ditto)
+
+2.19. \everyeof {<balanced text>}
+ Provides a hook whereby the contents of a token list register may be
+ inserted into TeX's reading orifice when end-of-file is encountered
+ during file reading. Would not be invoked of the file indicated
+ logical e-o-f through the medium of \endinput. Proposed by Phil
+ to allow clean processing of file-handling code which requires
+ a (sequence of characters yielding) \else or fi to be found in a
+ file, where no such sequence can be guaranteed.
+
+2.20. \fancyprompt
+ allow configuration of the TeX prompt (default `*'), e.g.
+ *\fancyprompt{eTeX>}
+ eTeX>
+
+3. Metaremarks
+
+3.0. General
+ Remarks about group efforts vs. one person creating software (Mar 93),
+ ALGOL 68 as a warning example
+
+3.1. TeX is not perfect (Jun 92, Jul 92)
+ The discussion has taken place in June and July 1992. Several details were
+ worked out, where TeX could be improved. Another point of criticism was
+ the programming language of TeX in general, several participants prefer a
+ procedural language over a macro language.
+
+3.2. In which language shall NTS be written (Mar 93)
+ In 1992, there was much discussion, in which language an NTS should be
+ implemented (candidates were LISP, C, and WEB). This has settled in March
+ 1993 (to PASCAL-WEB), because of the acceptance of the
+ idea that rather than wait for an ``all-singing, all dancing'' NTS, the
+ group should develop, in a stepwise manner, small but significant
+ enhancements to TeX. This implies that the enhancements are implemented as
+ change files in WEB.
+
+3.3. The TeX language (Oct/Nov 93)
+ The TeX language is a simple language in the sense, that it contains only
+ few concepts. It belongs to the Lisp family. In particular, it's a
+ list-based macro language with late binding. Actually, that's all one
+ needs to say to characterize it.
+ Its data constructs are simpler than in Common Lisp: `token list' is the
+ only first order type. Glue, boxes, numbers, etc., are engine
+ concepts; instances of them are described by token lists.
+ Its lexical analzsis is simpler than CL: One cannot program
+ it. One can only configure it.
+ Its control constructs are simpler than in CL: Only macros, no
+ functions. And the macros are only simple ones, one can't compute
+ in them.
+
+3.4. The TeX engine (Oct/Nov 93)
+ The TeX engine lies below the TeX language. Glue, boxes, numbers, etc.
+ belong to the TeX engine. The registers of the engine can be changed
+ by TeX's primitives. However, the latter seem to be quite unregular and
+ baroque.
+
+3.5. Extensions and Enhancements (Nov 94)
+ `Extensions' are basically new primitives which have no effect on the
+ semantics of existing TeX documents, except insofaras any document which
+ tests whether such a primitive is, in fact, undefined, will clearly obtain
+ opposite results under TeX and e-TeX; `enhancements' are more fundamental
+ changes to the TeX kernel which may affect the semantics of existing TeX
+ documents even if no new primitive is used or even tested. Such changes
+ may be, for example, differences in the construction of TeX's internal
+ lists, or perhaps different hyphenation or ligaturing behaviour.
+
+4. Deviations
+
+4.0. General
+ (empty)
+
+4.1. Automated Kerning (Oct 92)
+ Kindersley's "optical kerning": for the purposes of
+ kerning, each character is replaced by a circle centred on the centre of
+ gravity of that character; the radius of the circle is determined by the
+ fourth moment of the character (that is, the fourth root of the sum over
+ all black pixels of the fourth power of their distance from the centre). On
+ the UKTUG trip to Kindersley's studio, I tried to extract the reason why
+ the fourth, as opposed to third or fifth or whatever, moment is used; the
+ reason is apparently that it "looks right".
+
+ We can construct elaborate schemes for kerning (Kindersley's fourth
+ moments, FontStudio's (convex?) envelopes, Calamus' eight widths, etc), but
+ the proof of the typographical pudding is in the eating of the resulting
+ words, so to speak.
+
+4.2 About Lout (June 1993)
+ In June 1993, the new system Basser Lout caused several questions and
+ suggestions on this list. The following is taken from a short review
+ of Lout by Bernd Raichle:
+
+ `Lout' is a (yet another) document formatting system, released under
+ the terms of the GNU General Public License and available on some ftp
+ servers.
+
+ IMHO it's more like a `troff' (with a better input language and some
+ newer concepts) than a `TeX'.
+
+ A few citations from the documentation of lout:
+
+ Lout is a high-level language for document formatting, designed and
+ implemented by the author. The implementation, known as Basser
+ Lout, is a fully operational production version written in C for the
+ Unix operating system, which translates Lout source code into
+ PostScript, a device-independent graphics rendering language
+ accepted by many high-resolution output devices, including most
+ laser printers.
+ [...]
+ When expert users can implement such applications quickly,
+ non-experts benefit. Although Lout itself provides only a small
+ kernel of carefully chosen primitives,
+
+ Lout has 23 primitive operators... missing, for example, the simplest
+ arithmetical operators (there is only the operator "@Next" which
+ increases a number by one).
+
+ packages written in Lout and distributed with Basser Lout provide an
+ unprecedented array of advanced features in a form accessible to
+ non-expert users. The features include rotation and scaling, fonts,
+
+ These features are mostly based on the output language... Postscript
+ (if you are looking inside a Lout package, you find large portions of
+ embedded Postscript code).
+
+ paragraph and page breaking,
+
+ TeX does a better job for these two items, because Lout is missing
+ most of TeX's paragraph/page breaking parameters. (Note: Lout uses
+ TeX's hyphenation algorithm and the hyphenation patterns.)
+
+ displays and lists, floating figures and tables, footnotes, chapters
+ and sections (automatically numbered), running page headers and
+ footers, odd-even page layouts, automatically generated tables of
+ contents, sorted indexes and reference lists, bibliographic and
+ other databases (including databases of formats for printing
+ references), equations, tables, diagrams, formatting of Pascal
+ programs, and automatically maintained cross references.
+
+ TeX's math setting abilities are better. Lout uses a package named
+ `eq' derived from the `eqn' preprocessor used with `troff'. And there
+ are other packages named `tab' (for tabulars) and `fig' (drawing
+ figures).
+
+ [...]
+ Lout is organized around four key concepts -- objects, definitions,
+ galleys, and cross references -- [...]
+
+ The concept of `galleys' and the "expansion" of recursive defintions
+ are IMHO the only new concept in Lout:
+
+ `galleys' are a way to describe a page, dividing it in certain regions
+ which can be filled from different sources (e.g. a footnote galley is
+ filled with footnote text, etc.).
+
+ Recursive definitions are very simple, e.g.
+ def @Leaders { .. @Leaders }
+ defines the command (Lout calls it `object') to "expand" to a `..' and
+ if there is place for another "expansion" it is called again.
+
+ For example
+ \hbox to 4in{Chapter 7 \dotfill 53}
+ is in Lout
+ 4i @Wide { Chapter 7 @Leaders 53 }
+
+ With this recursive definitions, a whole document is defined as a
+ @PageList consisting of a @Page and a @PageList with an incremented
+ @PageNum. A @Page is defined as a set of `galleys' (header, text
+ body, footnotes, footer), which are also defined as a list of
+ text/footnotes/... and so on.
+
+ Perhaps others can add more impressions, mine are based on the
+ documentation coming with the Lout package and some tests done in
+ 1-2 hours.
+
+5. Proposed changes to METAFONT
+
+5.O. General
+ Most of the General points in the discussion of TeX also apply to METAFONT.
+
+5.1. Writing to auxiliary files
+ METAFONT should be able to write to auxiliary files. Desparately needed
+ for packages which allow to draw figures in METAFONT and label them in TeX
+ (BoF session at EuroTeX '92, Prague).
+
+
+6. Proposed changes to the tfm file format
+
+6.1. Vertical kerning (Jun 92)
+ This may sound exotic to you, but the AFM format can do
+ it. And I desperately need it for non-Latin alphabets (everytime I need
+ a character in a ligature raised or lowered, I have to reserve a position
+ in the font for it).
+
+6.2. Cross-font ligatures (Jun 92)
+ Ligatures pointing to other fonts!! Yes, imagine for example that your
+ 256 chars are full, you could still access characters by ligatures...but
+ they have to be in the same font.
+
+7. Proposed changes to the dvi file format
+
+7.0. General
+ A longer discussion about colour inclusion into the dvi-file occured in
+ Oct/Nov 93. The outcome was, that high-quality colour handling is a difficult
+ and device dependent task, better left to the printer driver. Colour can be
+ handled by the \special command which is sent directly to the driver.
+
+ On comp.text.tex I saw a remark, that specials may occur on places in the
+ dvi-file, where TeX can't put them. Maybe eTeX should take care of this
+ point.
+
+7.1. Horizontal and Vertical Mirroring (Nov 94)
+ Allow a glyph to be mirrored in a vertical axis, placed centrally;
+ mirrored in a horizontal axis, placed at half the x(?)-height.
+
+ It was noted, that the specification of the axes might cause problems.
+ It was also noted, that several drivers understand specials for the
+ requested action.
+
+7.2. Rotation of a glphy by 180 degrees (Nov 94)
+ This would greatly increase the power of vpl files (e.g. define schwa by
+ rotating e), and I hope that it would be possible for drivers to implement.
+
+ It was noted, that this is fine, but rotation by 90 degrees cannot be
+ device independent, because there are printers with rectangular (non-square)
+ pixels.
+
+8. Additions to the TeX kit
+
+8.0. General
+ The TeX kit, meaning the bundle of programmes building up a complete TeX
+ installation, contains besides the major programmes TeX and METAFONT
+ additional programmes, traditionally divided into several groups:
+
+ a) TeXware: dvitype, tftopl, pltotf, pooltype, pktype, patgen, vftovp,
+ vptovf, (outdated: pxtopk, pktopx)
+ b) MFware: mft, gftodvi, gftopk, gftype, (outdated: gftopxl)
+ c) webware: weave, tangle
+
+ And, of course, drivers for the screens and printers.
+
+ Other utility programmes more loosely associated with TeX are indexers
+ (makeindex, idxtex, glotex, ...) and bibliography tools (bibtex,
+ bibclean, ...). Makeindex and Bibtex are standard tools, because they
+ are described in the LaTeX manuals.
+
+ Another group includes drawing programmes (TeXCAD, xfig, gnuplot, ...) to
+ create graphics to be imported to TeX documents and graphics converters
+ (ghostscript, xv, bmt2font, ...).
+
+8.1. dvicopy
+ Written in WEB by Peter Breitenlohner
+ Available from CTAN
+ Resolves all references to virtual fonts in a dvi file. Can be used to
+ create a dvi file without virtual fonts (e.g. for drivers which cannot
+ handle vf's).
+
+8.2. dv2dp and dp2dv
+ Written in C by Geoffrey Tobin
+ Available on request from the author
+ dv2dp makes a human readable file from a dvi file. The companion
+ programme dp2dv makes a dvi file frome a dvi property list file.
+ It allows you to change dvi files with a text editor.
+
+8.3. gftotxt
+ Written in C by Yannis Haralambous
+ Available ?
+ Extracts a certain kind of specials from the gf file into a text file.
+ Workaround for the famous non-ability of METAFONT to write auxiliary
+ files.
+
+8.4. qdtexvpl
+ Written by Eberhard Mattes
+ Available from the CTAN archives
+ Generates a virtual font from TeX macros. qd = quick and dirty.
+
+8.5. fontinst
+ Written in TeX by Alan Jeffrey
+ Available form CTAN
+ Makes virtual fonts from afm files (PostScript fonts). Used by the LaTeX
+ team to create virtual fonts and fd files for LaTeX2e.
+
+8.6. afmtotfm
+ Written in C by Thomas Rokicki
+ Available from CTAN (part of dvips distribution)
+ Makes tfm files from afm files.
+
+8.7. dvipaste
+ Part of LAMSTeX (Michael Spivak)
+ Allows to paste a dvi-file into another one.
+
+8.8. METAPOST
+ Written in Web by John Hobby
+ Now freely available from the CTAN
+ A tool to build graphics to be included in TeX documents, uses a METAFONT
+ style language.
+
+8.9. Tie
+ Written by Klaus Gunthermann
+ Available from CTAN
+ Allows to process multiple change files to a given Web source. A tool
+ of this kind is needed to build any eTeX distribution, since one has
+ tex.web, etex.ch, tex.ch-system, and etex.ch-system files to deal with.
+
+8.10. dvi2dvi
+ Available from CTAN
+ Postprocessor for dvi files, allowing e.g. 2-up or 4-up layout of full
+ pages.
+
+9. Existing extensions to TeX
+
+9.0 General
+ Here I include short description of existing extensions to TeX. This section
+ does not include commercial TeX implementations because of lack of solid
+ enough information on them. It also does not yet include ETeX, NTS, nor
+ Omega.
+
+9.1. TeX-XeT (Don Knuth and Pierre MacKay)
+ CTAN: tex-archive/systems/knuth
+ Adds new primitives \beginR, \endR, \beginL, and \endL for right to left
+ typesetting. Despite their names, the new primitives are insensitive to
+ TeX's grouping mechanism. Outputs a special file in dvi-ivd format, which
+ need be resolved by another programme or requires special drivers.
+
+9.2. TeX--XeT (Peter Breitenlohner)
+ Available from CTAN tex-archive/systems/knuth/tex--xet
+ Implements the same primitives as TeX-XeT, but outputs a normal dvi file.
+ Passes the trip test (as far as I know).
+
+9.3. MLTeX (Michael Ferguson)
+ Available from aldebaran.ee.mcgill.ca in pub/mltex
+ Adds a primitive \charsubdef, which allows the following: input of 8-bit
+ characters, participation of accented characters not present in the output
+ encoding in hyphenation, ligatures and kerning with accented letters.
+ Especially popular in francophone countries.
+ emTeX supports MLTeX via the /ml option.
+
+9.4. SiSiSi (Wilhelm Barth, Heinrich Nirschl, Heini Hofstaedter und Harald
+ Mueller)
+ Available from CTAN: tex-archive/systems/vms (sic!)
+ Implements another hyphenation algorithm (the name means SIchere
+ SInnentsprechende SIlbentrennung, which is translated `secure sensitive
+ hyphenation') specific to the german language (with Haupt- und
+ Nebentrennstellen). Fails the trip test, therefore not a legitimate TeX.
+ In use at TU Wien (Austria).
+
+9.5. Japanese TeX
+ [in preparation]
+
+The End.
diff --git a/systems/doc/etex/etex_gen.tex b/systems/doc/etex/etex_gen.tex
new file mode 100644
index 0000000000..c9dd037c4e
--- /dev/null
+++ b/systems/doc/etex/etex_gen.tex
@@ -0,0 +1,286 @@
+% etex_gen.tex --- How to generate e-TeX --- last modified 06 Mar 1998
+
+\font\eighttt= cmtt8
+\font\eightrm= cmr8
+\font\rtitlefont= cmr7 scaled\magstep5
+\font\ititlefont= cmmi7 scaled\magstep5
+\def\titlefont{\rtitlefont \textfont1=\ititlefont}
+\def\eTeX{$\varepsilon$-\TeX}
+\def\NTS{NTS}
+\let\mc=\eightrm
+\rm
+\let\mainfont=\tenrm
+
+\def\.#1{\hbox{\tt#1}}
+\def\\#1{\hbox{\it#1\/\hskip.05em}} % italic type for identifiers
+
+\parskip 2pt plus 1pt
+\baselineskip 12pt plus .25pt
+
+\output{\shipout\box255\global\advance\pageno by 1} % for the title page only
+\null
+\vfill
+\centerline{\titlefont How to generate \eTeX}
+\vskip 6pt
+\centerline{({\sl Version 2, March 1998\/})}
+\vskip 18pt
+\centerline{by The \NTS\ Team}
+\vskip 6pt
+\centerline{Peter Breitenlohner, Max-Planck-Institut f\"ur Physik, M\"unchen}
+\vskip 6pt
+\centerline{Philip Taylor, RHBNC, University of London}
+\vfill
+\centerline{\vbox{\hsize 4in
+\noindent Given an implementation of \TeX82 for a particular system, this
+report describes how to generate a corresponding implementation of
+\eTeX.}}
+\vskip 24pt
+{\baselineskip 9pt
+\eightrm\noindent
+The preparation of this report was supported in part by DANTE,
+Deutschsprachige Anwendervereinigung \TeX\ e.V.\hfil\break
+`\TeX' is a trademark of the American Mathematical Society.
+
+}\pageno=0\eject
+
+\output{\shipout\vbox{ % for subsequent pages
+ \baselineskip0pt\lineskip0pt
+ \hbox to\hsize{\strut
+ \ifodd\pageno \hfil\eightrm\firstmark\hfil
+ \mainfont\the\pageno
+ \else\mainfont\the\pageno\hfil
+ \eightrm\firstmark\hfil\fi}
+ \vskip 10pt
+ \box255}
+ \global\advance\pageno by 1}
+\let\runninghead=\mark
+\outer\def\section#1.{\noindent{\bf#1.}\quad
+ \runninghead{\uppercase{#1} }\ignorespaces}
+
+\section Introduction.
+Let us first review the process of generating an implementation of
+\TeX82 for a particular system from the source files as, e.g., described
+in the \.{WEB} manual [1]. The system-independent source file
+\.{tex.web} must remain unmodified. All changes to \.{tex.web}
+necessary for a particular operating system and\slash or compiler are to
+be collected in a system-dependent change file, typically named
+\.{tex.ch}. Both files \.{tex.web} and \.{tex.ch} are effectively
+merged when input by the \.{WEB} system programs \.{WEAVE} and
+\.{TANGLE}. When \.{WEAVE} processes this merged input, a file
+\.{tex.tex} is produced. Further processing by \TeX\ yields a `pretty
+printed' version of the input together with an index.
+
+When \.{TANGLE} processes the merged input, a string pool file
+\.{tex.pool} and a Pascal file \.{tex.pas} (or similar) are produced.
+The Pascal file can then be further processed by a suitable compiler
+and\slash or language converter such as \.{web2c}, and eventually yields
+an executable program.
+
+There are actually three versions of the program: First there is
+\.{INITEX} with its capability to initialize all of \TeX's tables and to
+write them in compact form to a format file. Next there is the
+production version \.{VIRTEX} requiring a format file as input. Finally
+there is \.{TRIPTEX}, a version of \.{INITEX} with special values for
+some of \TeX's parameters, for the \.{TRIP} test [2] that should be used
+to validate a \TeX\ implementation. Depending on the capabilities of
+the compiler, these three versions of the program are generated from
+three slightly different change files or they are generated from one
+change file with different compiler options. They might even be one and
+the same executable program used with different run time options.
+
+\vskip 24pt plus 24pt
+\section Generating \eTeX.
+The process of generating \eTeX\ is essentially the same as that of
+generating \TeX\ as described above. Conceptually there is a
+system-independent source file \.{etex.web} and a system-dependent change
+file \.{etex.sys}. Processing these two files by \.{TANGLE} yields a
+string pool file \.{etex.pool} as well as a Pascal file \.{etex.pas},
+whilst processing by \.{WEAVE} produces a \TeX\ source file, \.{etex.tex}.
+
+It may, however, be necessary to increase some of the constants defined
+in \.{TANGLE} and \.{WEAVE}. The following values should suffice in
+most cases:
+$$
+\vcenter{\halign{$#$\hfil\qquad&#\hfil\cr
+\\{max\_bytes}\times\\{ww}=100~000&\.{TANGLE} and \.{WEAVE}\cr
+\\{max\_texts}=2~500&\.{TANGLE} and \.{WEAVE}\cr
+\\{max\_toks}\times\\{zz}=180~000&\.{TANGLE}\cr
+\\{max\_names}=5~000&\.{TANGLE}\cr
+\\{max\_scraps}=3~000&\.{WEAVE}\cr
+\\{stack\_size}=300&\.{WEAVE}\cr
+}}
+$$
+
+The source file \.{etex.web} for \eTeX\ does not, however, exist as a
+physical file. It is the hypothetical file obtained by applying the
+changes in the actual source file \.{etex.ch} to \.{tex.web}. Thus
+\.{etex.web} inherits the bulk of code from \.{tex.web}, whilst the
+system-independent source file \.{etex.ch} for \eTeX\ defines the
+differences between \.{etex.web} and \.{tex.web}. In order to generate
+an implementation of \eTeX\ two change files have to be applied to
+\.{tex.web}, one after the other (the actual file names may differ):
+$$
+\vcenter{\halign{#\hfil&\qquad\.{#}\hfil&\qquad#\hfil\cr
+0.&tex.web&system-independent \.{WEB} source for \TeX\cr
+1.&etex.ch&system-independent changes for \eTeX\cr
+2.&etex.sys&system-dependent changes for \eTeX\cr
+}}
+$$
+
+The process of merging several change files into \.{tex.web} should
+certainly not be performed by hand. There are programs such as \.{TIE}
+and \.{PATCHWEB} that perform this process automatically. If no such
+program is available, a \TeX\ program \.{WEBMERGE} can be used.
+\.{WEBMERGE} reads \.{tex.web} and up to nine change files and produces
+a merged change file that can then be processed, together with
+\.{tex.web}, by \.{TANGLE} and \.{WEAVE}. [On systems such as VMS, use
+of \.{WEBMERGE} can leave a large number of temporary files
+lying around; this can be avoided by setting a version limit (e.g.~1) on any
+existing versions of those files, or by setting a version limit on the
+directory in which they will be created. On other systems, it will probably
+leave one large temporary file.]
+
+Every implementor of \eTeX\ is responsible for creating and maintaining
+a suitable \.{etex.sys} in the same way as every implementor of \TeX\
+is responsible for creating and maintaining \.{tex.ch}. Since the bulk
+of code in \.{etex.web} is identical to that in \.{tex.web} the bulk of
+the system-dependent changes in \.{etex.sys} for a particular system
+will be identical to those in \.{tex.ch} for the same system. In the
+following we try to give some hints where \.{etex.sys} for a particular
+system might deviate from the corresponding \.{tex.ch}.
+
+First, it might be necessary to increase the size of \TeX's string pool
+in order to accommodate \eTeX's additional strings (message texts as
+well as multi-letter control sequences). If this turns out to be
+necessary for \eTeX\ it would certainly not be harmful to do it for
+\TeX\ as well. \TeX\ and \eTeX\ use three constants related to the
+string pool: \\{max\_strings} the maximal number of strings,
+\\{pool\_size} the maximal number of string characters, and
+\\{string\_vacancies} the minimal number of available string characters
+in addition to those occupied by strings from the pool file. It is,
+therefore, sufficient to increase \\{pool\_size} (or reduce
+\\{string\_vacancies}) by the number of \eTeX's additional string
+characters and to increase \\{max\_strings} by the number of \eTeX's
+additional strings. The latter will, however, be unnecessary for most
+implementations as \\{max\_strings} is usually increased substantially
+beyond its standard value in order to accommodate large \TeX\ macro
+packages.
+
+For Version~2 of \eTeX, there are about 100 additional strings with
+about 1500 additional string characters. The precise numbers can be
+obtained by running \.{POOLTYPE} on \TeX's and \eTeX's pool files
+(\.{POOLTYPE} reports the total number of strings and string characters
+in a pool file).
+
+Next, \.{etex.sys} may contain a system-dependent modification of the
+\\{eTeX\_banner} string. The modified \\{eTeX\_banner} string must
+contain `\.{e-TeX}' as well as the \eTeX\ version number. Note,
+however, that the \\{banner} string modified by \.{tex.ch} will not be
+referenced by \eTeX\ unless the implementor intentionally changes that
+aspect of \eTeX's functionality: therefore \.{etex.sys} can modify the
+\\{banner} string in the same way as does \.{tex.ch}.
+
+Then, \.{etex.sys} might deviate from \.{tex.ch} in order to use a
+different pool file name and\slash or format file extension (see below).
+
+Finally, \.{etex.sys} will necessarily deviate whenever \.{etex.ch}
+and \.{tex.ch} try to change the same piece of \.{WEB} code or when the
+system-independent \eTeX\ changes from \.{etex.ch} and the
+system-dependent \TeX\ changes from \.{tex.ch} interfere in some other way.
+In case of any such interference implementors must first of all determine
+how to combine the respective changes from \.{etex.ch} and \.{tex.ch}
+in order to obtain \eTeX's functionality for a particular system.
+Obviously, this process cannot be automated since it requires human
+insight.
+
+The \NTS\ team has tried to formulate \.{etex.ch} such that
+interferences with system-dependent change files \.{tex.ch} are
+unlikely. Suggestions by implementors how any remaining such
+interferences could be avoided by a reformulation of \.{etex.ch} will
+be taken into serious consideration. Such interferences can be further
+reduced by reformulating the system-dependent change file \.{tex.ch} for
+\TeX, e.g.\ by reducing the range of change entries from entire modules
+to the pieces of code that are actually changed.
+
+Implementors might prefer to maintain the system-dependent change file
+\.{etex.sys} not as a physical file but as a hypothetical file defined
+through its deviation from \.{tex.ch}. If there are no interferences of
+the kind mentioned above, then the effect of applying the changes from
+the hypothetical \.{etex.sys} to the hypothetical \.{etex.web} can be
+achieved by applying 3 change files, one after the other, to \.{tex.web}
+(using some tool such as \.{TIE}, \.{PATCHWEB}, or \.{WEBMERGE}):
+$$
+\vcenter{\halign{#\hfil&\qquad\.{#}\hfil&\qquad#\hfil\cr
+0.&tex.web&system-independent \.{WEB} source for \TeX\cr
+1.&etex.ch&system-independent changes for \eTeX\cr
+2.&tex.ch&system-dependent changes for \TeX\cr
+3.&tex.ech&additional system-dependent changes for \eTeX\cr
+}}
+$$
+The third change file \.{tex.ech} will be rather short and contains just
+the differences between \.{etex.sys} and \.{tex.ch}. It is recommended
+that implementors try to remove all interferences between \.{etex.ch}
+and \.{tex.ch} and use this method to generate \eTeX.
+
+As with \TeX\ there are three versions of \eTeX: \.{e-INITEX},
+\.{e-VIRTEX}, and \.{e-TRIPTEX}. Depending on the implementation they
+will again be generated from the three slightly different versions of
+\.{tex.ch} or with different compiler options or they may be one and the
+same program used with different run time options.
+
+\vskip 24pt plus 24pt
+\section \eTeX\ modes.
+In order to ensure maximal compatibility with \TeX, \eTeX\ can run in
+either compatibility mode or extended mode. The possibility of this
+choice is, of course, an extended feature of \eTeX. Once \eTeX\ has
+chosen compatibility mode it is, however, a legitimate implementation of
+\TeX\ (assuming the \TeX\ implementation itself is legitimate). The
+only differences between \eTeX\ in compatibility mode and \TeX\ are
+those allowed by D.~E.~Knuth [2] between different implementations of
+\TeX.
+
+An \.{e-TRIP} test suite [3] defines the criteria by which a program can
+qualify to use the name `\eTeX'. Part of the \.{e-TRIP} test consists
+of the standard \.{TRIP} test for \.{e-TRIPTEX} in compatibility and
+extended mode.
+
+\eTeX\ can therefore be used instead of \TeX\ without the necessity to
+maintain both programs. For the case that both programs should
+nevertheless co-exist on a system, it might be a good idea to name the
+pool file for \eTeX\ \.{etex.pool} instead of \.{tex.pool} and to use
+an extension other than \.{.fmt}, e.g., \.{.efmt} for \eTeX\ format
+files. (Format files for \TeX\ and \eTeX\ are incompatible). All this
+will require additional changes in the file \.{tex.ech}.
+
+When \.{INITEX} or \.{VIRTEX} start, they inspect the first non-blank
+character from the command line or in response to the \.{**} prompt.
+This may be an \.{\&} immediately followed by the name of a format file
+to be loaded. Otherwise \.{VIRTEX} loads a default format, whereas
+\.{INITEX} starts without loading a format.
+
+When \.{e-INITEX} or \.{e-VIRTEX} start, they inspect the first
+non-blank character from the command line or in response to the \.{**}
+prompt. This may again be an \.{\&} immediately followed by the name of
+a format file to be loaded; otherwise \.{e-VIRTEX} loads a default
+format. For \.{e-INITEX} the first non-blank character may be an \.{*}
+immediately followed by what would normally be the input for \.{INITEX}
+(without intervening blanks). \.{e-INITEX} enters extended mode in
+response to the \.{*}, or compatibility mode otherwise. This mode is
+recorded in format files produced by \.{e-INITEX} and entered again when
+such a format is loaded (by either \.{e-INITEX} or \.{e-VIRTEX}).
+
+\vskip 24pt plus 24pt
+\section References.
+\item {[1]}
+{\sl The \.{WEB} system of structured documentation\/},
+by Donald E.~Knuth,\hfil\break Stanford Computer Science Report~980.
+
+\item {[2]}
+{\sl A torture test for \TeX\/},
+by Donald E.~Knuth, Stanford Computer Science Report~1027.
+
+\item {[3]}
+{\sl A torture test for \eTeX\/},
+by The \NTS\ Team (Peter Breitenlohner and Bernd Raichle).
+
+\end
diff --git a/systems/doc/etex/etex_man.pdf b/systems/doc/etex/etex_man.pdf
new file mode 100644
index 0000000000..24e89cd84f
--- /dev/null
+++ b/systems/doc/etex/etex_man.pdf
@@ -0,0 +1,3135 @@
+%PDF-1.3
+7 0 obj
+<<
+/Type /Encoding
+/BaseEncoding /WinAnsiEncoding
+/Differences [0 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+/cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash /suppress 34 /quotedblright
+39 /quoteright 60 /exclamdown 62 /questiondown 92 /quotedblleft 94 /circumflex /dotaccent
+/quoteleft 123 /endash /emdash /hungarumlaut /tilde /dieresis /Gamma /Delta /Theta
+/Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega /ff /fi /fl /ffi /ffl /dotlessi
+/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe
+/oslash /AE /OE /Oslash /suppress /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon
+/Phi /Psi /.notdef /.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave
+/acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /dieresis /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dieresis]
+>>
+endobj
+9 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 686.11
+/Ascent 750
+/Descent -250
+/FontBBox [-116 -350 1278 850]
+/FontName /PDPDTY+CMBX12
+/ItalicAngle 0
+/XHeight 444.4
+/StemV 80
+/FontFile 8 0 R
+/Flags 4
+>>
+endobj
+10 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F1
+/FontDescriptor 9 0 R
+/BaseFont /PDPDTY+CMBX12
+/FirstChar 33
+/LastChar 255
+/Widths [342.59 581.02 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375
+312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5
+342.59 875 531.25 531.25 875 849.54 799.77 812.5 862.27 738.43 707.18 884.26 879.63
+418.98 581.02 880.79 675.93 1067.13 879.63 844.91 768.52 844.91 839.12 625 782.41
+864.58 849.54 1162.04 849.54 849.54 687.5 312.5 581.02 312.5 562.5 312.5 312.5 546.88
+625 500 625 513.31 343.75 562.5 625 312.5 343.75 593.75 312.5 937.5 625 562.5 625
+593.75 459.49 443.75 437.5 625 593.75 812.5 593.75 593.75 500 562.5 1125 562.5 562.5
+0 675.93 937.5 875 787.04 750 879.63 812.5 875 812.5 875 812.5 656.25 625 625 937.5
+937.5 312.5 343.75 562.5 562.5 562.5 562.5 562.5 849.54 500 574.07 812.5 875 562.5
+1018.52 1143.52 875 312.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 562.5]
+>>
+endobj
+12 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-98 -350 1077 850]
+/FontName /EUBLUU+CMMI12
+/ItalicAngle -14
+/XHeight 430.6
+/StemV 80
+/FontFile 11 0 R
+/Flags 68
+>>
+endobj
+13 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F2
+/FontDescriptor 12 0 R
+/BaseFont /EUBLUU+CMMI12
+/FirstChar 33
+/LastChar 255
+/Widths [609.72 458.21 577.08 808.91 505.03 354.16 641.43 979.16 979.16 979.16 979.16
+271.99 271.99 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58 489.58
+489.58 489.58 271.99 271.99 761.57 489.58 761.57 489.58 516.89 734.02 743.86 700.54
+812.98 724.82 633.85 772.35 811.28 431.86 541.2 833.04 666.2 947.27 784.08 748.3
+631.13 775.5 745.29 602.19 573.89 665.01 570.83 924.41 812.64 568.11 670.19 380.78
+380.78 380.78 979.16 979.16 410.88 514 416.31 421.41 508.79 453.82 482.64 468.86
+563.65 334.03 405.09 509.25 291.66 856.47 584.48 470.71 491.43 434.14 441.26 461.22
+353.58 557.29 473.37 699.93 556.42 477.43 454.86 312.5 377.89 623.37 489.58 0 606.65
+815.96 748.3 679.62 728.67 811.28 765.79 571.17 652.77 598.03 757.63 622.79 552.77
+507.89 433.67 395.37 427.66 483.1 456.3 346.06 563.65 571.17 589.12 483.79 427.66
+555.44 505.03 556.53 425.23 527.77 579.51 613.42 636.57 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 271.99]
+>>
+endobj
+15 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-103 -350 1131 850]
+/FontName /UQUAON+CMSL10
+/ItalicAngle -9.5
+/XHeight 430.6
+/StemV 80
+/FontFile 14 0 R
+/Flags 68
+>>
+endobj
+16 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F3
+/FontDescriptor 15 0 R
+/BaseFont /UQUAON+CMSL10
+/FirstChar 33
+/LastChar 255
+/Widths [277.78 500 833.34 500 833.34 777.78 277.78 388.89 388.89 500 777.78 277.78
+333.33 277.78 500 500 500 500 500 500 500 500 500 500 500 277.78 277.78 277.78 777.78
+472.22 472.22 777.78 750 708.34 722.22 763.89 680.56 652.78 784.72 750 361.11 513.89
+777.78 625 916.67 750 777.78 680.56 777.78 736.11 555.56 722.22 750 750 1027.78 750
+750 611.11 277.78 500 277.78 500 277.78 277.78 500 555.56 444.45 555.56 444.45 305.56
+500 555.56 277.78 305.56 527.78 277.78 833.34 555.56 500 555.56 527.78 391.67 394.45
+388.89 555.56 527.78 722.22 527.78 527.78 444.45 500 1000 500 500 0 625 833.34 777.78
+694.45 666.67 750 722.22 777.78 722.22 777.78 722.22 583.34 555.56 555.56 833.34
+833.34 277.78 305.56 500 500 500 500 500 808.65 444.45 500 722.22 777.78 500 902.78
+1013.89 777.78 277.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500]
+>>
+endobj
+18 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-103 -350 1131 850]
+/FontName /BEFCOC+CMR10
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 17 0 R
+/Flags 4
+>>
+endobj
+19 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F4
+/FontDescriptor 18 0 R
+/BaseFont /BEFCOC+CMR10
+/FirstChar 33
+/LastChar 255
+/Widths [277.78 500 833.34 500 833.34 777.78 277.78 388.89 388.89 500 777.78 277.78
+333.33 277.78 500 500 500 500 500 500 500 500 500 500 500 277.78 277.78 277.78 777.78
+472.22 472.22 777.78 750 708.34 722.22 763.89 680.56 652.78 784.72 750 361.11 513.89
+777.78 625 916.67 750 777.78 680.56 777.78 736.11 555.56 722.22 750 750 1027.78 750
+750 611.11 277.78 500 277.78 500 277.78 277.78 500 555.56 444.45 555.56 444.45 305.56
+500 555.56 277.78 305.56 527.78 277.78 833.34 555.56 500 555.56 527.78 391.67 394.45
+388.89 555.56 527.78 722.22 527.78 527.78 444.45 500 1000 500 500 0 625 833.34 777.78
+694.45 666.67 750 722.22 777.78 722.22 777.78 722.22 583.34 555.56 555.56 833.34
+833.34 277.78 305.56 500 500 500 500 500 750 444.45 500 722.22 777.78 500 902.78
+1013.89 777.78 277.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500]
+>>
+endobj
+21 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -960
+/FontBBox [-120 -1131 1321 921]
+/FontName /JEFYPA+CMSY10
+/ItalicAngle -14
+/XHeight 430.6
+/StemV 80
+/FontFile 20 0 R
+/Flags 68
+>>
+endobj
+22 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F5
+/FontDescriptor 21 0 R
+/BaseFont /JEFYPA+CMSY10
+/FirstChar 33
+/LastChar 255
+/Widths [1000 500 500 1000 1000 1000 777.78 1000 1000 611.11 611.11 1000 1000 1000
+777.78 275 1000 666.67 666.67 888.89 888.89 0 0 555.56 555.56 666.67 500 722.22 722.22
+777.78 777.78 611.11 798.47 656.81 526.53 771.39 527.78 718.75 594.87 844.52 544.52
+677.78 761.95 689.72 1200.9 820.49 796.11 695.56 816.67 847.5 605.56 544.64 625.83
+612.78 987.78 713.3 668.34 724.73 666.67 666.67 666.67 666.67 666.67 611.11 611.11
+444.45 444.45 444.45 444.45 500 500 388.89 388.89 277.78 500 500 611.11 500 277.78
+833.34 750 833.34 416.67 666.67 666.67 777.78 777.78 444.45 444.45 444.45 611.11
+777.78 777.78 777.78 0 777.78 277.78 777.78 500 777.78 500 777.78 777.78 777.78 777.78
+777.78 777.78 777.78 1000 500 500 777.78 777.78 777.78 777.78 777.78 777.78 777.78
+777.78 777.78 777.78 777.78 777.78 1000 1000 777.78 777.78 1000 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 777.78]
+>>
+endobj
+24 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-106 -350 1162 850]
+/FontName /YEEPJZ+CMR9
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 23 0 R
+/Flags 4
+>>
+endobj
+25 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F6
+/FontDescriptor 24 0 R
+/BaseFont /YEEPJZ+CMR9
+/FirstChar 33
+/LastChar 255
+/Widths [285.49 513.89 856.48 513.89 856.48 799.38 285.49 399.69 399.69 513.89 799.38
+285.49 342.59 285.49 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89 513.89
+513.89 513.89 285.49 285.49 285.49 799.38 485.34 485.34 799.38 770.67 727.93 742.28
+785.03 699.38 670.83 806.48 770.67 370.99 528.08 799.22 642.28 941.97 770.67 799.38
+699.38 799.38 756.48 570.98 742.28 770.67 770.67 1056.17 770.67 770.67 628.08 285.49
+513.89 285.49 513.89 285.49 285.49 513.89 570.98 456.79 570.98 457.17 314.04 513.89
+570.98 285.49 314.04 542.43 285.49 856.48 570.98 513.89 570.98 542.43 402 405.4 399.69
+570.98 542.43 742.28 542.43 542.43 456.79 513.89 1027.77 513.89 513.89 0 642.28 856.48
+799.38 713.58 685.18 770.67 742.28 799.38 742.28 799.38 742.28 599.53 570.98 570.98
+856.48 856.48 285.49 314.04 513.89 513.89 513.89 513.89 513.89 770.67 456.79 513.89
+742.28 799.38 513.89 927.77 1041.97 799.38 285.49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 513.89]
+>>
+endobj
+27 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-111 -350 1216 850]
+/FontName /PNTRYP+CMCSC10
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 26 0 R
+/Flags 4
+>>
+endobj
+28 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F7
+/FontDescriptor 27 0 R
+/BaseFont /PNTRYP+CMCSC10
+/FirstChar 0
+/LastChar 127
+/Widths [683.33 902.77 844.44 755.55 727.77 813.88 786.1 844.44 786.1 844.44 786.1
+552.77 552.77 319.44 319.44 523.61 302.22 424.44 552.77 552.77 552.77 552.77 552.77
+813.88 494.44 915.55 735.55 824.44 635.55 974.99 1091.66 844.44 319.44 319.44 552.77
+902.77 552.77 902.77 844.44 319.44 436.11 436.11 552.77 844.44 319.44 377.77 319.44
+552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 552.77 319.44
+319.44 844.44 844.44 844.44 523.61 844.44 813.88 770.83 786.1 829.16 741.66 712.49
+851.38 813.88 405.55 566.66 843.05 683.33 988.88 813.88 844.44 741.66 844.44 799.99
+611.1 786.1 813.88 813.88 1105.55 813.88 813.88 669.44 319.44 552.77 319.44 552.77
+319.44 319.44 613.33 580 591.11 624.44 557.78 535.55 641.11 613.33 302.22 424.44
+635.55 513.33 746.66 613.33 635.55 557.78 635.55 602.22 457.78 591.11 613.33 613.33
+835.55 613.33 613.33 502.22 552.77 1105.55 552.77 552.77 552.77]
+>>
+endobj
+30 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-100 -350 1100 850]
+/FontName /LVFFVW+CMMI10
+/ItalicAngle -14
+/XHeight 430.6
+/StemV 80
+/FontFile 29 0 R
+/Flags 68
+>>
+endobj
+31 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F8
+/FontDescriptor 30 0 R
+/BaseFont /LVFFVW+CMMI10
+/FirstChar 33
+/LastChar 255
+/Widths [622.45 466.32 591.44 828.13 517.02 362.85 654.17 1000 1000 1000 1000 277.78
+277.78 500 500 500 500 500 500 500 500 500 500 500 500 277.78 277.78 777.78 500 777.78
+500 530.9 750 758.51 714.72 827.92 738.2 643.06 786.25 831.25 439.58 554.51 849.31
+680.56 970.14 803.47 762.78 642.01 790.56 759.29 613.2 584.38 682.78 583.33 944.45
+828.47 580.56 682.64 388.89 388.89 388.89 1000 1000 416.67 528.59 429.17 432.76 520.49
+465.63 489.59 476.97 576.16 344.51 411.81 520.6 298.38 878.01 600.23 484.72 503.13
+446.41 451.16 468.75 361.11 572.46 484.72 715.92 571.53 490.28 465.05 322.46 384.03
+636.46 500 0 615.28 833.34 762.78 694.45 742.36 831.25 779.86 583.33 666.67 612.22
+772.4 639.7 565.63 517.73 444.44 405.9 437.5 496.53 469.44 353.94 576.16 583.34 602.55
+493.98 437.5 570.03 517.02 571.41 437.15 540.28 595.83 625.69 651.39 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 277.78]
+>>
+endobj
+33 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-115 -350 1266 850]
+/FontName /UZAZBR+CMR7
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 32 0 R
+/Flags 4
+>>
+endobj
+34 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F9
+/FontDescriptor 33 0 R
+/BaseFont /UZAZBR+CMR7
+/FirstChar 33
+/LastChar 255
+/Widths [323.41 569.45 938.5 569.45 938.5 876.99 323.41 446.43 446.43 569.45 876.99
+323.41 384.92 323.41 569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45 569.45
+569.45 569.45 323.41 323.41 323.41 876.99 538.69 538.69 876.99 843.26 798.62 815.48
+860.12 767.86 737.11 883.93 843.26 412.7 583.34 874.01 706.35 1027.78 843.26 876.99
+767.86 876.99 829.37 630.96 815.48 843.26 843.26 1150.8 843.26 843.26 692.46 323.41
+569.45 323.41 569.45 323.41 323.41 569.45 630.96 507.94 630.96 507.94 354.17 569.45
+630.96 323.41 354.17 600.2 323.41 938.5 630.96 569.45 630.96 600.2 446.43 452.58
+446.43 630.96 600.2 815.48 600.2 600.2 507.94 569.45 1138.89 569.45 569.45 0 706.35
+938.5 876.99 781.75 753.97 843.26 815.48 876.99 815.48 876.99 815.48 677.58 646.83
+646.83 970.24 970.24 323.41 354.17 569.45 569.45 569.45 569.45 569.45 843.26 507.94
+569.45 815.48 876.99 569.45 1013.89 1136.91 876.99 323.41 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+569.45]
+>>
+endobj
+36 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 611.11
+/Ascent 694.44
+/Descent -222.22
+/FontBBox [-52 -314 577 786]
+/FontName /EKVJLM+CMTT10
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 35 0 R
+/Flags 5
+>>
+endobj
+37 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F10
+/FontDescriptor 36 0 R
+/BaseFont /EKVJLM+CMTT10
+/FirstChar 33
+/LastChar 255
+/Widths [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525]
+>>
+endobj
+38 0 obj
+<<
+/Type /Encoding
+/Differences [0 /x0 /x1 /x2 /x3 /x4 /x5 /x6 /x7 /x8 /x9 /xa /xb /xc /xd /xe /xf /x10
+/x11 /x12 /x13 /x14 /x15 /x16 /x17 /x18 /x19 /x1a /x1b /x1c /x1d /x1e /x1f /x20 /x21
+/x22 /x23 /x24 /x25 /x26 /x27 /x28 /x29 /x2a /x2b /x2c /x2d /x2e /x2f /x30 /x31 /x32
+/x33 /x34 /x35 /x36 /x37 /x38 /x39 /x3a /x3b /x3c /x3d /x3e /x3f /x40 /x41 /x42 /x43
+/x44 /x45 /x46 /x47 /x48 /x49 /x4a /x4b /x4c /x4d /x4e /x4f /x50 /x51 /x52 /x53 /x54
+/x55 /x56 /x57 /x58 /x59 /x5a /x5b /x5c /x5d /x5e /x5f /x60 /x61 /x62 /x63 /x64 /x65
+/x66 /x67 /x68 /x69 /x6a /x6b /x6c /x6d /x6e /x6f /x70 /x71 /x72 /x73 /x74 /x75 /x76
+/x77 /x78 /x79 /x7a /x7b /x7c /x7d /x7e /x7f /x80 /x81 /x82 /x83 /x84 /x85 /x86 /x87
+/x88 /x89 /x8a /x8b /x8c /x8d /x8e /x8f /x90 /x91 /x92 /x93 /x94 /x95 /x96 /x97 /x98
+/x99 /x9a /x9b /x9c /x9d /x9e /x9f /xa0 /xa1 /xa2 /xa3 /xa4 /xa5 /xa6 /xa7 /xa8 /xa9
+/xaa /xab /xac /xad /xae /xaf /xb0 /xb1 /xb2 /xb3 /xb4 /xb5 /xb6 /xb7 /xb8 /xb9 /xba
+/xbb /xbc /xbd /xbe /xbf /xc0 /xc1 /xc2 /xc3 /xc4 /xc5 /xc6 /xc7 /xc8 /xc9 /xca /xcb
+/xcc /xcd /xce /xcf /xd0 /xd1 /xd2 /xd3 /xd4 /xd5 /xd6 /xd7 /xd8 /xd9 /xda /xdb /xdc
+/xdd /xde /xdf /xe0 /xe1 /xe2 /xe3 /xe4 /xe5 /xe6 /xe7 /xe8 /xe9 /xea /xeb /xec /xed
+/xee /xef /xf0 /xf1 /xf2 /xf3 /xf4 /xf5 /xf6 /xf7 /xf8 /xf9 /xfa /xfb /xfc /xfd /xfe
+/xff]
+>>
+endobj
+41 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-122 -350 1344 850]
+/FontName /MLTSAC+CMR6
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 40 0 R
+/Flags 4
+>>
+endobj
+42 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F12
+/FontDescriptor 41 0 R
+/BaseFont /MLTSAC+CMR6
+/FirstChar 33
+/LastChar 255
+/Widths [351.85 611.1 999.99 611.1 999.99 935.18 351.85 481.48 481.48 611.1 935.18
+351.85 416.66 351.85 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1 611.1
+611.1 351.85 351.85 351.85 935.18 578.7 578.7 935.18 896.29 850.92 870.36 915.73
+818.51 786.1 941.66 896.29 442.59 624.07 928.69 753.7 1090.73 896.29 935.18 818.51
+935.18 883.32 675.92 870.36 896.29 896.29 1220.36 896.29 896.29 740.73 351.85 611.1
+351.85 611.1 351.85 351.85 611.1 675.92 546.29 675.92 546.29 384.25 611.1 675.92
+351.85 384.25 643.51 351.85 999.99 675.92 611.1 675.92 643.51 481.48 487.96 481.48
+675.92 643.51 870.36 643.51 643.51 546.29 611.1 1222.21 611.1 611.1 0 753.7 999.99
+935.18 831.47 805.55 896.29 870.36 935.18 870.36 935.18 870.36 736.1 703.69 703.69
+1055.54 1055.54 351.85 384.25 611.1 611.1 611.1 611.1 611.1 896.29 546.29 611.1 870.36
+935.18 611.1 1077.77 1207.39 935.18 351.85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611.1]
+>>
+endobj
+44 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-109 -350 1200 850]
+/FontName /RQSMJQ+CMR8
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 43 0 R
+/Flags 4
+>>
+endobj
+45 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F13
+/FontDescriptor 44 0 R
+/BaseFont /RQSMJQ+CMR8
+/FirstChar 33
+/LastChar 255
+/Widths [295.14 531.26 885.43 531.26 885.43 826.4 295.14 413.2 413.2 531.26 826.4
+295.14 354.17 295.14 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 295.14 295.14 295.14 826.4 501.74 501.74 826.4 795.85 752.09 767.37
+811.12 722.58 693.07 833.52 795.85 382.64 545.49 825.36 663.55 972.93 795.85 826.4
+722.58 826.4 781.61 590.29 767.37 795.85 795.85 1090.99 795.85 795.85 649.31 295.14
+531.26 295.14 531.26 295.14 295.14 531.26 590.29 472.23 590.29 472.23 324.66 531.26
+590.29 295.14 324.66 560.77 295.14 885.43 590.29 531.26 590.29 560.77 414.07 419.1
+413.2 590.29 560.77 767.37 560.77 560.77 472.23 531.26 1062.52 531.26 531.26 0 663.55
+885.43 826.4 736.82 708.34 795.85 767.37 826.4 767.37 826.4 767.37 619.8 590.29 590.29
+885.43 885.43 295.14 324.66 531.26 531.26 531.26 531.26 531.26 795.85 472.23 531.26
+767.37 826.4 531.26 958.69 1076.75 826.4 295.14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531.26]
+>>
+endobj
+47 0 obj
+<<
+/Length 7926
+>>
+stream
+ 0.00 g 0.00 G BT/F1 20.66 Tf 139.52 -67.15 TD[(The)]TJ/F2 20.66 Tf 47.44 0 TD[(")]TJ/F1 20.66 Tf 9.46 0 TD[(-T)]TJ 20.04 -4.6 TD[(E)]TJ 12.35 4.59 TD[(X)-375(man)31(ual)]TJ/F3 9.96 Tf -50.11 -17.93 TD[(V)82(ersion)-332(2,)-333(F)82(ebruary)-332(1998)]TJ/F4 9.96 Tf 14.62 -29.88 TD[(b)28(y)-333(The)]TJ/F5 9.96 Tf 34.31 0 TD[(N)]TJ 6.15 -2.15 TD[(T)]TJ 5.97 2.15 TD[(S)]TJ/F4 9.96 Tf 10.09 0 TD[(T)82(eam)]TJ -153.46 -17.92 TD[(P)27(eter)-332(Breitenlohner,)-334(Max-Planc)27(k-Institut)-332(f)-28(\377)527(ur)-333(Ph)27(ysik,)-332(M)-28(\377)527(unc)28(hen)]TJ/F6 8.97 Tf 6.9 -28.9 TD[(The)-342(preparation)-342(of)-343(this)-343(rep)-28(ort)-343(w)28(as)-342(supp)-28(orted)-343(in)-343(part)-342(b)27(y)]TJ/F7 8.97 Tf 229.65 0 TD[(D)29(ante)]TJ/F6 8.97 Tf 28.47 0 TD[(,)]TJ -227.01 -10.95 TD[(Deutsc)28(hsprac)28(hige)-341(An)27(w)29(enderv)28(ereinigung)-341(T)]TJ 167.22 -1.94 TD[(E)]TJ 5.12 1.94 TD[(X)-342(e.V.)]TJ -195.41 -10.96 TD[(`T)]TJ 7.69 -1.94 TD[(E)]TJ 5.11 1.93 TD[(X')-343(is)-342(a)-343(trademark)-342(of)-343(the)-343(American)-342(Mathematical)-343(So)-28(ciet)27(y)86(.)]TJ/F1 14.35 Tf -62.35 -32.94 TD[(1)-1124(In)30(tro)-30(duction)]TJ/F4 9.96 Tf 0 -21.82 TD[(The)]TJ/F5 9.96 Tf 20.87 0.01 TD[(N)]TJ 6.15 -2.15 TD[(T)]TJ 5.98 2.15 TD[(S)]TJ/F4 9.96 Tf 10.49 0 TD[(pro)-55(ject)-373(in)27(tends)-372(to)-373(dev)27(elop)-372(an)-373(`New)-373(T)27(yp)-27(esetting)-373(System')-373(\()]TJ/F5 9.96 Tf 255.46 0.01 TD[(N)]TJ 6.15 -2.15 TD[(T)]TJ 5.97 2.15 TD[(S)]TJ/F4 9.96 Tf 6.78 -0.01 TD[(\))-372(that)]TJ -317.86 -11.95 TD[(will)-488(ev)27(en)27(tually)-487(replace)-489(to)-28(da)27(y's)-488(T)]TJ 146.58 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X3.)-911(The)]TJ/F5 9.96 Tf 46.33 0 TD[(N)]TJ 6.16 -2.15 TD[(T)]TJ 5.97 2.14 TD[(S)]TJ/F4 9.96 Tf 11.65 -0.01 TD[(program)-488(will)-489(include)-489(man)27(y)]TJ -222.22 -11.95 TD[(features)-396(missing)-397(in)-396(T)]TJ 92.02 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X,)-412(but)-397(there)-396(will)-397(also)-397(exist)-396(a)-397(mo)-28(de)-397(of)-396(op)-28(eration)-397(that)-396(is)]TJ -97.56 -11.95 TD[(100%)-433(compatible)-435(with)-434(T)]TJ 108.73 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X3.)-747(It)-434(will,)-460(necessarily)83(,)-459(require)-434(quite)-435(some)-434(time)-434(to)]TJ -114.27 -11.96 TD[(dev)28(elop)]TJ/F5 9.96 Tf 35.97 0.01 TD[(N)]TJ 6.15 -2.15 TD[(T)]TJ 5.96 2.14 TD[(S)]TJ/F4 9.96 Tf 10.11 0 TD[(to)-332(maturit)26(y)-332(and)-333(mak)26(e)-332(it)-333(widely)-334(a)27(v)56(ailable.)]TJ -43.26 -11.96 TD[(Mean)27(while)]TJ/F8 9.96 Tf 49.71 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.13 TD[(E)]TJ 5.53 2.14 TD[(X)-323(in)27(tends)-322(to)-323(\214ll)-323(the)-323(gap)-324(b)-27(et)26(w)28(een)-322(T)]TJ 151.27 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X3)-323(and)-323(the)-323(future)]TJ/F5 9.96 Tf 81.55 -0.01 TD[(N)]TJ 6.15 -2.14 TD[(T)]TJ 5.96 2.14 TD[(S)]TJ/F4 9.96 Tf 6.78 0.01 TD[(.)]TJ -340.95 -11.96 TD[(It)-333(consists)-333(of)-334(a)-333(series)-333(of)-334(features)-333(extending)-333(the)-334(capabilities)-333(of)-333(T)]TJ 274.42 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X3.)]TJ/F9 6.97 Tf 15.23 3.62 TD[(1)]TJ/F4 9.96 Tf -280.24 -15.57 TD[(Since)-383(compatibilit)27(y)-382(b)-28(et)27(w)28(een)]TJ/F8 9.96 Tf 126.86 0 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-383(and)-383(T)]TJ 36.69 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X3)-383(has)-383(b)-27(een)-383(a)-383(main)-383(concern,)]TJ/F8 9.96 Tf 132.69 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-)]TJ -340.39 -11.96 TD[(T)]TJ 5.53 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-333(has)-333(t)26(w)28(o)-332(mo)-28(des)-333(of)-334(op)-27(eration:)]TJ -11.07 -11.95 TD[(\(1\))-413(In)-413(T)]TJ 35.64 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-412(compatibilit)27(y)-412(mo)-28(de)-413(it)-413(fully)-413(deserv)27(es)-413(the)-413(name)-413(T)]TJ 225.66 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-412(and)-413(there)-413(are)]TJ -272.37 -11.95 TD[(neither)-385(extended)-387(features)-386(nor)-387(additional)-386(primitiv)27(e)-386(commands.)-603(That)-386(means)-387(in)]TJ -0.01 -11.96 TD[(particular)-400(that)]TJ/F8 9.96 Tf 68.91 0.01 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-400(passes)-399(the)]TJ/F10 9.96 Tf 60 0 TD[(TRIP)]TJ/F4 9.96 Tf 24.9 0.01 TD[(test)-399([1])-400(without)-400(an)27(y)-399(restriction.)-643(There)]TJ -172.85 -11.96 TD[(are,)-325(ho)27(w)28(ev)28(er,)-324(a)-323(few)-322(minor)-323(mo)-27(di\214cations)-323(that)-323(w)27(ould)-321(b)-28(e)-323(legitimate)-322(in)-323(an)27(y)-322(imple-)]TJ 0.01 -11.95 TD[(men)27(tation)-332(of)-333(T)]TJ 64.2 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X.)]TJ -69.74 -11.96 TD[(\(2\))-236(In)-236(extended)-236(mo)-28(de)-236(there)-236(are)-236(additional)-236(primitiv)27(e)-236(commands)-236(and)-236(the)-236(extended)]TJ 0 -11.95 TD[(features)-333(of)]TJ/F8 9.96 Tf 48.8 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-333(are)-334(a)27(v)56(ailable.)]TJ -52.87 -11.96 TD[(W)83(e)-397(ha)27(v)28(e)-398(tried)-398(to)-398(mak)27(e)]TJ/F8 9.96 Tf 105.37 0 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-398(as)-398(compatible)-398(with)-398(T)]TJ 104.75 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-398(as)-398(p)-28(ossible)-398(ev)27(en)-397(in)]TJ -249.64 -11.95 TD[(extended)-493(mo)-27(de.)-924(In)-493(a)-493(few)-493(cases)-493(there)-493(are,)-533(ho)27(w)28(ev)27(er,)-531(some)-493(subtle)-493(di\213erences)]TJ 0 -11.95 TD[(describ)-28(ed)-315(in)-315(detail)-316(later)-315(on.)-439(Therefore)-315(the)]TJ/F8 9.96 Tf 185.56 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-315(features)-315(a)27(v)55(ailable)-314(in)-315(extended)]TJ -204.59 -11.95 TD[(mo)-27(de)-333(are)-334(group)-27(ed)-334(in)27(to)-332(t)26(w)28(o)-332(categories:)]TJ -0.01 -11.95 TD[(\(1\))-471(Most)-470(of)-471(them)-471(ha)27(v)28(e)-470(no)-470(seman)27(tic)-470(e\213ect)-471(as)-470(long)-471(as)-471(none)-470(of)-471(the)-470(additional)]TJ 0.01 -11.95 TD[(primitiv)27(es)-332(are)-333(executed;)-334(these)-333(`extensions')-333(are)-334(p)-27(ermanen)26(tly)-332(enabled.)]TJ 0 -11.95 TD[(\(2\))-267(The)-267(remaining)-267(optional)]TJ/F8 9.96 Tf 119.16 0 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-267(features)-267(\(`enhancemen)27(ts'\))-267(can)-267(b)-28(e)-267(individually)]TJ -138.2 -11.96 TD[(enabled)-468(and)-469(disabled;)-536(initially)-469(they)-468(are)-469(all)-469(disabled.)-850(F)82(or)-467(eac)26(h)-467(enhancemen)26(t)]TJ 0 -11.96 TD[(there)-357(is)-357(a)-357(state)-358(v)55(ariable)]TJ/F10 9.96 Tf 106.8 0.01 TD[(\\...state)]TJ/F4 9.96 Tf 47.07 0 TD[(;)-368(an)-358(enhancemen)27(t)-356(is)-358(enabled)-357(or)-357(disabled)-358(b)27(y)]TJ -153.88 -11.96 TD[(assigning)-333(a)-333(p)-28(ositiv)27(e)-332(or)-334(non-p)-28(ositiv)27(e)-332(v)54(alue)-332(resp)-28(ectiv)27(ely)-332(to)-334(that)-333(state)-333(v)54(ariable.)]TJ 14.94 -11.96 TD[(F)83(or)]TJ/F8 9.96 Tf 17.91 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.13 TD[(E)]TJ 5.53 2.14 TD[(X)-336(V)82(ersions)-336(1)-336(and)-337(2)-336(there)-337(is)-336(just)-337(one)-337(enhancemen)27(t:)-450(mixed)-336(direction)]TJ -51.88 -11.96 TD[(t)28(yp)-27(esetting)-334(\(T)]TJ 61.21 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.8 -0.01 TD[(-X)]TJ 11.05 -2.21 TD[(E)]TJ 5.61 2.22 TD[(T)]TJ/F4 9.96 Tf 7.97 -0.01 TD[(\))-333(with)-333(the)-334(state)-333(v)55(ariable)]TJ/F10 9.96 Tf 108.85 0.01 TD[(\\TeXXeTstate)]TJ/F4 9.96 Tf 62.76 -0.01 TD[(.)]TJ ET 0.40 w 61.77 -569.94 m 199.25 -569.94 l S BT/F12 5.98 Tf 72.86 -576.58 TD[(1)]TJ/F13 7.97 Tf 4.15 -2.81 TD[(The)-359(T)]TJ 22.16 -1.72 TD[(E)]TJ 4.7 1.72 TD[(X3)-359(program;)-362(for)-359(the)-360(momen)29(t)-359(there)-359(are)-360(no)-359(plans)-360(to)-359(extend)-360(the)-359(soft)28(w)30(are)-359(related)-359(to)]TJ -42.11 -9.47 TD[(T)]TJ 4.71 -1.71 TD[(E)]TJ 4.71 1.71 TD[(X.)]TJ/F4 9.96 Tf 159.95 -41.78 TD[(1)]TJ ET
+endstream
+endobj
+49 0 obj
+<<
+/F1 10 0 R
+/F2 13 0 R
+/F3 16 0 R
+/F4 19 0 R
+/F5 22 0 R
+/F6 25 0 R
+/F7 28 0 R
+/F8 31 0 R
+/F9 34 0 R
+/F10 37 0 R
+/F11 39 0 R
+/F12 42 0 R
+/F13 45 0 R
+>>
+endobj
+6 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 49 0 R
+>>
+endobj
+52 0 obj
+<<
+/Length 8429
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 76.71 -62.76 TD[(V)83(ersion)-265(1.1)-266(of)]TJ/F8 9.96 Tf 60.89 -0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X)-266(w)27(as)-265(released)-266(in)-265(No)26(v)28(em)28(b)-27(er)-266(1996,)-279(V)82(ersion)-264(2.0)-266(in)-266(F)82(ebruary)]TJ -94.86 -11.95 TD[(1998.)-437(It)-310(is)-311(exp)-28(ected)-311(that)-310(there)-311(will)-311(b)-28(e)-310(ab)-28(out)-311(one)]TJ/F8 9.96 Tf 213.57 -0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-310(v)26(ersion)-309(p)-28(er)-311(y)27(ear,)-314(where)]TJ -232.6 -11.96 TD[(eac)27(h)-497(later)-497(v)26(ersion)-496(adds)-498(new)-498(features.)-937(It)-498(w)27(ould)-497(b)-27(e)-498(desirable)-498(if)-497(these)]TJ/F8 9.96 Tf 317.21 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)]TJ -336.24 -11.96 TD[(v)27(ersions)-351(w)27(ere)-351(incorp)-28(orated)-352(in)26(to)-351(man)27(y)-351(of)-352(the)-353(existing)-352(implemen)27(tations)-351(of)-352(T)]TJ 325.72 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X3)]TJ -331.26 -11.96 TD[(without)-333(m)27(uc)28(h)-332(dela)26(y)84(.)]TJ 14.94 -11.95 TD[(With)-312(eac)26(h)]TJ/F8 9.96 Tf 47.74 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X)-312(v)27(ersion)-312(there)-313(will)-313(b)-28(e)-313(an)]TJ/F10 9.96 Tf 115.12 0.01 TD[(e-TRIP)]TJ/F4 9.96 Tf 34.5 -0.01 TD[(test)-312([2])-313(in)-313(order)-313(to)-313(help)-313(to)]TJ -231.36 -11.95 TD[(v)27(erify)-388(that)-390(a)-389(particular)-390(implemen)27(tation)-388(deserv)27(es)-389(the)-389(name)]TJ/F8 9.96 Tf 261.79 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-389(in)-390(the)-389(same)]TJ -280.81 -11.96 TD[(w)27(a)28(y)-425(as)-425(the)]TJ/F10 9.96 Tf 52.35 0.01 TD[(TRIP)]TJ/F4 9.96 Tf 25.16 0 TD[(test)-425([1])-426(helps)-426(to)-425(v)26(erify)-424(that)-426(an)-426(implemen)27(tation)-424(deserv)26(es)-424(the)]TJ -77.51 -11.96 TD[(name)-333(T)]TJ 32.11 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X.)]TJ/F1 14.35 Tf -37.63 -32.95 TD[(2)-1124(Generating)]TJ/F2 14.35 Tf 108.2 0 TD[(")]TJ/F1 14.35 Tf 6.58 -0.01 TD[(-T)]TJ 13.91 -3.18 TD[(E)]TJ 8.58 3.18 TD[(X)]TJ/F1 11.96 Tf -137.28 -23.82 TD[(2.1)-1125(Generating)-375(the)]TJ/F2 11.96 Tf 123.96 0.01 TD[(")]TJ/F1 11.96 Tf 5.48 0 TD[(-T)]TJ 11.59 -2.67 TD[(E)]TJ 7.15 2.67 TD[(X)-375(Program)]TJ/F4 9.96 Tf -148.17 -18.4 TD[(An)-305(implemen)26(tation)-304(of)-306(T)]TJ 103.51 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-305(consists)-306(of)-305(a)-306(WEB)-305(c)27(hange)-305(\214le)]TJ/F10 9.96 Tf 141.58 0 TD[(tex.ch)]TJ/F4 9.96 Tf 34.43 0 TD[(con)28(taining)-305(all)]TJ -285.05 -11.95 TD[(system-dep)-27(enden)26(t)-347(c)26(hanges)-347(for)-349(a)-349(particular)-349(system.)-490(The)-349(WEB)-349(system)-348(program)]TJ/F10 9.96 Tf 0 -11.96 TD[(TANGLE)]TJ/F4 9.96 Tf 34.53 0 TD[(applies)-315(this)-315(c)27(hange)-315(\214le)-315(to)-315(the)-315(system-indep)-28(enden)27(t)-315(\214le)]TJ/F10 9.96 Tf 235.12 -0.01 TD[(tex.web)]TJ/F4 9.96 Tf 39.75 0.01 TD[(de\214ning)]TJ -309.39 -11.96 TD[(the)-439(T)]TJ 23.75 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-438(program)-439(in)-439(order)-440(to)-439(generate)-439(a)-439(T)]TJ 161.65 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-438(P)26(ascal)-438(\214le)-439(for)-439(that)-439(system)-439([3].)]TJ -196.48 -11.95 TD[(Similarly)-423(an)-423(implemen)27(tation)-422(of)]TJ/F8 9.96 Tf 142.26 0 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-422(consists)-424(of)-423(a)-423(system-dep)-28(enden)27(t)-422(c)27(hange)]TJ -161.3 -11.96 TD[(\214le)]TJ/F10 9.96 Tf 16.29 -0.01 TD[(etex.sys)]TJ/F4 9.96 Tf 45.39 0.01 TD[(to)-356(b)-28(e)-356(applied)-357(to)-356(the)-356(system-indep)-28(enden)27(t)-356(\214le)]TJ/F10 9.96 Tf 197.1 -0.01 TD[(e-tex.web)]TJ/F4 9.96 Tf 50.63 0.01 TD[(de\214ning)]TJ -309.4 -11.96 TD[(the)]TJ/F8 9.96 Tf 16.87 0 TD[(")]TJ/F4 9.96 Tf 4.66 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-304(program.)-435(Since)]TJ/F8 9.96 Tf 79.92 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-304(di\213ers)-305(from)-305(T)]TJ 68.72 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-304(b)27(y)-304(a)-305(relativ)27(ely)-304(small)-305(fraction)]TJ -209.14 -11.95 TD[(of)-393(its)-393(co)-28(de)]TJ/F10 9.96 Tf 50 0.01 TD[(e-tex.web)]TJ/F4 9.96 Tf 50.99 -0.01 TD[(do)-27(es,)-408(ho)27(w)27(ev)28(er,)-407(not)-393(exist)-394(as)-393(a)-393(ph)26(ysical)-392(\214le;)-423(it)-394(is)-393(instead)]TJ -101 -11.95 TD[(de\214ned)-419(in)-419(terms)-420(of)-419(a)-419(system-indep)-28(enden)27(t)-419(c)27(hange)-419(\214le)]TJ/F10 9.96 Tf 238.68 0 TD[(e-tex.ch)]TJ/F4 9.96 Tf 46.03 -0.01 TD[(to)-419(b)-28(e)-419(applied)]TJ -284.71 -11.95 TD[(to)]TJ/F10 9.96 Tf 13.56 0 TD[(tex.web)]TJ/F4 9.96 Tf 36.62 -0.01 TD[(.)-865(Similarly)-474(it)-473(should)-474(b)-28(e)-473(p)-28(ossible)-474(to)-473(de\214ne)-474(the)-473(system-dep)-28(enden)27(t)]TJ -50.18 -11.95 TD[(c)28(hange)-314(\214le)]TJ/F10 9.96 Tf 48.61 0 TD[(etex.sys)]TJ/F4 9.96 Tf 44.97 0 TD[(for)-315(a)-314(particular)-315(system)-315(in)-315(terms)-314(of)-315(its)-315(deviations)-315(from)-314(the)]TJ -93.58 -11.95 TD[(corresp)-27(onding)-333(\214le)]TJ/F10 9.96 Tf 80.08 0.01 TD[(tex.ch)]TJ/F4 9.96 Tf 34.71 0 TD[([4].)]TJ/F1 11.96 Tf -114.79 -27.89 TD[(2.2)-1124(Generating)-375(F)93(ormat)-374(Files)-375(for)]TJ/F2 11.96 Tf 200.3 -0.01 TD[(")]TJ/F1 11.96 Tf 5.47 0 TD[(-T)]TJ 11.59 -2.65 TD[(E)]TJ 7.16 2.66 TD[(X)]TJ/F4 9.96 Tf -224.53 -18.39 TD[(When)-477(\(the)-478(INITEX)-477(or)-478(VIR)83(TEX)-477(v)27(ersion)-477(of)-77(\))-478(the)-478(T)]TJ 228.1 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-477(program)-478(is)-478(started,)-513(it)]TJ -233.63 -11.95 TD[(analyzes)-356(the)-355(\214rst)-356(non-blank)-356(input)-356(line)-355(from)-356(the)-356(command)-356(line)-356(or)-355(\(with)-356(the)]TJ/F10 9.96 Tf 333.26 0 TD[(**)]TJ/F4 9.96 Tf -333.25 -11.96 TD[(prompt\))-263(from)-264(the)-263(terminal:)-410(The)-264(\214rst)-264(non-blank)-263(c)26(haracter)-262(of)-264(that)-264(input)-264(line)-263(ma)26(y)]TJ -0.01 -11.95 TD[(b)-28(e)-281(an)]TJ/F10 9.96 Tf 26.38 -0.01 TD[(&)]TJ/F4 9.96 Tf 8.03 0 TD[(follo)27(w)28(ed)-281(immediately)-282(b)27(y)-281(the)-282(name)-282(of)-282(the)-282(format)-282(to)-282(b)-27(e)-282(loaded;)-299(otherwise)]TJ -34.41 -11.95 TD[(VIR)82(TEX)-256(uses)-258(a)-258(default)-258(format)-258(whereas)-258(INITEX)-257(starts)-258(without)-258(loading)-258(a)-258(format)]TJ 0.01 -11.95 TD[(\214le.)]TJ 14.94 -11.95 TD[(F)83(or)-392(eINITEX)-393(\(the)-393(INITEX)-393(v)27(ersion)-392(of)]TJ/F8 9.96 Tf 170.97 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X\))-393(there)-393(is)-393(an)-393(additional)-393(p)-27(ossi-)]TJ -204.94 -11.95 TD[(bilit)27(y:)-427(If)-300(the)-301(\214rst)-300(non-blank)-301(input)-300(c)27(haracter)-300(is)-300(an)]TJ/F10 9.96 Tf 215.49 0 TD[(*)]TJ/F4 9.96 Tf 8.21 0 TD[(\(immediately)-300(follo)26(w)28(ed)-299(what)]TJ -223.7 -11.95 TD[(w)27(ould)-365(b)-28(e)-367(the)-367(\214rst)-366(non-blank)-367(input)-367(c)27(haracter)-365(for)-367(INITEX\),)-367(the)-366(program)-367(starts)]TJ 0 -11.95 TD[(in)-295(extended)-295(mo)-28(de)-295(without)-295(loading)-295(a)-295(format)-295(\214le.)-432(If)-295(the)-295(\214rst)-295(non-blank)-295(c)27(haracter)]TJ 0 -11.96 TD[(is)-384(neither)]TJ/F10 9.96 Tf 44.83 0 TD[(&)]TJ/F4 9.96 Tf 9.07 0 TD[(nor)]TJ/F10 9.96 Tf 18.24 0 TD[(*)]TJ/F4 9.96 Tf 9.05 0.01 TD[(then)-384(eINITEX)-384(starts)-385(without)-384(loading)-384(a)-385(format)-384(but)-384(in)-385(com-)]TJ -81.18 -11.96 TD[(patibilit)27(y)-280(mo)-28(de.)-427(Whenev)26(er)-281(a)-281(format)-282(\214le)-282(is)-282(loaded)-282(b)27(y)-281(eINITEX)-282(or)-282(eVIR)83(TEX)-281(the)]TJ 0 -11.95 TD[(mo)-27(de)-333(\(compatibilit)27(y)-333(or)-333(extended\))-333(is)-334(inherited)-333(from)-333(the)-334(format.)]TJ 14.94 -11.95 TD[(It)-242(is)-243(recommended)-243(that)-243(the)-244(input)-243(\214le)]TJ/F10 9.96 Tf 159 -0.01 TD[(etex.src)]TJ/F4 9.96 Tf 44.26 0 TD[(b)-27(e)-243(used)-243(instead)-243(of)]TJ/F10 9.96 Tf 78.42 0.01 TD[(plain.tex)]TJ/F4 9.96 Tf -296.64 -11.96 TD[(when)-398(generating)-398(an)]TJ/F8 9.96 Tf 90.52 0 TD[(")]TJ/F4 9.96 Tf 4.66 0 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-397(format)-398(in)-398(extended)-398(mo)-28(de.)-639(That)-398(\214le)-398(will)-398(\214rst)-398(read)]TJ 59.81 -51.93 TD[(2)]TJ ET
+endstream
+endobj
+53 0 obj
+<<
+/F4 19 0 R
+/F8 31 0 R
+/F10 37 0 R
+/F1 10 0 R
+/F2 13 0 R
+>>
+endobj
+51 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 53 0 R
+>>
+endobj
+56 0 obj
+<<
+/Length 8231
+>>
+stream
+ 0.00 g 0.00 G BT/F10 9.96 Tf 61.77 -62.76 TD[(plain.tex)]TJ/F4 9.96 Tf 51.24 -0.01 TD[(\(without)-417(reading)]TJ/F10 9.96 Tf 78.09 0 TD[(hyphen.tex)]TJ/F4 9.96 Tf 52.31 0 TD[(\))-417(and)-419(will)-418(then)-418(supply)-418(macro)-419(de\214ni-)]TJ -181.65 -11.95 TD[(tions)-333(supp)-28(orting)]TJ/F8 9.96 Tf 74.59 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-333(features.)]TJ/F1 14.35 Tf -93.62 -32.95 TD[(3)]TJ/F2 14.35 Tf 24.22 -0.01 TD[(")]TJ/F1 14.35 Tf 6.56 0 TD[(-T)]TJ 13.92 -3.18 TD[(E)]TJ 8.58 3.19 TD[(X)-375(Extensions)]TJ/F1 11.96 Tf -53.27 -23.81 TD[(3.1)-1125(Compatibilit)30(y)-374(and)-375(Extended)-375(Mo)-31(de)]TJ/F4 9.96 Tf 0.01 -18.4 TD[(Once)]TJ/F8 9.96 Tf 25.29 0 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-317(has)-316(en)27(tered)-316(compatibilit)27(y)-316(mo)-28(de)-317(it)-316(b)-28(eha)27(v)28(es)-316(as)-317(an)27(y)-316(other)-316(implemen-)]TJ -44.32 -11.95 TD[(tation)-384(of)-386(T)]TJ 47.24 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X.)-600(All)-385(of)]TJ/F8 9.96 Tf 44.93 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X's)-385(additional)-385(commands)-385(are)-385(absen)26(t;)-410(it)-385(is)-385(therefore)]TJ -116.75 -11.96 TD[(imp)-27(ossible)-271(to)-271(access)-270(an)26(y)-270(of)-270(the)-271(extensions)-271(or)-271(enhancemen)27(ts.)-423(The)-270(abilit)26(y)-270(of)-270(eINI-)]TJ -0.01 -11.96 TD[(TEX)-333(to)-334(initially)-333(c)27(ho)-27(ose)-333(b)-28(et)27(w)28(een)-333(compatibilit)27(y)-332(and)-334(extended)-333(mo)-28(de)-333(is,)-333(ho)26(w)28(ev)28(er,)]TJ 0.01 -11.95 TD[(b)27(y)-332(itself)-333(a)-334(feature)-333(not)-333(presen)27(t)-333(in)-333(an)27(y)-333(T)]TJ 168.14 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-333(implemen)27(tation.)]TJ -158.73 -11.96 TD[(The)-240(remainder)-242(of)-241(this)-241(do)-28(cumen)27(t)-240(is)-241(dev)26(oted)-240(to)-241(a)-241(detailed)-241(and)-242(mostly)-241(tec)27(hnical)]TJ -14.95 -11.95 TD[(description)-378(of)-378(all)-378(asp)-27(ects)-379(where)]TJ/F8 9.96 Tf 141.93 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-377(\(in)-378(extended)-378(mo)-28(de\))-378(b)-28(eha)27(v)27(es)-377(di\213eren)27(tly)]TJ -160.97 -11.95 TD[(from)-308(T)]TJ 28.84 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X.)-436(It)-309(will)-309(b)-27(e)-309(assumed)-309(that)-309(the)-309(reader)-308(is)-309(familiar)-309(with)]TJ/F3 9.96 Tf 234.06 0 TD[(The)-309(T)]TJ 25.78 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.46 -0.01 TD[([5])]TJ -333.2 -11.95 TD[(describing)-333(T)]TJ 52.66 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X's)-333(b)-28(eha)27(viour)-332(in)-334(quite)-333(some)-333(detail.)]TJ -43.25 -11.95 TD[(All)-314(of)]TJ/F8 9.96 Tf 27.31 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-314(extensions)-315(and)-315(enhancemen)27(ts)-314(a)27(v)55(ailable)-313(in)-315(extended)-315(mo)-28(de)-314(are)]TJ -61.28 -11.96 TD[(activ)55(ated)-396(b)27(y)-396(either)-396(executing)-397(some)-397(new)-396(primitiv)26(e)-395(command)-397(or)-397(b)27(y)-396(assigning)-396(a)]TJ 0 -11.96 TD[(nonzero)-352(v)54(alue)-351(to)-353(some)-353(new)-353(in)27(teger)-352(parameter)-352(or)-353(state)-353(v)55(ariable.)-502(Since)-353(all)-353(these)]TJ 0 -11.95 TD[(new)-493(v)54(ariables)-493(are)-494(initially)-495(zero,)]TJ/F9 6.97 Tf 142.15 3.62 TD[(2)]TJ/F8 9.96 Tf 9.79 -3.62 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-494(b)-27(eha)26(v)28(es)-493(as)-494(T)]TJ 70.5 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-494(as)-494(long)-495(as)-494(none)-494(of)]TJ/F8 9.96 Tf -247.02 -11.95 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)-433(new)-434(con)27(trol)-433(sequences)-434(are)-433(used,)-459(with)-434(the)-433(follo)27(wing)-433(exceptions)-434(whic)27(h)]TJ -19.03 -11.96 TD[(should,)-326(ho)27(w)27(ev)28(er,)-326(ha)27(v)28(e)-324(no)-326(e\213ect)-325(on)-325(the)-325(t)27(yp)-27(esetting)-325(of)-326(error-free)-325(T)]TJ 280.92 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-324(do)-28(cumen)27(ts)]TJ -286.46 -11.96 TD[(\(pro)-27(duced)-333(with)-334(error-free)-333(formats\):)]TJ 0 -11.95 TD[(\(1\))-332(When)]TJ/F10 9.96 Tf 45.1 0 TD[(\\tracingcommands)]TJ/F4 9.96 Tf 87.01 0 TD[(has)-333(a)-333(v)54(alue)-332(of)-333(3)-334(or)-333(more,)-333(or)]TJ -132.11 -11.95 TD[(when)]TJ/F10 9.96 Tf 24.98 0.01 TD[(\\tracinglostchars)]TJ/F4 9.96 Tf 91.21 0 TD[(has)-230(a)-231(v)55(alue)-230(of)-230(2)-231(or)-230(more,)]TJ/F8 9.96 Tf 104.4 -0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-230(will)-231(displa)27(y)-229(additional)]TJ -239.63 -11.96 TD[(information)-333(not)-334(a)27(v)56(ailable)-333(in)-333(T)]TJ 129.83 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X.)]TJ -135.36 -11.95 TD[(\(2\))-328(When)-328(using)-328(a)-329(coun)27(t,)-328(dimen,)-329(skip,)-330(m)27(uskip,)-328(b)-28(o)27(x,)-328(or)-328(tok)26(en)-327(register)-328(n)27(um)27(b)-26(er)-329(in)]TJ 0 -11.96 TD[(the)-386(range)-387(256{32767,)]TJ/F8 9.96 Tf 96.96 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-387(will)-386(access)-387(one)-387(of)-386(its)-387(additional)-387(registers)-387(whereas)]TJ -115.98 -11.95 TD[(T)]TJ 5.53 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-333(will)-333(pro)-28(duce)-333(an)-334(error)-333(and)-333(use)-334(register)-333(n)27(um)27(b)-26(er)-334(zero.)]TJ/F1 11.96 Tf -11.07 -27.89 TD[(3.2)-1125(Optimization)]TJ/F4 9.96 Tf 0.01 -18.39 TD[(When)-456(a)-457(v)54(alue)-456(is)-457(assigned)-456(to)-457(an)]TJ/F5 9.96 Tf 147.15 0 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(in)27(ternal)-332(quan)27(tit)28(y)]TJ/F5 9.96 Tf 73.5 0.01 TD[(i)]TJ/F4 9.96 Tf 8.43 -0.01 TD[(within)-457(a)-456(sa)26(v)28(e)-456(group,)-488(the)]TJ -232.96 -11.95 TD[(former)-315(v)55(alue)-314(is)-315(restored)-315(when)-315(the)-315(group)-315(ends,)-319(pro)27(vided)-314(the)-315(assignmen)27(t)-314(w)27(as)-314(not)]TJ 0.01 -11.96 TD[(global.)-425(This)-275(is)-276(ac)27(hiev)27(ed)-274(b)27(y)-275(sa)27(ving)-275(the)-276(former)-276(v)55(alue)-275(on)-276(T)]TJ 239.23 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-275(`sa)27(v)28(e)-275(stac)27(k'.)]TJ/F8 9.96 Tf 72.43 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)]TJ -336.24 -11.96 TD[(refrains)-380(from)-381(creating)-382(suc)27(h)-380(sa)27(v)27(e)-380(stac)27(k)-380(en)27(tries)-381(when)-381(the)-381(old)-381(and)-381(new)-382(v)55(alue)-380(are)]TJ -0.01 -11.95 TD[(the)-333(same)-333(\(`reassignmen)26(ts'\).)]TJ/F10 9.96 Tf 14.95 -11.96 TD[(\\aftergroup)]TJ/F4 9.96 Tf 61.42 0.01 TD[(tok)27(ens)-389(are)-391(also)-391(k)27(ept)-389(on)-391(T)]TJ 112.03 -2.14 TD[(E)]TJ 5.53 2.13 TD[(X's)-390(sa)27(v)27(e)-389(stac)27(k.)-616(When)-390(the)-391(curren)27(t)]TJ -193.93 -11.95 TD[(group)-321(ends,)-323(T)]TJ 59.09 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-321(con)27(v)28(erts)-320(eac)27(h)]TJ/F10 9.96 Tf 71.95 0.01 TD[(\\aftergroup)]TJ/F4 9.96 Tf 60.73 -0.01 TD[(tok)28(en)-321(in)27(to)-320(a)-321(tok)27(en)-320(list)-321(and)-321(inserts)]TJ -197.31 -11.95 TD[(this)-257(list)-258(as)-257(new)-258(`input)-257(lev)26(el')-256(in)27(to)-257(the)-257(input)-258(stac)27(k.)]TJ/F8 9.96 Tf 209.86 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-257(collects)-258(all)]TJ/F10 9.96 Tf 57.3 0.01 TD[(\\aftergroup)]TJ/F4 9.96 Tf -286.19 -11.96 TD[(tok)27(ens)-332(from)-334(one)-333(group)-333(in)26(to)-332(one)-333(tok)26(en)-332(list)-333(and)-334(th)27(us)-332(conserv)27(es)-333(input)-333(lev)27(els.)]TJ ET 0.40 w 61.77 -550.96 m 199.25 -550.96 l S BT/F12 5.98 Tf 72.86 -557.6 TD[(2)]TJ/F13 7.97 Tf 4.15 -2.82 TD[(T)88(o)-378(b)-29(e)-379(precise)-378(all)-379(state)-378(v)58(ariables)-378(are)-378(zero)-379(when)-378(eINITEX)-379(or)-378(eVIR)87(TEX)-377(is)-379(started;)-390(in)28(teger)]TJ -15.24 -9.46 TD[(parameters)-376(that)-377(are)-376(not)-377(state)-376(v)58(ariables)-376(are)-376(zero)-377(when)-376(eINITEX)-377(is)-376(started)-377(without)-377(loading)-376(a)]TJ 0 -9.46 TD[(format)-354(\214le)-354(or)-354(inherited)-354(from)-355(the)-354(format)-354(\214le)-354(otherwise.)]TJ/F4 9.96 Tf 169.37 -51.29 TD[(3)]TJ ET
+endstream
+endobj
+57 0 obj
+<<
+/F10 37 0 R
+/F4 19 0 R
+/F8 31 0 R
+/F1 10 0 R
+/F2 13 0 R
+/F3 16 0 R
+/F9 34 0 R
+/F5 22 0 R
+/F12 42 0 R
+/F13 45 0 R
+>>
+endobj
+55 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 57 0 R
+>>
+endobj
+60 0 obj
+<<
+/Length 5699
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 76.71 -62.76 TD[(When)-348(a)-348(completed)-348(page)-348(is)-348(written)-348(to)-348(the)-348(D)27(VI)-347(\214le)-348(\(shipp)-28(ed)-348(out\),)-351(T)]TJ 292.65 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-348(m)27(ul-)]TJ -313.12 -11.96 TD[(tiplies)-348(the)-349(relev)55(an)28(t)-348(stretc)27(h)-347(or)-349(shrink)-348(comp)-28(onen)27(ts)-348(of)-348(glue)-348(no)-28(des)-349(in)-348(a)-348(b)-28(o)27(x)-348(b)27(y)-348(the)]TJ 0.01 -11.96 TD[(glue)-406(expansion)-407(factor)-406(of)-407(that)-407(b)-27(o)26(x)-405(and)-407(con)27(v)28(erts)-406(the)-407(pro)-28(duct)-406(to)-407(D)27(VI)-406(units.)-664(In)]TJ 0 -11.95 TD[(order)-316(to)-317(a)26(v)28(oid)-316(o)27(v)28(er\215o)27(w)-316(eac)27(h)-316(resulting)-317(v)54(alue)]TJ/F8 9.96 Tf 191.37 0 TD[(x)]TJ/F4 9.96 Tf 8.84 -0.01 TD[(is)-317(arti\214cially)-317(limited)-317(to)-317(the)-318(range)]TJ/F5 9.96 Tf -200.22 -11.95 TD[(j)]TJ/F8 9.96 Tf 2.77 -0.01 TD[(x)]TJ/F5 9.96 Tf 5.7 0 TD[(j)-277(\224)]TJ/F4 9.96 Tf 16.05 0.01 TD[(10)]TJ/F9 6.97 Tf 9.96 3.61 TD[(9)]TJ/F4 9.96 Tf 4.48 -3.62 TD[(.)-444(Consider)-333(the)-333(example:)]TJ/F10 9.96 Tf -23.26 -19.92 TD[(\\shipout\\vbox)-525(to100pt{)]TJ 10.47 -11.95 TD[(\\hrule)-524(width10pt)]TJ 0 -11.96 TD[(\\vskip)-524(0pt)-525(plus1000fil)]TJ -0.01 -11.96 TD[(\\vskip)-525(0pt)-525(plus1000fil)]TJ 0.01 -11.95 TD[(\\vskip)-524(0pt)-525(plus-2000fil)]TJ 0 -11.96 TD[(\\hrule)]TJ 0 -11.96 TD[(\\vskip)-524(0pt)-525(plus0.00005fil)]TJ -0.01 -11.95 TD[(})]TJ/F4 9.96 Tf -26.15 -19.93 TD[(Here)-339(the)-339(three)-339(glues)-339(b)-27(et)26(w)28(een)-338(the)-339(t)27(w)28(o)-338(rules)-339(add)-339(up)-339(to)-338(zero;)-342(when)-339(T)]TJ 291.56 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-338(con)27(v)28(erts)]TJ -297.09 -11.95 TD[(eac)27(h)-467(stretc)26(h)-467(comp)-28(onen)27(t)-468(individually)-468(they)-468(will,)-503(ho)27(w)28(ev)28(er,)-502(add)-468(up)-469(to)-468(10)]TJ/F9 6.97 Tf 316.18 3.61 TD[(9)]TJ/F4 9.96 Tf 9.13 -3.62 TD[(D)28(VI)]TJ -325.31 -11.96 TD[(units)-462(due)-463(to)-463(the)-462(truncation)-463(men)27(tioned)-462(ab)-28(o)27(v)28(e.)]TJ/F8 9.96 Tf 213.98 0.01 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X,)-494(ho)26(w)28(ev)28(er,)-494(accum)26(ulates)]TJ -233.03 -11.96 TD[(the)-400(relev)55(an)28(t)-400(stretc)27(h)-400(or)-400(shrink)-401(comp)-28(onen)27(ts)-399(of)-401(consecutiv)27(e)-400(glue)-400(no)-28(des)-401(\(p)-27(ossibly)]TJ 0 -11.96 TD[(separated)-387(b)27(y)-387(insert,)-402(mark,)-401(adjust,)-402(k)27(ern,)-400(and)-388(p)-28(enalt)27(y)-387(no)-28(des\))-388(b)-27(efore)-388(con)26(v)28(erting)]TJ -0.01 -11.96 TD[(them)-487(to)-488(D)27(VI)-486(units.)-907(During)-488(this)-487(pro)-28(cess)-487(glue)-488(no)-28(des)-487(ma)27(y)-487(b)-28(e)-487(con)27(v)27(erted)-486(in)27(to)]TJ 0 -11.95 TD[(equiv)55(alen)28(t)-385(k)26(ern)-385(no)-27(des)-386(and)-386(some)-386(glue)-386(sp)-28(eci\214cations)-386(ma)27(y)-385(b)-28(e)-386(recycled;)-412(this)-386(ma)26(y)]TJ 0 -11.96 TD[(a\213ect)-425(the)-425(memory)-426(usage)-425(statistics)-425(displa)27(y)27(ed)-424(after)-425(the)-425(page)-426(has)-425(b)-28(een)-425(shipp)-28(ed)]TJ 0.01 -11.96 TD[(out.)]TJ/F1 11.96 Tf 0 -27.89 TD[(3.3)-1124(T)93(racing)-374(and)-375(Diagnostics)]TJ/F4 9.96 Tf -0.01 -18.39 TD[(When)]TJ/F10 9.96 Tf 29.29 0 TD[(\\tracingcommands)]TJ/F4 9.96 Tf 87.23 0 TD[(has)-355(a)-356(v)54(alue)-355(of)-356(3)-356(or)-356(more,)-361(the)-357(commands)-356(follo)27(wing)-355(a)]TJ -116.52 -11.96 TD[(pre\214x)-333(\()]TJ/F10 9.96 Tf 31.85 0 TD[(\\global)]TJ/F4 9.96 Tf 36.62 0 TD[(,)-333(etc.\))-444(are)-333(sho)26(wn)-332(as)-333(w)26(ell,)-332(e.g.:)]TJ/F10 9.96 Tf -52.78 -19.92 TD[(\\global\\count0=0)-2100(=>)-2100({\\global})]TJ 136 -11.95 TD[({\\count})]TJ/F4 9.96 Tf -136.74 -19.92 TD[(When)]TJ/F10 9.96 Tf 29.03 -0.01 TD[(\\tracinglostchars)]TJ/F4 9.96 Tf 92.23 0.01 TD[(has)-331(a)-332(v)55(alue)-331(of)-332(2)-332(or)-331(more,)-333(missing)-331(c)26(haracters)-330(are)]TJ -136.21 -11.96 TD[(displa)28(y)27(ed)-332(on)-333(the)-334(terminal)-333(ev)27(en)-333(if)-333(the)-333(v)54(alue)-332(of)]TJ/F10 9.96 Tf 200.44 0 TD[(\\tracingonline)]TJ/F4 9.96 Tf 76.54 0 TD[(is)-333(0)-333(or)-334(less.)]TJ -262.04 -11.96 TD[(When)]TJ/F10 9.96 Tf 28.01 0 TD[(\\tracingscantokens)]TJ/F4 9.96 Tf 96.41 0.01 TD[(has)-228(a)-227(v)54(alue)-227(of)-228(1)-227(or)-228(more,)-249(the)-228(op)-28(ening)-228(and)-228(closing)]TJ -139.36 -11.96 TD[(of)-249(pseudo-\214les)-251(\(generated)-250(b)26(y)]TJ/F10 9.96 Tf 124.4 0 TD[(\\scantokens)]TJ/F4 9.96 Tf 57.54 0.01 TD[(\))-250(is)-251(recorded)-250(as)-251(for)-250(an)27(y)-250(other)-250(\214le,)-267(with)]TJ -181.94 -11.96 TD[(`)]TJ/F10 9.96 Tf 2.76 0 TD[(\240)]TJ/F4 9.96 Tf 5.23 0.01 TD[(')-333(as)-334(\214lename.)]TJ 6.95 -11.96 TD[(When)-429(the)-429(program)-429(is)-429(compiled)-429(with)-429(the)-429(co)-28(de)-429(for)-429(collecting)-429(statistics)-429(and)]TJ/F10 9.96 Tf -14.94 -11.96 TD[(\\tracingassigns)]TJ/F4 9.96 Tf 82.55 0 TD[(has)-410(a)-411(v)55(alue)-410(of)-411(1)-410(or)-411(more,)-430(all)-411(assignmen)27(ts)-410(sub)-55(ject)-411(to)-411(T)]TJ 241.47 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ -329.55 -11.96 TD[(grouping)-333(mec)27(hanism)-332(are)-334(traced,)-333(e.g.:)]TJ/F10 9.96 Tf 15.69 -19.93 TD[(\\def\\foo{\\relax})-2099(=>)-2100({changing)-525(\\foo=undefined})]TJ 135.99 -11.95 TD[({into)-524(\\foo=macro:->\\relax)-525(})]TJ -135.99 -11.95 TD[(\\global\\count17=7)-1574(=>)-2100({globally)-525(changing)-525(\\count17=0})]TJ 135.98 -11.96 TD[({into)-524(\\count17=7})]TJ -135.99 -11.95 TD[(\\count17=7)-5249(=>)-2100({reassigning)-525(\\count17=7})]TJ/F4 9.96 Tf 153.67 -39.4 TD[(4)]TJ ET
+endstream
+endobj
+61 0 obj
+<<
+/F4 19 0 R
+/F8 31 0 R
+/F5 22 0 R
+/F9 34 0 R
+/F10 37 0 R
+/F1 10 0 R
+>>
+endobj
+59 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 61 0 R
+>>
+endobj
+64 0 obj
+<<
+/Length 4553
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 76.71 -62.76 TD[(When)]TJ/F10 9.96 Tf 30.35 -0.01 TD[(\\tracingifs)]TJ/F4 9.96 Tf 62.15 0 TD[(has)-463(a)-463(v)55(alue)-462(of)-463(1)-463(or)-463(more,)-495(all)-463(conditionals)-463(\(including)]TJ/F10 9.96 Tf -107.43 -11.95 TD[(\\unless)]TJ/F4 9.96 Tf 36.61 0 TD[(,)]TJ/F10 9.96 Tf 6.44 -0.01 TD[(\\or)]TJ/F4 9.96 Tf 15.69 0 TD[(,)]TJ/F10 9.96 Tf 6.44 0 TD[(\\else)]TJ/F4 9.96 Tf 26.14 0.01 TD[(,)-368(and)]TJ/F10 9.96 Tf 26.1 0 TD[(\\fi)]TJ/F4 9.96 Tf 15.69 -0.01 TD[(\))-361(are)-361(traced,)-369(together)-361(with)-362(the)-361(starting)-362(line)-362(and)]TJ -133.13 -11.95 TD[(nesting)-364(lev)27(el;)-379(the)]TJ/F10 9.96 Tf 78.08 0 TD[(\\showifs)]TJ/F4 9.96 Tf 45.46 -0.01 TD[(command)-364(displa)27(ys)-364(the)-364(state)-364(of)-364(all)-365(curren)27(tly)-363(activ)27(e)]TJ -123.53 -11.95 TD[(conditionals.)-444(Th)27(us)-333(the)-333(input)]TJ/F10 9.96 Tf 15.69 -19.43 TD[(\\unless\\iffalse)]TJ 15.69 -11.95 TD[(\\iffalse)]TJ 0.01 -11.95 TD[(\\else)]TJ 15.69 -11.96 TD[(\\showifs)]TJ -15.69 -11.96 TD[(\\fi)]TJ -15.69 -11.96 TD[(\\fi)]TJ/F4 9.96 Tf -15.7 -19.42 TD[(migh)27(t)-332(yield)]TJ/F10 9.96 Tf 15.7 -19.44 TD[({\\unless\\iffalse:)-524(\(level)-525(1\))-525(entered)-525(on)-525(line)-525(1})]TJ 0 -11.95 TD[({\\iffalse:)-524(\(level)-525(2\))-525(entered)-525(on)-525(line)-525(2})]TJ -0.01 -11.95 TD[({\\else:)-525(\\iffalse)-525(\(level)-525(2\))-525(entered)-525(on)-525(line)-525(2})]TJ 0.01 -11.96 TD[(###)-524(level)-525(2:)-525(\\iffalse\\else)-525(entered)-525(on)-525(line)-525(2)]TJ 0 -11.95 TD[(###)-524(level)-525(1:)-525(\\unless\\iffalse)-525(entered)-525(on)-525(line)-525(1)]TJ -0.01 -11.96 TD[({\\fi:)-525(\\iffalse)-525(\(level)-525(2\))-525(entered)-525(on)-525(line)-525(2})]TJ 0 -11.95 TD[({\\fi:)-525(\\unless\\iffalse)-525(\(level)-525(1\))-525(entered)-525(on)-525(line)-525(1})]TJ/F4 9.96 Tf -0.75 -19.43 TD[(When)]TJ/F10 9.96 Tf 29.22 0.01 TD[(\\tracinggroups)]TJ/F4 9.96 Tf 76.69 -0.01 TD[(has)-348(a)-348(v)55(alue)-348(of)-348(1)-348(or)-349(more,)-352(the)-348(start)-348(and)-349(end)-348(of)-349(eac)27(h)]TJ -120.85 -11.95 TD[(sa)28(v)27(e)-454(group)-455(is)-455(traced,)-486(together)-455(with)-455(the)-455(starting)-455(line)-455(and)-455(grouping)-455(lev)26(el;)-515(the)]TJ/F10 9.96 Tf -0.01 -11.96 TD[(\\showgroups)]TJ/F4 9.96 Tf 61.72 0.01 TD[(command)-418(displa)27(ys)-418(the)-419(state)-419(of)-419(all)-419(curren)27(tly)-418(activ)27(e)-418(sa)27(v)28(e)-418(groups.)]TJ -61.72 -11.96 TD[(Th)27(us)-332(the)-334(input)]TJ/F10 9.96 Tf 15.7 -19.43 TD[(\\begingroup)]TJ 15.69 -11.95 TD[({)]TJ 15.68 -11.95 TD[(\\showgroups)]TJ -15.68 -11.96 TD[(})]TJ -15.69 -11.95 TD[(\\endgroup)]TJ/F4 9.96 Tf -15.7 -19.43 TD[(migh)27(t)-332(yield)]TJ/F10 9.96 Tf 10.46 -19.43 TD[({entering)-525(semi)-525(simple)-525(group)-525(\(level)-525(1\))-525(at)-525(line)-525(1})]TJ 0 -11.96 TD[({entering)-525(simple)-525(group)-525(\(level)-525(2\))-525(at)-525(line)-525(2})]TJ 0.01 -11.96 TD[(###)-524(simple)-525(group)-525(\(level)-525(2\))-525(entered)-525(at)-525(line)-525(1)-525(\({\))]TJ 0 -11.96 TD[(###)-524(semi)-525(simple)-525(group)-525(\(level)-525(1\))-525(entered)-525(at)-525(line)-525(1)-525(\(\\begingroup\))]TJ 0 -11.95 TD[(###)-524(bottom)-525(level)]TJ 0 -11.95 TD[({leaving)-524(simple)-525(group)-525(\(level)-525(2\))-525(entered)-525(at)-525(line)-525(2})]TJ 0 -11.95 TD[({leaving)-524(semi)-525(simple)-525(group)-525(\(level)-525(1\))-525(entered)-525(at)-525(line)-525(1})]TJ/F4 9.96 Tf 4.48 -19.42 TD[(Occasionally)-378(conditionals)-378(and/or)-378(sa)27(v)28(e)-377(groups)-378(are)-378(not)-379(prop)-27(erly)-378(nested)-378(with)]TJ -14.94 -11.96 TD[(resp)-27(ect)-527(to)]TJ/F10 9.96 Tf 50.16 0 TD[(\\input)]TJ/F4 9.96 Tf 36.64 0.01 TD[(\214les.)-1026(Although)-527(this)-528(migh)27(t)-526(b)-28(e)-528(p)-27(erfectly)-528(legitimate,)-576(suc)27(h)]TJ -86.81 -11.96 TD[(anomalies)-341(are)-341(mostly)-342(unin)27(ten)28(tional)-341(and)-341(ma)27(y)-341(cause)-341(quite)-342(obscure)-341(errors.)-469(When)]TJ/F10 9.96 Tf 0 -11.96 TD[(\\tracingnesting)]TJ/F4 9.96 Tf 82.3 0 TD[(has)-386(a)-387(v)55(alue)-386(of)-386(1)-387(or)-386(more,)-400(these)-387(anomalies)-386(are)-387(sho)27(wn;)-412(when)]TJ/F10 9.96 Tf -82.3 -11.96 TD[(\\tracingnesting)]TJ/F4 9.96 Tf 82.11 0 TD[(has)-366(a)-366(v)54(alue)-365(of)-367(2)-366(or)-367(more,)-374(the)-367(curren)27(t)-366(con)27(text)-365(\(tracebac)27(k\))-366(is)]TJ -82.1 -11.96 TD[(sho)28(wn)-333(as)-333(w)27(ell.)-444(Th)27(us)-332(the)-334(input)]TJ 169.36 -29.89 TD[(5)]TJ ET
+endstream
+endobj
+65 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+>>
+endobj
+63 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 65 0 R
+>>
+endobj
+69 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 611.11
+/Ascent 694.44
+/Descent -222.22
+/FontBBox [-53 -314 584 786]
+/FontName /CWNHEJ+CMTT8
+/ItalicAngle 0
+/XHeight 430.6
+/StemV 80
+/FontFile 68 0 R
+/Flags 5
+>>
+endobj
+70 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F14
+/FontDescriptor 69 0 R
+/BaseFont /CWNHEJ+CMTT8
+/FirstChar 33
+/LastChar 255
+/Widths [531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 0 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531.26]
+>>
+endobj
+71 0 obj
+<<
+/Length 3993
+>>
+stream
+ 0.00 g 0.00 G BT/F10 9.96 Tf 77.46 -62.76 TD[(\\newlinechar=`\\^^J)]TJ 0 -11.96 TD[(\\begingroup)]TJ 15.69 -11.96 TD[(\\iftrue)]TJ 15.69 -11.96 TD[(\\scantokens{%)]TJ -15.69 -11.96 TD[(\\endgroup)]TJ -15.7 -11.96 TD[(^^J\\fi)]TJ 0 -11.95 TD[(^^J\\bgroup)]TJ 15.69 -11.96 TD[(^^\\tracingnesting=2)]TJ 0 -11.96 TD[(^^J\\iffalse)]TJ 0 -11.95 TD[(^^J\\else)]TJ 10.46 -11.95 TD[(}%)]TJ -15.69 -11.95 TD[(\\egroup)]TJ -10.45 -11.95 TD[(\\fi)]TJ/F4 9.96 Tf -15.69 -19.93 TD[(migh)28(t)-333(yield)]TJ/F9 6.97 Tf 49.25 3.62 TD[(3)]TJ/F10 9.96 Tf -49.25 -23.54 TD[(Warning:)-524(end)-525(of)-525(semi)-525(simple)-525(group)-525(\(level)-525(1\))-525(entered)-525(at)-525(line)-525(2)-525(of)]TJ 5.23 -11.96 TD[(a)-524(different)-525(file)]TJ -5.23 -11.95 TD[(Warning:)-524(end)-525(of)-525(\\iftrue)-525(entered)-525(on)-525(line)-525(3)-525(of)-525(a)-525(different)-525(file)]TJ 0 -11.95 TD[(Warning:)-524(end)-525(of)-525(file)-525(when)-525(simple)-525(group)-525(\(level)-525(1\))-525(entered)-525(at)-525(line)]TJ 5.23 -11.95 TD[(3)-524(is)-525(incomplete)]TJ -5.23 -11.96 TD[(Warning:)-524(end)-525(of)-525(file)-525(when)-525(\\iffalse\\else)-525(entered)-525(on)-525(line)-525(5)-525(is)-525(inc)]TJ 0 -11.95 TD[(omplete)]TJ -0.01 -11.97 TD[(l.7)-525(\\else)]TJ 0 -23.9 TD[(l.11)-3150(})]TJ 57.54 -11.96 TD[(%)]TJ/F4 9.96 Tf -42.59 -19.92 TD[(The)-284(command)]TJ/F10 9.96 Tf 64.89 0 TD[(\\showtokens{)]TJ/F5 9.96 Tf 62.76 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(tok)27(en)-332(list)]TJ/F5 9.96 Tf 40.46 0.01 TD[(i)]TJ/F10 9.96 Tf 3.87 0 TD[(})]TJ/F4 9.96 Tf 8.06 0 TD[(displa)27(ys)-284(the)-284(tok)27(en)-284(list,)-294(and)-285(allo)27(ws)]TJ -198.87 -11.96 TD[(the)-333(displa)27(y)-333(of)-333(quan)27(tities)-333(that)-333(cannot)-333(b)-28(e)-333(displa)26(y)28(ed)-332(b)27(y)]TJ/F10 9.96 Tf 233.46 0.01 TD[(\\show)]TJ/F4 9.96 Tf 29.48 0 TD[(or)]TJ/F10 9.96 Tf 12.2 -0.01 TD[(\\showthe)]TJ/F4 9.96 Tf 41.85 0.01 TD[(,)-333(e.g.:)]TJ/F10 9.96 Tf -306.52 -19.93 TD[(\\showtokens\\expandafter{\\jobname})]TJ 0.01 -11.96 TD[(\\showtokens\\expandafter{\\topmarks)-524(27})]TJ/F1 11.96 Tf -10.47 -27.89 TD[(3.4)-1125(Status)-375(Enquiries)]TJ/F4 9.96 Tf 0 -18.4 TD[(A)-357(n)27(um)27(b)-26(er)-358(of)-357(T)]TJ 64.68 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)-356(in)26(ternal)-356(quan)27(tities)-357(can)-357(b)-28(e)-357(assigned)-358(v)55(alues)-357(but)-357(these)-357(v)54(alues)]TJ -70.22 -11.95 TD[(cannot)-301(b)-28(e)-301(retriev)26(ed)-300(in)-301(T)]TJ 103.67 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X.)]TJ/F8 9.96 Tf 14.56 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-301(in)27(tro)-27(duces)-302(sev)27(eral)-300(new)-302(primitiv)27(es)-300(that)-302(allo)27(w)]TJ -142.79 -11.95 TD[(the)-333(retriev)55(al)-332(of)-334(information)-333(ab)-28(out)-333(its)-334(in)27(ternal)-332(state.)]TJ/F10 9.96 Tf 0 -11.95 TD[(\\eTeXversion)]TJ/F4 9.96 Tf 66.08 0 TD[(returns)]TJ/F8 9.96 Tf 34.42 0.01 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-333(\(ma)-56(jor\))-333(v)27(ersion)-333(n)27(um)28(b)-27(er;)]TJ/F10 9.96 Tf -119.54 -11.96 TD[(\\eTeXrevision)]TJ/F4 9.96 Tf 70.89 -0.01 TD[(expands)-291(in)27(to)-290(a)-291(list)-291(of)-291(c)26(haracter)-290(tok)27(ens)-290(represen)27(ting)-290(the)-291(revision)]TJ -70.89 -11.95 TD[(\(minor)-332(v)26(ersion\))-332(n)27(um)28(b)-27(er.)-445(Th)27(us)]TJ/F10 9.96 Tf 15.68 -19.92 TD[(\\message{\\number\\eTeXversion\\eTeXrevision})]TJ/F4 9.96 Tf -15.69 -19.93 TD[(should)-333(write)-333(the)-334(complete)-333(v)27(ersion)-333(as)-333(sho)27(wn)-333(when)]TJ/F8 9.96 Tf 218.63 0 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-333(is)-333(started.)]TJ ET 0.40 w 61.77 -583.62 m 199.25 -583.62 l S BT/F12 5.98 Tf 72.86 -590.26 TD[(3)]TJ/F13 7.97 Tf 4.15 -2.81 TD[(The)]TJ/F14 7.97 Tf 17.41 0.01 TD[(\\scantokens)]TJ/F13 7.97 Tf 49.4 -0.01 TD[(command)-354(will)-354(b)-29(e)-355(discussed)-354(later.)]TJ/F4 9.96 Tf 87.32 -37.56 TD[(6)]TJ ET
+endstream
+endobj
+72 0 obj
+<<
+/F10 37 0 R
+/F4 19 0 R
+/F9 34 0 R
+/F5 22 0 R
+/F1 10 0 R
+/F8 31 0 R
+/F12 42 0 R
+/F13 45 0 R
+/F14 70 0 R
+>>
+endobj
+67 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 72 0 R
+>>
+endobj
+75 0 obj
+<<
+/Length 5727
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(When)-361(used)-362(as)-362(n)27(um)28(b)-27(er,)]TJ/F10 9.96 Tf 104.29 -0.01 TD[(\\interactionmode)]TJ/F4 9.96 Tf 87.28 0 TD[(returns)-361(one)-362(of)-362(the)-361(v)54(alues)-361(0)-361(\(batc)26(h-)]TJ -191.58 -11.95 TD[(mo)-27(de\),)-368(1)-360(\(nonstopmo)-28(de\),)-367(2)-361(\(scrollmo)-28(de\),)-367(or)-360(3)-361(\(errorstopmo)-28(de\).)-526(Assigning)-360(one)]TJ 0 -11.96 TD[(of)-329(these)-330(v)54(alues)-328(to)]TJ/F10 9.96 Tf 78.57 0 TD[(\\interactionmode)]TJ/F4 9.96 Tf 86.96 0 TD[(c)27(hanges)-329(the)-329(curren)26(t)-328(in)26(teraction)-328(mo)-28(de)-330(ac-)]TJ -165.53 -11.95 TD[(cordingly;)-333(suc)27(h)-333(assignmen)27(ts)-332(are)-334(alw)27(a)28(ys)-332(global.)]TJ/F10 9.96 Tf 0.01 -11.96 TD[(\\currentgrouplevel)]TJ/F4 9.96 Tf 97.46 0 TD[(returns)-333(the)-333(curren)26(t)-332(sa)27(v)27(e)-332(group)-333(lev)27(el;)]TJ/F10 9.96 Tf -97.46 -11.96 TD[(\\currentgrouptype)]TJ/F4 9.96 Tf 92.77 0.01 TD[(returns)-387(a)-388(n)27(um)28(b)-27(er)-387(represen)27(ting)-387(the)-387(t)27(yp)-27(e)-387(of)-388(the)-387(innermost)]TJ -92.77 -11.96 TD[(group:)]TJ 19.93 -21.52 TD[(0:)-1000(b)-27(ottom)-334(lev)27(el)-332(\(no)-334(group\))-4500(9:)-1000(math)-333(group)]TJ 0 -11.96 TD[(1:)-1000(simple)-333(group)-8856(10:)-1000(disc)-333(group)]TJ 0.01 -11.96 TD[(2:)-999(h)27(b)-27(o)27(x)-333(group)-9527(11:)-1000(insert)-334(group)]TJ -0.01 -11.96 TD[(3:)-1000(adjusted)-333(h)27(b)-27(o)27(x)-333(group)-5494(12:)-1000(v)27(cen)28(ter)-333(group)]TJ 0 -11.95 TD[(4:)-1000(vb)-28(o)27(x)-332(group)-9528(13:)-1000(math)-333(c)27(hoice)-333(group)]TJ 0 -11.95 TD[(5:)-1000(vtop)-333(group)-9667(14:)-1000(semi)-333(simple)-334(group)]TJ 0.01 -11.95 TD[(6:)-999(align)-334(group)-9528(15:)-1000(math)-333(shift)-333(group)]TJ 0 -11.95 TD[(7:)-999(no)-334(align)-333(group)-8139(16:)-1000(math)-333(left)-334(group)]TJ 0 -11.95 TD[(8:)-999(output)-334(group)]TJ/F10 9.96 Tf -19.93 -33.48 TD[(\\currentiflevel)]TJ/F4 9.96 Tf 81.78 -0.01 TD[(returns)-333(the)-333(n)27(um)28(b)-27(er)-333(of)-334(curren)27(tly)-332(activ)26(e)-332(conditionals;)]TJ/F10 9.96 Tf -81.78 -11.95 TD[(\\currentifbranch)]TJ/F4 9.96 Tf 85.95 0 TD[(indicates)-227(whic)26(h)-226(branc)26(h)-226(of)-228(the)-228(innermost)-228(conditional)-228(is)-227(tak)26(en:)]TJ -85.95 -11.95 TD[(1)-333(`then)-333(branc)27(h',)]TJ/F5 9.96 Tf 72.25 -0.01 TD[(\200)]TJ/F4 9.96 Tf 7.75 0.01 TD[(1)-333(`else)-334(branc)27(h',)-332(or)-333(0)-334(not)-333(y)27(et)-333(decided;)]TJ/F10 9.96 Tf -80 -11.96 TD[(\\currentiftype)]TJ/F4 9.96 Tf 76.02 0 TD[(returns)-279(0)-281(if)-280(there)-280(are)-280(no)-280(activ)27(e)-279(conditionals,)-291(a)-280(p)-28(ositiv)27(e)-279(n)27(um)27(b)-26(er)]TJ -76.02 -11.96 TD[(indicating)-343(the)-344(t)27(yp)-27(e)-344(of)-344(the)-344(innermost)-343(activ)27(e)-343(conditional,)-347(or)-343(the)-344(negativ)27(e)-343(of)-344(that)]TJ 0 -11.95 TD[(n)27(um)28(b)-27(er)-334(when)-333(the)-333(conditional)-334(w)27(as)-332(pre\214xed)-333(b)26(y)]TJ/F10 9.96 Tf 201.86 -0.01 TD[(\\unless)]TJ/F4 9.96 Tf 36.62 0.01 TD[(:)]TJ -218.54 -21.53 TD[(1:)]TJ/F10 9.96 Tf 17.71 0.01 TD[(\\if)]TJ/F4 9.96 Tf 86.67 -0.01 TD[(8:)]TJ/F10 9.96 Tf 17.71 0.01 TD[(\\ifmmode)]TJ/F4 9.96 Tf 81.69 0 TD[(15:)]TJ/F10 9.96 Tf 22.69 -0.01 TD[(\\iftrue)]TJ/F4 9.96 Tf -226.49 -11.95 TD[(2:)]TJ/F10 9.96 Tf 17.71 -0.01 TD[(\\ifcat)]TJ/F4 9.96 Tf 86.68 0.01 TD[(9:)]TJ/F10 9.96 Tf 17.71 -0.01 TD[(\\ifinner)]TJ/F4 9.96 Tf 81.69 0.01 TD[(16:)]TJ/F10 9.96 Tf 22.7 -0.01 TD[(\\iffalse)]TJ/F4 9.96 Tf -226.48 -11.95 TD[(3:)]TJ/F10 9.96 Tf 17.71 -0.01 TD[(\\ifnum)]TJ/F4 9.96 Tf 81.69 0.01 TD[(10:)]TJ/F10 9.96 Tf 22.68 -0.01 TD[(\\ifvoid)]TJ/F4 9.96 Tf 81.7 0.01 TD[(17:)]TJ/F10 9.96 Tf 22.69 -0.01 TD[(\\ifcase)]TJ/F4 9.96 Tf -226.48 -11.95 TD[(4:)]TJ/F10 9.96 Tf 17.71 0 TD[(\\ifdim)]TJ/F4 9.96 Tf 81.69 0 TD[(11:)]TJ/F10 9.96 Tf 22.69 0 TD[(\\ifhbox)]TJ/F4 9.96 Tf 81.7 -0.01 TD[(18:)]TJ/F10 9.96 Tf 22.69 0.01 TD[(\\ifdefined)]TJ/F4 9.96 Tf -226.49 -11.96 TD[(5:)]TJ/F10 9.96 Tf 17.72 -0.01 TD[(\\ifodd)]TJ/F4 9.96 Tf 81.69 0 TD[(12:)]TJ/F10 9.96 Tf 22.68 0.01 TD[(\\ifvbox)]TJ/F4 9.96 Tf 81.7 -0.01 TD[(19:)]TJ/F10 9.96 Tf 22.69 0 TD[(\\ifcsname)]TJ/F4 9.96 Tf -226.48 -11.95 TD[(6:)]TJ/F10 9.96 Tf 17.72 -0.01 TD[(\\ifvmode)]TJ/F4 9.96 Tf 81.69 0.01 TD[(13:)]TJ/F10 9.96 Tf 22.69 -0.01 TD[(\\ifx)]TJ/F4 9.96 Tf 81.69 0.01 TD[(20:)]TJ/F10 9.96 Tf 22.7 -0.01 TD[(\\iffontchar)]TJ/F4 9.96 Tf -226.48 -11.95 TD[(7:)]TJ/F10 9.96 Tf 17.71 0 TD[(\\ifhmode)]TJ/F4 9.96 Tf 81.69 0 TD[(14:)]TJ/F10 9.96 Tf 22.7 0.01 TD[(\\ifeof)]TJ -142.02 -33.48 TD[(\\lastnodetype)]TJ/F4 9.96 Tf 71.85 0 TD[(returns)-387(a)-386(n)26(um)28(b)-27(er)-387(indicating)-386(the)-387(t)27(yp)-27(e)-387(of)-387(the)-387(last)-387(no)-27(de,)-401(if)-386(an)26(y)84(,)]TJ -71.84 -11.96 TD[(on)-332(the)-334(curren)27(t)-332(\(v)26(ertical,)-332(horizon)27(tal,)-332(or)-334(math\))-333(list:)]TJ 19.92 -21.52 TD[(-1:)-999(none)-334(\(empt)27(y)-332(list\))-4500(8:)-1000(disc)-333(no)-28(de)]TJ 3.32 -11.95 TD[(0:)-999(c)27(har)-333(no)-27(de)-7781(9:)-1000(whatsit)-333(no)-28(de)]TJ -0.01 -11.95 TD[(1:)-1000(hlist)-333(no)-28(de)-7250(10:)-1000(math)-333(no)-28(de)]TJ 0 -11.96 TD[(2:)-1000(vlist)-333(no)-28(de)-7278(11:)-1000(glue)-333(no)-28(de)]TJ 0.01 -11.95 TD[(3:)-999(rule)-333(no)-28(de)-7475(12:)-1000(k)27(ern)-333(no)-28(de)]TJ -0.01 -11.96 TD[(4:)-1000(ins)-333(no)-28(de)-7916(13:)-1000(p)-28(enalt)27(y)-333(no)-28(de)]TJ 0 -11.96 TD[(5:)-1000(mark)-333(no)-28(de)-6892(14:)-1000(unset)-333(no)-28(de)]TJ 0.01 -11.95 TD[(6:)-999(adjust)-334(no)-27(de)-6445(15:)-1000(math)-333(mo)-28(de)-333(no)-28(des)]TJ -0.01 -11.95 TD[(7:)-1000(ligature)-333(no)-28(de)]TJ 146.13 -29.88 TD[(7)]TJ ET
+endstream
+endobj
+76 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F5 22 0 R
+>>
+endobj
+74 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 76 0 R
+>>
+endobj
+79 0 obj
+<<
+/Length 9171
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -74.72 TD[(The)-424(commands)]TJ/F10 9.96 Tf 71.61 0 TD[(\\fontcharht)]TJ/F4 9.96 Tf 57.54 0 TD[(,)]TJ/F10 9.96 Tf 7.22 0 TD[(\\fontcharwd)]TJ/F4 9.96 Tf 57.53 0 TD[(,)]TJ/F10 9.96 Tf 7.24 0.01 TD[(\\fontchardp)]TJ/F4 9.96 Tf 57.53 -0.01 TD[(,)-447(and)]TJ/F10 9.96 Tf 27.5 0.01 TD[(\\fontcharic)]TJ/F4 9.96 Tf -286.18 -11.96 TD[(follo)27(w)28(ed)-373(b)27(y)-372(a)-374(fon)27(t)-373(sp)-28(eci\214cation)-373(and)-374(a)-373(c)27(haracter)-373(co)-28(de,)-383(return)-374(a)-374(dimension:)-525(the)]TJ 0 -11.96 TD[(heigh)27(t,)-436(width,)-436(depth,)-437(or)-416(italic)-416(correction)-416(of)-416(the)-416(c)26(haracter)-415(in)-416(the)-416(fon)27(t,)-436(or)]TJ/F10 9.96 Tf 328.02 -0.01 TD[(0pt)]TJ/F4 9.96 Tf -328.02 -11.95 TD[(if)-369(no)-368(suc)26(h)-367(c)26(haracter)-367(exists;)-387(the)-369(conditional)]TJ/F10 9.96 Tf 190.51 -0.01 TD[(\\iffontchar)]TJ/F4 9.96 Tf 61.21 0.01 TD[(tests)-368(the)-369(existence)-369(of)]TJ -251.72 -11.96 TD[(that)-333(c)27(haracter.)]TJ -0.01 -11.95 TD[(When)-402(used)-403(as)-402(n)26(um)28(b)-27(er,)]TJ/F10 9.96 Tf 106.02 0.01 TD[(\\parshape)]TJ/F4 9.96 Tf 51.09 -0.01 TD[(returns)-402(the)-402(n)27(um)27(b)-26(er)-403(of)-402(lines)-403(of)-402(the)-403(curren)27(t)]TJ -157.1 -11.95 TD[(parshap)-27(e)-333(sp)-28(eci\214cation)-333(\(or)-334(zero\).)]TJ/F8 9.96 Tf -0.01 -11.96 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)]TJ/F10 9.96 Tf 18.24 0.01 TD[(\\parshapeindent)]TJ/F4 9.96 Tf 78.46 -0.01 TD[(,)]TJ/F10 9.96 Tf 7.01 0.01 TD[(\\parshapelength)]TJ/F4 9.96 Tf 78.46 0 TD[(,)-426(and)]TJ/F10 9.96 Tf 27.13 0 TD[(\\parshapedimen)]TJ/F4 9.96 Tf 73.22 -0.01 TD[(,)-426(follo)27(w)27(ed)]TJ -301.54 -11.95 TD[(b)28(y)-333(a)-333(n)27(um)28(b)-27(er)]TJ/F8 9.96 Tf 58.41 0 TD[(n)]TJ/F4 9.96 Tf 9.3 0 TD[(return)-333(the)-333(dimensions)-334(of)-333(the)-333(parshap)-28(e)-333(sp)-28(eci\214cation:)]TJ/F10 9.96 Tf -67.72 -11.96 TD[(0pt)]TJ/F4 9.96 Tf 20.68 0.01 TD[(for)]TJ/F8 9.96 Tf 15.24 -0.01 TD[(n)]TJ/F5 9.96 Tf 8.76 0 TD[(\224)]TJ/F4 9.96 Tf 10.51 0.01 TD[(0)-333(or)-333(when)-334(no)-333(parshap)-28(e)-333(is)-333(curren)26(tly)-332(activ)27(e,)-332(otherwise)]TJ/F10 9.96 Tf -55.18 -11.96 TD[(\\parshapeindent)]TJ/F8 9.96 Tf 80.11 -0.01 TD[(n)]TJ/F4 9.96 Tf 8.98 0.01 TD[(and)]TJ/F10 9.96 Tf 19.06 0 TD[(\\parshapedimen)]TJ/F4 9.96 Tf 74.89 0 TD[(2)]TJ/F8 9.96 Tf 4.99 -0.01 TD[(n)]TJ/F5 9.96 Tf 7.57 0 TD[(\200)]TJ/F4 9.96 Tf 9.32 0.01 TD[(1)-302(b)-27(oth)-302(return)-302(the)-302(inden)27(tation)-301(of)]TJ -204.92 -11.96 TD[(line)]TJ/F8 9.96 Tf 18.83 -0.01 TD[(n)]TJ/F4 9.96 Tf 9.3 0.01 TD[(\(explicitly)-332(sp)-28(eci\214ed)-334(or)-333(implied)-333(b)27(y)-333(rep)-28(eating)-333(the)-333(last)-334(sp)-27(eci\214cation\),)]TJ/F10 9.96 Tf -28.13 -11.96 TD[(\\parshapelength)]TJ/F8 9.96 Tf 80.12 0 TD[(n)]TJ/F4 9.96 Tf 9.3 0 TD[(and)]TJ/F10 9.96 Tf 19.38 -0.01 TD[(\\parshapedimen)]TJ/F4 9.96 Tf 74.88 0 TD[(2)]TJ/F8 9.96 Tf 4.98 0 TD[(n)]TJ/F4 9.96 Tf 9.3 0 TD[(b)-28(oth)-333(return)-333(the)-334(length)-333(of)-333(line)]TJ/F8 9.96 Tf 131.79 0.01 TD[(n)]TJ/F4 9.96 Tf 5.98 0 TD[(.)]TJ/F1 11.96 Tf -335.71 -27.9 TD[(3.5)-1124(Expressions)]TJ/F8 9.96 Tf 0 -18.38 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-470(in)27(tro)-27(duces)-470(the)-471(notion)-470(of)-471(expressions)-470(of)-471(t)27(yp)-27(e)-470(n)27(um)27(b)-26(er,)-505(dimen,)-505(glue,)-505(or)]TJ -19.04 -11.95 TD[(m)27(uglue,)-456(that)-433(can)-432(b)-28(e)-433(used)-432(whenev)26(er)-431(a)-433(quan)27(tit)28(y)-432(of)-432(that)-433(t)27(yp)-27(e)-433(is)-432(needed.)-742(Suc)26(h)]TJ 0 -11.95 TD[(expressions)-289(are)-289(ev)54(aluated)-288(b)27(y)]TJ/F8 9.96 Tf 125.22 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)-289(scanning)-290(mec)27(hanism;)-303(they)-289(are)-290(initiated)-289(b)27(y)]TJ -144.25 -11.95 TD[(one)-338(of)-339(the)-338(commands)]TJ/F10 9.96 Tf 96.29 0.01 TD[(\\numexpr)]TJ/F4 9.96 Tf 41.85 0 TD[(,)]TJ/F10 9.96 Tf 6.15 0 TD[(\\dimexpr)]TJ/F4 9.96 Tf 41.83 -0.01 TD[(,)]TJ/F10 9.96 Tf 6.16 0.01 TD[(\\glueexpr)]TJ/F4 9.96 Tf 47.07 -0.01 TD[(,)-340(or)]TJ/F10 9.96 Tf 18.41 0.01 TD[(\\muexpr)]TJ/F4 9.96 Tf 39.99 -0.01 TD[(\(determin-)]TJ -297.74 -11.95 TD[(ing)-301(the)-302(t)27(yp)-27(e)]TJ/F8 9.96 Tf 55.23 0.01 TD[(t)]TJ/F4 9.96 Tf 3.6 0 TD[(\))-301(and)-302(optionally)-301(terminated)-302(b)27(y)-301(one)]TJ/F10 9.96 Tf 154.49 0 TD[(\\relax)]TJ/F4 9.96 Tf 34.39 0 TD[(\(that)-301(will)-301(b)-28(e)-302(absorb)-28(ed)]TJ -247.72 -11.96 TD[(b)28(y)-398(the)-399(scanning)-399(mec)27(hanism\).)-640(An)-399(expression)-398(consists)-399(of)-399(one)-399(or)-399(more)-398(terms)-399(of)]TJ -0.01 -11.96 TD[(the)-366(same)-366(t)26(yp)-26(e)-367(to)-366(b)-28(e)-366(added)-366(or)-367(subtracted;)-383(a)-366(term)-366(of)-367(t)27(yp)-27(e)]TJ/F8 9.96 Tf 253.93 0 TD[(t)]TJ/F4 9.96 Tf 7.24 -0.01 TD[(consists)-366(of)-366(a)-367(factor)]TJ -261.16 -11.95 TD[(of)-341(that)-341(t)27(yp)-27(e,)-344(optionally)-342(m)27(ultiplied)-340(and/or)-342(divided)-342(b)27(y)-340(n)26(umeric)-340(factors;)-346(\214nally)-342(a)]TJ -0.01 -11.96 TD[(factor)-352(of)-353(t)27(yp)-27(e)]TJ/F8 9.96 Tf 62.88 0 TD[(t)]TJ/F4 9.96 Tf 7.11 0.01 TD[(is)-352(either)-353(a)-352(paren)26(thesized)-351(sub)-28(expression)-353(or)-353(a)-352(quan)26(tit)28(y)-352(\(n)27(um)28(b)-27(er,)]TJ -70 -11.96 TD[(etc.\))-444(of)-334(that)-333(t)27(yp)-27(e.)-444(Th)26(us,)-332(the)-333(conditional)]TJ/F10 9.96 Tf 10.47 -19.93 TD[(\\ifdim\\dimexpr)-524(\(2pt-5pt\)*\\numexpr)-525(3-3*13/5\\relax)-525(+)-525(34pt/2<\\wd20)]TJ/F4 9.96 Tf -10.47 -19.92 TD[(is)-310(true)-309(if)-310(and)-310(only)-309(if)-310(the)-310(width)-310(of)-309(b)-28(o)27(x)-309(20)-310(exceeds)-309(32)]TJ/F10 9.96 Tf 224.25 0.01 TD[(pt)]TJ/F4 9.96 Tf 12.12 -0.01 TD[(.)-436(Note)-310(the)-309(use)-310(of)]TJ/F10 9.96 Tf 75.97 0 TD[(\\relax)]TJ/F4 9.96 Tf -312.34 -11.95 TD[(to)-446(terminate)-445(the)-446(inner)-445(\(n)27(umeric\))-445(expression,)-473(the)-446(outer)-445(\(dimen\))-446(expression)-446(is)]TJ 0.01 -11.95 TD[(terminated)-318(automatically)-319(b)26(y)-318(the)-319(tok)27(en)]TJ/F10 9.96 Tf 171.17 -0.01 TD[(<)]TJ/F9 6.97 Tf 5.23 -1.49 TD[(12)]TJ/F4 9.96 Tf 11.61 1.49 TD[(that)-319(do)-28(es)-318(not)-319(\214t)-319(in)26(to)-318(the)-319(expression)]TJ -188.01 -11.96 TD[(syn)27(tax.)]TJ 14.94 -11.96 TD[(The)-446(arithmetic)-447(p)-28(erformed)-446(b)26(y)]TJ/F8 9.96 Tf 134.67 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X's)-446(expressions)-446(do)-28(es)-447(not)-447(do)-446(m)26(uc)28(h)-446(that)]TJ -168.66 -11.96 TD[(could)-389(not)-389(b)-28(e)-389(done)-389(b)27(y)-389(T)]TJ 103.8 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-388(arithmetic)-390(op)-27(erations)]TJ/F10 9.96 Tf 115.85 0.01 TD[(\\advance)]TJ/F4 9.96 Tf 41.84 0 TD[(,)]TJ/F10 9.96 Tf 6.78 -0.01 TD[(\\multiply)]TJ/F4 9.96 Tf 47.07 0 TD[(,)-402(and)]TJ/F10 9.96 Tf -320.88 -11.95 TD[(\\divide)]TJ/F4 9.96 Tf 36.61 0.01 TD[(,)-301(although)-293(there)-294(are)-293(some)-293(notable)-294(di\213erences:)-424(Eac)26(h)-292(factor)-293(is)-294(c)27(hec)28(k)27(ed)-292(to)]TJ -36.61 -11.96 TD[(b)-27(e)-258(in)-259(the)-258(allo)27(w)28(ed)-258(range,)-273(n)27(um)27(b)-26(ers)-259(m)27(ust)-257(b)-28(e)-258(less)-259(than)-258(2)]TJ/F9 6.97 Tf 225.41 3.61 TD[(31)]TJ/F4 9.96 Tf 11.02 -3.62 TD[(in)-258(absolute)-258(v)55(alue,)-273(dimen-)]TJ -236.44 -11.96 TD[(sions)-343(or)-343(glue)-344(comp)-27(onen)26(ts)-342(m)27(ust)-343(b)-27(e)-344(less)-343(than)-343(2)]TJ/F9 6.97 Tf 198.2 3.62 TD[(14)]TJ/F10 9.96 Tf 10.1 -3.62 TD[(pt)]TJ/F4 9.96 Tf 12.12 0 TD[(,)]TJ/F10 9.96 Tf 7.87 0.01 TD[(mu)]TJ/F4 9.96 Tf 12.13 0 TD[(,)]TJ/F10 9.96 Tf 7.87 0 TD[(fil)]TJ/F4 9.96 Tf 17.35 0 TD[(,)-345(etc.)-344(resp)-28(ectiv)27(ely)84(.)]TJ -265.64 -11.96 TD[(The)-257(arithmetic)-257(op)-28(erations)-257(are)-257(p)-28(erformed)-257(individually)82(,)-272(except)-257(for)-257(`scaling')-257(op)-28(era-)]TJ 0 -11.96 TD[(tions)-289(\(a)-290(m)27(ultiplication)-289(immediately)-290(follo)27(w)28(ed)-289(b)27(y)-289(a)-290(division\))-289(whic)27(h)-289(are)-290(p)-28(erformed)]TJ 0 -11.95 TD[(as)-411(one)-411(com)27(bined)-410(op)-27(eration)-411(with)-411(a)-411(64-bit)-411(pro)-28(duct)-411(as)-411(in)27(termediate)-410(v)55(alue.)-676(The)]TJ 0.01 -11.95 TD[(result)-301(of)-301(eac)26(h)-300(op)-28(eration)-302(is)-301(again)-302(c)27(hec)28(k)27(ed)-300(to)-302(b)-28(e)-301(in)-302(the)-302(allo)27(w)28(ed)-301(range.)-434(Finally)-301(the)]TJ -0.01 -11.96 TD[(results)-294(of)-295(divisions)-295(and)-295(scalings)-295(are)-294(rounded,)-303(whereas)-295(T)]TJ 238.27 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)]TJ/F10 9.96 Tf 17.11 0 TD[(\\divide)]TJ/F4 9.96 Tf 39.56 0.01 TD[(truncates.)]TJ -285.52 -11.96 TD[(The)-399(imp)-27(ortan)26(t)-398(new)-399(feature)-399(is,)-415(ho)27(w)28(ev)27(er,)-414(that)-399(the)-399(ev)55(aluation)-398(of)-399(expressions)]TJ -14.94 -11.95 TD[(do)-27(es)-354(not)-354(in)27(v)28(olv)28(e)-353(assignmen)27(ts)-353(and)-353(can)-354(therefore)-354(b)-27(e)-354(p)-28(erformed)-353(in)-354(circumstances)]TJ 169.37 -39.4 TD[(8)]TJ ET
+endstream
+endobj
+80 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F8 31 0 R
+/F5 22 0 R
+/F1 10 0 R
+/F9 34 0 R
+>>
+endobj
+78 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 80 0 R
+>>
+endobj
+83 0 obj
+<<
+/Length 7606
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(where)-363(assignmen)27(ts)-362(are)-363(not)-363(allo)26(w)28(ed,)-370(e.g.,)-370(inside)-363(an)]TJ/F10 9.96 Tf 222.26 -0.01 TD[(\\edef)]TJ/F4 9.96 Tf 29.77 0 TD[(or)]TJ/F10 9.96 Tf 12.5 0 TD[(\\write)]TJ/F4 9.96 Tf 31.38 0.01 TD[(.)-534(This)-363(also)]TJ -295.91 -11.96 TD[(allo)27(ws)-332(the)-334(de\214nition)-333(of)-333(purely)-334(expandable)-333(lo)-28(op)-333(constructions:)]TJ/F10 9.96 Tf 10.46 -19.93 TD[(\\def\\foo#1#2{\\number#1)]TJ 10.47 -11.96 TD[(\\ifnum#1<#2,)]TJ 10.46 -11.95 TD[(\\expandafter\\foo)]TJ 0 -11.96 TD[(\\expandafter{\\number\\numexpr#1+1\\expandafter}%)]TJ 0 -11.96 TD[(\\expandafter{\\number#2\\expandafter}%)]TJ -10.46 -11.96 TD[(\\fi})]TJ/F4 9.96 Tf -20.92 -19.93 TD[(suc)27(h)-332(that,)-334(e.g.,)-333(`)]TJ/F10 9.96 Tf 70.63 0 TD[(\\foo{7}{13})]TJ/F4 9.96 Tf 57.53 -0.01 TD[(')-333(expands)-334(in)27(to)-332(`)]TJ/F10 9.96 Tf 67.59 0.01 TD[(7,)-524(8,)-525(9,)-525(10,)-525(11,)-525(12,)-525(13)]TJ/F4 9.96 Tf 120.29 0 TD[('.)]TJ -301.09 -11.96 TD[(The)-464(commands)]TJ/F10 9.96 Tf 72.4 -0.01 TD[(\\gluestretch)]TJ/F4 9.96 Tf 67.39 0 TD[(and)]TJ/F10 9.96 Tf 20.68 0 TD[(\\glueshrink)]TJ/F4 9.96 Tf 62.15 0 TD[(are)-463(to)-464(b)-28(e)-464(follo)27(w)28(ed)-463(b)27(y)-463(a)]TJ -237.56 -11.95 TD[(glue)-413(sp)-28(eci\214cation)-414(and)-413(return)-414(the)-413(stretc)26(h)-412(or)-414(shrink)-414(comp)-27(onen)26(t)-412(of)-414(that)-414(glue)-413(as)]TJ 0 -11.95 TD[(dimensions)-249(\(with)]TJ/F10 9.96 Tf 77.59 0 TD[(fil)]TJ/F4 9.96 Tf 19.84 0 TD[(etc.)-249(replaced)-250(b)27(y)]TJ/F10 9.96 Tf 71.14 -0.01 TD[(pt)]TJ/F4 9.96 Tf 12.11 0.01 TD[(\),)-266(the)-250(commands)]TJ/F10 9.96 Tf 74.11 -0.01 TD[(\\gluestretchorder)]TJ/F4 9.96 Tf -254.8 -11.95 TD[(and)]TJ/F10 9.96 Tf 19.48 -0.01 TD[(\\glueshrinkorder)]TJ/F4 9.96 Tf 87.12 0.01 TD[(return)-344(the)-345(order)-345(of)-345(in\214nit)27(y:)-467(0)-344(for)]TJ/F10 9.96 Tf 149.39 -0.01 TD[(pt)]TJ/F4 9.96 Tf 12.12 0 TD[(,)-347(1)-345(for)]TJ/F10 9.96 Tf 31.67 0.01 TD[(fil)]TJ/F4 9.96 Tf 17.36 -0.01 TD[(,)-347(2)-344(for)]TJ/F10 9.96 Tf -317.15 -11.95 TD[(fill)]TJ/F4 9.96 Tf 22.59 0.01 TD[(,)-333(and)-333(3)-334(for)]TJ/F10 9.96 Tf 50.67 -0.01 TD[(filll)]TJ/F4 9.96 Tf 27.82 0 TD[(.)]TJ -86.13 -11.95 TD[(The)-248(commands)]TJ/F10 9.96 Tf 68.11 0 TD[(\\gluetomu)]TJ/F4 9.96 Tf 49.54 0 TD[(and)]TJ/F10 9.96 Tf 18.53 0 TD[(\\mutoglue)]TJ/F4 9.96 Tf 49.55 0 TD[(con)27(v)28(ert)-248(glue)-248(in)26(to)-247(m)27(uglue)-248(and)-249(vice)]TJ -200.68 -11.95 TD[(v)27(ersa)-338(b)27(y)-338(simply)-339(equating)-339(1)]TJ/F10 9.96 Tf 118.81 0 TD[(pt)]TJ/F4 9.96 Tf 15.5 -0.01 TD[(with)-338(1)]TJ/F10 9.96 Tf 29.38 0.01 TD[(mu)]TJ/F4 9.96 Tf 12.12 0 TD[(,)-340(precisely)-339(what)-339(T)]TJ 77.48 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-338(do)-28(es)-338(\(in)-339(addition)]TJ -258.82 -11.95 TD[(to)-333(an)-333(error)-334(message\))-333(when)-333(the)-334(wrong)-333(kind)-333(of)-334(glue)-333(is)-333(used.)]TJ/F1 11.96 Tf 0.01 -27.88 TD[(3.6)-1124(Additional)-375(Registers)-375(and)-375(Marks)]TJ/F8 9.96 Tf -0.01 -18.4 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-244(increases)-245(the)-245(n)27(um)27(b)-26(er)-245(of)-245(T)]TJ 118.36 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-244(coun)26(t,)-261(dimen,)-263(skip,)-263(m)27(uskip,)-261(b)-28(o)27(x,)-262(and)-245(tok)27(en)]TJ -142.93 -11.95 TD[(registers)-291(from)-291(256)-292(to)-292(32768.)-430(The)-292(additional)-292(registers,)-300(n)27(um)28(b)-27(ered)-291(256{32767,)-300(can)]TJ -0.01 -11.96 TD[(b)-27(e)-344(used)-344(exactly)-344(as)-343(the)-344(\214rst)-344(256,)-346(except)-344(that)-343(they)-344(can)-344(not)-344(b)-27(e)-344(used)-344(for)-343(insertion)]TJ 0 -11.95 TD[(classes.)]TJ 14.95 -11.96 TD[(As)-381(in)-382(T)]TJ 32.84 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X,)-393(the)-382(\214rst)-382(256)-382(registers)-382(of)-382(eac)27(h)-381(kind)-382(are)-382(realized)-381(as)-382(static)-382(arra)27(ys)]TJ -53.33 -11.95 TD[(that)-427(are)-426(part)-427(of)-427(the)-427(`table)-427(of)-426(equiv)54(alen)28(ts';)-473(v)55(alues)-426(to)-427(b)-28(e)-426(restored)-427(when)-427(a)-427(sa)27(v)28(e)]TJ 0.01 -11.95 TD[(group)-353(ends)-354(are)-354(k)27(ept)-354(on)-354(the)-354(sa)27(v)28(e)-353(stac)27(k.)-506(The)-354(additional)-354(registers)-354(are)-354(realized)-354(as)]TJ -0.01 -11.96 TD[(sparse)-441(arra)26(ys)-441(built)-442(from)-441(T)]TJ 117.24 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-441(main)-442(memory)-442(and)-442(are)-442(therefore)-442(less)-442(e\216cien)27(t.)]TJ -122.77 -11.96 TD[(They)-369(use)-369(a)-370(four-lev)27(el)-368(index)-370(structure)-369(and)-370(individual)-369(registers)-370(are)-369(presen)27(t)-369(only)]TJ 0 -11.95 TD[(when)-469(needed.)-852(V)82(alues)-469(to)-469(b)-28(e)-469(restored)-470(when)-469(a)-470(particular)-469(sa)27(v)28(e)-469(group)-469(ends)-470(are)]TJ -0.01 -11.96 TD[(k)27(ept)-333(in)-333(a)-334(link)27(ed)-332(list)-334(\(again)-334(built)-333(from)-334(main)-333(memory\))-334(with)-333(one)-334(sa)27(v)28(e)-333(stac)27(k)-332(en)26(try)]TJ 0.01 -11.96 TD[(p)-27(oin)27(ting)-333(to)-333(that)-333(list.)]TJ/F9 6.97 Tf 89.16 3.61 TD[(4)]TJ/F8 9.96 Tf -74.21 -21.55 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-357(generalizes)-357(T)]TJ 66.7 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-357(mark)-357(concept)-357(to)-357(mark)-358(classes)-357(0{32767,)-363(with)-357(mark)]TJ -106.21 -11.96 TD[(class)-333(0)-333(used)-333(for)-334(T)]TJ 75.19 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)-332(marks.)]TJ -80.73 -11.95 TD[(The)-375(command)]TJ/F10 9.96 Tf 66.7 0 TD[(\\marks)]TJ/F4 9.96 Tf 35.11 0 TD[(follo)27(w)28(ed)-375(b)27(y)-374(a)-376(mark)-375(class)]TJ/F8 9.96 Tf 111.83 0 TD[(n)]TJ/F4 9.96 Tf 9.71 -0.01 TD[(and)-375(a)-376(mark)-375(text)-375(app)-28(ends)-375(a)]TJ -223.36 -11.95 TD[(mark)-387(no)-27(de)-388(to)-387(the)-387(curren)27(t)-386(list;)]TJ/F10 9.96 Tf 136.74 0 TD[(\\marks0)]TJ/F4 9.96 Tf 40.46 0.01 TD[(is)-387(synon)27(ymous)-387(with)]TJ/F10 9.96 Tf 90.62 0 TD[(\\mark)]TJ/F4 9.96 Tf 26.15 -0.01 TD[(.)-605(The)-387(page)]TJ -293.97 -11.95 TD[(builder)-408(and)-408(the)]TJ/F10 9.96 Tf 72.56 0.01 TD[(\\vsplit)]TJ/F4 9.96 Tf 40.67 0 TD[(command)-408(record)-409(information)-408(ab)-28(out)-408(the)-408(mark)-409(no)-27(des)]TJ -113.23 -11.96 TD[(found)-238(on)-239(the)-239(page)-239(or)-239(b)-28(o)27(x)-238(pro)-28(duced,)-258(separately)-239(for)-239(eac)27(h)-238(mark)-239(class.)-413(The)-239(informa-)]TJ -0.01 -11.96 TD[(tion)-259(for)-259(mark)-260(class)-259(0)-259(is)-259(k)26(ept)-258(in)-259(a)-259(small)-260(static)-259(arra)27(y)-258(as)-260(in)-259(T)]TJ 243.61 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X,)-273(the)-260(information)-259(for)]TJ -249.15 -11.96 TD[(the)-344(additional)-343(mark)-344(classes)-343(is)-344(again)-344(k)27(ept)-342(in)-344(a)-343(sparse)-344(arra)27(y)-343(with)-343(en)26(tries)-342(presen)26(t)]TJ 0.01 -11.95 TD[(only)-333(when)-333(needed.)]TJ 0 -11.95 TD[(The)-367(command)]TJ/F10 9.96 Tf 66.54 -0.01 TD[(\\firstmarks)]TJ/F8 9.96 Tf 59.2 0 TD[(n)]TJ/F4 9.96 Tf 9.63 0.01 TD[(expands)-367(to)-367(the)-368(mark)-367(text)-367(for)-368(mark)-367(class)]TJ/F8 9.96 Tf 181.46 -0.01 TD[(n)]TJ/F4 9.96 Tf 9.64 0.01 TD[(\214rst)]TJ ET 0.40 w 61.77 -581.42 m 199.25 -581.42 l S BT/F12 5.98 Tf 72.86 -588.06 TD[(4)]TJ/F13 7.97 Tf 4.15 -2.81 TD[(With)-331(the)-332(e\213ect)-331(that)-331(the)-332(order)-331(of)-332(restoring)-331(\(or)-332(discarding\))-331(sa)28(v)30(ed)-330(v)58(alues)-331(ma)29(y)-331(b)-29(e)-332(somewhat)]TJ -15.24 -9.46 TD[(surprising.)]TJ/F4 9.96 Tf 169.37 -30.3 TD[(9)]TJ ET
+endstream
+endobj
+84 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F1 10 0 R
+/F8 31 0 R
+/F9 34 0 R
+/F12 42 0 R
+/F13 45 0 R
+>>
+endobj
+82 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 84 0 R
+>>
+endobj
+87 0 obj
+<<
+/Length 7132
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(encoun)27(tered)-330(on)-332(the)-332(most)-332(recen)27(t)-331(page,)-332(etc.,)-332(and)-332(again)]TJ/F10 9.96 Tf 234.1 -0.01 TD[(\\firstmarks0)]TJ/F4 9.96 Tf 66.06 0 TD[(is)-331(synon)27(y-)]TJ -300.17 -11.95 TD[(mous)-333(with)]TJ/F10 9.96 Tf 48.77 0 TD[(\\firstmark)]TJ/F4 9.96 Tf 52.3 -0.01 TD[(.)]TJ/F1 11.96 Tf -101.07 -27.81 TD[(3.7)-1124(Input)-375(Handling)]TJ/F4 9.96 Tf -0.01 -18.38 TD[(The)-311(command)]TJ/F10 9.96 Tf 65.43 -0.01 TD[(\\readline)]TJ/F5 9.96 Tf 47.07 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 -0.01 TD[(i)]TJ/F10 9.96 Tf 5.54 0.01 TD[(to)]TJ/F5 9.96 Tf 12.12 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(con)27(trol)-332(sequence)]TJ/F5 9.96 Tf 71.49 0 TD[(i)]TJ/F4 9.96 Tf 6.97 0 TD[(de\214nes)-311(the)-311(con)27(trol)-310(se-)]TJ -249.31 -11.95 TD[(quence)-409(as)-411(parameterless)-410(macro)-410(whose)-410(replacemen)27(t)-409(text)-410(is)-410(the)-410(con)26(ten)28(ts)-409(of)-410(the)]TJ 0 -11.95 TD[(next)-333(line)-335(read)-334(from)-334(the)-334(designated)-334(\214le,)-335(as)-334(for)]TJ/F10 9.96 Tf 199.8 -0.01 TD[(\\read)]TJ/F4 9.96 Tf 26.14 0 TD[(.)-447(The)-334(di\213erence)-334(is)-334(that)-335(the)]TJ -225.95 -11.95 TD[(curren)27(t)-311(category)-313(co)-27(des)-313(are)-312(ignored)-312(and)-312(all)-313(c)27(haracters)-311(on)-312(that)-313(line)-312(\(including)-312(an)]TJ 0.01 -11.96 TD[(endline)-319(c)27(haracter\))-318(are)-320(con)27(v)28(erted)-319(to)-319(c)27(haracter)-319(tok)27(ens)-318(with)-320(category)-319(12)-320(\(`other'\),)]TJ -0.01 -11.96 TD[(except)-333(that)-334(the)-333(c)27(haracter)-333(co)-27(de)-334(32)-333(gets)-333(category)-334(10)-333(\(`space'\).)]TJ 14.95 -11.95 TD[(The)-285(command)]TJ/F10 9.96 Tf 64.91 -0.01 TD[(\\scantokens{...})]TJ/F4 9.96 Tf 86.52 0 TD[(absorbs)-285(a)-285(list)-285(of)-285(unexpanded)-285(tok)27(ens,)-294(con-)]TJ -166.37 -11.95 TD[(v)27(erts)-342(it)-342(in)26(to)-341(a)-343(c)27(haracter)-342(string)-343(that)-342(is)-343(treated)-343(as)-343(if)-342(it)-343(w)27(ere)-342(an)-343(external)-343(\214le,)-345(and)]TJ 0 -11.96 TD[(starts)-314(to)-314(read)-314(from)-314(this)-314(`pseudo-\214le'.)-438(A)-314(rather)-314(similar)-313(e\213ect)-314(can)-314(b)-28(e)-314(ac)27(hiev)27(ed)-313(b)27(y)]TJ 0.01 -11.96 TD[(the)-332(commands)]TJ/F10 9.96 Tf 15.68 -19.56 TD[(\\toks0={...})]TJ 0.01 -11.96 TD[(\\immediate\\openout0=file)]TJ 0 -11.96 TD[(\\immediate\\write0{\\the\\toks0})]TJ -0.01 -11.95 TD[(\\immediate\\closeout0)]TJ 0.01 -11.95 TD[(\\input)-524(file)]TJ/F4 9.96 Tf -15.7 -19.56 TD[(In)-421(particular)-422(ev)27(ery)-420(o)-28(ccurrence)-421(of)-422(the)-421(curren)27(t)-421(newline)-421(c)27(haracter)-421(is)-421(in)27(terpreted)]TJ 0.01 -11.95 TD[(as)-437(start)-438(of)-437(a)-438(new)-438(line,)-464(and)-438(input)-438(c)27(haracters)-437(will)-438(b)-27(e)-438(con)27(v)27(erted)-436(in)26(to)-436(tok)26(ens)-436(as)]TJ -0.01 -11.96 TD[(usual.)-625(The)]TJ/F10 9.96 Tf 52.83 0 TD[(\\scantokens)]TJ/F4 9.96 Tf 61.46 0 TD[(command)-393(is,)-409(ho)26(w)28(ev)28(er,)-408(expandable)-394(and)-393(do)-28(es)-394(not)-394(use)]TJ -114.28 -11.96 TD[(tok)28(en)-234(registers,)-254(write)-234(streams,)-255(or)-234(external)-235(\214les.)-411(F)82(urthermore)-233(the)-235(con)27(v)28(ersion)-234(from)]TJ -0.01 -11.96 TD[(T)]TJ 5.54 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)-358(in)27(ternal)-357(ASCI)-28(I)-357(co)-28(des)-358(to)-358(external)-358(c)27(haracters)-357(and)-358(bac)27(k)-357(to)-358(ASCI)-28(I)-357(co)-28(des)-358(is)]TJ -11.06 -11.95 TD[(skipp)-27(ed.)-430(Finally)-291(the)-291(curren)27(t)-290(con)27(text)-289(\(tracebac)26(k\))-289(sho)27(wn,)-299(e.g.,)-299(as)-290(part)-291(of)-291(an)-290(error)]TJ 0 -11.95 TD[(message)-393(con)27(tin)28(ues)-393(b)-28(ey)27(ond)-393(an)-394(input)-393(line)-394(from)-394(a)-394(pseudo-\214le)-393(un)26(til)-392(an)-394(input)-394(line)]TJ 0 -11.95 TD[(from)-332(a)-334(real)-333(\214le)-333(\(or)-334(the)-333(terminal\))-333(is)-334(found.)]TJ 14.93 -11.95 TD[(When)]TJ/F8 9.96 Tf 30.56 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X's)-483(input)-483(mec)26(hanism)-482(attempts)-484(to)-483(read)-484(b)-28(ey)27(ond)-483(the)-483(end)-484(of)-483(an)]TJ/F10 9.96 Tf -64.54 -11.95 TD[(\\input)]TJ/F4 9.96 Tf 34.64 0 TD[(\214le)-328(or)]TJ/F10 9.96 Tf 28.15 -0.01 TD[(\\scantokens)]TJ/F4 9.96 Tf 60.81 0.01 TD[(pseudo-\214le,)-329(and)-328(b)-27(efore)-328(c)27(hec)27(king)-327(for)-328(`runa)27(w)28(a)28(y')-327(con-)]TJ -123.6 -11.96 TD[(ditions)-494(and)-495(closing)-495(the)-495(\214le,)-535(it)-494(will)-495(\214rst)-495(read)-495(a)-494(list)-495(of)-495(tok)27(ens)-494(that)-494(has)-495(b)-28(een)]TJ 0.01 -11.96 TD[(prede\214ned)-332(b)26(y)-332(the)-333(command)]TJ/F10 9.96 Tf 124.55 0.01 TD[(\\everyeof={)]TJ/F5 9.96 Tf 57.54 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(tok)28(en)-333(list)]TJ/F5 9.96 Tf 40.45 0.01 TD[(i)]TJ/F10 9.96 Tf 3.88 -0.01 TD[(})]TJ/F4 9.96 Tf 5.23 0.01 TD[(.)]TJ/F1 11.96 Tf -235.52 -27.81 TD[(3.8)-1124(Breaking)-375(P)30(aragraphs)-374(in)30(to)-374(Lines)]TJ/F4 9.96 Tf -0.01 -18.39 TD[(T)83(raditional)-440(t)26(yp)-26(esetting)-441(with)-441(lead)-441(t)27(yp)-27(e)-441(used)-441(to)-441(adjust)-441(\(stretc)27(h)-440(or)-441(shrink\))-441(the)]TJ 0.01 -11.96 TD[(in)28(terw)27(ord)-384(spaces)-386(in)-386(the)-385(last)-386(line)-386(of)-385(a)-386(paragraph)-386(b)27(y)-385(the)-386(same)-385(amoun)27(t)-385(as)-386(those)]TJ -0.01 -11.97 TD[(in)-421(the)-421(preceding)-421(line.)-708(With)-421(T)]TJ 133.73 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-420(the)-422(last)-421(line)-421(is,)-443(ho)27(w)28(ev)27(er,)-442(usually)-421(t)27(yp)-27(eset)-421(at)]TJ -139.27 -11.95 TD[(its)-465(natural)-466(width)-465(due)-466(to)-465(in\214nitely)-466(stretc)27(hable)-465(par\214llskip)-465(glue.)]TJ/F8 9.96 Tf 286.22 0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-465(allo)26(ws)]TJ -305.25 -11.95 TD[(in)27(terp)-27(olation)-499(b)-28(et)27(w)27(een)-498(these)-500(t)27(w)27(o)-498(extremes)-500(b)27(y)-499(sp)-28(ecifying)-499(a)-500(suitable)-500(v)55(alue)-499(for)]TJ/F10 9.96 Tf 0 -11.96 TD[(\\lastlinefit)]TJ/F4 9.96 Tf 62.77 0.01 TD[(.)-569(F)83(or)-374(a)-375(v)55(alue)-374(of)-375(0)-375(or)-374(less,)]TJ/F8 9.96 Tf 116.35 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-374(b)-28(eha)27(v)28(es)-374(as)-375(T)]TJ 66.93 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X,)-385(v)55(alues)-374(from)-375(1)]TJ -270.61 -11.95 TD[(to)-302(1000)-302(indicate)-303(a)-302(glue)-302(adjustmen)26(t)-301(fraction)]TJ/F8 9.96 Tf 189.15 0 TD[(f)]TJ/F4 9.96 Tf 8.97 0.01 TD[(times)-302(1000,)-308(v)55(alues)-302(ab)-28(o)27(v)28(e)-301(1000)-303(are)]TJ -198.11 -11.96 TD[(in)28(terpreted)-333(as)]TJ/F8 9.96 Tf 63.48 0.01 TD[(f)]TJ/F4 9.96 Tf 8.71 -0.01 TD[(=)-277(1.)]TJ -57.26 -11.95 TD[(The)-333(new)-334(algorithm)-333(is)-333(used)-334(only)-333(if)]TJ -14.94 -11.95 TD[(1.)]TJ/F10 9.96 Tf 12.19 0 TD[(\\lastlinefit)]TJ/F4 9.96 Tf 66.08 -0.01 TD[(is)-333(p)-27(ositiv)26(e;)]TJ 88.61 -29.89 TD[(10)]TJ ET
+endstream
+endobj
+88 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F1 10 0 R
+/F5 22 0 R
+/F8 31 0 R
+>>
+endobj
+86 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 88 0 R
+>>
+endobj
+91 0 obj
+<<
+/Length 7377
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(2.)]TJ/F10 9.96 Tf 12.17 -0.01 TD[(\\parfillskip)]TJ/F4 9.96 Tf 66.09 0 TD[(has)-333(in\214nite)-333(stretc)26(habilit)28(y;)-332(and)]TJ -78.26 -11.95 TD[(3.)-444(the)-333(stretc)26(habilit)28(y)-332(of)]TJ/F10 9.96 Tf 101.37 0 TD[(\\leftskip)]TJ/F4 9.96 Tf 50.4 -0.01 TD[(plus)]TJ/F10 9.96 Tf 21.09 0 TD[(\\rightskip)]TJ/F4 9.96 Tf 55.62 0 TD[(is)-333(\214nite.)]TJ/F9 6.97 Tf 34.93 3.62 TD[(5)]TJ/F4 9.96 Tf -263.39 -15.56 TD[(Th)28(us)-271(the)-271(last)-272(line)-271(of)-271(a)-272(paragraph)-271(w)26(ould)-270(normally)-271(b)-28(e)-272(t)27(yp)-27(eset)-271(at)-271(its)-272(natural)-271(width)]TJ -0.01 -11.96 TD[(and)-250(the)-249(stretc)26(habilit)28(y)-249(of)-249(par\214llskip)-250(glue)-250(w)27(ould)-249(b)-28(e)-249(used)-250(to)-250(ac)27(hiev)28(e)-249(the)-250(desired)-250(line)]TJ 0.01 -11.96 TD[(width.)-621(The)-393(algorithm)-392(pro)-28(ceeds)-392(as)-393(usual,)-407(considering)-393(all)-392(p)-28(ossible)-392(sequences)-393(of)]TJ -0.01 -11.96 TD[(feasible)-323(break)-323(p)-28(oin)27(ts)-323(and)-323(accum)27(ulating)-322(demerits)-324(for)-323(the)-323(stretc)26(hing)-322(or)-323(shrinking)]TJ 0 -11.95 TD[(of)-307(lines)-308(as)-307(w)27(ell)-307(as)-307(for)-308(visually)-307(incompatible)-308(lines.)-436(When)-307(a)-308(candidate)-307(for)-308(the)-307(last)]TJ 0 -11.96 TD[(line)-333(has)-333(b)-28(een)-333(reac)26(hed,)-332(the)-333(follo)26(wing)-332(conditions)-333(are)-334(tested:)]TJ 0 -11.95 TD[(4.)-759(the)-438(previous)-438(line)-438(w)27(as)-437(not)-438(`in\214nitely)-438(bad')-439(and)-438(w)27(as)-437(stretc)27(hed)-437(with)-438(p)-28(ositiv)27(e)]TJ 0.01 -11.96 TD[(\214nite)-333(stretc)27(habilit)28(y)-332(or)-334(w)27(as)-332(shrunk)-334(with)-333(p)-28(ositiv)27(e)-332(shrink)54(abilit)28(y;)]TJ 0 -11.95 TD[(5.)-444(the)-333(last)-333(line)-334(has)-333(in\214nite)-333(stretc)26(habilit)28(y)-332(en)27(tirely)-333(due)-333(to)-333(par\214llskip)-334(glue;)]TJ -0.01 -11.95 TD[(6.)-591(if)-383(the)-382(previous)-382(line)-382(w)26(as)-381(stretc)27(hed)-381(or)-383(shrunk)-382(the)-382(last)-383(line)-382(has)-382(p)-28(ositiv)27(e)-381(\214nite)]TJ 0.01 -11.96 TD[(stretc)27(habilit)28(y)-332(or)-333(shrink)54(abilit)28(y)-332(resp)-28(ectiv)27(ely)83(.)]TJ 0 -11.96 TD[(If)-348(all)-350(three)-349(conditions)-349(are)-350(satis\214ed,)-353(a)-349(glue)-350(adjustmen)27(t)-348(factor)-349(of)]TJ/F8 9.96 Tf 277.72 0.01 TD[(f)]TJ/F4 9.96 Tf 9.43 -0.01 TD[(times)-349(that)-350(of)]TJ -287.15 -11.95 TD[(the)-346(preceding)-347(line)-347(will)-347(b)-28(e)-347(applied)-347(to)-347(the)-347(relev)55(an)27(t)-346(stretc)27(h)-346(or)-347(shrink)-347(comp)-28(onen)27(ts)]TJ 0 -11.96 TD[(of)-310(all)-312(glue)-311(no)-28(des)-311(in)-311(the)-311(last)-311(line,)-316(and)-311(the)-311(corresp)-28(onding)-311(demerits)-312(are)-311(computed.)]TJ 0 -11.96 TD[(\(The)-332(last)-334(line)-333(will,)-333(ho)26(w)28(ev)28(er,)-332(not)-334(b)-27(e)-334(stretc)27(hed)-332(b)-28(ey)27(ond)-333(the)-333(desired)-333(line)-334(width.\))]TJ 14.93 -11.96 TD[(When)-414(all)-414(p)-28(ossible)-414(candidates)-414(for)-414(the)-414(last)-415(line)-414(of)-414(the)-414(paragraph)-414(ha)27(v)28(e)-414(b)-27(een)]TJ -14.93 -11.96 TD[(examined,)-452(the)-429(one)-428(ha)26(ving)-427(few)26(est)-428(accum)27(ulated)-428(demerits)-428(is)-429(c)27(hosen.)-730(If)]TJ/F8 9.96 Tf 310.5 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ -329.54 -11.95 TD[(mo)-27(di\214ed)-279(algorithm)-279(w)27(as)-278(applied)-278(to)-279(that)-279(last)-278(line,)-290(the)-279(actual)-279(stretc)27(hing)-277(or)-279(shrink-)]TJ 0 -11.96 TD[(ing)-333(is)-333(ac)27(hiev)27(ed)-332(b)27(y)-333(suitably)-333(mo)-28(difying)-333(the)-333(par\214llskip)-334(glue)-333(no)-28(de.)]TJ 14.94 -11.95 TD[(All)-329(computations)-330(describ)-28(ed)-329(so)-330(far)-329(are)-330(p)-27(erformed)-330(with)-330(mac)27(hine-indep)-27(enden)27(t)]TJ -14.94 -11.95 TD[(in)27(teger)-325(arithmetic.)-443(Note,)-327(ho)27(w)27(ev)28(er,)-327(that)-326(the)-326(actual)-327(stretc)27(hing)-325(requires)-327(mac)27(hine-)]TJ 0.01 -11.95 TD[(dep)-27(enden)27(t)-241(\215oating)-241(p)-28(oin)27(t)-241(arithmetic.)-413(Therefore,)-260(when)-242(a)-241(paragraph)-242(is)-241(in)27(terrupted)]TJ 0 -11.95 TD[(b)28(y)-453(a)-453(displa)27(y)28(ed)-452(equation)-454(and)-453(the)-453(line)-453(preceding)-453(the)-454(displa)27(y)-452(is)-453(sub)-56(ject)-453(to)-453(the)]TJ -0.01 -11.96 TD[(adjustmen)27(t)-331(just)-333(describ)-28(ed,)-333(the)-332(displa)27(y)-332(will)-332(in)-333(general)-333(b)-27(e)-333(preceded)-332(b)26(y)-331(ab)-28(o)27(v)28(edis-)]TJ 0 -11.95 TD[(pla)27(yskip)-332(and)-334(not)-333(b)27(y)-333(ab)-27(o)26(v)28(edispla)28(yshortskip)-332(glue.)]TJ 14.95 -17.93 TD[(After)-327(breaking)-327(a)-328(paragraph)-327(in)27(to)-327(lines,)-328(T)]TJ 173.62 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-327(computes)-327(the)-328(in)27(terline)-326(p)-28(enalties)]TJ -194.1 -11.95 TD[(b)27(y)-332(adding)-334(the)-333(v)54(alues)-332(of:)]TJ/F10 9.96 Tf 0.01 -11.95 TD[(\\interlinepenalty)]TJ/F4 9.96 Tf 92.23 0 TD[(b)-27(et)26(w)28(een)-332(an)27(y)-333(t)27(w)28(o)-333(lines,)]TJ/F10 9.96 Tf -92.23 -11.96 TD[(\\clubpenalty)]TJ/F4 9.96 Tf 66.08 -0.01 TD[(after)-333(the)-333(\214rst)-334(line)-333(of)-333(a)-334(\(partial\))-333(paragraph,)]TJ/F10 9.96 Tf -66.08 -11.95 TD[(\\widowpenalty)]TJ/F4 9.96 Tf 71.31 -0.01 TD[(b)-27(efore)-333(the)-334(last)-333(line)-333(of)-334(the)-333(paragraph,)]TJ/F10 9.96 Tf -71.32 -11.95 TD[(\\displaywidowpenalty)]TJ/F4 9.96 Tf 107.04 0.01 TD[(b)-27(efore)-246(the)-245(line)-245(immediately)-245(preceding)-245(a)-245(displa)27(y)27(ed)-244(equa-)]TJ -107.05 -11.96 TD[(tion,)-333(and)]TJ/F10 9.96 Tf 0.01 -11.96 TD[(\\brokenpenalty)]TJ/F4 9.96 Tf 76.54 0.01 TD[(after)-333(lines)-333(ending)-333(with)-334(a)-333(discretionary)-333(break.)]TJ/F8 9.96 Tf -76.55 -11.96 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-507(generalizes)-508(the)-509(concept)-508(of)-508(in)27(terline,)-551(club,)-551(wido)27(w,)-551(and)-508(displa)27(y)-508(wido)27(w)]TJ -19.04 -11.95 TD[(p)-27(enalt)26(y)-284(b)27(y)-284(allo)26(wing)-284(their)-285(replacemen)27(t)-284(b)27(y)-285(arra)27(ys)-284(of)-285(p)-28(enalt)27(y)-284(v)54(alues)-284(with)-285(the)-285(com-)]TJ 0 -11.95 TD[(mands)]TJ/F10 9.96 Tf 0.01 -11.95 TD[(\\interlinepenalties)]TJ/F4 9.96 Tf 99.37 0 TD[(,)]TJ/F10 9.96 Tf -99.37 -11.95 TD[(\\clubpenalties)]TJ/F4 9.96 Tf 73.22 0.01 TD[(,)]TJ/F10 9.96 Tf -73.22 -11.96 TD[(\\widowpenalties)]TJ/F4 9.96 Tf 78.45 0 TD[(,)-333(and)]TJ/F10 9.96 Tf -78.45 -11.95 TD[(\\displaywidowpenalties)]TJ/F4 9.96 Tf 115.06 0.01 TD[(.)]TJ -115.07 -11.96 TD[(Eac)27(h)-300(of)-301(these)-301(commands)-302(is)-301(to)-301(b)-28(e)-301(follo)26(w)28(ed)-300(b)27(y)-301(an)-301(optional)-301(equal)-301(sign)-302(and)-301(a)-301(n)26(um-)]TJ ET 0.40 w 61.77 -578.97 m 199.25 -578.97 l S BT/F12 5.98 Tf 72.86 -585.62 TD[(5)]TJ/F13 7.97 Tf 4.15 -2.8 TD[(As)-373(usual)-373(for)-373(parameters)-373(in\215uencing)-374(T)]TJ 139.7 -1.72 TD[(E)]TJ 4.7 1.71 TD[(X's)-373(line-breaking)-373(algorithm,)-378(the)-373(v)58(alues)-372(curren)28(t)-372(at)]TJ -159.64 -9.46 TD[(the)-354(end)-354(of)-355(the)-354(\(partial\))-354(paragraph)-354(are)-354(used.)]TJ/F4 9.96 Tf 166.88 -32.74 TD[(11)]TJ ET
+endstream
+endobj
+92 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F9 34 0 R
+/F8 31 0 R
+/F12 42 0 R
+/F13 45 0 R
+>>
+endobj
+90 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 92 0 R
+>>
+endobj
+95 0 obj
+<<
+/Length 9357
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(b)-27(er)]TJ/F8 9.96 Tf 16.65 -0.01 TD[(n)]TJ/F4 9.96 Tf 5.98 0 TD[(.)-417(If)]TJ/F8 9.96 Tf 16.07 0 TD[(n)]TJ/F5 9.96 Tf 8.75 0.01 TD[(\224)]TJ/F4 9.96 Tf 10.52 -0.01 TD[(0)-251(the)-252(resp)-28(ectiv)27(e)-251(arra)26(y)-251(is)-252(reset)-252(and)-251(T)]TJ 150.96 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)-252(corresp)-28(onding)-252(single)-252(v)55(alue)]TJ -214.46 -11.95 TD[(is)-373(used)-374(as)-374(usual;)-394(a)-374(p)-28(ositiv)27(e)-373(v)55(alue)]TJ/F8 9.96 Tf 147.76 0 TD[(n)]TJ/F4 9.96 Tf 9.7 0 TD[(declares)-373(an)-374(arra)27(y)-373(of)-374(length)]TJ/F8 9.96 Tf 121.43 -0.01 TD[(n)]TJ/F4 9.96 Tf 9.71 0 TD[(and)-373(m)27(ust)-373(b)-28(e)]TJ -288.61 -11.96 TD[(follo)27(w)28(ed)-323(b)26(y)]TJ/F8 9.96 Tf 52.13 0.01 TD[(n)]TJ/F4 9.96 Tf 9.21 0 TD[(p)-27(enalt)27(y)-324(v)55(alues.)-441(When)-324(one)-324(of)-325(these)-324(arra)27(ys)-324(has)-324(b)-28(een)-325(set,)-326(its)-324(v)54(alues)]TJ -61.34 -11.96 TD[(are)-350(used)-351(instead)-351(of)-351(T)]TJ 91.33 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-350(corresp)-28(onding)-351(single)-351(v)54(alues)-350(as)-351(follo)27(ws)-350(\(rep)-28(eating)-351(the)]TJ -96.87 -11.95 TD[(last)-333(v)55(alue)-332(when)-334(necessary\):)]TJ 0 -11.96 TD[(the)]TJ/F8 9.96 Tf 17.15 0 TD[(i)]TJ/F9 6.97 Tf 3.43 3.61 TD[(th)]TJ/F4 9.96 Tf 11.34 -3.61 TD[(in)28(terline)-333(p)-27(enalt)26(y)-332(v)55(alue)-333(is)-333(used)-333(after)-334(line)]TJ/F8 9.96 Tf 175.61 0 TD[(i)]TJ/F4 9.96 Tf 6.75 0 TD[(of)-333(the)-334(paragraph;)]TJ -214.29 -11.96 TD[(the)]TJ/F8 9.96 Tf 17.16 0.01 TD[(i)]TJ/F9 6.97 Tf 3.44 3.61 TD[(th)]TJ/F4 9.96 Tf 11.33 -3.61 TD[(club)-333(p)-28(enalt)27(y)-332(v)54(alue)-332(is)-333(used)-334(after)-333(line)]TJ/F8 9.96 Tf 158.16 -0.01 TD[(i)]TJ/F4 9.96 Tf 6.75 0.01 TD[(of)-332(a)-334(partial)-333(paragraph;)]TJ -196.84 -11.96 TD[(the)]TJ/F8 9.96 Tf 18.25 0.01 TD[(i)]TJ/F9 6.97 Tf 3.44 3.61 TD[(th)]TJ/F4 9.96 Tf 12.42 -3.62 TD[(wido)27(w)-443(p)-28(enalt)27(y)-443(v)55(alue)-443(is)-443(used)-444(after)-444(line)]TJ/F8 9.96 Tf 174.99 -0.01 TD[(m)]TJ/F5 9.96 Tf 11.7 0 TD[(\200)]TJ/F8 9.96 Tf 10.7 0.01 TD[(i)]TJ/F4 9.96 Tf 7.85 0 TD[(of)-443(a)-444(paragraph)-443(without)]TJ -239.35 -11.96 TD[(displa)28(y)27(ed)-332(equations)-333(or)-334(the)-333(last)-333(partial)-334(paragraph)-333(of)-333(length)]TJ/F8 9.96 Tf 257.91 0 TD[(m)]TJ/F4 9.96 Tf 8.76 -0.01 TD[(;)]TJ -266.68 -11.95 TD[(the)]TJ/F8 9.96 Tf 16.44 0 TD[(i)]TJ/F9 6.97 Tf 3.43 3.61 TD[(th)]TJ/F4 9.96 Tf 10.6 -3.62 TD[(displa)27(y)-259(wido)27(w)-259(p)-28(enalt)27(y)-260(v)55(alue)-259(is)-261(used)-260(after)-260(line)]TJ/F8 9.96 Tf 195.28 0 TD[(m)]TJ/F5 9.96 Tf 9.51 0 TD[(\200)]TJ/F8 9.96 Tf 8.5 0 TD[(i)]TJ/F4 9.96 Tf 6.03 0 TD[(of)-260(a)-260(partial)-260(paragraph)]TJ -249.79 -11.96 TD[(of)-333(length)]TJ/F8 9.96 Tf 41.8 0 TD[(m)]TJ/F4 9.96 Tf 12.06 -0.01 TD[(that)-333(is)-333(follo)26(w)28(ed)-332(b)27(y)-333(a)-333(displa)27(y)28(ed)-333(equation.)]TJ -38.91 -11.95 TD[(When)-344(used)-344(after)]TJ/F10 9.96 Tf 75.68 0.01 TD[(\\the)]TJ/F4 9.96 Tf 24.35 -0.01 TD[(or)-343(in)-344(situations)-344(where)-344(T)]TJ 104.09 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-343(exp)-28(ects)-344(to)-344(see)-344(a)-344(n)27(um)27(b)-26(er,)]TJ -224.6 -11.95 TD[(the)-385(same)-385(four)-386(commands)-385(serv)27(e)-385(to)-385(retriev)26(e)-384(the)-385(arra)26(ys)-384(of)-386(p)-27(enalties.)-601(Sp)-28(ecifying,)]TJ 0 -11.96 TD[(e.g.,)]TJ/F10 9.96 Tf 21.5 0 TD[(\\clubpenalties)]TJ/F5 9.96 Tf 73.23 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(n)28(um)27(b)-26(er)]TJ/F5 9.96 Tf 32.95 -0.01 TD[(i)]TJ/F4 9.96 Tf 7.58 0 TD[(with)-371(a)-372(n)27(um)28(b)-27(er)]TJ/F8 9.96 Tf 68.42 0 TD[(n)]TJ/F4 9.96 Tf 5.97 0 TD[(,)-381(returns)-371(0)-372(for)]TJ/F8 9.96 Tf 65.69 0 TD[(n)-341(<)]TJ/F4 9.96 Tf 20.53 0.01 TD[(0)-371(or)-372(when)]TJ -299.75 -11.96 TD[(the)-377(club)-378(p)-28(enalt)27(y)-377(arra)27(y)-377(has)-378(b)-27(een)-378(reset,)-389(the)-378(length)-377(of)-378(the)-378(declared)-378(club)-378(p)-27(enalt)26(y)]TJ 0 -11.96 TD[(arra)27(y)-389(for)]TJ/F8 9.96 Tf 42.44 0.01 TD[(n)]TJ/F4 9.96 Tf 9.69 -0.01 TD[(=)-372(0,)-404(or)-390(the)]TJ/F8 9.96 Tf 53.73 0.01 TD[(n)]TJ/F9 6.97 Tf 5.98 3.61 TD[(th)]TJ/F4 9.96 Tf 11.91 -3.61 TD[(club)-389(p)-28(enalt)27(y)-389(v)54(alue)-389(for)]TJ/F8 9.96 Tf 100.52 0.01 TD[(n)-372(>)]TJ/F4 9.96 Tf 21.15 0 TD[(0)-389(\(again)-390(rep)-28(eating)-390(the)]TJ -245.41 -11.96 TD[(last)-333(v)55(alue)-333(when)-333(necessary\).)]TJ/F1 11.96 Tf 0 -27.89 TD[(3.9)-1125(Math)-375(F)93(orm)31(ulas)]TJ/F4 9.96 Tf 0 -18.4 TD[(T)]TJ 5.54 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)]TJ/F10 9.96 Tf 19.35 0.01 TD[(\\left)]TJ/F5 9.96 Tf 26.15 0 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(delimiter)]TJ/F5 9.96 Tf 38.78 0 TD[(i)]TJ/F10 9.96 Tf 3.87 0.01 TD[(...\\right)]TJ/F5 9.96 Tf 47.07 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(delimiter)]TJ/F5 9.96 Tf 38.78 -0.01 TD[(i)]TJ/F4 9.96 Tf 9.06 0 TD[(pro)-27(duces)-521(t)27(w)28(o)-519(delimiters)-521(with)-520(a)]TJ -201.87 -11.95 TD[(common)-458(size)-459(adjusted)-459(to)-459(the)-459(heigh)27(t)-458(and)-459(depth)-459(of)-459(the)-458(enclosed)-459(material.)-822(In)]TJ/F8 9.96 Tf -0.01 -11.96 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-454(this)-454(can)-454(b)-28(e)-454(generalized)-454(b)27(y)-453(o)-28(ccurrences)-454(of)]TJ/F10 9.96 Tf 201.88 -0.01 TD[(\\middle)]TJ/F5 9.96 Tf 36.61 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(delimiter)]TJ/F5 9.96 Tf 38.78 0.01 TD[(i)]TJ/F4 9.96 Tf 8.39 -0.01 TD[(dividing)]TJ -308.56 -11.95 TD[(the)-316(enclosed)-316(material)-316(in)27(to)-315(segmen)27(ts)-315(resulting)-316(in)-316(a)-316(sequence)-316(of)-316(delimiters)-316(with)-316(a)]TJ 0 -11.95 TD[(common)-254(size)-255(adjusted)-255(to)-254(the)-255(maximal)-254(heigh)26(t)-253(and)-255(depth)-255(of)-254(all)-255(enclosed)-254(segmen)26(ts.)]TJ 0 -11.95 TD[(The)-399(spacing)-399(b)-28(et)27(w)27(een)-398(a)-399(segmen)27(t)-399(and)-399(the)-399(delimiter)-399(to)-400(its)-399(left)-399(or)-399(righ)26(t)-398(is)-399(as)-399(for)]TJ 0.01 -11.95 TD[(T)]TJ 5.53 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X's)-333(left)-333(or)-333(righ)27(t)-333(delimiter)-333(resp)-28(ectiv)27(ely)83(.)]TJ/F1 11.96 Tf -11.07 -27.89 TD[(3.10)-1124(Hyphenation)]TJ/F4 9.96 Tf -0.01 -18.39 TD[(T)]TJ 5.54 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-333(uses)-333(the)]TJ/F10 9.96 Tf 49.09 0.01 TD[(\\lccode)]TJ/F4 9.96 Tf 39.93 0 TD[(v)55(alues)-332(for)-334(t)27(w)28(o)-332(quite)-334(unrelated)-333(purp)-28(oses:)]TJ -100.1 -11.96 TD[(\(1\))-348(when)]TJ/F10 9.96 Tf 42.36 0 TD[(\\lowercase)]TJ/F4 9.96 Tf 55.77 -0.01 TD[(con)27(v)28(erts)-347(c)27(haracter)-347(tok)27(ens)-347(to)-348(their)-348(lo)27(w)28(er-case)-347(equiv)54(alen)28(ts)]TJ -98.12 -11.95 TD[(\(in)-333(the)-333(same)-334(w)27(a)28(y)-333(as)]TJ/F10 9.96 Tf 90.06 -0.01 TD[(\\uppercase)]TJ/F4 9.96 Tf 55.62 0 TD[(uses)-333(the)]TJ/F10 9.96 Tf 38.3 0.01 TD[(\\uccode)]TJ/F4 9.96 Tf 39.93 0 TD[(v)55(alues\);)-332(and)]TJ -223.91 -11.96 TD[(\(2\))-473(when)-474(h)27(yphenation)-473(patterns)-473(or)-474(exceptions)-473(are)-474(read,)-509(and)-473(when)-474(w)27(ords)-473(are)]TJ 0.01 -11.96 TD[(h)28(yphenated)-333(during)-333(the)-333(line-breaking)-334(algorithm.)]TJ/F8 9.96 Tf 14.93 -11.95 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-443(in)27(tro)-27(duces)-443(the)-444(concept)-443(of)-443(\(language-dep)-28(enden)27(t\))-443(h)27(yphenation)-442(co)-28(des)]TJ -33.98 -11.95 TD[(that)-391(are)-392(used)-391(instead)-392(of)-391(the)]TJ/F10 9.96 Tf 127.33 -0.01 TD[(\\lccode)]TJ/F4 9.96 Tf 40.5 0.01 TD[(v)55(alues)-391(for)-391(h)27(yphenation)-391(purp)-28(oses.)-618(In)-392(or-)]TJ -167.82 -11.96 TD[(der)-316(to)-317(explain)-317(the)-317(details)-317(of)]TJ/F8 9.96 Tf 123.07 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-316(b)-28(eha)27(viour,)-319(w)26(e)-315(need)-317(some)-317(tec)27(hnical)-316(asp)-28(ects)]TJ -142.12 -11.96 TD[(of)-392(h)27(yphenation)-391(patterns.)-622(When)-392(INITEX)-393(starts)-392(without)-392(reading)-393(a)-392(format)-392(\214le,)]TJ 0 -11.96 TD[(the)-378(\(initially)-379(empt)27(y\))-377(h)26(yphenation)-377(patterns)-379(are)-378(in)-379(a)-378(form)-379(suitable)-378(for)-379(inserting)]TJ 0 -11.96 TD[(new)-437(patterns)-437(sp)-28(eci\214ed)-437(b)27(y)]TJ/F10 9.96 Tf 118.02 -0.01 TD[(\\patterns)]TJ/F4 9.96 Tf 51.43 0 TD[(commands;)-488(when)-437(INITEX)-438(attemps)-437(h)27(y-)]TJ -169.45 -11.95 TD[(phenation)-378(or)-379(prepares)-379(to)-378(write)-379(a)-378(format)-379(\214le,)-390(they)-379(are)-378(compressed)-379(in)27(to)-378(a)-378(more)]TJ 0 -11.96 TD[(compact)-278(form)-278(suitable)-278(for)-278(\214nding)-278(h)27(yphens.)-425(Only)-278(these)-278(compressed)-278(patterns)-278(can)]TJ 0.01 -11.96 TD[(b)-27(e)-333(read)-334(from)-333(a)-333(format)-334(\214le)-333(\(b)27(y)-333(INITEX)-333(or)-333(VIR)82(TEX\).)]TJ 14.94 -11.95 TD[(In)]TJ/F8 9.96 Tf 12.04 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-291(the)-292(h)27(yphenation)-290(patterns)-292(are)-291(supplemen)27(ted)-291(b)27(y)-290(h)26(yphenation)-290(co)-28(des.)]TJ -46.01 -11.95 TD[(When)-396(eINITEX)-395(starts)-396(without)-396(reading)-395(a)-396(format)-396(\214le)-395(b)-28(oth)-396(are)-396(initially)-395(empt)26(y;)]TJ 166.88 -32.98 TD[(12)]TJ ET
+endstream
+endobj
+96 0 obj
+<<
+/F4 19 0 R
+/F8 31 0 R
+/F5 22 0 R
+/F9 34 0 R
+/F10 37 0 R
+/F1 10 0 R
+>>
+endobj
+94 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 96 0 R
+>>
+endobj
+99 0 obj
+<<
+/Length 7179
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(when)-296(a)]TJ/F10 9.96 Tf 33.59 -0.01 TD[(\\patterns)]TJ/F4 9.96 Tf 50.03 0 TD[(command)-296(is)-297(executed)-297(and)]TJ/F10 9.96 Tf 114.55 0 TD[(\\savinghyphcodes)]TJ/F4 9.96 Tf 86.65 0.01 TD[(has)-297(a)-297(p)-27(ositiv)26(e)]TJ -284.82 -11.96 TD[(v)55(alue,)-378(the)-371(curren)27(t)]TJ/F10 9.96 Tf 81.51 -0.01 TD[(\\lccode)]TJ/F4 9.96 Tf 40.3 0.01 TD[(v)55(alues)-369(are)-371(sa)27(v)28(ed)-370(as)-370(h)27(yphenation)-370(co)-28(des)-370(for)-371(the)-370(cur-)]TJ -121.83 -11.96 TD[(ren)27(t)-417(language.)-698(These)-418(sa)27(v)27(ed)-417(h)27(yphenation)-417(co)-28(des)-417(are)-418(later)-418(compressed)-418(together)]TJ 0.01 -11.96 TD[(with)-312(the)-312(patterns)-312(and)-313(written)-312(to)-312(or)-312(read)-313(from)-312(a)-312(format)-313(\214le.)-437(When)-312(the)-313(patterns)]TJ 0 -11.96 TD[(ha)28(v)27(e)-321(b)-27(een)-322(compressed)-322(\(alw)26(a)28(ys)-321(true)-322(for)-322(eVIR)83(TEX\))-321(and)-322(h)27(yphenation)-321(co)-28(des)-322(ha)27(v)28(e)]TJ 0 -11.95 TD[(b)-27(een)-345(sa)27(v)27(ed)-344(for)-345(the)-345(curren)26(t)-344(language,)-348(they)-345(are)-346(used)-345(instead)-345(of)-346(the)]TJ/F10 9.96 Tf 287.88 0 TD[(\\lccode)]TJ/F4 9.96 Tf 40.04 -0.01 TD[(v)55(al-)]TJ -327.93 -11.95 TD[(ues)-270(for)-270(h)26(yphenation)-269(purp)-28(oses)-270(\(reading)-271(h)27(yphenation)-270(exceptions)-270(and)-270(h)26(yphenating)]TJ 0 -11.95 TD[(w)27(ords\).)]TJ/F1 11.96 Tf 0 -27.89 TD[(3.11)-1124(Discarded)-375(Items)]TJ/F4 9.96 Tf 0 -18.39 TD[(When)-423(T)]TJ 35.49 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)-424(page)-424(builder)-424(transfers)-424(\(v)27(ertical)-423(mo)-28(de\))-424(material)-424(from)-425(the)-424(`recen)27(t)]TJ -41.04 -11.96 TD[(con)27(tributions')-451(to)-453(the)-452(`page)-452(so)-453(far',)-482(it)-452(discards)-452(glue,)-482(k)27(ern,)-481(and)-453(p)-28(enalt)27(y)-451(no)-28(des)]TJ 0.01 -11.95 TD[(\(discardable)-225(items\))-226(preceding)-226(the)-225(\214rst)-226(b)-28(o)27(x)-225(or)-225(rule)-226(on)-226(the)-225(page)-226(under)-226(construction)]TJ 0 -11.96 TD[(and)-456(inserts)-456(a)-456(topskip)-457(glue)-456(no)-28(de)-456(immediately)-457(b)-27(efore)-457(that)-456(b)-28(o)27(x)-455(or)-457(rule.)-813(Note,)]TJ 0 -11.96 TD[(ho)27(w)28(ev)28(er,)-283(that)-271(this)-272(topskip)-271(glue)-271(need)-272(not)-271(b)-28(e)-271(the)-271(\214rst)-272(no)-28(de)-271(on)-271(the)-272(page,)-283(it)-272(ma)27(y)-270(b)-28(e)]TJ 0 -11.96 TD[(preceded)-390(b)27(y)-389(insertion,)-405(mark,)-405(and)-390(whatsit)-391(no)-27(des.)-616(Similarly)-391(when)-390(the)]TJ/F10 9.96 Tf 307.09 0 TD[(\\vsplit)]TJ/F4 9.96 Tf -307.09 -11.96 TD[(command)-440(has)-441(split)-440(the)-441(\214rst)-440(part)-441(o\213)-441(a)-440(vb)-28(o)27(x,)-466(discardable)-441(items)-441(are)-440(discarded)]TJ 0 -11.96 TD[(from)-446(the)-446(top)-446(of)-447(the)-446(remaining)-447(vb)-27(o)26(x)-445(and)-446(a)-447(splittopskip)-446(glue)-446(no)-28(de)-446(is)-447(inserted)]TJ 0 -11.95 TD[(immediately)-333(b)-27(efore)-334(the)-333(\214rst)-333(b)-28(o)27(x)-333(or)-333(rule.)]TJ 14.94 -11.96 TD[(When)]TJ/F8 9.96 Tf 29.8 0 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X's)-408(parameter)]TJ/F10 9.96 Tf 66.65 0 TD[(\\savingvdiscards)]TJ/F4 9.96 Tf 87.75 0.01 TD[(has)-408(b)-28(een)-408(assigned)-409(a)-408(p)-28(ositiv)27(e)]TJ -218.17 -11.96 TD[(v)56(alue,)-454(these)-431(`discarded)-431(items')-430(are)-431(sa)27(v)28(ed)-430(in)-430(t)26(w)28(o)-430(lists)-430(and)-431(can)-430(b)-28(e)-431(reco)27(v)28(ered)-430(b)27(y)]TJ -0.01 -11.96 TD[(the)-369(commands)]TJ/F10 9.96 Tf 67.2 0 TD[(\\pagediscards)]TJ/F4 9.96 Tf 71.68 -0.01 TD[(and)]TJ/F10 9.96 Tf 19.74 0 TD[(\\splitdiscards)]TJ/F4 9.96 Tf 76.91 0 TD[(that)-369(act)-370(lik)27(e)-369(`un)27(vb)-27(o)27(xing')]TJ -235.53 -11.95 TD[(h)27(yp)-27(othetical)-333(b)-28(o)27(x)-332(registers)-334(con)27(taining)-332(a)-334(vb)-27(o)26(x)-332(with)-333(the)-334(discarded)-333(items.)]TJ 14.95 -11.96 TD[(The)-331(list)-331(of)-332(items)-331(discarded)-332(b)27(y)-330(the)-332(page)-331(builder)-332(is)-331(emptied)-332(at)-331(the)-332(end)-331(of)-332(the)]TJ -14.95 -11.95 TD[(output)-320(routine)-320(and)-321(b)27(y)-319(the)]TJ/F10 9.96 Tf 116.72 -0.01 TD[(\\pagediscards)]TJ/F4 9.96 Tf 71.18 0.01 TD[(command;)-325(new)-320(items)-320(ma)27(y)-320(b)-28(e)-320(added)]TJ -187.89 -11.96 TD[(as)-332(long)-334(as)-333(the)-333(new)-334(`page)-333(so)-333(far')-334(con)27(tains)-332(no)-334(b)-27(o)26(x)-332(or)-333(rule.)]TJ 14.94 -11.96 TD[(The)-293(list)-294(of)-293(items)-294(discarded)-294(b)27(y)-293(the)]TJ/F10 9.96 Tf 147.7 0 TD[(\\vsplit)]TJ/F4 9.96 Tf 39.53 -0.01 TD[(command)-294(is)-294(emptied)-293(at)-294(the)-294(start)]TJ -202.18 -11.95 TD[(of)-477(a)-478(vsplit)-478(op)-27(eration)-478(and)-478(b)27(y)-477(the)]TJ/F10 9.96 Tf 152.12 0 TD[(\\splitdiscards)]TJ/F4 9.96 Tf 77.99 0 TD[(command;)-549(new)-478(items)-478(are)]TJ -230.12 -11.96 TD[(added)-333(at)-333(the)-334(end)-333(of)-333(a)-334(vsplit)-333(op)-28(eration.)]TJ/F1 11.96 Tf 0.01 -27.9 TD[(3.12)-1124(Expandable)-375(Commands)]TJ/F4 9.96 Tf -0.01 -18.39 TD[(Chapter)-397(20)-397(of)]TJ/F3 9.96 Tf 65.31 0.01 TD[(The)-396(T)]TJ 26.64 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 34.33 0 TD[(giv)27(es)-396(complete)-397(lists)-397(of)-397(all)-397(expandable)-397(T)]TJ 173.9 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-396(com-)]TJ -311.26 -11.96 TD[(mands)-356(and)-357(of)-356(all)-356(cases)-357(where)-356(expandable)-356(tok)26(ens)-355(are)-356(not)-357(expanded.)-513(F)82(or)]TJ/F8 9.96 Tf 317.21 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)]TJ -336.23 -11.95 TD[(there)-333(are)-333(these)-333(additional)-334(conditionals:)]TJ/F5 9.96 Tf 14.94 -21.92 TD[(\217)]TJ/F10 9.96 Tf 9.97 0.01 TD[(\\ifdefined)]TJ/F5 9.96 Tf 52.3 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(tok)27(en)]TJ/F5 9.96 Tf 23.8 -0.01 TD[(i)]TJ/F4 9.96 Tf 13.85 0.01 TD[(\(test)-332(if)-334(tok)27(en)-332(is)-334(de\214ned\))]TJ -118.73 -21.93 TD[(T)83(rue)-333(if)]TJ/F5 9.96 Tf 32.69 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(tok)28(en)]TJ/F5 9.96 Tf 23.79 0 TD[(i)]TJ/F4 9.96 Tf 7.2 0 TD[(is)-332(de\214ned;)-334(creates)-333(no)-333(new)-334(hash)-333(table)-333(en)26(try)84(.)]TJ/F5 9.96 Tf -52.62 -21.92 TD[(\217)]TJ/F10 9.96 Tf 9.97 -0.01 TD[(\\ifcsname...\\endcsname)]TJ/F4 9.96 Tf 125.03 0 TD[(\(test)-332(if)-334(con)27(trol)-332(sequence)-334(is)-333(de\214ned\))]TJ -149.95 -21.92 TD[(T)82(rue)-347(if)-349(the)-349(con)27(trol)-348(sequence)]TJ/F10 9.96 Tf 125.42 0.01 TD[(\\csname...\\endcsname)]TJ/F4 9.96 Tf 108.09 -0.01 TD[(w)27(ould)-348(b)-27(e)-349(de\214ned;)-357(creates)]TJ -233.5 -11.95 TD[(no)-333(new)-334(hash)-333(table)-333(en)27(try)83(.)]TJ/F5 9.96 Tf 14.95 -21.92 TD[(\217)]TJ/F10 9.96 Tf 9.97 0.01 TD[(\\iffontchar)]TJ/F5 9.96 Tf 57.53 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(fon)27(t)]TJ/F5 9.96 Tf 17.17 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(8-bit)-333(n)27(um)27(b)-26(er)]TJ/F5 9.96 Tf 56.77 0 TD[(i)]TJ/F4 9.96 Tf 13.83 0.01 TD[(\(test)-333(if)-333(c)26(har)-332(exists\))]TJ -14.94 -30.98 TD[(13)]TJ ET
+endstream
+endobj
+100 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F1 10 0 R
+/F8 31 0 R
+/F3 16 0 R
+/F5 22 0 R
+>>
+endobj
+98 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 100 0 R
+>>
+endobj
+104 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 683.33
+/Ascent 750
+/Descent -250
+/FontBBox [-106 -350 1169 850]
+/FontName /FAKGAL+CMMI8
+/ItalicAngle -14
+/XHeight 430.6
+/StemV 80
+/FontFile 103 0 R
+/Flags 68
+>>
+endobj
+105 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/Name /F15
+/FontDescriptor 104 0 R
+/BaseFont /FAKGAL+CMMI8
+/FirstChar 33
+/LastChar 255
+/Widths [660.66 490.63 632.07 882.13 544.1 388.9 692.37 1062.52 1062.52 1062.52 1062.52
+295.14 295.14 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26 531.26
+531.26 531.26 295.14 295.14 826.4 531.26 826.4 531.26 559.73 795.85 801.4 757.27
+871.68 778.66 672.4 827.93 872.84 460.68 580.39 896.02 722.58 1020.41 843.33 806.19
+673.62 835.7 800.23 646.19 618.59 718.81 618.76 1002.45 873.88 615.81 719.97 413.2
+413.2 413.2 1062.52 1062.52 434.03 564.36 454.52 460.19 546.71 492.89 510.42 505.62
+612.28 361.74 429.69 553.25 317.13 939.83 644.68 513.55 534.85 474.37 479.46 491.33
+383.69 615.17 517.37 762.45 598.1 525.18 494.22 349.54 400.18 673.45 531.26 0 642.89
+885.43 806.19 736.82 783.43 872.84 823.45 619.8 708.34 654.77 816.68 682.42 596.19
+547.25 470.15 429.52 467.02 533.17 495.66 376.16 612.28 619.8 639.18 522.29 467.02
+610.14 544.1 607.19 471.53 576.4 631.61 659.73 694.45 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 295.14]
+>>
+endobj
+106 0 obj
+<<
+/Length 8523
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(T)83(rue)-332(if)]TJ/F10 9.96 Tf 32.68 -0.01 TD[(\\char)]TJ/F5 9.96 Tf 26.15 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(8-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.75 0.01 TD[(i)]TJ/F4 9.96 Tf 7.2 -0.01 TD[(in)]TJ/F10 9.96 Tf 11.63 0 TD[(\\font)]TJ/F5 9.96 Tf 26.15 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(fon)27(t)]TJ/F5 9.96 Tf 17.16 0.01 TD[(i)]TJ/F4 9.96 Tf 7.19 -0.01 TD[(exists.)]TJ -177.71 -11.95 TD[(These)-333(are)]TJ/F8 9.96 Tf 45.46 0 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)-333(additional)-334(expandable)-333(commands:)]TJ/F5 9.96 Tf -64.5 -21.91 TD[(\217)]TJ/F10 9.96 Tf 9.97 0 TD[(\\unless)]TJ/F4 9.96 Tf 36.61 0 TD[(.)]TJ -36.61 -11.95 TD[(The)-462(next)-463(\(unexpanded\))-463(tok)27(en)-462(m)27(ust)-462(b)-28(e)-463(a)-463(b)-28(o)-27(olean)-463(conditional)-463(\(i.e.,)-495(not)]TJ/F10 9.96 Tf 0 -11.95 TD[(\\ifcase)]TJ/F4 9.96 Tf 36.61 0 TD[(\);)-333(the)-333(truth)-334(v)55(alue)-332(of)-334(that)-333(conditional)-333(is)-334(rev)27(ersed.)]TJ/F5 9.96 Tf -46.57 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.95 0.01 TD[(\\eTeXrevision)]TJ/F4 9.96 Tf 68 -0.01 TD[(.)]TJ -67.99 -11.95 TD[(The)-345(expansion)-347(is)-346(a)-346(list)-347(of)-346(c)27(haracter)-345(tok)26(ens)-345(of)-346(category)-346(12)-347(\(`other'\))-346(repre-)]TJ -0.01 -11.96 TD[(sen)27(ting)]TJ/F8 9.96 Tf 34.1 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X's)-333(revision)-333(\(minor)-333(v)26(ersion\))-332(n)27(um)28(b)-27(er,)-333(e.g.,)-334(`.0')-333(or)-333(`.1'.)]TJ/F5 9.96 Tf -63.1 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.97 0 TD[(\\topmarks)]TJ/F5 9.96 Tf 47.08 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(15-bit)-332(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.73 0 TD[(i)]TJ/F4 9.96 Tf 3.88 0 TD[(,)]TJ/F10 9.96 Tf 6.09 0 TD[(\\firstmarks)]TJ/F5 9.96 Tf 57.53 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(15-bit)-332(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.73 0 TD[(i)]TJ/F4 9.96 Tf 3.88 0.01 TD[(,)]TJ/F10 9.96 Tf -249.67 -11.96 TD[(\\botmarks)]TJ/F5 9.96 Tf 47.07 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(15-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.74 0 TD[(i)]TJ/F4 9.96 Tf 3.87 0.01 TD[(,)]TJ/F10 9.96 Tf 6.08 -0.01 TD[(\\splitfirstmarks)]TJ/F5 9.96 Tf 83.7 0.01 TD[(h)]TJ/F4 9.96 Tf 3.86 -0.01 TD[(15-bit)-333(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.75 0 TD[(i)]TJ/F4 9.96 Tf 3.88 0 TD[(,)-332(and)]TJ/F10 9.96 Tf -275.84 -11.95 TD[(\\splitbotmarks)]TJ/F5 9.96 Tf 73.23 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(15-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.74 0 TD[(i)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(.)]TJ -142.72 -11.95 TD[(These)-369(commands)-370(generalize)-370(T)]TJ 130.74 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ/F10 9.96 Tf 17.86 0.01 TD[(\\topmark)]TJ/F4 9.96 Tf 45.52 0 TD[(etc.)-370(to)-370(32768)-369(distinct)-370(mark)]TJ -199.65 -11.96 TD[(classes;)-333(the)-334(sp)-27(ecial)-334(case)]TJ/F10 9.96 Tf 105.17 0 TD[(\\topmarks0)]TJ/F4 9.96 Tf 55.62 0.01 TD[(is)-333(synon)26(ymous)-332(with)]TJ/F10 9.96 Tf 89.01 -0.01 TD[(\\topmark)]TJ/F4 9.96 Tf 45.16 0 TD[(etc.)]TJ/F5 9.96 Tf -304.91 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.97 0 TD[(\\unexpanded)]TJ/F5 9.96 Tf 57.54 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(general)-332(text)]TJ/F5 9.96 Tf 51.77 0.01 TD[(i)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(.)]TJ -117.06 -11.95 TD[(The)-333(expansion)-333(is)-334(the)-333(tok)27(en)-333(list)]TJ/F5 9.96 Tf 137.71 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(balanced)-333(text)]TJ/F5 9.96 Tf 58.94 0 TD[(i)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(.)]TJ/F5 9.96 Tf -214.36 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.96 0 TD[(\\detokenize)]TJ/F5 9.96 Tf 57.54 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(general)-333(text)]TJ/F5 9.96 Tf 51.78 0 TD[(i)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(.)]TJ -117.07 -11.95 TD[(The)-490(expansion)-491(is)-491(a)-491(list)-491(of)-491(c)27(haracter)-490(tok)27(ens)-490(represen)27(ting)-490(the)-491(tok)27(en)-490(list)]TJ/F5 9.96 Tf 0 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(balanced)-332(text)]TJ/F5 9.96 Tf 58.94 0 TD[(i)]TJ/F4 9.96 Tf 3.87 0 TD[(.)-477(As)-344(with)-344(the)-344(lists)-345(of)-344(c)27(haracter)-343(tok)27(ens)-344(pro)-27(duced)-345(b)27(y)-343(T)]TJ 232.41 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)]TJ/F10 9.96 Tf -304.65 -11.95 TD[(\\the)]TJ/F4 9.96 Tf 25.74 -0.01 TD[(and)]TJ/F8 9.96 Tf 20.86 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ/F10 9.96 Tf 18.97 0 TD[(\\readline)]TJ/F4 9.96 Tf 47.07 0 TD[(,)-520(these)-482(tok)27(ens)-482(ha)27(v)28(e)-482(category)-483(12)-482(\(`other'\),)]TJ -131.67 -11.95 TD[(except)-332(that)-334(the)-333(c)27(haracter)-333(co)-27(de)-334(32)-333(gets)-333(category)-334(10)-333(\(`space'\).)]TJ/F5 9.96 Tf -9.97 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.96 0 TD[(\\scantokens)]TJ/F5 9.96 Tf 57.54 0 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(general)-333(text)]TJ/F5 9.96 Tf 51.77 0.01 TD[(i)]TJ/F4 9.96 Tf 3.88 0 TD[(.)]TJ -117.06 -11.96 TD[(The)-268(expansion)-269(is)-269(n)27(ull;)-290(but)]TJ/F8 9.96 Tf 114.45 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-269(creates)-268(a)-269(pseudo-\214le)-269(con)27(taining)-268(the)-269(c)27(har-)]TJ -133.48 -11.96 TD[(acters)-471(represen)27(ting)-470(the)-471(tok)27(en)-470(list)]TJ/F5 9.96 Tf 152.96 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(balanced)-333(text)]TJ/F5 9.96 Tf 58.94 0 TD[(i)]TJ/F4 9.96 Tf 8.57 0 TD[(and)-471(prepares)-471(to)-471(read)]TJ -224.33 -11.96 TD[(from)-388(this)-388(pseudo-\214le)-387(b)-28(efore)-388(lo)-28(oking)-388(at)-388(an)27(y)-387(more)-388(tok)27(ens)-387(from)-388(its)-387(curren)26(t)]TJ 0.01 -11.95 TD[(source.)]TJ -9.97 -21.92 TD[(These)-402(are)-402(the)-402(additional)]TJ/F8 9.96 Tf 112.42 0 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-402(cases)-402(when)-402(expandable)-402(tok)27(ens)-401(are)-402(not)-402(ex-)]TJ -146.38 -11.95 TD[(panded:)]TJ/F5 9.96 Tf 14.94 -21.91 TD[(\217)]TJ/F4 9.96 Tf 9.95 0 TD[(When)]TJ/F8 9.96 Tf 29.07 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-333(is)-333(reading)-334(the)-333(argumen)27(t)-332(tok)26(en)-332(for)]TJ/F10 9.96 Tf 160.37 0 TD[(\\ifdefined)]TJ/F4 9.96 Tf 52.31 -0.01 TD[(.)]TJ/F5 9.96 Tf -270.74 -19.92 TD[(\217)]TJ/F4 9.96 Tf 9.97 0.01 TD[(When)]TJ/F8 9.96 Tf 29.52 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-380(is)-380(absorbing)-380(the)-380(tok)27(en)-380(list)-380(for)]TJ/F10 9.96 Tf 145.73 0.01 TD[(\\unexpanded)]TJ/F4 9.96 Tf 57.54 -0.01 TD[(,)]TJ/F10 9.96 Tf 6.67 0.01 TD[(\\detokenize)]TJ/F4 9.96 Tf 57.53 -0.01 TD[(,)]TJ/F10 9.96 Tf -316.03 -11.95 TD[(\\scantokens)]TJ/F4 9.96 Tf 57.54 0 TD[(,)-333(or)]TJ/F10 9.96 Tf 18.29 0.01 TD[(\\showtokens)]TJ/F4 9.96 Tf 57.53 -0.01 TD[(.)]TJ/F5 9.96 Tf -143.31 -19.92 TD[(\217)]TJ/F4 9.96 Tf 9.96 0 TD[(Protected)-314(macros)-314(\(de\214ned)-315(with)-314(the)]TJ/F10 9.96 Tf 156.49 -0.01 TD[(\\protected)]TJ/F4 9.96 Tf 55.44 0.01 TD[(pre\214x\))-314(are)-314(not)-315(expanded)]TJ -211.94 -11.96 TD[(when)-333(building)-333(an)-333(expanded)-334(tok)27(en)-332(list)-334(\(for)]TJ/F10 9.96 Tf 186.05 0 TD[(\\edef)]TJ/F4 9.96 Tf 26.16 0.01 TD[(,)]TJ/F10 9.96 Tf 6.08 0 TD[(\\xdef)]TJ/F4 9.96 Tf 26.15 0 TD[(,)]TJ/F10 9.96 Tf 6.09 -0.01 TD[(\\message)]TJ/F4 9.96 Tf 41.85 0 TD[(,)]TJ/F10 9.96 Tf -292.38 -11.95 TD[(\\errmessage)]TJ/F4 9.96 Tf 57.54 0 TD[(,)]TJ/F10 9.96 Tf 5.66 0 TD[(\\special)]TJ/F4 9.96 Tf 41.84 -0.01 TD[(,)]TJ/F10 9.96 Tf 5.65 0 TD[(\\mark)]TJ/F4 9.96 Tf 26.15 0 TD[(,)]TJ/F10 9.96 Tf 5.65 0.01 TD[(\\marks)]TJ/F4 9.96 Tf 34.16 -0.01 TD[(or)-279(when)-278(writing)-279(the)-279(tok)27(en)-277(list)-279(for)]TJ/F10 9.96 Tf -176.64 -11.95 TD[(\\write)]TJ/F4 9.96 Tf 34.77 0 TD[(to)-340(a)-340(\214le\))-340(or)-340(when)-340(lo)-28(oking)-339(ahead)-340(in)-340(an)-340(alignmen)26(t)-339(for)]TJ/F10 9.96 Tf 229.93 0 TD[(\\noalign)]TJ/F4 9.96 Tf 45.23 -0.01 TD[(or)]TJ/F10 9.96 Tf -309.92 -11.95 TD[(\\omit)]TJ/F4 9.96 Tf 26.16 0 TD[(.)]TJ/F9 6.97 Tf 2.76 3.62 TD[(6)]TJ ET 0.40 w 61.77 -561.93 m 199.25 -561.93 l S BT/F12 5.98 Tf 72.86 -568.57 TD[(6)]TJ/F13 7.97 Tf 4.15 -2.81 TD[(Whereas)-455(protected)-455(macros)-455(w)29(ere)-454(in)28(tro)-28(duced)-455(with)]TJ/F15 7.97 Tf 187.01 0 TD[(")]TJ/F13 7.97 Tf 3.92 0.01 TD[(-T)]TJ 7.52 -1.72 TD[(E)]TJ 4.71 1.71 TD[(X)-454(V)87(ersion)-454(1,)-480(suppression)-455(of)-455(their)]TJ -218.39 -9.47 TD[(expansion)-353(in)-355(alignmen)29(ts)-353(w)28(as)-353(in)29(tro)-29(duced)-354(with)-354(V)87(ersion)-353(2.)]TJ/F4 9.96 Tf 166.87 -49.78 TD[(14)]TJ ET
+endstream
+endobj
+107 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F5 22 0 R
+/F8 31 0 R
+/F9 34 0 R
+/F12 42 0 R
+/F13 45 0 R
+/F15 105 0 R
+>>
+endobj
+102 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 107 0 R
+>>
+endobj
+110 0 obj
+<<
+/Length 7425
+>>
+stream
+ 0.00 g 0.00 G BT/F5 9.96 Tf 76.71 -62.76 TD[(\217)]TJ/F4 9.96 Tf 9.97 -0.01 TD[(When)-523(building)-523(an)-524(expanded)-524(tok)27(en)-522(list,)-571(the)-524(tok)27(ens)-523(resulting)-523(from)-524(the)]TJ -0.01 -11.95 TD[(expansion)-492(of)]TJ/F10 9.96 Tf 60.78 -0.01 TD[(\\unexpanded)]TJ/F4 9.96 Tf 62.44 0.01 TD[(are)-491(not)-491(expanded)-492(further)-492(\(this)-491(is)-492(the)-492(same)]TJ -123.21 -11.96 TD[(b)-27(eha)27(viour)-413(as)-413(is)-413(exhibited)-414(b)27(y)-412(the)-414(tok)27(ens)-412(resulting)-414(from)-413(the)-413(expansion)-414(of)]TJ/F10 9.96 Tf -0.01 -11.96 TD[(\\the)]TJ/F5 9.96 Tf 20.93 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(tok)27(en)-332(v)54(ariable)]TJ/F5 9.96 Tf 61.19 0 TD[(i)]TJ/F4 9.96 Tf 7.2 0 TD[(in)-332(b)-28(oth)-334(T)]TJ 40.67 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X)-333(and)]TJ/F8 9.96 Tf 30.17 0 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X\).)]TJ/F1 14.35 Tf -213.5 -32.88 TD[(4)]TJ/F2 14.35 Tf 24.2 0 TD[(")]TJ/F1 14.35 Tf 6.57 -0.01 TD[(-T)]TJ 13.92 -3.18 TD[(E)]TJ 8.58 3.18 TD[(X)-374(Enhancemen)30(ts)]TJ/F4 9.96 Tf -53.28 -21.82 TD[(The)-455(execution)-455(of)-455(most)-455(new)-455(primitiv)27(es)-454(related)-455(to)-455(enhancemen)27(ts)-454(is)-455(disallo)27(w)27(ed)]TJ 0 -11.96 TD[(when)-361(the)-361(corresp)-28(onding)-361(enhancemen)27(t)-360(is)-361(curren)26(tly)-360(disabled)-361(and)-361(will)-361(lead)-361(to)-361(an)]TJ 0.01 -11.95 TD[(`)]TJ/F10 9.96 Tf 2.77 0 TD[(Improper...)]TJ/F4 9.96 Tf 57.52 -0.01 TD[(')-238(error)-238(message.)-412(The)-238(o\213ending)-238(command)-238(ma)27(y)-237(nev)27(ertheless)-237(already)]TJ -60.29 -11.95 TD[(ha)27(v)28(e)-332(had)-333(some)-334(e\213ect)-333(suc)27(h)-333(as,)-333(e.g.,)-333(bringing)]TJ/F8 9.96 Tf 191.42 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X)-333(in)27(to)-332(horizon)27(tal)-333(mo)-27(de.)]TJ/F1 11.96 Tf -210.46 -27.82 TD[(4.1)-1124(Mixed-Direction)-375(T)30(yp)-30(esetting)]TJ/F4 9.96 Tf -0.01 -18.39 TD[(This)-277(feature)-276(supp)-28(orts)-277(mixed)-277(left-to-righ)27(t)-276(and)-277(righ)27(t-to-left)-276(t)27(yp)-27(esetting)-277(and)-277(in)27(tro-)]TJ 0 -11.95 TD[(duces)-376(the)-375(four)-376(text-direction)-375(primitiv)26(es)]TJ/F10 9.96 Tf 176.1 0 TD[(\\beginL)]TJ/F4 9.96 Tf 36.62 0 TD[(,)]TJ/F10 9.96 Tf 6.5 0 TD[(\\endL)]TJ/F4 9.96 Tf 26.15 0 TD[(,)]TJ/F10 9.96 Tf 6.52 0 TD[(\\beginR)]TJ/F4 9.96 Tf 36.61 0.01 TD[(,)-375(and)]TJ/F10 9.96 Tf 26.3 -0.01 TD[(\\endR)]TJ/F4 9.96 Tf 26.15 0 TD[(.)]TJ -340.94 -11.95 TD[(The)-333(co)-28(de)-333(is)-333(inspired)-334(b)27(y)-332(but)-334(di\213eren)27(t)-332(from)-333(T)]TJ 191.7 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.8 0 TD[(X)]TJ 7.23 -2.21 TD[(E)]TJ 5.61 2.22 TD[(T)]TJ/F4 9.96 Tf 11.3 -0.01 TD[([6].)]TJ -217.22 -11.95 TD[(In)-413(order)-415(to)-414(a)27(v)28(oid)-413(confusion)-414(with)-414(T)]TJ 154.1 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.8 -0.01 TD[(X)]TJ 7.23 -2.21 TD[(E)]TJ 5.61 2.21 TD[(T)]TJ/F4 9.96 Tf 12.11 0 TD[(the)-413(presen)27(t)-413(implemen)26(tation)-413(of)]TJ -210.33 -11.96 TD[(mixed-direction)-283(t)27(yp)-27(esetting)-282(is)-283(called)-282(T)]TJ 164.72 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.8 0.01 TD[(-X)]TJ 11.04 -2.22 TD[(E)]TJ 5.62 2.21 TD[(T)]TJ/F4 9.96 Tf 7.97 0 TD[(.)-427(It)-282(uses)-283(the)-283(same)-282(text-direction)]TJ -205.68 -11.95 TD[(primitiv)27(es,)-332(but)-333(di\213ers)-334(from)-333(T)]TJ 126.39 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.79 -0.01 TD[(X)]TJ 7.23 -2.21 TD[(E)]TJ 5.61 2.22 TD[(T)]TJ/F4 9.96 Tf 11.29 -0.01 TD[(in)-333(sev)27(eral)-332(imp)-28(ortan)27(t)-333(asp)-27(ects:)]TJ -166.86 -11.95 TD[(\(1\))-324(Righ)27(t-to-left)-323(text)-325(is)-324(rev)27(ersed)-323(explicitly)-324(b)26(y)]TJ/F8 9.96 Tf 199.2 0 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-324(and)-324(is)-324(written)-324(to)-324(a)-325(normal)]TJ -218.23 -11.95 TD[(D)27(VI)-332(\214le)-333(without)-334(an)27(y)]TJ/F10 9.96 Tf 93.67 0.01 TD[(begin_reflect)]TJ/F4 9.96 Tf 71.32 -0.01 TD[(or)]TJ/F10 9.96 Tf 12.21 0.01 TD[(end_reflect)]TJ/F4 9.96 Tf 60.85 -0.01 TD[(commands;)]TJ -238.05 -11.95 TD[(\(2\))-232(a)-231(math)-232(no)-28(de)-232(is)-232(\(ab\)used)-232(instead)-232(of)-232(a)-232(whatsit)-232(no)-28(de)-231(to)-232(record)-232(the)-232(text-direction)]TJ 0 -11.97 TD[(primitiv)27(es)-315(in)-316(order)-316(to)-317(minimize)-316(the)-316(in\215uence)-316(on)-316(the)-316(line-breaking)-316(algorithm)-317(for)]TJ 0 -11.95 TD[(pure)-333(left-to-righ)27(t)-333(text;)]TJ 0.01 -11.95 TD[(\(3\))-433(righ)27(t-to-left)-433(text)-434(in)27(terrupted)-433(b)27(y)-433(a)-434(displa)27(y)27(ed)-433(equation)-433(is)-434(automatically)-434(re-)]TJ 0 -11.95 TD[(sumed)-332(after)-334(that)-333(equation;)]TJ -0.01 -11.95 TD[(\(4\))-367(displa)27(y)-367(math)-367(material)-368(is)-367(alw)27(a)27(ys)-366(prin)27(ted)-367(left-to-righ)27(t,)-375(ev)27(en)-367(in)-367(constructions)]TJ 0 -11.96 TD[(suc)27(h)-332(as:)]TJ/F10 9.96 Tf 15.69 -19.6 TD[(\\hbox{\\beginR\\vbox{\\noindent$$abc\\eqno\(123\)$$}\\endR})]TJ/F4 9.96 Tf -0.74 -19.6 TD[(T)]TJ 5.53 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.79 0 TD[(-X)]TJ 11.05 -2.2 TD[(E)]TJ 5.61 2.2 TD[(T)]TJ/F4 9.96 Tf 12.76 0.01 TD[(is)-478(enabled)-480(or)-479(disabled)-480(b)27(y)-478(assigning)-480(a)-479(p)-28(ositiv)27(e)-478(or)-480(non-p)-27(ositiv)26(e)]TJ -66.23 -11.96 TD[(v)55(alue)-396(resp)-27(ectiv)26(ely)-395(to)-396(the)]TJ/F10 9.96 Tf 111.91 0.01 TD[(\\TeXXeTstate)]TJ/F4 9.96 Tf 66.71 -0.01 TD[(state)-396(v)55(ariable.)-632(As)-397(long)-396(as)-396(T)]TJ 124.13 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.8 0 TD[(-X)]TJ 11.05 -2.22 TD[(E)]TJ 5.61 2.21 TD[(T)]TJ/F4 9.96 Tf -335.74 -11.96 TD[(is)-419(disabled,)]TJ/F8 9.96 Tf 53.52 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-419(and)-420(T)]TJ 37.42 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X3)-419(build)-419(horizon)26(tal)-418(lists)-420(and)-419(paragraphs)-420(in)-419(exactly)]TJ -115.51 -11.95 TD[(the)-420(same)-420(w)27(a)28(y)83(.)-703(Ev)27(en)-419(T)]TJ 101.13 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.79 -0.01 TD[(-X)]TJ 11.04 -2.21 TD[(E)]TJ 5.63 2.21 TD[(T)]TJ/F4 9.96 Tf 12.15 -0.01 TD[(will,)-441(in)-419(general,)-442(pro)-28(duce)-420(the)-419(same)-420(results)-420(as)]TJ -146.28 -11.95 TD[(T)]TJ 5.54 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X3)-301(for)-301(pure)-301(left-to-righ)27(t)-300(text.)-433(There)-301(are,)-308(ho)27(w)28(ev)27(er,)-306(circumstances)-301(where)-301(some)]TJ -11.07 -11.95 TD[(di\213erences)-333(ma)27(y)-333(arise.)-444(This)-333(is)-334(b)-27(est)-334(illustrated)-333(b)27(y)-333(an)-333(example:)]TJ/F10 9.96 Tf 15.7 -19.61 TD[(\\vbox{\\noindent)]TJ 15.68 -11.95 TD[($\\hfil\\break)]TJ 0 -11.96 TD[(\\null\\hfil\\break)]TJ 0.01 -11.96 TD[(\\null$\\par)]TJ/F4 9.96 Tf -31.39 -19.61 TD[(Here)-333(T)]TJ 29.09 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-333(will)-333(pro)-28(duce)-333(three)-334(lines)-333(con)27(taining)-332(the)-334(follo)27(wing)-332(no)-28(des:)]TJ -34.62 -11.95 TD[(1.)-444(mathon,)-333(h\214l)-333(glue,)-334(break)-333(p)-28(enalt)27(y)83(,)-332(and)-333(righ)26(tskip)-332(glue;)]TJ 0 -11.96 TD[(2.)-444(empt)27(y)-332(h)27(b)-27(o)27(x,)-333(h\214l)-333(glue,)-333(break)-334(p)-27(enalt)26(y)84(,)-333(and)-333(righ)27(tskip)-333(glue;)]TJ 166.87 -29.88 TD[(15)]TJ ET
+endstream
+endobj
+111 0 obj
+<<
+/F5 22 0 R
+/F4 19 0 R
+/F10 37 0 R
+/F8 31 0 R
+/F1 10 0 R
+/F2 13 0 R
+/F11 39 0 R
+>>
+endobj
+109 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 111 0 R
+>>
+endobj
+115 0 obj
+<<
+/Length 8582
+>>
+stream
+ 0.00 g 0.00 G BT/F4 9.96 Tf 61.77 -62.76 TD[(3.)-444(empt)27(y)-332(h)26(b)-26(o)26(x,)-332(matho\213,)-333(nobreak)-334(p)-27(enalt)26(y)84(,)-333(par\214llskip)-333(glue,)-333(and)-334(righ)27(tskip)-332(glue.)]TJ 0 -11.96 TD[(These)-333(lines)-333(can)-333(b)-28(e)-333(retriev)26(ed)-332(via:)]TJ/F10 9.96 Tf 31.38 -17.57 TD[(\\setbox3=\\lastbox)]TJ -0.01 -11.96 TD[(\\unskip\\unpenalty)]TJ 0 -11.96 TD[(\\setbox2=\\lastbox)]TJ 0 -11.95 TD[(\\unskip\\unpenalty)]TJ 0.01 -11.95 TD[(\\setbox1=\\lastbox)]TJ/F4 9.96 Tf -31.38 -17.57 TD[(Later)-305(on)-306(these)-305(lines)-306(can)-306(b)-28(e)-305(`unh)26(b)-26(o)26(xed')-304(as)-306(part)-306(of)-306(a)-305(new)-306(paragraph)-306(and)-306(p)-27(ossibly)]TJ -0.01 -11.96 TD[(their)-486(con)27(ten)28(ts)-485(analyzed.)-903(As)-486(a)-486(consequence)-487(in)-486(T)]TJ 218.41 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-485(\(and)]TJ/F8 9.96 Tf 37.08 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-485(in)-486(compati-)]TJ -280.07 -11.95 TD[(bilit)27(y)-449(mo)-27(de\))-450(there)-450(ma)27(y)-449(b)-28(e)-449(horizon)26(tal)-448(lists)-450(where)-450(mathon)-450(and)-449(matho\213)-450(no)-28(des)]TJ 0 -11.95 TD[(are)-352(not)-352(prop)-28(erly)-352(paired.)-501(Therefore)-352(T)]TJ 160.61 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-351(migh)26(t)-351(attempt)-352(h)27(yphenation)-351(of)-352(`w)27(ords')]TJ -166.14 -11.96 TD[(originating)-347(from)-348(math)-347(mo)-28(de)-348(or)-347(prev)27(en)27(t)-346(h)27(yphenation)-347(of)-347(w)27(ords)-347(originating)-347(from)]TJ 0.01 -11.95 TD[(horizon)28(tal)-333(mo)-28(de.)]TJ 14.94 -11.95 TD[(Math-mo)-27(de)-262(material)-261(is)-261(alw)27(a)27(ys)-260(t)27(yp)-27(eset)-261(left-to-righ)27(t)-261(b)27(y)-260(T)]TJ 237.62 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.78 0.01 TD[(-X)]TJ 11.06 -2.22 TD[(E)]TJ 5.61 2.22 TD[(T)]TJ/F4 9.96 Tf 7.97 -0.01 TD[(,)-275(ev)26(en)-260(when)]TJ -293.53 -11.95 TD[(it)-403(is)-402(con)26(tained)-401(inside)-403(righ)27(t-to-left)-402(text.)-653(Therefore)-402(T)]TJ 228.65 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.79 0 TD[(-X)]TJ 11.06 -2.21 TD[(E)]TJ 5.61 2.21 TD[(T)]TJ/F4 9.96 Tf 11.98 0.01 TD[(will)-402(insert)-403(addi-)]TJ -273.61 -11.96 TD[(tional)]TJ/F10 9.96 Tf 28.51 0 TD[(beginM)]TJ/F4 9.96 Tf 34.98 0 TD[(and)]TJ/F10 9.96 Tf 19.65 0.01 TD[(endM)]TJ/F4 9.96 Tf 24.53 -0.01 TD[(math)-361(no)-28(des)-362(suc)27(h)-361(that)-362(material)-362(originating)-362(from)-362(math)]TJ -107.68 -11.95 TD[(mo)-27(de)-429(is)-428(alw)26(a)28(ys)-427(enclosed)-429(b)-28(et)27(w)28(een)-428(prop)-27(erly)-429(paired)-428(math)-429(no)-28(des.)-730(Consequen)27(tly)]TJ 0 -11.95 TD[(T)]TJ 5.53 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.8 0 TD[(-X)]TJ 11.04 -2.22 TD[(E)]TJ 5.62 2.21 TD[(T)]TJ/F4 9.96 Tf 12.53 -0.01 TD[(will)-458(nev)27(er)-457(attempt)-458(h)27(yphenation)-457(of)-458(`w)27(ords')-457(originating)-458(from)-458(math)]TJ -51.06 -11.95 TD[(mo)-27(de)-334(nor)-333(prev)27(en)28(t)-333(h)27(yphenation)-332(of)-334(w)27(ords)-332(originating)-334(from)-333(horizon)27(tal)-332(mo)-28(de.)]TJ 14.94 -11.95 TD[(The)-416(additional)-415(math)-416(no)-28(des)-416(in)27(tro)-27(duced)-415(b)26(y)-414(T)]TJ 195.69 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.79 0.01 TD[(-X)]TJ 11.04 -2.22 TD[(E)]TJ 5.62 2.21 TD[(T)]TJ/F4 9.96 Tf 12.11 -0.01 TD[(are,)-435(ho)26(w)28(ev)28(er,)-435(trans-)]TJ -255.74 -11.95 TD[(paren)27(t)-267(to)-268(op)-28(erations)-268(suc)27(h)-267(as)]TJ/F10 9.96 Tf 123.44 0 TD[(\\lastpenalty)]TJ/F4 9.96 Tf 65.43 0.01 TD[(that)-268(insp)-28(ect)-268(or)-268(remo)27(v)28(e)-267(the)-268(last)-269(no)-27(de)]TJ -188.87 -11.96 TD[(of)-333(a)-334(horizon)27(tal)-332(list.)]TJ/F9 6.97 Tf 82.56 3.62 TD[(7)]TJ/F4 9.96 Tf -67.6 -15.56 TD[(When)-408(T)]TJ 35.34 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.8 -0.01 TD[(-X)]TJ 11.05 -2.21 TD[(E)]TJ 5.62 2.22 TD[(T)]TJ/F4 9.96 Tf 12.04 0 TD[(is)-409(enabled)-409(or)-409(disabled)-409(during)-410(the)-409(construction)-409(of)-410(a)-409(b)-28(o)27(x,)]TJ -95.34 -11.95 TD[(that)-285(b)-27(o)26(x)-284(ma)27(y)-284(con)27(tain)-284(text-direction)-285(directiv)27(es)-284(or)-285(math)-285(no)-28(des)-285(that)-285(are)-285(not)-284(prop-)]TJ 0 -11.96 TD[(erly)-322(paired.)-440(Suc)26(h)-321(unpaired)-322(no)-28(des)-322(ma)27(y)-321(cause)-322(w)27(arning)-321(messages)-322(when)-322(the)-322(b)-28(o)27(x)-321(is)]TJ 0.01 -11.95 TD[(shipp)-27(ed)-366(out.)-542(It)-366(is,)-374(therefore,)-375(advisable)-366(that)-366(T)]TJ 200.34 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X-)]TJ/F11 9.96 Tf 10.79 0 TD[(-X)]TJ 11.05 -2.21 TD[(E)]TJ 5.63 2.21 TD[(T)]TJ/F4 9.96 Tf 11.61 -0.01 TD[(b)-27(e)-366(enabled)-366(or)-366(disabled)]TJ -244.96 -11.95 TD[(only)-333(in)-333(v)27(ertical)-332(mo)-28(de.)]TJ/F1 14.35 Tf -0.01 -32.44 TD[(5)-1125(Syn)30(tax)-374(Extensions)-375(for)]TJ/F2 14.35 Tf 184.56 -0.01 TD[(")]TJ/F1 14.35 Tf 6.58 0 TD[(-T)]TJ 13.91 -3.18 TD[(E)]TJ 8.57 3.19 TD[(X)]TJ/F1 11.96 Tf -213.61 -23.82 TD[(5.1)-1124(Mo)-31(de-Indep)-32(enden)31(t)-374(Commands)]TJ/F4 9.96 Tf -0.01 -18.38 TD[(The)-429(syn)26(tax)-428(for)-430(T)]TJ 76.03 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)-429(mo)-27(de-indep)-28(enden)27(t)-429(commands,)-453(as)-430(describ)-28(ed)-429(in)-430(the)-429(\214rst)]TJ -81.56 -11.96 TD[(part)-390(of)-391(Chapter)-391(24)-391(of)]TJ/F3 9.96 Tf 99.23 0 TD[(The)-390(T)]TJ 26.58 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-100(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 30.39 0 TD[(,)-405(is)-391(extended)-391(b)27(y)-390(mo)-28(di\214cations)-391(of)-391(existing)]TJ -161.73 -11.95 TD[(commands)-332(as)-334(w)27(ell)-332(as)-334(b)27(y)-332(new)-334(commands.)]TJ 14.94 -11.95 TD[(First,)]TJ/F8 9.96 Tf 27.43 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-363(has)-363(32768)]TJ/F10 9.96 Tf 57.69 0 TD[(\\count)]TJ/F4 9.96 Tf 31.37 -0.01 TD[(,)]TJ/F10 9.96 Tf 6.47 0.01 TD[(\\dimen)]TJ/F4 9.96 Tf 31.38 0 TD[(,)]TJ/F10 9.96 Tf 6.47 0 TD[(\\skip)]TJ/F4 9.96 Tf 26.16 0 TD[(,)]TJ/F10 9.96 Tf 6.46 0 TD[(\\muskip)]TJ/F4 9.96 Tf 36.6 0 TD[(,)]TJ/F10 9.96 Tf 6.47 -0.01 TD[(\\box)]TJ/F4 9.96 Tf 20.93 0.01 TD[(,)-371(and)]TJ/F10 9.96 Tf 26.14 0 TD[(\\toks)]TJ/F4 9.96 Tf -317.56 -11.96 TD[(registers)-373(instead)-374(of)-373(T)]TJ 91.92 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-373(256.)-565(Th)27(us)-373(it)-374(allo)27(ws)-372(a)]TJ/F5 9.96 Tf 116.01 0 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(15-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.73 0 TD[(i)]TJ/F4 9.96 Tf 7.61 0.01 TD[(instead)-373(of)-373(an)]TJ/F5 9.96 Tf -286.68 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(8-bit)-332(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.75 0.01 TD[(i)]TJ/F4 9.96 Tf 6.31 -0.01 TD[(in)-243(almost)-244(all)-244(syn)27(tax)-243(constructions)-244(referring)-244(to)-244(these)-244(registers;)-274(the)]TJ -66.95 -11.95 TD[(only)-322(exception)-323(to)-322(this)-323(is)-322(the)]TJ/F10 9.96 Tf 124.55 -0.01 TD[(\\insert)]TJ/F4 9.96 Tf 39.83 0 TD[(command:)-439(insertion)-322(classes)-323(are)-322(restricted)]TJ -164.37 -11.96 TD[(to)-333(the)-333(range)-334(0{254)-333(in)]TJ/F8 9.96 Tf 96.34 0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-333(as)-333(they)-334(are)-333(in)-333(T)]TJ 79.23 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X.)]TJ -185.19 -11.95 TD[(Next,)]TJ/F8 9.96 Tf 27.11 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-333(extends)-333(the)-333(list)-334(of)-333(T)]TJ 97.79 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X's)-333(in)27(ternal)-333(quan)27(tities:)]TJ/F5 9.96 Tf -149.49 -16.76 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(in)27(ternal)-332(in)27(teger)]TJ/F5 9.96 Tf 66.48 0.01 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.56 0 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.65 0 TD[(The)-333(T)]TJ 26.01 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-100(b)-27(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf 32.72 0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 0 TD[(\\eTeXversion)]TJ/F5 9.96 Tf -220.36 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\interactionmode)]TJ/F5 9.96 Tf 87.01 0 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 -0.01 TD[(p)-27(enalties)]TJ/F5 9.96 Tf 38.52 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 -0.01 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 0 TD[(i)]TJ ET 0.40 w 61.77 -591.29 m 199.25 -591.29 l S BT/F12 5.98 Tf 72.86 -597.93 TD[(7)]TJ/F13 7.97 Tf 4.15 -2.82 TD[(This)-354(w)29(as)-354(not)-354(the)-354(case)-354(for)-354(some)-354(earlier)-355(T)]TJ 147.94 -1.72 TD[(E)]TJ 4.7 1.72 TD[(X-)]TJ/F16 7.97 Tf 9.16 0 TD[(-X)]TJ 8.84 -1.78 TD[(E)]TJ 4.49 1.77 TD[(T)]TJ/F13 7.97 Tf 9.2 0 TD[(implemen)29(tations.)]TJ/F4 9.96 Tf -32.7 -29.88 TD[(16)]TJ ET
+endstream
+endobj
+116 0 obj
+<<
+/F4 19 0 R
+/F10 37 0 R
+/F8 31 0 R
+/F11 39 0 R
+/F9 34 0 R
+/F1 10 0 R
+/F2 13 0 R
+/F3 16 0 R
+/F5 22 0 R
+/F12 42 0 R
+/F13 45 0 R
+/F16 114 0 R
+>>
+endobj
+113 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 116 0 R
+>>
+endobj
+119 0 obj
+<<
+/Length 10729
+>>
+stream
+ 0.00 g 0.00 G BT/F5 9.96 Tf 99.96 -62.76 TD[(j)]TJ/F10 9.96 Tf 6.09 -0.01 TD[(\\lastnodetype)]TJ/F5 9.96 Tf 71.31 0 TD[(j)]TJ/F10 9.96 Tf 6.08 0 TD[(\\currentgrouplevel)]TJ/F5 9.96 Tf 97.47 0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 -0.01 TD[(\\currentgrouptype)]TJ/F5 9.96 Tf -187.04 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\currentiflevel)]TJ/F5 9.96 Tf 81.77 -0.01 TD[(j)]TJ/F10 9.96 Tf 6.09 0.01 TD[(\\currentiftype)]TJ/F5 9.96 Tf 76.55 -0.01 TD[(j)]TJ/F10 9.96 Tf 6.1 0 TD[(\\currentifbranch)]TJ/F5 9.96 Tf -176.6 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.1 0 TD[(\\gluestretchorder)]TJ/F5 9.96 Tf 88.91 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(glue)]TJ/F5 9.96 Tf 17.7 0.01 TD[(i)-333(j)]TJ/F10 9.96 Tf 13.29 -0.01 TD[(\\glueshrinkorder)]TJ/F5 9.96 Tf 83.68 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(glue)]TJ/F5 9.96 Tf 17.71 -0.01 TD[(i)]TJ -235.14 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.1 -0.01 TD[(\\numexpr)]TJ/F5 9.96 Tf 41.84 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(in)28(teger)-333(expr)]TJ/F5 9.96 Tf 52.07 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.76 -0.01 TD[(optional)-332(spaces)-334(and)]TJ/F10 9.96 Tf 88.66 0 TD[(\\relax)]TJ/F5 9.96 Tf 31.38 0 TD[(i)]TJ -254.93 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(p)-27(enalties)]TJ/F5 9.96 Tf 38.53 -0.01 TD[(i)-332(\200)165(!)]TJ/F10 9.96 Tf 26.56 0.01 TD[(\\interlinepenalties)]TJ/F5 9.96 Tf 102.7 -0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 0.01 TD[(\\clubpenalties)]TJ/F5 9.96 Tf -154.5 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\widowpenalties)]TJ/F5 9.96 Tf 81.78 0 TD[(j)]TJ/F10 9.96 Tf 6.1 -0.01 TD[(\\displaywidowpenalties)]TJ/F5 9.96 Tf -117.21 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(in)27(ternal)-332(dimen)]TJ/F5 9.96 Tf 63.4 0 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.57 0.01 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.65 -0.01 TD[(The)-333(T)]TJ 26.01 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf -178.49 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\parshapeindent)]TJ/F5 9.96 Tf 78.45 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 0 TD[(i)-333(j)]TJ/F10 9.96 Tf 13.29 0.01 TD[(\\parshapelength)]TJ/F5 9.96 Tf 78.45 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.97 0.01 TD[(i)]TJ -249.96 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\parshapedimen)]TJ/F5 9.96 Tf 73.23 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 -0.01 TD[(i)]TJ -116.15 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\gluestretch)]TJ/F5 9.96 Tf 62.76 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(glue)]TJ/F5 9.96 Tf 17.71 -0.01 TD[(i)-333(j)]TJ/F10 9.96 Tf 13.28 0 TD[(\\glueshrink)]TJ/F5 9.96 Tf 57.53 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(glue)]TJ/F5 9.96 Tf 17.7 0 TD[(i)]TJ -183.81 -11.96 TD[(j)]TJ/F10 9.96 Tf 5.13 0 TD[(\\fontcharht)]TJ/F5 9.96 Tf 57.53 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(fon)28(t)]TJ/F5 9.96 Tf 17.15 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0.01 TD[(8-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.76 -0.01 TD[(i)-236(j)]TJ/F10 9.96 Tf 11.34 0.01 TD[(\\fontcharwd)]TJ/F5 9.96 Tf 57.54 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(fon)27(t)]TJ/F5 9.96 Tf 17.16 0 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(8-bit)-333(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.77 0 TD[(i)]TJ -302.62 -11.95 TD[(j)]TJ/F10 9.96 Tf 5.13 0 TD[(\\fontchardp)]TJ/F5 9.96 Tf 57.53 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(fon)27(t)]TJ/F5 9.96 Tf 17.15 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 0.01 TD[(8-bit)-332(n)26(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.75 0 TD[(i)-236(j)]TJ/F10 9.96 Tf 11.35 -0.01 TD[(\\fontcharic)]TJ/F5 9.96 Tf 57.54 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(fon)27(t)]TJ/F5 9.96 Tf 17.16 0 TD[(ih)]TJ/F4 9.96 Tf 7.74 -0.01 TD[(8-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.76 0.01 TD[(i)]TJ -301.65 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.1 0 TD[(\\dimexpr)]TJ/F5 9.96 Tf 41.84 0 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(dimen)-333(expr)]TJ/F5 9.96 Tf 49.01 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 0.01 TD[(optional)-332(spaces)-334(and)]TJ/F10 9.96 Tf 88.66 0 TD[(\\relax)]TJ/F5 9.96 Tf 31.38 0 TD[(i)]TJ -251.86 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(in)28(ternal)-333(glue)]TJ/F5 9.96 Tf 54.54 -0.01 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.56 0.01 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.66 0 TD[(The)-332(T)]TJ 26 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-100(b)-28(o)-27(ok)]TJ/F4 9.96 Tf 33.71 -0.01 TD[(de\214nes)]TJ/F5 9.96 Tf 32.71 0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 -0.01 TD[(\\mutoglue)]TJ/F5 9.96 Tf 47.07 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(m)27(uglue)]TJ/F5 9.96 Tf 31.28 -0.01 TD[(i)]TJ -290.65 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.08 0 TD[(\\glueexpr)]TJ/F5 9.96 Tf 47.08 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(glue)-333(expr)]TJ/F5 9.96 Tf 40.16 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.76 0 TD[(optional)-333(spaces)-333(and)]TJ/F10 9.96 Tf 88.66 -0.01 TD[(\\relax)]TJ/F5 9.96 Tf 31.39 0 TD[(i)]TJ -248.24 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(in)27(ternal)-332(m)27(uglue)]TJ/F5 9.96 Tf 68.1 0 TD[(i)-333(\200)165(!)]TJ/F4 9.96 Tf 26.58 -0.01 TD[(whatev)28(er)]TJ/F3 9.96 Tf 42.64 0.01 TD[(The)-333(T)]TJ 26.01 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf 32.71 0.01 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\gluetomu)]TJ/F5 9.96 Tf 47.07 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(glue)]TJ/F5 9.96 Tf 17.71 0 TD[(i)]TJ -290.65 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\muexpr)]TJ/F5 9.96 Tf 36.6 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(m)27(uglue)-332(expr)]TJ/F5 9.96 Tf 53.71 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.76 0 TD[(optional)-333(spaces)-333(and)]TJ/F10 9.96 Tf 88.66 0 TD[(\\relax)]TJ/F5 9.96 Tf 31.38 0.01 TD[(i)]TJ/F4 9.96 Tf -251.33 -17.94 TD[(The)-333(additional)-334(p)-27(ossibilities)-334(for)]TJ/F5 9.96 Tf 136.36 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(in)27(teger)-332(parameter)]TJ/F5 9.96 Tf 77.29 0 TD[(i)]TJ/F4 9.96 Tf 7.2 0 TD[(are:)]TJ/F10 9.96 Tf -214.76 -11.96 TD[(\\TeXXeTstate)]TJ/F4 9.96 Tf 72.73 0.01 TD[(\(p)-28(ositiv)27(e)-332(if)-333(mixed-direction)-334(t)27(yp)-27(esetting)-333(is)-333(enabled\))]TJ/F10 9.96 Tf -72.72 -11.96 TD[(\\tracingassigns)]TJ/F4 9.96 Tf 88.41 0 TD[(\(p)-28(ositiv)27(e)-332(if)-334(sho)27(wing)-332(assignmen)27(ts\))]TJ/F10 9.96 Tf -88.41 -11.96 TD[(\\tracinggroups)]TJ/F4 9.96 Tf 83.19 0 TD[(\(p)-27(ositiv)27(e)-333(if)-333(sho)27(wing)-333(sa)27(v)28(e)-332(groups\))]TJ/F10 9.96 Tf -83.19 -11.95 TD[(\\tracingifs)]TJ/F4 9.96 Tf 67.5 0.01 TD[(\(p)-27(ositiv)27(e)-333(if)-333(sho)27(wing)-333(conditionals\))]TJ/F10 9.96 Tf -67.5 -11.96 TD[(\\tracingscantokens)]TJ/F4 9.96 Tf 104.11 -0.01 TD[(\(p)-28(ositiv)27(e)-507(if)-509(sho)27(wing)-508(the)-509(op)-28(ening)-508(and)-509(closing)-509(of)]TJ/F10 9.96 Tf -79.2 -11.95 TD[(\\scantokens)]TJ/F4 9.96 Tf 60.86 0 TD[(pseudo-\214les\))]TJ/F10 9.96 Tf -85.76 -11.95 TD[(\\tracingnesting)]TJ/F4 9.96 Tf 88.41 0 TD[(\(p)-28(ositiv)27(e)-413(if)-414(sho)26(wing)-413(improp)-28(er)-414(nesting)-414(of)-415(groups)-414(and)]TJ -63.5 -11.96 TD[(conditionals)-332(within)-334(\214les\))]TJ/F10 9.96 Tf -24.91 -11.95 TD[(\\predisplaydirection)]TJ/F4 9.96 Tf 114.56 -0.01 TD[(\(text)-333(direction)-333(preceding)-334(a)-333(displa)27(y\))]TJ/F10 9.96 Tf -114.57 -11.95 TD[(\\lastlinefit)]TJ/F4 9.96 Tf 72.74 0.01 TD[(\(adjustmen)28(t)-333(ratio)-333(for)-333(last)-334(line)-333(of)-333(paragraph,)-334(times)-333(1000\))]TJ/F10 9.96 Tf -72.73 -11.96 TD[(\\savingvdiscards)]TJ/F4 9.96 Tf 93.64 0 TD[(\(p)-27(ositiv)26(e)-241(if)-242(sa)26(ving)-241(items)-243(discarded)-242(from)-243(v)27(ertical)-241(lists\))]TJ/F10 9.96 Tf -93.65 -11.96 TD[(\\savinghyphcodes)]TJ/F4 9.96 Tf 93.65 0.01 TD[(\(p)-28(ositiv)27(e)-388(if)]TJ/F10 9.96 Tf 51 -0.01 TD[(\\patterns)]TJ/F4 9.96 Tf 50.95 0 TD[(sa)27(v)28(es)]TJ/F10 9.96 Tf 25.85 0 TD[(\\lccode)]TJ/F4 9.96 Tf 40.5 0 TD[(v)55(alues)-389(as)-390(h)27(y-)]TJ -237.03 -11.95 TD[(phenation)-333(co)-28(des\))]TJ -49.81 -11.96 TD[(Note)-411(that)-411(the)]TJ/F8 9.96 Tf 65.15 -0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0.01 TD[(-T)]TJ 8.87 -2.15 TD[(E)]TJ 5.52 2.15 TD[(X)-412(state)-411(v)54(ariable)]TJ/F10 9.96 Tf 74.94 0.01 TD[(\\TeXXeTstate)]TJ/F4 9.96 Tf 66.86 0 TD[(\(the)-411(only)-412(one)-411(so)-412(far\))-411(is)-412(an)]TJ/F5 9.96 Tf -225.99 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(in)27(teger)-332(parameter)]TJ/F5 9.96 Tf 77.29 0.01 TD[(i)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(.)-673(That)-410(need)-410(not)-410(b)-27(e)-410(the)-410(case)-410(for)-410(all)-409(future)-410(state)-410(v)54(ariables;)]TJ -85.05 -11.95 TD[(it)-350(migh)27(t)-349(turn)-350(out)-350(that)-350(some)-350(future)-350(enhancemen)27(ts)-349(can)-350(b)-28(e)-350(enabled)-350(and)-350(disabled)]TJ 0 -11.96 TD[(only)-333(globally)82(,)-332(not)-333(sub)-56(ject)-333(to)-334(grouping.)]TJ 14.95 -11.96 TD[(The)-333(additional)-333(p)-28(ossibilities)-333(for)]TJ/F5 9.96 Tf 136.34 0 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(tok)27(en)-332(parameter)]TJ/F5 9.96 Tf 71.46 0.01 TD[(i)]TJ/F4 9.96 Tf 7.2 0 TD[(are:)]TJ/F10 9.96 Tf -208.91 -11.96 TD[(\\everyeof)]TJ/F4 9.96 Tf 57.03 -0.01 TD[(\(tok)27(ens)-332(to)-334(insert)-333(when)-333(an)]TJ/F10 9.96 Tf 114.72 0 TD[(\\input)]TJ/F4 9.96 Tf 34.69 0 TD[(\214le)-333(ends\))]TJ -216.4 -11.95 TD[(Here)-333(is)-333(the)-333(syn)26(tax)-332(for)]TJ/F8 9.96 Tf 97.85 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.86 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-332(expressions:)]TJ/F5 9.96 Tf -116.9 -17.93 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(in)28(teger)-333(expr)]TJ/F5 9.96 Tf 52.08 0 TD[(i)-332(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.43 0 TD[(in)27(teger)-332(term)]TJ/F5 9.96 Tf 53.47 0 TD[(i)]TJ -116.61 -11.95 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0.01 TD[(in)27(teger)-332(expr)]TJ/F5 9.96 Tf 52.08 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(add)-333(or)-333(sub)]TJ/F5 9.96 Tf 46.57 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(in)27(teger)-332(term)]TJ/F5 9.96 Tf 53.46 0 TD[(i)]TJ -200.83 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(in)27(teger)-332(term)]TJ/F5 9.96 Tf 53.47 0.01 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 -0.01 TD[(in)27(teger)-332(factor)]TJ/F5 9.96 Tf 58.17 0.01 TD[(i)]TJ -122.71 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(in)27(teger)-332(term)]TJ/F5 9.96 Tf 53.47 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0.01 TD[(m)28(ul)-333(or)-333(div)]TJ/F5 9.96 Tf 45.54 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0.01 TD[(in)27(teger)-332(factor)]TJ/F5 9.96 Tf 58.18 -0.01 TD[(i)]TJ -205.9 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(in)28(teger)-333(factor)]TJ/F5 9.96 Tf 58.16 0 TD[(i)-333(\200)166(!)-333(h)]TJ/F4 9.96 Tf 30.44 0.01 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.97 -0.01 TD[(i)]TJ -102.2 -11.95 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(left)-333(paren)]TJ/F5 9.96 Tf 41.81 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.76 0 TD[(in)28(teger)-333(expr)]TJ/F5 9.96 Tf 52.08 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 0.01 TD[(righ)27(t)-332(paren)]TJ/F5 9.96 Tf 48.49 -0.01 TD[(i)]TJ/F4 9.96 Tf -39.17 -41.84 TD[(17)]TJ ET
+endstream
+endobj
+120 0 obj
+<<
+/F5 22 0 R
+/F10 37 0 R
+/F4 19 0 R
+/F3 16 0 R
+/F8 31 0 R
+>>
+endobj
+118 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 120 0 R
+>>
+endobj
+123 0 obj
+<<
+/Length 11494
+>>
+stream
+ 0.00 g 0.00 G BT/F5 9.96 Tf 76.71 -62.76 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(dimen)-333(expr)]TJ/F5 9.96 Tf 49.01 0 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 0 TD[(dimen)-333(term)]TJ/F5 9.96 Tf 50.39 0.01 TD[(i)]TJ -110.47 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 -0.01 TD[(dimen)-333(expr)]TJ/F5 9.96 Tf 49.02 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 -0.01 TD[(add)-333(or)-333(sub)]TJ/F5 9.96 Tf 46.57 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 0.01 TD[(dimen)-333(term)]TJ/F5 9.96 Tf 50.39 0 TD[(i)]TJ -194.69 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(dimen)-333(term)]TJ/F5 9.96 Tf 50.39 0.01 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 -0.01 TD[(dimen)-333(factor)]TJ/F5 9.96 Tf 55.1 0.01 TD[(i)]TJ -116.57 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(dimen)-333(term)]TJ/F5 9.96 Tf 50.39 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(m)27(ul)-332(or)-333(div)]TJ/F5 9.96 Tf 45.55 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0.01 TD[(in)27(teger)-332(factor)]TJ/F5 9.96 Tf 58.17 0 TD[(i)]TJ -202.82 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(dimen)-333(factor)]TJ/F5 9.96 Tf 55.1 0 TD[(i)-333(\200)166(!)-333(h)]TJ/F4 9.96 Tf 30.45 0 TD[(dimen)]TJ/F5 9.96 Tf 26.56 0 TD[(i)]TJ -92.73 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(left)-333(paren)]TJ/F5 9.96 Tf 41.81 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(dimen)-333(expr)]TJ/F5 9.96 Tf 49.02 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(righ)28(t)-333(paren)]TJ/F5 9.96 Tf 48.48 0 TD[(i)]TJ -188.02 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(glue)-333(expr)]TJ/F5 9.96 Tf 40.16 0 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 0.01 TD[(glue)-333(term)]TJ/F5 9.96 Tf 41.54 0 TD[(i)]TJ -92.76 -11.97 TD[(j)-332(h)]TJ/F4 9.96 Tf 9.95 0.01 TD[(glue)-333(expr)]TJ/F5 9.96 Tf 40.16 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(add)-333(or)-334(sub)]TJ/F5 9.96 Tf 46.58 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(glue)-333(term)]TJ/F5 9.96 Tf 41.55 0 TD[(i)]TJ -176.98 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(glue)-333(term)]TJ/F5 9.96 Tf 41.54 -0.01 TD[(i)-333(\200)166(!)-333(h)]TJ/F4 9.96 Tf 30.44 0 TD[(glue)-333(factor)]TJ/F5 9.96 Tf 46.25 0.01 TD[(i)]TJ -98.85 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.97 -0.01 TD[(glue)-332(term)]TJ/F5 9.96 Tf 41.53 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(m)27(ul)-332(or)-334(div)]TJ/F5 9.96 Tf 45.56 0 TD[(ih)]TJ/F4 9.96 Tf 7.74 -0.01 TD[(in)27(teger)-332(factor)]TJ/F5 9.96 Tf 58.17 0 TD[(i)]TJ -193.97 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(glue)-333(factor)]TJ/F5 9.96 Tf 46.24 0 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 0.01 TD[(glue)]TJ/F5 9.96 Tf 17.7 -0.01 TD[(i)]TJ -75.02 -11.95 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(left)-333(paren)]TJ/F5 9.96 Tf 41.82 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(glue)-333(expr)]TJ/F5 9.96 Tf 40.15 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(righ)27(t)-332(paren)]TJ/F5 9.96 Tf 48.49 0.01 TD[(i)]TJ -179.16 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(m)28(uglue)-333(expr)]TJ/F5 9.96 Tf 53.71 0 TD[(i)-332(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.43 0 TD[(m)27(uglue)-332(term)]TJ/F5 9.96 Tf 55.11 0.01 TD[(i)]TJ -119.89 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 -0.01 TD[(m)27(uglue)-332(expr)]TJ/F5 9.96 Tf 53.72 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(add)-333(or)-333(sub)]TJ/F5 9.96 Tf 46.58 0 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(m)27(uglue)-332(term)]TJ/F5 9.96 Tf 55.1 0 TD[(i)]TJ -204.1 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(m)28(uglue)-333(term)]TJ/F5 9.96 Tf 55.09 0.01 TD[(i)-333(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.45 0 TD[(m)27(uglue)-332(factor)]TJ/F5 9.96 Tf 59.8 -0.01 TD[(i)]TJ -125.96 -11.95 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 -0.01 TD[(m)28(uglue)-333(term)]TJ/F5 9.96 Tf 55.09 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 0.01 TD[(m)28(ul)-333(or)-333(div)]TJ/F5 9.96 Tf 45.54 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 0 TD[(in)28(teger)-333(factor)]TJ/F5 9.96 Tf 58.16 -0.01 TD[(i)]TJ -207.52 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(m)28(uglue)-333(factor)]TJ/F5 9.96 Tf 59.8 0.01 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 -0.01 TD[(m)27(uglue)]TJ/F5 9.96 Tf 31.27 0.01 TD[(i)]TJ -102.15 -11.96 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.97 0.01 TD[(left)-333(paren)]TJ/F5 9.96 Tf 41.82 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 0.01 TD[(m)27(uglue)-332(expr)]TJ/F5 9.96 Tf 53.71 0 TD[(ih)]TJ/F4 9.96 Tf 7.76 -0.01 TD[(righ)28(t)-333(paren)]TJ/F5 9.96 Tf 48.48 0.01 TD[(i)]TJ -192.72 -11.97 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(optional)-333(spaces)-333(and)]TJ/F10 9.96 Tf 88.67 0 TD[(\\relax)]TJ/F5 9.96 Tf 31.38 0 TD[(i)-333(\200)166(!)-333(h)]TJ/F4 9.96 Tf 30.45 0 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.97 0 TD[(i)]TJ -197.09 -11.96 TD[(j)-332(h)]TJ/F4 9.96 Tf 9.95 0 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.98 -0.01 TD[(i)]TJ/F10 9.96 Tf 3.88 0 TD[(\\relax)]TJ/F5 9.96 Tf -103.05 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(add)-333(or)-333(sub)]TJ/F5 9.96 Tf 46.58 0 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 0 TD[(optional)-332(spaces)]TJ/F5 9.96 Tf 65.97 0 TD[(i)]TJ/F10 9.96 Tf 3.87 0.01 TD[(+)]TJ/F9 6.97 Tf 5.23 -1.5 TD[(12)]TJ/F5 9.96 Tf 11.75 1.49 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.97 0 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.97 0 TD[(i)]TJ/F10 9.96 Tf 3.88 0.01 TD[(-)]TJ/F9 6.97 Tf 5.24 -1.5 TD[(12)]TJ/F5 9.96 Tf -252.78 -10.46 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(div)-333(or)-333(m)27(ul)]TJ/F5 9.96 Tf 45.41 0 TD[(i)-333(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.45 0 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.97 -0.01 TD[(i)]TJ/F10 9.96 Tf 3.88 0.01 TD[(*)]TJ/F9 6.97 Tf 5.23 -1.5 TD[(12)]TJ/F5 9.96 Tf 11.77 1.5 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 0 TD[(optional)-332(spaces)]TJ/F5 9.96 Tf 65.97 0 TD[(i)]TJ/F10 9.96 Tf 3.87 -0.01 TD[(/)]TJ/F9 6.97 Tf 5.23 -1.49 TD[(12)]TJ/F5 9.96 Tf -251.61 -10.46 TD[(h)]TJ/F4 9.96 Tf 3.87 -0.01 TD[(left)-333(paren)]TJ/F5 9.96 Tf 41.81 0.01 TD[(i)-333(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.45 -0.01 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.97 0 TD[(i)]TJ/F10 9.96 Tf 3.88 0.01 TD[(\()]TJ/F9 6.97 Tf 5.23 -1.5 TD[(12)]TJ/F5 9.96 Tf -151.2 -10.47 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(righ)28(t)-333(paren)]TJ/F5 9.96 Tf 48.48 0.01 TD[(i)-333(\200)166(!)-332(h)]TJ/F4 9.96 Tf 30.44 -0.01 TD[(optional)-333(spaces)]TJ/F5 9.96 Tf 65.98 0 TD[(i)]TJ/F10 9.96 Tf 3.86 0 TD[(\))]TJ/F9 6.97 Tf 5.24 -1.49 TD[(12)]TJ/F4 9.96 Tf -157.88 -16.43 TD[(Next,)]TJ/F8 9.96 Tf 27.12 0 TD[(")]TJ/F4 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.85 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-333(extends)-334(the)-333(syn)27(tax)-333(for)-333(assignmen)27(ts:)]TJ/F5 9.96 Tf -46.15 -17.93 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(pre\214x)]TJ/F5 9.96 Tf 24.66 0.01 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.57 -0.01 TD[(whatev)28(er)]TJ/F3 9.96 Tf 42.64 0.01 TD[(The)-333(T)]TJ 26.01 -2.15 TD[(E)]TJ 5.54 2.14 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf 32.72 -0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 0.01 TD[(\\protected)]TJ/F5 9.96 Tf -201.8 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(simple)-333(assignmen)27(t)]TJ/F5 9.96 Tf 79.04 0 TD[(i)-332(\200)165(!)]TJ/F4 9.96 Tf 26.56 0.01 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.64 0 TD[(The)-333(T)]TJ 26.02 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 -0.01 TD[(de\214nes)]TJ/F5 9.96 Tf -194.13 -11.95 TD[(j)-333(h)]TJ/F4 9.96 Tf 9.96 -0.01 TD[(p)-27(enalties)-333(assignmen)26(t)]TJ/F5 9.96 Tf 89.83 0 TD[(i)]TJ -99.8 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\readline)]TJ/F5 9.96 Tf 47.08 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 0 TD[(i)]TJ/F10 9.96 Tf 5.54 0 TD[(to)]TJ/F5 9.96 Tf 12.12 0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(con)27(trol)-332(sequence)]TJ/F5 9.96 Tf 71.49 -0.01 TD[(i)]TJ -206.25 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(p)-27(enalties)-333(assignmen)26(t)]TJ/F5 9.96 Tf 89.83 0 TD[(i)-332(\200)165(!)-332(h)]TJ/F4 9.96 Tf 30.43 0.01 TD[(p)-28(enalties)]TJ/F5 9.96 Tf 38.53 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 -0.01 TD[(equals)]TJ/F5 9.96 Tf 26.89 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(p)-28(enalt)27(y)-332(v)54(alues)]TJ/F5 9.96 Tf 62.05 0 TD[(i)]TJ -307.82 -11.96 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(in)28(teraction)-333(mo)-28(de)-333(assignmen)27(t)]TJ/F5 9.96 Tf 124.94 0.01 TD[(i)-333(\200)165(!)]TJ/F4 9.96 Tf 26.57 -0.01 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.65 0.01 TD[(The)-333(T)]TJ 26.02 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf -240.04 -11.95 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\interactionmode)]TJ/F5 9.96 Tf 83.69 0 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(equals)]TJ/F5 9.96 Tf 26.89 0 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(2-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 56.76 0.01 TD[(i)]TJ/F4 9.96 Tf -223.25 -17.93 TD[(In)-412(a)]TJ/F5 9.96 Tf 22.33 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(p)-27(enalties)-334(assignmen)27(t)]TJ/F5 9.96 Tf 89.83 0 TD[(i)]TJ/F4 9.96 Tf 7.99 0 TD[(for)-412(whic)27(h)-411(the)]TJ/F5 9.96 Tf 63.27 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.97 0 TD[(i)]TJ/F4 9.96 Tf 7.98 0 TD[(is)]TJ/F8 9.96 Tf 10.81 0 TD[(n)]TJ/F4 9.96 Tf 5.97 0 TD[(,)-432(the)]TJ/F5 9.96 Tf 25.02 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(p)-27(enalt)27(y)-333(v)55(alues)]TJ/F5 9.96 Tf 62.04 0.01 TD[(i)]TJ/F4 9.96 Tf -339.84 -11.96 TD[(are)]TJ/F5 9.96 Tf 17.66 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(empt)27(y)]TJ/F5 9.96 Tf 27.26 0 TD[(i)]TJ/F4 9.96 Tf 8.22 0.01 TD[(if)]TJ/F8 9.96 Tf 10.16 -0.01 TD[(n)]TJ/F5 9.96 Tf 10.45 0.01 TD[(\224)]TJ/F4 9.96 Tf 12.23 -0.01 TD[(0,)-461(otherwise)-436(they)-436(consist)-436(of)]TJ/F8 9.96 Tf 127.33 0 TD[(n)]TJ/F4 9.96 Tf 10.32 0 TD[(consecutiv)27(e)-435(o)-27(ccurrences)-436(of)]TJ/F5 9.96 Tf -227.49 -11.95 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 32.96 0 TD[(i)]TJ/F4 9.96 Tf 3.88 0 TD[(.)]TJ -25.77 -11.96 TD[(Finally)83(,)-333(the)-333(remaining)-333(mo)-28(de-indep)-28(enden)27(t)]TJ/F8 9.96 Tf 182.82 -0.01 TD[(")]TJ/F4 9.96 Tf 4.64 0 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)-333(commands:)]TJ/F5 9.96 Tf -201.84 -21.91 TD[(\217)]TJ/F10 9.96 Tf 9.95 -0.01 TD[(\\showgroups)]TJ/F4 9.96 Tf 57.54 0.01 TD[(,)]TJ/F10 9.96 Tf 7.66 0 TD[(\\showifs)]TJ/F4 9.96 Tf 41.85 0 TD[(,)]TJ/F10 9.96 Tf 7.66 -0.01 TD[(\\showtokens)]TJ/F5 9.96 Tf 57.54 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(general)-332(text)]TJ/F5 9.96 Tf 51.77 0 TD[(i)]TJ/F4 9.96 Tf 3.87 0 TD[(.)-822(These)-460(commands)]TJ -231.75 -11.96 TD[(are)-402(in)26(tended)-402(to)-403(help)-403(y)27(ou)-402(\214gure)-403(out)-403(what)]TJ/F8 9.96 Tf 185.76 0.01 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-402(thinks)-403(it)-403(is)-403(doing.)-654(The)]TJ/F10 9.96 Tf -204.81 -11.95 TD[(\\showtokens)]TJ/F4 9.96 Tf 60.86 0 TD[(command)-333(displa)27(ys)-333(the)-333(tok)27(en)-333(list)]TJ/F5 9.96 Tf 144.08 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(balanced)-333(text)]TJ/F5 9.96 Tf 58.95 0 TD[(i)]TJ/F4 9.96 Tf 3.87 0 TD[(.)]TJ/F5 9.96 Tf -281.58 -19.93 TD[(\217)]TJ/F10 9.96 Tf 9.97 -0.01 TD[(\\marks)]TJ/F5 9.96 Tf 31.38 0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(15-bit)-333(n)27(um)28(b)-27(er)]TJ/F5 9.96 Tf 61.74 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 -0.01 TD[(general)-333(text)]TJ/F5 9.96 Tf 51.78 0.01 TD[(i)]TJ/F4 9.96 Tf 3.87 0 TD[(.)-843(This)-466(command)-466(generalizes)-466(T)]TJ 138.7 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X's)]TJ/F10 9.96 Tf -304.64 -11.96 TD[(\\mark)]TJ/F4 9.96 Tf 29.48 0 TD[(command)-332(to)-333(32768)-333(distinct)-334(mark)-333(classes;)-333(the)-333(sp)-28(ecial)-333(case)]TJ/F10 9.96 Tf 252.72 -0.01 TD[(\\marks0)]TJ/F4 9.96 Tf -282.19 -11.95 TD[(is)-332(synon)26(ymous)-332(with)]TJ/F10 9.96 Tf 88.99 0 TD[(\\mark)]TJ/F4 9.96 Tf 26.16 0.01 TD[(.)]TJ 26.81 -41.85 TD[(18)]TJ ET
+endstream
+endobj
+124 0 obj
+<<
+/F5 22 0 R
+/F4 19 0 R
+/F10 37 0 R
+/F9 34 0 R
+/F8 31 0 R
+/F3 16 0 R
+>>
+endobj
+122 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 124 0 R
+>>
+endobj
+127 0 obj
+<<
+/Length 7512
+>>
+stream
+ 0.00 g 0.00 G BT/F1 11.96 Tf 61.77 -62.76 TD[(5.2)-1124(V)92(ertical-Mo)-30(de)-375(Commands)]TJ/F4 9.96 Tf 0 -18.4 TD[(The)-310(syn)26(tax)-310(for)-311(T)]TJ 72.47 -2.14 TD[(E)]TJ 5.54 2.14 TD[(X's)-311(v)27(ertical-mo)-27(de)-311(commands,)-316(as)-311(describ)-28(ed)-311(in)-311(the)-312(second)-311(part)]TJ -78.01 -11.95 TD[(of)-333(Chapter)-333(24)-334(of)]TJ/F3 9.96 Tf 74.75 -0.01 TD[(The)-333(T)]TJ 26.02 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 30.38 -0.01 TD[(,)-333(is)-333(extended)-333(b)27(y)]TJ/F8 9.96 Tf 72.28 0 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-333(as)-333(follo)27(ws:)]TJ/F5 9.96 Tf -213.06 -21.91 TD[(\217)]TJ/F10 9.96 Tf 9.97 -0.01 TD[(\\pagediscards)]TJ/F4 9.96 Tf 67.99 0.01 TD[(,)]TJ/F10 9.96 Tf 7.33 0 TD[(\\splitdiscards)]TJ/F4 9.96 Tf 73.22 0 TD[(.)-741(These)-432(t)27(w)28(o)-431(commands)-432(are)-433(similar)-432(to)]TJ/F10 9.96 Tf -148.53 -11.96 TD[(\\unvbox)]TJ/F4 9.96 Tf 36.6 -0.01 TD[(.)-757(When)]TJ/F10 9.96 Tf 40.41 0 TD[(\\savingvdiscards)]TJ/F4 9.96 Tf 88.04 0 TD[(is)-437(p)-28(ositiv)27(e,)-462(items)-438(discarded)-437(b)27(y)-437(the)]TJ -165.05 -11.95 TD[(page)-414(builder)-415(and)-415(b)27(y)-414(the)]TJ/F10 9.96 Tf 111.46 0 TD[(\\vsplit)]TJ/F4 9.96 Tf 40.74 0 TD[(command)-414(are)-415(collected)-415(in)-415(t)27(w)28(o)-414(sp)-28(ecial)]TJ -152.21 -11.95 TD[(lists.)-777(One)-445(of)-445(these)-444(sp)-28(ecial)-445(lists)-444(is)-445(app)-28(ended)-444(to)-445(the)-445(curren)27(t)-444(v)27(ertical)-443(list)]TJ -0.01 -11.96 TD[(\(in)-330(the)-330(same)-331(w)27(a)28(y)-329(as)]TJ/F10 9.96 Tf 89.9 0 TD[(\\unvbox)]TJ/F4 9.96 Tf 39.91 0.01 TD[(app)-27(ends)-331(the)-330(v)27(ertical)-330(list)-330(inside)-330(a)-331(vb)-27(o)26(x\))-329(and)]TJ -129.8 -11.96 TD[(b)-27(ecomes)-333(empt)26(y)84(.)]TJ/F5 9.96 Tf -9.97 -19.93 TD[(\217)]TJ/F4 9.96 Tf 9.97 -0.01 TD[(Here)-332(are)-334(the)-333(additional)-333(p)-28(ossibilities)-334(for)]TJ/F5 9.96 Tf 173.21 0 TD[(h)]TJ/F4 9.96 Tf 3.86 0 TD[(horizon)27(tal)-333(command)]TJ/F5 9.96 Tf 88.87 0 TD[(i)]TJ/F4 9.96 Tf 3.88 0.01 TD[(:)]TJ/F5 9.96 Tf -294.74 -21.92 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(horizon)27(tal)-332(command)]TJ/F5 9.96 Tf 88.87 0 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.57 0.01 TD[(whatev)28(er)]TJ/F3 9.96 Tf 42.64 -0.01 TD[(The)-332(T)]TJ 26.01 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 33.7 0 TD[(de\214nes)]TJ/F5 9.96 Tf -203.96 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.09 0 TD[(\\beginL)]TJ/F5 9.96 Tf 39.93 0 TD[(j)]TJ/F10 9.96 Tf 6.09 0.01 TD[(\\endL)]TJ/F5 9.96 Tf 29.48 0 TD[(j)]TJ/F10 9.96 Tf 6.09 -0.01 TD[(\\beginR)]TJ/F5 9.96 Tf 39.93 0 TD[(j)]TJ/F10 9.96 Tf 6.08 0.01 TD[(\\endR)]TJ/F1 11.96 Tf -156.94 -33.87 TD[(5.3)-1125(Horizon)31(tal-Mo)-31(de)-375(Commands)]TJ/F4 9.96 Tf 0 -18.39 TD[(The)-384(syn)27(tax)-383(for)-383(T)]TJ 74.66 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X's)-383(horizon)27(tal-mo)-27(de)-384(commands,)-396(as)-384(describ)-27(ed)-384(in)-384(Chapter)-384(25)]TJ -80.19 -11.96 TD[(of)]TJ/F3 9.96 Tf 11.34 -0.01 TD[(The)-333(T)]TJ 26.02 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-99(b)-28(o)-28(ok)]TJ/F4 9.96 Tf 30.38 0 TD[(,)-333(is)-333(extended)-333(b)26(y)]TJ/F8 9.96 Tf 72.28 0 TD[(")]TJ/F4 9.96 Tf 4.65 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-333(as)-333(follo)27(ws:)]TJ/F5 9.96 Tf -149.65 -21.91 TD[(\217)]TJ/F4 9.96 Tf 9.95 0 TD[(Here)-333(are)-334(the)-333(additional)-333(p)-28(ossibilities)-333(for)]TJ/F5 9.96 Tf 173.22 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(v)28(ertical)-333(command)]TJ/F5 9.96 Tf 77.51 -0.01 TD[(i)]TJ/F4 9.96 Tf 3.87 0 TD[(:)]TJ/F5 9.96 Tf -283.39 -21.91 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(v)27(ertical)-332(command)]TJ/F5 9.96 Tf 77.51 0 TD[(i)-333(\200)166(!)]TJ/F4 9.96 Tf 26.57 0.01 TD[(whatev)27(er)]TJ/F3 9.96 Tf 42.65 0 TD[(The)-333(T)]TJ 26.01 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-100(b)-27(o)-28(ok)]TJ/F4 9.96 Tf 33.71 0.01 TD[(de\214nes)]TJ/F5 9.96 Tf -192.61 -11.96 TD[(j)]TJ/F10 9.96 Tf 6.08 0 TD[(\\pagediscards)]TJ/F5 9.96 Tf 71.32 -0.01 TD[(j)]TJ/F10 9.96 Tf 6.08 0.01 TD[(\\splitdiscards)]TJ/F5 9.96 Tf -91.78 -25.9 TD[(\217)]TJ/F10 9.96 Tf 9.95 -0.01 TD[(\\beginL)]TJ/F4 9.96 Tf 36.62 0 TD[(,)]TJ/F10 9.96 Tf 6.09 0 TD[(\\endL)]TJ/F4 9.96 Tf 26.15 0.01 TD[(,)]TJ/F10 9.96 Tf 6.09 0 TD[(\\beginR)]TJ/F4 9.96 Tf 36.61 -0.01 TD[(,)]TJ/F10 9.96 Tf 6.08 0 TD[(\\endR)]TJ/F4 9.96 Tf 29.47 0.01 TD[(\(text-direction)-333(commands\).)]TJ -147.11 -11.96 TD[(The)-398(use)-397(of)-398(these)-398(commands)-398(is)-397(illegal)-398(when)-398(the)-397(T)]TJ 217.16 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X-)]TJ/F11 9.96 Tf 10.78 0 TD[(-X)]TJ 11.06 -2.21 TD[(E)]TJ 5.61 2.22 TD[(T)]TJ/F4 9.96 Tf 11.94 0 TD[(enhancemen)27(t)]TJ -262.07 -11.96 TD[(is)-332(curren)27(tly)-331(disabled;)-333(otherwise)-332(a)]TJ/F10 9.96 Tf 146.87 0.01 TD[(beginL)]TJ/F4 9.96 Tf 31.37 0 TD[(,)-332(etc.)-332(text-direction)-332(no)-28(de)-332(\(a)-333(new)]TJ -178.24 -11.96 TD[(kind)-254(of)-255(math)-254(no)-28(de\))-255(is)-254(app)-28(ended)-255(to)-254(the)-255(curren)27(t)-254(horizon)27(tal)-254(list.)-418(These)-255(no)-28(des)]TJ 0 -11.96 TD[(delimit)-251(the)-253(b)-27(eginning)-253(and)-252(end)-252(of)-252(hlist)-252(segmen)26(ts)-251(con)27(taining)-251(left-to-righ)26(t)-251(\(L\))]TJ -0.01 -11.95 TD[(or)-279(righ)26(t-to-left)-278(\(R\))-279(text.)-427(Before)-279(a)-280(paragraph)-279(is)-280(brok)27(en)-278(in)26(to)-278(lines,)]TJ/F10 9.96 Tf 279.06 -0.01 TD[(endL)]TJ/F4 9.96 Tf 23.7 0.01 TD[(and)]TJ/F10 9.96 Tf -302.76 -11.96 TD[(endR)]TJ/F4 9.96 Tf 23.91 0 TD[(no)-28(des)-300(are)-301(added)-301(to)-301(terminate)-300(an)27(y)-300(un\214nished)-301(L)-301(or)-300(R)-301(segmen)27(ts;)-311(when)]TJ -23.91 -11.95 TD[(a)-419(paragraph)-420(is)-420(con)27(tin)28(ued)-419(after)-420(displa)27(y)-419(math)-420(mo)-27(de,)-442(an)27(y)-419(suc)27(h)-419(un\214nished)]TJ 0 -11.95 TD[(segmen)27(ts)-372(are)-373(automatically)-374(resumed,)-383(starting)-373(the)-373(new)-374(hlist)-373(with)]TJ/F10 9.96 Tf 287.43 -0.01 TD[(beginL)]TJ/F4 9.96 Tf -287.43 -11.95 TD[(and)]TJ/F10 9.96 Tf 19.37 0 TD[(beginR)]TJ/F4 9.96 Tf 34.7 0 TD[(no)-27(des)-334(as)-333(necessary)82(.)]TJ/F5 9.96 Tf -64.03 -19.92 TD[(\217)]TJ/F10 9.96 Tf 9.96 0 TD[(\\marks)]TJ/F5 9.96 Tf 31.37 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(15-bit)-333(n)27(um)27(b)-26(er)]TJ/F5 9.96 Tf 61.75 0 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(general)-333(text)]TJ/F5 9.96 Tf 51.78 -0.01 TD[(i)]TJ/F4 9.96 Tf 3.88 0 TD[(.)-843(This)-466(command)-466(generalizes)-466(T)]TJ 138.71 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ/F10 9.96 Tf -304.64 -11.96 TD[(\\mark)]TJ/F4 9.96 Tf 29.47 0.01 TD[(command)-332(to)-333(32768)-333(distinct)-333(mark)-333(classes;)-333(the)-334(sp)-27(ecial)-333(case)]TJ/F10 9.96 Tf 252.71 -0.01 TD[(\\marks0)]TJ/F4 9.96 Tf -282.18 -11.95 TD[(is)-333(synon)27(ymous)-332(with)]TJ/F10 9.96 Tf 88.99 0.01 TD[(\\mark)]TJ/F4 9.96 Tf 26.16 0 TD[(.)]TJ/F1 11.96 Tf -140.06 -27.9 TD[(5.4)-1125(Math-Mo)-31(de)-375(Commands)]TJ/F4 9.96 Tf 0 -18.38 TD[(The)-283(syn)27(tax)-282(for)-283(T)]TJ 71.65 -2.15 TD[(E)]TJ 5.53 2.15 TD[(X's)-283(math-mo)-27(de)-284(commands,)-293(as)-283(describ)-28(ed)-283(in)-283(Chapter)-283(26)-284(of)]TJ/F3 9.96 Tf 249.38 -0.01 TD[(The)]TJ -326.56 -11.95 TD[(T)]TJ 5.53 -2.14 TD[(E)]TJ 5.53 2.15 TD[(X)-100(b)-27(o)-28(ok)]TJ/F4 9.96 Tf 30.38 0 TD[(,)-333(is)-333(extended)-334(b)27(y)]TJ/F8 9.96 Tf 72.29 0 TD[(")]TJ/F4 9.96 Tf 4.65 0 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)-332(as)-334(follo)27(ws:)]TJ 34.09 -46.46 TD[(19)]TJ ET
+endstream
+endobj
+128 0 obj
+<<
+/F1 10 0 R
+/F4 19 0 R
+/F3 16 0 R
+/F8 31 0 R
+/F5 22 0 R
+/F10 37 0 R
+/F11 39 0 R
+>>
+endobj
+126 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 128 0 R
+>>
+endobj
+132 0 obj
+<<
+/Type /FontDescriptor
+/CapHeight 686.11
+/Ascent 750
+/Descent -250
+/FontBBox [-119 -350 1308 850]
+/FontName /XEXUPK+CMBX10
+/ItalicAngle 0
+/XHeight 444.4
+/StemV 80
+/FontFile 131 0 R
+/Flags 4
+>>
+endobj
+133 0 obj
+<<
+/Encoding 7 0 R
+/Type /Font
+/Subtype /Type1
+/Name /F17
+/FontDescriptor 132 0 R
+/BaseFont /XEXUPK+CMBX10
+/FirstChar 33
+/LastChar 255
+/Widths [350 602.78 958.33 575 958.33 894.44 319.44 447.22 447.22 575 894.44 319.44
+383.33 319.44 575 575 575 575 575 575 575 575 575 575 575 319.44 319.44 350 894.44
+543.05 543.05 894.44 869.44 818.05 830.55 881.94 755.55 723.61 904.16 900 436.11
+594.44 901.38 691.66 1091.66 900 863.88 786.11 863.88 862.5 638.89 800 884.72 869.44
+1188.88 869.44 869.44 702.77 319.44 602.78 319.44 575 319.44 319.44 559.02 638.89
+511.11 638.89 527.08 351.39 575 638.89 319.44 351.39 606.94 319.44 958.33 638.89
+575 638.89 606.94 473.61 453.61 447.22 638.89 606.94 830.55 606.94 606.94 511.11
+575 1149.99 575 575 0 691.66 958.33 894.44 805.55 766.66 900 830.55 894.44 830.55
+894.44 830.55 670.83 638.89 638.89 958.33 958.33 319.44 351.39 575 575 575 575 575
+869.44 511.11 597.22 830.55 894.44 575 1041.66 1169.44 894.44 319.44 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 575]
+>>
+endobj
+134 0 obj
+<<
+/Length 5385
+>>
+stream
+ 0.00 g 0.00 G BT/F5 9.96 Tf 76.71 -62.76 TD[(\217)]TJ/F10 9.96 Tf 9.97 -0.01 TD[(\\left)]TJ/F5 9.96 Tf 26.15 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(delim)]TJ/F5 9.96 Tf 23.79 0.01 TD[(ih)]TJ/F4 9.96 Tf 7.76 -0.01 TD[(math)-333(mo)-27(de)-334(material)]TJ/F5 9.96 Tf 88.86 0 TD[(i)]TJ/F10 9.96 Tf -150.44 -11.95 TD[(\\middle)]TJ/F5 9.96 Tf 36.6 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(delim)]TJ/F5 9.96 Tf 23.81 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.74 0 TD[(math)-333(mo)-28(de)-333(material)]TJ/F5 9.96 Tf 88.86 0.01 TD[(i)]TJ/F10 9.96 Tf 3.88 0 TD[(...\\right)]TJ/F5 9.96 Tf 47.08 -0.01 TD[(h)]TJ/F4 9.96 Tf 3.87 0.01 TD[(delim)]TJ/F5 9.96 Tf 23.81 0 TD[(i)]TJ/F4 9.96 Tf -239.52 -11.96 TD[(\(generalizing)-333(T)]TJ 64.23 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X's)]TJ/F10 9.96 Tf 17.48 0 TD[(\\left)]TJ/F5 9.96 Tf 26.16 0 TD[(h)]TJ/F4 9.96 Tf 3.87 0 TD[(delim)]TJ/F5 9.96 Tf 23.79 -0.01 TD[(ih)]TJ/F4 9.96 Tf 7.75 0 TD[(math)-333(mo)-28(de)-333(material)]TJ/F5 9.96 Tf 88.87 0.01 TD[(i)]TJ/F10 9.96 Tf 3.87 0 TD[(\\right)]TJ/F5 9.96 Tf 31.38 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0 TD[(delim)]TJ/F5 9.96 Tf 23.8 0 TD[(i)]TJ/F4 9.96 Tf 3.88 -0.01 TD[(\).)]TJ -304.49 -11.95 TD[(F)83(or)-404(eac)27(h)]TJ/F5 9.96 Tf 41.72 0 TD[(h)]TJ/F4 9.96 Tf 3.88 0.01 TD[(math)-333(mo)-28(de)-333(material)]TJ/F5 9.96 Tf 88.86 0 TD[(i)]TJ/F8 9.96 Tf 7.91 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-405(b)-27(egins)-406(a)-405(new)-405(group,)-423(starting)-405(out)]TJ -161.41 -11.95 TD[(with)-409(a)-408(new)-409(math)-409(list)-408(\(alw)26(a)28(ys)-408(in)-408(the)-409(same)-409(st)27(yle\))-408(that)-408(b)-28(egins)-409(with)-409(a)-408(left)]TJ 0.01 -11.96 TD[(b)-27(oundary)-245(item)-246(con)27(taining)-245(ev)27(erything)-244(pro)-28(cessed)-246(so)-245(far.)-415(This)-246(group)-246(m)27(ust)-244(b)-28(e)]TJ -0.01 -11.95 TD[(terminated)-406(with)-406(either)-406(`)]TJ/F10 9.96 Tf 106.84 0 TD[(\\middle)]TJ/F4 9.96 Tf 36.61 0 TD[(')-405(or)-406(`)]TJ/F10 9.96 Tf 22.5 -0.01 TD[(right)]TJ/F4 9.96 Tf 26.16 0.01 TD[(',)-424(at)-406(whic)27(h)-405(time)-406(the)-406(in)27(ternal)]TJ -192.1 -11.96 TD[(math)-485(list)-486(is)-486(completed)-486(with)-487(a)-486(new)-486(b)-28(oundary)-486(item)-486(con)27(taining)-485(the)-486(new)]TJ -0.01 -11.96 TD[(delimiter.)-577(In)-378(the)-378(case)-378(of)-377(`)]TJ/F10 9.96 Tf 113.88 0 TD[(\\middle)]TJ/F4 9.96 Tf 36.61 0 TD[(',)-388(a)-378(new)-378(group)-378(is)-377(started)-378(again,)-389(in)-378(the)]TJ -150.49 -11.96 TD[(case)-424(of)-425(`)]TJ/F10 9.96 Tf 37.02 0.01 TD[(\\right)]TJ/F4 9.96 Tf 31.38 0 TD[(',)]TJ/F8 9.96 Tf 9.99 -0.01 TD[(")]TJ/F4 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)-425(app)-27(ends)-425(an)-425(Inner)-424(atom)-425(to)-425(the)-424(curren)27(t)-424(list;)-470(the)]TJ -97.42 -11.95 TD[(n)28(ucleus)-333(of)-333(this)-333(atom)-334(con)27(tains)-332(the)-333(in)26(ternal)-332(math)-333(list)-334(just)-333(completed.)]TJ/F1 14.35 Tf -24.92 -32.94 TD[(References)]TJ/F4 9.96 Tf 0.01 -21.83 TD[([1])]TJ/F3 9.96 Tf 15.49 0.01 TD[(A)-407(torture)-408(test)-407(for)-408(T)]TJ 87.78 -2.15 TD[(E)]TJ 5.54 2.15 TD[(X)]TJ/F4 9.96 Tf 8.47 0 TD[(,)-425(b)26(y)-406(Donald)-408(E.)-407(Kn)27(uth,)-425(Stanford)-408(Computer)-407(Science)]TJ -101.78 -11.96 TD[(Rep)-27(ort)-333(1027.)]TJ -15.5 -19.92 TD[([2])]TJ/F3 9.96 Tf 15.5 0.01 TD[(A)-271(torture)-272(test)-272(for)]TJ/F8 9.96 Tf 76.83 -0.01 TD[(")]TJ/F3 9.96 Tf 4.65 0.01 TD[(-T)]TJ 8.85 -2.15 TD[(E)]TJ 5.53 2.14 TD[(X)]TJ/F4 9.96 Tf 8.47 -0.01 TD[(,)-284(b)27(y)-271(The)]TJ/F5 9.96 Tf 38.7 0 TD[(N)]TJ 6.15 -2.14 TD[(T)]TJ 5.96 2.15 TD[(S)]TJ/F4 9.96 Tf 9.5 0 TD[(T)83(eam)-271(\(P)27(eter)-271(Breitenlohner)-272(and)-272(Bernd)]TJ -164.65 -11.95 TD[(Raic)28(hle\).)-333(V)83(ersion)-333(2,)-333(Jan)27(uary)-333(1998.)]TJ -15.5 -19.93 TD[([3])]TJ/F3 9.96 Tf 15.49 -0.01 TD[(The)-333(WEB)-333(system)-334(of)-333(structured)-333(do)-28(cumen)27(tation)]TJ/F4 9.96 Tf 205.29 0.01 TD[(,)-333(b)27(y)-332(Donald)-333(E.)-334(Kn)27(uth,)]TJ -205.29 -11.96 TD[(Stanford)-333(Computer)-333(Science)-333(Rep)-28(ort)-333(980.)]TJ -15.5 -19.92 TD[([4])]TJ/F3 9.96 Tf 15.5 0 TD[(Ho)28(w)-385(to)-387(generate)]TJ/F8 9.96 Tf 76.32 0 TD[(")]TJ/F3 9.96 Tf 4.64 -0.01 TD[(-T)]TJ 8.86 -2.14 TD[(E)]TJ 5.54 2.15 TD[(X)]TJ/F4 9.96 Tf 8.47 0.01 TD[(,)-399(b)27(y)-385(The)]TJ/F5 9.96 Tf 42.11 -0.01 TD[(N)]TJ 6.16 -2.14 TD[(T)]TJ 5.96 2.15 TD[(S)]TJ/F4 9.96 Tf 10.63 0 TD[(T)82(eam)-385(\(P)27(eter)-385(Breitenlohner)-386(and)-387(Phil)]TJ -168.69 -11.96 TD[(T)83(a)28(ylor\).)-333(V)83(ersion)-333(2,)-333(Jan)27(uary)-333(1998.)]TJ -15.5 -19.92 TD[([5])]TJ/F3 9.96 Tf 15.51 0 TD[(The)-340(T)]TJ 26.08 -2.14 TD[(E)]TJ 5.53 2.14 TD[(X)-100(b)-28(o)-27(ok)]TJ/F4 9.96 Tf 33.78 0 TD[(\(Computers)-340(and)-341(T)27(yp)-27(esetting,)-343(V)83(ol.)-340(A\),)-341(b)27(y)-339(Donald)-341(E.)-341(Kn)27(uth,)]TJ -65.4 -11.96 TD[(Addison)-333(W)82(esley)83(,)-332(Reading,)-333(Massac)26(h)28(usetts,)-332(1986.)]TJ -15.49 -19.93 TD[([6])]TJ/F3 9.96 Tf 15.5 0 TD[(Mixing)-363(righ)27(t-to-left)-362(texts)-363(with)-363(left-to-righ)27(t)-362(texts)]TJ/F4 9.96 Tf 211.82 0 TD[(,)-370(b)27(y)-362(Donald)-363(E.)-363(Kn)27(uth)-362(and)]TJ -211.81 -11.95 TD[(Pierre)-333(MacKa)27(y)83(,)]TJ/F3 9.96 Tf 71.04 0 TD[(TUGb)-27(oat)]TJ/F17 9.96 Tf 45.67 0.01 TD[(8)]TJ/F4 9.96 Tf 5.73 0 TD[(,)-332(14{25,)-334(1987.)]TJ 28.93 -222.2 TD[(20)]TJ ET
+endstream
+endobj
+135 0 obj
+<<
+/F5 22 0 R
+/F10 37 0 R
+/F4 19 0 R
+/F8 31 0 R
+/F1 10 0 R
+/F3 16 0 R
+/F17 133 0 R
+>>
+endobj
+130 0 obj
+<<
+/ProcSet [/PDF /Text /ImageC]
+/Font 135 0 R
+>>
+endobj
+8 0 obj
+<<
+/Length1 1550
+/Length2 8884
+/Length3 533
+/Length 10967
+>>
+stream
+%!PS-AdobeFont-1.1: CMBX12 1.0
+%%CreationDate: 1991 Aug 20 16:34:54
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /PDPDTY+CMBX12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 45 /hyphen put
+dup 46 /period put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 76 /L put
+dup 77 /M put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 86 /V put
+dup 88 /X put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+/FontBBox{-53 -251 1139 750}readonly def
+/UniqueID 5000769 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+hV]߿ l0t9ܼr)z,[ {Lx 5)>d"Ts̱S♨ꢛiѶ"X)HuPQ pܟt;DvX`a`9bi^} ګeeW f _qv9My)g;n=LS+2[dsH3x=h%tK$˂${0R]fj?FX{ؾ0%vR5b(;Z$ؘ
+ȡ>T<ď!>0cfɈ``h# E= pM'tc3Z!=+3; pHs"-f&m,pn  g^i"nP]6! dtBDK2_^E =IomDyI(fǝ7tDA+ry)8v/ p<NCq.E(ޒ-lf39m[/e:ӡۈi[?>PH9Ҷ?觕83I*01O2⽚u*v9)&rqȔPC PDVU!OtTɜ;)ү4*S+e9wҸ_p. 7΂9)
+-]L4po^J[ɚn߹:
+lsL+4 U:Ҹx^sys'A[?ι 2Yz8ێD0BVտ2=re':jDïqҼmWA;mv dtpq<r@$\3?;t-_8OhKJ3~ }BMXOgi90_e׻~$c!' 뻰qs_oG'i76YZIR1;{W263P.Sɶp;\EHq "S4Q|R5eYcxV<Lrw
+~t݊B?^+Z8iHb}Zfk3Vp7+ˈP@mocX;07Hy٧,b54Zj+L
+dUn/y/5>m S4j(87~[ 7|9"t#v`*6Y/P {j,skWt(ԯfm?k̺痄]q\
+
+#[vLa a/÷IW3[U6 {0 (%c ΒN'] `wa4IV_nN嗚;cB2Y寘%2 _ 8R1=ҕjǤM}V>
+Qw9,*xONx#Z9d=C,W2564T=XV}
+^ˠ$T樓[.a^BJ+FT`1L9aG]O!ĹڽkU v`g\ W f+ g-˫#64/ p=;74RCN[/,X.Oʽ eI@3 mqwVGqgrE-/qK|1u]P.ߑ4,:oa.jQ١3Y"QHyGޖF`$ DzfJ,Jxh5
+LJ=EiO^(ȴr 'Aꅢ6n}aک@'єYjH"! kup,?߿U\Oɂ[#+=Nş{p4
+.9Lt }yHVT 2cU<-TwW/P} ۰ЩuM bCl\ˉQ'Գ-RGYX<sfRvUH
+3 Y{y.^R:Cł<Xtl\@{զRX3^LG֝Z8:@LD((<_ٰW:M 2k͹1.}}耰Dm5blrKsrL((xP|:EU'yeAy~nK4v)cE C@Sx[VM@D$jK5nFP>VKtDlhHXP&sΘ<D!~'^܃6bLb?I *PcCf}(#v:Bn {"/dLiU w<'oAqlowU=5e}nOU A,5]\iM,(܏-s?udyoNyB7ŮR{KNUB;K1-P~ekXC1,틫i^,az̓܆Y&l zu6ԣstojJ%Ҍ}B'һk GWA3sqwĤD ٩^,w a1(cu>Q]m8mFV<˙^3Z-=HZJ{ Ƨ54ͮ yRUΛޢRSFW&HP:0%ŧp`G,) et'sFNăf7Q`]?!n(__p$oġ>#l}Hb|OkT쁴ޯda>J==8j'DqŽ0ϩɴj@͚rL4fSI?̐bo 7lë.u.5"Nɾɔtq/R"Ft)S`.{;Xǂ O!u[[1T%*IG 7,I|o"R]fXz8)3Hy/H
+A4I~M6.NJr; SԇZϪ jw0RL8.ILP D[lLCgQv"ysD-R#v 6͜dt)&wj4p
+WV?ɓHfMG,SwpJLVP/3M8U~`✴1B.܂*:!Ga3h hh\S;֙Mf?hl6̂O{QZSFlTڡɹveD:bT&<%-=a%'u/}HzݒW :
++q]k߾T˚_4Q"~(퀂W^_~۷n$>ff`y3BmF)-!x;wR7=GnHeKI$5Bǵԃ+BxĦA$|9YO(Z3+
+lNEXI`| iA '&~r6Yt鬴yu4͍czb^X<Was1 $ \hqAB[z<зP8xƨWfHԎshFР:3O{9:xK`h5YMbVmC&FBZiĹĺ%<H٠Q|i5~044x@^V-Yr`ʱejt2 BsEopt]shR"wFɐy")S#Ij<Z8@8{،N$Ԅ:<Ju| f+Pⶭ7Z&\/)=DUٙ=v`[´dNHXAߵVWbBCx:NfP2 ?K%k.8!v T<`2sH䟢]iq{Px]d!0i3( lA'36 H\edouj}?Ȟ&726J$}P>V fT'=MU
+ҶS\"R?9 ?x8oۉUhYMsJg.|=/"{ec ttԮ EC
+L!;Zl|"d`HFNם9M.*
+ L`1&
+)ɷCϯthx؋]%ΑXȥ
+ ;΄q!:Lk+O-lW;L6\VsM(<9Elܰ"诌A:̎ιwD̲;F[iW_^71gjb6 \ R=@$ztg:e=_~1 _LE.
+]?YׁOr/V7'2 a(x5^\R*GGD/TҜ;z7%wrDWqf
+5ɠk>aʩU# fBR>P-Rf'D4hk)>
+CVz0^Ѻ_N* yu/Q,3VyP,K0$xk c˞tq(y~k*}q\'-2NXU5 Z~Ob/OuF!f6"WgZ!m'lʀ7T} \=?9bb\:+T\X /?u)q2e =iUL6^ m*E<uK
+?IkHt%%Q3RzeAj zZ{A52gwsN6vǟZy܈QQad e;OQyqHI쑰ւXp#k| O$Fb"j$*fH{'5S}I1*q֩IZqlh{sɁ4| ȆdP  <Ơ>Ô kw0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+11 0 obj
+<<
+/Length1 779
+/Length2 2227
+/Length3 533
+/Length 3539
+>>
+stream
+%!PS-AdobeFont-1.1: CMMI12 1.100
+%%CreationDate: 1996 Jul 27 08:57:55
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /EUBLUU+CMMI12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 34 /epsilon put
+readonly def
+/FontBBox{-30 -250 1026 750}readonly def
+/UniqueID 5087386 def
+currentdict end
+currentfile eexec
+4y9B0i H1r^ v.Hntµ'W"xp'DpԄ&,6 6WS:W0H:eTA7J.>Դ{8"ahγDn'$8NC z[wM 3FSj'SKx=xr!0u\/0:jm;FS'01NJ)m+yA%״~{ N "B `bJ#v_=/:7/nKڏ/zolյ?t"6<3F >k6,/
+
+GDm/ĐDmRIRp{f$&D@C^_ LfnCYcUpd(l$v~O8U/`
+}Kp114YԃMuJ-d@Hao'PFT2 3bA 6`'[^ќú/krEq1Iu*5cЁ'?f2AyO`:.wLvp"۵w (w:Vhwj 8~#4, \ ~2Nd
+7a ~FtcK)ZGm^{::¼^
+ dN$]eW4$sY0--̌kMOKUYS-24ZW,.I.<O
+n΄sKW.tc6
+.ŌrؖUsy{]]mJ1h(1)?@]F;{!>d(/R4M}0G}Lc xH/<vw7dh M% Urph5x{Quf.EI朓ARщ92.xyIЃRZ.!/2n]_mQ-v9t7{ix^
+^D5zӂM7nϸa=)_(OR2Hbx 6'TԚ.ߟ2C2 $eB8d!.BE:bp ͐"3_.F6Q)J /kE6F$t ~!␨(X,5Ҧ 4k^G|- [`<4#tM^ Pu U$LZwĪfBn4vq`>Nt+vXn.m?F5=id0 2ϻPYQ{yZr*|4ۋf]f=wyo`.:2mr`O>{ p֒4ej~ϝY KpffHӥ oSkuudD^}?Uj͊S:xD5pcA!M B 3)Tj3ruDi+GYrɲԻ;H3o]Ifj8~L9cRg}3Y!PǴ`zbLMT8vk3 1B6]fN0XCqHYjrVy*^uhe{|/U#Js/sGۣ0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+14 0 obj
+<<
+/Length1 1338
+/Length2 8474
+/Length3 533
+/Length 10345
+>>
+stream
+%!PS-AdobeFont-1.1: CMSL10 1.0
+%%CreationDate: 1991 Aug 20 16:40:20
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+end readonly def
+/FontName /UQUAON+CMSL10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 44 /comma put
+dup 45 /hyphen put
+dup 49 /one put
+dup 50 /two put
+dup 56 /eight put
+dup 57 /nine put
+dup 65 /A put
+dup 66 /B put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 77 /M put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+readonly def
+/FontBBox{-62 -250 1123 750}readonly def
+/UniqueID 5000798 def
+currentdict end
+currentfile eexec
+i_,+`"W僥99>'~ }(JܝrC8mĔG@G ^7+ 6}) Xw4z<^ef2oAx*;xu&=kK`<ZvfJk{ CÒ2iZ& $d
+;vVz.5rݒt@pYD2 2ҫ͡s߅ZJe_ 7X 4]aC;{cXa'}j &GEE }}1L%i/މZb\H2CJ;Ye CZL]ץH֢[ϑq&$;bix8X0
+ 7Eg7QDs?0{tF*RU9J~]uWm!a7 η_k w=XF\d%N6L<S$귴*&: Hٵቲ5(<xrq,dž'F /gcmr5S#Z+`f~%.憣=$#,>vq
+C#3cEkue2
+eaJɤo|"T9;k֨[p ҉19M}AaG r N(vi?h4}
+g6xEU b٤DEC.ZA=gftcݕ%`#d>*c^By M-S֒/gxG|o毑/=!JтHvVwAVCtH/ v[ 6K?=*GuTMeZNO$=ak]u:% HT{=C C qaP8!V􍪛 aPpjqyœ;^Y~ux̰_q!e(W/.[ϐ]0n
+YI%Ʉ}kAms><+sv
+Ȏ;e
+ T' Md݀K.eWcގ;D'0C
+HT)d"ckO40%ņ\3lt
+#f+tW;j׋YM9hrϸf٭gbB 4vti*#ҨGҊh֬\h4àTm<i{H/'|PjO**^}*-:Ah]F@N^13С 讔/&"gϮX ĘUgp#F
+BELCw1kx0WCˬ6qֿ[7 'brJ6䐤'av@hox4K]rBM:K&S4L{y'D'BRƗK|bvn6 kߜOE3:<Jm)v\V$$N#qnm&̬8'?5ki_
+"B
+z5mvQ>h:ş;P %9>J9/d](/CNE CHZBajl)<DS(15IVrA jEY4&ţ؂@_6m~;E[n>~1 &puPoPIu6-;qbw. L bKȏt]TkÒ58c[|Ӷ_ w0b&AOƳ4A`a*eo5y8ԩ;L&<hVԐ4Sw0>r.tg=.5E9vbvtOq?﫿Hti7>diRo3t^J>1D%h@\/ K=AAC{Y &\ez\[AqT"7停2;S1( huۊ(>P v",4hr,\
+f6 2ӄhpLGKD)He9ǡ-s>@I,@<Z%/>(-ev/1Ou` Ze@Qڦy%#]ՄX<Ջ#|'Nr.Zc4i0iZU.蔸u5Xֳ[YaɊaC@t.3`V;[ ջe}Tl(8BKNҹT$%{L WeD7j0hgı\
+st7|Yeo~o%vPL^#ZLԧ{C QHmƍՠaXf(5Y_l< ~+Bu஛Z5,V1qF `;Ya*Pr}պMa"]h0'c 2mGAqQ4[0p%PpVga~o<+Z0ƆL؀6@W105>d7w+U# .ݟEpGPWBBq<R52ğl)$Fc*û%VfAy1UZ 7D^M{QNF)HiC*z?%<H~lv7s){:1m'FꊋxB]$]R_Һecww0Dl`y#ղ!\:0ѣV{qdBE|
+5,X@ջY5>w*m!ogC(w(qFk#/_K9:+MB͈{'1qG%.l;8)rJ~t.c4r 1*?f?ksڻoԄduYmLv<ڥ#J(&qV)H] =EC9n/]WH-AX^!/
+JwèT%$4kePmH){ط'` =_Tv?E&
+i#.{Boޑ[1NB(>ΉPѨXv ]~8 ]FsC^W sE.%de2nQ  :}6~> s
+m θx;BK]0{qPgzSo/Z'yK\ . 㩴b~@iIC%@P6(RQ-YsWHTJKķ]8VP4 /7!߈= W Bۡ6^WfKuiXt1h;&x~awi% Ќ}d<s^ (^^VOp!xT V[tpAT!΀ Y,3/&=ؿ px:kMÔڞr"o"}BT BL\5J2yy%%vai^Uk:QF#2E/ܑ`E e VEa`l̍VXF .ZǾ`9-+rZԣW#[o{L35>]DR-uy^jJ[#(MA6pߵK8>΀y:^xrd&PWv\oߢSW86-3j3+uu4]ھ|!'QrgzjZJNyˡI^נ[CO7_Rȃdco
+CQ>KDVkR,.#~u0*^,=ԏڪȵHْʎ0oz"ߋ+s`W4@gz2ؚ:g#c0oS5%țhf3 _ !aN, z&q$67Pv̈́gw
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+17 0 obj
+<<
+/Length1 2001
+/Length2 14642
+/Length3 533
+/Length 17176
+>>
+stream
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /BEFCOC+CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 139 /ff put
+dup 140 /fi put
+dup 141 /fl put
+dup 142 /ffi put
+dup 37 /percent put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 61 /equal put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 91 /bracketleft put
+dup 93 /bracketright put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /endash put
+dup 255 /dieresis put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+/UniqueID 5000793 def
+currentdict end
+currentfile eexec
+SQM((0_&(<U7l=ڎ帗|'?۵k
+|%5_J8-̏}<IڽʒzV @N4ٙ4 N` ϸV?<Z/X}Wt2NQ(O$P@cQB"DmۛNxLk8E !ujsE|~bi4f;^}/[m@sOJ`+i+):|fގ\I!g5QL.M-.{qB91ZލJs.BӾW͊|E^kRixFAč b\%L^jVPٝODLNWp"6"Wl0=]MTգ>)c(CX]k`iʒ\.54"@ fe*nЏ
+Q{Sm3c
+zXa[({ [C{g T;D&
+wWzic~n-?Vd"WRV̐moqхp Tw!7\<W+?,QцCvqti߼gxMʥ"Ɠ-!7VGyA1 fϊFxc|F-tsфeL J34/oOX,!YS3shy
+h =~j.,8HmᡰxpUjrZFR
+:ka5a&Ze! MmZyLRk!C $0skV]KB$튩'xU{C*
+?r(N:3,bn)hO3p&6|]xP_BVz\n||3"~ 071]v@FjXU(LWsާv|x
+@˓:HE!-NV;S)'#0.4l砐ћ`@\޸a{,)zbX#_D-M f`Ξ\њT+o||˼$PӧS֑{1@:" tL'b|tu9c嗔ImUoH-հeK<rg!bŻ9޿hLtA4a_ﰈTuEwcdcw\"ѪoH<J
+9_SM{(^j }S`'˽;-v)!vσWq7l!Prxރ.3s&rtY^==G
+mI8%/'t񐝾!
+*ڽ 0dđî[Y.N/".WӸs %
+4p;d̋g[};[7G
+n2CN0v՝[R}"Z@:,lQw )"RͿب:gI|,: ;a
+7ZAm!.?g0P^ysݴwkN~
+n?j5Ey}q:
+وgy
+=3Y~p 1X
+Fp-$Ԃ`h1vz7"wun}NBUyKƔJ[Aro>
+zzD%:}b:Oध$*B,\d%#HDP}f l~/Kfձ'% !n7>NRȠ \r* B3~s?ׂlɔ͆{RDP
+ X<~/I٩u[Z؂
+s) j@+,j`37[fŗ-s/"⸨on;He f>۽%ن`wV/{=*JRuxR*%U@9\~Z8gC'`hȹ|,3t) xyXrG5Jtg=*8[9>Z
+Xgfy1i{? TUƶx2_R}RٸF!ȭE48N[aR幓w ˥y# h4cEu/ +&#W2e-AϜaA
+S4Sr+_;.nFo4|W;b}Td7,aku/y<E%fI5.behL' 1KuG,g'I_vO]??jWT3v˝̒pu>KrZ>05#^ERX<"Gm䱿5+ޚ''r̳j4;h
+ïwMiPpͼ!333efdl]3;#A%.{, /N/k;&Qqj! !fj+5!3D&NKz+Jbn\/# Mc
+Ufd ީ0imiWrt#8h&/ ēW*A9qY6NPҀKLft:>LQR8䄔ó| XfzX>aR!"%Y,o_h$T@Fnz@,eDzfM%.gX\`=c\ AC9~M9;W1? k5. .>@j[lv홞lu 8Lv5бrx}" ީ -m}] AѾcU|5Mie)ajj=\FڢעTb ,,B»euNJD})SyzY q齮E ܁
+/Plb|:aa m}Xep>6xqQȎCڅ=9U7 l
+ȡ2V n=(U45p,R> dy~f_x+%:%P`ƁJ$ 7\Tu]^8^zoA/G\ySz
+..zO'\xj<)]B/6KM[ohg;opg/أ^g&de-֫Λ| L{'%rBd3E}£ya{U+>{{Ĕ-2+w\
+ t6AY:xEl六EWa*=x1NdqF-G =tp.7ozú6:i @!ܥH
+&*.au Jفw<k-NxB|%c{F`72@(=
+VT<\ݸk+S+L|o|AOId( sQK- ?@mT`dD|FA_@D֠qѶf~
+q,Wб|2s1nmӯ'm<!_Pg&BJ(QsIzu^Bñdh k%+8HeASH
+wG'lo,N_|lF
+ocJp4:UP\~WR]^ִW~guEh/D(FB
+9܂[B[ѥgZ܊-vbl^؃6%6f[EI{elwVǖ.}M{3"֟vx]e7&4xxPmHGQEׯʵ)Ӏ=D{X7@,DyN
+ux;2#Wz_vek>d:w)͡ةɢ.UR(eq{*Ȥ2<N<>dkL5fpMkw6F %LZe# ƟRzhgO,kJ+vJ=K>hUl<!7Z~3QVZ$ ($*Yd;g\4࢟g>ŗϛ˂8Pu>)a,$PsB
+ܖմ4~#g`Ff fC۠j&˛# XODKL Q+pp
+iYzs^8j]ȭ଻!clW Y%DE'TwbFJ/mI9*z1tj{'qJc n򾍨y*ioa p/.dyҡdq>mBRܞEo*pD 7MW6V,ESN˭Š܃@e3eqEA-9_G3w5f2)$ʰhmVӐ_YloMҮFϟa۹ʑ('l_fj=\5An _PuւQb.!bR~O
+@\Xz%R̒ԎQ3Esq,G4j;*<ҫУ׊
+X*7|Sھ),RqIZ9 F9mSf2${ڪmcyoo:Zf0De'ȥb{<$ „fD;ż+afrkߘIss֎3el~y[`><a;p̃\E 7^E`g |6>|#]l8o Q:')}UVLHTl^Mno1Bbdy
+~SsCX{WBa%q"yA
+Rહ`pT&Puoko|
+qq> `DMF[+~$ck0
+Q<̅gW5lF bg{Ě+ Bճ"1h
+>踘Di-hŔrr5/-5{V4VӸ3A)v{$G
+=8 }
+\*(U\4L9R ՚0dnsS%g:Aub)QƓǫLQ(9AKBzG:t}v@S$TnwX흭rptBНht_<g\ur(96 0FxofC Sac;F Z
+0l^V.LN."j-cdצUP^nlaů\j)w-$:9ޯGGWjL7WrY*tLJѯ5q.4
+}VD #˫Z:
+P)ICׂpp2&;FL@"p>}+:C)⵻R&TNj.Y rѳ`f}uh-WIl
+{ep)^TH;BtƷ|Ѱ4}ZO'WF[/$RjK&,|;$BnqYEG&'!z/zT<#_^ftd(J<kܟc v%ݻī%׹JN_P5f66^8nSpeW-^;i|Mav|Pxu!/Eu_(IG8a{xˢ"8dc|?eC!Ӷ)cpe(7
+@~PS
+!d֛BeP;@(ΉM!<ɕ@ $:S`XZ!Z' pK@o:A
+Kl>_w;g@s| (h[qċ`j挮 }o@H1,R*"T+<Qw )^ =7+R΋<xE&`Qv@iS\q0ui.Z .qmӇ 0m y)wx&A)E CSv5*DXa1đi&8xIhTjnL; щԦXVX.m2#1UԖEGfۚ「}Uye0F ͛kB%082<(xex?StKpp I=G+"vXQUu HS 4#3 zEt&dP *9xŜ@i'T5%&F#(FMũW;X B?0^Nc&ͅ?.7Ӓ ;; +) +X{L9IC7DR <gv8_>iMW) k
+^:>oY
+os.Jv+QM.r&2dӴ7w×; !1M.g#iW9觫ď :4Dp_GUUrk&˷7R;kd}Ff={k >;G q
+Nar\em( ' ozw&S9bazo^SR%@-g9cQT9 A
+r^jB7sىЀZ4I.=6%no_f PѵOz?lTVw~[4ziiSm>s`P
+^|uC(uy]4
+bSg~ (X©@\V? ~KNVw؈'
+
+E"9gy> T25 8A .S,?"PyNz8Zc.*nG豔
+~g^!`8T ک%?У`S \_7urBBc%
+/_t##S
+9
+A$2*|lh5P5 ].sFe1n^YR׋'"S`*ȾkUᗊ5K@
+lx'˱+w8j`4JY܃0|pucX &l߆sq/3$?C=cڨ̰6 4\eo}coR"HKa,TYM[1=}tkq~I HXwc0= t~<78OTkD[Ou*(/bkEWQ%\=d.;I@ԋ߷a6 J" Ȟ؊NB5{ /?o"Ͱ<n3].'Gc<}f 4,OmnH@d
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+20 0 obj
+<<
+/Length1 957
+/Length2 1894
+/Length3 533
+/Length 3384
+>>
+stream
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /JEFYPA+CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 128 /minus put
+dup 143 /bullet put
+dup 148 /lessequal put
+dup 33 /arrowright put
+dup 78 /N put
+dup 83 /S put
+dup 84 /T put
+dup 104 /angbracketleft put
+dup 105 /angbracketright put
+dup 106 /bar put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+/UniqueID 5000820 def
+currentdict end
+currentfile eexec
+i_,+`"Wٰ'Z1NςRoN]+,󡈙5Н; lƸ<O# v32cͽL
+>Wb3k,j:N'lkp<7%탴s9
+1,;TWoZz
+&>jN-?OΌ ǿnzhy(?`?bӗԍLPĢc-'7sRIdrM8fB3}Qm(mJZh:. {\hcH+6PZEۘ,"5kãP(}S uc[!5W)>T94Qn
+E7=ͅ
+EAtlOE*:4O21RB?_86N
+}Ly6DldR g5f\f0.4h3۷|vy
+/%wxRѵtõ[=vPa[ —| ~$z/BIPa i_20HQtk lR9('%@ Hc~fFGQ*ETi`k01 Z 43y4.inzGf Lo.:Vi 'qHuF(D"nm5'O vtsH|31 x+MH&»_Qk>($RS+.(߸{Fjud^Ddm,<
+ֻ.e%$,VpN0Z,@zݛb ~֦f -
+~u^ { K~]Eʗnnݩm"!a(^qXRpX/2 ;RBv%fV nxntS"tViqëň_9#Ǧ'U'í?8#NrQ9˻&I
+b
+Dɘv<Փ8
+v~%K뾲8'ǹz(soa6?sNtvN)k2tC{*:ª0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+23 0 obj
+<<
+/Length1 1265
+/Length2 6407
+/Length3 533
+/Length 8205
+>>
+stream
+%!PS-AdobeFont-1.1: CMR9 1.0
+%%CreationDate: 1991 Aug 20 16:39:59
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /YEEPJZ+CMR9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 39 /quoteright put
+dup 44 /comma put
+dup 46 /period put
+dup 65 /A put
+dup 68 /D put
+dup 69 /E put
+dup 77 /M put
+dup 83 /S put
+dup 84 /T put
+dup 86 /V put
+dup 88 /X put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+readonly def
+/FontBBox{-39 -250 1036 750}readonly def
+/UniqueID 5000792 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+,`1 ʥ?HiUu6H(XR:VQjSsl( jB5"؃{UpoxBx41E3:SƽWh="
+-@;qjh2!!U9mBLF sEMO#!/tFz+G>θ>&3ڀWsS@xoOmJC\㵇>`_<=X/S}`̾۲& 7棜S
+/K DEmcGxsK¿zP4s7l5/uҰս'Q4y瞉}$pM)[(ǔ'
+ޤI)h<aAY6hGPrc BeTMer
+F\4w.
+hRomٛj O/F&QDs|_{eyYKS@Q)z'7zt*}4vu'e3hg_Rb41Yǁ㫟!{JYx͗&AZx ~$I $d>Ά`<Ksꡨ|*"!.TEi:_n{:wԢʀwX Rd fk%zg?kN[
+/X5ty8Y>=+&F4Ʊ1Ơ-@pS6!lϸ~GDB![
+ި^
+(-Td[X<Rk]Mk~gh1zo6X
+S0 aq;'}
+DRBD?d\->HӠ0O=U6zCa h?rvy~[IZv(zeE
+jck19~{v1ٟ<MB"RH aBUSZ6]ylGx<hؿ( ?'[4+HmF]JK@W_ԬEi"%x8.krɭ .)t^1},s)8eYEykS;ϜgNkuGtZ
+H`ƊA7̌>;5$Ċz|*Рn\-FcQ$y/l@6K0&H0״ }GK >OZjPM,fe2
+Uv1ShJƎ1I{WՖ|#Y}쫭247r.L/gS )n:?!? ,Dz{GqG?.YKjGkk݌0<_㦯TmgKbHcR˳n:9Z98a[Ȇ0¦
+v a#ґ}hu)?NB
+q`'I syӾ$ <vMԇI߳uMӌ |C6ꎌ!+.Oxz,ĉ'TN#żusA1=>POfe0hU
+(^J-
+\P
+.8!L셻b
+`eOzb3t4f04%+$0G=ڙs/Ԯ㖶Ie7ߧ\{Cv1:`~92#|ê6KI<-DOg+4+Hf@'~24s#˜k;㼯 k ?J .ԞXŤy~;D3_9o]G 10V-ZQ7j x08'[U3j5Y4= HZ72Do,^[q߲ԑfoZG}&h!T'P0E#yIK?<bƹ˟Ng{2I
+򫤯g
+UoMFYV$N/GK)4f!ɜ[4ɟuƣHbAtfXZ4Lg O@87BQ;rDQU
+9YJ4L)ž@1*@T#Q(^z:lF\)+f/79Ҥ!a 3,[ԗY(JOQYSJI7&:;.|nW; YXNEAs?DK[/ʎwf?,
+^yĚ_SF.*>hJU4&U,Atb)Ao P I@(f~+O!ɼ7scAqrd䃕{F!FMLKDSL
+[o~elRkKacןww[|uZR,)`ٙZ7ݾ.0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+26 0 obj
+<<
+/Length1 825
+/Length2 1743
+/Length3 533
+/Length 3101
+>>
+stream
+%!PS-AdobeFont-1.1: CMCSC10 1.0
+%%CreationDate: 1991 Aug 18 17:46:49
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /PNTRYP+CMCSC10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 68 /D put
+dup 97 /a put
+dup 101 /e put
+dup 110 /n put
+dup 116 /t put
+readonly def
+/FontBBox{14 -250 1077 750}readonly def
+/UniqueID 5000772 def
+currentdict end
+currentfile eexec
+i_,+`"W僥99>'~ }(JܝrC8mĔG@G ^7+ 6}) Xw4z<^ef2oAx*;xu&=kK`<ZvfJk{ CÒ2iZ& $d
+ҐBq삥PY4E1Qe QWsz8oR\b;\GR NᲟIN(]/XZD
+#=7Hsa}-f7aҡͧ-Iͯ3ԣ(ThZlzyp@fvuo}aܨA;pJכ'1ܮ5OΥxA@TڈJbQ44!.#oO 2zgEr µJ'bָYI,:(FVV:e[u ȪX[|`[˻-`<:17u\]nq;һ=fKN+O3U~%jH?S%MA<|>)5MzMPw%jþ]DŽgƾnIgS7s\ #&t(-*cF•!, aXY+COK{><F8Dcd Pn$Se@2RAO
+\-
+n Dz)V7z)ƒo9Mg̡9da5,'0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+29 0 obj
+<<
+/Length1 906
+/Length2 2794
+/Length3 533
+/Length 4233
+>>
+stream
+%!PS-AdobeFont-1.1: CMMI10 1.100
+%%CreationDate: 1996 Jul 23 07:53:57
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /LVFFVW+CMMI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 34 /epsilon put
+dup 60 /less put
+dup 62 /greater put
+dup 102 /f put
+dup 105 /i put
+dup 109 /m put
+dup 110 /n put
+dup 116 /t put
+dup 120 /x put
+readonly def
+/FontBBox{-32 -250 1048 750}readonly def
+/UniqueID 5087385 def
+currentdict end
+currentfile eexec
+4y9B0i H1r^ v.Hntµ'W"xp'DpԄ&,6 6WS:W0H:eTA7J.>Դ{8"ahγDn'$8NC z[wM 3FSj'SKx=x ՊE@ؗ<npTyFJK1 X4KB99\B:eF);Phٛх1uvNgWZUD_bYSߐ :-\hvҜ^>4
+ۄK\:юd$
+9kvb==ՓvW;Is܍h- 1/uSv
+dQi!#{`%Q31Xh)
+i9_uSKL꼗}9WT uA;'2bUlAD?V JC񷑕Ը乪%{@;u+p$NWJ!&Z,jP+08a_P= :څy0Lz$YqtW9\
+~&/^,p TUX'28- l--.Q#\]z
+gJ~؊=\Hf"6q;k~$6 j'L-A&ԘOs3bsФLV{3'#?7i<}ʱb:aҲL
+;1tugԪǸWˑ"=@7.${wG>
+X2[ ܃[|>u/
+WO l*3/'G1$Y$XsAuaF;b7X+9~Bz>7L%BNQƩs$Cqo0N<gFv1z:{@!Xp"A&@&Dfp94,J7n.lICn!uw {:rWqPǁ6̧]EHY`=BO"xi b_;CL_dz*
+gV,,v׭`{D;A-92+etN*.S
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+32 0 obj
+<<
+/Length1 909
+/Length2 2638
+/Length3 533
+/Length 4080
+>>
+stream
+%!PS-AdobeFont-1.1: CMR7 1.0
+%%CreationDate: 1991 Aug 20 16:39:21
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR7) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /UZAZBR+CMR7 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 57 /nine put
+dup 104 /h put
+dup 116 /t put
+readonly def
+/FontBBox{-27 -250 1122 750}readonly def
+/UniqueID 5000790 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+?^' \!Y"?5ڗÃg>]1Q
+Pޓ/ܠaPrF #% #I*㬓NfZSbQ%gйy6"Q CB8: ӏ(j4t.xJw5MElB3$.GDMliQ[<5yGH=oj$S/Z9TKPpmzIsBkN%:9 `$ą*iSͱz/@|KgQRGйadǟךЅVoxp
+VwҌJk<žjyP#m&Oppzk0 2ߧU
+p~U)X=6Y
+u%<\ӈ]$RߕZX\ftL1A:zlD\q2"c 0* :cnmU`(4 1di-/!x„c-OJqډN+$]Xɣ7:CN=O
+sffU2ԝ8C)E4NDq!{&d.$Y;=6c[5G++{;V
+w<
+ƓJI2n34ǃ֜Aq 1o(>­ >J^/8
+>6k^$S vN^iiKz<e[iQ$`}@Wka) l􍺎_h5>S
+ Ihpsizq*#ʽ.+Igk8A%Iꮢ{ǍcƏq_O;x;:f8:gcզaW;V#ݗxKBsVtي,!C*n*SXr ?ym':+)q#
+Xoz6!y+ R6:V}LS~p(#Dh5Nn/L#;&%fJ߽Ϸ:LÍN$\u'PF`J"dgwWHt*͵dVv
+Q%цO*\ZA^tfX5Tm
+CFƽ
+{o!0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+35 0 obj
+<<
+/Length1 1952
+/Length2 12215
+/Length3 533
+/Length 14700
+>>
+stream
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /EKVJLM+CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 160 /visiblespace put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 65 /A put
+dup 69 /E put
+dup 71 /G put
+dup 73 /I put
+dup 74 /J put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 80 /P put
+dup 82 /R put
+dup 84 /T put
+dup 87 /W put
+dup 88 /X put
+dup 92 /backslash put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 125 /braceright put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+/UniqueID 5000832 def
+currentdict end
+currentfile eexec
+SQM((0_&(<U7l=ڎ帗|'?۵k
+|%5_J8-̏}<IڽʒzV @N4ٙ4 N` ϸV?<Z/X}Wt2NQ(O$P@cQB"DmۛNxLk8E !ujsF,V=Q2,)1^K#u,oE &D|~0Vv%7:
+΋3d<[dҡs"qe rތ?
+phPT@/0rajXyɵ&ţkn3={@F6Fpd7So&n'SÐ̷1MnT'LF~%Y?Ts> `˓!4e!˧*#S/Ѷ~剦ZKg*_W׃m
+%0i#0(4wzuw;bf5ӻT\9O_%,.y/[~#FҪbzFp3dcBBc/=ADIaxZ 3*xdl,X̸A⥮0ޘF#`LyyˡDt ǁWfvbD!_%w,j/Ft*l<V5KSMsTôU*7س`%cMp(RJf<d 9ri˝J}{}"kiey
+04>Sq8;\ C],};-2+u l49s-g
+е\!)u}u;s  ჆צĭ*ꈄ~"" KݵA(N@
+"x
+LePs%W
+xg4!Mo{.fzW?/Lv?t
+-UAS-cj~M9 =P+JwٿHβM,}*Y˨ꠝ]/{ߩUe|ϜvHM[!qQ9p_J`|7z gGXQ2j?;q|x8۸3gD]p@.DžgxLevP9 lzjݡ1MEЛEJX E&jwm\% Z֐F5.7v ehABU?A6@>kZA|w@@5ϥqOQ-Rې8[-
+|mFU]DR>kx`ˈ*vcG$1Y }Oq@_i#+`TkƃYχϼ"TPWc`lW+@9nahcU}CeB15Wy_\?$UGKmXL_nNvD:Z67aY+X5ԼЪ
+o%FYZuH <T0ǐZL?R^hxk:8X *@ SC(#M,w+m-)72jJކWY~pܢxpB=$j@vO'-/ I,szu[Rq *w_%2-hDg)>R/Ʃ
+-m_1 ><q}TՖl7iyvZrj'xg_n6ʪ$i3cڑ1PKB(FKAH@FELA j}a|&]ߓ '^*e {$)*&ì1GObNwN ʟ1xdňg.Eu"nIB4T•넑VX(*Q LDi\*:"D$:x[NasHLaɎ=xw72:UB3'Ѕ0=тw񦯻M
+?ĉ~ (`-rO,QӪ)JL8!#q^![oz\s, a=$ұzSҳD
+Gg#- r4Hg?3m>]oEU> >;Wk(e=Jv*(*$@tz6gŗ&bmg喭o!EnYō^?4I|9+E"&fY#G]N
+5Ù \W3PhpC~ȃ"ZIFR3 a)l2D&VҚ[JoArjqd<,pșyȐN{YѲ-C6_7n"|_W")a[Ԋ/|bHv‰oȿ/g25^t\$:L]#ZUE*rP|,BM "wp>6!<='o|&@.朻}c:gwLƧg;Xz4>! ԳYR`o:V-VUY3j~+}SКoW7`9q׭,*o < D;|7Z_#
+ʆ=WV"RTzhQ&zO]<@u6^zPxz$4M*N딪jK^iOyӶb_SC0$ 4V<a'*E[.]0A挪e
+ $^VA\H#mCHpCH"ܯGϡxVtSq"Ɔ6)08w/]mnC㚎<waʛ9;QQQtًba79 
+{>>9y = f<h\ީC^vޡ @I @o$}js|z'<yxvB%P|9ぬԊ10-`n8 yi㧒ٔ
+碑ߞA 7d۩*N_&֡tΏEo^@qr2(>,LT/&r4(tp߫1^ix|{rŋr[(6~:L07_G nL_@c5}<bOzo$}
+M& x\ u6 X2SqsDIIQ)f]N<.Us88/ל}]J$ ] C] ͅfP@aH馟i$f'[݃E9 Qp+N,c^I&GI]׊2xRod]h:*|7gJQGICIQMzayHhj)Ice[YO<oU*?R<%B'OJp͆(vj`F[֤P4(F8BMKDs{jCMt {|8NCU(c5zŐPL ՝YQsOr
+ґ$f7c BG Y2{2QVpg|u:lT(0uOx1V'-$-ԉOCSx Cl} mˢ@relH1l{m fKwdئ ]Wv_)jep`OhO Z&}БŒtAD
+F|=M7,y)_eP)B*A2]Uҏ[AMV$cru#il2OPChYdC^3"_U0btH0IF# Jd݄^2 Dc++,*:+4!ERG|)ŏ0fx?ź֝yHB7S#,>EpcGHۣ\-Î8SJ Jx2Cw
+T7Ty]H KQz3x<ݞGX@
+PD B
+
+͎{c] Jv H `]D>@&z-/ܸ̲(@jO1?q̣&Y чY&J`jk_R` LFsD{ k*Y91ڧ͎m趩j)XwR[5rIs,YMa')J*iqEiYl] NmI{c42zIR qBG7? $ A>=Dƭ=s.sRsE'tˁ.>ɼ4b* ܺA|ݼngtB46ɭY5:V:=%/:ZnL(07Z D^bW6L*B8Lv^aRnmo=ɝGbtE=I~ێ-csO|7^zI%Y>ERv'(4op%\1-F׮mcOm80ͲAWmyl^sbg;fʱߟa1mgC($L& dsS h
+UlPpH"
+zQSjNRJ}޽
+n (
+`gtyVNwL4{zccgAv7DLV54c]t^5G ޵5VΉ֟#cE 0UvTP;t@;N߭]C񫈲率o=Ḭd"%1/BJ0P2dC;-ؠ+vR.@}|P<%'&`Pr2f]@PR
+Ľ)rDVk
+LDE1_or
+
+SE|(Skdgl"l`rᤈ #
+W99<f܆";ȱ_+QKvmNQn,=IGV,N lWir%낍+&G.3!2ڄ]N4@ z*T{;ś&@55u%N
+`=}9|_24#aE\y\UWx+R.7۬_Q
+|̫^簁=[8b{_ FX4~ *s% Y7Rټ~U0޸;T ĵxb"sf1q֌A<ן c;1LKY޷hj6uj$266d4vȧxl~-?|G cnr5Ho3 gd؛r}
+(pU/X=4~Dt=X,0ԓE:S!⠉W~T`E~م1їUsn/p*0}`DŽP/O4SˆXj?*23I,5\j@ALgc
+dllV W/". B9Yhk?.~윗g9N h3c¤tZIf{l5u;gr~o#%ƾx nRgMusʵJI
+?w3}-$0{՛kth[F55HD|~A3pXT'\q>Vkhg [sXxBm<HI6IZBŴj15}_fP\觟CM
+Ԑ]{wJF?bΒxr,[@U!3- g0>27Tʤ(m֛8h^kn(mbGr CN/sl0;?{C$ٵv_ <[v$ЙV3bϘdѣk8޹ѶMGtBF1o:3ghֺ[
+.śZ7._Pyb_MWin" ƂcE/ꈜ(Y`;~{Ϡ$GWU~5V7xb ׽9^8_@ )2<e`u=d 0@甬B]JI3+0VS2BRi]y7tcّ~u
+
+qF_ܐJ
+|sG a$Bg @:a[]Wg<4Y61Iƴ5\^5bChnwdd Ǩmi֐&.Cz$@_ oEA;3Bn.Y C -LGotN 7v ]dܪdijJ(Ġ
+.3oIiat5AntK~bP$"q$jϢ!Ex
+9Gj$\
+0\h~[62SxvAф&C@w'ϥJ=n$UlxEzFeH+UukQΤ{<8j'g)QYؙ ez0CQSK_hOajCLJ⬂EW 2:MunyFRүκTijeXs$4%eZIuQ'A>.q%"zԂz*}w:7
+Ⴗu8ٮ-\qq }E mkXtNKaAGvw.(, Hr>(WnSqp찎O.ao \ ^1ҙ¾*E[*&8kW8шׅ RsA8Nib@y
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+40 0 obj
+<<
+/Length1 862
+/Length2 2196
+/Length3 533
+/Length 3591
+>>
+stream
+%!PS-AdobeFont-1.1: CMR6 1.0
+%%CreationDate: 1991 Aug 20 16:39:02
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR6) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /MLTSAC+CMR6 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+readonly def
+/FontBBox{-20 -250 1193 750}readonly def
+/UniqueID 5000789 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+:|p[C#\zC)k;rc‘nZ E~ N K?=}'z݈ IS;ڄWFsqWeOCPp~G'c &SqF6h]xF>vVMN5r8L)ш0S˵/ w+:9UuF@0.Jto*6(Rps+T?RO~_xw`3j%2ryK4˚XYWؼ!.KFnȔpc-Y.4@~^FeK![bиWh2C7`C2+m̌x 2CgnkhA.搱 npT Q{PuqnK,ve?+s{o{orQڎ_y BVoO1s }z ǣ[ AMB[s'?,a\1 0"(wrSajW"Ŋ~"!m8W\p+`N& 0lKG^t*aCRҞcM&Hn,@IE<ίpγtȻw*>F8Ťn-Vв^eÃ۱;Xϋ S$mZ5ӀK>"upyTZ(n%dLL0=X \F3zÔҳ&dWhGt;ZWa6Y-P*gN➼:%3.Jwil-FEa8<C|W̟ZJȈAWy:;yq 4&{wǵrQ.vp4i^R9I!6m|-y1mFN˳ކ co6k=2( 8Ifr!Pf}^
+i/ꠉ|]7P1a>1 -a5H5B̝.AV'1aE"LkM:$+V\rN!%>"#}qSg+;"טvZ'K6_5!m^f& .F9w 1D_:>Ft+c~RCm;OQXu9 w"lUykGK%sIA;1.Ct[+BzINIErp%4PU|]ˮMBxw⢴x [ؘeYxΚz޴60
+,C# :#56&Nl*S71.v }uH4f "tPVTIt,?.Zz_‡w<Gio}7A[^u߆/[8d{Q
+e-X<|E|2VA[.7-v|Ҳ0O71 sQaB$NّW_ Hc)塚
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+43 0 obj
+<<
+/Length1 1471
+/Length2 8304
+/Length3 533
+/Length 10308
+>>
+stream
+%!PS-AdobeFont-1.1: CMR8 1.0
+%%CreationDate: 1991 Aug 20 16:39:40
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /RQSMJQ+CMR8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 139 /ff put
+dup 140 /fi put
+dup 141 /fl put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 59 /semicolon put
+dup 65 /A put
+dup 69 /E put
+dup 73 /I put
+dup 78 /N put
+dup 82 /R put
+dup 84 /T put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+readonly def
+/FontBBox{-36 -250 1070 750}readonly def
+/UniqueID 5000791 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+:|p[C#\zC)k;rc‘nZ E~ N K EAE6z\$Vӹ _t #mȚVxb6@mNl4qXZ;w)Ee&}9Nqqu-:^g9 MtC]ٖ#塌 #v:ˆ8NHI^R9<buFh
+CH+
+@i#;6--2)VuRe5
+ˠm=uen?zO,%;$\r#/+IމWV&{>H\&:?sݦv9"S|_bd[
+d |Utkw
+vqmG^ay)'<p*Sg+8Wߥ܂Ũ~BjEX{;@36ذ\{3`fE)h{#dѨiȝK/u]0
+{>-BB\emGTUo mn[c0hbʩ!֪唔t˳.)c J[&V|}XTA@WC\k~6Y"u
+fs#KNU<|To9%_Ye~7sϽr`IaY+j|L^g$)qBD6vƍy*$ iBZL?>$,ꍭ]'˷ġq,nm,XRL5GӬ $Sa.VaPB]ܹo_Λ+#
+)BGt)p#?V)Kh= /E23[uX4B@ )TJm2JvNɑA<$߿}b 㹼)ZұGcIxti2ǝP.+ T\̶q6*Wv4ad\LfJGQ:Oۼ
+#/t3;
+c
+e hY,.4}?'P 9zZֵ1к8g!/ 8z7ubTU 9Zu޿
+җQL7t" M2 wI' L09>Tn42Dv7^[x9ʅUKV]+;B?ʬj;_,n
+}tNÀKy!*y.dL <
+`'+IN5$>cJxHっ8%Y+iNmU`?zM=BNA^v04.7xp`^CB[|;o 1ֵuNs{֧f9{"yä<l9|AW/' 9l -
+zza<F
+ C\_y4S=C@vz#$B; |зInJBg!:|- xg(f'@{ɹ8K1y43 ic/⊳n0:l4FTa
+YnC +Z*ڨ,_O߾^:/XmB |yrʏݭ.N[;!{AC9ԪtYzY&n65.tc$@Ϛ8k4]Xo*5?Z+]1RxANKPg S9@8=S2AY]8_!M+(1;lw;+/ga$^tȬ:0нxmks%ֆg2 ZgY2p"U=$gOF@e5ضz-z0
+#r,Pbdz>z?^y&LOmh&+|Ji2{֞Ff ]P#H28?=tD:嘵E٦ <DŽ uz}W5˲ױֳD)B8.E<[<=hhAyZ&nR/
+DPA9|/v%#GA.
+pa3{N<pF6ED#9*4]@|NZw
+=Kw=]yr$e"=AC6Ԅoj|ycomt~L:V˙X捍^܎)2,ܱ:aO)Sl/~&s(;e7F$}&2LM/˚`~JtlOIG0EHIbͺ̙t0]U3cZQ@ ń_&S3Lku[܂k2_b}uWtI55e |' KhjOF؃Z}d8;&&}d)˳?\frS<2!w
+Ms! _?>ocX9)vFmkP~<d/D2Hx+ }<d |؁Xwߑ{r%
+Oh1Xwak<%'ŕ{Q#*២٣B?@\>fhĖY!BV3<Bw7!AnK!Mh\)Do7Ujړ7"ʭ2&<!I@`h%#/ӷ9*XWLMaN;0.w:@DDHZѺpBcU.=<56o`eA]^ w97yʑ~@YZ2MAtG3U4k^3O; a/H.vۋ_FaPRZ$ cU0
+"o%δ#O6e.98q
+SvίT;/9ڃ&lMC?2F W z+h} ;--W򭈄
+
+(-6.w^ү;f4ݭ<dࠁAeό1U0nr?fbJMDt7{wB/f ]bk u1۞ln)ľB! ]Ao0;/Y,`ky"D?0:9CcDCIQ~T݅KeHB~ҴBWwarpr
+e-#:> \$I+,L[gT)6nײ'CJ]nTSL)`UO51k-˅7o[:E$]BHe>pkI"vٯKBW$9Aby짝hB;"XX~L^R_23(F$bQVwŁ&W<[
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+68 0 obj
+<<
+/Length1 884
+/Length2 2315
+/Length3 533
+/Length 3732
+>>
+stream
+%!PS-AdobeFont-1.1: CMTT8 1.0
+%%CreationDate: 1991 Aug 20 16:46:05
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CWNHEJ+CMTT8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 92 /backslash put
+dup 97 /a put
+dup 99 /c put
+dup 101 /e put
+dup 107 /k put
+dup 110 /n put
+dup 111 /o put
+dup 115 /s put
+dup 116 /t put
+readonly def
+/FontBBox{-5 -232 545 699}readonly def
+/UniqueID 5000830 def
+currentdict end
+currentfile eexec
+i_,+`"WP
+5 l.jkP P(?~M;^yy*f˼[:-Z/e_[+5{^dtp!~dZ+س
+]jdsӵᘝn%ã^MYk_ֲ7;0}YEmjgjzetۋ>E囦BAU^JNM
+lf4p\-8qq_āWR"FB2;g&l]&;8$f͔fu -ToШdL]zԈe:H
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+103 0 obj
+<<
+/Length1 776
+/Length2 1240
+/Length3 533
+/Length 2549
+>>
+stream
+%!PS-AdobeFont-1.1: CMMI8 1.100
+%%CreationDate: 1996 Jul 23 07:53:54
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /FAKGAL+CMMI8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 34 /epsilon put
+readonly def
+/FontBBox{-24 -250 1110 750}readonly def
+/UniqueID 5087383 def
+currentdict end
+currentfile eexec
+4y9B0i H1r^ v.Hntµ'W"xp'DpԄ&,6 6WS:W0H:eTA7J.>Դ{8"ahγDn'$8NC z[wM 3FSj'SKx=xr!0u\/0:jm;FS'01NJ)m+yA%״~zlL/ڌ%FR$tY፟z^N
+#YFun&5%מnAɭA
+(@r]6nzLj,tH[}|>O#
+ |݊bg&HȷB+ h9R
+^<<K<"DFD-^Lts(J+\`EE"#ȸZ΂)
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+131 0 obj
+<<
+/Length1 771
+/Length2 2712
+/Length3 533
+/Length 4016
+>>
+stream
+%!PS-AdobeFont-1.1: CMBX10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:06
+
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /XEXUPK+CMBX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 56 /eight put
+readonly def
+/FontBBox{-301 -250 1164 946}readonly def
+/UniqueID 5000768 def
+currentdict end
+currentfile eexec
+SQM((0_&(<U7l=ڎ帗|'?۵k
+|%5_J8-̏}<IڽʒzV @N4ٙ4 N` ϸV?<Z/X}Wt2NQ(O$P@cQB"DmۛNxLk8E !ujsF,V=Qo̜C2rO{(ەSE^"Iɀ#sW-WNɰۉ^ᚑC\ϊ5HK)F։2^Vt0tw=QK{:J%h4UOjXx쨬 \åG? @)H;Bd^
++dQ@J=K
+y3)@(T@o=ЍLW#/od0?A+<`*iɣYAb{FUߌim)lf9~P&'($[_/l|sf*4kDqƙ=*!Iˣ}ֹ 'Q  ~vJaS.wEvV8-99 :3ёsbVi!7!R n_SiRL 6lPøh܄rar:< Z|B2`R"ħ479CZGýfnLJYPa)n2_.KI<Z7G:$XmY vՃMbC+e^a
+@ylCƕ/,=0ܺ۰
+D'g]Q.GDƮ[l Ӊo5c^3~6~?$^Ap4I/"5j1h׆KZ].
+"\tYB|1 A\kI%,CQ> (xmφKQkTk&a,h3z׈Mm|<oJi~LCSϷ897A9{k
+xmb0HPX(3-Z3(l9Jլ| hMQ;̃#|QWNp3*%<I V6$RYC9 IӴ0'2+Hcv饄Ҝ$H^PMRKZf#m5.{=#7mGY|
+9;^H vY>뫞Ki^hT%䳴)35¹gӣYmG9C tmS#0a¹PGg
+6ǫr>6 pX2ͧ5SJl0ȧ
+T~y?+`x%вJv/:&U@1!XEH ?Q;eՒ2cZ *dl;hyj
+|=+ rc6Vΰ(Zn+Ui`xm!߾tf uZ;-֪"H<Z#I-
+Tv{
+̚~eA%zPDYLcf00Xk75gG!V]V}+Q@m R4ly Eg4gw?:
+KHcRzjĪ~{σl!Xo
+h-/VMJivi:RbToFL!"Dɧ0ED+H:_>8h*]Ml¤Qw}yR -BTrǥ4:-;˗
+I(]dZ#e'C0" 2ymkM$+xOq0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+
+endstream
+endobj
+136 0 obj
+<<
+/Length 525
+>>
+stream
+755.55 0.00 48.18 -12.04 722.70 674.52 d1 q 674.52 0 0 686.56 48.18 -12.04 cm
+BI
+/W 56
+/H 57
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+137 0 obj
+<<
+/Length 574
+>>
+stream
+800.00 0.00 48.18 -12.04 758.84 662.48 d1 q 710.65 0 0 674.52 48.18 -12.04 cm
+BI
+/W 59
+/H 56
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+138 0 obj
+<<
+/Length 639
+>>
+stream
+869.44 0.00 48.18 -12.04 831.11 674.52 d1 q 782.92 0 0 686.56 48.18 -12.04 cm
+BI
+/W 65
+/H 57
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+139 0 obj
+<<
+/Length 156
+>>
+stream
+383.33 0.00 72.27 168.63 373.39 264.99 d1 q 301.12 0 0 96.36 72.27 168.63 cm
+BI
+/W 25
+/H 8
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+140 0 obj
+<<
+/x45 136 0 R
+/x54 137 0 R
+/x58 138 0 R
+/x2d 139 0 R
+>>
+endobj
+39 0 obj
+<<
+/Type /Font
+/Name /F11
+/Subtype /Type3
+/FirstChar 0
+/LastChar 127
+/Widths [691.66 958.33 894.44 805.55 766.66 900 830.55 894.44 830.55 894.44 830.55
+670.83 638.89 638.89 958.33 958.33 319.44 351.39 575 575 575 575 575 869.44 511.11
+597.22 830.55 894.44 575 1041.66 1169.44 894.44 319.44 350 602.78 958.33 575 958.33
+894.44 319.44 447.22 447.22 575 894.44 319.44 383.33 319.44 575 575 575 575 575 575
+575 575 575 575 575 319.44 319.44 350 894.44 543.05 543.05 894.44 869.44 818.05 830.55
+881.94 755.55 723.61 904.16 900 436.11 594.44 901.38 691.66 1091.66 900 863.88 786.11
+863.88 862.5 638.89 800 884.72 869.44 1188.88 869.44 869.44 702.77 319.44 602.78
+319.44 575 319.44 319.44 559.02 638.89 511.11 638.89 527.08 351.39 575 638.89 319.44
+351.39 606.94 319.44 958.33 638.89 575 638.89 606.94 473.61 453.61 447.22 638.89
+606.94 830.55 606.94 606.94 511.11 575 1149.99 575 575 575]
+/FontBBox [-118.9 -450 1307.9 850]
+/FontMatrix [0.001 0 0 0.001 0 0]
+/Encoding 38 0 R
+/CharProcs 140 0 R
+>>
+endobj
+141 0 obj
+<<
+/Length 402
+>>
+stream
+755.55 0.00 45.17 -15.06 722.70 677.53 d1 q 677.53 0 0 692.59 45.17 -15.06 cm
+BI
+/W 45
+/H 46
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+142 0 obj
+<<
+/Length 396
+>>
+stream
+800.00 0.00 60.22 -15.06 752.81 662.47 d1 q 692.59 0 0 677.53 60.22 -15.06 cm
+BI
+/W 46
+/H 45
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+143 0 obj
+<<
+/Length 448
+>>
+stream
+869.44 0.00 45.17 -15.06 843.15 677.53 d1 q 797.98 0 0 692.59 45.17 -15.06 cm
+BI
+/W 53
+/H 46
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+144 0 obj
+<<
+/Length 146
+>>
+stream
+383.33 0.00 75.28 150.56 361.35 255.96 d1 q 286.07 0 0 105.39 75.28 150.56 cm
+BI
+/W 19
+/H 7
+/IM true
+/BPC 1
+/I true
+ID
+EI
+Q
+endstream
+endobj
+145 0 obj
+<<
+/x45 141 0 R
+/x54 142 0 R
+/x58 143 0 R
+/x2d 144 0 R
+>>
+endobj
+114 0 obj
+<<
+/Type /Font
+/Name /F16
+/Subtype /Type3
+/FirstChar 0
+/LastChar 127
+/Widths [691.66 958.33 894.44 805.55 766.66 900 830.55 894.44 830.55 894.44 830.55
+670.83 638.89 638.89 958.33 958.33 319.44 351.39 575 575 575 575 575 869.44 511.11
+597.22 830.55 894.44 575 1041.66 1169.44 894.44 319.44 350 602.78 958.33 575 958.33
+894.44 319.44 447.22 447.22 575 894.44 319.44 383.33 319.44 575 575 575 575 575 575
+575 575 575 575 575 319.44 319.44 350 894.44 543.05 543.05 894.44 869.44 818.05 830.55
+881.94 755.55 723.61 904.16 900 436.11 594.44 901.38 691.66 1091.66 900 863.88 786.11
+863.88 862.5 638.89 800 884.72 869.44 1188.88 869.44 869.44 702.77 319.44 602.78
+319.44 575 319.44 319.44 559.02 638.89 511.11 638.89 527.08 351.39 575 638.89 319.44
+351.39 606.94 319.44 958.33 638.89 575 638.89 606.94 473.61 453.61 447.22 638.89
+606.94 830.55 606.94 606.94 511.11 575 1149.99 575 575 575]
+/FontBBox [-118.9 -450 1307.9 850]
+/FontMatrix [0.001 0 0 0.001 0 0]
+/Encoding 38 0 R
+/CharProcs 145 0 R
+>>
+endobj
+1 0 obj
+<<
+/Creator ( TeX output 1998.06.28:1717)
+/Producer (dvipdfm 0.12.7b, Copyright \251 1998, by Mark A. Wicks)
+/CreationDate (D:20000702213939+00'00')
+>>
+endobj
+5 0 obj
+<<
+/Type /Page
+/Resources 6 0 R
+/Contents [46 0 R 4 0 R 47 0 R 48 0 R]
+/Parent 146 0 R
+>>
+endobj
+50 0 obj
+<<
+/Type /Page
+/Resources 51 0 R
+/Contents [46 0 R 4 0 R 52 0 R 48 0 R]
+/Parent 146 0 R
+>>
+endobj
+54 0 obj
+<<
+/Type /Page
+/Resources 55 0 R
+/Contents [46 0 R 4 0 R 56 0 R 48 0 R]
+/Parent 146 0 R
+>>
+endobj
+58 0 obj
+<<
+/Type /Page
+/Resources 59 0 R
+/Contents [46 0 R 4 0 R 60 0 R 48 0 R]
+/Parent 147 0 R
+>>
+endobj
+62 0 obj
+<<
+/Type /Page
+/Resources 63 0 R
+/Contents [46 0 R 4 0 R 64 0 R 48 0 R]
+/Parent 147 0 R
+>>
+endobj
+147 0 obj
+<<
+/Type /Pages
+/Count 2
+/Kids [58 0 R 62 0 R]
+/Parent 146 0 R
+>>
+endobj
+146 0 obj
+<<
+/Type /Pages
+/Count 5
+/Kids [5 0 R 50 0 R 54 0 R 147 0 R]
+/Parent 3 0 R
+>>
+endobj
+66 0 obj
+<<
+/Type /Page
+/Resources 67 0 R
+/Contents [46 0 R 4 0 R 71 0 R 48 0 R]
+/Parent 148 0 R
+>>
+endobj
+73 0 obj
+<<
+/Type /Page
+/Resources 74 0 R
+/Contents [46 0 R 4 0 R 75 0 R 48 0 R]
+/Parent 148 0 R
+>>
+endobj
+77 0 obj
+<<
+/Type /Page
+/Resources 78 0 R
+/Contents [46 0 R 4 0 R 79 0 R 48 0 R]
+/Parent 148 0 R
+>>
+endobj
+81 0 obj
+<<
+/Type /Page
+/Resources 82 0 R
+/Contents [46 0 R 4 0 R 83 0 R 48 0 R]
+/Parent 149 0 R
+>>
+endobj
+85 0 obj
+<<
+/Type /Page
+/Resources 86 0 R
+/Contents [46 0 R 4 0 R 87 0 R 48 0 R]
+/Parent 149 0 R
+>>
+endobj
+149 0 obj
+<<
+/Type /Pages
+/Count 2
+/Kids [81 0 R 85 0 R]
+/Parent 148 0 R
+>>
+endobj
+148 0 obj
+<<
+/Type /Pages
+/Count 5
+/Kids [66 0 R 73 0 R 77 0 R 149 0 R]
+/Parent 3 0 R
+>>
+endobj
+89 0 obj
+<<
+/Type /Page
+/Resources 90 0 R
+/Contents [46 0 R 4 0 R 91 0 R 48 0 R]
+/Parent 150 0 R
+>>
+endobj
+93 0 obj
+<<
+/Type /Page
+/Resources 94 0 R
+/Contents [46 0 R 4 0 R 95 0 R 48 0 R]
+/Parent 150 0 R
+>>
+endobj
+97 0 obj
+<<
+/Type /Page
+/Resources 98 0 R
+/Contents [46 0 R 4 0 R 99 0 R 48 0 R]
+/Parent 150 0 R
+>>
+endobj
+101 0 obj
+<<
+/Type /Page
+/Resources 102 0 R
+/Contents [46 0 R 4 0 R 106 0 R 48 0 R]
+/Parent 151 0 R
+>>
+endobj
+108 0 obj
+<<
+/Type /Page
+/Resources 109 0 R
+/Contents [46 0 R 4 0 R 110 0 R 48 0 R]
+/Parent 151 0 R
+>>
+endobj
+151 0 obj
+<<
+/Type /Pages
+/Count 2
+/Kids [101 0 R 108 0 R]
+/Parent 150 0 R
+>>
+endobj
+150 0 obj
+<<
+/Type /Pages
+/Count 5
+/Kids [89 0 R 93 0 R 97 0 R 151 0 R]
+/Parent 3 0 R
+>>
+endobj
+112 0 obj
+<<
+/Type /Page
+/Resources 113 0 R
+/Contents [46 0 R 4 0 R 115 0 R 48 0 R]
+/Parent 152 0 R
+>>
+endobj
+117 0 obj
+<<
+/Type /Page
+/Resources 118 0 R
+/Contents [46 0 R 4 0 R 119 0 R 48 0 R]
+/Parent 152 0 R
+>>
+endobj
+121 0 obj
+<<
+/Type /Page
+/Resources 122 0 R
+/Contents [46 0 R 4 0 R 123 0 R 48 0 R]
+/Parent 152 0 R
+>>
+endobj
+125 0 obj
+<<
+/Type /Page
+/Resources 126 0 R
+/Contents [46 0 R 4 0 R 127 0 R 48 0 R]
+/Parent 153 0 R
+>>
+endobj
+129 0 obj
+<<
+/Type /Page
+/Resources 130 0 R
+/Contents [46 0 R 4 0 R 134 0 R 48 0 R]
+/Parent 153 0 R
+>>
+endobj
+153 0 obj
+<<
+/Type /Pages
+/Count 2
+/Kids [125 0 R 129 0 R]
+/Parent 152 0 R
+>>
+endobj
+152 0 obj
+<<
+/Type /Pages
+/Count 5
+/Kids [112 0 R 117 0 R 121 0 R 153 0 R]
+/Parent 3 0 R
+>>
+endobj
+3 0 obj
+<<
+/Type /Pages
+/Count 20
+/Kids [146 0 R 148 0 R 150 0 R 152 0 R]
+/MediaBox [0 0 612 792]
+>>
+endobj
+46 0 obj
+<<
+/Length 1
+>>
+stream
+
+endstream
+endobj
+48 0 obj
+<<
+/Length 1
+>>
+stream
+
+endstream
+endobj
+4 0 obj
+<<
+/Length 18
+>>
+stream
+1 0 0 1 72 720 cm
+endstream
+endobj
+154 0 obj
+<<
+>>
+endobj
+155 0 obj
+null
+endobj
+156 0 obj
+<<
+>>
+endobj
+2 0 obj
+<<
+/Type /Catalog
+/Pages 3 0 R
+/Outlines 154 0 R
+/Threads 155 0 R
+/Names 156 0 R
+>>
+endobj
+xref
+0 157
+0000000000 65535 f
+0000290880 00000 n
+0000294271 00000 n
+0000293928 00000 n
+0000294136 00000 n
+0000291047 00000 n
+0000027201 00000 n
+0000000009 00000 n
+0000179693 00000 n
+0000001475 00000 n
+0000001683 00000 n
+0000190753 00000 n
+0000002808 00000 n
+0000003020 00000 n
+0000194384 00000 n
+0000004241 00000 n
+0000004455 00000 n
+0000204823 00000 n
+0000005583 00000 n
+0000005792 00000 n
+0000222094 00000 n
+0000006916 00000 n
+0000007130 00000 n
+0000225570 00000 n
+0000008280 00000 n
+0000008488 00000 n
+0000233868 00000 n
+0000009733 00000 n
+0000009944 00000 n
+0000237061 00000 n
+0000010980 00000 n
+0000011193 00000 n
+0000241386 00000 n
+0000012356 00000 n
+0000012564 00000 n
+0000245558 00000 n
+0000013804 00000 n
+0000014018 00000 n
+0000014867 00000 n
+0000287190 00000 n
+0000260353 00000 n
+0000016186 00000 n
+0000016394 00000 n
+0000264036 00000 n
+0000017612 00000 n
+0000017820 00000 n
+0000294036 00000 n
+0000019054 00000 n
+0000294086 00000 n
+0000027032 00000 n
+0000291152 00000 n
+0000035824 00000 n
+0000027265 00000 n
+0000035746 00000 n
+0000291259 00000 n
+0000044307 00000 n
+0000035889 00000 n
+0000044172 00000 n
+0000291366 00000 n
+0000050212 00000 n
+0000044372 00000 n
+0000050123 00000 n
+0000291473 00000 n
+0000054927 00000 n
+0000050277 00000 n
+0000054882 00000 n
+0000291758 00000 n
+0000060607 00000 n
+0000274438 00000 n
+0000054992 00000 n
+0000055205 00000 n
+0000056437 00000 n
+0000060482 00000 n
+0000291865 00000 n
+0000066507 00000 n
+0000060672 00000 n
+0000066451 00000 n
+0000291972 00000 n
+0000075884 00000 n
+0000066572 00000 n
+0000075795 00000 n
+0000292079 00000 n
+0000083709 00000 n
+0000075949 00000 n
+0000083607 00000 n
+0000292186 00000 n
+0000091036 00000 n
+0000083774 00000 n
+0000090958 00000 n
+0000292472 00000 n
+0000098621 00000 n
+0000091101 00000 n
+0000098530 00000 n
+0000292579 00000 n
+0000108184 00000 n
+0000098686 00000 n
+0000108095 00000 n
+0000292686 00000 n
+0000115570 00000 n
+0000108249 00000 n
+0000115480 00000 n
+0000292793 00000 n
+0000125769 00000 n
+0000278262 00000 n
+0000115636 00000 n
+0000115850 00000 n
+0000117077 00000 n
+0000125653 00000 n
+0000292903 00000 n
+0000133416 00000 n
+0000125836 00000 n
+0000133314 00000 n
+0000293194 00000 n
+0000142279 00000 n
+0000289872 00000 n
+0000133483 00000 n
+0000142118 00000 n
+0000293304 00000 n
+0000153208 00000 n
+0000142346 00000 n
+0000153129 00000 n
+0000293414 00000 n
+0000164913 00000 n
+0000153275 00000 n
+0000164823 00000 n
+0000293524 00000 n
+0000172647 00000 n
+0000164980 00000 n
+0000172545 00000 n
+0000293634 00000 n
+0000179626 00000 n
+0000280904 00000 n
+0000172714 00000 n
+0000172926 00000 n
+0000174085 00000 n
+0000179523 00000 n
+0000285013 00000 n
+0000285590 00000 n
+0000286216 00000 n
+0000286907 00000 n
+0000287115 00000 n
+0000288197 00000 n
+0000288651 00000 n
+0000289099 00000 n
+0000289599 00000 n
+0000289797 00000 n
+0000291663 00000 n
+0000291580 00000 n
+0000292376 00000 n
+0000292293 00000 n
+0000293098 00000 n
+0000293013 00000 n
+0000293829 00000 n
+0000293744 00000 n
+0000294203 00000 n
+0000294226 00000 n
+0000294248 00000 n
+trailer
+<<
+/Size 157
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+294370
+%%EOF
diff --git a/systems/doc/etex/etex_man.sty b/systems/doc/etex/etex_man.sty
new file mode 100644
index 0000000000..94d4245838
--- /dev/null
+++ b/systems/doc/etex/etex_man.sty
@@ -0,0 +1,92 @@
+% macros definitions for e-TeX manual
+
+\def\NTS{\leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}%
+ \kern-0.2emS$}}
+\def\eTeX{\leavevmode\hbox{$\varepsilon$}-\TeX}
+\def\TeXbook{{\sl The \TeX\/book\/}}
+
+\DeclareFontShape{OT1}{cmr}{bxrev}{n}{<-> xbmc10}{} % for right-to-left text
+\DeclareTextFontCommand{\revrm}{\fontseries{bxrev}\fontshape{n}\selectfont}
+
+\ifx\beginL\undefined % this is \TeX
+ \def\XeT{X\kern-.125em\lower.5ex\hbox{E}\kern-.1667emT}
+ \def\TeXeT{\TeX-\hbox{\revrm{\XeT}}}
+ \def\TeXXeT{\TeX-\hbox{\revrm{-\XeT}}}
+\else
+ \ifx\eTeXversion\undefined % this is \TeXeT
+ \def\TeXeT{\TeX-\revrm{\beginR\TeX\endR}}
+ \def\TeXXeT{\TeX-\revrm{\beginR\TeX-\endR}}
+ \else % this is \eTeX
+ \def\TeXeT{\TeX-\revrm{\TeXXeTstate=1\beginR\TeX\endR}}
+ \def\TeXXeT{\TeX-\revrm{\TeXXeTstate=1\beginR\TeX-\endR}}
+ \fi
+\fi
+
+{\def~{|} \global\catcode`\|=\active \global\let|=~}
+\def\|{\leavevmode\verb|}
+\def\<{\leavevmode\hbox\bgroup\catcode`>=13$\langle$} % syntax quantity
+\def\>{\/$\rangle$\egroup} % finish syntax quantity
+\def\cstok#1{\leavevmode\thinspace\hbox{\vrule\vtop{\vbox{\hrule\kern1pt
+ \hbox{\vphantom{\tt/}\thinspace{\tt#1}\thinspace}}
+ \kern1pt\hrule}\vrule}\thinspace} % control sequence token
+\def\[#1]{\thinspace{\tt#1}\thinspace} % keyword in syntax
+
+\newenvironment{paramlist}%
+ {\endgraf\parskip=0pt
+ \advance\leftskip by5em \parindent=-2.5em}%
+ {\endgraf}
+
+\newenvironment{syntax}%
+ {\endgraf\nobreak\medskip
+ \begingroup \catcode`<=13 \catcode`[=13 \let|=\|%
+ \let\par=\endsyntaxline \obeylines}%
+ {\medbreak}
+
+\def\endsyntaxline{\futurelet\next\syntaxswitch}
+\def\syntaxswitch{\ifx\next\<\let\next=\syntaxrule
+ \else\ifx\next\end\let\next=\endgroup
+ \else\let\next=\continuerule\fi\fi \next}
+\def\continuerule{\hfil\break\indent\qquad}
+{\catcode`<=13 \catcode`>=13 \catcode`[=13
+ \global\let<=\< \global\let>=\> \global\let[=\[
+ \gdef\syntaxrule<{\endgraf\indent\<}}
+\def\is{\ $\longrightarrow$ }
+\def\alt{\ $\vert$ }
+\def\more{whatever \TeXbook\ defines}
+\def\ot#1{\|#1|$_{12}$} % an other token
+\def\cs#1{{\tt\char`\\#1}}
+
+\newenvironment{multilist}[2]%
+ {$$\setbox\z@=\hbox\bgroup % catch some funny things -> \mathord
+ \let\a=\empty
+ \let\b=\empty
+ \count@=\z@
+ \toks@={#2}%
+ \def\item##1\cr
+ {\ifnum \count@=\z@
+ \count@=#1%
+ \expandafter\def\expandafter\b\expandafter{\b\y{}}%
+ \fi
+ \advance\count@ by\m@ne
+ \expandafter\def\expandafter\a\expandafter{\a\x{##1}}}%
+ \ignorespaces}%
+ {\loop
+ \ifnum \count@>\z@
+ \expandafter\def\expandafter\a\expandafter{\a\expandafter\z\b\relax}%
+ \advance\count@ by\m@ne
+ \repeat
+ \def\x##1{\expandafter\y\b\relax{##1}}%
+ \def\y\y##1##2\relax##3%
+ {\ifx @##1@%
+ \def\b{##2\y{##3}}%
+ \else
+ \def\b{##2\y{##1&##3}}%
+ \fi}%
+ \def\z\y##1##2\relax{\def\b{##2\y{##1}}}%
+ \a
+ \def\x
+ {\expandafter\egroup\expandafter\halign\expandafter\bgroup
+ \expandafter&\the\toks@\cr}%
+ \def\y##1{\expandafter\def\expandafter\x\expandafter{\x##1\cr}}%
+ \b
+ \x\egroup $$}
diff --git a/systems/doc/etex/etex_man.tex b/systems/doc/etex/etex_man.tex
new file mode 100644
index 0000000000..7ce0d00110
--- /dev/null
+++ b/systems/doc/etex/etex_man.tex
@@ -0,0 +1,1150 @@
+%&latex % english hyphenation
+
+\documentclass{article}
+
+\usepackage{etex_man}
+
+\begin{document}
+
+\begin{center}
+%% {\LARGE Draft, \today}\\[6pt]
+{\huge\bf The \eTeX\ manual}\\[6pt]
+{\sl Version 2, February 1998\/}\\[18pt]
+by The \NTS\ Team\\[6pt]
+Peter Breitenlohner, Max-Planck-Institut f\"ur Physik, M\"unchen\\[18pt]
+\small\noindent
+The preparation of this report was supported in part by {\sc Dante},\\
+Deutschsprachige Anwendervereinigung \TeX\ e.V.\\
+`\TeX' is a trademark of the American Mathematical Society.
+\end{center}
+
+\section{Introduction}
+
+The \NTS\ project intends to develop an `New Typesetting System' (\NTS)
+that will eventually replace today's \TeX3. The \NTS\ program will
+include many features missing in \TeX, but there will also exist a mode
+of operation that is 100\% compatible with \TeX3. It will, necessarily,
+require quite some time to develop \NTS\ to maturity and make it widely
+available.
+
+Meanwhile \eTeX\ intends to fill the gap between \TeX3 and the future
+\NTS. It consists of a series of features extending the capabilities of
+\TeX3.%
+\footnote{The \TeX3 program; for the moment there are no plans to extend
+the software related to \TeX.}
+
+Since compatibility between \eTeX\ and \TeX3 has been a main concern,
+\eTeX\ has two modes of operation:\\
+(1)~In \TeX\ compatibility mode it fully deserves the name \TeX\ and
+there are neither extended features nor additional primitive commands.
+That means in particular that \eTeX\ passes the \|TRIP| test
+\cite{tripman} without any restriction. There are, however, a few
+minor modifications that would be legitimate in any implementation of
+\TeX.\\
+(2)~In extended mode there are additional primitive commands and the
+extended features of \eTeX\ are available.
+
+We have tried to make \eTeX\ as compatible with \TeX\ as possible
+even in extended mode. In a few cases there are, however, some subtle
+differences described in detail later on. Therefore the \eTeX\ features
+available in extended mode are grouped into two categories:\\
+(1)~Most of them have no semantic effect as long as none of the
+additional primitives are executed; these `extensions' are permanently
+enabled.\\
+(2)~The remaining optional \eTeX\ features (`enhancements') can be
+individually enabled and disabled; initially they are all disabled.
+For each enhancement there is a state variable \|\...state|; an
+enhancement is enabled or disabled by assigning a positive or
+non-positive value respectively to that state variable.
+
+For \eTeX\ Versions~1 and~2 there is just one enhancement: mixed
+direction typesetting (\TeXXeT) with the state variable \|\TeXXeTstate|.
+
+Version~1.1 of \eTeX\ was released in November 1996, Version~2.0 in
+February 1998.
+It is expected that there will be about one \eTeX\ version per year,
+where each later version adds new features. It would be desirable if
+these \eTeX\ versions were incorporated into many of the existing
+implementations of \TeX3 without much delay.
+
+With each \eTeX\ version there will be an \|e-TRIP| test \cite{etripman}
+in order to help to verify that a particular implementation deserves the
+name \eTeX\ in the same way as the \|TRIP| test \cite{tripman} helps to
+verify that an implementation deserves the name \TeX.
+
+\section{Generating \eTeX}
+
+\subsection{Generating the \eTeX\ Program}
+
+An implementation of \TeX\ consists of a WEB change file \|tex.ch|
+containing all system-dependent changes for a particular system. The
+WEB system program \|TANGLE| applies this change file to the
+system-independent file \|tex.web| defining the \TeX\ program in order to
+generate a \TeX\ Pascal file for that system \cite{webman}. Similarly
+an implementation of \eTeX\ consists of a system-dependent change file
+\|etex.sys| to be applied to the system-independent file \|e-tex.web|
+defining the \eTeX\ program. Since \eTeX\ differs from \TeX\ by a
+relatively small fraction of its code \|e-tex.web| does, however, not
+exist as a physical file; it is instead defined in terms of a
+system-independent change file \|e-tex.ch| to be applied to \|tex.web|.
+Similarly it should be possible to define the system-dependent change
+file \|etex.sys| for a particular system in terms of its deviations
+from the corresponding file \|tex.ch| \cite{etexgen}.
+
+\subsection{Generating Format Files for \eTeX}
+
+When (the INITEX or VIRTEX version of) the \TeX\ program is started, it
+analyzes the first non-blank input line from the command line or (with
+the \|**| prompt) from the terminal: The first non-blank character of
+that input line may be an \|&| followed immediately by the name of the
+format to
+be loaded; otherwise VIRTEX uses a default format whereas INITEX starts
+without loading a format file.
+
+For eINITEX (the INITEX version of \eTeX) there is an additional
+possibility: If the first non-blank input character is an \|*|
+(immediately followed what would be the first non-blank input character
+for INITEX), the program starts in extended mode without loading a
+format file. If the first non-blank character is neither \|&| nor \|*|
+then eINITEX starts without loading a format but in compatibility mode.
+Whenever a format file is loaded by eINITEX or eVIRTEX the mode
+(compatibility or extended) is inherited from the format.
+
+It is recommended that the input file \|etex.src| be used instead of
+\|plain.tex| when generating an \eTeX\ format in extended mode. That
+file will first read \|plain.tex| (without reading \|hyphen.tex|) and
+will then supply macro definitions supporting \eTeX\ features.
+
+\section{\eTeX\ Extensions}
+
+\subsection{Compatibility and Extended Mode}
+
+Once \eTeX\ has entered compatibility mode it behaves as any other
+implementation of \TeX. All of \eTeX's additional commands are absent;
+it is therefore impossible to access any of the extensions or
+enhancements. The ability of eINITEX to initially choose between
+compatibility and extended mode is, however, by itself a feature not
+present in any \TeX\ implementation.
+
+The remainder of this document is devoted to a detailed and mostly
+technical description of all aspects where \eTeX\ (in extended mode)
+behaves differently from \TeX. It will be assumed that the reader is
+familiar with \TeXbook\ \cite{texbook} describing \TeX's behaviour in
+quite some detail.
+
+All of \eTeX's extensions and enhancements available in extended mode are
+activated by either executing some new primitive command or by assigning
+a nonzero value to some new integer parameter or state variable. Since
+all these new variables are initially zero,%
+\footnote{To be precise all state variables are zero when eINITEX or eVIRTEX
+is started; integer parameters that are not state variables are zero when
+eINITEX is started without loading a format file or inherited from the
+format file otherwise.}
+\eTeX\ behaves as \TeX\ as long as none of \eTeX's new control sequences
+are used, with the following exceptions which should, however, have
+no effect on the typesetting of error-free \TeX\ documents (produced with
+error-free formats):\\
+(1) When \|\tracingcommands| has a value of~3 or more, or\\
+when \|\tracinglostchars| has a value of~2 or more, \eTeX\ will display
+additional information not available in \TeX.\\
+(2) When using a count, dimen, skip, muskip, box, or token register number
+in the range 256--32767, \eTeX\ will access one of its additional registers
+whereas \TeX\ will produce an error and use register number zero.
+
+\subsection{Optimization}
+
+When a value is assigned to an \<internal quantity> within a save group,
+the former value is restored when the group ends, provided the
+assignment was not global. This is achieved by saving the former value
+on \TeX's `save stack'. \eTeX\ refrains from creating such save stack
+entries when the old and new value are the same (`reassignments').
+
+\|\aftergroup| tokens are also kept on \TeX's save stack. When the
+current group ends, \TeX\ converts each \|\aftergroup| token into a
+token list and inserts this list as new `input level' into the input stack.
+\eTeX\ collects all \|\aftergroup| tokens from one group into one token
+list and thus conserves input levels.
+
+When a completed page is written to the DVI file (shipped out), \TeX\
+multiplies the relevant stretch or shrink components of glue nodes in a
+box by the glue expansion factor of that box and converts the product to
+DVI units. In order to avoid overflow each resulting value $x$ is
+artificially limited to the range $|x|\le10^9$.
+Consider the example:
+\begin{verbatim}
+ \shipout\vbox to100pt{
+ \hrule width10pt
+ \vskip 0pt plus1000fil
+ \vskip 0pt plus1000fil
+ \vskip 0pt plus-2000fil
+ \hrule
+ \vskip 0pt plus0.00005fil
+ }
+\end{verbatim}
+Here the three glues between the two rules add up to zero; when \TeX\
+converts each stretch component individually they will, however, add up
+to $10^9$ DVI units due to the truncation mentioned above. \eTeX, however,
+accumulates the relevant stretch or shrink components of consecutive
+glue nodes (possibly separated by insert, mark, adjust, kern, and
+penalty nodes) before converting them to DVI units. During this process
+glue nodes may be converted into equivalent kern nodes and some glue
+specifications may be recycled; this may affect the memory usage
+statistics displayed after the page has been shipped out.
+
+\subsection{Tracing and Diagnostics}
+
+When \|\tracingcommands| has a value of~3 or more, the commands
+following a prefix (\|\global|, etc.) are shown as well, e.g.:
+\begin{verbatim}
+ \global\count0=0 => {\global}
+ {\count}
+\end{verbatim}
+
+When \|\tracinglostchars| has a value of~2 or more, missing characters
+are displayed on the terminal even if the value of \|\tracingonline| is
+0~or less.
+
+When \|\tracingscantokens| has a value of~1 or more, the opening and
+closing of pseudo-files (generated by \|\scantokens|) is recorded as for
+any other file, with `\verb*| |' as filename.
+
+When the program is compiled with the code for collecting statistics and
+\|\tracingassigns| has a value of~1 or more, all assignments subject to
+\TeX's grouping mechanism are traced, e.g.:
+\begin{verbatim}
+ \def\foo{\relax} => {changing \foo=undefined}
+ {into \foo=macro:->\relax }
+ \global\count17=7 => {globally changing \count17=0}
+ {into \count17=7}
+ \count17=7 => {reassigning \count17=7}
+\end{verbatim}
+
+When \|\tracingifs| has a value of~1 or more, all conditionals
+(including \|\unless|, \|\or|, \|\else|, and \|\fi|) are traced, together
+with the starting line and nesting level; the \|\showifs| command displays
+the state of all currently active conditionals. Thus the input
+\begin{verbatim}
+ \unless\iffalse
+ \iffalse
+ \else
+ \showifs
+ \fi
+ \fi
+\end{verbatim}
+might yield
+\begin{verbatim}
+ {\unless\iffalse: (level 1) entered on line 1}
+ {\iffalse: (level 2) entered on line 2}
+ {\else: \iffalse (level 2) entered on line 2}
+ ### level 2: \iffalse\else entered on line 2
+ ### level 1: \unless\iffalse entered on line 1
+ {\fi: \iffalse (level 2) entered on line 2}
+ {\fi: \unless\iffalse (level 1) entered on line 1}
+\end{verbatim}
+
+When \|\tracinggroups| has a value of~1 or more, the start and end of
+each save group is traced, together with the starting line and grouping
+level; the \|\showgroups| command displays the state of all currently
+active save groups. Thus the input
+\begin{verbatim}
+ \begingroup
+ {
+ \showgroups
+ }
+ \endgroup
+\end{verbatim}
+might yield
+\begin{verbatim}
+ {entering semi simple group (level 1) at line 1}
+ {entering simple group (level 2) at line 2}
+ ### simple group (level 2) entered at line 1 ({)
+ ### semi simple group (level 1) entered at line 1 (\begingroup)
+ ### bottom level
+ {leaving simple group (level 2) entered at line 2}
+ {leaving semi simple group (level 1) entered at line 1}
+\end{verbatim}
+
+Occasionally conditionals and/or save groups are not properly nested
+with respect to \|\input| files. Although this might be perfectly
+legitimate, such anomalies are mostly unintentional and may cause quite
+obscure errors. When \|\tracingnesting| has a value of~1 or more,
+these anomalies are shown; when \|\tracingnesting| has a value of~2 or more,
+the current context (traceback) is shown as well. Thus the input
+\begin{verbatim}
+ \newlinechar=`\^^J
+ \begingroup
+ \iftrue
+ \scantokens{%
+ \endgroup
+ ^^J\fi
+ ^^J\bgroup
+ ^^\tracingnesting=2
+ ^^J\iffalse
+ ^^J\else
+ }%
+ \egroup
+ \fi
+\end{verbatim}
+might yield%
+\footnote{The \cs{scantokens} command will be discussed later.}
+\begin{verbatim}
+Warning: end of semi simple group (level 1) entered at line 2 of
+ a different file
+Warning: end of \iftrue entered on line 3 of a different file
+Warning: end of file when simple group (level 1) entered at line
+ 3 is incomplete
+Warning: end of file when \iffalse\else entered on line 5 is inc
+omplete
+l.7 \else
+
+l.11 }
+ %
+\end{verbatim}
+
+The command \|\showtokens{|\<token list>\|}| displays the token list, and
+allows the display of quantities that cannot be displayed by \|\show| or
+\|\showthe|, e.g.:
+\begin{verbatim}
+ \showtokens\expandafter{\jobname}
+ \showtokens\expandafter{\topmarks 27}
+\end{verbatim}
+
+\subsection{Status Enquiries}
+
+A number of \TeX's internal quantities can be assigned values but
+these values cannot be retrieved in \TeX. \eTeX\ introduces several new
+primitives that allow the retrieval of information about its internal state.
+
+\noindent
+\|\eTeXversion| returns \eTeX's (major) version number;\\
+\|\eTeXrevision| expands into a list of character tokens representing
+the revision (minor version) number. Thus
+\begin{verbatim}
+ \message{\number\eTeXversion\eTeXrevision}
+\end{verbatim}
+should write the complete version as shown when \eTeX\ is started.
+
+\noindent
+When used as number, \|\interactionmode| returns one of the
+values 0~(batchmode), 1~(nonstopmode), 2~(scrollmode),
+or~3~(errorstopmode). Assigning one of these values to
+\|\interactionmode| changes the current interaction mode accordingly;
+such assignments are always global.
+
+\noindent
+\|\currentgrouplevel| returns the current save group level;\\
+\|\currentgrouptype| returns a number representing the type of the
+innermost group:
+\begin{multilist}{2}{\hfil\qquad#:&\quad#\qquad\hfil}
+\item 0&bottom level (no group)\cr
+\item 1&simple group\cr
+\item 2&hbox group\cr
+\item 3&adjusted hbox group\cr
+\item 4&vbox group\cr
+\item 5&vtop group\cr
+\item 6&align group\cr
+\item 7&no align group\cr
+\item 8&output group\cr
+\item 9&math group\cr
+\item 10&disc group\cr
+\item 11&insert group\cr
+\item 12&vcenter group\cr
+\item 13&math choice group\cr
+\item 14&semi simple group\cr
+\item 15&math shift group\cr
+\item 16&math left group\cr
+\end{multilist}
+
+\noindent
+\|\currentiflevel| returns the number of currently active
+conditionals;\\
+\|\currentifbranch| indicates which branch of the innermost conditional
+is taken: 1~`then branch', $-1$~`else branch', or 0~not yet decided;\\
+\|\currentiftype| returns 0~if there are no active conditionals, a
+positive number indicating the type of the innermost active conditional,
+or the negative of that number when the conditional was prefixed by
+\|\unless|:
+\begin{multilist}{3}{\hfil\qquad#:&\quad#\qquad\hfil}
+\item 1&\cs{if}\cr
+\item 2&\cs{ifcat}\cr
+\item 3&\cs{ifnum}\cr
+\item 4&\cs{ifdim}\cr
+\item 5&\cs{ifodd}\cr
+\item 6&\cs{ifvmode}\cr
+\item 7&\cs{ifhmode}\cr
+\item 8&\cs{ifmmode}\cr
+\item 9&\cs{ifinner}\cr
+\item 10&\cs{ifvoid}\cr
+\item 11&\cs{ifhbox}\cr
+\item 12&\cs{ifvbox}\cr
+\item 13&\cs{ifx}\cr
+\item 14&\cs{ifeof}\cr
+\item 15&\cs{iftrue}\cr
+\item 16&\cs{iffalse}\cr
+\item 17&\cs{ifcase}\cr
+\item 18&\cs{ifdefined}\cr
+\item 19&\cs{ifcsname}\cr
+\item 20&\cs{iffontchar}\cr
+\end{multilist}
+
+\noindent
+\|\lastnodetype| returns a number indicating the type of the last node,
+if any, on the current (vertical, horizontal, or math) list:
+\begin{multilist}{2}{\hfil\qquad#:&\quad#\qquad\hfil}
+\item -1&none (empty list)\cr
+\item 0&char node\cr
+\item 1&hlist node\cr
+\item 2&vlist node\cr
+\item 3&rule node\cr
+\item 4&ins node\cr
+\item 5&mark node\cr
+\item 6&adjust node\cr
+\item 7&ligature node\cr
+\item 8&disc node\cr
+\item 9&whatsit node\cr
+\item 10&math node\cr
+\item 11&glue node\cr
+\item 12&kern node\cr
+\item 13&penalty node\cr
+\item 14&unset node\cr
+\item 15&math mode nodes\cr
+\end{multilist}
+
+\noindent
+The commands \|\fontcharht|, \|\fontcharwd|, \|\fontchardp|, and
+\|\fontcharic| followed by a font specification and a character code,
+return a dimension: the height, width, depth, or italic correction of the
+character in the font, or \[0pt] if no such character exists;
+the conditional \|\iffontchar| tests the existence of that character.
+
+\noindent
+When used as number, \|\parshape| returns the number of lines of the current
+parshape specification (or zero).\\
+\eTeX's \|\parshapeindent|, \|\parshapelength|, and \|\parshapedimen|,
+followed by a number $n$ return the dimensions of the parshape
+specification:\\
+\[0pt] for $n\le0$ or when no parshape is currently active, otherwise\\
+\|\parshapeindent|$\,n$ and \|\parshapedimen|$\,2n-1$ both return the
+indentation of line $n$ (explicitly specified or implied by repeating the
+last specification),\\
+\|\parshapelength|$\,n$ and \|\parshapedimen|$\,2n$ both return the length
+of line $n$.
+
+\subsection{Expressions}
+
+\eTeX\ introduces the notion of expressions of type number, dimen, glue, or
+muglue, that can be used whenever a quantity of that type is needed. Such
+expressions are evaluated by \eTeX's scanning mechanism; they are initiated
+by one of the commands \|\numexpr|, \|\dimexpr|, \|\glueexpr|, or \|\muexpr|
+(determining the type~$t$) and optionally terminated by one \|\relax| (that
+will be absorbed by the scanning mechanism). An expression consists of one
+or more terms of the same type to be added or subtracted; a term of type~$t$
+consists of a factor of that type, optionally multiplied and\slash or
+divided by numeric factors; finally a factor of type~$t$ is either a
+parenthesized subexpression or a quantity (number, etc.) of that type.
+Thus, the conditional
+\begin{verbatim}
+ \ifdim\dimexpr (2pt-5pt)*\numexpr 3-3*13/5\relax + 34pt/2<\wd20
+\end{verbatim}
+is true if and only if the width of box~20 exceeds 32\[pt]. Note the use of
+\|\relax| to terminate the inner (numeric) expression, the outer (dimen)
+expression is terminated automatically by the token \|<|$_{12}$ that does
+not fit into the expression syntax.
+
+The arithmetic performed by \eTeX's expressions does not do much that could
+not be done by \TeX's arithmetic operations \|\advance|, \|\multiply|, and
+\|\divide|, although there are some notable differences: Each factor is
+checked to be in the allowed range, numbers must be less than $2^{31}$ in
+absolute value, dimensions or glue components must be less than
+$2^{14}$\[pt], \[mu], \[fil], etc.\ respectively. The arithmetic operations
+are performed individually, except for `scaling' operations (a
+multiplication immediately followed by a division) which are performed as
+one combined operation with a 64-bit product as intermediate value. The
+result of each operation is again checked to be in the allowed range.
+Finally the results of divisions and scalings are rounded, whereas \TeX's
+\|\divide| truncates.
+
+The important new feature is, however, that the evaluation of expressions
+does not involve assignments and can therefore be performed in
+circumstances where assignments are not allowed, e.g., inside an \|\edef| or
+\|\write|. This also allows the definition of purely expandable loop constructions:
+\begin{verbatim}
+ \def\foo#1#2{\number#1
+ \ifnum#1<#2,
+ \expandafter\foo
+ \expandafter{\number\numexpr#1+1\expandafter}%
+ \expandafter{\number#2\expandafter}%
+ \fi}
+\end{verbatim}
+such that, e.g., `\|\foo{7}{13}|' expands into `\|7, 8, 9, 10, 11, 12, 13|'.
+
+The commands \|\gluestretch| and \|\glueshrink| are to be followed by a glue
+specification and return the stretch or shrink component of that glue as
+dimensions (with \[fil] etc.\ replaced by \[pt]), the commands
+\|\gluestretchorder| and \|\glueshrinkorder| return the order of infinity:
+0~for \[pt], 1~for \[fil], 2~for \[fill], and 3~for \[filll].
+
+The commands \|\gluetomu| and \|\mutoglue| convert glue into muglue
+and vice versa by simply equating 1\[pt] with 1\[mu], precisely what \TeX\
+does (in addition to an error message) when the wrong kind of glue is used.
+
+\subsection{Additional Registers and Marks}
+
+\eTeX\ increases the number of \TeX's count, dimen, skip, muskip, box, and
+token registers from 256 to 32768. The additional registers, numbered
+256--32767, can be used exactly as the first 256, except that they can
+not be used for insertion classes.
+
+As in \TeX, the first 256 registers of each kind are realized as static
+arrays that are part of the `table of equivalents'; values to be restored
+when a save group ends are kept on the save stack. The additional registers
+are realized as sparse arrays built from \TeX's main memory and are
+therefore less efficient. They use a four-level index structure and
+individual registers are present only when needed. Values to be restored
+when a particular save group ends are kept in a linked list (again built
+from main memory) with one save stack entry pointing to that list.%
+\footnote{With the effect that the order of restoring (or discarding) saved
+values may be somewhat surprising.}
+
+\medskip
+\eTeX\ generalizes \TeX's mark concept to mark classes 0--32767, with mark
+class~0 used for \TeX's marks.\\
+The command \|\marks| followed by a mark class~$n$ and a mark text appends a
+mark node to the current list; \|\marks0| is synonymous with \|\mark|. The
+page builder and the \|\vsplit| command record information about the mark nodes
+found on the page or box produced, separately for each mark class. The
+information for mark class~0 is kept in a small static array as in \TeX, the
+information for the additional mark classes is again kept in a sparse array
+with entries present only when needed.\\
+The command \|\firstmarks|$\,n$ expands to the mark text for mark class~$n$
+first encountered on the most recent page, etc., and again \|\firstmarks0|
+is synonymous with \|\firstmark|.
+
+\subsection{Input Handling}
+
+The command \|\readline|\<number>\[to]\<control sequence> defines the
+control sequence as parameterless macro whose replacement text is the
+contents of the next line read from the designated file, as for \|\read|.
+The difference is that the current category codes are ignored and all
+characters on that line (including an endline character) are converted to
+character tokens with category 12 (`other'), except that the character
+code~32 gets category 10 (`space').
+
+The command \|\scantokens{...}| absorbs a list of unexpanded tokens,
+converts it into a character string that is treated as if it were an
+external file, and starts to read from this `pseudo-file'. A rather
+similar effect can be achieved by the commands
+\begin{verbatim}
+ \toks0={...}
+ \immediate\openout0=file
+ \immediate\write0{\the\toks0}
+ \immediate\closeout0
+ \input file
+\end{verbatim}
+In particular every occurrence of the current newline character is
+interpreted as start of a new line, and input characters will be converted
+into tokens as usual.
+The \|\scantokens| command is, however, expandable and does not use token
+registers, write streams, or external files. Furthermore the conversion from
+\TeX's internal ASCII codes to external characters and back to ASCII codes
+is skipped. Finally the current context (traceback) shown, e.g., as part
+of an error message continues beyond an input line from a pseudo-file until
+an input line from a real file (or the terminal) is found.
+
+When \eTeX's input mechanism attempts to read beyond the end of an \|\input|
+file or \|\scantokens| pseudo-file, and before checking for `runaway'
+conditions and closing the file, it will first read a list of tokens that
+has been predefined by the command \|\everyeof={|\<token list>\|}|.
+
+\subsection{Breaking Paragraphs into Lines}
+
+Traditional typesetting with lead type used to adjust (stretch or shrink)
+the interword spaces in the last line of a paragraph by the same amount as
+those in the preceding line. With \TeX\ the last line is, however, usually
+typeset at its natural width due to infinitely stretchable parfillskip glue.
+\eTeX\ allows interpolation between these two extremes by specifying a
+suitable value for \|\lastlinefit|. For a value of~0 or less, \eTeX\
+behaves as \TeX, values from~1 to 1000 indicate a glue adjustment fraction
+$f$ times 1000, values above 1000 are interpreted as $f=1$.
+
+The new algorithm is used only if\\
+1. \|\lastlinefit| is positive;\\
+2. \|\parfillskip| has infinite stretchability; and\\
+3. the stretchability of \|\leftskip| plus \|\rightskip| is finite.%
+\footnote{As usual for parameters influencing \TeX's line-breaking algorithm,
+the values current at the end of the (partial) paragraph are used.}\\
+Thus the last line of a paragraph would normally be typeset at its
+natural width and the stretchability of parfillskip glue would be used to
+achieve the desired line width. The algorithm proceeds as usual, considering
+all possible sequences of feasible break points and accumulating demerits for
+the stretching or shrinking of lines as well as for visually incompatible
+lines. When a candidate for the last line has been reached, the following
+conditions are tested:\\
+4. the previous line was not `infinitely bad' and was stretched with positive
+finite stretchability or was shrunk with positive shrinkability;\\
+5. the last line has infinite stretchability entirely due to parfillskip
+glue;\\
+6. if the previous line was stretched or shrunk the last line has
+positive finite stretchability or shrinkability respectively.\\
+If all three conditions are satisfied, a glue adjustment factor of $f$ times
+that of the preceding line will be applied to the relevant stretch or
+shrink components of all glue nodes in the last line, and the corresponding
+demerits are computed. (The last line will, however, not be stretched beyond
+the desired line width.)
+
+When all possible candidates for the last line of the paragraph have been
+examined, the one having fewest accumulated demerits is chosen. If \eTeX's
+modified algorithm was applied to that last line, the actual stretching or
+shrinking is achieved by suitably modifying the parfillskip glue node.
+
+All computations described so far are performed with machine-independent
+integer arithmetic. Note, however, that the actual stretching requires
+machine-dependent floating point arithmetic. Therefore, when a paragraph is
+interrupted by a displayed equation and the line preceding the display is
+subject to the adjustment just described, the display will in general be
+preceded by abovedisplayskip and not by abovedisplayshortskip glue.
+
+\medskip
+
+After breaking a paragraph into lines, \TeX\ computes the interline
+penalties by adding the values of:\\
+\|\interlinepenalty| between any two lines,\\
+\|\clubpenalty| after the first line of a (partial) paragraph,\\
+\|\widowpenalty| before the last line of the paragraph,\\
+\|\displaywidowpenalty| before the line immediately preceding a displayed
+equation, and\\
+\|\brokenpenalty| after lines ending with a discretionary break.\\
+\eTeX\ generalizes the concept of interline, club, widow, and display widow
+penalty by allowing their replacement by arrays of penalty values with the
+commands\\
+\|\interlinepenalties|,\\
+\|\clubpenalties|,\\
+\|\widowpenalties|, and\\
+\|\displaywidowpenalties|.\\
+Each of these commands is to be followed by an optional equal sign and a
+number $n$. If $n\le0$ the respective array is reset and \TeX's
+corresponding single value is used as usual; a positive value $n$
+declares an array of length $n$ and must be followed by $n$ penalty
+values. When one of these arrays has been set, its values are used
+instead of \TeX's corresponding single values as follows (repeating the
+last value when necessary):\\
+the $i^{\rm th}$ interline penalty value is used after line $i$ of the
+paragraph;\\
+the $i^{\rm th}$ club penalty value is used after line $i$ of a partial
+paragraph;\\
+the $i^{\rm th}$ widow penalty value is used after line $m-i$ of a
+paragraph without displayed equations or the last partial paragraph of
+length $m$;\\
+the $i^{\rm th}$ display widow penalty value is used after line $m-i$ of a
+partial paragraph of length $m$ that is followed by a displayed equation.
+
+When used after \|\the| or in situations where \TeX\ expects to see a
+number, the same four commands serve to retrieve the arrays of penalties.
+Specifying, e.g., \|\clubpenalties|\<number> with a number $n$, returns~0
+for $n<0$ or when the club penalty array has been reset, the length of the
+declared club penalty array for $n=0$, or the $n^{\rm th}$ club penalty
+value for $n>0$ (again repeating the last value when necessary).
+
+\subsection{Math Formulas}
+
+\TeX's \|\left|\<delimiter>\|...\right|\<delimiter> produces two delimiters
+with a common size adjusted to the height and depth of the enclosed material.
+In \eTeX\ this can be generalized by occurrences of \|\middle|\<delimiter>
+dividing the enclosed material into segments resulting in a sequence
+of delimiters with a common size adjusted to the maximal height and depth of
+all enclosed segments. The spacing between a segment and the delimiter to
+its left or right is as for \TeX's left or right delimiter respectively.
+
+\subsection{Hyphenation}
+
+\TeX\ uses the \|\lccode| values for two quite unrelated purposes:\\
+(1) when \|\lowercase| converts character tokens to their lower-case
+equivalents (in the same way as \|\uppercase| uses the \|\uccode| values);
+and\\
+(2) when hyphenation patterns or exceptions are read, and when words are
+hyphenated during the line-breaking algorithm.
+
+\eTeX\ introduces the concept of (language-dependent) hyphenation codes that
+are used instead of the \|\lccode| values for hyphenation purposes. In order
+to explain the details of \eTeX's behaviour, we need some technical aspects
+of hyphenation patterns. When INITEX starts without reading a format file,
+the (initially empty) hyphenation patterns are in a form suitable for
+inserting new patterns specified by \|\patterns| commands; when INITEX
+attemps hyphenation or prepares to write a format file, they are compressed
+into a more compact form suitable for finding hyphens. Only these compressed
+patterns can be read from a format file (by INITEX or VIRTEX).
+
+In \eTeX\ the hyphenation patterns are supplemented by hyphenation codes.
+When eINITEX starts without reading a format file both are initially empty;
+when a \|\patterns| command is executed and \|\savinghyphcodes| has a positive
+value, the current \|\lccode| values are saved as hyphenation codes for the
+current language. These saved hyphenation codes are later compressed together
+with the patterns and written to or read from a format file. When the
+patterns have been compressed (always true for eVIRTEX) and hyphenation
+codes have been saved for the current language, they are used
+instead of the \|\lccode| values for hyphenation purposes (reading
+hyphenation exceptions and hyphenating words).
+
+\subsection{Discarded Items}
+
+When \TeX's page builder transfers (vertical mode) material from the `recent
+contributions' to the `page so far', it discards glue, kern, and penalty
+nodes (discardable items) preceding the first box or rule on the page under
+construction and inserts a topskip glue node immediately before that box or
+rule. Note, however, that this topskip glue need not be the first node on
+the page, it may be preceded by insertion, mark, and whatsit nodes.
+Similarly when the \|\vsplit| command has split the first part off a vbox,
+discardable items are discarded from the top of the remaining vbox and a
+splittopskip glue node is inserted immediately before the first box or rule.
+
+When \eTeX's parameter \|\savingvdiscards| has been assigned a positive
+value, these `discarded items' are saved in two lists and can
+be recovered by the commands \|\pagediscards| and \|\splitdiscards| that
+act like `unvboxing' hypothetical box registers containing a vbox with the
+discarded items.
+
+The list of items discarded by the page builder is emptied at the end of
+the output routine and by the \|\pagediscards| command; new items may
+be added as long as the new `page so far' contains no box or rule.
+
+The list of items discarded by the \|\vsplit| command is emptied at the
+start of a vsplit operation and by the \|\splitdiscards| command; new items
+are added at the end of a vsplit operation.
+
+\subsection{Expandable Commands}
+
+Chapter~20 of \TeXbook\ gives complete lists of all expandable \TeX\
+commands and of all cases where expandable tokens are not expanded.
+For \eTeX\ there are these additional conditionals:
+
+\begin{itemize}
+\item
+\|\ifdefined|\<token>\quad(test if token is defined)
+\end{itemize}
+\noindent
+True if \<token> is defined; creates no new hash table entry.
+
+\begin{itemize}
+\item
+\|\ifcsname...\endcsname|\quad(test if control sequence is defined)
+\end{itemize}
+\noindent
+True if the control sequence \|\csname...\endcsname| would be defined;
+creates no new hash table entry.
+
+\begin{itemize}
+\item
+\|\iffontchar|\<font>\<8-bit number>\quad(test if char exists)
+\end{itemize}
+\noindent
+True if \|\char|\<8-bit number> in \|\font|\<font> exists.
+
+These are \eTeX's additional expandable commands:
+
+\begin{itemize}
+\item\|\unless|.\\
+The next (unexpanded) token must be a boolean conditional
+(i.e., not \|\ifcase|); the truth value of that conditional is reversed.
+
+\item\|\eTeXrevision|.\\
+The expansion is a list of character tokens of category 12 (`other')
+representing \eTeX's revision (minor version) number, e.g., `.0' or
+`.1'.
+
+\item\|\topmarks|\<15-bit number>,
+\|\firstmarks|\<15-bit number>,\\
+\|\botmarks|\<15-bit number>,
+\|\splitfirstmarks|\<15-bit number>, and\\
+\|\splitbotmarks|\<15-bit number>.\\
+These commands generalize \TeX's \|\topmark| etc.\ to 32768 distinct
+mark classes; the special case \|\topmarks0| is synonymous with
+\|\topmark| etc.
+
+\item\|\unexpanded|\<general text>.\\
+The expansion is the token list \<balanced text>.
+
+\item\|\detokenize|\<general text>.\\
+The expansion is a list of character tokens representing the token list
+\<balanced text>. As with the lists of character tokens produced by \TeX's
+\|\the| and \eTeX's \|\readline|, these tokens have category 12 (`other'),
+except that the character code~32 gets category 10 (`space').
+
+\item\|\scantokens|\<general text>.\\
+The expansion is null; but \eTeX\ creates a pseudo-file containing the
+characters representing the token list \<balanced text> and prepares to
+read from this pseudo-file before looking at any more tokens from its
+current source.
+
+\end{itemize}
+
+These are the additional \eTeX\ cases when expandable tokens are not
+expanded:
+
+\begin{itemize}
+\item
+When \eTeX\ is reading the argument token for \|\ifdefined|.
+
+\item
+When \eTeX\ is absorbing the token list for \|\unexpanded|,
+\|\detokenize|, \|\scantokens|, or \|\showtokens|.
+
+\item
+Protected macros (defined with the \|\protected| prefix) are not
+expanded when building an expanded token list (for \|\edef|, \|\xdef|,
+\|\message|,\\
+\|\errmessage|, \|\special|, \|\mark|, \|\marks| or when writing the
+token list for \|\write| to a file) or when looking ahead in an
+alignment for \|\noalign| or \|\omit|.%
+\footnote{Whereas protected macros were introduced with \eTeX\ Version~1,
+suppression of their expansion in alignments was introduced with Version~2.}
+
+\item
+When building an expanded token list, the tokens resulting from the
+expansion of \|\unexpanded| are not expanded further (this is the same
+behaviour as is exhibited by the tokens resulting from the expansion of
+\|\the|\<token variable> in both \TeX\ and \eTeX).
+
+\end{itemize}
+
+\section{\eTeX\ Enhancements}
+
+The execution of most new primitives related to enhancements is
+disallowed when the corresponding enhancement is currently disabled and
+will lead to an `\|Improper...|' error message. The offending command
+may nevertheless already have had some effect such as, e.g., bringing
+\eTeX\ into horizontal mode.
+
+\subsection{Mixed-Direction Typesetting}
+
+This feature supports mixed left-to-right and right-to-left typesetting
+and introduces the four text-direction primitives \|\beginL|, \|\endL|,
+\|\beginR|, and \|\endR|. The code is inspired by but different from
+\TeXeT\ \cite{texet}.
+
+In order to avoid confusion with \TeXeT\ the present implementation of
+mixed-direction typesetting is called \TeXXeT. It uses the same text-direction
+primitives, but differs from \TeXeT\ in several important aspects:\\
+(1)~Right-to-left text is reversed explicitly by \eTeX\ and is written
+to a normal DVI file without any \|begin_reflect| or \|end_reflect|
+commands;\\
+(2)~a math node is (ab)used instead of a whatsit node to record the text-direction
+primitives in order to minimize the influence on the line-breaking
+algorithm for pure left-to-right text;\\
+(3)~right-to-left text interrupted by a displayed equation is
+automatically resumed after that equation;\\
+(4)~display math material is always printed left-to-right, even in
+constructions such as:
+\begin{verbatim}
+ \hbox{\beginR\vbox{\noindent$$abc\eqno(123)$$}\endR}
+\end{verbatim}
+
+\TeXXeT\ is enabled or disabled by assigning a positive or non-positive
+value respectively to the \|\TeXXeTstate| state variable. As long as
+\TeXXeT\ is disabled, \eTeX\ and \TeX3 build horizontal lists and
+paragraphs in exactly the same way. Even \TeXXeT\ will, in general,
+produce the same results as \TeX3 for pure left-to-right text. There
+are, however, circumstances where some differences may arise. This is
+best illustrated by an example:
+\begin{verbatim}
+ \vbox{\noindent
+ $\hfil\break
+ \null\hfil\break
+ \null$\par
+\end{verbatim}
+Here \TeX\ will produce three lines containing the following nodes:\\
+1. mathon, hfil glue, break penalty, and rightskip glue;\\
+2. empty hbox, hfil glue, break penalty, and rightskip glue;\\
+3. empty hbox, mathoff, nobreak penalty, parfillskip glue, and rightskip
+ glue.\\
+These lines can be retrieved via:
+\begin{verbatim}
+ \setbox3=\lastbox
+ \unskip\unpenalty
+ \setbox2=\lastbox
+ \unskip\unpenalty
+ \setbox1=\lastbox
+\end{verbatim}
+Later on these lines can be `unhboxed' as part of a new paragraph and
+possibly their contents analyzed. As a consequence in \TeX\ (and \eTeX\
+in compatibility mode) there may be horizontal lists where mathon
+and mathoff nodes are not properly paired. Therefore \TeX\ might
+attempt hyphenation of `words' originating from math mode or prevent
+hyphenation of words originating from horizontal mode.
+
+Math-mode material is always typeset left-to-right by \TeXXeT, even when
+it is contained inside right-to-left text. Therefore \TeXXeT\ will
+insert additional \|beginM| and \|endM| math nodes such that
+material originating from math mode is always enclosed between properly
+paired math nodes. Consequently \TeXXeT\ will never attempt hyphenation
+of `words' originating from math mode nor prevent hyphenation of words
+originating from horizontal mode.
+
+The additional math nodes introduced by \TeXXeT\ are, however,
+transparent to operations such as \|\lastpenalty| that inspect or remove
+the last node of a horizontal list.%
+\footnote{This was not the case for some earlier \TeXXeT\ implementations.}
+
+When \TeXXeT\ is enabled or disabled during the construction of a box,
+that box may contain text-direction directives or math nodes that are
+not properly paired. Such unpaired nodes may cause warning messages
+when the box is shipped out. It is, therefore, advisable that \TeXXeT\
+be enabled or disabled only in vertical mode.
+
+\section{Syntax Extensions for \eTeX}
+
+\subsection{Mode-Independent Commands}
+
+The syntax for \TeX's mode-independent commands, as described in the
+first part of Chapter~24 of \TeXbook, is extended by modifications of
+existing commands as well as by new commands.
+
+First, \eTeX\ has 32768 \|\count|, \|\dimen|, \|\skip|, \|\muskip|,
+\|\box|, and \|\toks| registers instead of \TeX's 256. Thus it allows
+a \<15-bit number> instead of an \<8-bit number> in almost all syntax
+constructions referring to these registers; the only exception to this is
+the \|\insert| command: insertion classes are restricted to the range
+0--254 in \eTeX\ as they are in \TeX.
+
+Next, \eTeX\ extends the list of \TeX's internal quantities:
+\begin{syntax}
+<internal integer>\is\more \alt|\eTeXversion|
+ \alt|\interactionmode|\alt<penalties><number>
+ \alt|\lastnodetype|\alt|\currentgrouplevel|\alt|\currentgrouptype|
+ \alt|\currentiflevel|\alt|\currentiftype|\alt|\currentifbranch|
+ \alt|\gluestretchorder|<glue>\alt|\glueshrinkorder|<glue>
+ \alt|\numexpr|<integer expr><optional spaces and |\relax|>
+<penalties>\is|\interlinepenalties|\alt|\clubpenalties|
+ \alt|\widowpenalties|\alt|\displaywidowpenalties|
+<internal dimen>\is\more
+ \alt|\parshapeindent|<number>\alt|\parshapelength|<number>
+ \alt|\parshapedimen|<number>
+ \alt|\gluestretch|<glue>\alt|\glueshrink|<glue>
+ \alt|\fontcharht|<font><8-bit number>%
+ \alt|\fontcharwd|<font><8-bit number>
+ \alt|\fontchardp|<font><8-bit number>%
+ \alt|\fontcharic|<font><8-bit number>
+ \alt|\dimexpr|<dimen expr><optional spaces and |\relax|>
+<internal glue>\is\more \alt|\mutoglue|<muglue>
+ \alt|\glueexpr|<glue expr><optional spaces and |\relax|>
+<internal muglue>\is\more \alt|\gluetomu|<glue>
+ \alt|\muexpr|<muglue expr><optional spaces and |\relax|>
+\end{syntax}
+
+The additional possibilities for \<integer parameter> are:
+\begin{paramlist}
+\|\TeXXeTstate|\quad(positive if mixed-direction typesetting is enabled)
+
+\|\tracingassigns|\quad(positive if showing assignments)
+
+\|\tracinggroups|\quad(positive if showing save groups)
+
+\|\tracingifs|\quad(positive if showing conditionals)
+
+\|\tracingscantokens|\quad(positive
+ if showing the opening and closing of \|\scantokens| pseudo-files)
+
+\|\tracingnesting|\quad(positive
+ if showing improper nesting of groups and conditionals within files)
+
+\|\predisplaydirection|\quad(text direction preceding a display)
+
+\|\lastlinefit|\quad(adjustment
+ ratio for last line of paragraph, times 1000)
+
+\|\savingvdiscards|\quad(positive
+ if saving items discarded from vertical lists)
+
+\|\savinghyphcodes|\quad(positive
+ if \|\patterns| saves \|\lccode| values as hyphenation codes)
+\end{paramlist}
+\noindent
+Note that the \eTeX\ state variable \|\TeXXeTstate| (the only one so
+far) is an \<integer parameter>. That need not be the case for all
+future state variables; it might turn out that some future enhancements
+can be enabled and disabled only globally, not subject to grouping.
+
+The additional possibilities for \<token parameter> are:
+\begin{paramlist}
+\|\everyeof|\quad(tokens to insert when an \|\input| file ends)
+\end{paramlist}
+
+Here is the syntax for \eTeX's expressions:
+\begin{syntax}
+<integer expr>\is<integer term>
+ \alt<integer expr><add or sub><integer term>
+<integer term>\is<integer factor>
+ \alt<integer term><mul or div><integer factor>
+<integer factor>\is<number>
+ \alt<left paren><integer expr><right paren>
+<dimen expr>\is<dimen term>
+ \alt<dimen expr><add or sub><dimen term>
+<dimen term>\is<dimen factor>
+ \alt<dimen term><mul or div><integer factor>
+<dimen factor>\is<dimen>
+ \alt<left paren><dimen expr><right paren>
+<glue expr>\is<glue term>
+ \alt<glue expr><add or sub><glue term>
+<glue term>\is<glue factor>
+ \alt<glue term><mul or div><integer factor>
+<glue factor>\is<glue>
+ \alt<left paren><glue expr><right paren>
+<muglue expr>\is<muglue term>
+ \alt<muglue expr><add or sub><muglue term>
+<muglue term>\is<muglue factor>
+ \alt<muglue term><mul or div><integer factor>
+<muglue factor>\is<muglue>
+ \alt<left paren><muglue expr><right paren>
+<optional spaces and |\relax|>\is<optional spaces>
+ \alt<optional spaces>|\relax|
+<add or sub>\is<optional spaces>\ot+\alt<optional spaces>\ot-
+<div or mul>\is<optional spaces>\ot*\alt<optional spaces>\ot/
+<left paren>\is<optional spaces>\ot(
+<right paren>\is<optional spaces>\ot)
+\end{syntax}
+
+Next, \eTeX\ extends the syntax for assignments:
+\begin{syntax}
+<prefix>\is\more\alt|\protected|
+<simple assignment>\is\more
+ \alt<penalties assignment>
+ \alt|\readline|<number>[to]<control sequence>
+<penalties assignment>\is%
+ <penalties><equals><number><penalty values>
+<interaction mode assignment>\is\more
+ \alt|\interactionmode|<equals><2-bit number>
+\end{syntax}
+\noindent
+In a \<penalties assignment> for which the \<number> is $n$, the
+\<penalty values> are \<empty> if $n\le0$, otherwise they consist of $n$
+consecutive occurrences of \<number>.
+
+Finally, the remaining mode-independent \eTeX\ commands:
+
+\begin{itemize}
+\item
+\|\showgroups|, \|\showifs|, \|\showtokens|\<general text>.
+These commands are intended to help you figure out what \eTeX\ thinks it
+is doing.
+The \|\showtokens| command displays the token list \<balanced text>.
+
+\item
+\|\marks|\<15-bit number>\<general text>. This command generalizes
+\TeX's \|\mark| command to 32768 distinct mark classes; the special case
+\|\marks0| is synonymous with \|\mark|.
+
+\end{itemize}
+
+\subsection{Vertical-Mode Commands}
+
+The syntax for \TeX's vertical-mode commands, as described in the second
+part of Chapter~24 of \TeXbook, is extended by \eTeX\ as follows:
+
+\begin{itemize}
+\item
+\|\pagediscards|, \|\splitdiscards|.
+These two commands are similar to \|\unvbox|.
+When \|\savingvdiscards| is positive, items discarded by the page
+builder and by the \|\vsplit| command are collected in two special
+lists. One of these special lists is appended to the current vertical
+list (in the same way as \|\unvbox| appends the vertical list inside a
+vbox) and becomes empty.
+
+\item
+Here are the additional possibilities for \<horizontal command>:
+\begin{syntax}
+<horizontal command>\is\more
+ \alt|\beginL|\alt|\endL|\alt|\beginR|\alt|\endR|
+\end{syntax}
+
+\end{itemize}
+
+\subsection{Horizontal-Mode Commands}
+
+The syntax for \TeX's horizontal-mode commands, as described in
+Chapter~25 of \TeXbook, is extended by \eTeX\ as follows:
+
+\begin{itemize}
+\item
+Here are the additional possibilities for \<vertical command>:
+\begin{syntax}
+<vertical command>\is\more
+ \alt|\pagediscards|\alt|\splitdiscards|
+\end{syntax}
+
+\item
+\|\beginL|, \|\endL|, \|\beginR|, \|\endR| (text-direction commands).\\
+The use of these commands is illegal when the \TeXXeT\ enhancement is
+currently disabled; otherwise a \|beginL|, etc.\ text-direction node (a
+new kind of math node) is appended to the current horizontal list.
+These nodes delimit the beginning and end of hlist segments containing
+left-to-right~(L) or right-to-left~(R) text. Before a paragraph is
+broken into lines, \|endL| and \|endR| nodes are added to terminate any
+unfinished L~or R~segments; when a paragraph is continued after display
+math mode, any such unfinished segments are automatically resumed,
+starting the new hlist with \|beginL| and \|beginR| nodes as necessary.
+
+\item
+\|\marks|\<15-bit number>\<general text>. This command generalizes
+\TeX's \|\mark| command to 32768 distinct mark classes; the special case
+\|\marks0| is synonymous with \|\mark|.
+
+\end{itemize}
+
+\subsection{Math-Mode Commands}
+
+The syntax for \TeX's math-mode commands, as described in Chapter~26 of
+\TeXbook, is extended by \eTeX\ as follows:
+
+\begin{itemize}
+\item
+\|\left|\<delim>\<math mode material>\\
+\|\middle|\<delim>\<math mode material>\|...|\|\right|\<delim>\\
+(generalizing \TeX's
+\|\left|\<delim>\<math mode material>\|\right|\<delim>).\\
+For each \<math mode material> \eTeX\ begins a new group, starting out
+with a new math list (always in the same style) that begins with a left
+boundary item containing everything processed so far. This group must
+be terminated with either `\|\middle|' or `\|right|', at which time the
+internal math list is completed with a new boundary item containing the
+new delimiter. In the case of `\|\middle|', a new group is started
+again, in the case of `\|\right|', \eTeX\ appends an Inner atom to the
+current list; the nucleus of this atom contains the internal math list
+just completed.
+
+\end{itemize}
+
+\begin{thebibliography}{9}
+
+\bibitem{tripman}
+{\sl A torture test for \TeX\/},
+by Donald E.~Knuth, Stanford Computer Science Report~1027.
+
+\bibitem{etripman}
+{\sl A torture test for \eTeX\/},
+by The \NTS\ Team (Peter Breitenlohner and Bernd Raichle).
+Version~2, January 1998.
+
+\bibitem{webman}
+{\sl The WEB system of structured documentation\/},
+by Donald E.~Knuth,\hfil\break Stanford Computer Science Report~980.
+
+\bibitem{etexgen}
+{\sl How to generate \eTeX\/},
+by The \NTS\ Team (Peter Breitenlohner and Phil Taylor).
+Version~2, January 1998.
+
+\bibitem{texbook}
+\TeXbook\ (Computers and Typesetting, Vol.~A),
+by Donald E.~Knuth,
+Addison Wesley, Reading, Massachusetts, 1986.
+
+\bibitem{texet}
+
+{\sl Mixing right-to-left texts with left-to-right texts\/},
+by Donald~E. Knuth and Pierre MacKay,
+{\sl TUGboat\/} {\bf 8}, 14--25, 1987.
+
+\end{thebibliography}
+
+\end{document}
+
diff --git a/systems/doc/etex/etex_ref.html b/systems/doc/etex/etex_ref.html
new file mode 100644
index 0000000000..2adbbb00d7
--- /dev/null
+++ b/systems/doc/etex/etex_ref.html
@@ -0,0 +1,917 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+<HEAD>
+ <TITLE>The e-TeX Short Reference Manual</TITLE>
+ <META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (Win95; I) [Netscape]">
+</HEAD>
+<BODY>
+
+
+<CENTER><P>The e-TeX Short Reference Manual<//P></CENTER>
+
+<CENTER><P>NTS team<BR>
+October 1996</CENTER>
+
+<P>Derived from a paper originally presented as:
+
+<CENTER><P>Philip Taylor, "e-TeX: a 100%-compatible successor to TeX"<BR>
+(Following humbly in the footsteps of the Grand Wizard) </CENTER>
+
+<P>in: Proceedings of the Ninth European TeX Conference EuroTeX'95, September
+4-8, 1995, Arnhem, The Netherlands, pp. 359-370.
+
+<P>
+<HR>
+
+<H2>Table of Contents</H2>
+
+<OL>
+<LI><A HREF="#Introduction">Introduction</A> </LI>
+
+<LI><A HREF="#Installation">Installation</A> </LI>
+
+<LI><A HREF="#NewFeatures">The new features</A> </LI>
+
+</OL>
+
+<P>
+<HR>
+
+<H2>Table of new commands</H2>
+
+<UL>
+<LI><TT><A HREF="#beginL">\beginL</A></TT> </LI>
+
+<LI><TT><A HREF="#beginR">\beginR</A></TT> </LI>
+
+<LI><TT><A HREF="#botmarks">\botmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#detokenize">\detokenize</A></TT> </LI>
+
+<LI><TT><A HREF="#endL">\endL</A></TT> </LI>
+
+<LI><TT><A HREF="#endR">\endR</A></TT> </LI>
+
+<LI><TT><A HREF="#eTeXrevision">\eTeXrevision</A></TT> </LI>
+
+<LI><TT><A HREF="#eTeXversion">\eTeXversion</A></TT> </LI>
+
+<LI><TT><A HREF="#everyeof">\everyeof</A></TT> </LI>
+
+<LI><TT><A HREF="#firstmarks">\firstmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#currentgrouplevel">\currentgrouplevel</A></TT> </LI>
+
+<LI><TT><A HREF="#currentgrouptype">\currentgrouptype</A></TT> </LI>
+
+<LI><TT><A HREF="#ifcsname">\ifcsname</A></TT> </LI>
+
+<LI><TT><A HREF="#ifdefined">\ifdefined</A></TT> </LI>
+
+<LI><TT><A HREF="#interactionmode">\interactionmode</A></TT> </LI>
+
+<LI><TT><A HREF="#lastnodetype">\lastnodetype</A></TT> </LI>
+
+<LI><TT><A HREF="#marks">\marks</A></TT> </LI>
+
+<LI><TT><A HREF="#middle">\middle</A></TT> </LI>
+
+<LI><TT><A HREF="#predisplaydirection">\predisplaydirection</A></TT> </LI>
+
+<LI><TT><A HREF="#protected">\protected</A></TT> </LI>
+
+<LI><TT><A HREF="#readline">\readline</A></TT> </LI>
+
+<LI><TT><A HREF="#scantokens">\scantokens</A></TT> </LI>
+
+<LI><TT><A HREF="#showgroups">\showgroups</A></TT> </LI>
+
+<LI><TT><A HREF="#showtokens">\showtokens</A></TT> </LI>
+
+<LI><TT><A HREF="#splitfirstmarks">\splitfirstmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#splitbotmarks">\splitbotmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#TeXXeTstate">\TeXXeTstate</A></TT> </LI>
+
+<LI><TT><A HREF="#topmarks">\topmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingassigns">\tracingassigns</A></TT> </LI>
+
+<LI><A HREF="#AdditionalTracingInformation"><TT>\tracingcommands</TT></A> </LI>
+
+<LI><TT><A HREF="#tracinggroups">\tracinggroups</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingifs">\tracingifs</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingscantokens">\tracingscantokens</A></TT> </LI>
+
+<LI><TT><A HREF="#unexpanded">\unexpanded</A></TT> </LI>
+
+<LI><TT><A HREF="#unless">\unless</A></TT> </LI>
+</UL>
+
+<P>
+<HR><A NAME="Introduction"></A>
+
+<H1>1 Introduction</H1>
+
+<P>e-TeX is the first concrete result of an international research &amp;
+development project, the <I>NTS</I> Project, which was established under
+the &aelig;gis of DANTE e.V. during 1992. The aims of the project are to perpetuate
+and develop the spirit and philosophy of TeX, whilst respecting Knuth's
+wish that TeX should remain frozen.
+
+<P>The group were very concerned that unless there existed some evolutionary
+flexibility within which TeX could react to changing needs and environments,
+it might all too soon become eclipsed by more modern yet less sophisticated
+systems. Accordingly they agreed to investigate a possible successor or
+successors to TeX, successors which would enshrine and encapsulate all
+that was best in TeX whilst being freed from the evolutionary constraints
+which Knuth had placed on TeX itself. To avoid any suggestion that it was
+TeX which the group sought to develop against Knuth's wishes, a working
+title of <I>NTS</I> (for New Typesetting System) was chosen for the project.
+
+
+<P>During the initial meetings of the <I>NTS</I> group, it became clear
+that there were two possible approaches to developments based on TeX: an
+evolutionary path which would simply continue where Knuth had left off,
+and which would use as its basis the source code of TeX itself (i.e. <TT><A HREF="#TeX.Web">TeX.Web</A></TT>);
+the other a revolutionary path which would be based on a completely new
+implementation of TeX, using a modern rapid-prototyping language which
+could allow individual components of the system to be modified or replaced
+in a simple and straightforward manner. The group agreed that the latter
+(revolutionary) approach had much greater potential, but were aware that
+the re-implementation would be non-trivial, and would require external
+funding to bring it to fruition in finite time; accordingly they agreed
+to concentrate their initial efforts on the former (evolutionary) path,
+and set to work to specify and implement a direct derivative of TeX which
+became known as e-TeX (the <I>e</I> of e-TeX may be read as <I>extended</I>,
+<I>enhanced</I>, <I>evolutionary</I> or <I>European</I> at will(!), and
+is also an acknowledgement of the parallel developments which have lead
+the LaTeX&nbsp;3 team to modify their initial goal and to release an interim
+LaTeX, LaTeX2e, which is directly derived from the LaTeX sources.
+
+<P>The group took as the starting point for the development of e-TeX the
+many contributions which had been made on <TT><A HREF="#NTS-L">NTS-L</A></TT>
+(the open mailing list on which discussions pertinent to e-TeX &amp; <I>NTS</I>
+take place), together with the extremely interesting list of ideas which
+Knuth gives at the end of <TT><A HREF="#TeX82.Bug">TeX82.Bug</A></TT>,
+and which he describes as <I>`Possibly nice ideas that will not be implemented'</I>
+(and which he contrasts with <I>`Bad ideas that will not be implemented'</I>!).
+Individual members of the group also contributed ideas of their own which
+had not necessarily been discussed publicly. All proposals were then subjected
+to a rigorous vetting procedure to ensure that they conformed to the e-TeX
+philosophy, which may be summarised as follows:
+
+<BLOCKQUOTE>
+<P>e-TeX will in all ways demonstrate its affinity to, and derivation from,
+Knuth's TeX; it will be implemented as a change-file to <TT><A HREF="#TeX.Web">TeX.Web</A></TT>,
+and will not exploit features which could only be achieved by using a particular
+implementation, operating system or language; it will be capable of being
+used successfully on a machine as small as an 80286-based PC or similar.
+
+
+<P>At format-generation time, a user will have the option of generating
+either a TeX-compatible format or an e-TeX format; if the TeX-compatible
+format is subsequently used in conjunction with e-TeX, the result will
+be <A NAME="TripCompatible"></A><I>Trip-compatible</I> (i.e. indistinguishable
+from TeX proper). If an e-TeX format is generated and used in conjunction
+with e-TeX, then provided that none of the new e-TeX primitives are used,
+the results will be identical to those which would be produced using TeX
+proper. If an e-TeX format is used in conjunction with e-TeX and if one
+or more of the new e-TeX primitives are used, then those portions of the
+document which are affected by the new primitive(s) may be processed in
+a manner unique to e-TeX; other portions of the document will be processed
+in a manner identical to that of TeX proper. Only if an e-TeX format is
+used in conjunction with e-TeX and if an explicit assignment is made to
+one of the <A NAME="EnhancedMode"></A><I>enhanced-mode</I> variables to
+enable that particular enhanced mode will e-TeX behave in a manner which
+may be distinguishable from that of TeX even if no other reference to an
+e-TeX primitive occurs anywhere in the document. (These modes of operation
+are referred to as <A NAME="CompatibilityMode"></A><I>compatibility-mode</I>,
+<A NAME="ExtendedMode"></A><I>extended-mode</I> and <I>enhanced-mode</I>
+respectively.)
+
+<P>All new e-TeX primitives will be syntactically identical to existing
+TeX primitives: that is, they will be either <I>control-words</I> or <I>control-symbols</I>
+within a normal category code r&eacute;gime. Where an analogous primitive exists
+within TeX, the corresponding e-TeX primitive(s) will occupy the same syntactic
+niche. Every effort will be made to ensure that new e-TeX primitives fit
+into the existing set of TeX datatypes; no new datatype will be introduced
+unless it is absolutely essential.
+</BLOCKQUOTE>
+
+<P>In brief, this implies that e-TeX will follow the principle of least
+surprise: an existing TeX user, on using e-TeX for the first time, should
+not be surprised by e-TeX's behaviour, and should be able to take advantage
+of new e-TeX features without having either to unlearn some aspects of
+TeX or to learn some new e-TeX philosophy.
+
+<P>
+<HR><A NAME="Installation"></A>
+
+<H1>2 Installation</H1>
+
+<P>It is intended that e-TeX be available ready-compiled for those systems
+for which pre-compiled binaries are the norm (e.g. MS-DOS, VMS, ...); for
+other systems such as Unix(TM), e-TeX is supplied as a change-file which
+will need to be applied to <TT><A HREF="#TeX.Web">TeX.Web</A></TT> in the
+normal way. However, since there will already be an implementation-specific
+change-file for the system of interest, some means will be required of
+merging <TT><A HREF="#TeX.Web">TeX.Web</A></TT> with not one but (at least)
+two change-files; possibilities include <I><A HREF="#PatchWeb">PatchWeb</A></I>,
+<I><A HREF="#Tie">Tie</A></I>, etc., but if none of these are available
+then <I><A HREF="#WebMerge">WebMerge</A></I>, a TeX script, is supplied
+and can be used as a slower but satisfactory alternative. In practice,
+two or three change-files will be needed: the e-TeX system-independent
+change-file, the TeX system-dependent change-file, and perhaps a small
+e-TeX system-dependent change-file. The system-independent e-TeX change-file
+is supplied as part of the e-TeX kit, and sample system-dependent e-TeX
+change-files are also supplied which may be used as a guide to those places
+at which system-dependent interactions are to be expected: an experienced
+implementor should have little difficulty in modifying one of these to
+produce an e-TeX system-dependent change-file for the system of interest.
+Once e-TeX has been tangled and woven, it should be compiled and linked
+in the normal way.
+
+<P>Once a working binary (or binaries, for those systems which have separate
+executables for <TT>IniTeX</TT> and <TT>VirTeX</TT>) has been acquired
+or produced, the next step will be to generate a suitable format file or
+files. Whilst e-TeX can be used in conjunction with <TT><A
+HREF="src/plain.tex">Plain.TeX</A></TT> to produce a Plain <I>e-format</I>,
+it is better to use the supplied <TT><A HREF="#etex.src">etex.src</A></TT> file
+which supplements the e-TeX primitives with additional useful control
+sequences.
+
+<P>When generating the format file, and regardless of the format source
+used, one fundamental decision must be made: is e-TeX to generate a <I><A HREF="#CompatibilityMode">compatibility
+mode</A></I> format, or an <I><A HREF="#ExtendedMode">extended mode</A></I>
+format? If the former, <I>all</I> e-TeX <A NAME="extension"></A>extensions
+and <A NAME="enhancement"></A>enhancements will be disabled, the format
+will contain only the TeX-defined set of primitives, and any subsequent
+use of the format in conjunction with e-TeX will result in completely TeX-compatible
+behaviour and semantics, including compatibility at the level of the <A HREF="#Trip">Trip</A>
+test. If the latter option, however, is selected, then all extensions present
+in e-TeX will automatically be activated, and the format file will contain
+not only the TeX-defined set of primitives but also those defined by e-TeX
+itself; any subsequent use of such a format in conjunction with e-TeX will
+result in e-TeX operating in <I><A HREF="#ExtendedMode">extended mode</A></I>;
+documents which contains no references to any of the e-TeX-defined primitives
+will continue to generate results identical to those which would have been
+produced were the document processed by TeX, but compatibility at the <A HREF="#Trip">Trip</A>-test
+level can no longer be accomplished, and of course any document which makes
+reference to an e-TeX primitive will generate results which could not have
+been accomplished using TeX. It should be noted that neither a <I><A HREF="#CompatibilityMode">compatibility
+mode</A></I> format nor an <I><A HREF="#ExtendedMode">extended mode</A></I>
+format may be used in conjunction with TeX itself; they are only suitable
+for use in conjunction with e-TeX, since formats are not in general portable.
+Finally it should be emphasised that even if an <I><A HREF="#ExtendedMode">extended
+mode</A></I> format is generated, any document processed using such a format
+but not referencing any e-TeX-defined primitive will produce results identical
+to those which would have been produced had the same document been processed
+using TeX; only if the document makes an explicit assignment to one of
+the <I><A HREF="#EnhancedMode">enhanced mode</A></I> state variables (<TT><A
+HREF="#TeXXeTstate">\TeXXeTstate</A></TT> is the only instance of these in V1
+of e-TeX) will compatibility with TeX be compromised: e-TeX is then said to be
+operating in <I><A HREF="#EnhancedMode">enhanced mode</A></I> rather than <I><A
+HREF="#ExtendedMode">extended mode</A></I>.
+
+
+<P>The choice between generating a <I><A HREF="#CompatibilityMode">compatibility
+mode</A></I> format and an <I><A HREF="#ExtendedMode">extended mode</A></I>
+format is made at the point of specifying the format source file: assuming
+that the operating system supports command-line entry with parameters,
+then a normal TeX format-generation command would probably resemble:
+
+<PRE> initex plain \dump
+</PRE>
+
+<P>or if the more verbose interactive form is preferred:
+
+<PRE> initex
+ **plain
+ *\dump
+</PRE>
+
+<P>With e-TeX, exactly the same command will achieve exactly the same effect,
+and the format generated will be a <I><A HREF="#CompatibilityMode">compatibility-mode</A></I>
+format; thus assuming that the Ini-version of e-TeX is invoked with the
+command <TT>einitex</TT>, the following will both generate <I><A HREF="#CompatibilityMode">compatibility-mode</A></I>
+formats:
+
+<PRE> einitex plain \dump
+</PRE>
+
+<P>and
+
+<PRE> einitex
+ **plain
+ *\dump
+</PRE>
+
+<P>In order to generate an <I><A HREF="#ExtendedMode">extended mode</A></I>
+format, the file-specification for the format source file must be preceded
+by an asterisk (<TT>*</TT>); whilst this may seem an inelegant mechanism,
+it has the great advantage that it avoids almost all system dependencies
+(Graphical user interface (GUI) systems excepted, of course), and the asterisk
+as a component element of a filename is a very remote possibility (most
+filing systems reserve the asterisk as a `wild card' character, which can
+therefore not form a part of a real file name <I>per se</I>). Thus to generate
+an <I><A HREF="#ExtendedMode">extended mode</A></I> Plain format, the following
+dialogue may be used:
+
+<PRE> einitex *plain \dump
+</PRE>
+
+<P>or
+
+<PRE> einitex
+ ***plain
+ *\dump
+</PRE>
+
+<P>and to generate an <I><A HREF="#ExtendedMode">extended mode</A></I>
+<TT>etex.src</TT> format, the following instead:
+
+<PRE> einitex *etex.src \dump
+</PRE>
+
+<P>or
+
+<PRE> einitex
+ ***etex.src
+ *\dump
+</PRE>
+
+<P>Once suitable formats have been generated, they can then be used in
+conjunction both with <I>e-IniTeX</I> and <I>e-VirTeX</I> without further
+formality: in particular, no asterisk is needed (nor should be used!) if
+a format is specified, since the format implicitly defines (depending as
+its mode of generation) in which mode (compatibilty or extended) e-TeX
+will operate. Thus, for example, if a <TT>plain</TT> format had been generated
+in <I><A HREF="#CompatibilityMode">compatibility mode</A></I>, and an <TT>etex</TT>
+format had been generated in <I><A HREF="#ExtendedMode">extended mode</A></I>,
+then both:
+
+<pRE> einitex &amp;Plain
+</PRE>
+
+<P>and
+
+<pRE> evirtex &amp;plain
+</PRE>
+
+<P>will cause e-TeX to process any subsequent commands in <I><A HREF="#CompatibilityMode">compatibility
+mode</A></I>. On the other hand, both
+
+<PRE> einitex &amp;etex
+</PRE>
+
+<P>and
+
+<PRE> eVirTeX &amp;etex
+</PRE>
+
+<P>will cause e-TeX to process any subsequent commands in <I><A HREF="#ExtendedMode">extended
+mode</A></I>, <B>but only because the <TT>etex</TT> format was generated
+in <I><A HREF="#ExtendedMode">extended mode</A></I></B>: it is not the
+<B>name</B> of the format, nor is it the contents of the <B>source</B>
+of the format, which determine the mode of operation -- it is the <B>mode
+of operation</B> which was used when the format was generated. Any format
+generated in <I><A HREF="#CompatibilityMode">compatibility mode</A></I>
+will cause e-TeX to operate in <I><A HREF="#CompatibilityMode">compatibility
+mode</A></I> whenever it is used, whilst the equivalent format, built from
+the same source but generated in <I><A HREF="#ExtendedMode">extended mode,</A></I>
+will cause e-TeX to operate in <I><A HREF="#ExtendedMode">extended mode</A></I>
+whenever it is used.
+
+<P>Although e-TeX is completely TeX-compatible, and there is therefore
+no real reason why any system should need both TeX and e-TeX, it is anticipated
+that until complete confidence exists in the compatibility of e-TeX many
+sites and users will prefer to retain instances of each. For this reason
+it is intended that change-files and binaries should ensure that both TeX
+and e-TeX can happily co-exist on any system by a careful choice of name-spaces.
+In the case of the reference VMS&nbsp;implementation, for example, this
+is accomplished by using the prefix &quot;etex_&quot; for each logical
+name which defines the e-TeX environment, in contrast to the prefix &quot;tex_&quot;
+which defines the analogous TeX environment; the &quot;etex_*&quot; logical
+names are defined as search lists which first reference an e-TeX specific
+location followed by the analogous location for TeX.
+
+<P>
+<HR><A NAME="NewFeatures"></A>
+
+<H1>3 The new features</H1>
+
+<P>Bearing in mind the contraints outlined in the introduction, the group
+identified 35 new primitives which they believed would give
+added functionality to e-TeX without compromising its compatibility with
+TeX; of the 35 new primitives, 29 are extensions (which by definition
+do not affect the semantics of existing TeX documents), whilst just six
+(all concerned with the implementation of <A HREF="#TeX--XeT">TeX--XeT</A>)
+are associated with an enhancement. In addition to the new primitives,
+additional functionality was added to some existing primitives, and TeX's
+behaviour in some unusual boundary conditions was made more robust (this
+last has been subsumed in the most recent version of TeX, so this is no
+longer e-TeX-specific).
+
+<P>The new features are listed and briefly described below, clustered together
+to indicate related functionality.
+The technical terms used below to
+describe syntax entities as defined in <I><TT><A
+HREF="knuth/texbook.tex">The
+TeXbook.</A></TT></I>
+
+<H2>3.1 Additional control over expansion</H2>
+
+<UL>
+<LI><TT><A HREF="#protected">\protected</A></TT> </LI>
+
+<LI><TT><A HREF="#detokenize">\detokenize</A></TT> </LI>
+
+<LI><TT><A HREF="#unexpanded">\unexpanded</A></TT> </LI>
+</UL>
+
+<DL>
+<DT><A NAME="protected"></A><TT>\protected</TT> </DT>
+
+<DD>is a prefix, analogous to <TT>\long</TT>, <TT>\outer</TT>, and <TT>\global</TT>;
+it associates with the macro being defined an attribute which inhibits
+expansion of the macro in expansion-only contexts (for example, within
+the parameter text of a <TT>\write</TT> or <TT>\edef</TT>); if, however,
+the parser or command processor (TeX's `oesophagus' and `stomach', in
+Knuth's alimentary paradigm) is currently demanding a <I>command</I>, then
+the <TT>\protected</TT> macro will expand in the normal way. This behaviour
+is identical to that displayed by the explicit expansion of a token-list
+register through the use of <TT>\the</TT>; the same model is used elsewhere
+in e-TeX to achieve a consistent paradigm for <I>partial expansion</I>.
+</DD>
+
+<DT><A NAME="detokenize"></A><TT>\detokenize</TT>, </DT>
+
+<DD>when followed by a <I>&lt;general text&gt;</I>, expands to yield a
+sequence of character tokens of <TT>\catcode</TT> 10 (<I>space</I>) or
+12 (<I>other</I>) corresponding to a decomposition of the tokens of the
+<I>&lt;balanced text&gt;</I> of the unexpanded <I>&lt;general text&gt;&gt;</I>;
+c.f. <TT>\showtokens</TT>. The effect is rather as if <TT><A HREF="#scantokens">\scantokens</A></TT>
+(q.v.) were applied to the <I>&lt;general text&gt;</I> within a r&eacute;gime
+in which only <TT>\catcodes</TT> 10 and 12 existed. Note that in order
+to preserve the boundaries between <I>control words</I> and any following
+<I>letter</I>, a <I>space</I> is yielded after each control word including
+the last. </DD>
+
+<DT><A NAME="unexpanded"></A><TT>\unexpanded</TT>, </DT>
+
+<DD>when followed by a <I>&lt;general text&gt;</I>, expands to yield the
+<I>&lt;balanced text&gt;</I> of the unexpanded <I>&lt;general text&gt;</I>.
+No further expansion will occur if e-TeX is currently performing a <TT>\write</TT>,
+<TT>\edef</TT>, etc., but further expansion will occur if the parser or
+command processor is currently demanding a <I>command</I>. The effect is
+as if the <I>&lt;general text&gt;</I> were assigned to a token list register,
+and the latter were then partially expanded using <TT>\the</TT>, but no
+assignment actually takes place; thus <TT>\unexpanded</TT> can be used
+in expansion-only contexts. </DD>
+</DL>
+
+<H2>3.2 Provision for re-scanning already read text</H2>
+
+<UL>
+<LI><TT><A HREF="#readline">\readline</A></TT> </LI>
+
+<LI><TT><A HREF="#scantokens">\scantokens</A></TT> </LI>
+</UL>
+
+<DL>
+<DT><A NAME="readline"></A><TT>\readline</TT> </DT>
+
+<DD>is analogous to <TT>\read</TT>, but treats each character as if it
+were currently of <TT>\catcode</TT> 10 (<I>space</I>) or 12 (<I>other</I>);
+the text thus read is therefore suitable for being scanned and re-scanned
+(using <TT><A HREF="#scantokens">\scantokens</A></TT>, q.v.) under different
+<TT>\catcode</TT> r&eacute;gimes. </DD>
+
+<DT><A NAME="scantokens"></A><TT>\scantokens</TT>, </DT>
+
+<DD>when followed by a <I>&lt;general text&gt;</I>, decomposes the <I>&lt;balanced
+text&gt;</I> of the <I>&lt;general text&gt;</I> into the corresponding
+sequence of characters as if the <I>&lt;balanced text&gt;</I> were written
+unexpanded to a file; it then uses TeX's <TT>\input</TT> mechanism to re-process
+these characters under the current <TT>\catcode</TT> r&eacute;gime. As the <TT>\input</TT>
+mechanism is used, even hex notation (<TT>^^xy</TT>) will be re-interpreted.
+Parentheses and a single space representing the <I>pseudo-file</I> will
+be displayed if <TT><A HREF="#tracingscantokens">\tracingscantokens</A></TT>
+(q.v.) is positive and non-zero. </DD>
+</DL>
+
+<H2>3.3 Environmental enquiries</H2>
+
+<UL>
+<LI><TT><A HREF="#eTeXrevision">\eTeXrevision</A></TT> </LI>
+
+<LI><TT><A HREF="#eTeXversion">\eTeXversion</A></TT> </LI>
+
+<LI><TT><A HREF="#currentgrouplevel">\currentgrouplevel</A></TT> </LI>
+
+<LI><TT><A HREF="#currentgrouptype">\currentgrouptype</A></TT> </LI>
+
+<LI><TT><A HREF="#ifcsname">\ifcsname</A></TT> </LI>
+
+<LI><TT><A HREF="#ifdefined">\ifdefined</A></TT> </LI>
+
+<LI><TT><A HREF="#lastnodetype">\lastnodetype</A></TT> </LI>
+</UL>
+
+<DL>
+<DT><A NAME="eTeXrevision"></A><TT>\eTeXrevision</TT>: </DT>
+
+<DD>an primitive which expands to yield a sequence of character tokens
+of <TT>\catcode</TT> 12 (<I>other</I>; these represent the minor component
+of the combined version/revision number. Pre-release versions will be characterised
+by an initial <I>minus</I> sign (<TT>-</TT>), whilst post-release versions
+will be implicitly positive; both will contain an explicit leading decimal
+point, which will follow any minus sign present. </DD>
+
+<DT><A NAME="eTeXversion"></A><TT>\eTeXversion</TT>: </DT>
+
+<DD>an internal read-only integer representing the major component of the
+combined version/revision number. </DD>
+
+<DT><A NAME="currentgrouplevel"></A><TT>\currentgrouplevel</TT>: </DT>
+
+<DD>an internal read-only integer which returns the current group level
+(i.e. depth of nesting). </DD>
+
+<DT><A NAME="currentgrouptype"></A><TT>\currentgrouptype</TT>: </DT>
+
+<DD>an internal read-only integer which returns the type of the innermost
+group as an integer in the range 0..16. Textual definitions of these types
+may be provided through an associated macro library, but it is intended
+that these definitions shall be easily replaceable by national language
+versions in environments within which English language texts are sub-optimal.
+</DD>
+
+<DT><A NAME="ifcsname"></A><TT>\ifcsname</TT>: </DT>
+
+<DD>similar in effect to the sequence <TT>\unless</TT> <TT>\expandafter</TT>
+<TT>\ifx</TT> <TT>\expandafter</TT> <TT>\relax</TT> <TT>\csname</TT> but
+avoids the side-effect of the <I>cs-name</I> being ascribed the value <TT>\relax</TT>,
+and also does not rely on <TT>\relax</TT> having its canonical meaning.
+No hash-table entry is used if <I>cs-name</I> does not exist. (<TT><A HREF="#unless">\unless</A></TT>
+is explained below.) </DD>
+
+<DT><A NAME="ifdefined"></A><TT>\ifdefined</TT>: </DT>
+
+<DD>similar in effect to <TT><A HREF="#unless">\unless</A></TT> <TT>\ifx</TT>
+<TT>\undefined</TT>, but does not require <TT>\undefined</TT> to actually
+be undefined, since no explicit comparison is made with any particular
+control sequence. </DD>
+
+<DT><A NAME="lastnodetype"></A><TT>\lastnodetype</TT>: </DT>
+
+<DD>an internal read-only integer which returns the type of the last node
+on the current list as an integer in the range -1..15+ (only values -1..15
+are defined in the first release, but future releases may define additional
+values). Textual definitions of these types may be provided through an
+associated macro library. </DD>
+</DL>
+
+<H2>3.4 Generalisation of the <TT>\mark</TT> concept: a class of <TT>\marks</TT></H2>
+
+<UL>
+<LI><TT><A HREF="#marks">\marks</A></TT> </LI>
+
+<LI><TT><A HREF="#botmarks">\botmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#firstmarks">\firstmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#topmarks">\topmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#splitfirstmarks">\splitfirstmarks</A></TT> </LI>
+
+<LI><TT><A HREF="#splitbotmarks">\splitbotmarks</A></TT> </LI>
+</UL>
+
+<DL>
+<DT><A NAME="marks"></A><TT>\marks</TT>: </DT>
+
+<DD>this is one of Knuth's `possibly good ideas', listed at the end of <TT><A
+HREF="#TeX82.Bug">TeX82.Bug</A></TT>; whereas TeX has only one <TT>\mark</TT>,
+which has to be over-loaded if more than one class of information is to be
+saved (e.g. over-loading is necessary if separate information for recto and
+verso pages is to be maintained), e-TeX has a whole class of <TT>\marks</TT>
+(256, in the first release); thus rather than writing <TT>\mark</TT>
+<I>&lt;general text&gt;</I> as in TeX, in e-TeX one writes <TT>\marks</TT>
+<I>8-bit number</I> <I>&lt;general text&gt;</I>. For example,
+<TT>\marks&nbsp;0</TT> could be used to retain information for the verso page,
+whilst <TT>\marks 1</TT> could retain information for the recto. There are
+equivalent classes for the five <TT>\marks</TT> variables <A
+NAME="botmarks"></A><TT>\botmarks</TT>, <A
+NAME="firstmarks"></A><TT>\firstmarks</TT>, <A
+NAME="topmarks"></A><TT>\topmarks</TT>, <A
+NAME="splitfirstmarks"></A><TT>\splitfirstmarks</TT> and <A
+NAME="splitbotmarks"></A><TT>\splitbotmarks</TT>. It should be noted that
+<TT>\marks&nbsp;0</TT> and <TT>\mark</TT> are in fact identical, as are
+<TT>\topmarks&nbsp;0</TT> and \<TT>topmark</TT>, \<TT>botmarks&nbsp;0</TT> and
+<TT>\botmark</TT> and so on.</DD>
+</DL>
+
+<H2>3.5 Bi-directional typesetting: the <A HREF="#TeX--XeT">TeX--XeT</A>
+primitives</H2>
+
+<UL>
+<LI><TT><A HREF="#TeXXeTstate">\TeXXeTstate</A></TT> </LI>
+
+<LI><TT><A HREF="#beginL">\beginL</A></TT> </LI>
+
+<LI><TT><A HREF="#beginR">\beginR</A></TT> </LI>
+
+<LI><TT><A HREF="#endL">\endL</A></TT> </LI>
+
+<LI><TT><A HREF="#endR">\endR</A></TT> </LI>
+
+<LI><TT><A HREF="#predisplaydirection">\predisplaydirection</A></TT> </LI>
+</UL>
+
+<P><A HREF="#TeX--XeT">TeX--XeT</A> was developed by Peter Breitenlohner
+based on the original <!--A HREF="TeX-XeT-TODO"-->TeX-XeT<!--/A--> of Donald Knuth
+and Pierre MacKay; whereas <!--A HREF="#TeX-XeT"-->TeX-XeT<!--/A--> generated non-standard
+<I>DVI</I> files, <A HREF="#TeX--XeT">TeX--XeT</A> generates perfectly
+normal <I>DVI</I> files which can therefore be processed by standard <I>DVI</I>
+drivers (assuming, of course, that the necessary fonts are available).
+Both systems permit the direction of typesetting (conventionally left-to-right
+in Western documents) to be reversed for part or all of a document, which
+is particularly useful when setting languages such as Hebrew or Arabic.
+
+
+<DL>
+<DT><A NAME="beginL"></A><TT>\beginL</TT>: </DT>
+
+<DD>indicates the start of a region (e.g. a section of text, or a pre-constructed
+<I>box</I>) which should be set left-to-right; </DD>
+
+<DT><A NAME="beginR"></A><TT>\beginR</TT>: </DT>
+
+<DD>indicates the start of a region which should be set right-to-left;
+</DD>
+
+<DT><A NAME="endL"></A><TT>\endL</TT>: </DT>
+
+<DD>indicates the end of a region which should be set left-to-right; </DD>
+
+<DT><A NAME="endR"></A><TT>\endR</TT>: </DT>
+
+<DD>indicates the end of a region which should be set right-to-left; </DD>
+
+<DT><A NAME="TeXXeTstate"></A><TT>\TeXXeTstate</TT>: </DT>
+
+<DD>an internal read/write integer, its value is zero or negative to indicate
+that <A HREF="#TeX--XeT">TeX--XeT</A> features are not to be used; a positive
+value indicates that they may be used. As the internal data structures
+built by <A HREF="#TeX--XeT">TeX--XeT</A> differ from those built by TeX,
+and as the typesetting of a document by <A HREF="#TeX--XeT">TeX--XeT</A>
+may therefore differ from that performed by TeX, <TT>\TeXXeTstate</TT>
+defaults to zero, and even if set positive during format creation will
+be re-set to zero before the format is dumped. Explicit user action therefore
+is required to enable <A HREF="#TeX--XeT">TeX--XeT</A> semantics, and <A HREF="#TeX--XeT">TeX--XeT</A>
+is therefore classed as an <I><A HREF="#enhancement">enhancement</A></I>,
+not simply an <I><A HREF="#extension">extension</A></I>. </DD>
+
+<DT><A NAME="predisplaydirection"></A><TT>\predisplaydirection</TT>: </DT>
+
+<DD>an internal read/write integer, initialised by e-TeX to indicate the
+direction of the last partial paragraph before a display; it is used to
+control the placement of elements such as equation numbers, and can be
+explictly set to affect this placement. </DD>
+</DL>
+
+<H2>3.6 Additional debugging features</H2>
+
+<UL>
+<LI><TT><A HREF="#interactionmode">\interactionmode</A></TT> </LI>
+
+<LI><TT><A HREF="#showgroups">\showgroups</A></TT> </LI>
+
+<LI><TT><A HREF="#showtokens">\showtokens</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingassigns">\tracingassigns</A></TT> </LI>
+
+<LI><TT><A HREF="#tracinggroups">\tracinggroups</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingifs">\tracingifs</A></TT> </LI>
+
+<LI><TT><A HREF="#tracingscantokens">\tracingscantokens</A></TT> </LI>
+
+<LI><A HREF="#AdditionalTracingInformation">Additional detail for <TT>\tracingcommands</TT></A>
+</LI>
+</UL>
+
+<DL>
+<DT><A NAME="interactionmode"></A><TT>\interactionmode</TT>: </DT>
+
+<DD>whereas in TeX there exist only explicit commands such as <TT>\scrollmode</TT>,
+<TT>\errorstopmode</TT>, etc., in e-TeX read/write access is provided via
+<TT>\interactionmode</TT> (an internal integer); assigning a numeric value
+sets the associated mode, whilst the current mode may be ascertained by
+interrogating its value. Symbolic definitions of these values may be provided
+through an associated macro library. </DD>
+
+<DT><A NAME="showgroups"></A><TT>\showgroups</TT>: </DT>
+
+<DD><I>(e-)TeX</I> has many different classes of <I>group</I>, which should
+normally be properly balanced and nested; if a nesting or imbalance error
+occurs, it can be <I>very</I> difficult to track down the source of the
+problem. <TT>\showgroups</TT> causes e-TeX to display the level and type
+of all active groups from the point within which it was called. </DD>
+
+<DT><A NAME="showtokens"></A><TT>\showtokens</TT>, </DT>
+
+<DD>when followed by a <I>&lt;general text&gt;</I>, displays a sequence
+of characters corresponding to the decomposition of the <I>&lt;balanced
+text&gt;</I> of the unexpanded <I>&lt;general text&gt;</I>; c.f. <TT><A HREF="#detokenize">\detokenize</A></TT>.
+</DD>
+
+<DT><A NAME="tracingassigns"></A><TT>\tracingassigns</TT>: </DT>
+
+<DD><TT>\tracingassigns</TT>
+(an internal read/write integer) causes e-TeX to display the
+contents of registers <em>before</em> an assignment, as well
+as after the assignment,
+while set to a positive non-zero value. In standard TeX,
+only the value <em>after</em> the assignment can be displayed
+during a trace.
+</DD>
+
+<DT><A NAME="tracinggroups"></A><TT>\tracinggroups</TT>: </DT>
+
+<DD>a further aid to debugging runaway-group problems, <TT>\tracinggroups</TT>
+(an internal read/write integer) causes e-TeX to trace entry and exit to
+every group while set to a positive non-zero value. </DD>
+
+<DT><A NAME="tracingifs"></A><TT>\tracingifs</TT>: </DT>
+
+<DD> <tt>\tracingifs</tt> is an aid to debugging the expansion of conditionals.
+If it is set to a positive non-zero value, e-TeX traces the flow of
+control through conditional statements.</DD>
+
+<DT><A NAME="tracingscantokens"></A><TT>\tracingscantokens</TT>: </DT>
+
+<DD>an internal read/write integer, assigning it a positive non-zero value
+will cause an open-parenthesis and space to be displayed whenever <TT><A HREF="#scantokens">\scantokens</A></TT>
+is invoked; the matching close-parenthesis will be recorded when the scan
+is complete. If a traceback occurs during the expansion of <TT><A HREF="#scantokens">\scantokens</A></TT>,
+the first displayed line number will reflect the logical line number of
+the pseudo-file created from the parameter to <TT><A HREF="#scantokens">\scantokens</A></TT>;
+thus enabling <TT>\tracingscantokens</TT> can assist in identifying why
+an seemingly irrational line number is shewn as the source of error (the
+traceback always continues until the line number of the actual source file
+is displayed). </DD>
+
+<DT><A NAME="AdditionalTracingInformation"></A>Additional tracing information:
+</DT>
+
+<DD>If <TT>\tracingcommands</TT> is greater than 2, additional information
+is displayed (the maximum value defined in standard TeX is 2). </DD>
+</DL>
+
+<H2>3.7 Miscellaneous primitives</H2>
+
+<UL>
+<LI><TT><A HREF="#everyeof">\everyeof</A></TT> </LI>
+
+<LI><TT><A HREF="#middle">\middle</A></TT> </LI>
+
+<LI><TT><A HREF="#unless">\unless</A></TT> </LI>
+</UL>
+
+<DL>
+<DT><A NAME="everyeof"></A><TT>\everyeof</TT>: </DT>
+
+<DD>this is another of Knuth's `possibly good ideas', listed at the end of
+<TT><A HREF="#TeX82.Bug">TeX82.Bug</A></TT>; analogous to the other
+<TT>\every...</TT> primitives, it takes as parameter a <I>&lt;balanced
+text&gt;</I>, the tokens of which are inserted when the end of a file (either
+real or virtual, if <TT><A HREF="#scantokens">\scantokens</A></TT> is used) is
+reached. This allows <TT>\input</TT> statements to be used within the
+replacement text of <TT>\edef</TT>s, and allows totally arbitrary files to be
+<TT>\input</TT> within an e-TeX conditional, since the necessary <TT>\fi</TT>
+can be inserted before e-TeX complains that it has fallen off the end of the
+file. It should be noted that the <code>\everyeof</code> tokens are <em>not</em>
+inserted if the end-of-file is forced through the use of <code>\endinput</code>.
+</DD>
+
+<DT><A NAME="middle"></A><TT>\middle</TT>: </DT>
+
+<DD>analogous to TeX's <TT>\left</TT> and <TT>\right</TT>, <TT>\middle</TT>
+specifies that the following delimiter is to serve both as a right and
+left delimiter; it will be set with spacing appropriate to a right delimiter
+w.r.t. the preceding atom(s), and with spacing appropriate to a left delimiter
+w.r.t. the succeeding atom(s). A particularly nice
+<a href="http://vzdmzi.zdv.uni-mainz.de/~knappen/jk006.html">example</a>
+of its use
+has kindly been provided by
+<a href="mailto:knappen@vkpmzd.kph.uni-mainz.de">J&ouml;rg Knappen</a></DD>
+
+<DT><A NAME="unless"></A><TT>\unless</TT>: </DT>
+
+<DD>TeX has, by design, a rather sparse set of conditional primitives:
+<TT>\ifeof</TT>, <TT>\ifodd</TT>, <TT>\ifvoid</TT>, etc., have no complementary
+counterparts. Whilst this normally poses no problems since each accepts
+both a <TT>\then</TT> (implicit) and an <TT>\else</TT> (explicit) part,
+they fall down when used as the final <TT>\if...</TT> of a <TT>\loop ...
+\if ... \repeat</TT> construct, since no <TT>\else</TT> is allowed after
+the final <TT>\if...</TT>. <TT>\unless</TT> allows the sense of all Boolean
+conditionals to be inverted, and thus (for example) <TT>\unless</TT>
+<TT>\ifeof</TT> yields <I>true</I> iff end-of-file has <I>not</I> yet been
+reached.
+<a href="mailto:dak@neuroinformatik.ruhr-uni-bochum.de"">David Kastrup</a> has
+correctly pointed out that a similar effect can be achieved by macro
+programming, but the solution is not sufficiently general to allow it to be
+used unchanged in all contexts in which the new <tt>\unless</tt> primitive can
+be used.</DD>
+</DL>
+
+<HR>
+
+<H2>References:</H2>
+
+<DL>
+<DT><A NAME="TeX.Web"></A><B><TT>TeX.Web</TT></B> </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/knuth/tex/tex.web">tex-archive/systems/knuth/tex/tex.web</A>
+</DD>
+
+<DT><A NAME="TeX82.Bug"></A><B><TT>TeX82.Bug</TT></B> </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/knuth/errata/tex82.bug">tex-archive/systems/knuth/errata/tex82.bug</A>
+</DD>
+
+<DT><A NAME="Trip"></A><B><TT>Trip</TT> test</B> </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/knuth/tex/tripman.tex">tex-archive/systems/knuth/tex/tripman.tex</A>
+</DD>
+
+<DT><A NAME="Plain.TeX"></A><B><TT>Plain.TeX</TT></B> </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/knuth/lib/plain.tex">tex-archive/systems/knuth/lib/plain.tex</A>
+</DD>
+
+<DT><A NAME="TeX--XeT"></A><B>TeX--XeT</B> </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/knuth/tex--xet/">tex-archive/systems/knuth/tex--xet</A>
+</DD>
+
+<dt><a name="etex.src"></a><b><tt>etex.src</tt></b></dt>
+
+<dd><a href="src/etex.src">etex.src</a></dd>
+
+<DT><A NAME="NTS-L"></A><B>Discussion List <TT>NTS-L</TT></B> </DT>
+
+<DD>Subscribe with e-mail to the Listserver program
+<A HREF="mailto:listserv@vm.urz.uni-heidelberg.de">
+listserv@urz.uni-heidelberg.de</A>
+</DD>
+
+<DT><A NAME="Tie"></A><B>Tie</B> (written in C) </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.tex.ac.uk/tex-archive/web/tie/">tex-archive/web/tie</A>
+</DD>
+
+<DT><A NAME="WebMerge"></A><B>WebMerge</B> (written in TeX) </DT>
+
+<DD><a href="webmerge.tex">webmerge.tex</a></DD>
+
+<DT><A NAME="PatchWeb"></A><B>PatchWeb</B> (for PC, bundled with "dos-tp") </DT>
+
+<DD>CTAN: <A HREF="ftp://ftp.dante.de/tex-archive/systems/msdos/dos-tp/">tex-archive/systems/msdos/dos-tp/</A>
+</DD>
+</DL>
+
+<P>
+<HR>
+
+<ADDRESS>The NTS team</ADDRESS>
+
+<hr>
+Put on the WWW by Bernd Raichle, member of the NTS group;<br>
+subsequently updated by Philip Taylor,
+with corrections by Peter Breitenlohner.<br>
+last updated: 30-JUL-1997 19:31:47 (PT)<br>
+<FORM METHOD="POST" ACTION="http://www.webtechs.com/cgi-bin/html-check.pl">
+<INPUT NAME="recommended" VALUE="0" TYPE="hidden">
+<INPUT NAME="level" VALUE="Wilbur" TYPE="hidden">
+<INPUT NAME="input" VALUE="0" TYPE="hidden">
+<INPUT NAME="esis" VALUE="0" TYPE="hidden">
+<INPUT NAME="render" VALUE="0" TYPE="hidden">
+<a href="http://ugweb.cs.ualberta.ca/~gerald/validate
+ /?url=http://www.rhbnc.ac.uk/e-TeX/etex_ref.html">
+<img src="/www/logos/invalid_html3_2.gif" alt="HTML 3.2 Checked!">
+</a>
+<INPUT NAME="URLs"
+ VALUE="http://www.rhbnc.ac.uk/e-TeX/etex_ref.html"
+ TYPE="hidden"
+>
+<INPUT TYPE="image" SRC="/www/logos/invalid_html_wilbur.gif">
+</FORM>
+</BODY>
+</HTML>
diff --git a/systems/doc/etex/etex_src.html b/systems/doc/etex/etex_src.html
new file mode 100644
index 0000000000..e4e031adae
--- /dev/null
+++ b/systems/doc/etex/etex_src.html
@@ -0,0 +1,540 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head><title>The "etex.src" file and its adjuncts: V2.0</title>
+</HEAD><BODY>
+<H1>The e-T<sub><big>E</big></sub>X format source file
+<code>"etex.src" (V2.0)</code></H1>
+<p>
+The primary e-TeX format source file, <code>"etex.src"</code>, is in principle
+merely a wrapper for <code>"plain.tex"</code>, providing modified definitions
+for some Plain TeX commands (at present, just
+one:&nbsp;<code>\tracingall</code>), improving and generalising
+the register allocation mechanism, and adding new commands
+<p>
+In so doing, we have taken the opportunity to
+(a)&nbsp;provide intrinsic support for multiple-language
+typesetting (by deferring the processing of patterns and exceptions until a
+rudimentary language-handling environment has been defined),
+(b)&nbsp;provide a local as well as a global register allocation mechanism,
+(c)&nbsp;provide for the allocation of blocks of registers as well as single
+ registers,
+(d)&nbsp;provide a means of allocating and accessing <em>vectors</em>
+ (monodimensional arrays) of registers, and finally
+(e)&nbsp;provide a simple but effective module-handling system, to allow e-TeX
+ancilliary source files to be structured as libraries rather than as flat
+linear text files.
+<p>
+As the new commands and other features are not documented elsewhere,
+a brief explanation of their syntax and semantics is provided here.
+<p>
+<dl>
+<dt><code>\tracingall</code></dt>
+<dd>The definition is augmented to enable tracing for the new e-TeX
+ tracing primitives <code>\tracingassigns</code>,
+ <code>\tracinggroups</code>, <code>\tracingifs</code>,
+ <code>\tracingnesting</code>
+ and <code>\tracingscantokens</code>; the numeric value assigned
+ to the TeX primitives <code>\tracingcommands</code> and
+ <code>\tracinglostchars</code> is increased
+ as e-TeX will report additional detail in these circumstances.
+ <p>
+</dd>
+
+<dt><code>\eTeX</code></dt>
+<dd>A simple implementation of the e-TeX logo; a more sophisticated version,
+ capable of being used in maths sub/superscripts for example, may find
+ its way into <code>etexdefs.lib</code> in due course.
+ <p>
+</dd>
+
+<dt><code>\loggingall</code></dt>
+<dd>This command is equivalent to the sequence <code>\tracingall</code>
+ <code>\tracingonline = 0 </code>.
+ <p>
+</dd>
+
+<dt><code>\tracingnone</code></dt>
+<dd>This command restores the initial state of the various
+ <code>\tracing...</code> primitives following use of
+ <code>\tracingall</code> or <code>\loggingall</code>.
+ <p>
+</dd>
+
+<dt><code>\newmarks</code></dt>
+<dd>As e-TeX provides 2<sup>15</sup> <code>\marks</code> rather than the single
+ <code>\mark</code> of TeX, an allocator mechanism is required; we
+ believe that <code>\marks</code> are closer to
+ <code>\box</code>es than to (say) <code>\count</code>s or
+ <code>\dimen</code>s and so have provided an analogous allocation
+ mechanism, in that <code>\newmarks</code>&nbsp&lt;<code><em>control
+ sequence or active character</em></code>&gt; assigns a <em>numeric
+ value</em> to the parameter rather than making it a synonym for an
+ actual <code>\mark</code>; this numeric value can then be used to access
+ individual <code>\marks</code>, <code>\topmarks</code>,
+ <code>\splitbotmarks</code>,&nbsp;etc., as in
+<pre>
+ \newmarks \rectomarks
+ . . .
+ \marks \rectomarks {This may form part of the recto running head}
+ . . .
+ \leftline {\topmarks \rectomarks}
+</pre>
+ It should be noted that as <code>\marks 0</code> is synonymous with
+ <code>\mark</code>, <code>\newmarks</code> will never allocate that
+ particular value.
+ <br><em><strong>Note:</strong></em>
+ This command was called <code>\newmark</code> in V1.1; the alternative
+ spelling has been retained for compatibility, although it is now classed
+ as deprecated.
+ <p>
+</dd>
+
+<dt>
+<code>\globbox</code>,
+<code>\globcount</code>,
+<code>\globdimen</code>,
+<code>\globmarks</code>,
+<code>\globmuskip</code>,
+<code>\globskip</code>,
+<code>\globtoks</code>
+</dt>
+<dd>
+Analogous to TeX's <code>\newbox</code> (etc), these commands globally allocate
+registers from e-TeX's extended register pool (i.e.&nbsp;from the register
+range from 2<sup>0</sup> (for \marks) or from 2<sup>8</sup>
+(for all other classes) to 2<sup>15</sup>-1). Registers are globally
+allocated from the lower end of the range.
+<p>
+</dd>
+<dt>
+<code>\locbox</code>,
+<code>\loccount</code>,
+<code>\locdimen</code>,
+<code>\locmarks</code>,
+<code>\locmuskip</code>,
+<code>\locskip</code>,
+<code>\loctoks</code>
+</dt>
+<dd>
+Analogous to <code>\globbox</code> (etc), these commands locally allocate
+registers from e-TeX's extended register pool (i.e.&nbsp;from the register
+range from 2<sup>0</sup> (for \marks) or from 2<sup>8</sup>
+(for all other classes) to 2<sup>15</sup>-1). Registers are locally
+allocated from the upper end of the range.
+<p>
+</dd>
+<dt>
+<code>\globboxblk</code>,
+<code>\globcountblk</code>,
+<code>\globdimenblk</code>,
+<code>\globmarksblk</code>,
+<code>\globmuskipblk</code>,
+<code>\globskipblk</code>,
+<code>\globtoksblk</code>
+</dt>
+<dd>
+These commands extend <code>\globbox</code> (etc) by globally allocating
+contiguous blocks of registers from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \glob(whatever)blk &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token.
+The &lt;control sequence or active character&gt; will be
+<code>\mathchardef</code>'d to the ordinal of the lowest register allocated.
+<p>
+</dd>
+<dt>
+<code>\locboxblk</code>,
+<code>\loccountblk</code>,
+<code>\locdimenblk</code>,
+<code>\locmarksblk</code>,
+<code>\locmuskipblk</code>,
+<code>\locskipblk</code>,
+<code>\loctoksblk</code>
+</dt>
+<dd>
+These commands extend <code>\locbox</code> (etc) by locally allocating
+contiguous blocks of registers from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \loc(whatever)blk &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token.
+The &lt;control sequence or active character&gt; will be
+<code>\mathchardef</code>'d to the ordinal of the lowest register allocated.
+<p>
+</dd>
+<dt>
+<code>\globcountvector</code>,
+<code>\globdimenvector</code>,
+<code>\globmuskipvector</code>,
+<code>\globskipvector</code>,
+<code>\globtoksvector</code>
+</dt>
+<dd>
+An extension to <code>\globcountblk</code> (etc), these commands use
+e-TeX's arithmetic expression capabilities to globally allocate
+vectors of boxes (etc) from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \glob(whatever)vector &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token. Once the
+vector has been defined, element <em>m</em> can be accessed in both left-
+and right-hand contexts as
+<pre>
+ &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+where 0 &lt;= <em>m</em> &lt; <em>n</em>. As with <em>n</em>, <em>m</em>
+must be expressed as a balanced text if it exceeds a single token.
+<p>
+</dd>
+<dt>
+<code>\globboxvector</code>,
+<code>\globmarksvector</code>,
+</dt>
+<dd>
+Analogous to but subtly different from the above, these commands use
+e-TeX's arithmetic expression capabilities to globally allocate
+vectors of boxes (etc) from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \glob(box-or-marks)vector &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token. Once the
+vector has been defined, element <em>m</em> can be accessed in left-hand
+contexts as
+<pre>
+ &lt;box-or-marks-referencer&gt; &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+and in right-hand contexts as
+<pre>
+ &lt;box-or-marks-dereferencer&gt; &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+where 0 &lt;= <em>m</em> &lt; <em>n</em>. As with <em>n</em>, <em>m</em>
+must be expressed as a balanced text if it exceeds a single token.
+<p>
+The significance of <code>&lt;box-or-marks-(de)referencer&gt;</code> is that
+boxes and marks are unlike other registers in that there exists a whole family
+of (de)referencers, one of which must be used in order to access
+the particular element required. For boxes, the sole referencer is
+<code>\setbox</code>, whilst the possible dereferencers include
+<code>\box</code>,
+<code>\copy,</code>
+<code>\unhbox,</code>
+<code>\unvbox,</code>,
+<code>\unhcopy</code> and
+<code>\unvcopy</code>.
+For marks, the sole referencer is
+<code>\marks</code>, whilst the possible dereferencers include
+<code>\topmarks</code>,
+<code>\firstmarks</code>,
+<code>\botmarks</code>,
+<code>\splitfirstmarks</code> and
+<code>\splitbotmarks</code>.
+<p>
+</dd>
+<dt>
+<code>\loccountvector</code>,
+<code>\locdimenvector</code>,
+<code>\locmuskipvector</code>,
+<code>\locskipvector</code>,
+<code>\loctoksvector</code>
+</dt>
+<dd>
+An extension to <code>\loccountblk</code> (etc), these commands use
+e-TeX's arithmetic expression capabilities to locally allocate
+vectors of boxes (etc) from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \loc(whatever)vector &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token. Once the
+vector has been defined, element <em>m</em> can be accessed in both left-
+and right-hand contexts as
+<pre>
+ &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+where 0 &lt;= <em>m</em> &lt; <em>n</em>. As with <em>n</em>, <em>m</em>
+must be expressed as a balanced text if it exceeds a single token.
+<p>
+</dd>
+<dt><code>\locboxvector</code>,
+<code>\locmarksvector</code>,
+</dt>
+<dd>
+Analogous to but subtly different from the above, these commands use
+e-TeX's arithmetic expression capabilities to locally allocate
+vectors of boxes (etc) from e-TeX's extended register pool.
+The syntax used is:
+<pre>
+ \loc(box-or-marks)vector &lt;control sequence or active char&gt; <em>n</em>
+</pre>
+where <em>n</em> specifies the length of the desired block. As
+<em>n</em> is parsed as an undelimited parameter, it must be
+expressed as a balanced text if it exceeds a single token. Once the
+vector has been defined, element <em>m</em> can be accessed in left-hand
+contexts as
+<pre>
+ &lt;box-or-marks-referencer&gt; &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+and in right-hand contexts as
+<pre>
+ &lt;box-or-marks-dereferencer&gt; &lt;control sequence or active char&gt; <em>m</em>
+</pre>
+where 0 &lt;= <em>m</em> &lt; <em>n</em>. As with <em>n</em>, <em>m</em>
+must be expressed as a balanced text if it exceeds a single token.
+<p>
+The significance of <code>&lt;box-or-marks-(de)referencer&gt;</code> is that
+boxes and marks are unlike other registers in that there exists a whole family
+of (de)referencers, one of which must be used in order to access
+the particular element required. For boxes, the sole referencer is
+<code>\setbox</code>, whilst the possible dereferencers include
+<code>\box</code>,
+<code>\copy,</code>
+<code>\unhbox,</code>
+<code>\unvbox,</code>,
+<code>\unhcopy</code> and
+<code>\unvcopy</code>.
+For marks, the sole referencer is
+<code>\marks</code>, whilst the possible dereferencers include
+<code>\topmarks</code>,
+<code>\firstmarks</code>,
+<code>\botmarks</code>,
+<code>\splitfirstmarks</code> and
+<code>\splitbotmarks</code>.
+<p>
+</dd>
+<dt><code>\reserveinserts</code></dt>
+<dd>As there are now so many registers available, there is a risk that a macro
+package may allocate so many that there are none of the first 255
+left for use by insertions (which cannot use the extended register set).
+<code>\reserveinserts</code> <em>n</em> allows a package writer or user to
+reserve an additional <em>n</em> insertions above and beyond those already
+allocated. The syntax used is:
+<pre>
+ \reserveinserts <em>n</em>
+</pre>
+<em>n</em> must be expressed as a balanced text if it exceeds a single token.
+<p>
+</dd>
+
+<dt><code>\load</code></dt>
+<dd>Although (Plain) TeX provides facilities for either
+ <code>\input</code>ting a complete file or for <code>\read</code>ing a
+ file line-by-line, it makes no provision for any intermediate level of
+ file access. In e-TeX, we provide facilities for
+ <code>\input</code>ting one or more named <em>modules</em> from a
+ suitably structured library file. The syntax used is:
+<pre>
+ \load &lt;<em>module</em>&gt;[, &lt;<em>module</em>&gt;...] from &lt;<em>file</em>&gt;
+</pre>
+ whilst the library file itself should be structured as:
+<pre>
+ %% e-TeXlib Vx.y
+ \module {&lt;<em>name</em>&gt;}
+ . . .
+ \endmodule
+
+ \module {&lt;<em>name</em>&gt;}
+ . . .
+ \endmodule
+
+ etc.
+</pre>
+ The %% header is required, and the actual values in
+ <code>Vx.y</code> must correspond to the current version/revision
+ of e-TeX; for the current release, the header must therefore
+ be:
+<pre>
+ %% e-TeXlib V2.0
+</pre>
+ If a library file is changed during the lifetime of the system, it
+ is <em>recommended</em> (but not required) that this amendment be
+ recorded in a <em>cycle number</em> appended to the header;
+ a <em>cycle number</em> is of the form <code>;</code><em>digit[s]</em>,
+ and thus a valid header for the current release of e-TeX might be
+ any of:
+<pre>
+ %% e-TeXlib V2.0
+ %% e-TeXlib V2.0;1
+ %% e-TeXlib V2.0;247
+</pre>
+ etc. The necessity for a perfect match between the library header
+ and the current version/revision of e-TeX may be relaxed in a future
+ release if it transpires that no changes in the structure of user
+ libraries are required for compatibility with future versions of e-TeX.
+ <p>
+</dd>
+
+<dt>Modules in the standard library (<code>etexdefs.lib</code>)</dt>
+<dd>
+e-TeX is distributed with a standard library which provides mnemonic
+names for the various values which can be returned by the new primitives.
+The library contains four modules:
+<code>grouptypes</code>,
+<code>nodetypes</code>,
+<code>interactionmodes</code> and
+<code>iftypes</code>. The standard format source, <code>etex.src</code>,
+loads <code>interactionmodes</code> by default; the others can be loaded
+using the appropriate one of the following:
+<pre>
+ \load grouptypes from etexdefs.lib
+ \load nodetypes from etexdefs.lib
+ \load iftypes from etexdefs.lib
+</pre>
+Once the relevant module has been loaded, the numeric values
+associated with each of the possible types/modes can be retrieved
+using one of the following commands with one of the parameters shewn:
+<pre>
+ \grouptypes
+ {simple}
+ {hbox}
+ {adjustedhbox}
+ {vbox}
+ {vtop}
+ {align}
+ {noalign}
+ {output}
+ {math}
+ {disc}
+ {insert}
+ {vcenter}
+ {mathchoice}
+ {semisimple}
+ {mathshift}
+ {mathleft}
+
+ \nodetypes
+ {char}
+ {hlist}
+ {vlist}
+ {rule}
+ {ins}
+ {mark}
+ {adjust}
+ {ligature}
+ {disc}
+ {whatsit}
+ {math}
+ {glue}
+ {kern}
+ {penalty}
+ {unset}
+ {maths}
+
+ \conditionaltypes
+ {charif}
+ {catif}
+ {numif}
+ {dimif}
+ {oddif}
+ {vmodeif}
+ {hmodeif}
+ {mmodeif}
+ {innerif}
+ {voidif}
+ {hboxif}
+ {vboxif}
+ {xif}
+ {eofif}
+ {trueif}
+ {falseif}
+ {caseif}
+ {definedif}
+ {csnameif}
+ {fontcharif}
+
+ \interactionmodes
+ {batch}
+ {nonstop}
+ {scroll}
+ {errorstop}
+</pre>
+</dd>
+
+<dt>Multiple language typesetting</dt>
+<dd>When TeX gained <code>\language</code> and
+ <code>\setlanguage</code> primitives with the advent of TeX 3.0, no
+ change was made to the Plain TeX source code to really exploit these
+ features with the single exception of the <code>\newlanguage</code>
+ command. In "<code>etex.src</code>", we defer the loading of
+ <em>patterns</em> and <em>hyphenation exceptions</em> until a
+ rudimentary language handling environment has been defined. We now
+ assume that the user (or rather the format-creator) will,
+ if required, modify the file
+ called "<code>language.def</code>" by adding the
+ various languages to be supported by the format. Each entry apart from
+ the last in "<code>language.def</code>" is of the form:
+<pre>
+ \addlanguage {&lt;<em>language</em>&gt;}
+ {&lt;<em>patterns file</em>&gt;}
+ {&lt;<em>exceptions file</em>&gt;}
+ {&lt;<em>left hyphen min</em>&gt;}
+ {&lt;<em>right hyphen min</em>&gt;} %%% shewn wrapped for clarity
+</pre>
+ The first line <em><strong>must</strong></em> be:
+<pre>
+ \addlanguage {USenglish}{hyphen.tex}{}{2}{3}
+</pre>
+ whilst the last must be
+<pre>
+ \uselanguage {USenglish}
+</pre>
+ to ensure that legacy documents not explicitly specifying a language
+ process in a manner identical to TeX (that is, using American English
+ patterns, exceptions and left- and right-hyphen minima).
+ In the absence of a suitable <code>language.def</code>
+ file, the default fallback mode (USenglish, with the canonical patterns,
+ exceptions and left- and right-hyphen minima for TeX) will be used.
+ Within the user document, <code>\uselanguage {&lt;<em>some
+ language</em>&gt;}</code> should be used to switch languages, which
+ will have the effect of loading appropriate patterns, exceptions, and
+ left- and right hyphen minima. To allow the use of more powerful
+ language-handling environments (e.g.&nbsp;<a
+ href="http://homepage.cistron.nl/~jlbraams/babel.html">Babel</a>),
+ the <code>\uselanguage</code> command finishes by testing whether the
+ putative control sequence <code>\uselanguage@hook</code> is defined; if
+ it is, then it is expanded, passing as parameter the name of the
+ language to be used. It should be noted that <code>\uselanguage</code>
+ is automatically invoked during the expansion of
+ <code>\addlanguage</code> <em>prior</em> to the reading of patterns;
+ a further hook, <code>\addlanguage@hook</code>, is invoked in an
+ identical manner <em>after</em> the reading of patterns and exceptions
+ so as to allow (for example) category-codes to be changed for the
+ duration of the pattern- and exception-loading rgime. This code is
+ still classed as experimental, and if it transpires that a superior
+ mechanism would improve the interface to
+ <a href="http://homepage.cistron.nl/~jlbraams/babel.html">Babel</a>
+ or <a href="http://www.tex.ac.uk/CTAN/latex/">LaTeX</a>, it may be
+ enhanced in the future.
+ <p>
+</dd>
+</dl>
+<p>
+The e-TeX format source "etex.src" is a product of
+<a href="/e-TeX/NTS-Group.Html">the NTS group</a>.
+<hr>
+<p>
+Please notify any errors in this document to <a
+href="http://www.vms.rhbnc.ac.uk/~chaa006/">its creator</a>;<br>
+Last updated and
+<a href="http://validator.w3.org/check?url=http://www.rhbnc.ac.uk/e-TeX/v2/src/etex_src.html">
+validated
+</a>
+ 24-MAR-1998 19:45:12
+/PT<br>
+<img src="/logos/vh40.gif" alt="W3C HTML 4.0 validated.">
+</body>
+</html>
diff --git a/systems/doc/etex/legal.html b/systems/doc/etex/legal.html
new file mode 100644
index 0000000000..986bb351b6
--- /dev/null
+++ b/systems/doc/etex/legal.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head><title>e-TeX legal status</title>
+</HEAD><BODY>
+<H1>The legal status of e-T<sub><big>E</big></sub>X </H1>
+When <a href="http://www-cs-faculty.stanford.edu/~knuth/">Professor Donald
+E.&nbsp;Knuth</A> released TeX to the world, he did so in a simple and
+straightforward way which allowed users everywhere to benefit from his work
+whilst protecting them from pirated and illegal versions. He did so without
+pages of legalese, using simple language and in terms that are readily
+understood <p>
+In creating e-TeX, we have followed his example: we
+release
+e-TeX to the world under exactly the same conditions as Don
+released TeX. The name e-TeX is a trademark of the
+<a href="nts-group.html">NTS group</a>,
+as are its typeset and HTML logos. No package may describe
+itself as "e-TeX" unless (a)&nbsp;it is generated using the official
+source files from the e-TeX reference site, together with such
+system-dependent changes as are necessary and permitted in order
+for it to run on a specific system, and (b)&nbsp;it has been validated
+for conformity using the <a href="etrip.zip">e-TRIP</a> test.
+<p>
+No changes shall be made by anyone other than a member of the
+NTS group to any of the files which form a part of the e-TeX
+distribution. If, for whatever reason, someone other than
+a member of the NTS group wishes to change such a file, then
+he or she shall (a) add a comment indicating the reason for,
+and nature of the change, together with the date and the name
+of the person making the change, and (b) shall save the changed
+file under a different name, so that there shall exist no
+risk of confusion between the changed file and the authoritative
+official version.
+<p>
+Although it is <em>preferred</em> that e-TeX be distributed in
+source form, it is recognised that there are systems for which
+binary distributions are the norm. It is therefore
+<em>required</em> that any binary distribution of e-TeX be
+accompanied by a clear statement that the definitive sources
+for e-TeX are available free-of-charge at the
+<a href="http://www.rhbnc.ac.uk/e-TeX/">e-TeX reference site</a>.
+<p>
+With the exception of anything specifically referred to above,
+all components of the system known as "e-TeX" are
+released under exactly the same terms and conditions as the
+system known as "TeX".
+<p>
+Enjoy!
+<hr>
+Release date: 11th November 1996
+</body>
+</html>
diff --git a/systems/doc/etex/nts-group.html b/systems/doc/etex/nts-group.html
new file mode 100644
index 0000000000..f5da083398
--- /dev/null
+++ b/systems/doc/etex/nts-group.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head><title>The NTS Group</title>
+</HEAD><BODY>
+<H1>The <em>N<sub><big>T</big></sub>S</em> Group</H1>
+The NTS group was created under the gis of
+<a href="http://www.dante.de/Welcome_english.html">
+<strong>D</strong><small><b>ANTE</b></small>&nbsp;e.<small>V</small></A>
+at Hamburg in
+1992. Its brief was "to perpetuate and develop the spirit and philosophy of
+TeX, whilst respecting Knuth's wish that TeX should remain frozen".
+<p>
+The group is currently composed of the following members:
+<ul>
+<li><a href="mailto:joachim.lammarsch@urz.uni-heidelberg.de">
+ Joachim Lammarsch</a>, managing director;
+<li><a href="http://www.vms.rhbnc.ac.uk/~chaa006/">Philip Taylor</a>,
+ technical director;
+<li><a href="mailto:peb@mppmu.mpg.de">Peter Breitenlohner</a>,
+ head of e-TeX development;
+<li><a href="http://www.fi.muni.cz/~zlatuska/">Jiri Zlatuska</a>,
+ head of NTS development;
+<li>
+<a href="http://www.informatik.uni-stuttgart.de/ifi/is/Personen/raichle.html">
+ Bernd Raichle</a>, 2-i/c, e-TeX & NTS projects;
+<li><a href="mailto:sowa@clio.rz.uni-duesseldorf.de">Friedhelm Sowa</a>,
+ graphics and user interfaces.
+</ul>
+The group's primary activity at this time is the development of
+<a href="http://www.rhbnc.ac.uk/e-TeX/">e-TeX</a>; in abeyance, awaiting
+adequate funding, is the much longer-term project "NTS" from which the group
+takes its name.
+<p>
+The group gratefully acknowledges the contribution made by
+previous members including, but not restricted to,
+Rainer Schpf and Joachim Schrod.
+The group also gratefully acknowledges the support (both
+financial and otherwise) given by the members of
+<strong>D</strong><small><b>ANTE</b></small>&nbsp;e.<small>V</small>.
+to the work of the project.
+</body>
+</html>
diff --git a/systems/doc/etex/webmerge.tex b/systems/doc/etex/webmerge.tex
new file mode 100644
index 0000000000..a55ac3e930
--- /dev/null
+++ b/systems/doc/etex/webmerge.tex
@@ -0,0 +1,392 @@
+% This is webmerge.tex
+% Copyright (C) 1995,96 by the NTS team; all rights are reserved.
+%
+\def\fileversion{V 1.1}
+\def\filedate{29 Mar 96}
+%
+% In order to generate e-TeX several change files have to be applied
+% (one after the other) to tex.web. This can be done efficiently with
+% programs such as PATCHWEB or TIE. If neither of these is available
+% the present program WEBMERGE can be used to merge several change
+% files into one change file that can then be used with TANGLE.
+%
+% If the web file or one of the change files contains tab of form feed
+% characters there is, however, a problem that can't be solved in a
+% satisfactory way. This should not be a real problem since the
+% original tex.web and etex.ch don't contain these characters and there
+% is no real good reason why the system-dependent change files should
+% (except may be that some editors insist on converting sequences of
+% space characters into tabs).
+%
+% The problem is due to the fact that (an unmodified) TeX cannot write
+% tabs or form feeds to the output file. Therefore WEBMERGE offers two
+% alternatives: if \ifallowtabs is false (by default) then tab and form
+% feed characters are invalid and lead to error messages; if this
+% happens one may use the command
+% \allowtabstrue
+% to allow tab and form feed as valid input characters. If they are
+% written to the output file they will appear as '^^I' and '^^L'. This
+% must then be changed manually with a suitable editor before the output
+% from WEBMERGE can be used as input for TANGLE.
+%
+% Typically three change files are required to generate e-TeX, e.g.,
+% 1. etex.ch (system independent changes for e-TeX)
+% 2. tex.ch (system dependent changes for TeX)
+% 3. tex.ech (additional system dependent changes for e-TeX)
+% The sequence commands (to be used with plain TeX)
+% \input webmerge
+% \webfile{tex.web} % web file
+% \changefile{etex.ch} % 1. change file
+% \changefile{tex.ch} % 2. change file
+% \changefile{tex.ech} % 3. change file
+% \outfile{etex.ch} % output file, start processing
+% creates a combined change file `etex.ch'.
+% Webmerge uses a temporary file with default name `tmp.tmp',
+% the command
+% \tempfile{<temp name>}
+% can be used to change that name.
+%
+% Webmerge is slow, therefore PATCHWEB or TIE should be used whenever
+% possible. The program checks for correct change files and gives error
+% messages similar to those of TANGLE and WEAVE. The error recovery is,
+% however, rather limited.
+%
+% In case of problems please contact:
+% Peter Breitenlohner peb@mppmu.mpg.de
+
+% We make @ signs act like letters, temporarily.
+\catcode`\@=11
+
+\newif\ifallowtabs % initially false
+\def\allowtabs{\catcode`\^^I=12 \catcode`\^^L=12 }
+\def\forbidtabs{\catcode`\^^I=15 \catcode`\^^L=15 }
+
+\toksdef\toks@ii=2
+
+% First we redefine plain.tex's \loop to allow the construction
+% \loop ... \if... \else ... \repeat
+%
+\def\@iterate{\@body \expandafter\@iterate\fi}
+%
+% and to allow nested loops such as
+% \loop{... \loop ... \if... \repeat ... \if...}\repeat
+% where the braces do not imply grouping
+%
+\def\loop#1\repeat{%
+ \toks@\expandafter{\@body}%
+ \toks@ii\expandafter{\@@body}%
+ \edef\@@body{\def\noexpand\@body{\the\toks@}%
+ \def\noexpand\@@body{\the\toks@ii}}%
+ \def\@body{#1}\@iterate \@@body}
+\let\@body=\empty
+\let\@@body=\empty
+
+%
+\def\@msg{\immediate\write\sixt@@n}
+\@msg{*** webmerge \fileversion\space <\filedate> ***}
+%
+% Conceptually the web file (web_0) is combined with the first change
+% file, ch_1, in order to produce a ficticious web file web_1. Then
+% web_1 is combined with ch_2 in order to produce web_2 etc.
+
+% The logic of merging is that of TANGLE and WEAVE.
+% With several change files there may, however, be changes on top of
+% changes, i.e., a line changed by one change file may be changed again
+% by another change file.
+
+% The program below uses quite a few control sequences, many of them
+% constructed dynamically.
+% The most important ones are \<i>read (<i>=0,1,...) used to obtain the
+% next line from web_<i>. For reasons of efficiency they are \let to
+% either \<i>w (changing=false), \<i>c (changing=true), of \<i>e (file
+% has ended).
+% \<i>g is used to obtain the next line from ch_<i> and test for
+% @x/@y/@z,
+% \<i>prime (prime the change buffer) scans for the next @x from ch_<i>,
+% and \<i>match discards matching lines from web_<i-1> and ch_<i> until
+% an @y is found.
+
+\def\tempfile#1{\def\t@n{#1}}
+\def\t@n{tmp.tmp} % default tempfile name
+\newread\t@r % read tempfile
+\newwrite\t@w % write tempfile
+\def\t@o{\immediate\write\t@w} % write to tempfile
+\newwrite\o@w % write output file
+\def\o@o{\immediate\write\o@w} % write to outfile
+
+\newcount\@nch % number of change files
+\newcount\@num % number of active changes
+\newcount\@res % result from @x/@y/@z test
+\begingroup % \@pct expands to `% '
+ \lccode`\1=`\%
+ \lowercase{\endgroup \def\@pct{1 }}
+%
+
+% We need macros to define read streams, count registers, and control
+% sequences dynamically (inside \edef)
+
+\def\@nrd#1{\ifx#1\relax \csname newread\endcsname#1\fi}
+\def\@nct#1{\ifx#1\relax \csname newcount\endcsname#1\else #1\z@ \fi}
+\def\@cs#1{\csname#1\endcsname}
+\def\@csi#1{\csname\@i#1\endcsname}
+\def\@dcs#1{\expandafter\def\csname#1\endcsname}
+\def\@ecsi#1{\expandafter\edef\csname\@i#1\endcsname}
+\def\@ncsi#1{\expandafter\noexpand\csname\@i#1\endcsname}
+\def\@read{\expandafter\noexpand\csname\@ii read\endcsname}
+\def\@ifx{\noexpand\ifx}
+\def\@ifnum{\noexpand\ifnum}
+\def\@ifeof{\noexpand\ifeof\@csi r}
+\def\@else{\noexpand\else}
+\def\@fi{\noexpand\fi}
+\def\@loop{\noexpand\loop}
+\def\@repeat{\noexpand\repeat}
+\def\@expa{\noexpand\expandafter\noexpand}
+\def\@expai#1{\expandafter\@expa\csname\@i#1\endcsname}
+
+\def\webfile#1{% define webfile
+ \ifnum\@nch=\m@ne \@nch\z@ \@dcs{0n}{#1}%
+ \else \@msg{\string\webfile{#1} ignored (out of order)}%
+ \fi}
+\def\changefile#1{% define a changefile
+ \ifnum\@nch<\z@
+ \@msg{\string\changefile{#1} ignored (missing \string\webfile)}%
+ \else \ifnum\@nch>8 \@msg{\string\changefile{#1} ignored (too many)}%
+ \else \advance\@nch\@ne \@dcs{\number\@nch n}{#1}%
+ \fi \fi}
+\def\outfile#1{% define outfile and process
+ \ifnum\@nch<\@ne
+ \@msg{\string\outfile{#1} ignored (missing \string\changefile)}%
+ \else \def\o@n{#1}\@init \@merge \@done
+ \fi}
+\def\@init{% initialize
+ \@msg{}\@msg{webmerge \fileversion\space <\filedate>}%
+ \immediate\openout\o@w=\o@n
+ \o@o{\@pct This is \o@n, a WEB change file produced by webmerge.tex}%
+ \begingroup
+ \def\do##1{\catcode`##1=12 }\dospecials
+ \ifallowtabs \allowtabs \else \forbidtabs \fi
+ \endlinechar=\m@ne
+ \count@\z@
+ \loop \edef\@i{\number\count@}\@@init
+ \ifnum\count@<\@nch \advance\count@\@ne \let\@ii\@i
+ \repeat
+ \o@o{}%
+ \@msg{out=\o@n, merging ...}}
+%
+% Here now is the quite complicated macro \@@init
+% its main purpose is to dynamically construct
+% the macro \<i>read that returns the next line of web_<i> in \@web
+% as well as various auxiliary macros \<i>...
+%
+\def\@@init{% initialize input file <i>
+ \edef\x{% define \read streams and \count registers
+ \noexpand\@nrd\@ncsi r% \newread\<i>r
+ \noexpand\@nct\@ncsi l% \newcount\<i>l (line number)
+ \noexpand\@nct\@ncsi s% \newcount\<i>s (status)
+ }\x \@csi l\z@ \@csi s\z@ % \<i>l=0 \<i>s=0
+ \openin\@csi r\@csi n % \openin\<i>r=\<i>n
+ \@msg{\ifeof\@csi runable to open input file
+ \else \ifnum\@i=\z@ web\else change \@i\fi =\fi \@csi n}%
+ \ifnum\count@=\z@ % <i>=0 for web file
+ \let\@web\relax
+%%
+%% \def\0w{% return web_0 line (file not yet ended)
+%% \read\0r to\@web \0s=0 % read from web_0, mark as unchanged
+%% \ifeof\0r \0e \else \advance\0l by 1 \fi}
+%%
+ \@ecsi w{% return web_0 line (file not yet ended)
+ \read\@csi rto\@web \@csi s\z@
+ \@ifeof \@ncsi e\@else \advance\@csi l\@ne \@fi}%
+%%
+%% \def\0e{% return web_0 line (file has ended)
+%% \let\0read=\0e \let\@web=\relax}
+%%
+ \@ecsi e{% return web_0 line (file has ended)
+ \let\@ncsi{read}\@ncsi e\let\@web\relax}%
+%%
+%% \ifeof\0r \0e \else \let\0read=\0w
+%%
+ \ifeof\@csi r\@csi e%
+ \else \edef\x{\let\@ncsi{read}\@ncsi w}\x
+ \fi
+ \o@o{\@pct to be applied to \@csi n}%
+ \o@o{\@pct combining the changes (one after the other) from}%
+ \else % <i>=1,2,3,... for change files
+ \o@o{\@pct \@i. \@csi n}%
+%%
+%% \def\<i>g#1{% read change file and test for @x/@y/@z
+%% \ifeof\<i>r \let\<i>x=\relax \@res=#1
+%% \else \@res=0 \read\<i>r to\<i>x
+%% \advance\<i>l by 1 \expandafter\@test\<i>x ab\@#1<i>
+%% \fi}
+%%
+ \@ecsi g##1{% read change file and test for @x/@y/@z
+ \@ifeof \let\@ncsi x\relax \@res##1%
+ \@else \@res\z@ \read\@csi rto\@ncsi x%
+ \advance\@csi l\@ne \@expa\@test\@ncsi xab\noexpand\@##1\@i
+ \@fi}%
+%%
+%% \def\<i>w{% return web_i line (changing is false)
+%% \<i-1>read % get web_<i-1> line
+%% \ifx\@web\<i>x % test for match
+%% \expandafter\<i>match % match lines from web_i-i and ch_i
+%% \fi} % else return web_<i-1> line
+%%
+ \@ecsi w{% return web_i line (changing is false)
+ \@read \@ifx\@web\@ncsi x\@expai{match}\@fi}%
+%%
+%% \def\<i>c{% return web_i line (changing is true)
+%% \<i>g 3 % get ch_i line and test for @z
+%% \ifnum\@res=3 % @z found
+%% \@echg <i> % deactivate a change
+%% \<i>prime % prime the change buffer
+%% \expandafter\<i>read % read again, now from web_<i-1>
+%% \else \@mod\<i>x % return ch_i line, mark as changed (\0s=1)
+%% \fi}
+%%
+ \@ecsi c{% return web_i line (changing is true)
+ \@ncsi g\thr@@
+ \@ifnum\@res=\thr@@
+ \noexpand\@echg\@i \@ncsi{prime}\@expai{read}%
+ \@else \noexpand\@mod\@ncsi x%
+ \@fi}%
+%%
+%% \def\<i>e{% return web_i line (change file has ended)
+%% \<i-1>read} % return web_<i-1> line
+%%
+ \@ecsi e{% return web_i line (change file has ended)
+ \@read}%
+%%
+%% \def\<i>prime{% prime the change buffer
+%% \loop
+%% \<i>g 1 % get ch_i line and test for @x
+%% \ifnum\@res=1 \else \repeat % repeat until found
+%% \loop
+%% \<i>g 0 % get ch_i line
+%% \ifx\<i>x\empty \repeat % repeat until not blank line
+%% \ifx\<x>\relax \let\<i>read=\<i>e % change file has ended
+%% \else \let\<i>read=\<i>w %
+%%
+ \@ecsi{prime}{% prime the change buffer
+ \@loop \@ncsi g\@ne \@ifnum\@res=\@ne \@else \@repeat
+ \@loop \@ncsi g\z@ \@ifx\@ncsi x\noexpand\empty \@repeat
+ \@ifx\@ncsi x\relax \let\@ncsi{read}\@ncsi e%
+ \@else \let\@ncsi{read}\@ncsi w%
+ \@fi}%
+%%
+%% \def\<i>match{% match lines from web_<i-1> and ch_<i>
+%% \ifx\@web\relax % web_<i-1> and ch_<i> have ended
+%% \let\<i>read=\<i>e \<i> % indicate web_<i> has ended
+%% \else \@bchg % activate a change
+%% \loop \@chg % write a matching line to output (maybe)
+%% \<i>g 2 % get ch_i line and test for @y
+%% \ifnum\@res=2 \@endm <i> % end of match found
+%% \else \<i-1>read % get web_<i-1> line
+%% \ifx\@web\relax % test for end of web file
+%% \@err <i>{Web file ended during change}
+%% \fi
+%% \ifx\@web\<i>x % test for matching lines
+%% \else \advance\<i>s by 1 \fi % count mismatches
+%% \repeat
+%% \let\<i>read=\<i>c % now changing is true
+%% \fi
+%% \<i>read} % get next web_<i> line again
+%%
+ \@ecsi{match}{% match lines from web_<i-1> and ch_<i>
+ \@ifx\@web\relax
+ \let\@ncsi{read}\@ncsi e%
+ \@else \noexpand\@bchg
+ \@loop \noexpand\@chg \@ncsi g\tw@
+ \@ifnum\@res=\tw@ \noexpand\@endm\@i%
+ \@else \@read
+ \@ifx\@web\relax
+ \noexpand\@err\@i{Web file ended during change}%
+ \@fi
+ \@ifx\@web\@ncsi x\@else \advance\@csi s\@ne \@fi
+ \@repeat
+ \let\@ncsi{read}\@ncsi c%
+ \@fi
+ \@ncsi{read}}%
+%%
+%% \<i>prime % prime the change buffer
+%%
+ \@csi{prime}% prime the change buffer
+ \fi}
+\def\@done{%terminate
+ \count@\z@
+ \loop \edef\@i{\number\count@}%
+ \ifnum\count@=\z@ \else % change file
+ \ifeof\@csi r\else \@@err{Change file entry didn't match}\fi
+ \fi
+ \closein\@csi r% close input file <i>
+ \ifnum\count@<\@nch \advance\count@\@ne
+ \repeat
+ \endgroup
+ \immediate\closeout\o@w
+ \@nch\m@ne % prepare for next \webfile
+ \@msg{... done}\@msg{}}
+
+\catcode`\0=11 % for \0s
+\def\@merge{% process
+ \@num\z@
+ \expandafter\loop\csname\number\@nch read\endcsname % read web_<n>
+ \ifnum\0s=\@ne \t@o{\@web}\fi
+ \ifx\@web\relax
+ \else
+ \repeat}
+\def\@chg{\ifnum\0s=\z@ \o@o{\@web}\fi}
+\def\@mod{\0s\@ne \let\@web}
+\catcode`\0=12
+
+\def\@err#1{\def\@i{#1}\@@err}
+\def\@@err#1{\@msg{! #1}%
+ \@msg{ ... change file \@i\space (\@csi n) line \the\@csi l}}
+
+\def\@test#1#2#3\@{\if#1@ \csname set@#2\endcsname \fi \@eat}
+\def\@eat#1#2{}
+\def\set@x{\@res\@ne \expandafter\@xyz}
+\def\set@y{\@res\tw@ \expandafter\@xyz}
+\def\set@z{\@res\thr@@ \expandafter\@xyz}
+\let\set@X=\set@x
+\let\set@Y=\set@y
+\let\set@Z=\set@z
+\def\@xyz\@eat#1#2{%
+ \ifnum#1=\@res
+ \else \@err#2{Extra \@@xyz{\@res} ignored (expecting \@@xyz#1)}%
+ \@res\z@
+ \fi}
+\def\@@xyz#1{@\ifcase#1\or x\or y\or z\fi}
+
+\def\@endm#1{%
+ \ifnum\csname#1s\endcsname>\z@
+ \@err#1{Hmm... \the\@csi s of the preceding lines failed to match}%
+ \fi
+ \csname#1s\endcsname\z@}
+
+\def\@bchg{% activate a change
+ \ifnum\@num=\z@ % first change activated, start writing to temp
+ \immediate\openout\t@w=\t@n\space
+ \o@o{@x l.\number\csname 0l\endcsname}
+ \fi
+ \advance\@num\@ne}
+\def\@echg#1{% deactivate a change
+ \expandafter\ifx\csname#1x\endcsname\relax
+ \@err#1{Change file ended during change}%
+ \fi
+ \advance\@num\m@ne
+ \ifnum\@num=\z@ % last change deactivated
+ \t@o{@z}%
+ \immediate\closeout\t@w % close temp file
+ \openin\t@r=\t@n\space
+ \o@o{@y}
+ \loop \read\t@r to\t@x \o@o{\t@x}% copy temp to output
+ \ifeof\t@r \closein\t@r
+ \else
+ \repeat
+ \fi}
+
+\@nch=\m@ne
+
+\catcode`\@=12 % at signs are no longer letters
+
+\endinput
diff --git a/systems/doc/kpathsea/kpathsea.html b/systems/doc/kpathsea/kpathsea.html
new file mode 100644
index 0000000000..cac5c2a91f
--- /dev/null
+++ b/systems/doc/kpathsea/kpathsea.html
@@ -0,0 +1,5241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- This file documents the Kpathsea library for path searching.
+
+Copyright (C) 1996-2019 Karl Berry & Olaf Weber.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the TeX Users Group. -->
+<!-- Created by GNU Texinfo 6.6, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Kpathsea: A library for path searching</title>
+
+<meta name="description" content="Kpathsea: A library for path searching">
+<meta name="keywords" content="Kpathsea: A library for path searching">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="makeinfo">
+<link href="#Top" rel="start" title="Top">
+<link href="#Index" rel="index" title="Index">
+<link href="#SEC_Contents" rel="contents" title="Table of Contents">
+<link href="http://tug.org/texinfohtml" rel="up" title="(dir)">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+blockquote.indentedblock {margin-right: 0em}
+div.display {margin-left: 3.2em}
+div.example {margin-left: 3.2em}
+div.lisp {margin-left: 3.2em}
+kbd {font-style: oblique}
+pre.display {font-family: inherit}
+pre.format {font-family: inherit}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+span.nolinebreak {white-space: nowrap}
+span.roman {font-family: initial; font-weight: normal}
+span.sansserif {font-family: sans-serif; font-weight: normal}
+ul.no-bullet {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<h1 class="settitle" align="center">Kpathsea: A library for path searching</h1>
+
+
+
+
+
+
+
+
+
+<span id="SEC_Contents"></span>
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="no-bullet">
+ <li><a id="toc-Introduction-1" href="#Introduction">1 Introduction</a>
+ <ul class="no-bullet">
+ <li><a id="toc-History-1" href="#History">1.1 History</a></li>
+ </ul></li>
+ <li><a id="toc-unixtex_002eftp_003a-Obtaining-TeX" href="#unixtex_002eftp">2 <samp>unixtex.ftp</samp>: Obtaining TeX</a></li>
+ <li><a id="toc-Security-1" href="#Security">3 Security</a></li>
+ <li><a id="toc-TeX-directory-structure-1" href="#TeX-directory-structure">4 TeX directory structure</a></li>
+ <li><a id="toc-Path-searching-1" href="#Path-searching">5 Path searching</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Searching-overview-1" href="#Searching-overview">5.1 Searching overview</a></li>
+ <li><a id="toc-Path-sources-1" href="#Path-sources">5.2 Path sources</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Config-files-1" href="#Config-files">5.2.1 Config files</a></li>
+ </ul></li>
+ <li><a id="toc-Path-expansion-1" href="#Path-expansion">5.3 Path expansion</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Default-expansion-1" href="#Default-expansion">5.3.1 Default expansion</a></li>
+ <li><a id="toc-Variable-expansion-1" href="#Variable-expansion">5.3.2 Variable expansion</a></li>
+ <li><a id="toc-Tilde-expansion-1" href="#Tilde-expansion">5.3.3 Tilde expansion</a></li>
+ <li><a id="toc-Brace-expansion-1" href="#Brace-expansion">5.3.4 Brace expansion</a></li>
+ <li><a id="toc-KPSE_005fDOT-expansion-1" href="#KPSE_005fDOT-expansion">5.3.5 <code>KPSE_DOT</code> expansion</a></li>
+ <li><a id="toc-Subdirectory-expansion-1" href="#Subdirectory-expansion">5.3.6 Subdirectory expansion</a></li>
+ </ul></li>
+ <li><a id="toc-Casefolding-search-1" href="#Casefolding-search">5.4 Casefolding search</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Casefolding-rationale-1" href="#Casefolding-rationale">5.4.1 Casefolding rationale</a></li>
+ <li><a id="toc-Casefolding-examples-1" href="#Casefolding-examples">5.4.2 Casefolding examples</a></li>
+ </ul></li>
+ <li><a id="toc-Filename-database-_0028ls_002dR_0029" href="#Filename-database">5.5 Filename database (<code>ls-R</code>)</a>
+ <ul class="no-bullet">
+ <li><a id="toc-ls_002dR-1" href="#ls_002dR">5.5.1 <samp>ls-R</samp></a></li>
+ <li><a id="toc-Filename-aliases-1" href="#Filename-aliases">5.5.2 Filename aliases</a></li>
+ <li><a id="toc-Database-format-1" href="#Database-format">5.5.3 Database format</a></li>
+ </ul></li>
+ <li><a id="toc-kpsewhich_003a-Standalone-path-searching" href="#Invoking-kpsewhich">5.6 <code>kpsewhich</code>: Standalone path searching</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Path-searching-options-1" href="#Path-searching-options">5.6.1 Path searching options</a></li>
+ <li><a id="toc-Specially_002drecognized-files-for-kpsewhich" href="#Specially_002drecognized-files">5.6.2 Specially-recognized files for <code>kpsewhich</code></a></li>
+ <li><a id="toc-Auxiliary-tasks-1" href="#Auxiliary-tasks">5.6.3 Auxiliary tasks</a></li>
+ <li><a id="toc-Standard-options-1" href="#Standard-options">5.6.4 Standard options</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-TeX-support-1" href="#TeX-support">6 TeX support</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Supported-file-formats-1" href="#Supported-file-formats">6.1 Supported file formats</a></li>
+ <li><a id="toc-File-lookup-1" href="#File-lookup">6.2 File lookup</a></li>
+ <li><a id="toc-Glyph-lookup-1" href="#Glyph-lookup">6.3 Glyph lookup</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Basic-glyph-lookup-1" href="#Basic-glyph-lookup">6.3.1 Basic glyph lookup</a></li>
+ <li><a id="toc-Fontmap-1" href="#Fontmap">6.3.2 Fontmap</a></li>
+ <li><a id="toc-Fallback-font-1" href="#Fallback-font">6.3.3 Fallback font</a></li>
+ </ul></li>
+ <li><a id="toc-Suppressing-warnings-1" href="#Suppressing-warnings">6.4 Suppressing warnings</a></li>
+ <li><a id="toc-mktex-scripts-1" href="#mktex-scripts">6.5 <samp>mktex</samp> scripts</a>
+ <ul class="no-bullet">
+ <li><a id="toc-mktex-configuration-1" href="#mktex-configuration">6.5.1 <samp>mktex</samp> configuration</a></li>
+ <li><a id="toc-mktex-script-names-1" href="#mktex-script-names">6.5.2 <samp>mktex</samp> script names</a></li>
+ <li><a id="toc-mktex-script-arguments-1" href="#mktex-script-arguments">6.5.3 <samp>mktex</samp> script arguments</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Programming-1" href="#Programming">7 Programming</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Programming-overview-1" href="#Programming-overview">7.1 Programming overview</a></li>
+ <li><a id="toc-Calling-sequence-1" href="#Calling-sequence">7.2 Calling sequence</a></li>
+ <li><a id="toc-Program_002dspecific-files-1" href="#Program_002dspecific-files">7.3 Program-specific files</a></li>
+ <li><a id="toc-Programming-with-config-files-1" href="#Programming-with-config-files">7.4 Programming with config files</a></li>
+ </ul></li>
+ <li><a id="toc-Reporting-bugs-1" href="#Reporting-bugs">8 Reporting bugs</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Bug-checklist-1" href="#Bug-checklist">8.1 Bug checklist</a></li>
+ <li><a id="toc-Mailing-lists-1" href="#Mailing-lists">8.2 Mailing lists</a></li>
+ <li><a id="toc-Debugging-1" href="#Debugging">8.3 Debugging</a></li>
+ <li><a id="toc-Logging-1" href="#Logging">8.4 Logging</a></li>
+ <li><a id="toc-Common-problems-1" href="#Common-problems">8.5 Common problems</a>
+ <ul class="no-bullet">
+ <li><a id="toc-Unable-to-find-files-1" href="#Unable-to-find-files">8.5.1 Unable to find files</a></li>
+ <li><a id="toc-Slow-path-searching-1" href="#Slow-path-searching">8.5.2 Slow path searching</a></li>
+ <li><a id="toc-Unable-to-generate-fonts-1" href="#Unable-to-generate-fonts">8.5.3 Unable to generate fonts</a></li>
+ <li><a id="toc-TeX-or-Metafont-failing-1" href="#TeX-or-Metafont-failing">8.5.4 TeX or Metafont failing</a></li>
+ </ul></li>
+ </ul></li>
+ <li><a id="toc-Index-1" href="#Index">Index</a></li>
+</ul>
+</div>
+
+
+
+<span id="Top"></span><div class="header">
+<p>
+Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Up: <a href="http://tug.org/texinfohtml" accesskey="u" rel="up">(dir)</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Kpathsea-library"></span><h1 class="top">Kpathsea library</h1>
+
+<p>This manual documents the Kpathsea library for path searching. It
+corresponds to version 6.3.1, released in
+March 2019.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Introduction" accesskey="1">Introduction</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Overview and history.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#unixtex_002eftp" accesskey="2">unixtex.ftp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Obtaining TeX software.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Security" accesskey="3">Security</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Who can write what files, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#TeX-directory-structure" accesskey="4">TeX directory structure</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Managing the horde of TeX input files.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Path-searching" accesskey="5">Path searching</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How filename lookups work.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#TeX-support" accesskey="6">TeX support</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Special support for TeX-related file lookups.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Programming" accesskey="7">Programming</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How to use Kpathsea features in your program.
+</td></tr>
+<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
+
+</pre></th></tr><tr><td align="left" valign="top">&bull; <a href="#Reporting-bugs" accesskey="8">Reporting bugs</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Where and how to report bugs.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Index" accesskey="9">Index</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">General index.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Introduction"></span><div class="header">
+<p>
+Next: <a href="#unixtex_002eftp" accesskey="n" rel="next">unixtex.ftp</a>, Previous: <a href="#Top" accesskey="p" rel="prev">Top</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Introduction-1"></span><h2 class="chapter">1 Introduction</h2>
+
+<span id="index-introduction"></span>
+<span id="index-fundamental-purpose-of-Kpathsea"></span>
+
+<p>This manual corresponds to version 6.3.1 of the Kpathsea
+library, released in March 2019.
+</p>
+<p>The library&rsquo;s fundamental purpose is to return a filename from a list of
+directories specified by the user, similar to what shells do when
+looking up program names to execute.
+</p>
+<span id="index-programs-using-the-library"></span>
+<p>The following software, all of which is maintained in parallel, uses
+this library:
+</p>
+<ul>
+<li> Dviljk (see the &lsquo;<samp>dvilj</samp>&rsquo; man page)
+</li><li> Dvipsk (see <cite><a href="https://tug.org/texinfohtml/dvips.html#Top">Dvips: A DVI driver</a></cite>)
+</li><li> GNU font utilities (see <cite><a href="fontu.html#Top">GNU font utilities</a></cite>)
+</li><li> Web2c (see <cite><a href="https://tug.org/texinfohtml/web2c.html#Top">Web2c: A TeX implementation</a></cite>)
+</li><li> Xdvik (see the &lsquo;<samp>xdvi</samp>&rsquo; man page)
+</li></ul>
+
+<p>Other software that we do not maintain also uses it.
+</p>
+<p>Kpathsea is now maintained as part of the TeX Live distribution
+(<a href="http://tug.org/texlive">http://tug.org/texlive</a>), which includes several more
+Kpathsea-using programs. For information on configuration, building,
+installing, and more, see <cite><a href="https://tug.org/texinfohtml/tlbuild.html#Top">Building TeX Live</a></cite>.
+</p>
+<span id="index-interface_002c-not-frozen"></span>
+<span id="index-comments_002c-making"></span>
+<span id="index-suggestions_002c-making"></span>
+<p>The library is still actively maintained. If you have comments or
+suggestions, please send along (see <a href="#Reporting-bugs">Reporting bugs</a>).
+</p>
+<span id="index-conditions-for-use"></span>
+<span id="index-license-for-using-the-library"></span>
+<span id="index-GNU-General-Public-License"></span>
+<p>The Kpathsea library is distributed under the GNU Library General
+Public License (LGPL), version&nbsp;2.1 or (at your option) any later
+version. In short, this means if you write a program using the
+library, you must (offer to) distribute the source to the library,
+along with any changes you have made, and allow anyone to modify the
+library source and distribute their modifications. It does not mean
+you have to distribute the source to your program using the library,
+although we hope you will. See accompanying files for the text of the
+GNU licenses, or <a href="http2://www.gnu.org/licenses">http2://www.gnu.org/licenses</a>.
+</p>
+<span id="index-TeX-Users-Group"></span>
+<p>If you know enough about TeX to be reading this manual, then you (or
+your institution) should consider joining the TeX Users Group (if
+you&rsquo;re already a member, thanks!). TUG produces the periodical
+<cite>TUGboat</cite>, sponsors an annual meeting and publishes the
+proceedings, and arranges courses on TeX for all levels of users
+throughout the world. See <a href="https://tug.org">https://tug.org</a> for information.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#History" accesskey="1">History</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="History"></span><div class="header">
+<p>
+Up: <a href="#Introduction" accesskey="u" rel="up">Introduction</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="History-1"></span><h3 class="section">1.1 History</h3>
+
+<span id="index-history-of-Kpathsea"></span>
+
+<span id="index-Knuth_002c-Donald-E_002e"></span>
+<p>This section is for those people who are curious about how the library
+came about. If you like to read historical accounts of software, we
+urge you to seek out the GNU Autoconf manual and the &ldquo;Errors of
+TeX&rdquo; paper by Don Knuth, published in his book <cite>Digital
+Typography</cite>, among other places.
+</p>
+<span id="index-Morgan_002c-Tim"></span>
+<span id="index-Rokicki_002c-Tom"></span>
+<span id="index-Berry_002c-Karl"></span>
+<span id="index-VAX-11_002f750"></span>
+<span id="index-Sun-2"></span>
+<span id="index-pxp-Pascal-preprocessor"></span>
+<span id="index-pc-Pascal-compiler"></span>
+<p>[Karl writes.] My first ChangeLog entry for Web2c seems to be
+February 1990, but I may have done some work before then. In any
+case, Tim Morgan and I were jointly maintaining it for a time. (I
+should mention here that Tim had made Web2c into a real distribution
+long before I had ever used it or even heard of it, and Tom Rokicki
+did the original implementation. When I started, I was using
+<code>pxp</code> and <code>pc</code> on VAX 11/750&rsquo;s and the hot new Sun 2
+machines.)
+</p>
+<p>It must have been later in 1990 and 1991 that I started working on
+<cite>TeX for the Impatient</cite>. Dvips, Xdvi, Web2c, and the GNU
+fontutils (which I was also writing at the time) all used different
+environment variables, and, more importantly, had different bugs in
+their path searching. This became extremely painful, as I was stressing
+everything to the limit working on the book. I also desperately wanted
+to implement subdirectory searching, since I couldn&rsquo;t stand putting
+everything in one big directory, and also couldn&rsquo;t stand having to
+explicitly specify <samp>cm</samp>, <samp>pandora</samp>, &hellip; in a path.
+</p>
+<span id="index-Vojta_002c-Paul"></span>
+<p>In the first incarnation, I just hacked separately on each
+program&mdash;that was the original subdirectory searching code in both
+Xdvi and Dvips. That is, I tried to go with the flow in each program,
+rather than changing the program&rsquo;s calling sequences to conform to new
+routines.
+</p>
+<p>Then, as bugs inevitably appeared, I found I was fixing the same thing
+three times (Web2c and fontutils were already sharing code, since I
+maintained both of those&mdash;there was no Dvipsk or Xdvik or Dviljk at
+this point). After a while, I finally started sharing source files.
+They weren&rsquo;t yet a library, though. I just kept things up to date
+with shell scripts. (I was developing on a 386 running ISC 2.2 at the
+time, and so didn&rsquo;t have symbolic links. An awful experience.)
+</p>
+<span id="index-MacKenzie_002c-David"></span>
+<p>The ChangeLogs for Xdvik and Dvipsk record initial releases of those
+distributions in May and June 1992. I think it was because I was tired
+of the different configuration strategies of each program, not so much
+because of the path searching. Autoconf was being developed by David
+MacKenzie and others, and I was adapting it to TeX and friends.
+</p>
+<span id="index-zuhn_002c-david"></span>
+<p>I started to make a separate library that other programs could link with
+on my birthday in April 1993, according to the ChangeLog. I don&rsquo;t
+remember exactly why I finally took the time to make it a separate
+library; a conversation with david zuhn initiated it. Just seemed
+like it was time.
+</p>
+<span id="index-Walsh_002c-Norman"></span>
+<span id="index-Neumann_002c-Gustaf"></span>
+<p>Dviljk got started in March 1994 after I bought a Laserjet 4. (Kpathsea
+work got suspended while Norm Walsh and I, with Gustaf Neumann&rsquo;s help,
+implemented a way for TeX to get at all those neat builtin LJ4 fonts
+&hellip; such a treat to have something to typeset in besides Palatino!)
+</p>
+<p>By spring of 1995, I had implemented just about all the path-searching
+features in Kpathsea that I plan to, driven beyond my initial goals by
+Thomas Esser and others. I then started to integrate Web2c with
+Kpathsea. After the release of a stable Web2c, I hope to be able to stop
+development, and turn most of my attention back to making fonts for GNU.
+(Always assuming Micros**t hasn&rsquo;t completely obliterated Unix by then,
+or that software patents haven&rsquo;t stopped software development by anybody
+smaller than a company with a million-dollar-a-year legal budget. Which
+is actually what I think is likely to happen, but that&rsquo;s another
+story&hellip;)
+</p>
+<span id="index-Weber_002c-Olaf"></span>
+<p>[Olaf writes.] At the end of 1997, Unix is still alive and kicking,
+individuals still develop software, and Web2c development still
+continues. Karl had been looking for some time for someone to take up
+part of the burden, and I volunteered.
+</p>
+<span id="index-Hoekwater_002c-Taco"></span>
+<span id="index-Breitenlohner_002c-Peter"></span>
+<p>[Karl writes again.] Indeed, time goes on. As of 2006 or so, Olaf&rsquo;s
+available time for Kpathsea was reduced, and I started taking overall
+care of it again, although I did not do any significant new
+development. In 2009, Taco Hoekwater implemented a major
+rearrangement to make the library suitable for use within the MetaPost
+library (see <a href="#Programming-overview">Programming overview</a>). Also, for some years now,
+Peter Breitenlohner has made many improvements to the infrastructure
+and kept it up-to-date with respect to the overall TeX Live build,
+where Kpathsea is now maintained.
+</p>
+
+
+<hr>
+<span id="unixtex_002eftp"></span><div class="header">
+<p>
+Next: <a href="#Security" accesskey="n" rel="next">Security</a>, Previous: <a href="#Introduction" accesskey="p" rel="prev">Introduction</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="unixtex_002eftp_003a-Obtaining-TeX"></span><h2 class="chapter">2 <samp>unixtex.ftp</samp>: Obtaining TeX</h2>
+
+<span id="index-obtaining-TeX"></span>
+<span id="index-retrieving-TeX"></span>
+
+<span id="index-unixtex_002eftp"></span>
+<span id="index-tug_002eorg"></span>
+<span id="index-www_002etug_002eorg"></span>
+<span id="index-ftp_002etug_002eorg"></span>
+<p>This
+is <a href="https://tug.org/tex/unixtex.ftp">https://tug.org/tex/unixtex.ftp</a>, last updated 28 November
+2017. Email <a href="mailto:tex-k@tug.org">tex-k@tug.org</a> with comments or questions.
+</p>
+<p>The principal free TeX distribution for Unix-like systems is TeX
+Live, on the web at <a href="http://tug.org/texlive">http://tug.org/texlive</a>. The pages there
+describe many ways to acquire and.or build TeX, over the Internet
+or on physical media, both the sources and precompiled binaries for
+many systems, either standalone or as part of various operating system
+distributions.
+</p>
+<p>Web2c, Kpathsea, Dvips, and Dviljk are no longer released as a
+separate packages. Their sources are now maintained as part of TeX
+Live.
+</p>
+<span id="index-ftp_002ecs_002estanford_002eedu"></span>
+<span id="index-tex_002eweb"></span>
+<span id="index-Knuth_002c-Donald-E_002e_002c-archive-of-programs-by"></span>
+<p>The host <tt>ftp.cs.stanford.edu</tt> is the original source for the files
+for which Donald Knuth is directly responsible: <samp>tex.web</samp>,
+<samp>plain.tex</samp>, etc. However, unless you want to undertake the
+project of building your TeX installation from scratch, it is more
+reliable and less work to retrieve these files as part of a larger
+package.
+</p>
+<p>In any case, the Stanford ftp site is not the canonical source for
+anything except what was created as part of Knuth&rsquo;s original TeX,
+so do not rely on any other files available there being up-to-date.
+The best place to check for up-to-date files is CTAN (the
+Comprehensive TeX Archive Network), <a href="https://ctan.org">https://ctan.org</a>.
+</p>
+
+
+<hr>
+<span id="Security"></span><div class="header">
+<p>
+Next: <a href="#TeX-directory-structure" accesskey="n" rel="next">TeX directory structure</a>, Previous: <a href="#unixtex_002eftp" accesskey="p" rel="prev">unixtex.ftp</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Security-1"></span><h2 class="chapter">3 Security</h2>
+
+<span id="index-security-considerations"></span>
+
+<p>None of the programs in the TeX system require any special system
+privileges, so there&rsquo;s no first-level security concern of people gaining
+illegitimate root access.
+</p>
+<span id="index-trojan-horse-attack"></span>
+<span id="index-_002erhosts_002c-writable-by-TeX"></span>
+<p>A TeX document, however, can write to arbitrary files, e.g.,
+<samp>~/.rhosts</samp>, and thus an unwitting user who runs TeX on a random
+document is vulnerable to a trojan horse attack. This loophole is
+closed by default, but you can be permissive if you so desire in
+<samp>texmf.cnf</samp>. See <a href="https://tug.org/texinfohtml/web2c.html#tex-invocation">tex invocation</a> in <cite>Web2c</cite>. MetaPost has
+the same issue.
+</p>
+<p>Dvips, Xdvi, and TeX can also execute shell commands under some
+circumstances. To disable this, see the &lsquo;<samp>-R</samp>&rsquo; option in <a href="https://tug.org/texinfohtml/dvips.html#Option-details">Option
+details</a> in <cite>Dvips</cite>, the xdvi man page, and <a href="https://tug.org/texinfohtml/web2c.html#tex-invocation">tex
+invocation</a> in <cite>Web2c</cite>, respectively.
+</p>
+<span id="index-local-cache-of-fonts"></span>
+<span id="index-cache-of-fonts_002c-local"></span>
+<p>Another security issue arises because it&rsquo;s very useful&mdash;almost
+necessary&mdash;to make arbitrary fonts on user demand with <code>mktexpk</code>
+and friends. Where do these files get installed? By default, the
+<code>mktexpk</code> distributed with Kpathsea assumes a world-writable
+<samp>/var/tmp</samp> directory; this is a simple and convenient approach, but
+it may not suit your situation because it means that a local cache of
+fonts is created on every machine.
+</p>
+<span id="index-globally-writable-directories"></span>
+<p>To avoid this duplication, many people consider a shared, globally
+writable font tree desirable, in spite of the potential security
+problems. To do this you should change the value of <code>VARTEXFONTS</code>
+in <samp>texmf.cnf</samp> to refer to some globally known directory.
+See <a href="#mktex-configuration">mktex configuration</a>.
+</p>
+<span id="index-append_002donly-directories-and-mktexpk"></span>
+<p>The first restriction you can apply is to make newly-created directories
+under <samp>texmf</samp> be append-only with an option in <samp>mktex.cnf</samp>.
+See <a href="#mktex-configuration">mktex configuration</a>.
+</p>
+<span id="index-group_002dwritable-directories"></span>
+<span id="index-setgid-scripts"></span>
+<p>Another approach is to establish a group (or user) for TeX files,
+make the <samp>texmf</samp> tree writable only to that group (or user), and
+make <code>mktexpk</code> et al. setgid to that group (or setuid to that
+user). Then users must invoke the scripts to install things. (If
+you&rsquo;re worried about the inevitable security holes in scripts, then you
+could write a C wrapper to exec the script.)
+</p>
+<span id="index-file-permissions"></span>
+<span id="index-permissions_002c-file"></span>
+<p>The <samp>mktex&hellip;</samp> scripts install files with the same read and
+write permissions as the directory they are installed in. The
+executable, sgid, suid, and sticky bits are always cleared.
+</p>
+<span id="index-directory-permissions"></span>
+<span id="index-permissions_002c-directory"></span>
+<p>Any directories created by the <samp>mktex&hellip;</samp> scripts have the
+same permissions as their parent directory, unless the
+<code>appendonlydir</code> feature is used, in which case the sticky bit is
+always set.
+</p>
+
+<hr>
+<span id="TeX-directory-structure"></span><div class="header">
+<p>
+Next: <a href="#Path-searching" accesskey="n" rel="next">Path searching</a>, Previous: <a href="#Security" accesskey="p" rel="prev">Security</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="TeX-directory-structure-1"></span><h2 class="chapter">4 TeX directory structure</h2>
+
+<span id="index-TEXMF"></span>
+<span id="index-TeX-directory-structure"></span>
+<span id="index-directory-structure_002c-for-TeX-files"></span>
+<span id="index-skeleton-TeX-directory"></span>
+<span id="index-TDS"></span>
+
+<p>This section describes the default installation hierarchy of the
+distribution. It conforms to both the GNU coding standards and the
+TeX directory structure (TDS) standard. For rationale and further
+explanation, please see those documents. The GNU document is
+available from <a href="http://www.gnu.org/prep/standards">http://www.gnu.org/prep/standards</a>. The TDS
+document is available from <a href="http://www.mirror.ctan.org/tds">http://www.mirror.ctan.org/tds</a>
+(see <a href="#unixtex_002eftp">unixtex.ftp</a>).
+</p>
+<p>In short, here is a skeleton of the default directory structure,
+extracted from the TDS document:
+</p>
+<div class="example">
+<pre class="example"><var>prefix</var>/ <span class="roman">installation root (<samp>/usr/local</samp> by default)</span>
+ bin/ <span class="roman">executables</span>
+ man/ <span class="roman">man pages</span>
+ include/ <span class="roman">C header files</span>
+ info/ <span class="roman">GNU info files</span>
+ lib/ <span class="roman">libraries (<samp>libkpathsea.*</samp>)</span>
+ share/ <span class="roman">architecture-independent files</span>
+ texmf/ <span class="roman">TDS root</span>
+ bibtex/ <span class="roman">BibTeX input files</span>
+ bib/ <span class="roman">BibTeX databases</span>
+ base/ <span class="roman">base distribution (e.g., &lsquo;<samp>xampl.bib</samp>&rsquo;)</span>
+ misc/ <span class="roman">single-file databases</span>
+ <var>pkg</var>/ <span class="roman">name of a package</span>
+ bst/ <span class="roman">BibTeX style files</span>
+ base/ <span class="roman">base distribution (e.g., &lsquo;<samp>plain.bst</samp>&rsquo;, &lsquo;<samp>acm.bst</samp>&rsquo;)</span>
+ misc/ <span class="roman">single-file styles</span>
+ <var>pkg</var>/ <span class="roman">name of a package</span>
+ doc/ <span class="roman">additional documentation</span>
+ dvips/ <span class="roman">&lsquo;<samp>.pro</samp>&rsquo;, &lsquo;<samp>.ps</samp>&rsquo;, &lsquo;<samp>psfonts.map</samp>&rsquo;</span>
+ fonts/ <span class="roman">font-related files</span>
+ <var>type</var>/ <span class="roman">file type (e.g., &lsquo;<samp>tfm</samp>&rsquo;, &lsquo;<samp>pk</samp>&rsquo;)</span>
+ <var>mode</var>/ <span class="roman">type of output device (types &lsquo;<samp>pk</samp>&rsquo; and &lsquo;<samp>gf</samp>&rsquo; only)</span>
+ <var>supplier</var>/ <span class="roman">name of a font supplier (e.g., &lsquo;<samp>public</samp>&rsquo;)</span>
+ <var>typeface</var>/ <span class="roman">name of a typeface (e.g., &lsquo;<samp>cm</samp>&rsquo;)</span>
+ dpi<var>nnn</var>/ <span class="roman">font resolution (types &lsquo;<samp>pk</samp>&rsquo; and &lsquo;<samp>gf</samp>&rsquo; only)</span>
+ metafont/ <span class="roman">Metafont (non-font) input files</span>
+ base/ <span class="roman">base distribution (e.g., &lsquo;<samp>plain.mf</samp>&rsquo;)</span>
+ misc/ <span class="roman">single-file packages (e.g., &lsquo;<samp>modes.mf</samp>&rsquo;)</span>
+ <var>pkg</var>/ <span class="roman">name of a package (e.g., &lsquo;<samp>mfpic</samp>&rsquo;)</span>
+ metapost/ <span class="roman">MetaPost input files</span>
+ base/ <span class="roman">base distribution (e.g., &lsquo;<samp>plain.mp</samp>&rsquo;)</span>
+ misc/ <span class="roman">single-file packages</span>
+ <var>pkg</var>/ <span class="roman">name of a package</span>
+ support/ <span class="roman">support files for MetaPost-related utilities (e.g., &lsquo;<samp>trfonts.map</samp>&rsquo;)</span>
+ mft/ <span class="roman">&lsquo;<samp>MFT</samp>&rsquo; inputs (e.g., &lsquo;<samp>plain.mft</samp>&rsquo;)</span>
+ tex/ <span class="roman">TeX input files</span>
+ <var>format</var>/ <span class="roman">name of a format (e.g., &lsquo;<samp>plain</samp>&rsquo;)</span>
+ base/ <span class="roman">base distribution for <var>format</var> (e.g., &lsquo;<samp>plain.tex</samp>&rsquo;)</span>
+ misc/ <span class="roman">single-file packages (e.g., &lsquo;<samp>webmac.tex</samp>&rsquo;)</span>
+ local/ <span class="roman">local additions to or local configuration files for <var>format</var></span>
+ <var>pkg</var>/ <span class="roman">name of a package (e.g., &lsquo;<samp>graphics</samp>&rsquo;, &lsquo;<samp>mfnfss</samp>&rsquo;)</span>
+ generic/ <span class="roman">format-independent packages</span>
+ hyphen/ <span class="roman">hyphenation patterns (e.g., &lsquo;<samp>hyphen.tex</samp>&rsquo;)</span>
+ images/ <span class="roman">image input files (e.g., Encapsulated PostScript)</span>
+ misc/ <span class="roman">single-file format-independent packages (e.g., &lsquo;<samp>null.tex</samp>&rsquo;).</span>
+ <var>pkg</var>/ <span class="roman">name of a package (e.g., &lsquo;<samp>babel</samp>&rsquo;)</span>
+ web2c/ <span class="roman">implementation-dependent files (<samp>.pool</samp>, <samp>.fmt</samp>, <samp>texmf.cnf</samp>, etc.)</span>
+</pre></div>
+
+<p>Some concrete examples for most file types:
+</p>
+<div class="example">
+<pre class="example">/usr/local/bin/tex
+/usr/local/man/man1/xdvi.1
+/usr/local/info/kpathsea.info
+/usr/local/lib/libkpathsea.a
+/usr/local/share/texmf/bibtex/bst/base/plain.bst
+/usr/local/share/texmf/fonts/pk/ljfour/public/cm/cmr10.600pk
+/usr/local/share/texmf/fonts/source/public/pandora/pnr10.mf
+/usr/local/share/texmf/fonts/tfm/public/cm/cmr10.tfm
+/usr/local/share/texmf/fonts/type1/adobe/utopia/putr.pfa
+/usr/local/share/texmf/metafont/base/plain.mf
+/usr/local/share/texmf/metapost/base/plain.mp
+/usr/local/share/texmf/tex/plain/base/plain.tex
+/usr/local/share/texmf/tex/generic/hyphen/hyphen.tex
+/usr/local/share/texmf/web2c/tex.pool
+/usr/local/share/texmf/web2c/tex.fmt
+/usr/local/share/texmf/web2c/texmf.cnf
+</pre></div>
+
+
+<hr>
+<span id="Path-searching"></span><div class="header">
+<p>
+Next: <a href="#TeX-support" accesskey="n" rel="next">TeX support</a>, Previous: <a href="#TeX-directory-structure" accesskey="p" rel="prev">TeX directory structure</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Path-searching-1"></span><h2 class="chapter">5 Path searching</h2>
+
+<span id="index-path-searching"></span>
+
+<p>This chapter describes the generic path searching mechanism Kpathsea
+provides. For information about searching for particular file types
+(e.g., TeX fonts), see the next chapter.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Searching-overview" accesskey="1">Searching overview</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Basic scheme for searching.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Path-sources" accesskey="2">Path sources</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Where search paths can be defined.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Path-expansion" accesskey="3">Path expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Special constructs in search paths.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Casefolding-search" accesskey="4">Casefolding search</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Fallback to case-insensitive search.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Filename-database" accesskey="5">Filename database</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using an externally-built list to search.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Invoking-kpsewhich" accesskey="6">Invoking kpsewhich</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Standalone path lookup.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Searching-overview"></span><div class="header">
+<p>
+Next: <a href="#Path-sources" accesskey="n" rel="next">Path sources</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Searching-overview-1"></span><h3 class="section">5.1 Searching overview</h3>
+
+<span id="index-searching-overview"></span>
+<span id="index-path-searching_002c-overview"></span>
+<span id="index-overview-of-path-searching"></span>
+
+<span id="index-search-path_002c-defined"></span>
+<p>A <em>search path</em> is a colon-separated list of <em>path elements</em>,
+which are directory names with a few extra frills. A search path can
+come from (a combination of) many sources; see below. To look up a file
+&lsquo;<samp>foo</samp>&rsquo; along a path &lsquo;<samp>.:/dir</samp>&rsquo;, Kpathsea checks each element of
+the path in turn: first <samp>./foo</samp>, then <samp>/dir/foo</samp>, returning
+the first match (or possibly all matches).
+</p>
+<span id="index-magic-characters"></span>
+<span id="index-_003a-may-not-be-_003a"></span>
+<span id="index-_002f-may-not-be-_002f"></span>
+<p>The &ldquo;colon&rdquo; and &ldquo;slash&rdquo; mentioned here aren&rsquo;t necessarily &lsquo;<samp>:</samp>&rsquo;
+and &lsquo;<samp>/</samp>&rsquo; on non-Unix systems. Kpathsea tries to adapt to other
+operating systems&rsquo; conventions.
+</p>
+<span id="index-database-search"></span>
+<span id="index-searching-the-database"></span>
+<p>To check a particular path element <var>e</var>, Kpathsea first sees if a
+prebuilt database (see <a href="#Filename-database">Filename database</a>) applies to <var>e</var>, i.e.,
+if the database is in a directory that is a prefix of <var>e</var>. If so,
+the path specification is matched against the contents of the database.
+</p>
+<span id="index-floating-directories"></span>
+<span id="index-filesystem-search"></span>
+<span id="index-disk-search"></span>
+<span id="index-searching-the-disk"></span>
+<p>If the database does not exist, or does not apply to this path element,
+or contains no matches, the filesystem is searched (if this was not
+forbidden by the specification with &lsquo;<samp>!!</samp>&rsquo; and if the file being
+searched for must exist). Kpathsea constructs the list of directories
+that correspond to this path element, and then checks in each for the
+file being searched for. (To help speed future lookups of files in the
+same directory, the directory in which a file is found is floated to the
+top of the directory list.)
+</p>
+<span id="index-must-exist"></span>
+<span id="index-VF-files_002c-not-found"></span>
+<span id="index-cmr10_002evf"></span>
+<span id="index-_005copenin"></span>
+<p>The &ldquo;file must exist&rdquo; condition comes into play with VF files and
+input files read by the TeX &lsquo;<samp>\openin</samp>&rsquo; command. These files
+might very well not exist (consider <samp>cmr10.vf</samp>), and so it would
+be wrong to search the disk for them. Therefore, if you fail to
+update <samp>ls-R</samp> when you install a new VF file, it will not be
+found.
+</p>
+<p>Each path element is checked in turn: first the database, then the
+disk. If a match is found, the search stops and the result is
+returned (unless the search explicitly requested all matches). This
+avoids possibly-expensive processing of path specifications that are
+never needed on a particular run.
+</p>
+<p>On Unix-like systems, if no match is found by any of the above, and
+the path element allows checking the filesystem (per the above), a
+final check is made for a case-insensitive match. Thus, looking for a
+name like &lsquo;<samp>./FooBar.TeX</samp>&rsquo; will match a file &lsquo;<samp>./foobar.tex</samp>&rsquo;,
+and vice versa. This is not done on Windows. See <a href="#Casefolding-search">Casefolding search</a>.
+</p>
+<span id="index-expansion_002c-path-element"></span>
+<p>Although the simplest and most common path element is a directory name,
+Kpathsea supports additional features in search paths: layered default
+values, environment variable names, config file values, users&rsquo; home
+directories, and recursive subdirectory searching. Thus, we say that
+Kpathsea <em>expands</em> a path element, meaning transforming all the
+magic specifications into the basic directory name or names. This
+process is described in the sections below. It happens in the same
+order as the sections.
+</p>
+<span id="index-absolute-filenames"></span>
+<span id="index-relative-filenames"></span>
+<span id="index-explicitly-relative-filenames"></span>
+<span id="index-filenames_002c-absolute-or-explicitly-relative"></span>
+<p>Exception to all of the above: If the filename being searched for is
+absolute or explicitly relative, i.e., starts with &lsquo;<samp>/</samp>&rsquo; or &lsquo;<samp>./</samp>&rsquo;
+or &lsquo;<samp>../</samp>&rsquo;, Kpathsea simply checks if that file exists, with a
+fallback to a casefolding match if needed and enabled, as described above.
+</p>
+<span id="index-permission-denied"></span>
+<span id="index-unreadable-files"></span>
+<span id="index-access-warnings"></span>
+<span id="index-warnings_002c-file-access"></span>
+<span id="index-lost_002bfound-directory"></span>
+<span id="index-TEX_005fHUSH"></span>
+<p>Ordinarily, if Kpathsea tries to access a file or directory that
+cannot be read, it gives a warning. This is so you will be alerted to
+directories or files that accidentally lack any read permission (for
+example, a <samp>lost+found</samp> directory). If you prefer not to see
+these warnings, include the value &lsquo;<samp>readable</samp>&rsquo; in the
+<code>TEX_HUSH</code> environment variable or config file value.
+</p>
+<p>This generic path searching algorithm is implemented in
+<samp>kpathsea/pathsearch.c</samp>. It is employed by a higher-level
+algorithm when searching for a file of a particular type (see <a href="#File-lookup">File lookup</a>, and <a href="#Glyph-lookup">Glyph lookup</a>).
+</p>
+
+<hr>
+<span id="Path-sources"></span><div class="header">
+<p>
+Next: <a href="#Path-expansion" accesskey="n" rel="next">Path expansion</a>, Previous: <a href="#Searching-overview" accesskey="p" rel="prev">Searching overview</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Path-sources-1"></span><h3 class="section">5.2 Path sources</h3>
+
+<span id="index-path-sources"></span>
+<span id="index-sources-for-search-paths"></span>
+
+<p>A search path or other configuration value can come from many sources.
+In the order in which Kpathsea looks for them:
+</p>
+<ol>
+<li> <span id="index-environment-variable_002c-source-for-path"></span>
+A user-set environment variable, e.g., <code>TEXINPUTS</code>.
+Environment variables with an underscore and the program name appended
+override; for example, <code>TEXINPUTS_latex</code> overrides <code>TEXINPUTS</code>
+if the program being run is named &lsquo;<samp>latex</samp>&rsquo;.
+
+</li><li> A program-specific configuration file, e.g., an &lsquo;<samp>S /a:/b</samp>&rsquo; line in
+Dvips&rsquo; <samp>config.ps</samp> (see <a href="https://tug.org/texinfohtml/dvips.html#Config-files">Config files</a> in <cite>Dvips</cite>).
+
+</li><li> <span id="index-configuration-file_002c-source-for-path"></span>
+<span id="index-Kpathsea-config-file_002c-source-for-path"></span>
+<span id="index-texmf_002ecnf_002c-source-for-path"></span>
+A line in a Kpathsea configuration file <samp>texmf.cnf</samp>, e.g.,
+&lsquo;<samp>TEXINPUTS=/c:/d</samp>&rsquo; (see below).
+
+</li><li> <span id="index-compilation-value_002c-source-for-path"></span>
+The compile-time default (specified in <samp>kpathsea/paths.h</samp>).
+</li></ol>
+
+<p>You can see each of these values for a given search path by using the
+debugging options (see <a href="#Debugging">Debugging</a>).
+</p>
+<p>These sources may be combined via default expansion (see <a href="#Default-expansion">Default expansion</a>).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Config-files" accesskey="1">Config files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Kpathsea&rsquo;s runtime config files (texmf.cnf).
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Config-files"></span><div class="header">
+<p>
+Up: <a href="#Path-sources" accesskey="u" rel="up">Path sources</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Config-files-1"></span><h4 class="subsection">5.2.1 Config files</h4>
+
+<span id="index-config-files"></span>
+<span id="index-texmf_002ecnf_002c-definition-for"></span>
+
+<span id="index-runtime-configuration-files"></span>
+<span id="index-TEXMFCNF"></span>
+<p>As mentioned above, Kpathsea reads <em>runtime configuration files</em>
+named <samp>texmf.cnf</samp> for search path and other definitions. The
+search path used to look for these configuration files is named
+<code>TEXMFCNF</code>, and is constructed in the usual way, as described
+above, except that configuration files cannot be used to define the
+path, naturally; also, an <samp>ls-R</samp> database is not used to search for
+them.
+</p>
+<p>Kpathsea reads <em>all</em> <samp>texmf.cnf</samp> files in the search path, not
+just the first one found; definitions in earlier files override those in
+later files. Thus, if the search path is &lsquo;<samp>.:$TEXMF</samp>&rsquo;, values from
+<samp>./texmf.cnf</samp> override those from <samp>$TEXMF/texmf.cnf</samp>.
+</p>
+<span id="index-KPATHSEA_005fWARNING"></span>
+<span id="index-warning_002c-about-missing-texmf_002ecnf"></span>
+<span id="index-texmf_002ecnf-missing_002c-warning-about"></span>
+<p>If Kpathsea cannot find any <samp>texmf.cnf</samp> file, it reports a
+warning including all the directories it checked. If you don&rsquo;t want
+to see this warning, set the environment variable
+<code>KPATHSEA_WARNING</code> to the single character &lsquo;<samp>0</samp>&rsquo; (zero, not
+oh).
+</p>
+<p>While (or instead of) reading this description, you may find it helpful
+to look at the distributed <samp>texmf.cnf</samp>, which uses or at least
+mentions most features. The format of <samp>texmf.cnf</samp> files follows:
+</p>
+<ul>
+<li> <span id="index-comments_002c-in-texmf_002ecnf"></span>
+Comments start with &lsquo;<samp>%</samp>&rsquo;, either at the beginning of a line or
+preceded by whitespace, and continue to the end of the line. That is,
+as with most shells, a &lsquo;<samp>%</samp>&rsquo; in the &ldquo;middle&rdquo; of a value does not
+start a comment. Examples:
+
+<div class="example">
+<pre class="example">% this is a comment
+var = a%b % but the value of var will be &quot;a%b&quot;.
+</pre></div>
+
+</li><li> <span id="index-blank-lines_002c-in-texmf_002ecnf"></span>
+Blank lines are ignored.
+
+</li><li> <span id="index-backslash_002dnewline"></span>
+<span id="index-continuation-character"></span>
+<span id="index-whitespace_002c-not-ignored-on-continuation-lines"></span>
+<span id="index-_005c_002c-line-continuation-in-texmf_002ecnf"></span>
+A &lsquo;<samp>\</samp>&rsquo; at the end of a line acts as a continuation character, i.e.,
+the next line is appended. Whitespace at the beginning of continuation
+lines is not ignored.
+
+</li><li> Each remaining line must look like
+
+<div class="example">
+<pre class="example"><var>variable</var> <span class="roman">[</span>. <var>progname</var><span class="roman">]</span> <span class="roman">[</span>=<span class="roman">]</span> <var>value</var>
+</pre></div>
+
+<p>where the &lsquo;<samp>=</samp>&rsquo; and surrounding whitespace is optional.
+</p>
+</li><li> <span id="index-identifiers_002c-characters-valid-in"></span>
+The <var>variable</var> name may contain any character other than whitespace,
+&lsquo;<samp>=</samp>&rsquo;, or &lsquo;<samp>.</samp>&rsquo;, but sticking to &lsquo;<samp>A-Za-z_</samp>&rsquo; is safest.
+
+</li><li> If &lsquo;<samp>.<var>progname</var></samp>&rsquo; is present, the definition only
+applies if the program that is running is named (i.e., the last
+component of <code>argv[0]</code> is) <var>progname</var> or
+<samp><var>progname</var>.{exe,bat,cmd,...}</samp>. Most notably, this allows
+different flavors of TeX to have different search paths.
+
+</li><li> <span id="index-right_002dhand-side-of-variable-assignments"></span>
+<var>value</var> may contain any characters except &lsquo;<samp>%</samp>&rsquo; and &lsquo;<samp>@</samp>&rsquo;.
+(These restrictions are only necessary because of the processing done
+on <samp>texmf.cnf</samp> at build time, so you can stick those characters
+in after installation if you have to.) The
+&lsquo;<samp>$<var>var</var>.<var>prog</var></samp>&rsquo; feature is not available on the
+right-hand side; instead, you must use an additional variable (see
+below for example). A &lsquo;<samp>;</samp>&rsquo; in <var>value</var> is translated to
+&lsquo;<samp>:</samp>&rsquo; if running under Unix; this is useful to write a single
+<samp>texmf.cnf</samp> which can be used under both Unix and Windows.
+
+</li><li> All definitions are read before anything is expanded, so you can
+use variables before they are defined (like Make, unlike most other
+programs).
+</li></ul>
+
+<p>Here is a configuration file fragment illustrating most of
+these points:
+</p>
+<div class="example">
+<pre class="example">% TeX input files -- i.e., anything to be found by \input or \openin ...
+latex209_inputs = .:$TEXMF/tex/latex209//:$TEXMF/tex//
+latex2e_inputs = .:$TEXMF/tex/latex//:$TEXMF/tex//
+TEXINPUTS = .:$TEXMF/tex//
+TEXINPUTS.latex209 = $latex209_inputs
+TEXINPUTS.latex2e = $latex2e_inputs
+TEXINPUTS.latex = $latex2e_inputs
+</pre></div>
+
+<span id="index-shell-scripts-as-configuration-files"></span>
+<span id="index-configuration-files-as-shell-scripts_002e"></span>
+<p>This format has obvious similarities to Bourne shell scripts&mdash;change
+the comment character to <code>#</code>, disallow spaces around the
+<code>=</code>, and get rid of the <code>.<var>name</var></code> convention, and it
+could be run through the shell. However, there seemed little
+advantage in this, since all the information would have to passed back
+to Kpathsea and parsed there anyway, since the <code>sh</code> process
+couldn&rsquo;t affect its parent&rsquo;s environment.
+</p>
+<span id="index-cnf_002ec"></span>
+<p>The implementation of all this is in <samp>kpathsea/cnf.c</samp>.
+</p>
+
+<hr>
+<span id="Path-expansion"></span><div class="header">
+<p>
+Next: <a href="#Casefolding-search" accesskey="n" rel="next">Casefolding search</a>, Previous: <a href="#Path-sources" accesskey="p" rel="prev">Path sources</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Path-expansion-1"></span><h3 class="section">5.3 Path expansion</h3>
+
+<span id="index-path-expansion"></span>
+<span id="index-expansion_002c-search-path"></span>
+
+<p>Kpathsea recognizes certain special characters and constructions in
+search paths, similar to that in shells. As a general example:
+&lsquo;<samp>~$USER/{foo,bar}//baz</samp>&rsquo; expands to all subdirectories under
+directories <samp>foo</samp> and <samp>bar</samp> in <tt>$USER</tt>&rsquo;s home directory that
+contain a directory or file <samp>baz</samp>.
+</p>
+<p>These expansions are explained in the sections below.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Default-expansion" accesskey="1">Default expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">a: or :a or a::b expands to a default.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Variable-expansion" accesskey="2">Variable expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">$foo and ${foo} expand to environment values.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Tilde-expansion" accesskey="3">Tilde expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">~ and ~user expand to home directories.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Brace-expansion" accesskey="4">Brace expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">a{foo,bar}b expands to afoob abarb.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#KPSE_005fDOT-expansion" accesskey="5">KPSE_DOT expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">. is replaced with $KPSE_DOT if it is defined.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Subdirectory-expansion" accesskey="6">Subdirectory expansion</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">a// and a//b recursively expand to subdirs.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Default-expansion"></span><div class="header">
+<p>
+Next: <a href="#Variable-expansion" accesskey="n" rel="next">Variable expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Default-expansion-1"></span><h4 class="subsection">5.3.1 Default expansion</h4>
+
+<span id="index-_003a_003a-expansion"></span>
+<span id="index-doubled-colons"></span>
+<span id="index-leading-colons"></span>
+<span id="index-trailing-colons"></span>
+<span id="index-extra-colons"></span>
+<span id="index-default-expansion"></span>
+<span id="index-expansion_002c-default"></span>
+
+<p>If the highest-priority search path (see <a href="#Path-sources">Path sources</a>) contains an
+<em>extra colon</em> (i.e., leading, trailing, or doubled), Kpathsea
+inserts at that point the next-highest-priority search path that is
+defined. If that inserted path has an extra colon, the same happens
+with the next-highest. (An extra colon in the compile-time default
+value has unpredictable results, so installers beware.)
+</p>
+<p>For example, given an environment variable setting
+</p>
+<div class="example">
+<pre class="example">setenv TEXINPUTS /home/karl:
+</pre></div>
+
+<p>and a <code>TEXINPUTS</code> value from <samp>texmf.cnf</samp> of
+</p>
+<div class="example">
+<pre class="example">.:$TEXMF//tex
+</pre></div>
+
+<p>then the final value used for searching will be:
+</p>
+<div class="example">
+<pre class="example">/home/karl:.:$TEXMF//tex
+</pre></div>
+
+<p>Put another way, default expansion works on &ldquo;formats&rdquo; (search
+paths), and not directly on environment variables. Example, showing
+the trailing &lsquo;<samp>:</samp>&rsquo; ignored in the first case and expanded in the second:
+</p>
+<div class="example">
+<pre class="example">$ env TTFONTS=/tmp: kpsewhich --expand-path '$TTFONTS'
+/tmp
+$ env TTFONTS=/tmp: kpsewhich --show-path=.ttf
+/tmp:.:/home/olaf/texmf/fonts/truetype//:...
+</pre></div>
+
+<p>Since Kpathsea looks for multiple configuration files, it would be
+natural to expect that (for example) an extra colon in
+<samp>./texmf.cnf</samp> would expand to the path in <samp>$TEXMF/texmf.cnf</samp>.
+Or, with Dvips&rsquo; configuration files, that an extra colon in
+<samp>config.$PRINTER</samp> would expand to the path in <samp>config.ps</samp>.
+This doesn&rsquo;t happen. It&rsquo;s not clear this would be desirable in all
+cases, and trying to devise a way to specify the path to which the extra
+colon should expand seemed truly baroque.
+<span id="index-Bach_002c-Johann-Sebastian"></span>
+</p>
+<p>Technicality: Since it would be useless to insert the default value in
+more than one place, Kpathsea changes only one extra &lsquo;<samp>:</samp>&rsquo; and leaves
+any others in place (they will eventually be ignored). Kpathsea checks
+first for a leading &lsquo;<samp>:</samp>&rsquo;, then a trailing &lsquo;<samp>:</samp>&rsquo;, then a doubled
+&lsquo;<samp>:</samp>&rsquo;.
+</p>
+<span id="index-kdefault_002ec"></span>
+<p>You can trace this by debugging &ldquo;paths&rdquo; (see <a href="#Debugging">Debugging</a>).
+Default expansion is implemented in the source file
+<samp>kpathsea/kdefault.c</samp>.
+</p>
+
+<hr>
+<span id="Variable-expansion"></span><div class="header">
+<p>
+Next: <a href="#Tilde-expansion" accesskey="n" rel="next">Tilde expansion</a>, Previous: <a href="#Default-expansion" accesskey="p" rel="prev">Default expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Variable-expansion-1"></span><h4 class="subsection">5.3.2 Variable expansion</h4>
+
+<span id="index-_0024-expansion"></span>
+<span id="index-environment-variables-in-paths"></span>
+<span id="index-variable-expansion"></span>
+<span id="index-expansion_002c-variable"></span>
+<span id="index-texmf_002ecnf_002c-and-variable-expansion"></span>
+
+<p>&lsquo;<samp>$foo</samp>&rsquo; or &lsquo;<samp>${foo}</samp>&rsquo; in a path element is replaced by (1) the
+value of an environment variable &lsquo;<samp>foo</samp>&rsquo; (if defined); (2) the value
+of &lsquo;<samp>foo</samp>&rsquo; from <samp>texmf.cnf</samp> (if defined); (3) the empty string.
+</p>
+<p>If the character after the &lsquo;<samp>$</samp>&rsquo; is alphanumeric or &lsquo;<samp>_</samp>&rsquo;, the
+variable name consists of all consecutive such characters. If the
+character after the &lsquo;<samp>$</samp>&rsquo; is a &lsquo;<samp>{</samp>&rsquo;, the variable name consists
+of everything up to the next &lsquo;<samp>}</samp>&rsquo; (braces may not be nested around
+variable names). Otherwise, Kpathsea gives a warning and ignores the
+&lsquo;<samp>$</samp>&rsquo; and its following character.
+</p>
+<span id="index-quoting-variable-values"></span>
+<span id="index-shell-variables"></span>
+<p>You must quote the <tt>$</tt>&rsquo;s and braces as necessary for your shell.
+<em>Shell</em> variable values cannot be seen by Kpathsea, i.e., ones
+defined by <code>set</code> in C shells and without <code>export</code> in Bourne
+shells.
+</p>
+<p>For example, given
+</p><div class="example">
+<pre class="example">setenv tex /home/texmf
+setenv TEXINPUTS .:$tex:${tex}prev
+</pre></div>
+<p>the final <code>TEXINPUTS</code> path is the three directories:
+</p><div class="example">
+<pre class="example">.:/home/texmf:/home/texmfprev
+</pre></div>
+
+<p>The &lsquo;<samp>.<var>progname</var></samp>&rsquo; suffix on variables and
+&lsquo;<samp>_<var>progname</var></samp>&rsquo; on environment variable names are not implemented
+for general variable expansions. These are only recognized when search
+paths are initialized (see <a href="#Path-sources">Path sources</a>).
+</p>
+<span id="index-variable_002ec"></span>
+<p>Variable expansion is implemented in the source file
+<samp>kpathsea/variable.c</samp>.
+</p>
+
+<hr>
+<span id="Tilde-expansion"></span><div class="header">
+<p>
+Next: <a href="#Brace-expansion" accesskey="n" rel="next">Brace expansion</a>, Previous: <a href="#Variable-expansion" accesskey="p" rel="prev">Variable expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Tilde-expansion-1"></span><h4 class="subsection">5.3.3 Tilde expansion</h4>
+
+<span id="index-_007e-expansion"></span>
+<span id="index-home-directories-in-paths"></span>
+<span id="index-tilde-expansion"></span>
+<span id="index-expansion_002c-tilde"></span>
+
+<span id="index-HOME_002c-as-_007e-expansion"></span>
+<span id="index-USERPROFILE_002c-as-_007e-expansion"></span>
+<p>A leading &lsquo;<samp>~</samp>&rsquo; in a path element is replaced by the value of the
+environment variable <code>HOME</code>, or <samp>.</samp> if <code>HOME</code> is not
+set. On Windows, the environment variable <code>USERPROFILE</code> is
+checked instead of <code>HOME</code>.
+</p>
+<p>A leading &lsquo;<samp>~<var>user</var></samp>&rsquo; in a path element is replaced by
+<var>user</var>&rsquo;s home directory from the system <samp>passwd</samp> database.
+</p>
+<p>For example,
+</p><div class="example">
+<pre class="example">setenv TEXINPUTS ~/mymacros:
+</pre></div>
+
+<p>will prepend a directory <samp>mymacros</samp> in your home
+directory to the default path.
+</p>
+<span id="index-root-user"></span>
+<span id="index-trailing-_002f-in-home-directory"></span>
+<span id="index-_002f_002c-trailing-in-home-directory"></span>
+<p>As a special case, if a home directory ends in &lsquo;<samp>/</samp>&rsquo;, the trailing
+slash is dropped, to avoid inadvertently creating a &lsquo;<samp>//</samp>&rsquo; construct
+in the path. For example, if the home directory of the user &lsquo;<samp>root</samp>&rsquo;
+is &lsquo;<samp>/</samp>&rsquo;, the path element &lsquo;<samp>~root/mymacros</samp>&rsquo; expands to just
+&lsquo;<samp>/mymacros</samp>&rsquo;, not &lsquo;<samp>//mymacros</samp>&rsquo;.
+</p>
+<span id="index-tilde_002ec"></span>
+<p>Tilde expansion is implemented in the source file <samp>kpathsea/tilde.c</samp>.
+</p>
+
+<hr>
+<span id="Brace-expansion"></span><div class="header">
+<p>
+Next: <a href="#KPSE_005fDOT-expansion" accesskey="n" rel="next">KPSE_DOT expansion</a>, Previous: <a href="#Tilde-expansion" accesskey="p" rel="prev">Tilde expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Brace-expansion-1"></span><h4 class="subsection">5.3.4 Brace expansion</h4>
+
+<span id="index-_007b-expansion"></span>
+<span id="index-brace-expansion"></span>
+
+<p>&lsquo;<samp>x{<var>a</var>,<var>b</var>}y</samp>&rsquo; expands to &lsquo;<samp>x<var>a</var>y:x<var>b</var>y</samp>&rsquo;.
+For example:
+</p>
+<div class="example">
+<pre class="example">foo/{1,2}/baz
+</pre></div>
+
+<p>expands to &lsquo;<samp>foo/1/baz:foo/2/baz</samp>&rsquo;. &lsquo;<samp>:</samp>&rsquo; is the path
+separator on the current system; e.g., on a Windows system, it&rsquo;s &lsquo;<samp>;</samp>&rsquo;.
+</p>
+<p>Braces can be nested; for example, &lsquo;<samp>x{A,B{1,2}}y</samp>&rsquo; expands to
+&lsquo;<samp>xAy:xB1y:xB2y</samp>&rsquo;.
+</p>
+<p>Multiple non-nested braces are expanded from right to left; for example,
+&lsquo;<samp>x{A,B}{1,2}y</samp>&rsquo; expands to &lsquo;<samp>x{A,B}1y:x{A,B}2y</samp>&rsquo;, which
+expands to &lsquo;<samp>xA1y:xB1y:xA2y:xB2y</samp>&rsquo;.
+</p>
+<span id="index-multiple-TeX-hierarchies"></span>
+<p>This feature can be used to implement multiple TeX hierarchies, by
+assigning a brace list to <code>$TEXMF</code>, as mentioned in
+<samp>texmf.in</samp>.
+</p>
+<p>You can also use the path separator instead of the comma. The last
+example could have been written &lsquo;<samp>x{A:B}{1:2}y</samp>&rsquo; (on Unix).
+</p>
+
+<span id="index-expand_002ec"></span>
+<p>Brace expansion is implemented in the source file
+<samp>kpathsea/expand.c</samp>.
+</p>
+
+<hr>
+<span id="KPSE_005fDOT-expansion"></span><div class="header">
+<p>
+Next: <a href="#Subdirectory-expansion" accesskey="n" rel="next">Subdirectory expansion</a>, Previous: <a href="#Brace-expansion" accesskey="p" rel="prev">Brace expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="KPSE_005fDOT-expansion-1"></span><h4 class="subsection">5.3.5 <code>KPSE_DOT</code> expansion</h4>
+
+<span id="index-KPSE_005fDOT-expansion"></span>
+
+<p>When <code>KPSE_DOT</code> is defined in the environment, it names a directory
+that should be considered the current directory for the purpose of
+looking up files in the search paths. This feature is needed by the
+&lsquo;<samp>mktex&hellip;</samp>&rsquo; scripts <a href="#mktex-scripts">mktex scripts</a>, because these
+change the working directory. You should not ever define it yourself.
+</p>
+
+<hr>
+<span id="Subdirectory-expansion"></span><div class="header">
+<p>
+Previous: <a href="#KPSE_005fDOT-expansion" accesskey="p" rel="prev">KPSE_DOT expansion</a>, Up: <a href="#Path-expansion" accesskey="u" rel="up">Path expansion</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Subdirectory-expansion-1"></span><h4 class="subsection">5.3.6 Subdirectory expansion</h4>
+
+<span id="index-_002f_002f"></span>
+<span id="index-subdirectory-searching"></span>
+<span id="index-expansion_002c-subdirectory"></span>
+
+<span id="index-alphabetical-order_002c-not"></span>
+<p>Two or more consecutive slashes in a path element following a directory
+<var>d</var> is replaced by all subdirectories of <var>d</var>: first those
+subdirectories directly under <var>d</var>, then the subsubdirectories under
+those, and so on. At each level, the order in which the directories are
+searched is unspecified. (It&rsquo;s &ldquo;directory order&rdquo;, and definitely not
+alphabetical.)
+</p>
+<p>If you specify any filename components after the &lsquo;<samp>//</samp>&rsquo;, only
+subdirectories which match those components are included. For example,
+&lsquo;<samp>/a//b</samp>&rsquo; would expand into directories <samp>/a/1/b</samp>, <samp>/a/2/b</samp>,
+<samp>/a/1/1/b</samp>, and so on, but not <samp>/a/b/c</samp> or <samp>/a/1</samp>.
+</p>
+<p>You can include multiple &lsquo;<samp>//</samp>&rsquo; constructs in the path.
+</p>
+<p>&lsquo;<samp>//</samp>&rsquo; at the beginning of a path is ignored; you didn&rsquo;t really want
+to search every directory on the system, did you?
+</p>
+<span id="index-trick-for-detecting-leaf-directories"></span>
+<span id="index-leaf-directory-trick"></span>
+<span id="index-Farwell_002c-Matthew"></span>
+<span id="index-MacKenzie_002c-David-1"></span>
+<p>I should mention one related implementation trick, which I took from GNU
+find. Matthew Farwell suggested it, and David MacKenzie implemented it.
+</p>
+<span id="index-st_005fnlink"></span>
+<p>The trick is that in every real Unix implementation (as opposed to the
+POSIX specification), a directory which contains no subdirectories will
+have exactly two links (namely, one for <samp>.</samp> and one for <samp>..</samp>).
+That is to say, the <code>st_nlink</code> field in the &lsquo;<samp>stat</samp>&rsquo; structure
+will be two. Thus, we don&rsquo;t have to stat everything in the bottom-level
+(leaf) directories&mdash;we can just check <code>st_nlink</code>, notice it&rsquo;s two,
+and do no more work.
+</p>
+<p>But if you have a directory that contains a single subdirectory and 500
+regular files, <code>st_nlink</code> will be 3, and Kpathsea has to stat every
+one of those 501 entries. Therein lies slowness.
+</p>
+<span id="index-ST_005fNLINK_005fTRICK"></span>
+<p>You can disable the trick by undefining <code>ST_NLINK_TRICK</code> in
+<samp>kpathsea/config.h</samp>. (It is undefined by default except under Unix.)
+</p>
+<span id="index-elt_002ddirs_002ec"></span>
+<p>Unfortunately, in some cases files in leaf directories are
+<code>stat</code>&rsquo;d: if the path specification is, say,
+&lsquo;<samp>$TEXMF/fonts//pk//</samp>&rsquo;, then files in a subdirectory
+&lsquo;<samp>&hellip;/pk</samp>&rsquo;, even if it is a leaf, are checked. The reason cannot
+be explained without reference to the implementation, so read
+<samp>kpathsea/elt-dirs.c</samp> (search for &lsquo;<samp>may descend</samp>&rsquo;) if you are
+curious. And if you can find a way to <em>solve</em> the problem, please
+let me know.
+</p>
+<span id="index-elt_002ddirs_002ec-1"></span>
+<p>Subdirectory expansion is implemented in the source file
+<samp>kpathsea/elt-dirs.c</samp>.
+</p>
+
+<hr>
+<span id="Casefolding-search"></span><div class="header">
+<p>
+Next: <a href="#Filename-database" accesskey="n" rel="next">Filename database</a>, Previous: <a href="#Path-expansion" accesskey="p" rel="prev">Path expansion</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Casefolding-search-1"></span><h3 class="section">5.4 Casefolding search</h3>
+
+<span id="index-casefolding-search"></span>
+<span id="index-search_002c-case_002dinsensitive"></span>
+
+<p>In Kpathsea version 6.3.0 (released with TeX Live 2018), a new
+fallback search was implemented on Unix-like systems, including Macs:
+for each path element in turn, if no match is found by the normal
+search, and the path element allows for checking the filesystem, a
+second check is made for a case-insensitive match.
+</p>
+<span id="index-texmf_005fcasefold_005fsearch"></span>
+<p>This is enabled at compile-time on Unix systems, and enabled at
+runtime by setting the configuration variable
+<code>texmf_casefold_search</code>, to a true value, e.g., &lsquo;<samp>1</samp>&rsquo;; this is
+done by default in TeX Live.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Casefolding-rationale" accesskey="1">Rationale</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Casefolding-examples" accesskey="2">Examples</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+<hr>
+<span id="Casefolding-rationale"></span><div class="header">
+<p>
+Next: <a href="#Casefolding-examples" accesskey="n" rel="next">Casefolding examples</a>, Up: <a href="#Casefolding-search" accesskey="u" rel="up">Casefolding search</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Casefolding-rationale-1"></span><h4 class="subsection">5.4.1 Casefolding rationale</h4>
+
+<span id="index-casefolding-fallback-rationale"></span>
+<span id="index-rationale-for-casefolding-fallback"></span>
+<span id="index-system_002ddependent-casefolding-behavior"></span>
+
+<span id="index-filesystem_002c-case_002d_0028in_0029sensitive"></span>
+<span id="index-Apple-filesystem_002c-case_002dinsensitive"></span>
+<span id="index-Mac-filesystem_002c-case_002dinsensitive"></span>
+<p>The purpose of the fallback casefolding search is to ease moving
+complex documents between case-insensitive (file)systems and
+case-sensitive ones. In particular, Apple decided to make the default
+filesystem on Macs be case-insensitive some years ago, and this has
+exacerbated a problem of people creating documents that use, say, an
+image under the name <samp>foo.jpg</samp>, while the actual file is named
+<samp>foo.JPG</samp> or <samp>Foo.jpg</samp>. It works on the Mac but if the
+document is transferred and run on a standard case-sensitive Unix
+(file)system, the file can&rsquo;t be found, due only to differences in
+case.
+</p>
+<p>This same problematic scenario has always existed on Windows, but for
+whatever reason, it has become much more common since Apple also went
+to a case-insensitive filesystem. Hence the move to change the
+Kpathsea behavior now.
+</p>
+<span id="index-Windows-and-casefolding"></span>
+<p>The fallback case-insensitive search is omitted at compile-time on
+Windows, where (for practical purposes) all file names are
+case-insensitive at the kernel level, and so the normal search will
+already have definitively matched or not. Therefore, search results
+in unusual cases can be different on Windows and Unix&mdash;but this has
+always been true.
+</p>
+
+<hr>
+<span id="Casefolding-examples"></span><div class="header">
+<p>
+Previous: <a href="#Casefolding-rationale" accesskey="p" rel="prev">Casefolding rationale</a>, Up: <a href="#Casefolding-search" accesskey="u" rel="up">Casefolding search</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Casefolding-examples-1"></span><h4 class="subsection">5.4.2 Casefolding examples</h4>
+
+<span id="index-casefolding-examples"></span>
+<span id="index-examples_002c-of-casefolding-searches"></span>
+
+<p>The casefolding implementation prefers exact matches to casefolded
+matches within a given path element, so as to retain most
+compatibility. Backward compatibility is not perfect, however, as a
+casefolded match may be found in an earlier path element than an exact
+match was previously found (see example #4 below). Still, preferring
+the match in the earlier element seemed potentially less confusing
+than otherwise, and is in fact consistent with past behavior on
+Windows. Since case mismatches are rare to begin with, and name
+collisions with respect only to case thus even more rare, the hope is
+that it will not cause difficulties in practice.
+</p>
+<p>If it&rsquo;s desirable in a given situation to have the exact same search
+behavior as previously, that can be accomplished by setting the
+configuration variable <code>texmf_casefold_search</code> to &lsquo;<samp>0</samp>&rsquo;
+(see <a href="#Path-sources">Path sources</a>).
+</p>
+<p>Some examples to illustrate the new behavior follow.
+</p>
+<p>Example #1: suppose the file <samp>./foobar.tex</samp> exists. Now,
+searching for <samp>./FooBar.TeX</samp> (or any other case variation) will
+succeed, returning <samp>./foobar.tex</samp>&mdash;the name as stored on disk.
+In previous releases, or if <code>texmf_casefold_search</code> is false, the
+search would fail.
+</p>
+<p>Example #2: suppose we are using a case-sensitive (file)system, and
+the search path is &lsquo;<samp>.:/somedir</samp>&rsquo;, and the files
+<samp>./foobar.tex</samp> and <samp>/somedir/FooBar.TeX</samp> both exist. Both
+now and previously, searching for <samp>foobar.tex</samp> returns
+<samp>./foobar.tex</samp>. However, searching for <samp>FooBar.TeX</samp> now
+returns <samp>./foobar.tex</samp> instead of <samp>/somedir/FooBar.TeX</samp>;
+this is the incompatibility mentioned above. Also (as expected),
+searching for <samp>FOOBAR.TEX</samp> (or whatever variation) will now
+return <samp>./foobar.tex</samp>, whereas before it would fail. Searching
+for all (&lsquo;<samp>kpsewhich --all</samp>&rsquo;) <samp>foobar.tex</samp> will return both
+matches.
+</p>
+<p>Example #3: same as example #2, but on a case-insensitive
+(file)system: both now and previously, searching for <samp>FooBar.TeX</samp>
+returns <samp>./foobar.tex</samp>, since the system considers that a match.
+The Kpathsea casefolding never comes into play.
+</p>
+<p>Example #4: if we have (on a case-sensitive system) both
+<samp>./foobar.tex</samp> and <samp>./FOOBAR.TEX</samp>, searching with the exact
+case returns that exact match, now and previously. Searching for
+<samp>FooBar.tex</samp> will now return one or the other (chosen
+arbitrarily), rather than failing. Perhaps unexpectedly, searching
+for all <samp>foobar.tex</samp> or <samp>FooBar.tex</samp> will also return only
+one or the other, not both (see more below).
+</p>
+<p>Example #5: the font file <samp>STIX-Regular.otf</samp> is included in
+TeX Live in the system directory
+<samp>texmf-dist/fonts/opentype/public/stix</samp>. Because Kpathsea never
+searches the disk in the big system directory, the casefolding is not
+done, and a search for &lsquo;<samp>stix-regular.otf</samp>&rsquo; will fail (on
+case-sensitive systems), as it always has.
+</p>
+<span id="index-_0021_0021-and-casefolding"></span>
+<p>The caveat about not searching the disk amounts to saying that
+casefolding does not happen in the trees specified with &lsquo;<samp>!!</samp>&rsquo;
+(see <a href="#ls_002dR">ls-R</a>), that is, where only database (<samp>ls-R</samp>) searching
+is done. In TeX Live, that is the &lsquo;<samp>texmf-local</samp>&rsquo; and
+&lsquo;<samp>texmf-dist</samp>&rsquo; trees (also <code>$TEXMFSYSCONFIG</code> and
+<code>$TEXMFSYSVAR</code>, but those are rarely noticed). The rationale for
+this is that in practice, case mangling happens with user-created
+files, not with packages distributed as part of the TeX system.
+</p>
+<p>One more caveat: the purpose of <code>kpsewhich</code> is to exercise the
+path searching in Kpathsea as it is actually done. Therefore, as
+shown above, &lsquo;<samp>kpsewhich --all</samp>&rsquo; will not return all matches
+regardless of case within a given path element. If you want to find
+all matches in all directories, <code>find</code> is the best tool, although
+the setup takes a couple steps:
+</p>
+<div class="example">
+<pre class="example">kpsewhich -show-path=tex &gt;/tmp/texpath # search path specification
+kpsewhich -expand-path=&quot;`cat /tmp/texpath`&quot; &gt;/tmp/texdirs # all dirs
+tr ':' '\n' &lt;/tmp/texdirs &gt;/tmp/texdirlist # colons to newlines
+find `cat /tmp/texdirlist` -iname somefile.tex -print &lt;/tmp/texdirlist
+</pre></div>
+
+<span id="index-Findutils_002c-GNU-package"></span>
+<span id="index-_002diname_002c-find-predicate"></span>
+<p>Sorry that it&rsquo;s annoyingly lengthy, but implementing this inside
+Kpathsea would be a lot of error-prone trouble for something that is
+only useful for debugging. If your <code>find</code> does not support
+<code>-iname</code>, you can get GNU Find from
+<a href="https://www.gnu.org/software/findutils">https://www.gnu.org/software/findutils</a>.
+</p>
+<p>The casefolding search is implemented in the source file
+<samp>kpathsea/pathsearch.c</samp>. Two implementation points:
+</p>
+<ul>
+<li> <span id="index-access-system-call"></span>
+Kpathsea never tries to check if a given directory resides on a
+case-insensitive filesystem, because there is no efficient and
+portable way to do so. All it does is try to see if a potential file
+name is a readable normal file (with, usually, the <code>access</code>
+system call).
+
+</li><li> Kpathsea does not do any case-insensitive matching of the directories
+along the path. It&rsquo;s not going to find <samp>/Some/Random/file.tex</samp>
+when looking for <samp>/some/random/file.tex</samp>. The casefolding only
+happens with the elements of the leaf directory.
+
+</li></ul>
+
+
+<hr>
+<span id="Filename-database"></span><div class="header">
+<p>
+Next: <a href="#Invoking-kpsewhich" accesskey="n" rel="next">Invoking kpsewhich</a>, Previous: <a href="#Casefolding-search" accesskey="p" rel="prev">Casefolding search</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Filename-database-_0028ls_002dR_0029"></span><h3 class="section">5.5 Filename database (<code>ls-R</code>)</h3>
+
+<span id="index-filename-database"></span>
+<span id="index-database_002c-for-filenames"></span>
+<span id="index-externally_002dbuilt-filename-database"></span>
+
+<p>Kpathsea goes to some lengths to minimize disk accesses for searches
+(see <a href="#Subdirectory-expansion">Subdirectory expansion</a>). Nevertheless, in practice searching
+each possible directory in typical TeX installations takes an
+excessively long time.
+</p>
+<p>Therefore, Kpathsea can use an externally-built <em>filename
+database</em> file named <samp>ls-R</samp> that maps files to directories, thus
+avoiding the need to exhaustively search the disk.
+</p>
+<p>A second database file <samp>aliases</samp> allows you to give additional
+names to the files listed in <samp>ls-R</samp>. This can be helpful to adapt
+to &ldquo;8.3&rdquo; filename conventions in source files.
+</p>
+<p>The <samp>ls-R</samp> and <samp>aliases</samp> features are implemented in the
+source file <samp>kpathsea/db.c</samp>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#ls_002dR" accesskey="1">ls-R</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The main filename database.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Filename-aliases" accesskey="2">Filename aliases</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Aliases for those names.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Database-format" accesskey="3">Database format</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Syntax details of the database file.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="ls_002dR"></span><div class="header">
+<p>
+Next: <a href="#Filename-aliases" accesskey="n" rel="next">Filename aliases</a>, Up: <a href="#Filename-database" accesskey="u" rel="up">Filename database</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="ls_002dR-1"></span><h4 class="subsection">5.5.1 <samp>ls-R</samp></h4>
+
+<span id="index-ls_002dR-database-file"></span>
+
+<p>As mentioned above, you must name the main filename database
+<samp>ls-R</samp>. You can put one at the root of each TeX installation
+hierarchy you wish to search (<code>$TEXMF</code> by default, which expands
+to a braced list of several hierarchies in TeX Live).
+</p>
+<span id="index-TEXMFDBS"></span>
+<span id="index-_0021_0021-in-TEXMFDBS"></span>
+<p>Kpathsea looks for <samp>ls-R</samp> files along the <code>TEXMFDBS</code>
+path. It is best for this to contain all and only those hierarchies
+from <code>$TEXMF</code> which are specified with <code>!!</code>&mdash;and also to
+specify them with <code>!!</code> in <code>TEXMFDBS</code>. (See the end of this
+section for more on <code>!!</code>.)
+</p>
+<p>The recommended way to create and maintain &lsquo;<samp>ls-R</samp>&rsquo; is to run the
+<code>mktexlsr</code> script, which is installed in &lsquo;<samp>$(bindir)</samp>&rsquo;
+(<samp>/usr/local/bin</samp> by default). That script goes to some trouble to
+follow symbolic links as necessary, etc. It&rsquo;s also invoked by the
+distributed &lsquo;<samp>mktex&hellip;</samp>&rsquo; scripts.
+</p>
+<span id="index-ls_002dR_002c-simplest-build"></span>
+<p>At its simplest, though, you can build <samp>ls-R</samp> with the command
+</p><div class="example">
+<pre class="example">cd <var>/your/texmf/root</var> &amp;&amp; ls -LAR ./ &gt;ls-R
+</pre></div>
+
+<p><span id="index-_002d_002dcolor_003dtty"></span>
+<span id="index-_002fetc_002fprofile-and-aliases"></span>
+presuming your <code>ls</code> produces the right output format (see the
+section below). GNU <code>ls</code>, for example, outputs in this format.
+Also presuming your <code>ls</code> hasn&rsquo;t been aliased in a system file
+(e.g., <samp>/etc/profile</samp>) to something problematic, e.g., &lsquo;<samp>ls
+--color=tty</samp>&rsquo;. In that case, you will have to disable the alias before
+generating <samp>ls-R</samp>. For the precise definition of the file format,
+see <a href="#Database-format">Database format</a>.
+</p>
+<p>Regardless of whether you use the supplied script or your own, you
+will almost certainly want to invoke it via <code>cron</code>, so when you
+make changes in the installed files (say if you install a new LaTeX
+package), <samp>ls-R</samp> will be automatically updated. However, for
+those using TeX Live or system distributions, the package managers
+should run <code>mktexlsr</code> as needed.
+</p>
+<span id="index-_002dA-option-to-ls"></span>
+<span id="index-dot-files"></span>
+<span id="index-_002e-files"></span>
+<span id="index-_002e-directories_002c-ignored"></span>
+<span id="index-_002etex-file_002c-included-in-ls_002dR"></span>
+<p>The &lsquo;<samp>-A</samp>&rsquo; option to <code>ls</code> includes files beginning with &lsquo;<samp>.</samp>&rsquo;
+(except for <samp>.</samp> and <samp>..</samp>), such as the file <samp>.tex</samp>
+included with the LaTeX tools package. (On the other hand,
+<em>directories</em> whose names begin with &lsquo;<samp>.</samp>&rsquo; are always ignored.)
+</p>
+<span id="index-symbolic-links_002c-and-ls_002dR"></span>
+<span id="index-_002dL-option-to-ls"></span>
+<p>If your system does not support symbolic links, omit the &lsquo;<samp>-L</samp>&rsquo;.
+</p>
+<span id="index-automounter_002c-and-ls_002dR"></span>
+<span id="index-NFS-and-ls_002dR"></span>
+<p><code>ls -LAR <var>/your/texmf/root</var></code> will also work. But using
+&lsquo;<samp>./</samp>&rsquo; avoids embedding absolute pathnames, so the hierarchy can be
+easily transported. It also avoids possible trouble with automounters
+or other network filesystem conventions.
+</p>
+<span id="index-warning-about-unusable-ls_002dR"></span>
+<span id="index-unusable-ls_002dR-warning"></span>
+<p>Kpathsea warns you if it finds an <samp>ls-R</samp> file, but the file does
+not contain any usable entries. The usual culprit is running plain
+&lsquo;<samp>ls -R</samp>&rsquo; instead of &lsquo;<samp>ls -LR ./</samp>&rsquo; or &lsquo;<samp>ls -R
+<var>/your/texmf/root</var></samp>&rsquo;. Another possibility is some system directory
+name starting with a &lsquo;<samp>.</samp>&rsquo; (perhaps if you are using AFS); Kpathsea
+ignores everything under such directories.
+</p>
+<span id="index-_0021_0021-in-path-specifications"></span>
+<span id="index-disk-searching_002c-avoiding"></span>
+<p>If a particular path element begins with &lsquo;<samp>!!</samp>&rsquo;, <em>only</em> the
+database will be searched for that element, never the disk; and if the
+database does not exist, nothing at all will be searched. In TeX
+Live, most of the trees are specified with &lsquo;<samp>!!</samp>&rsquo;.
+</p>
+<p>For path elements that do not begin with &lsquo;<samp>!!</samp>&rsquo;, if the database
+exists, it will be used, and the disk will not be searched. However,
+in this case, if the database does not exist, the disk will be
+searched. In TeX Live, the most notable case of this is the
+<code>TEXMFHOME</code> tree, to allow users to add and remove files from
+their own tree without having to worry about <code>ls-R</code>.
+</p>
+<p>(Aside: there are uncommon cases where a &lsquo;<samp>!!</samp>&rsquo; tree will be
+searched on disk even if the <code>ls-R</code> file exists; they are too
+obscure to try to explain here. See <samp>pathsearch.c</samp> in the source
+if you need to know.)
+</p>
+<p>To sum up: do not create an <code>ls-R</code> file unless you also take care
+to keep it up to date. Otherwise newly-installed files will not be
+found.
+</p>
+
+
+<hr>
+<span id="Filename-aliases"></span><div class="header">
+<p>
+Next: <a href="#Database-format" accesskey="n" rel="next">Database format</a>, Previous: <a href="#ls_002dR" accesskey="p" rel="prev">ls-R</a>, Up: <a href="#Filename-database" accesskey="u" rel="up">Filename database</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Filename-aliases-1"></span><h4 class="subsection">5.5.2 Filename aliases</h4>
+
+<span id="index-filename-aliases"></span>
+<span id="index-aliases_002c-for-filenames"></span>
+
+<p>In some circumstances, you may wish to find a file under several names.
+For example, suppose a TeX document was created using a DOS system
+and tries to read <samp>longtabl.sty</samp>. But now it&rsquo;s being run on a Unix
+system, and the file has its original name, <samp>longtable.sty</samp>. The
+file won&rsquo;t be found. You need to give the actual file
+<samp>longtable.sty</samp> an alias &lsquo;<samp>longtabl.sty</samp>&rsquo;.
+</p>
+
+<p>You can handle this by creating a file <samp>aliases</samp> as a companion to
+the <samp>ls-R</samp> for the hierarchy containing the file in question. (You
+must have an <samp>ls-R</samp> for the alias feature to work.)
+</p>
+<p>The format of <samp>aliases</samp> is simple: two whitespace-separated words
+per line; the first is the real name <samp>longtable.sty</samp>, and second is
+the alias (<samp>longtabl.sty</samp>). These must be base filenames, with no
+directory components. <samp>longtable.sty</samp> must be in the sibling
+<samp>ls-R</samp>.
+</p>
+<p>Also, blank lines and lines starting with &lsquo;<samp>%</samp>&rsquo; or &lsquo;<samp>#</samp>&rsquo; are
+ignored in <samp>aliases</samp>, to allow for comments.
+</p>
+<p>If a real file <samp>longtabl.sty</samp> exists, it is used regardless of any
+aliases.
+</p>
+
+<hr>
+<span id="Database-format"></span><div class="header">
+<p>
+Previous: <a href="#Filename-aliases" accesskey="p" rel="prev">Filename aliases</a>, Up: <a href="#Filename-database" accesskey="u" rel="up">Filename database</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Database-format-1"></span><h4 class="subsection">5.5.3 Database format</h4>
+
+<span id="index-format-of-external-database"></span>
+<span id="index-database_002c-format-of"></span>
+
+<p>The &ldquo;database&rdquo; read by Kpathsea is a line-oriented file of plain
+text. The format is that generated by GNU (and most other) <code>ls</code>
+programs given the &lsquo;<samp>-R</samp>&rsquo; option, as follows.
+</p>
+<ul>
+<li> Blank lines are ignored.
+
+</li><li> If a line begins with &lsquo;<samp>/</samp>&rsquo; or &lsquo;<samp>./</samp>&rsquo; or &lsquo;<samp>../</samp>&rsquo; and ends with
+a colon, it&rsquo;s the name of a directory. (&lsquo;<samp>../</samp>&rsquo; lines aren&rsquo;t useful,
+however, and should not be generated.)
+
+</li><li> All other lines define entries in the most recently seen directory.
+<tt>/</tt>&rsquo;s in such lines will produce possibly-strange results.
+
+</li><li> Files with no preceding directory line are ignored.
+</li></ul>
+
+<p>For example, here&rsquo;s the first few lines of <samp>ls-R</samp> (which totals
+about 30K bytes) on my system:
+</p>
+<div class="example">
+<pre class="example">bibtex
+dvips
+fonts
+ls-R
+metafont
+metapost
+tex
+web2c
+
+./bibtex:
+bib
+bst
+doc
+
+./bibtex/bib:
+asi.bib
+btxdoc.bib
+&hellip;
+</pre></div>
+
+
+<hr>
+<span id="Invoking-kpsewhich"></span><div class="header">
+<p>
+Previous: <a href="#Filename-database" accesskey="p" rel="prev">Filename database</a>, Up: <a href="#Path-searching" accesskey="u" rel="up">Path searching</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="kpsewhich_003a-Standalone-path-searching"></span><h3 class="section">5.6 <code>kpsewhich</code>: Standalone path searching</h3>
+
+<span id="index-kpsewhich"></span>
+<span id="index-path-searching_002c-standalone"></span>
+<span id="index-standalone-path-searching"></span>
+
+<p>The Kpsewhich program exercises the path searching functionality
+independent of any particular application. This can also be useful as a
+sort of <code>find</code> program to locate files in your TeX hierarchies,
+perhaps in administrative scripts. It is used heavily in the
+distributed &lsquo;<samp>mktex&hellip;</samp>&rsquo; scripts.
+</p>
+<p>Synopsis:
+</p>
+<div class="example">
+<pre class="example">kpsewhich <var>option</var>&hellip; <var>filename</var>&hellip;
+</pre></div>
+
+<p>The options and filename(s) to look up can be intermixed.
+Options can start with either &lsquo;<samp>-</samp>&rsquo; or &lsquo;<samp>--</samp>&rsquo;, and any unambiguous
+abbreviation is accepted.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Path-searching-options" accesskey="1">Path searching options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Changing the mode, resolution, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Specially_002drecognized-files" accesskey="2">Specially-recognized files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Default formats for texmf.cnf, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Auxiliary-tasks" accesskey="3">Auxiliary tasks</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Path and variable expansion, etc.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Standard-options" accesskey="4">Standard options</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">&lsquo;<samp>--help</samp>&rsquo; and &lsquo;<samp>--version</samp>&rsquo;.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Path-searching-options"></span><div class="header">
+<p>
+Next: <a href="#Specially_002drecognized-files" accesskey="n" rel="next">Specially-recognized files</a>, Up: <a href="#Invoking-kpsewhich" accesskey="u" rel="up">Invoking kpsewhich</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Path-searching-options-1"></span><h4 class="subsection">5.6.1 Path searching options</h4>
+
+<span id="index-path-searching-options"></span>
+
+<p>Kpsewhich looks up each non-option argument on the command line as a
+filename, and returns the first file found.
+</p>
+<p>Various options alter the path searching behavior:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>--all</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dall"></span>
+<span id="index-all-matches_002c-finding"></span>
+<p>Report all matches found, one per line. By default, if there is more
+than one match, just one will be reported (chosen effectively at
+random). Exception: with the glyph formats (<code>pk</code>, <code>gf</code>),
+this option has no effect and only the first match is returned.
+</p>
+</dd>
+<dt>&lsquo;<samp>--casefold-search</samp>&rsquo;</dt>
+<dt>&lsquo;<samp>--no-casefold-search</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dcasefold_002dsearch"></span>
+<span id="index-_002d_002dno_002dcasefold_002dsearch"></span>
+<p>Explicitly enable or disable the fallback to a case-insensitive search
+on Unix platforms (see <a href="#Casefolding-search">Casefolding search</a>); no effect on Windows.
+The default is enabled, set in <code>texmf.cnf</code>. Disabling
+(<code>--no-casefold-search</code>) does not mean that searches magically
+become case-sensitive when the underlying (file)system is
+case-insensitive, it merely means that Kpathsea does not do any
+casefolding itself.
+</p>
+</dd>
+<dt>&lsquo;<samp>--dpi=<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002ddpi_003dnum"></span>
+<span id="index-_002dD-num"></span>
+<span id="index-resolution_002c-setting"></span>
+<p>Set the resolution to <var>num</var>; this only affects &lsquo;<samp>gf</samp>&rsquo; and
+&lsquo;<samp>pk</samp>&rsquo; lookups. &lsquo;<samp>-D</samp>&rsquo; is a synonym, for compatibility with
+Dvips. Default is 600.
+</p>
+</dd>
+<dt>&lsquo;<samp>--engine=<var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dengine_003dname"></span>
+<span id="index-engine-name"></span>
+<p>Set the engine name to <var>name</var>. By default it is not set. The
+engine name is used in some search paths to allow files with the same
+name but used by different engines to coexist.
+</p>
+<p>In particular, since the memory dump files
+(<samp>.fmt</samp>/<samp>.base</samp>/<samp>.mem</samp>) are now stored in
+subdirectories named for the engine (<samp>tex</samp>, <samp>pdftex</samp>,
+<samp>xetex</samp>, etc.), you must specify an engine name in order to find
+them. For example, <samp>cont-en.fmt</samp> typically exists for both
+<samp>pdftex</samp> and <samp>xetex</samp>. With the default path settings, you
+can use &lsquo;<samp>--engine=/</samp>&rsquo; to look for any dump file, regardless of
+engine; if a dump file exists for more than one engine, it&rsquo;s
+indeterminate which one is returned. (The &lsquo;<samp>/</samp>&rsquo; ends up specifying
+a normal recursive search along the path where the dumps are stored,
+namely &lsquo;<samp>$TEXMF/web2c{/$engine,}</samp>&rsquo;.)
+</p>
+</dd>
+<dt>&lsquo;<samp>--format=<var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dformat_003dname"></span>
+<p>Set the format for lookup to <var>name</var>. By default, the format is
+guessed from the filename, with &lsquo;<samp>tex</samp>&rsquo; being used if nothing else
+fits. The recognized filename extensions (including any leading
+&lsquo;<samp>.</samp>&rsquo;) are also allowable <var>name</var>s.
+</p>
+<p>All formats also have a name, which is the only way to specify formats
+with no associated suffix. For example, for Dvips configuration files
+you can use &lsquo;<samp>--format=&quot;dvips config&quot;</samp>&rsquo;. (The quotes are for the
+sake of the shell.)
+</p>
+<p>Here&rsquo;s the current list of recognized names and the associated suffixes.
+See <a href="#Supported-file-formats">Supported file formats</a>, for more information on each of these.
+</p>
+<p>The strings in parentheses are abbreviations recognized only by
+<code>kpsewhich</code> (not the underlying library calls). They are
+provided when it would otherwise require an argument containing a
+space to specify the format, to simplify quoting of calls from shells.
+</p>
+<div class="example">
+<pre class="example">gf: gf
+pk: pk
+bitmap font (bitmapfont):
+tfm: .tfm
+afm: .afm
+base: .base
+bib: .bib
+bst: .bst
+cnf: .cnf
+ls-R: ls-R ls-r
+fmt: .fmt
+map: .map
+mem: .mem
+mf: .mf
+mfpool: .pool
+mft: .mft
+mp: .mp
+mppool: .pool
+MetaPost support (mpsupport):
+ocp: .ocp
+ofm: .ofm .tfm
+opl: .opl .pl
+otp: .otp
+ovf: .ovf .vf
+ovp: .ovp .vpl
+graphic/figure: .eps .epsi
+tex: .tex .sty .cls .fd .aux .bbl .def .clo .ldf
+TeX system documentation (doc):
+texpool: .pool
+TeX system sources (source): .dtx .ins
+PostScript header: .pro
+Troff fonts (trofffont):
+type1 fonts: .pfa .pfb
+vf: .vf
+dvips config (dvipsconfig):
+ist: .ist
+truetype fonts: .ttf .ttc .TTF .TTC .dfont
+type42 fonts: .t42 .T42
+web2c files (web2c):
+other text files (othertext):
+other binary files (otherbin):
+misc fonts (miscfont):
+web: .web .ch
+cweb: .w .web .ch
+enc files: .enc
+cmap files (cmap):
+subfont definition files: .sfd
+opentype fonts: .otf
+pdftex config (pdftexconfig):
+lig files: .lig
+texmfscripts:
+lua: .lua .luatex .luc .luctex .texlua .texluc .tlu
+font feature files: .fea
+cid maps: .cid .cidmap
+mlbib: .mlbib .bib
+mlbst: .mlbst .bst
+clua: .dll .so
+ris: .ris
+bltxml: .bltxml
+</pre></div>
+
+<p>This option and &lsquo;<samp>--path</samp>&rsquo; are mutually exclusive.
+</p>
+</dd>
+<dt>&lsquo;<samp>--interactive</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dinteractive"></span>
+<span id="index-interactive-query"></span>
+<p>After processing the command line, read additional filenames to look up
+from standard input.
+</p>
+</dd>
+<dt>&lsquo;<samp>--mktex=<var>filetype</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp>--no-mktex=<var>filetype</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dmktex_003dfiletype"></span>
+<span id="index-_002d_002dno_002dmktex_003dfiletype"></span>
+<p>Turn on or off the &lsquo;<samp>mktex</samp>&rsquo; script associated with <var>filetype</var>.
+Usual values for <var>filetype</var> are &lsquo;<samp>pk</samp>&rsquo;, &lsquo;<samp>mf</samp>&rsquo;, &lsquo;<samp>tex</samp>&rsquo;,
+and &lsquo;<samp>tfm</samp>&rsquo;. By default, all are off in Kpsewhich, even if they
+are enabled for TeX. This option implies setting
+<code>--must-exist</code>. See <a href="#mktex-scripts">mktex scripts</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--mode=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dmode_003dstring"></span>
+<p>Set the mode name to <var>string</var>; this also only affects &lsquo;<samp>gf</samp>&rsquo; and
+&lsquo;<samp>pk</samp>&rsquo; lookups. No default: any mode will be found. See <a href="#mktex-script-arguments">mktex script arguments</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--must-exist</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dmust_002dexist"></span>
+<p>Do everything possible to find the files, notably including searching
+the disk and running the &lsquo;<samp>mktex</samp>&rsquo; scripts. By default, only the
+<samp>ls-R</samp> database is checked, in the interest of efficiency.
+</p>
+</dd>
+<dt>&lsquo;<samp>--path=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dpath_003dstring"></span>
+<p>Search along the path <var>string</var> (colon-separated as usual), instead
+of guessing the search path from the filename. &lsquo;<samp>//</samp>&rsquo; and all the
+usual expansions are supported (see <a href="#Path-expansion">Path expansion</a>). This option
+and &lsquo;<samp>--format</samp>&rsquo; are mutually exclusive. To output the complete
+directory expansion of a path, instead of doing a one-shot lookup, see
+&lsquo;<samp>--expand-path</samp>&rsquo; and &lsquo;<samp>--show-path</samp>&rsquo; in the following section.
+</p>
+</dd>
+<dt>&lsquo;<samp>--progname=<var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dprogname_003dname"></span>
+<p>Set the program name to <var>name</var>; default is &lsquo;<samp>kpsewhich</samp>&rsquo;. This
+can affect the search paths via the &lsquo;<samp>.<var>prognam</var></samp>&rsquo; feature in
+configuration files (see <a href="#Config-files">Config files</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>--subdir=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dsubdir_003dstring"></span>
+<p>Report only those matches whose directory part <em>ends</em> with
+<var>string</var> (compared literally, except case is ignored on a
+case-insensitive operating system). For example, suppose there are
+two matches for a given name:
+</p>
+<div class="example">
+<pre class="example">kpsewhich foo.sty
+&rArr; /some/where/foo.sty
+/another/place/foo.sty
+</pre></div>
+
+<p>Then we can narrow the result to what we are interested in with
+<samp>--subdir</samp>:
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=where foo.sty
+&rArr; /some/where/foo.sty
+
+kpsewhich --subdir=place foo.sty
+&rArr; /another/place/foo.sty
+</pre></div>
+
+<p>The string to match must be at the end of the directory part of the
+match, and it is taken literally, with no pattern matching:
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=another foo.sty
+&rArr;
+</pre></div>
+
+<p>The string to match may cross directory components:
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=some/where foo.sty
+&rArr; /some/where/foo.sty
+</pre></div>
+
+<p><samp>--subdir</samp> implies <samp>--all</samp>; if there is more than one
+match, they will all be reported (in our example, both &lsquo;<samp>where</samp>&rsquo;
+and &lsquo;<samp>place</samp>&rsquo; end in &lsquo;<samp>e</samp>&rsquo;):
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=e
+&rArr; /some/where/foo.sty
+/another/place/foo.sty
+</pre></div>
+
+<p>Because of the above rules, the presence of a leading &lsquo;<samp>/</samp>&rsquo; is
+important, since it &ldquo;anchors&rdquo; the match to a full component name:
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=/lace foo.sty
+&rArr;
+</pre></div>
+
+<p>However, a trailing &lsquo;<samp>/</samp>&rsquo; is immaterial (and ignored), since the
+match always takes place at the end of the directory part:
+</p>
+<div class="example">
+<pre class="example">kpsewhich --subdir=lace/ foo.sty
+&rArr; /another/place/foo.sty
+</pre></div>
+
+<p>The purpose of these rules is to make it convenient to find results
+only within a particular area of the tree. For instance, a given
+script named <samp>foo.lua</samp> might exist within both
+<samp>texmf-dist/scripts/pkg1/</samp> and <samp>texmf-dist/scripts/pkg2/</samp>.
+By specifying, say, &lsquo;<samp>--subdir=/pkg1</samp>&rsquo;, you can be sure of getting
+the one you are interested in.
+</p>
+<p>We only match at the end because a site might happen to install TeX
+in <samp>/some/coincidental/pkg1/path/</samp>, and we wouldn&rsquo;t want to match
+<samp>texmf-dist/scripts/pkg2/</samp> that when searching for &lsquo;<samp>/pkg1</samp>&rsquo;.
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Specially_002drecognized-files"></span><div class="header">
+<p>
+Next: <a href="#Auxiliary-tasks" accesskey="n" rel="next">Auxiliary tasks</a>, Previous: <a href="#Path-searching-options" accesskey="p" rel="prev">Path searching options</a>, Up: <a href="#Invoking-kpsewhich" accesskey="u" rel="up">Invoking kpsewhich</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Specially_002drecognized-files-for-kpsewhich"></span><h4 class="subsection">5.6.2 Specially-recognized files for <code>kpsewhich</code></h4>
+
+<p><code>kpsewhich</code> recognizes a few special filenames on the command
+line and defaults to using the &lsquo;known&rsquo; file formats for them, merely
+to save the time and trouble of specifying the format. This is only a
+feature of <code>kpsewhich</code>; when using the Kpathsea library
+itself, none of these special filenames are recognized, and it&rsquo;s still
+up to the caller to specify the desired format.
+</p>
+<p>Here is the list of special filenames to <code>kpsewhich</code>, along
+with their corresponding format:
+</p>
+<dl compact="compact">
+<dd>
+<span id="index-config_002eps"></span>
+</dd>
+<dt><samp>config.ps</samp></dt>
+<dd><p><code>dvips config</code>
+</p>
+<span id="index-dvipdfmx_002ecfg"></span>
+</dd>
+<dt><samp>dvipdfmx.cfg</samp></dt>
+<dd><p>&lsquo;<samp>other text files</samp>&rsquo;
+</p>
+<span id="index-fmtutil_002ecnf"></span>
+</dd>
+<dt><samp>fmtutil.cnf</samp></dt>
+<dd><p>&lsquo;<samp>web2c files</samp>&rsquo;
+</p>
+<span id="index-glyphlist_002etxt"></span>
+</dd>
+<dt><samp>glyphlist.txt</samp></dt>
+<dd><p>&lsquo;<samp>map</samp>&rsquo;
+</p>
+<span id="index-mktex_002ecnf"></span>
+</dd>
+<dt><samp>mktex.cnf</samp></dt>
+<dd><p>&lsquo;<samp>web2c files</samp>&rsquo;
+</p>
+<span id="index-pdfglyphlist_002etxt"></span>
+</dd>
+<dt><samp>pdfglyphlist.txt</samp></dt>
+<dd><p>&lsquo;<samp>map</samp>&rsquo;
+</p>
+<span id="index-pdftex_002ecfg"></span>
+<span id="index-pdftexconfig_002etex"></span>
+</dd>
+<dt><samp>pdftex.cfg</samp></dt>
+<dd><p>&lsquo;<samp>pdftex config</samp>&rsquo; (although <samp>pdftex.cfg</samp> is not used any more;
+look for the file <samp>pdftexconfig.tex</samp> instead.)
+</p>
+<span id="index-texmf_002ecnf"></span>
+</dd>
+<dt><samp>texmf.cnf</samp></dt>
+<dd><p>&lsquo;<samp>cnf</samp>&rsquo;
+</p>
+<span id="index-XDvi"></span>
+</dd>
+<dt><samp>XDvi</samp></dt>
+<dd><p>&lsquo;<samp>other text files</samp>&rsquo;
+</p>
+</dd>
+</dl>
+
+<p>A user-specified format will override the above defaults.
+</p>
+<span id="index-tcfmgr_002emap"></span>
+<p>Another useful configuration file in this regard is <samp>tcfmgr.map</samp>,
+found in <samp>texmf/texconfig/tcfmgr.map</samp>, which records various
+information about the above configuration files (among others).
+</p>
+
+<hr>
+<span id="Auxiliary-tasks"></span><div class="header">
+<p>
+Next: <a href="#Standard-options" accesskey="n" rel="next">Standard options</a>, Previous: <a href="#Specially_002drecognized-files" accesskey="p" rel="prev">Specially-recognized files</a>, Up: <a href="#Invoking-kpsewhich" accesskey="u" rel="up">Invoking kpsewhich</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Auxiliary-tasks-1"></span><h4 class="subsection">5.6.3 Auxiliary tasks</h4>
+
+<span id="index-auxiliary-tasks"></span>
+
+<p>Kpsewhich provides some features in addition to path lookup as such:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>--debug=<var>num</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002ddebug_003dnum"></span>
+<p>Set debugging options to <var>num</var>. See <a href="#Debugging">Debugging</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--expand-braces=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dexpand_002dbraces_003dstring"></span>
+<p>Output variable, tilde, and brace expansion of <var>string</var>, which is
+assumed to be a single path element. See <a href="#Path-expansion">Path expansion</a>.
+</p>
+</dd>
+<dt>&lsquo;<samp>--expand-path=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dexpand_002dpath_003dstring"></span>
+<p>Output the complete expansion of <var>string</var>, with each element
+separated by the usual path separator on the current system (&lsquo;<samp>;</samp>&rsquo;
+on Windows, &lsquo;<samp>:</samp>&rsquo; otherwise). This may be useful to construct a
+custom search path for a format not otherwise supported. To retrieve
+the search path for a format that is already supported, see
+&lsquo;<samp>--show-path</samp>&rsquo;.
+</p>
+<p>Nonexistent directories are culled from the output:
+</p>
+<div class="example">
+<pre class="example">$ kpsewhich --expand-path '/tmp'
+&rArr; /tmp
+$ kpsewhich --expand-path '/nonesuch'
+&rArr;
+</pre></div>
+
+<p>For one-shot uses of an arbitrary (not built in to Kpathsea) path, see
+&lsquo;<samp>--path</samp>&rsquo; (see <a href="#Path-searching-options">Path searching options</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>--expand-var=<var>string</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dexpand_002dvar_003dstring"></span>
+<p>Output the variable and tilde expansion of <var>string</var>. For example,
+with the usual <samp>texmf.cnf</samp>, &lsquo;<samp>kpsewhich
+--expand-var='$TEXMF'</samp>&rsquo; returns the TeX system hierarchy root(s).
+See <a href="#Path-expansion">Path expansion</a>. The specified <var>string</var> can contain
+anything, though, not just variable references. This calls
+<code>kpse_var_expand</code> (see <a href="#Programming-with-config-files">Programming with config files</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>--help-formats</samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dhelp_002dformats"></span>
+<p>Output information about each supported format (see <a href="#Supported-file-formats">Supported file formats</a>), including the names and abbreviations, variables
+looked for, and the original path.
+</p>
+</dd>
+<dt>&lsquo;<samp>--safe-in-name=<var>name</var></samp>&rsquo;</dt>
+<dt>&lsquo;<samp>--safe-out-name=<var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dsafe_002din_002dname_003dname"></span>
+<span id="index-_002d_002dsafe_002dout_002dname_003dname"></span>
+<p>Exit successfully if <var>name</var> is safe to open for reading or
+writing, respectively, else unsuccessfully. No output is written.
+These tests take account of the related Kpathsea configuration
+settings (see <a href="#Calling-sequence">Calling sequence</a>).
+</p>
+</dd>
+<dt>&lsquo;<samp>--show-path=<var>name</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dshow_002dpath_003dname"></span>
+<p>Show the path that would be used for file lookups of file type
+<var>name</var>. Either a filename extension (&lsquo;<samp>pk</samp>&rsquo;, &lsquo;<samp>.vf</samp>&rsquo;, etc.)
+or an integer can be used, just as with &lsquo;<samp>--format</samp>&rsquo;, described in
+the previous section.
+</p>
+</dd>
+<dt>&lsquo;<samp>--var-brace-value=<var>variable</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dvar_002dbrace_002dvalue_003dvariable"></span>
+<p>Like &lsquo;<samp>--var-value</samp>&rsquo; (next), but also expands &lsquo;<samp>{...}</samp>&rsquo;
+constructs. (see <a href="#Brace-expansion">Brace expansion</a>). Thus, the value is assumed to
+possibly be several path elements, and &lsquo;<samp>~</samp>&rsquo; is expanded at the
+beginning of each. The path separator is changed to that of the
+current system in the expansion.
+</p>
+<p>Example: &lsquo;<samp>FOO='.;~' kpsewhich --var-brace-value=FOO</samp>&rsquo; outputs (on
+a Unix-ish system) &lsquo;<samp>.:/home/karl</samp>&rsquo;, supposing the latter is the
+current user&rsquo;s home directory. Note that the &lsquo;<samp>;</samp>&rsquo; in the source
+value, as commonly used in <samp>texmf.cnf</samp>, has changed to a
+&lsquo;<samp>:</samp>&rsquo;, as the normal path separator on the current system. (On a
+Windows-ish system, the &lsquo;<samp>;</samp>&rsquo; would remain.)
+</p>
+</dd>
+<dt>&lsquo;<samp>--var-value=<var>variable</var></samp>&rsquo;</dt>
+<dd><span id="index-_002d_002dvar_002dvalue_003dvariable"></span>
+<p>Outputs the value of <var>variable</var> (a simple identifier like
+&lsquo;<samp>TEXMFDIST</samp>&rsquo;, with no &lsquo;<samp>$</samp>&rsquo; or other constructs), expanding
+&lsquo;<samp>$</samp>&rsquo; (see <a href="#Variable-expansion">Variable expansion</a>) and &lsquo;<samp>~</samp>&rsquo; (see <a href="#Tilde-expansion">Tilde expansion</a>) constructs in the value. &lsquo;<samp>~</samp>&rsquo; expansion happens at the
+beginning of the overall value and at the beginning of a variable
+expansion, but not arbitrarily within the string. Braces are not expanded.
+</p>
+<p>Example: &lsquo;<samp>--var-value=texmf_casefold_search</samp>&rsquo; outputs (if the
+default is not changed) &lsquo;<samp>1</samp>&rsquo;.
+</p>
+<p>Example to contrast with &lsquo;<samp>--var-brace-value</samp>&rsquo;: &lsquo;<samp>FOO='.;~'
+kpsewhich --var-value=FOO</samp>&rsquo; outputs &lsquo;<samp>.;~</samp>&rsquo;, i.e., the same as the
+input value.
+</p>
+</dd>
+</dl>
+
+
+<hr>
+<span id="Standard-options"></span><div class="header">
+<p>
+Previous: <a href="#Auxiliary-tasks" accesskey="p" rel="prev">Auxiliary tasks</a>, Up: <a href="#Invoking-kpsewhich" accesskey="u" rel="up">Invoking kpsewhich</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Standard-options-1"></span><h4 class="subsection">5.6.4 Standard options</h4>
+
+<span id="index-standard-options"></span>
+
+<p>Kpsewhich accepts the standard GNU options:
+</p>
+<ul>
+<li> <span id="index-_002d_002dhelp"></span>
+&lsquo;<samp>--help</samp>&rsquo; prints a help message on standard output and exits
+successfully.
+
+</li><li> <span id="index-_002d_002dversion"></span>
+&lsquo;<samp>--version</samp>&rsquo; prints the Kpathsea version number and exits successfully.
+</li></ul>
+
+
+<hr>
+<span id="TeX-support"></span><div class="header">
+<p>
+Next: <a href="#Programming" accesskey="n" rel="next">Programming</a>, Previous: <a href="#Path-searching" accesskey="p" rel="prev">Path searching</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="TeX-support-1"></span><h2 class="chapter">6 TeX support</h2>
+
+<span id="index-TeX-support"></span>
+
+<p>Although the basic features in Kpathsea can be used for any type of
+path searching, it came about, as usual, with a specific application
+in mind: I wrote Kpathsea specifically for TeX system programs. I
+had been struggling with the programs I was using (Dvips, Xdvi, and
+TeX itself) having slightly different notions of how to specify
+paths; and debugging was painful, since no code was shared.
+</p>
+<p>Therefore, Kpathsea provides some TeX-specific formats and
+features. Indeed, many of the purportedly generic path searching
+features were provided because they seemed useful in that conTeXt
+(font lookup, particularly).
+</p>
+<p>Kpathsea provides a standard way to search for files of any of the
+supported file types; glyph fonts are a bit different than all the
+rest. Searches are based solely on names of files, not their
+contents&mdash;if a GF file is (mis)named <samp>cmr10.600pk</samp>, it will be
+found as a PK file.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Supported-file-formats" accesskey="1">Supported file formats</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">File types Kpathsea knows about.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#File-lookup" accesskey="2">File lookup</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Searching for most kinds of files.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Glyph-lookup" accesskey="3">Glyph lookup</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Searching for bitmap fonts.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Suppressing-warnings" accesskey="4">Suppressing warnings</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Avoiding warnings via TEX_HUSH.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#mktex-scripts" accesskey="5">mktex scripts</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Generating files at runtime.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Supported-file-formats"></span><div class="header">
+<p>
+Next: <a href="#File-lookup" accesskey="n" rel="next">File lookup</a>, Up: <a href="#TeX-support" accesskey="u" rel="up">TeX support</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Supported-file-formats-1"></span><h3 class="section">6.1 Supported file formats</h3>
+
+<span id="index-supported-file-formats"></span>
+<span id="index-file-formats_002c-supported"></span>
+
+<span id="index-environment-variables-for-TeX"></span>
+<span id="index-TeX-environment-variables"></span>
+
+<p>Kpathsea has support for a number of file types. Each file type has a
+list of environment and config file variables that are checked to define
+the search path, and most have a default suffix that plays a role in
+finding files (see the next section). Some also define additional
+suffixes, and/or a program to be run to create missing files on the fly.
+</p>
+<span id="index-program_002dvarying-paths"></span>
+<p>Since environment variables containing periods, such as
+&lsquo;<samp>TEXINPUTS.latex</samp>&rsquo;, are not allowed on some systems, Kpathsea looks
+for environment variables with an underscore, e.g.,
+&lsquo;<samp>TEXINPUTS_latex</samp>&rsquo; (see <a href="#Config-files">Config files</a>).
+</p>
+<p>The following table lists the above information. You can also get the
+list by giving the &lsquo;<samp>--help-formats</samp>&rsquo; option to <code>kpsewhich</code>
+(see <a href="#Auxiliary-tasks">Auxiliary tasks</a>).
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>afm</samp>&rsquo;</dt>
+<dd><span id="index-_002eafm"></span>
+<span id="index-AFMFONTS"></span>
+<p>(Adobe font metrics, see <a href="https://tug.org/texinfohtml/dvips.html#Metric-files">Metric files</a> in <cite>Dvips</cite>)
+<code>AFMFONTS</code>;
+suffix &lsquo;<samp>.afm</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>base</samp>&rsquo;</dt>
+<dd><span id="index-_002ebase"></span>
+<span id="index-MFBASES"></span>
+<span id="index-TEXMFINI"></span>
+<p>(Metafont memory dump, see <a href="https://tug.org/texinfohtml/web2c.html#Memory-dumps">Memory dumps</a> in <cite>Web2c</cite>)
+<code>MFBASES</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.base</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>bib</samp>&rsquo;</dt>
+<dd><span id="index-_002ebib"></span>
+<span id="index-BIBINPUTS"></span>
+<span id="index-TEXBIB"></span>
+<p>(BibTeX bibliography source, see <a href="https://tug.org/texinfohtml/web2c.html#bibtex-invocation">bibtex invocation</a> in <cite>Web2c</cite>)
+<code>BIBINPUTS</code>, <code>TEXBIB</code>;
+suffix &lsquo;<samp>.bib</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>bltxml</samp>&rsquo;</dt>
+<dd><span id="index-_002ebltxml"></span>
+<span id="index-BLTXMLINPUTS"></span>
+<p>(BibLaTeXML bibliography files for Biber, <a href="http://ctan.org/pkg/biber">http://ctan.org/pkg/biber</a>)
+<code>BLTXMLINPUTS</code>
+suffix &lsquo;<samp>.bltxml</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>bst</samp>&rsquo;</dt>
+<dd><span id="index-_002ebst"></span>
+<span id="index-BSTINPUTS"></span>
+<p>(BibTeX style, see <a href="https://tug.org/texinfohtml/web2c.html#Basic-BibTeX-style-files">Basic BibTeX
+style files</a> in <cite>Web2c</cite>)
+<code>BSTINPUTS</code>;
+suffix &lsquo;<samp>.bst</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>clua</samp>&rsquo;</dt>
+<dd><span id="index-_002edll"></span>
+<span id="index-_002eso"></span>
+<span id="index-CLUAINPUTS"></span>
+<p>(dynamic libraries for Lua, <a href="http://ctan.org/pkg/luatex">http://ctan.org/pkg/luatex</a>)
+<code>CLUAINPUTS</code>
+suffixes &lsquo;<samp>.dll</samp>&rsquo; and &lsquo;<samp>.so</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>cmap</samp>&rsquo;</dt>
+<dd><span id="index-_002ecmap"></span>
+<span id="index-CMAPFONTS"></span>
+<p>(character map files)
+<code>CMAPFONTS</code>;
+suffix &lsquo;<samp>.cmap</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>cnf</samp>&rsquo;</dt>
+<dd><span id="index-_002ecnf"></span>
+<span id="index-TEXMFCNF-1"></span>
+<p>(Runtime configuration files, see <a href="#Config-files">Config files</a>)
+<code>TEXMFCNF</code>;
+suffix &lsquo;<samp>.cnf</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>cweb</samp>&rsquo;</dt>
+<dd><span id="index-_002ew"></span>
+<span id="index-_002eweb"></span>
+<span id="index-CWEBINPUTS"></span>
+<p>(CWEB input files)
+<code>CWEBINPUTS</code>;
+suffixes &lsquo;<samp>.w</samp>&rsquo;, &lsquo;<samp>.web</samp>&rsquo;;
+additional suffix &lsquo;<samp>.ch</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>dvips config</samp>&rsquo;</dt>
+<dd><span id="index-TEXCONFIG"></span>
+<span id="index-config_002eps_002c-search-path-for"></span>
+<p>(Dvips &lsquo;<samp>config.*</samp>&rsquo; files, such as <samp>config.ps</samp>, see <a href="https://tug.org/texinfohtml/dvips.html#Config-files">Config
+files</a> in <cite>Dvips</cite>)
+<code>TEXCONFIG</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>enc files</samp>&rsquo;</dt>
+<dd><span id="index-_002eenc"></span>
+<span id="index-ENCFONTS"></span>
+<p>(encoding vectors)
+<code>ENCFONTS</code>;
+suffix &lsquo;<samp>.enc</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>fmt</samp>&rsquo;</dt>
+<dd><span id="index-_002efmt"></span>
+<span id="index-TEXFORMATS"></span>
+<span id="index-TEXMFINI-1"></span>
+<p>(TeX memory dump, see <a href="https://tug.org/texinfohtml/web2c.html#Memory-dumps">Memory dumps</a> in <cite>Web2c</cite>)
+<code>TEXFORMATS</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.fmt</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>font cid map</samp>&rsquo;</dt>
+<dd><span id="index-_002ecid"></span>
+<span id="index-FONTCIDMAPS"></span>
+<p>(CJK mapping)
+<code>FONTCIDMAPS</code>
+suffix &lsquo;<samp>.cid</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>font feature files</samp>&rsquo;</dt>
+<dd><span id="index-_002efea"></span>
+<span id="index-FONTFEATURES"></span>
+<p>(primarily for OpenType font features)
+<code>FONTFEATURES</code>
+suffix &lsquo;<samp>.fea</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>gf</samp>&rsquo;</dt>
+<dd><span id="index-gf"></span>
+<span id="index-GFFONTS"></span>
+<span id="index-GLYPHFONTS"></span>
+<span id="index-TEXFONTS"></span>
+<p>(generic font bitmap, see <a href="https://tug.org/texinfohtml/dvips.html#Glyph-files">Glyph files</a> in <cite>Dvips</cite>)
+<code><var>program</var>FONTS</code>, <code>GFFONTS</code>, <code>GLYPHFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>gf</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>graphic/figure</samp>&rsquo;</dt>
+<dd><span id="index-_002eeps"></span>
+<span id="index-_002eepsi"></span>
+<span id="index-TEXPICTS"></span>
+<span id="index-TEXINPUTS"></span>
+<p>(Encapsulated PostScript figures, see <a href="https://tug.org/texinfohtml/dvips.html#PostScript-figures">PostScript figures</a> in <cite>Dvips</cite>)
+<code>TEXPICTS</code>, <code>TEXINPUTS</code>;
+additional suffixes: &lsquo;<samp>.eps</samp>&rsquo;, &lsquo;<samp>.epsi</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ist</samp>&rsquo;</dt>
+<dd><span id="index-_002eist"></span>
+<span id="index-TEXINDEXSTYLE"></span>
+<span id="index-INDEXSTYLE"></span>
+<p>(makeindex style files)
+<code>TEXINDEXSTYLE</code>, <code>INDEXSTYLE</code>;
+suffix &lsquo;<samp>.ist</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>lig files</samp>&rsquo;</dt>
+<dd><span id="index-_002elig"></span>
+<span id="index-LIGFONTS"></span>
+<p>(ligature definition files)
+<code>LIGFONTS</code>;
+suffix &lsquo;<samp>.lig</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ls-R</samp>&rsquo;</dt>
+<dd><span id="index-ls_002dR"></span>
+<span id="index-TEXMFDBS-1"></span>
+<p>(Filename databases, see <a href="#Filename-database">Filename database</a>)
+<code>TEXMFDBS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>map</samp>&rsquo;</dt>
+<dd><span id="index-_002emap"></span>
+<span id="index-TEXFONTMAPS"></span>
+<p>(Fontmaps, see <a href="#Fontmap">Fontmap</a>)
+<code>TEXFONTMAPS</code>;
+suffix &lsquo;<samp>.map</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>mem</samp>&rsquo;</dt>
+<dd><span id="index-_002emem"></span>
+<span id="index-MPMEMS"></span>
+<span id="index-TEXMFINI-2"></span>
+<p>(MetaPost memory dump, see <a href="https://tug.org/texinfohtml/web2c.html#Memory-dumps">Memory dumps</a> in <cite>Web2c</cite>)
+<code>MPMEMS</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.mem</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp><span class="roman">MetaPost support</span></samp>&rsquo;</dt>
+<dd><span id="index-MPSUPPORT"></span>
+<p>(MetaPost support files, used by DMP; see <a href="https://tug.org/texinfohtml/web2c.html#dmp-invocation">dmp invocation</a> in <cite>Web2c</cite>)
+<code>MPSUPPORT</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>mf</samp>&rsquo;</dt>
+<dd><span id="index-_002emf"></span>
+<span id="index-MFINPUTS"></span>
+<p>(Metafont source, see <a href="https://tug.org/texinfohtml/web2c.html#mf-invocation">mf invocation</a> in <cite>Web2c</cite>)
+<code>MFINPUTS</code>;
+suffix &lsquo;<samp>.mf</samp>&rsquo;;
+dynamic creation program: <code>mktexmf</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>mfpool</samp>&rsquo;</dt>
+<dd><span id="index-_002epool"></span>
+<span id="index-MFPOOL"></span>
+<p>(Metafont program strings, see <a href="https://tug.org/texinfohtml/web2c.html#pooltype-invocation">pooltype invocation</a> in <cite>Web2c</cite>)
+<code>MFPOOL</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.pool</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>mft</samp>&rsquo;</dt>
+<dd><span id="index-_002emft"></span>
+<span id="index-MFTINPUTS"></span>
+<p>(<code>MFT</code> style file, see <a href="https://tug.org/texinfohtml/web2c.html#mft-invocation">mft invocation</a> in <cite>Web2c</cite>)
+<code>MFTINPUTS</code>;
+suffix &lsquo;<samp>.mft</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>misc fonts</samp>&rsquo;</dt>
+<dd><span id="index-MISCFONTS"></span>
+<p>(font-related files that don&rsquo;t fit the other categories)
+<code>MISCFONTS</code>
+</p>
+</dd>
+<dt>&lsquo;<samp>mlbib</samp>&rsquo;</dt>
+<dd><span id="index-_002emlbib"></span>
+<span id="index-MLBIBINPUTS"></span>
+<span id="index-BIBINPUTS-1"></span>
+<span id="index-TEXBIB-1"></span>
+<p>(MlBibTeX bibliography source)
+<code>MLBIBINPUTS</code>, <code>BIBINPUTS</code>, <code>TEXBIB</code>;
+suffixes &lsquo;<samp>.mlbib</samp>&rsquo;, &lsquo;<samp>.mlbib</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>mlbst</samp>&rsquo;</dt>
+<dd><span id="index-_002emlbst"></span>
+<span id="index-MLBSTINPUTS"></span>
+<span id="index-BSTINPUTS-1"></span>
+<p>(MlBibTeX style)
+<code>MLBSTINPUTS</code>, <code>BSTINPUTS</code>;
+suffixes &lsquo;<samp>.mlbst</samp>&rsquo;, &lsquo;<samp>.bst</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>mp</samp>&rsquo;</dt>
+<dd><span id="index-_002emp"></span>
+<span id="index-MPINPUTS"></span>
+<p>(MetaPost source, see <a href="https://tug.org/texinfohtml/web2c.html#mpost-invocation">mpost invocation</a> in <cite>Web2c</cite>)
+<code>MPINPUTS</code>;
+suffix &lsquo;<samp>.mp</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>mppool</samp>&rsquo;</dt>
+<dd><span id="index-_002epool-1"></span>
+<span id="index-MPPOOL"></span>
+<p>(MetaPost program strings, see <a href="https://tug.org/texinfohtml/web2c.html#pooltype-invocation">pooltype invocation</a> in <cite>Web2c</cite>)
+<code>MPPOOL</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.pool</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ocp</samp>&rsquo;</dt>
+<dd><span id="index-_002eocp"></span>
+<span id="index-OCPINPUTS"></span>
+<p>(Omega compiled process files)
+<code>OCPINPUTS</code>; <br>
+suffix &lsquo;<samp>.ocp</samp>&rsquo;;
+dynamic creation program: <code>MakeOmegaOCP</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>ofm</samp>&rsquo;</dt>
+<dd><span id="index-_002eofm"></span>
+<span id="index-OFMFONTS"></span>
+<p>(Omega font metrics)
+<code>OFMFONTS</code>, <code>TEXFONTS</code>; <br>
+suffixes &lsquo;<samp>.ofm</samp>&rsquo;, &lsquo;<samp>.tfm</samp>&rsquo;;
+dynamic creation program: <code>MakeOmegaOFM</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>opentype fonts</samp>&rsquo;</dt>
+<dd><span id="index-OPENTYPEFONTS"></span>
+<p>(OpenType fonts)
+<code>OPENTYPEFONTS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>opl</samp>&rsquo;</dt>
+<dd><span id="index-_002eopl"></span>
+<p>(Omega property lists)
+<code>OPLFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>.opl</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>otp</samp>&rsquo;</dt>
+<dd><span id="index-_002eotp"></span>
+<span id="index-OTPINPUTS"></span>
+<p>(Omega translation process files)
+<code>OTPINPUTS</code>;
+suffix &lsquo;<samp>.otp</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ovf</samp>&rsquo;</dt>
+<dd><span id="index-_002eovf"></span>
+<span id="index-OVFFONTS"></span>
+<p>(Omega virtual fonts)
+<code>OVFFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>.ovf</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ovp</samp>&rsquo;</dt>
+<dd><span id="index-_002eovp"></span>
+<span id="index-OVPFONTS"></span>
+<p>(Omega virtual property lists)
+<code>OVPFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>.ovp</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>pdftex config</samp>&rsquo;</dt>
+<dd><span id="index-PDFTEXCONFIG"></span>
+<p>(PDFTeX-specific configuration files)
+<code>PDFTEXCONFIG</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>pk</samp>&rsquo;</dt>
+<dd><span id="index-_002epk"></span>
+<span id="index-PKFONTS"></span>
+<span id="index-TEXPKS"></span>
+<span id="index-GLYPHFONTS-1"></span>
+<span id="index-TEXFONTS-1"></span>
+<p>(packed bitmap fonts, see <a href="https://tug.org/texinfohtml/dvips.html#Glyph-files">Glyph files</a> in <cite>Dvips</cite>)
+<code><var>PROGRAM</var>FONTS</code> (<var>program</var> being &lsquo;<samp>XDVI</samp>&rsquo;, etc.),
+<code>PKFONTS</code>, <code>TEXPKS</code>, <code>GLYPHFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>pk</samp>&rsquo;;
+dynamic creation program: <code>mktexpk</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>PostScript header</samp>&rsquo;</dt>
+<dd><span id="index-_002epro"></span>
+<span id="index-TEXPSHEADERS"></span>
+<span id="index-PSHEADERS"></span>
+<p>(downloadable PostScript, see <a href="https://tug.org/texinfohtml/dvips.html#Header-files">Header files</a> in <cite>Dvips</cite>)
+<code>TEXPSHEADERS</code>, <code>PSHEADERS</code>;
+additional suffix &lsquo;<samp>.pro</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>ris</samp>&rsquo;</dt>
+<dd><span id="index-_002eris"></span>
+<span id="index-RISINPUTS"></span>
+<p>(RIS bibliography files, primarily for Biber, <a href="http://ctan.org/pkg/biber">http://ctan.org/pkg/biber</a>)
+<code>RISINPUTS</code>
+suffix &lsquo;<samp>.ris</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>subfont definition files</samp>&rsquo;</dt>
+<dd><span id="index-_002esfd"></span>
+<span id="index-SFDFONTS"></span>
+<p>(subfont definition files)
+<code>SFDFONTS</code>
+suffix &lsquo;<samp>.sfd</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>tex</samp>&rsquo;</dt>
+<dd><span id="index-_002etex"></span>
+<span id="index-TEXINPUTS-1"></span>
+<p>(TeX source, see <a href="https://tug.org/texinfohtml/web2c.html#tex-invocation">tex invocation</a> in <cite>Web2c</cite>)
+<code>TEXINPUTS</code>;
+suffix &lsquo;<samp>.tex</samp>&rsquo;;
+additional suffixes: none, because such a list cannot be complete;
+dynamic creation program: <code>mktextex</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>TeX system documentation</samp>&rsquo;</dt>
+<dd><span id="index-doc-files"></span>
+<span id="index-TEXDOCS"></span>
+<p>(Documentation files for the TeX system)
+<code>TEXDOCS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>TeX system sources</samp>&rsquo;</dt>
+<dd><span id="index-source-files"></span>
+<span id="index-TEXSOURCES"></span>
+<p>(Source files for the TeX system)
+<code>TEXSOURCES</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>texmfscripts</samp>&rsquo;</dt>
+<dd><span id="index-TEXMFSCRIPTS"></span>
+<p>(Architecture-independent executables distributed in the texmf trees)
+<code>TEXMFSCRIPTS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>texpool</samp>&rsquo;</dt>
+<dd><span id="index-_002epool-2"></span>
+<span id="index-TEXPOOL"></span>
+<p>(TeX program strings, see <a href="https://tug.org/texinfohtml/web2c.html#pooltype-invocation">pooltype invocation</a> in <cite>Web2c</cite>)
+<code>TEXPOOL</code>, <code>TEXMFINI</code>;
+suffix &lsquo;<samp>.pool</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>tfm</samp>&rsquo;</dt>
+<dd><span id="index-_002etfm"></span>
+<span id="index-TFMFONTS"></span>
+<span id="index-TEXFONTS-2"></span>
+<p>(TeX font metrics, see <a href="https://tug.org/texinfohtml/dvips.html#Metric-files">Metric files</a> in <cite>Dvips</cite>)
+<code>TFMFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>.tfm</samp>&rsquo;;
+dynamic creation program: <code>mktextfm</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>Troff fonts</samp>&rsquo;</dt>
+<dd><span id="index-TRFONTS"></span>
+<p>(Troff fonts, used by DMP; see <a href="https://tug.org/texinfohtml/web2c.html#DMP-invocation">DMP invocation</a> in <cite>Web2c</cite>)
+<code>TRFONTS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>truetype fonts</samp>&rsquo;</dt>
+<dd><span id="index-_002ettf"></span>
+<span id="index-_002ettc"></span>
+<span id="index-TTFONTS"></span>
+<p>(TrueType outline fonts) <code>TTFONTS</code>; suffixes &lsquo;<samp>.ttf</samp>&rsquo; and
+&lsquo;<samp>.TTF</samp>&rsquo;, &lsquo;<samp>.ttc</samp>&rsquo; and &lsquo;<samp>.TTC</samp>&rsquo;, &lsquo;<samp>.dfont</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>type1 fonts</samp>&rsquo;</dt>
+<dd><span id="index-_002epfa"></span>
+<span id="index-_002epfb"></span>
+<span id="index-T1FONTS"></span>
+<span id="index-T1INPUTS"></span>
+<span id="index-TEXPSHEADERS-1"></span>
+<span id="index-DVIPSHEADERS"></span>
+<p>(Type 1 PostScript outline fonts, see <a href="https://tug.org/texinfohtml/dvips.html#Glyph-files">Glyph files</a> in <cite>Dvips</cite>)
+<code>T1FONTS</code>, <code>T1INPUTS</code>, <code>TEXPSHEADERS</code>, <code>DVIPSHEADERS</code>;
+suffixes &lsquo;<samp>.pfa</samp>&rsquo;, &lsquo;<samp>.pfb</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>type42 fonts</samp>&rsquo;</dt>
+<dd><span id="index-T42FONTS"></span>
+<p>(Type 42 PostScript outline fonts) <code>T42FONTS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>vf</samp>&rsquo;</dt>
+<dd><span id="index-_002evf"></span>
+<span id="index-VFFONTS"></span>
+<span id="index-TEXFONTS-3"></span>
+<p>(virtual fonts, see <a href="https://tug.org/texinfohtml/dvips.html#Virtual-fonts">Virtual fonts</a> in <cite>Dvips</cite>)
+<code>VFFONTS</code>, <code>TEXFONTS</code>;
+suffix &lsquo;<samp>.vf</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>web</samp>&rsquo;</dt>
+<dd><span id="index-_002eweb-1"></span>
+<span id="index-WEBINPUTS"></span>
+<p>(WEB input files)
+<code>WEBINPUTS</code>;
+suffix &lsquo;<samp>.web</samp>&rsquo;;
+additional suffix &lsquo;<samp>.ch</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>web2c files</samp>&rsquo;</dt>
+<dd><span id="index-WEB2C"></span>
+<p>(files specific to the web2c implementation)
+<code>WEB2C</code>.
+</p></dd>
+</dl>
+
+<p>There are two special cases, because the paths and environment variables
+always depend on the name of the program: the variable name is
+constructed by converting the program name to upper case, and then
+appending &lsquo;<samp>INPUTS</samp>&rsquo;. Assuming the program is called &lsquo;<samp>foo</samp>&rsquo;,
+this gives us the following table.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>other text files</samp>&rsquo;</dt>
+<dd><span id="index-FOOINPUTS"></span>
+<p>(text files used by &lsquo;<samp>foo</samp>&rsquo;)
+<code>FOOINPUTS</code>.
+</p>
+</dd>
+<dt>&lsquo;<samp>other binary files</samp>&rsquo;</dt>
+<dd><span id="index-FOOINPUTS-1"></span>
+<p>(binary files used by &lsquo;<samp>foo</samp>&rsquo;)
+<code>FOOINPUTS</code>.
+</p></dd>
+</dl>
+
+<p>If an environment variable by these names are set, the corresponding
+<samp>texmf.cnf</samp> definition won&rsquo;t be looked at (unless, as usual, the
+environment variable value has an extra &lsquo;<samp>:</samp>&rsquo;). See <a href="#Default-expansion">Default expansion</a>.
+</p>
+<p>For the font variables, the intent is that:
+</p><ul>
+<li> <code>TEXFONTS</code> is the default for everything.
+
+</li><li> <code>GLYPHFONTS</code> is the default for bitmap (or, more precisely,
+non-metric) files.
+
+</li><li> Each font format has a variable of its own.
+
+</li><li> <span id="index-XDVIFONTS"></span>
+<span id="index-DVIPSFONTS"></span>
+Each program has its own font override path as well; e.g.,
+<code>DVIPSFONTS</code> for Dvipsk. Again, this is for bitmaps, not metrics.
+
+</li></ul>
+
+
+<hr>
+<span id="File-lookup"></span><div class="header">
+<p>
+Next: <a href="#Glyph-lookup" accesskey="n" rel="next">Glyph lookup</a>, Previous: <a href="#Supported-file-formats" accesskey="p" rel="prev">Supported file formats</a>, Up: <a href="#TeX-support" accesskey="u" rel="up">TeX support</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="File-lookup-1"></span><h3 class="section">6.2 File lookup</h3>
+
+<span id="index-file-lookup"></span>
+<span id="index-searching-for-files"></span>
+<span id="index-TeX-file-lookup"></span>
+
+<p>This section describes how Kpathsea searches for most files (bitmap font
+searches are the exception, as described in the next section).
+</p>
+<p>Here is the search strategy for a file <var>name</var>:
+</p>
+<ol>
+<li> If the file format defines default suffixes, and the suffix of
+<var>name</var> name is not already a known suffix for that format, try the
+name with each default appended, and use alternative names found in
+the fontmaps if necessary. Example: given &lsquo;<samp>foo.bar</samp>&rsquo;, look for
+&lsquo;<samp>foo.bar.tex</samp>&rsquo;.
+
+</li><li> Search for <var>name</var>, and if necessary for alternative names found in
+the fontmaps. Example: given &lsquo;<samp>foo.bar</samp>&rsquo;, we also look for
+&lsquo;<samp>foo.bar</samp>&rsquo;.
+
+</li><li> If the file format defines a program to invoke to create missing files,
+run it (see <a href="#mktex-scripts">mktex scripts</a>).
+</li></ol>
+
+<span id="index-extensions_002c-filename"></span>
+<span id="index-suffixes_002c-filename"></span>
+<span id="index-try_005fstd_005fextension_005ffirst"></span>
+<p>The order in which we search for &ldquo;suffixed&rdquo; name (item&nbsp;1) or
+the &ldquo;as-is&rdquo; name (item&nbsp;2) is controlled by the
+<samp>try_std_extension_first</samp> configuration value. The default set
+in <samp>texmf.cnf</samp> is true, since common suffixes are already
+recognized: &lsquo;<samp>babel.sty</samp>&rsquo; will only look for &lsquo;<samp>babel.sty</samp>&rsquo;, not
+&lsquo;<samp>babel.sty.tex</samp>&rsquo;, regardless of this setting.
+</p>
+<p>When the suffix is unknown (e.g., &lsquo;<samp>foo.bar</samp>&rsquo;), both names are
+always tried; the difference is the order in which they are tried.
+</p>
+<p><samp>try_std_extension_first</samp> only affects names being looked up
+which *already* have an extension. A name without an extension (e.g.,
+&lsquo;<samp>tex story</samp>&rsquo;) will always have an extension added first.
+</p>
+<span id="index-tex_002dfile_002ec"></span>
+<span id="index-kpathsea_005ffind_005ffile"></span>
+<p>This algorithm is implemented in the function
+<code>kpathsea_find_file</code> in the source file
+<samp>kpathsea/tex-file.c</samp>. You can watch it in action with the
+debugging options (see <a href="#Debugging">Debugging</a>).
+</p>
+
+<hr>
+<span id="Glyph-lookup"></span><div class="header">
+<p>
+Next: <a href="#Suppressing-warnings" accesskey="n" rel="next">Suppressing warnings</a>, Previous: <a href="#File-lookup" accesskey="p" rel="prev">File lookup</a>, Up: <a href="#TeX-support" accesskey="u" rel="up">TeX support</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Glyph-lookup-1"></span><h3 class="section">6.3 Glyph lookup</h3>
+
+<span id="index-glyph-lookup"></span>
+<span id="index-searching-for-glyphs"></span>
+<span id="index-TeX-glyph-lookup"></span>
+
+<p>This section describes how Kpathsea searches for a bitmap font in GF or
+PK format (or either) given a font name (e.g., &lsquo;<samp>cmr10</samp>&rsquo;) and a
+resolution (e.g., 600).
+</p>
+<p>Here is an outline of the search strategy (details in the sections
+below) for a file <var>name</var> at resolution <var>dpi</var>. The search stops
+at the first successful lookup.
+</p>
+<ol>
+<li> Look for an existing file <var>name</var>.<var>dpi</var><var>format</var> in the
+specified format(s).
+
+</li><li> If <var>name</var> is an alias for a file <var>f</var> in the fontmap
+file <samp>texfonts.map</samp>, look for <var>f</var>.<var>dpi</var>.
+
+</li><li> Run an external program (typically named &lsquo;<samp>mktexpk</samp>&rsquo;) to
+generate the font (see <a href="#mktex-scripts">mktex scripts</a>)
+
+</li><li> Look for <var>fallback</var>.<var>dpi</var>, where <var>fallback</var> is some
+last-resort font (typically &lsquo;<samp>cmr10</samp>&rsquo;).
+</li></ol>
+
+<span id="index-tex_002dglyph_002ec"></span>
+<span id="index-kpathsea_005ffind_005fglyph"></span>
+<p>This is implemented in <code>kpathsea_find_glyph</code> in
+<samp>kpathsea/tex-glyph.c</samp>.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Basic-glyph-lookup" accesskey="1">Basic glyph lookup</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Features common to all glyph lookups.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Fontmap" accesskey="2">Fontmap</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Aliases for fonts.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Fallback-font" accesskey="3">Fallback font</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Resolutions and fonts of last resort.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Basic-glyph-lookup"></span><div class="header">
+<p>
+Next: <a href="#Fontmap" accesskey="n" rel="next">Fontmap</a>, Up: <a href="#Glyph-lookup" accesskey="u" rel="up">Glyph lookup</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Basic-glyph-lookup-1"></span><h4 class="subsection">6.3.1 Basic glyph lookup</h4>
+
+<span id="index-basic-glyph-lookup"></span>
+<span id="index-common-features-in-glyph-lookup"></span>
+
+<p>When Kpathsea looks for a bitmap font <var>name</var> at resolution <var>dpi</var>
+in a format <var>format</var>, it first checks each directory in the search
+path for a file &lsquo;<samp><var>name</var>.<var>dpi</var><var>format</var></samp>&rsquo;; for example,
+&lsquo;<samp>cmr10.600pk</samp>&rsquo;. Kpathsea looks for a PK file first, then a GF file.
+</p>
+<p>If that fails, Kpathsea looks for
+&lsquo;<samp>dpi<var>dpi</var>/<var>name</var>.<var>format</var></samp>&rsquo;; for example,
+&lsquo;<samp>dpi600/cmr10.pk</samp>&rsquo;. This is how fonts are typically stored on
+filesystems (such as DOS) that permit only three-character extensions.
+</p>
+<span id="index-tolerance-for-glyph-lookup"></span>
+<span id="index-glyph-lookup-bitmap-tolerance"></span>
+<span id="index-KPSE_005fBITMAP_005fTOLERANCE"></span>
+<p>If that fails, Kpathsea looks for a font with a close-enough <var>dpi</var>.
+&ldquo;Close enough&rdquo; is defined by the macro <code>KPSE_BITMAP_TOLERANCE</code> in
+<samp>kpathsea/tex-glyph.h</samp> to be <code><var>dpi</var> / 500 + 1</code>. This is
+slightly more than the 0.2% minimum allowed by the DVI standard
+(<a href="CTAN:/dviware/driv-standard/level-0">CTAN:/dviware/driv-standard/level-0</a>).
+</p>
+
+<hr>
+<span id="Fontmap"></span><div class="header">
+<p>
+Next: <a href="#Fallback-font" accesskey="n" rel="next">Fallback font</a>, Previous: <a href="#Basic-glyph-lookup" accesskey="p" rel="prev">Basic glyph lookup</a>, Up: <a href="#Glyph-lookup" accesskey="u" rel="up">Glyph lookup</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Fontmap-1"></span><h4 class="subsection">6.3.2 Fontmap</h4>
+
+<span id="index-fontmap-files"></span>
+<span id="index-font-alias-files"></span>
+<span id="index-aliases-for-fonts"></span>
+
+<span id="index-texfonts_002emap"></span>
+<p>If a bitmap font or metric file is not found with the original name (see
+the previous section), Kpathsea looks through any <em>fontmap</em> files
+for an <em>alias</em> for the original font name. These files are named
+<samp>texfonts.map</samp> and searched for along the <code>TEXFONTMAPS</code>
+environment/config file variable. All <samp>texfonts.map</samp> files that
+are found are read; earlier definitions override later ones.
+</p>
+<p>This feature is intended to help in two respects:
+</p>
+<ol>
+<li> <span id="index-fontnames_002c-arbitrary-length"></span>
+An alias name is limited in length only by available memory, not by your
+filesystem. Therefore, if you want to ask for &lsquo;<samp>Times-Roman</samp>&rsquo;
+instead of <samp>ptmr</samp>, you can (you get &lsquo;<samp>ptmr8r</samp>&rsquo;).
+
+</li><li> <span id="index-circle-fonts"></span>
+<span id="index-lcircle10"></span>
+A few fonts have historically had multiple names: specifically,
+LaTeX&rsquo;s &ldquo;circle font&rdquo; has variously been known as <samp>circle10</samp>,
+<samp>lcircle10</samp>, and <samp>lcirc10</samp>. Aliases can make all the names
+equivalent, so that it no longer matters what the name of the installed
+file is; TeX documents will find their favorite name.
+
+</li></ol>
+
+<p>The format of fontmap files is straightforward:
+</p>
+<ul>
+<li> <span id="index-comments_002c-in-fontmap-files"></span>
+Comments start with the last &lsquo;<samp>%</samp>&rsquo; on a line and continue to
+the end of the line. (This provides for names that include a %,
+ill-advised as that may be.)
+
+</li><li> <span id="index-whitespace_002c-in-fontmap-files"></span>
+Blank lines are ignored.
+
+</li><li> Each nonblank line is broken up into a series of <em>words</em>:
+ a sequence of non-whitespace characters.
+
+</li><li> <span id="index-include-fontmap-directive"></span>
+If the first word is &lsquo;<samp>include</samp>&rsquo;, the second word is used as
+ a filename, and it is searched for and read.
+
+</li><li> Otherwise, the first word on each line is the true filename;
+
+</li><li> the second word is the alias;
+
+</li><li> subsequent words are ignored.
+</li></ul>
+
+<p>If an alias has an extension, it matches only those files with that
+extension; otherwise, it matches anything with the same root, regardless
+of extension. For example, an alias &lsquo;<samp>foo.tfm</samp>&rsquo; matches only when
+<samp>foo.tfm</samp> is being searched for; but an alias &lsquo;<samp>foo</samp>&rsquo; matches
+<samp>foo.vf</samp>, <samp>foo.600pk</samp>, etc.
+</p>
+<p>As an example, here is an excerpt from the <samp>texfonts.map</samp> in the
+Web2c distribution. It makes the old and new names of the LaTeX
+circle fonts equivalent.
+</p>
+<div class="example">
+<pre class="example">circle10 lcircle10
+circle10 lcirc10
+lcircle10 circle10
+lcircle10 lcirc10
+lcirc10 circle10
+lcirc10 lcircle10
+&hellip;
+</pre></div>
+
+<p>Fontmaps are implemented in the file <samp>kpathsea/fontmap.c</samp>.
+The Fontname distribution has much more information on font naming
+(see <cite><a href="fontname.html#Top">Filenames for TeX fonts</a></cite>).
+</p>
+
+<hr>
+<span id="Fallback-font"></span><div class="header">
+<p>
+Previous: <a href="#Fontmap" accesskey="p" rel="prev">Fontmap</a>, Up: <a href="#Glyph-lookup" accesskey="u" rel="up">Glyph lookup</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Fallback-font-1"></span><h4 class="subsection">6.3.3 Fallback font</h4>
+
+<span id="index-fallback-font"></span>
+<span id="index-fallback-resolutions"></span>
+<span id="index-font-of-last-resort"></span>
+<span id="index-resolutions_002c-last_002dresort"></span>
+<span id="index-last_002dresort-font"></span>
+
+<span id="index-DVIPSSIZES"></span>
+<span id="index-XDVISIZES"></span>
+<span id="index-DVILJSIZES"></span>
+<span id="index-TEXSIZES"></span>
+<span id="index-default_005ftexsizes"></span>
+<p>If a bitmap font cannot be found or created at the requested size,
+Kpathsea looks for the font at a set of <em>fallback resolutions</em>. You
+specify these resolutions as a colon-separated list (like search paths).
+Kpathsea looks first for a program-specific environment variable (e.g.,
+<code>DVIPSSIZES</code> for Dvipsk), then the environment variable
+<code>TEXSIZES</code>, then a default specified at compilation time (the Make
+variable <code>default_texsizes</code>). You can set this list to be empty if
+you prefer to find fonts at their stated size or not at all.
+</p>
+<span id="index-cmr10_002c-as-fallback-font"></span>
+<span id="index-kpathsea_005finit_005fprog"></span>
+<p>Finally, if the font cannot be found even at the fallback resolutions,
+Kpathsea looks for a fallback font, typically <samp>cmr10</samp>. Programs
+must enable this feature by calling <code>kpathsea_init_prog</code>
+(see <a href="#Calling-sequence">Calling sequence</a>); the default is no fallback font.
+</p>
+
+<hr>
+<span id="Suppressing-warnings"></span><div class="header">
+<p>
+Next: <a href="#mktex-scripts" accesskey="n" rel="next">mktex scripts</a>, Previous: <a href="#Glyph-lookup" accesskey="p" rel="prev">Glyph lookup</a>, Up: <a href="#TeX-support" accesskey="u" rel="up">TeX support</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Suppressing-warnings-1"></span><h3 class="section">6.4 Suppressing warnings</h3>
+
+<span id="index-warnings_002c-suppressing"></span>
+<span id="index-suppressing-warnings"></span>
+
+<span id="index-TEX_005fHUSH-1"></span>
+<p>Kpathsea provides a way to suppress selected usually-harmless warnings;
+this is useful at large sites where most users are not administrators,
+and thus the warnings are merely a source of confusion, not a help. To
+do this, you set the environment variable or configuration file value
+<code>TEX_HUSH</code> to a colon-separated list of values. Here are the
+possibilities:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>all</samp>&rsquo;
+<span id="index-all"></span>
+</dt>
+<dd><p>Suppress everything possible.
+</p>
+</dd>
+<dt>&lsquo;<samp>checksum</samp>&rsquo;
+<span id="index-checksum"></span>
+</dt>
+<dd><span id="index-mismatched-checksum-warnings"></span>
+<p>Suppress mismatched font checksum warnings.
+</p>
+</dd>
+<dt>&lsquo;<samp>lostchar</samp>&rsquo;
+<span id="index-lostchar"></span>
+</dt>
+<dd><span id="index-missing-character-warnings"></span>
+<p>Suppress warnings when a character is missing from a font that a DVI or
+VF file tries to typeset.
+</p>
+</dd>
+<dt>&lsquo;<samp>none</samp>&rsquo;
+<span id="index-none"></span>
+</dt>
+<dd><p>Don&rsquo;t suppress any warnings.
+</p>
+</dd>
+<dt>&lsquo;<samp>readable</samp>&rsquo;
+<span id="index-readable"></span>
+</dt>
+<dd><span id="index-unreadable-file-warnings"></span>
+<p>Suppress warnings about attempts to access a file whose permissions
+render it unreadable.
+</p>
+</dd>
+<dt>&lsquo;<samp>special</samp>&rsquo;
+<span id="index-special"></span>
+</dt>
+<dd><span id="index-unknown-special-warnings"></span>
+<span id="index-_005cspecial_002c-suppressing-warnings-about"></span>
+<p>Suppresses warnings about an unimplemented or unparsable
+&lsquo;<samp>\special</samp>&rsquo; command.
+</p></dd>
+</dl>
+
+<p><samp>tex-hush.c</samp> defines the function that checks the
+variable value. Each driver implements its own checks where
+appropriate.
+</p>
+
+<hr>
+<span id="mktex-scripts"></span><div class="header">
+<p>
+Previous: <a href="#Suppressing-warnings" accesskey="p" rel="prev">Suppressing warnings</a>, Up: <a href="#TeX-support" accesskey="u" rel="up">TeX support</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="mktex-scripts-1"></span><h3 class="section">6.5 <samp>mktex</samp> scripts</h3>
+
+<span id="index-mktex-scripts"></span>
+<span id="index-scripts-for-file-creation"></span>
+
+<span id="index-font-set_002c-infinite"></span>
+<span id="index-dynamic-creation-of-files"></span>
+<span id="index-Sauter-fonts_002c-and-dynamic-source-creation"></span>
+<span id="index-EC-fonts_002c-and-dynamic-source-creation"></span>
+<p>If Kpathsea cannot otherwise find a file, for some file types it is
+configured by default to invoke an external program to create it
+dynamically (see <a href="#mktex-configuration">mktex configuration</a>). These are collectively
+known as <em><code>mktex</code> scripts</em>, since most of them are named
+<code>mktex...</code>.
+</p>
+<p>For example, this is useful for fonts (bitmaps, TFM&rsquo;s, and
+arbitrarily-sizable Metafont sources such as the Sauter and EC fonts),
+since any given document can use fonts never before referenced.
+Building all fonts in advance is therefore impractical, if not
+impossible.
+</p>
+<p>It is also useful for the TeX &lsquo;<samp>.fmt</samp>&rsquo; (and Metafont
+&lsquo;<samp>.base</samp>&rsquo; and Metapost &lsquo;<samp>.mem</samp>&rsquo; files, see <a href="Web2c.html#Memory-dumps">Memory
+dumps</a> in <cite>web2c</cite>), where pre-generating every format consumes a
+lot of both time and space.
+</p>
+<p>The script is passed the name of the file to create and possibly other
+arguments, as explained below. It must echo the full pathname of the
+file it created (and nothing else) to standard output; it can write
+diagnostics to standard error.
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#mktex-configuration" accesskey="1">config</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#mktex-script-names" accesskey="2">names</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#mktex-script-arguments" accesskey="3">args</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
+</table>
+
+
+<hr>
+<span id="mktex-configuration"></span><div class="header">
+<p>
+Next: <a href="#mktex-script-names" accesskey="n" rel="next">mktex script names</a>, Up: <a href="#mktex-scripts" accesskey="u" rel="up">mktex scripts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="mktex-configuration-1"></span><h4 class="subsection">6.5.1 <samp>mktex</samp> configuration</h4>
+
+<span id="index-mktex-script-configuration"></span>
+<span id="index-configuration-of-mktex-scripts"></span>
+<span id="index-enabling-mktex-scripts"></span>
+<span id="index-disabling-mktex-scripts"></span>
+
+<p>The list of file types and program names that can run an external
+program to create missing files is listed in the next section. In the
+absence of <code>configure</code> options specifying otherwise, everything
+but <samp>mktextex</samp> will be enabled by default. The <code>configure</code>
+options to change the defaults are:
+</p>
+<span id="index-configure-options-for-mktex-scripts"></span>
+<span id="index-_002d_002dwithout_002dmktexfmt_002ddefault"></span>
+<span id="index-_002d_002dwithout_002dmktexmf_002ddefault"></span>
+<span id="index-_002d_002dwithout_002dmktexocp_002ddefault"></span>
+<span id="index-_002d_002dwithout_002dmktexofm_002ddefault"></span>
+<span id="index-_002d_002dwithout_002dmktexpk_002ddefault"></span>
+<span id="index-_002d_002dwithout_002dmktextfm_002ddefault"></span>
+<span id="index-_002d_002dwith_002dmktextex_002ddefault"></span>
+<div class="example">
+<pre class="example">--without-mktexfmt-default
+--without-mktexmf-default
+--without-mktexocp-default
+--without-mktexofm-default
+--without-mktexpk-default
+--without-mktextfm-default
+--with-mktextex-default
+</pre></div>
+
+<p>The <code>configure</code> setting is overridden if the environment variable
+or configuration file value named for the script is set; e.g.,
+<samp>MKTEXPK</samp> (see <a href="#mktex-script-arguments">mktex script arguments</a>).
+</p>
+<span id="index-fmtutils_002ecnf"></span>
+<p><code>mktexfmt</code> reads a file <samp>fmtutil.cnf</samp>, typically located in
+<samp>texmf/web2c/</samp> to glean its configuration information. The rest
+of the files and features in this section are primarily intended for
+the font generation scripts.
+</p>
+<span id="index-mktex_002ecnf-1"></span>
+<span id="index-mktex_002eopt"></span>
+<span id="index-site-overrides-for-mktex_2026"></span>
+<p>As distributed, all the scripts source a file
+<samp>texmf/web2c/mktex.cnf</samp> if it exists, so you can override various
+defaults.
+See <samp>mktex.opt</samp>, for instance, which defines the default mode,
+resolution, some special directory names, etc. If you prefer not to
+change the distributed scripts, you can simply create <samp>mktex.cnf</samp>
+with the appropriate definitions (you do not need to create it if you
+have nothing to put in it). <samp>mktex.cnf</samp> has no special syntax;
+it&rsquo;s an arbitrary Bourne shell script. The distribution contains a
+sample <samp>mktex.cnf</samp> for you to copy and modify as you please (it
+is not installed anywhere).
+</p>
+<span id="index-mktex_002eopt-1"></span>
+<span id="index-MT_005fFEATURES"></span>
+<p>In addition, you can configure a number of features with the
+<code>MT_FEATURES</code> variable, which you can define:
+</p>
+<ul>
+<li> in <samp>mktex.opt</samp>, as just mentioned;
+
+</li><li> by editing the file <samp>mktex.opt</samp>, either before &lsquo;<samp>make
+install</samp>&rsquo; (in the source hierarchy) or after (in the installed
+hierarchy);
+
+</li><li> or in the environment.
+</li></ul>
+
+<p>If none of the options below are enabled, <code>mktexpk</code>,
+<code>mktextfm</code>, and <code>mktexmf</code> follow the following procedure to
+decide where fonts should be installed. Find the tree where the font&rsquo;s
+sources are, and test the permissions of the &lsquo;<samp>fonts</samp>&rsquo; directory of
+that tree to determine whether it is writable. If it is, put the files
+in the tree in appropriate locations. If it isn&rsquo;t writable, see whether
+the tree is a system tree (named in <code>SYSTEXMF</code>). If so, the
+<code>VARTEXFONTS</code> tree is used. In all other cases the working
+directory is used.
+</p>
+<p>The &lsquo;<samp>appendonlydir</samp>&rsquo; option is enabled by default.
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>appendonlydir</samp>&rsquo;
+<span id="index-appendonlydir"></span>
+</dt>
+<dd><span id="index-directories_002c-making-append_002donly"></span>
+<span id="index-mktexdir"></span>
+<p>Tell <code>mktexdir</code> to create directories append-only, i.e., set
+their sticky bit (see <a href="https://www.gnu.org/software/coreutils/manual/coreutils#Mode-Structure">Mode Structure</a> in <cite>GNU Core
+Utilities</cite>). This feature is silently ignored on non-Unix platforms
+(e.g. Windows/NT and MS-DOS) which don&rsquo;t support similar functionality.
+This feature is enabled by default.
+</p>
+</dd>
+<dt>&lsquo;<samp>dosnames</samp>&rsquo;
+<span id="index-dosnames"></span>
+</dt>
+<dd><span id="index-8_002e3-filenames_002c-using"></span>
+<span id="index-DOS-compatible-names"></span>
+<span id="index-dpinnn-directories"></span>
+<p>Use 8.3 names; e.g., <samp>dpi600/cmr10.pk</samp> instead of
+<samp>cmr10.600pk</samp>. Note that this feature only affects filenames that
+would otherwise clash with other TeX-related filenames; <samp>mktex</samp>
+scripts do nothing about filenames which exceed the 8+3 MS-DOS limits
+but remain unique when truncated (by the OS) to these limits, and nether
+do the scripts care about possible clashes with files which aren&rsquo;t
+related with TeX. For example, <samp>cmr10.600pk</samp> would clash with
+<samp>cmr10.600gf</samp> and is therefore changed when &lsquo;<samp>dosnames</samp>&rsquo; is in
+effect, but <samp>mf.pool</samp> and <samp>mp.base</samp> don&rsquo;t clash with any
+TeX-related files and are therefore unchanged.
+</p>
+<p>This feature is turned on by default on MS-DOS. If you do not wish
+&lsquo;<samp>dosnames</samp>&rsquo; to be set on an MS-DOS platform, you need to set the
+<code>MT_FEATURES</code> environment variable to a value that doesn&rsquo;t include
+&lsquo;<samp>dosnames</samp>&rsquo;. You can also change the default setting by editing
+<samp>mktex.opt</samp>, but only if you use the <samp>mktex</samp> shell scripts;
+the emulation programs don&rsquo;t consult <samp>mktex.opt</samp>.
+</p>
+</dd>
+<dt>&lsquo;<samp>fontmaps</samp>&rsquo;
+<span id="index-fontmaps-1"></span>
+</dt>
+<dd><span id="index-fontmaps"></span>
+<span id="index-fontname"></span>
+<p>Instead of deriving the location of a font in the destination tree from
+the location of the sources, the aliases and directory names from the
+Fontname distribution are used. (see <a href="fontname.html#Top">Introduction</a> in <cite>Fontname</cite>).
+</p>
+</dd>
+<dt>&lsquo;<samp>nomfdrivers</samp>&rsquo;
+<span id="index-nomfdrivers"></span>
+</dt>
+<dd><span id="index-metafont-driver-files"></span>
+<p>Let mktexpk and mktextfm create metafont driver files in a temporary
+directory. These will be used for just one metafont run and not
+installed permanently.
+</p>
+</dd>
+<dt>&lsquo;<samp>nomode</samp>&rsquo;
+<span id="index-nomode"></span>
+</dt>
+<dd><span id="index-mode-directory_002c-omitting"></span>
+<p>Omit the directory level for the mode name; this is fine as long as
+you generate fonts for only one mode.
+</p>
+</dd>
+<dt>&lsquo;<samp>stripsupplier</samp>&rsquo;
+<span id="index-stripsupplier"></span>
+</dt>
+<dd><span id="index-supplier-directory_002c-omitting"></span>
+<p>Omit the font supplier name directory level.
+</p>
+</dd>
+<dt>&lsquo;<samp>striptypeface</samp>&rsquo;
+<span id="index-striptypeface"></span>
+</dt>
+<dd><span id="index-typeface-directory_002c-omitting"></span>
+<p>Omit the font typeface name directory level.
+</p>
+</dd>
+<dt>&lsquo;<samp>strip</samp>&rsquo;
+<span id="index-strip"></span>
+</dt>
+<dd><span id="index-supplier-directory_002c-omitting-1"></span>
+<span id="index-typeface-directory_002c-omitting-1"></span>
+<p>Omit the font supplier and typeface name directory levels. This feature
+is deprecated in favour of &lsquo;<samp>stripsupplier</samp>&rsquo; and &lsquo;<samp>striptypeface</samp>&rsquo;.
+</p>
+</dd>
+<dt>&lsquo;<samp>varfonts</samp>&rsquo;
+<span id="index-varfonts"></span>
+</dt>
+<dd><span id="index-_002fvar_002ftmp_002ftexfonts"></span>
+<span id="index-VARTEXFONTS"></span>
+<span id="index-Linux-File-System-Standard"></span>
+<p>When this option is enabled, fonts that would otherwise be written in
+system texmf tree go to the <code>VARTEXFONTS</code> tree instead. The
+default value in <samp>kpathsea/Makefile.in</samp> is
+<samp>/var/tmp/texfonts</samp>. The <cite>Linux File System Standard</cite>
+recommends <samp>/var/tex/fonts</samp>.
+</p>
+<span id="index-USE_005fVARTEXFONTS"></span>
+<p>The &lsquo;<samp>varfonts</samp>&rsquo; setting in <code>MT_FEATURES</code> is overridden by the
+<code>USE_VARTEXFONTS</code> environment variable: if set to &lsquo;<samp>1</samp>&rsquo;, the
+feature is enabled, and if set to &lsquo;<samp>0</samp>&rsquo;, the feature is disabled.
+</p>
+</dd>
+<dt>&lsquo;<samp>texmfvar</samp>&rsquo;
+<span id="index-texmfvar"></span>
+</dt>
+<dd><span id="index-TEXMFVAR"></span>
+<p>Force generated files that would go into a system tree (as defined by
+<code>SYSTEXMF</code>) into <code>TEXMFVAR</code>. Starting with teTeX-3.0, the
+variable <code>TEXMFVAR</code> is always set. The &lsquo;<samp>varfonts</samp>&rsquo; feature takes
+precedence if also set.
+</p>
+<span id="index-USE_005fTEXMFVAR"></span>
+<p>The &lsquo;<samp>texmfvar</samp>&rsquo; setting in <code>MT_FEATURES</code> is overridden by the
+<code>USE_TEXMFVAR</code> environment variable: if set to &lsquo;<samp>1</samp>&rsquo;, the
+feature is enabled, and if set to &lsquo;<samp>0</samp>&rsquo;, the feature is disabled.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="mktex-script-names"></span><div class="header">
+<p>
+Next: <a href="#mktex-script-arguments" accesskey="n" rel="next">mktex script arguments</a>, Previous: <a href="#mktex-configuration" accesskey="p" rel="prev">mktex configuration</a>, Up: <a href="#mktex-scripts" accesskey="u" rel="up">mktex scripts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="mktex-script-names-1"></span><h4 class="subsection">6.5.2 <samp>mktex</samp> script names</h4>
+
+<span id="index-mktex-script-names"></span>
+<span id="index-names-for-mktex-scripts"></span>
+
+<p>The following table shows the default name of the script for each
+of the file types which support runtime generation.
+</p>
+<dl compact="compact">
+<dt><samp>mktexfmt</samp></dt>
+<dd><span id="index-mktexfmt"></span>
+<span id="index-fmtutil"></span>
+<p>(&lsquo;<samp>.fmt</samp>&rsquo;, &lsquo;<samp>.base</samp>&rsquo;, &lsquo;<samp>.mem</samp>&rsquo;) TeX/Metafont/MetaPost
+formats. This script is also named <code>fmtutil</code>, and reads
+<samp>fmtutil.cnf</samp> for configuration information.
+</p>
+</dd>
+<dt><samp>mktexmf</samp></dt>
+<dd><span id="index-mktexmf"></span>
+<p>(&lsquo;<samp>.mf</samp>&rsquo;) Metafont input files.
+</p>
+</dd>
+<dt><samp>mkocp</samp></dt>
+<dd><span id="index-mkocp"></span>
+<p>(&lsquo;<samp>.ocp</samp>&rsquo;) Omega compiled process files.
+</p>
+</dd>
+<dt><samp>mkofm</samp></dt>
+<dd><span id="index-mkofm"></span>
+<p>(&lsquo;<samp>.ofm</samp>&rsquo;) Omega font metric files.
+</p>
+</dd>
+<dt><samp>mktexpk</samp></dt>
+<dd><span id="index-mktexpk"></span>
+<p>(&lsquo;<samp>pk</samp>&rsquo;) Glyph fonts.
+</p>
+</dd>
+<dt><samp>mktextex</samp></dt>
+<dd><span id="index-mktextex"></span>
+<p>(&lsquo;<samp>.tex</samp>&rsquo;) TeX input files (disabled by default).
+</p>
+</dd>
+<dt><samp>mktextfm</samp></dt>
+<dd><span id="index-mktextfm"></span>
+<p>(&lsquo;<samp>.tfm</samp>&rsquo;) TFM files.
+</p></dd>
+</dl>
+
+<span id="index-DVIPSMAKEPK"></span>
+<span id="index-XDVIMAKEPK"></span>
+<span id="index-DVILJMAKEPK"></span>
+<p>These names can be overridden by an environment variable specific
+to the program&mdash;for example, <code>DVIPSMAKEPK</code> for Dvipsk.
+</p>
+<span id="index-missfont_002elog"></span>
+<span id="index-failed-mktex_2026-script-invocation"></span>
+<p>If a <code>mktex&hellip;</code> script fails, the invocation is appended to a
+file <samp>missfont.log</samp> (by default) in the current directory. You can
+then execute the log file to create the missing files after fixing the
+problem.
+</p>
+<span id="index-TEXMFOUTPUT"></span>
+<span id="index-MISSFONT_005fLOG"></span>
+<p>If the current directory is not writable and the environment variable or
+configuration file value <code>TEXMFOUTPUT</code> is set, its value is
+used. Otherwise, nothing is written. The name &lsquo;<samp>missfont.log</samp>&rsquo; is
+overridden by the <code>MISSFONT_LOG</code> environment variable or
+configuration file value.
+</p>
+
+<hr>
+<span id="mktex-script-arguments"></span><div class="header">
+<p>
+Previous: <a href="#mktex-script-names" accesskey="p" rel="prev">mktex script names</a>, Up: <a href="#mktex-scripts" accesskey="u" rel="up">mktex scripts</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="mktex-script-arguments-1"></span><h4 class="subsection">6.5.3 <samp>mktex</samp> script arguments</h4>
+
+<span id="index-arguments-to-mktex"></span>
+
+<p>The first argument to a <samp>mktex</samp> script is always the name
+of the file to be created.
+</p>
+<p>In the default <samp>mktexpk</samp> implementation, additional arguments may
+also be passed:
+</p>
+<dl compact="compact">
+<dt>&lsquo;<samp>--dpi <var>num</var></samp>&rsquo;</dt>
+<dd><p>Sets the resolution of the generated font to <var>num</var>.
+</p></dd>
+<dt>&lsquo;<samp>--mfmode <var>name</var></samp>&rsquo;</dt>
+<dd><p>Sets the Metafont mode to <var>name</var>.
+</p></dd>
+<dt>&lsquo;<samp>--bdpi <var>num</var></samp>&rsquo;</dt>
+<dd><p>Sets the &ldquo;base dpi&rdquo; for the font. This must match the mode being
+used.
+</p></dd>
+<dt>&lsquo;<samp>--mag <var>string</var></samp>&rsquo;</dt>
+<dd><p>A &ldquo;magstep&rdquo; string suitable for the Metafont <code>mag</code> variable.
+This must match the combination of <var>bdpi</var> and <var>dpi</var> being used.
+</p></dd>
+<dt>&lsquo;<samp>--destdir <var>string</var></samp>&rsquo;</dt>
+<dd><p>A directory name. If the directory is absolute, it is used as-is.
+Otherwise, it is appended to the root destination directory set in the
+script.
+</p></dd>
+</dl>
+
+
+<hr>
+<span id="Programming"></span><div class="header">
+<p>
+Next: <a href="#Reporting-bugs" accesskey="n" rel="next">Reporting bugs</a>, Previous: <a href="#TeX-support" accesskey="p" rel="prev">TeX support</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-1"></span><h2 class="chapter">7 Programming</h2>
+
+<p>This chapter is for programmers who wish to use Kpathsea.
+See <a href="#Introduction">Introduction</a>, for the conditions under which you may do so (in
+short, it is released under LGPLv2.1 or later).
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Programming-overview" accesskey="1">Overview</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Introduction.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Calling-sequence" accesskey="2">Calling sequence</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Specifics of what to call.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Program_002dspecific-files" accesskey="3">Program-specific files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">How to handle these.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Programming-with-config-files" accesskey="4">Config</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Getting info from texmf.cnf.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Programming-overview"></span><div class="header">
+<p>
+Next: <a href="#Calling-sequence" accesskey="n" rel="next">Calling sequence</a>, Up: <a href="#Programming" accesskey="u" rel="up">Programming</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-overview-1"></span><h3 class="section">7.1 Programming overview</h3>
+
+<span id="index-programming-overview"></span>
+<span id="index-overview-of-programming-with-Kpathsea"></span>
+
+<p>Aside from this manual, your best source of information is the source
+to the programs that use Kpathsea (see <a href="#Introduction">Introduction</a>). First,
+Kpsewhich is a small utility program whose sole purpose is to exercise
+the main path-searching functionality. Of the drivers, Dviljk is
+probably the simplest full application program. Xdvik adds VF support
+and the complication of X resources. Dvipsk adds the complication of
+its own config files. Web2c is source code I also maintain, so it
+uses Kpathsea rather straightforwardly, but is of course complicated
+by the Web to C translation.
+</p>
+<span id="index-re_002dentrant-API"></span>
+<span id="index-API_002c-re_002dentrant"></span>
+<p>When looking at these program sources, you should know that previous
+versions of the library had a different programming interface; the
+current interface supports re-entrancy. Historically, the library
+function names were prefixed with <code>kpse_</code> instead of
+<code>kpathsea_</code>, and they did not need an instance variable as first
+argument. This change was made in 2009. The old functions will never
+disappear, and can reliably continue to be used when they suffice, as
+they do for the programs above. The main application using the
+re-entrant API is the MetaPost library used by MetaPost and LuaTeX.
+</p>
+<span id="index-pathsearch_002eh"></span>
+<span id="index-tex_002dfile_002eh"></span>
+<span id="index-tex_002dglyph_002eh"></span>
+<span id="index-kpathsea_002eh"></span>
+<p>Beyond these examples, the <samp>.h</samp> files in the Kpathsea source
+describe the interfaces and functionality (and of course the <samp>.c</samp>
+files define the actual routines, which are the ultimate documentation).
+<samp>pathsearch.h</samp> declares the basic searching routine.
+<samp>tex-file.h</samp> and <samp>tex-glyph.h</samp> define the interfaces for
+looking up particular kinds of files. In view of the way the headers
+depend on each other, it is recommended to use <code>#include
+&lt;kpathsea/kpathsea.h&gt;</code>, which includes every Kpathsea header.
+</p>
+<span id="index-config_002eh"></span>
+<span id="index-c_002dauto_002eh"></span>
+<p>If you want to include only specific headers, you should still consider
+including <samp>kpathsea/config.h</samp> before including any other Kpathsea
+header, as it provides symbols used in the other headers. Note that
+<samp>kpathsea/config.h</samp> includes <samp>kpathsea/c-auto.h</samp>, which is
+generated by Autoconf.
+</p>
+<span id="index-file-types_002c-registering-new"></span>
+<p>The library provides no way for an external program to register new file
+types: <samp>tex-file.[ch]</samp> must be modified to do this. For example,
+Kpathsea has support for looking up Dvips config files, even though no
+program other than Dvips will likely ever want to do so. I felt this
+was acceptable, since along with new file types should also come new
+defaults in <samp>texmf.cnf</samp> (and its descendant <samp>paths.h</samp>), since
+it&rsquo;s simplest for users if they can modify one configuration file for
+all kinds of paths.
+</p>
+<p>Kpathsea does not parse any formats itself; it barely opens any files.
+Its primary purpose is to return filenames. The GNU font utilities does
+contain libraries to read TFM, GF, and PK files, as do the programs
+above, of course.
+</p>
+
+<hr>
+<span id="Calling-sequence"></span><div class="header">
+<p>
+Next: <a href="#Program_002dspecific-files" accesskey="n" rel="next">Program-specific files</a>, Previous: <a href="#Programming-overview" accesskey="p" rel="prev">Programming overview</a>, Up: <a href="#Programming" accesskey="u" rel="up">Programming</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Calling-sequence-1"></span><h3 class="section">7.2 Calling sequence</h3>
+
+<span id="index-programming-with-Kpathsea"></span>
+<span id="index-calling-sequence"></span>
+
+<p>The typical way to use Kpathsea in your program goes something like this:
+</p>
+<ol>
+<li> <span id="index-kpathsea_005fnew"></span>
+Call <code>kpathsea_new</code> to create a new library instance. This variable
+must be passed as the first argument to all the following library functions.
+The rest of this manual will be using <code>kpse</code> as a placeholder for
+the name of this variable.
+
+</li><li> <span id="index-kpathsea_005fset_005fprogram_005fname"></span>
+<span id="index-argv_005b0_005d"></span>
+Call <code>kpathsea_set_program_name</code> with <code>argv[0]</code> as the second
+argument; the third argument is a string or <code>NULL</code>. The third
+argument is used by Kpathsea as the program name for the
+<code>.<var>program</var></code> feature of config files (see <a href="#Config-files">Config files</a>).
+If the third argument is <code>NULL</code>, the value of the second argument
+is used. This function must be called before any other use of the
+Kpathsea library.
+
+<span id="index-kpse_002d_003einvocation_005fname"></span>
+<span id="index-kpse_002d_003einvocation_005fshort_005fname"></span>
+<span id="index-kpse_002d_003eprogram_005fname"></span>
+<span id="index-error-message-macros"></span>
+<p><code>kpathsea_set_program_name</code> always sets the variables
+<code>kpse-&gt;invocation_name</code> and <code>kpse-&gt;invocation_short_name</code>.
+These variables are used in the error message macros defined in
+<samp>kpathsea/lib.h</samp>. It sets the variable
+<code>kpse-&gt;program_name</code> to the program name it uses.
+</p>
+<span id="index-KPATHSEA_005fDEBUG"></span>
+<p>It also initializes debugging options based on the environment
+variable <code>KPATHSEA_DEBUG</code> (if that is set).
+</p>
+<span id="index-SELFAUTOLOC"></span>
+<span id="index-SELFAUTODIR"></span>
+<span id="index-SELFAUTOPARENT"></span>
+<span id="index-symlinks_002c-resolving"></span>
+<span id="index-expanding-symlinks"></span>
+<p>Finally, it sets the environment variables <code>SELFAUTOLOC</code>, <code>SELFAUTODIR</code>
+and <code>SELFAUTOPARENT</code> to the location, parent and grandparent
+directory of the executable, removing <samp>.</samp> and <samp>..</samp> path
+elements and resolving symbolic links. These are used in the default
+configuration file to allow people to invoke TeX from anywhere. You
+can use &lsquo;<samp>kpsewhich --expand-var=\$SELFAUTOLOC</samp>&rsquo;, etc., to see the
+values.
+</p>
+</li><li> <span id="index-kpse_002d_003edebug-variable"></span>
+<span id="index-debugging-options_002c-in-Kpathsea_002dusing-program"></span>
+Set debugging options. See <a href="#Debugging">Debugging</a>. If your program doesn&rsquo;t have a
+debugging option already, you can define one and set
+<code>kpse-&gt;debug</code> to the number that the user supplies (as in Dviljk
+and Web2c), or you can just omit this altogether (people can always set
+<code>KPATHSEA_DEBUG</code>). If you do have runtime debugging already, you
+need to merge Kpathsea&rsquo;s options with yours (as in Dvipsk and Xdvik).
+
+</li><li> <span id="index-client_005fpath-in-kpse_002d_003eformat_005finfo"></span>
+<span id="index-kpse_002d_003eformat_005finfo"></span>
+<span id="index-resident_002ec"></span>
+<span id="index-config-files_002c-for-Kpathsea_002dusing-programs"></span>
+If your program has its own configuration files that can define search
+paths, you should assign those paths to the <code>client_path</code> member in
+the appropriate element of the <code>kpse-&gt;format_info</code> array. (This
+array is indexed by file type; see <samp>tex-file.h</samp>.) See
+<samp>resident.c</samp> in Dvipsk for an example.
+
+</li><li> <span id="index-kpathsea_005finit_005fprog-1"></span>
+<span id="index-proginit_002eh"></span>
+Call <code>kpathsea_init_prog</code> (see <samp>proginit.c</samp>). It&rsquo;s useful for the
+DVI drivers, at least, but for other programs it may be simpler to
+extract the parts of it that actually apply. This does not initialize
+any paths, it just looks for (and sets) certain environment variables
+and other random information. (A search path is always initialized at
+the first call to find a file of that type; this eliminates much useless
+work, e.g., initializing the BibTeX search paths in a DVI driver.)
+
+</li><li> <span id="index-kpathsea_005ffind_005ffile-1"></span>
+The routine to actually find a file of type <var>format</var> is
+<samp>kpathsea_find_file</samp>. You can call
+<code>kpathsea_find_file</code> after doing only the first and second of the
+initialization steps above&mdash;Kpathsea automatically reads the
+<samp>texmf.cnf</samp> generic config files, looks for environment variables,
+and does expansions at the first lookup.
+
+</li><li> To find PK and/or GF bitmap fonts, the routine
+is <code>kpathsea_find_glyph</code>, defined in
+<samp>tex-glyph.h</samp>. This returns a structure in addition to the
+resultant filename, because fonts can be found in so many ways. See the
+documentation in the source.
+
+</li><li> <span id="index-kpathsea_005fopen_005ffile"></span>
+To actually open a file, not just return a filename, call
+<code>kpathsea_open_file</code>. This function takes the name to look up and a
+Kpathsea file format as arguments, and returns the usual <code>FILE *</code>.
+It always assumes the file must exist, and thus will search the disk if
+necessary (unless the search path specified &lsquo;<samp>!!</samp>&rsquo;, etc.). In other
+words, if you are looking up a VF or some other file that need not
+exist, don&rsquo;t use this.
+
+</li><li> <span id="index-kpathsea_005fout_005fname_005fok"></span>
+TeX can write output files, via the <code>\openout</code> primitive; this opens
+a security hole vulnerable to Trojan horse attack: an unwitting user could
+run a TeX program that overwrites, say, <samp>~/.rhosts</samp>. Analogous
+security holes exist for many other programs. To alleviate this, there is a
+configuration variable <code>openout_any</code>, which selects one of three levels
+of security. When it is set to &lsquo;<samp>a</samp>&rsquo; (for &ldquo;any&rdquo;), no restrictions are
+imposed. When it is set to &lsquo;<samp>r</samp>&rsquo; (for &ldquo;restricted&rdquo;), filenames
+beginning with &lsquo;<samp>.</samp>&rsquo; are disallowed (except <samp>.tex</samp> because LaTeX
+needs it). When it is set to &lsquo;<samp>p</samp>&rsquo; (for &ldquo;paranoid&rdquo;) additional
+restrictions are imposed: an absolute filename must refer to a file in (a
+subdirectory) of <code>TEXMFOUTPUT</code>, and any attempt to go up a directory
+level is forbidden (that is, paths may not contain a &lsquo;<samp>..</samp>&rsquo; component).
+The paranoid setting is the default. (For backwards compatibility, &lsquo;<samp>y</samp>&rsquo;
+and &lsquo;<samp>1</samp>&rsquo; are synonyms of &lsquo;<samp>a</samp>&rsquo;, while &lsquo;<samp>n</samp>&rsquo; and &lsquo;<samp>0</samp>&rsquo; are
+synonyms for &lsquo;<samp>r</samp>&rsquo;.) The function <code>kpathsea_out_name_ok</code>, with a
+filename as second argument, returns <code>true</code> if that filename is
+acceptable to be opend for output or <code>false</code> otherwise.
+
+</li><li> <span id="index-kpathsea_005fin_005fname_005fok"></span>
+Similarly, the function <code>kpathsea_in_name_ok</code>, with a filename as
+second argument, returns <code>true</code> if that filename is acceptable to be
+opend for input or <code>false</code> otherwise, depending on the value of the
+configuration variable <code>openin_any</code> (with &lsquo;<samp>a</samp>&rsquo; as default).
+
+</li><li> <span id="index-kpathsea_005ffinish"></span>
+To close the kpathsea library instance you are using, call
+<code>kpathsea_finish</code>. This function closes any open log files and
+frees the memory used by the instance.
+
+</li></ol>
+
+<span id="index-hash-table-routines"></span>
+<span id="index-memory-allocation-routines"></span>
+<span id="index-string-routines"></span>
+<span id="index-reading-arbitrary_002dlength-lines"></span>
+<span id="index-input-lines_002c-reading"></span>
+<span id="index-lines_002c-reading-arbitrary_002dlength"></span>
+<p>Kpathsea also provides many utility routines. Some are generic: hash
+tables, memory allocation, string concatenation and copying, string
+lists, reading input lines of arbitrary length, etc. Others are
+filename-related: default path, tilde, and variable expansion,
+<code>stat</code> calls, etc. (Perhaps someday I&rsquo;ll move the former to a
+separate library.)
+</p>
+<span id="index-c_002d_002a_002eh"></span>
+<span id="index-autoconf_002c-recommended"></span>
+<p>The <samp>c-*.h</samp> header files can also help your program adapt to many
+different systems. You will almost certainly want to use Autoconf and
+probably Automake for configuring and building your software if you use
+Kpathsea; I strongly recommend using Autoconf and Automake regardless.
+They are available from <a href="http://www.gnu.org/software">http://www.gnu.org/software</a>.
+</p>
+
+<hr>
+<span id="Program_002dspecific-files"></span><div class="header">
+<p>
+Next: <a href="#Programming-with-config-files" accesskey="n" rel="next">Programming with config files</a>, Previous: <a href="#Calling-sequence" accesskey="p" rel="prev">Calling sequence</a>, Up: <a href="#Programming" accesskey="u" rel="up">Programming</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Program_002dspecific-files-1"></span><h3 class="section">7.3 Program-specific files</h3>
+
+<p>Many programs will need to find some configuration files. Kpathsea
+contains some support to make it easy to place them in their own
+directories. The Standard TeX directory structure (see <a href="tds.html#Top">Introduction</a> in <cite>A Directory Structure for TeX files</cite>), specifies
+that such files should go into a subdirectory named after the program,
+like &lsquo;<samp>texmf/ttf2pk</samp>&rsquo;.
+</p>
+<p>Two formats, &lsquo;<samp>kpse_program_text_format</samp>&rsquo; and
+&lsquo;<samp>kpse_program_binary_format</samp>&rsquo;, use <code>.:$TEXMF/<var>program</var>//</code>
+as their compiled-in search path. To override this default, you can
+use the variable <code><var>PROGRAM</var>INPUTS</code> in the environment and/or
+&lsquo;<samp>texmf.cnf</samp>&rsquo;. That is to say, the name of the variable is
+constructed by converting the name of the program to upper case, and
+appending <code>INPUTS</code>.
+</p>
+<p>The only difference between these two formats is whether
+<code>kpathsea_open_file</code> will open the files it finds in text or binary
+mode.
+</p>
+
+<hr>
+<span id="Programming-with-config-files"></span><div class="header">
+<p>
+Previous: <a href="#Program_002dspecific-files" accesskey="p" rel="prev">Program-specific files</a>, Up: <a href="#Programming" accesskey="u" rel="up">Programming</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Programming-with-config-files-1"></span><h3 class="section">7.4 Programming with config files</h3>
+
+<span id="index-programming-with-config-files"></span>
+<span id="index-config-files_002c-programming-with"></span>
+
+<p>You can (and probably should) use the same <code>texmf.cnf</code>
+configuration file that Kpathsea uses for your program. This helps
+installers by keeping all configuration in one place.
+</p>
+<span id="index-kpathsea_005fvar_005fvalue"></span>
+<span id="index-variable_002eh"></span>
+<span id="index-shell_005fescape_002c-example-for-code"></span>
+<p>To retrieve a value for a configuration variable <var>var</var>, the best
+way is to call <code>kpathsea_var_value</code> on the string
+<code><var>var</var></code>. This will look first for an environment variable
+<var>var</var>, then a config file value. The result will be the value
+found or &lsquo;<samp>NULL</samp>&rsquo;. This function is declared in
+<samp>kpathsea/variable.h</samp>. For an example, see the
+<code>shell_escape</code> code in <samp>web2c/lib/texmfmp.c</samp>.
+</p>
+<p>The routine to do full variable and tilde expansion of an arbitrary
+string in the context of a search path (as opposed to simply
+retrieving a value) is <code>kpathsea_var_expand</code>, also declared in
+<samp>kpathsea/variable.h</samp>. However, it&rsquo;s generally only necessary to
+set the search path structure components as explained in the previous
+section instead of using this directly. Because of its usage with any
+input string, undefined <code>$FOO</code> constructs in the argument to
+<code>kpathsea_var_expand</code> are returned literally (<code>&quot;$FOO&quot;</code>),
+while undefined <code>${FOO}</code> constructs are expanded to the empty
+string.
+</p>
+<span id="index-kpathsea_005fcnf_005fget"></span>
+<span id="index-cnf_002eh"></span>
+<p>If for some reason you want to retrieve a value <em>only</em> from a
+config file, not automatically looking for a corresponding environment
+variable, call <code>kpathsea_cnf_get</code> (declared in <samp>kpathsea/cnf.h</samp>)
+with the string <var>var</var>.
+</p>
+<p>No initialization calls are needed.
+</p>
+
+<hr>
+<span id="Reporting-bugs"></span><div class="header">
+<p>
+Next: <a href="#Index" accesskey="n" rel="next">Index</a>, Previous: <a href="#Programming" accesskey="p" rel="prev">Programming</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Reporting-bugs-1"></span><h2 class="chapter">8 Reporting bugs</h2>
+
+<span id="index-reporting-bugs"></span>
+<span id="index-bugs_002c-reporting"></span>
+
+<span id="index-tex_002dk_0040tug_002eorg-_0028bug-address_0029"></span>
+<span id="index-bug-address"></span>
+<p>If you have problems or suggestions, please report them to
+<a href="mailto:tex-k@tug.org">tex-k@tug.org</a> using the bug checklist below.
+</p>
+<p>Please report bugs in the documentation; not only factual errors or
+inconsistent behavior, but unclear or incomplete explanations, typos,
+wrong fonts, &hellip;
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Bug-checklist" accesskey="1">Bug checklist</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">What to include in a good bug report.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Mailing-lists" accesskey="2">Mailing lists</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Joining the bugs or announcements mailing lists.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Debugging" accesskey="3">Debugging</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Analyzing runtime problems.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Logging" accesskey="4">Logging</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Recording searches.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Common-problems" accesskey="5">Common problems</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">When things go wrong.
+</td></tr>
+</table>
+
+
+<hr>
+<span id="Bug-checklist"></span><div class="header">
+<p>
+Next: <a href="#Mailing-lists" accesskey="n" rel="next">Mailing lists</a>, Up: <a href="#Reporting-bugs" accesskey="u" rel="up">Reporting bugs</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Bug-checklist-1"></span><h3 class="section">8.1 Bug checklist</h3>
+
+<span id="index-checklist-for-bug-reports"></span>
+<span id="index-bug-checklist"></span>
+
+<p>Before reporting a bug, please check below to be sure it isn&rsquo;t already
+known (see <a href="#Common-problems">Common problems</a>).
+</p>
+<p>Bug reports should be sent via electronic mail to
+<a href="mailto:tex-k@tug.org">tex-k@tug.org</a>.
+</p>
+<p>The general principle is that a good bug report includes all the
+information necessary for reproduction. Therefore, to enable
+investigation, your report should include the following:
+</p>
+<ul>
+<li> <span id="index-version-numbers_002c-determining"></span>
+The version number(s) of the program(s) involved, and of Kpathsea
+itself. You can get the former by giving a sole option &lsquo;<samp>--version</samp>&rsquo;
+to the program, and the latter by running &lsquo;<samp>kpsewhich --version</samp>&rsquo;.
+The <samp>NEWS</samp> and <samp>ChangeLog</samp> files also contain the version
+number.
+
+</li><li> <span id="index-uname"></span>
+The hardware, operating system (including version), compiler, and
+<code>make</code> program you are using (the output of <code>uname -a</code> is a
+start on the first two, though incomplete).
+
+</li><li> <span id="index-config_002elog"></span>
+Any options you gave to <code>configure</code>. This is recorded in the
+<samp>config.status</samp> files.
+
+<span id="index-configuration-bugs"></span>
+<span id="index-config_002estatus"></span>
+<p>If you are reporting a bug in &lsquo;<samp>configure</samp>&rsquo; itself, it&rsquo;s probably
+system-dependent, and it will be unlikely the maintainers can do
+anything useful if you merely report that thus-and-such is broken.
+Therefore, you need to do some additional work: for some bugs, you can
+look in the file <samp>config.log</samp> where the test that failed should
+appear, along with the compiler invocation and source program in
+question. You can then compile it yourself by hand, and discover why
+the test failed. Other &lsquo;<samp>configure</samp>&rsquo; bugs do not involve the
+compiler; in that case, the only recourse is to inspect the
+<code>configure</code> shell script itself, or the Autoconf macros that
+generated <code>configure</code>.
+</p>
+</li><li> The log of all debugging output, if the bug is in path searching. You
+can get this by setting the environment variable <code>KPATHSEA_DEBUG</code>
+to &lsquo;<samp>-1</samp>&rsquo; before running the program. Please look at the log
+yourself to make sure the behavior is really a bug before reporting it;
+perhaps &ldquo;old&rdquo; environment variable settings are causing files not to
+be found, for example.
+
+</li><li> The contents of any input files necessary to reproduce the bug. For
+bugs in DVI-reading programs, for example, this generally means a DVI
+file (and any EPS or other files it uses)&mdash;TeX source files are
+helpful, but the DVI file is required, because that&rsquo;s the actual
+program input.
+
+</li><li> <span id="index-context-diff"></span>
+<span id="index-sending-patches"></span>
+<span id="index-ChangeLog-entry"></span>
+If you are sending a patch (do so if you can!), please do so in the form
+of a context diff (&lsquo;<samp>diff -c</samp>&rsquo;) against the original distribution
+source. Any other form of diff is either not as complete or harder for
+me to understand. Please also include a <samp>ChangeLog</samp> entry.
+
+</li><li> <span id="index-stack-trace"></span>
+<span id="index-debugger"></span>
+<span id="index-crashes_002c-reporting"></span>
+<span id="index-core-dumps_002c-reporting"></span>
+<span id="index-null-pointers_002c-dereferencing"></span>
+<span id="index-gdb_002c-recommended"></span>
+If the bug involved is an actual crash (i.e., core dump), it is easy
+and useful to include a stack trace from a debugger (I recommend the
+GNU debugger GDB (<a href="http://www.gnu.org/software/gdb">http://www.gnu.org/software/gdb</a>). If the
+cause is apparent (a <code>NULL</code> value being dereferenced, for
+example), please send the details along. If the program involved is
+TeX or Metafont, and the crash is happening at apparently-sound
+code, however, the bug may well be in the compiler, rather than in the
+program or the library (see <a href="#TeX-or-Metafont-failing">TeX or
+Metafont failing</a>).
+
+</li><li> Any additional information that will be helpful in reproducing,
+diagnosing, or fixing the bug.
+</li></ul>
+
+
+<hr>
+<span id="Mailing-lists"></span><div class="header">
+<p>
+Next: <a href="#Debugging" accesskey="n" rel="next">Debugging</a>, Previous: <a href="#Bug-checklist" accesskey="p" rel="prev">Bug checklist</a>, Up: <a href="#Reporting-bugs" accesskey="u" rel="up">Reporting bugs</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Mailing-lists-1"></span><h3 class="section">8.2 Mailing lists</h3>
+
+<span id="index-mailing-lists"></span>
+<span id="index-bug-mailing-list"></span>
+<span id="index-announcement-mailing-list"></span>
+
+<span id="index-tex_002dk_0040tug_002eorg"></span>
+<p>Web2c and Kpathsea in general are discussed on the mailing list
+<a href="mailto:tex-k@tug.org">tex-k@tug.org</a>. You can subscribe and peruse the archives on
+the web <a href="http://lists.tug.org/tex-k">http://lists.tug.org/tex-k</a>.
+</p>
+<p>You do not need to join to submit a report, nor will it affect whether
+you get a response. Be aware that large data files are sometimes
+included in bug reports. If this is a problem for you, do not join
+the list.
+</p>
+<p>If you are looking for general TeX help, such as how to install a
+full TeX system or how to use LaTeX, please see
+<a href="http://tug.org/begin.html">http://tug.org/begin.html</a>.
+</p>
+
+<hr>
+<span id="Debugging"></span><div class="header">
+<p>
+Next: <a href="#Logging" accesskey="n" rel="next">Logging</a>, Previous: <a href="#Mailing-lists" accesskey="p" rel="prev">Mailing lists</a>, Up: <a href="#Reporting-bugs" accesskey="u" rel="up">Reporting bugs</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Debugging-1"></span><h3 class="section">8.3 Debugging</h3>
+
+<span id="index-debugging"></span>
+<span id="index-runtime-debugging"></span>
+<span id="index-options-for-debugging"></span>
+
+<span id="index-kpse_002d_003edebug"></span>
+<span id="index-debug_002eh"></span>
+<p>Kpathsea provides a number of runtime debugging options, detailed below
+by their names and corresponding numeric values. When the files you
+expect aren&rsquo;t being found, the thing to do is enable these options and
+examine the output.
+</p>
+<p>You can set these with some runtime argument (e.g., &lsquo;<samp>-d</samp>&rsquo;) to the
+program; in that case, you should use the numeric values described in
+the program&rsquo;s documentation (which, for Dvipsk and Xdvik, are different
+than those below). It&rsquo;s best to give the &lsquo;<samp>-d</samp>&rsquo; (or whatever) option
+first, for maximal output. Dvipsk and Xdvik have additional
+program-specific debugging options as well.
+</p>
+<span id="index-KPATHSEA_005fDEBUG-1"></span>
+<span id="index-kpse_002d_003edebug-1"></span>
+<p>You can also set the environment variable <code>KPATHSEA_DEBUG</code>; in this
+case, you should use the numbers below. If you run the program under a
+debugger and set the instance variable <code>kpse-&gt;debug</code>, also use the numbers
+below.
+</p>
+<span id="index-_002d1-debugging-value"></span>
+<p>In any case, by far the simplest value to use is &lsquo;<samp>-1</samp>&rsquo;, which will
+turn on all debugging output. This is usually better than guessing
+which particular values will yield the output you need.
+</p>
+<span id="index-debugging-output"></span>
+<span id="index-standard-error-and-debugging-output"></span>
+<p>Debugging output always goes to standard error, so you can redirect it
+easily. For example, in Bourne-compatible shells:
+</p><div class="example">
+<pre class="example">dvips -d -1 &hellip; 2&gt;/tmp/debug
+</pre></div>
+
+<span id="index-Kpsewhich_002c-and-debugging"></span>
+<p>It is sometimes helpful to run the standalone Kpsewhich utility
+(see <a href="#Invoking-kpsewhich">Invoking kpsewhich</a>), instead of the original program.
+</p>
+<span id="index-numeric-debugging-values"></span>
+<p>In any case, you cannot use the names below; you must always use
+somebody&rsquo;s numbers. (Sorry.) To set more than one option, just sum
+the corresponding numbers.
+</p>
+<dl compact="compact">
+<dt><code>KPSE_DEBUG_STAT <span class="roman">(1)</span></code>
+<span id="index-KPSE_005fDEBUG_005fSTAT-_00281_0029"></span>
+</dt>
+<dd><p>Report &lsquo;<samp>stat</samp>&rsquo;(2) calls. This is useful for verifying that your
+directory structure is not forcing Kpathsea to do many additional file
+tests (see <a href="#Slow-path-searching">Slow path searching</a>, and see <a href="#Subdirectory-expansion">Subdirectory expansion</a>). If you are using an up-to-date <samp>ls-R</samp> database
+(see <a href="#Filename-database">Filename database</a>), this should produce no output unless a
+nonexistent file that must exist is searched for.
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_HASH <span class="roman">(2)</span></code>
+<span id="index-KPSE_005fDEBUG_005fHASH-_00282_0029"></span>
+</dt>
+<dd><p>Report lookups in all hash tables: <samp>ls-R</samp> and <samp>aliases</samp>
+(see <a href="#Filename-database">Filename database</a>); font aliases (see <a href="#Fontmap">Fontmap</a>); and config
+file values (see <a href="#Config-files">Config files</a>). Useful when expected values are not
+being found, e.g.., file searches are looking at the disk instead of
+using <samp>ls-R</samp>.
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_FOPEN <span class="roman">(4)</span></code>
+<span id="index-KPSE_005fDEBUG_005fFOPEN-_00284_0029"></span>
+</dt>
+<dd><span id="index-fopen_002c-redefined"></span>
+<p>Report file openings and closings. Especially useful when your system&rsquo;s
+file table is full, for seeing which files have been opened but never
+closed. In case you want to set breakpoints in a debugger: this works by
+redefining &lsquo;<samp>fopen</samp>&rsquo; (&lsquo;<samp>fclose</samp>&rsquo;) to be &lsquo;<samp>kpse_fopen_trace</samp>&rsquo;
+(&lsquo;<samp>kpse_fclose_trace</samp>&rsquo;).
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_PATHS <span class="roman">(8)</span></code>
+<span id="index-KPSE_005fDEBUG_005fPATHS-_00288_0029"></span>
+</dt>
+<dd><span id="index-kpse_005fformat_005finfo_005ftype"></span>
+<p>Report general path information for each file type Kpathsea is asked to
+search. This is useful when you are trying to track down how a
+particular path got defined&mdash;from <samp>texmf.cnf</samp>, <samp>config.ps</samp>,
+an environment variable, the compile-time default, etc. This is the
+contents of the <code>kpse_format_info_type</code> structure defined in
+<samp>tex-file.h</samp>.
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_EXPAND <span class="roman">(16)</span></code>
+<span id="index-KPSE_005fDEBUG_005fEXPAND-_002816_0029"></span>
+</dt>
+<dd><p>Report the directory list corresponding to each path element Kpathsea
+searches. This is only relevant when Kpathsea searches the disk, since
+<samp>ls-R</samp> searches don&rsquo;t look through directory lists in this way.
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_SEARCH <span class="roman">(32)</span></code>
+<span id="index-KPSE_005fDEBUG_005fSEARCH-_002832_0029"></span>
+</dt>
+<dd><p>Report on each file search: the name of the file searched for, the path
+searched in, whether or not the file must exist (when drivers search for
+<samp>cmr10.vf</samp>, it need not exist), and whether or not we are
+collecting all occurrences of the file in the path (as with, e.g.,
+<samp>texmf.cnf</samp> and <samp>texfonts.map</samp>), or just the first (as with
+most lookups). This can help you correlate what Kpathsea is doing with
+what is in your input file.
+</p>
+</dd>
+<dt><code>KPSE_DEBUG_VARS <span class="roman">(64)</span></code>
+<span id="index-KPSE_005fDEBUG_005fVARS-_002864_0029"></span>
+</dt>
+<dd><p>Report the value of each variable Kpathsea looks up. This is useful for
+verifying that variables do indeed obtain their correct values.
+</p>
+</dd>
+<dt><code>GSFTOPK_DEBUG <span class="roman">(128)</span></code>
+<span id="index-GSFTOPK_005fDEBUG-_0028128_0029"></span>
+</dt>
+<dd><p>Activates debugging printout specific to <code>gsftopk</code> program.
+</p>
+</dd>
+<dt><code>MAKETEX_DEBUG <span class="roman">(512)</span></code>
+<span id="index-MAKETEX_005fDEBUG-_0028512_0029"></span>
+</dt>
+<dd><p>If you use the optional <code>mktex</code> programs instead of the
+traditional shell scripts, this will report the name of the site file
+(<samp>mktex.cnf</samp> by default) which is read, directories created by
+<code>mktexdir</code>, the full path of the <samp>ls-R</samp> database built by
+<code>mktexlsr</code>, font map searches, <code>MT_FEATURES</code> in effect,
+parameters from <code>mktexnam</code>, filenames added by
+<code>mktexupd</code>, and some subsidiary commands run by the programs.
+</p>
+</dd>
+<dt><code>MAKETEX_FINE_DEBUG <span class="roman">(1024)</span></code>
+<span id="index-MAKETEX_005fFINE_005fDEBUG-_00281024_0029"></span>
+</dt>
+<dd><p>When the optional <code>mktex</code> programs are used, this will print
+additional debugging info from functions internal to these programs.
+</p></dd>
+</dl>
+
+<span id="index-kdebug_003a"></span>
+<span id="index-hash_005fsummary_005fonly-variable-for-debugging"></span>
+<span id="index-hash-table-buckets_002c-printing"></span>
+<p>Debugging output from Kpathsea is always written to standard error, and
+begins with the string &lsquo;<samp>kdebug:</samp>&rsquo;. (Except for hash table buckets,
+which just start with the number, but you can only get that output
+running under a debugger. See comments at the <code>hash_summary_only</code>
+variable in <samp>kpathsea/db.c</samp>.)
+</p>
+
+<hr>
+<span id="Logging"></span><div class="header">
+<p>
+Next: <a href="#Common-problems" accesskey="n" rel="next">Common problems</a>, Previous: <a href="#Debugging" accesskey="p" rel="prev">Debugging</a>, Up: <a href="#Reporting-bugs" accesskey="u" rel="up">Reporting bugs</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Logging-1"></span><h3 class="section">8.4 Logging</h3>
+
+<span id="index-log-file"></span>
+
+<span id="index-logging-successful-searches"></span>
+<span id="index-recording-successful-searches"></span>
+<span id="index-usage-patterns_002c-finding"></span>
+<span id="index-disk-usage_002c-reducing"></span>
+<p>Kpathsea can record the time and filename found for each successful
+search. This may be useful in finding good candidates for deletion when
+your filesystem is full, or in discovering usage patterns
+at your site.
+</p>
+<span id="index-TEXMFLOG"></span>
+<p>To do this, define the environment or config file variable
+<code>TEXMFLOG</code>. The value is the name of the file to append the
+information to. The file is created if it doesn&rsquo;t exist, and appended
+to if it does.
+</p>
+<span id="index-epoch_002c-seconds-since"></span>
+<span id="index-time-system-call"></span>
+<p>Each successful search turns into one line in the log file: two words
+separated by a space. The first word is the time of the search, as the
+integer number of seconds since &ldquo;the epoch&rdquo;, i.e., UTC midnight 1
+January 1970 (more precisely, the result of the <code>time</code> system
+call). The second word is the filename.
+</p>
+<p>For example, after <code>setenv TEXMFLOG /tmp/log</code>, running Dvips on
+<samp>story.dvi</samp> appends the following lines:
+</p>
+<div class="example">
+<pre class="example">774455887 /usr/local/share/texmf/dvips/config.ps
+774455887 /usr/local/share/texmf/dvips/psfonts.map
+774455888 /usr/local/share/texmf/dvips/texc.pro
+774455888 /usr/local/share/texmf/fonts/pk/ljfour/public/cm/cmbx10.600pk
+774455889 /usr/local/share/texmf/fonts/pk/ljfour/public/cm/cmsl10.600pk
+774455889 /usr/local/share/texmf/fonts/pk/ljfour/public/cm/cmr10.600pk
+774455889 /usr/local/share/texmf/dvips/texc.pro
+</pre></div>
+
+<span id="index-privacy_002c-semblance-of"></span>
+<p>Only filenames that are absolute are recorded, to preserve
+some semblance of privacy.
+</p>
+<p>In addition to this Kpathsea-specific logging, <code>pdftex</code>
+provides an option <samp>-recorder</samp> to write the names of all files
+accessed during a run to the file <samp><var>basefile</var>.fls</samp>.
+</p>
+<p>Finally, most systems provide a general tool to output each system
+call, thus including opening and closing files. It might be named
+<code>strace</code>, <code>truss</code>, <code>struss</code>, or something
+else.
+</p>
+
+<hr>
+<span id="Common-problems"></span><div class="header">
+<p>
+Previous: <a href="#Logging" accesskey="p" rel="prev">Logging</a>, Up: <a href="#Reporting-bugs" accesskey="u" rel="up">Reporting bugs</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Common-problems-1"></span><h3 class="section">8.5 Common problems</h3>
+
+<span id="index-common-problems"></span>
+<span id="index-problems_002c-common"></span>
+<span id="index-FAQ_002c-Kpathsea"></span>
+
+<p>Here are some common problems with configuration, compilation, linking,
+execution, &hellip;
+</p>
+<table class="menu" border="0" cellspacing="0">
+<tr><td align="left" valign="top">&bull; <a href="#Unable-to-find-files" accesskey="1">Unable to find files</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">If your program can&rsquo;t find fonts (or whatever).
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Slow-path-searching" accesskey="2">Slow path searching</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">If it takes forever to find anything.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Unable-to-generate-fonts" accesskey="3">Unable to generate fonts</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">If mktexpk fails.
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#TeX-or-Metafont-failing" accesskey="4">TeX or Metafont failing</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Likely compiler bugs.
+</td></tr>
+</table>
+
+<hr>
+<span id="Unable-to-find-files"></span><div class="header">
+<p>
+Next: <a href="#Slow-path-searching" accesskey="n" rel="next">Slow path searching</a>, Up: <a href="#Common-problems" accesskey="u" rel="up">Common problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Unable-to-find-files-1"></span><h4 class="subsection">8.5.1 Unable to find files</h4>
+
+<span id="index-unable-to-find-files"></span>
+<span id="index-files_002c-unable-to-find"></span>
+
+<p>If a program complains it cannot find fonts (or other input files), any
+of several things might be wrong. In any case, you may find the
+debugging options helpful. See <a href="#Debugging">Debugging</a>.
+</p>
+<ul>
+<li> Perhaps you simply haven&rsquo;t installed all the necessary files; the basic
+fonts and input files are distributed separately from the programs.
+See <a href="#unixtex_002eftp">unixtex.ftp</a>.
+
+</li><li> <span id="index-_002fetc_002fprofile"></span>
+<span id="index-environment-variables_002c-old"></span>
+You have (perhaps unknowingly) told Kpathsea to use search paths that
+don&rsquo;t reflect where the files actually are. One common cause is having
+environment variables set from a previous installation, thus overriding
+what you carefully set in <samp>texmf.cnf</samp> (see <a href="#Supported-file-formats">Supported file formats</a>). System <samp>/etc/profile</samp> or other files such may be the
+culprit.
+
+</li><li> <span id="index-symbolic-links-not-found"></span>
+<span id="index-leaf-directories-wrongly-guessed"></span>
+Your files reside in a directory that is only pointed to via a symbolic
+link, in a leaf directory and is not listed in <samp>ls-R</samp>.
+
+<p>Unfortunately, Kpathsea&rsquo;s subdirectory searching has an irremediable
+deficiency: If a directory <var>d</var> being searched for subdirectories
+contains plain files and symbolic links to other directories, but no
+true subdirectories, <var>d</var> will be considered a leaf directory, i.e.,
+the symbolic links will not be followed. See <a href="#Subdirectory-expansion">Subdirectory expansion</a>.
+</p>
+<p>You can work around this problem by creating an empty dummy subdirectory
+in <var>d</var>. Then <var>d</var> will no longer be a leaf, and the symlinks will
+be followed.
+</p>
+<p>The directory immediately followed by the &lsquo;<samp>//</samp>&rsquo; in the path
+specification, however, is always searched for subdirectories, even if
+it is a leaf. Presumably you would not have asked for the directory to
+be searched for subdirectories if you didn&rsquo;t want it to be.
+</p>
+</li><li> If the fonts (or whatever) don&rsquo;t already exist, <code>mktexpk</code> (or
+<code>mktexmf</code> or <code>mktextfm</code>) will try to create them. If
+these rather complicated shell scripts fail, you&rsquo;ll eventually get an
+error message saying something like &lsquo;<samp>Can't find font
+<var>fontname</var></samp>&rsquo;. The best solution is to fix (or at least report) the
+bug in <code>mktexpk</code>; the workaround is to generate the necessary
+fonts by hand with Metafont, or to grab them from a CTAN site
+(see <a href="#unixtex_002eftp">unixtex.ftp</a>).
+
+</li><li> There is a bug in the library. See <a href="#Reporting-bugs">Reporting bugs</a>.
+</li></ul>
+
+
+<hr>
+<span id="Slow-path-searching"></span><div class="header">
+<p>
+Next: <a href="#Unable-to-generate-fonts" accesskey="n" rel="next">Unable to generate fonts</a>, Previous: <a href="#Unable-to-find-files" accesskey="p" rel="prev">Unable to find files</a>, Up: <a href="#Common-problems" accesskey="u" rel="up">Common problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Slow-path-searching-1"></span><h4 class="subsection">8.5.2 Slow path searching</h4>
+
+<span id="index-excessive-startup-time"></span>
+<span id="index-slow-startup-time"></span>
+<span id="index-startup-time_002c-excessive"></span>
+
+<p>If your program takes an excessively long time to find fonts or other
+input files, but does eventually succeed, here are some possible culprits:
+</p>
+<ul>
+<li> Most likely, you just have a lot of directories to search, and that
+takes a noticeable time. The solution is to create and maintain a
+separate <samp>ls-R</samp> file that lists all the files in your main TeX
+hierarchy. See <a href="#Filename-database">Filename database</a>. Kpathsea always uses <samp>ls-R</samp>
+if it&rsquo;s present; there&rsquo;s no need to recompile or reconfigure any of the
+programs.
+
+</li><li> Your recursively-searched directories (e.g.,
+<samp>/usr/local/share/texmf/fonts//</samp>), contain a mixture of files and
+directories. This prevents Kpathsea from using a useful optimization
+(see <a href="#Subdirectory-expansion">Subdirectory expansion</a>).
+
+<p>It is best to have only directories (and perhaps a <samp>README</samp>) in the
+upper levels of the directory structure, and it&rsquo;s very important to have
+<em>only</em> files, and no subdirectories, in the leaf directories where
+the dozens of TFM, PK, or whatever files reside.
+</p></li></ul>
+
+<p>In any case, you may find the debugging options helpful in determining
+precisely when the disk or network is being pounded. See <a href="#Debugging">Debugging</a>.
+</p>
+
+<hr>
+<span id="Unable-to-generate-fonts"></span><div class="header">
+<p>
+Next: <a href="#TeX-or-Metafont-failing" accesskey="n" rel="next">TeX or Metafont failing</a>, Previous: <a href="#Slow-path-searching" accesskey="p" rel="prev">Slow path searching</a>, Up: <a href="#Common-problems" accesskey="u" rel="up">Common problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Unable-to-generate-fonts-1"></span><h4 class="subsection">8.5.3 Unable to generate fonts</h4>
+
+<span id="index-unable-to-generate-fonts"></span>
+<span id="index-font-generation-failures"></span>
+
+<p>Metafont outputs fonts in bitmap format, tuned for a particular
+device at a particular resolution, in order to allow for the
+highest-possible quality of output. Some DVI-to-whatever programs,
+such as Dvips, try to generate these on the fly when they are needed,
+but this generation may fail in several cases.
+</p>
+<span id="index-mktexpk-can_0027t-guess-mode"></span>
+<p>If <code>mktexpk</code> runs, but fails with this error:
+</p><div class="example">
+<pre class="example">mktexpk: Can't guess mode for <var>nnn</var> dpi devices.
+mktexpk: Use a config file to specify the mode, or update me.
+</pre></div>
+<p>you need to ensure the resolution and mode match; just
+specifying the resolution, as in <code>-D 360</code>, is not enough.
+</p>
+<p>You can specify the mode name with the <code>-mode</code> option on the
+Dvips command line, or in a Dvips configuration file (see <a href="https://tug.org/texinfohtml/dvips.html#Config-files">Config
+files</a> in <cite>Dvips</cite>), such as <samp>config.ps</samp> in your document
+directory, <samp>~/.dvipsrc</samp> in your home directory, or in a system
+directory (again named <samp>config.ps</samp>). (Other drivers use other
+files, naturally.)
+</p>
+<p>For example, if you need 360dpi fonts, you could include this in
+a configuration file:
+</p><div class="example">
+<pre class="example">D 360
+M lqmed
+</pre></div>
+
+<span id="index-Metafont-using-the-wrong-device"></span>
+<span id="index-device_002c-wrong"></span>
+<p>If Metafont runs, but generates fonts at the wrong resolution or for
+the wrong device, most likely <code>mktexpk</code>&rsquo;s built-in guess for the
+mode is wrong, and you should override it as above.
+</p>
+<p>See <a href="http://ctan.org/pkg/modes">http://ctan.org/pkg/modes</a> for a list of resolutions and mode
+names for most devices (additional submissions are welcome).
+</p>
+<span id="index-_002e2602gf"></span>
+<span id="index-2602gf"></span>
+<span id="index-Metafont-making-too_002dlarge-fonts"></span>
+<span id="index-proof-mode"></span>
+<span id="index-online-Metafont-display_002c-spurious"></span>
+<p>If Metafont runs but generates fonts at a resolution of 2602dpi
+(and prints out the name of each character as well as just a character
+number, and maybe tries to display the characters), then your Metafont
+base file probably hasn&rsquo;t been made properly. (It&rsquo;s using the default
+<code>proof</code> mode, instead of an actual device mode.) To make a proper
+<samp>plain.base</samp>, assuming the local mode definitions are contained in
+a file <samp>modes.mf</samp>, run the following command (assuming Unix):
+</p>
+<div class="example">
+<pre class="example">inimf &quot;plain; input modes; dump&quot;
+</pre></div>
+
+<p><span id="index-plain_002ebase"></span>
+Then copy the <samp>plain.base</samp> file from the current directory to where
+the base files are stored on your system
+(<samp>/usr/local/share/texmf/web2c</samp> by default), and make a link
+(either hard or soft) from <samp>plain.base</samp> to <samp>mf.base</samp> in that
+directory.
+See <a href="https://tug.org/texinfohtml/web2c.html#inimf-invocation">inimf invocation</a> in <cite>Web2c</cite>.
+</p>
+<span id="index-Metafont-installation"></span>
+<p>If <code>mf</code> is a command not found at all by <code>mktexpk</code>, then you
+need to install Metafont (see <a href="#unixtex_002eftp">unixtex.ftp</a>).
+</p>
+
+<hr>
+<span id="TeX-or-Metafont-failing"></span><div class="header">
+<p>
+Previous: <a href="#Unable-to-generate-fonts" accesskey="p" rel="prev">Unable to generate fonts</a>, Up: <a href="#Common-problems" accesskey="u" rel="up">Common problems</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="TeX-or-Metafont-failing-1"></span><h4 class="subsection">8.5.4 TeX or Metafont failing</h4>
+
+<span id="index-TeX-failures"></span>
+<span id="index-Metafont-failures"></span>
+<span id="index-compiler-bugs"></span>
+<p>If TeX or Metafont get a segmentation fault or otherwise fail while
+running a normal input file, the problem is usually a compiler bug
+(unlikely as that may sound). Even if the trip and trap tests are
+passed, problems may lurk. Optimization occasionally causes trouble in
+programs other than TeX and Metafont themselves, too.
+</p>
+<span id="index-optimization-caveat"></span>
+<p>For a workaround, if you enabled any optimization flags, it&rsquo;s best to
+omit optimization entirely. In any case, the way to find the facts is
+to run the program under the debugger and see where it&rsquo;s failing.
+</p>
+<span id="index-GNU-C-compiler-bugs"></span>
+<span id="index-system-C-compiler-bugs"></span>
+<p>Also, if you have trouble with a system C compiler, I advise trying the
+GNU C compiler. And vice versa, unfortunately; but in that case I also
+recommend reporting a bug to the GCC mailing list; see <a href="https://gcc.gnu.org/onlinedocs/gcc/Bugs.html#Bugs">Bugs</a> in <cite>Using and Porting GNU CC</cite>.
+</p>
+<span id="index-compiler-bugs_002c-finding"></span>
+<p>To report compiler bugs effectively requires perseverance and
+perspicacity: you must find the miscompiled line, and that usually
+involves delving backwards in time from the point of error, checking
+through TeX&rsquo;s (or whatever program&rsquo;s) data structures. Good luck.
+</p>
+
+<hr>
+<span id="Index"></span><div class="header">
+<p>
+Previous: <a href="#Reporting-bugs" accesskey="p" rel="prev">Reporting bugs</a>, Up: <a href="#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="#Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Index-1"></span><h2 class="unnumbered">Index</h2>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-2"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-3"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-4"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-5"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-6"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-7"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-8"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-9"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-10"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-11"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+<table class="index-cp" border="0">
+<tr><td></td><th align="left">Index Entry</th><td>&nbsp;</td><th align="left"> Section</th></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-1">!</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021_0021-and-casefolding"><code>!! <span class="roman">and casefolding</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021_0021-in-path-specifications"><code>!! <span class="roman">in path specifications</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0021_0021-in-TEXMFDBS"><code>!! <span class="roman">in <code>TEXMFDBS</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-2">$</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_0024-expansion"><code>$ <span class="roman">expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-3">-</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dall"><code>--all</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dcasefold_002dsearch"><code>--casefold-search</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dcolor_003dtty"><code>--color=tty</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002ddebug_003dnum"><code>--debug=<var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002ddpi_003dnum"><code>--dpi=<var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dengine_003dname"><code>--engine=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dexpand_002dbraces_003dstring"><code>--expand-braces=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dexpand_002dpath_003dstring"><code>--expand-path=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dexpand_002dvar_003dstring"><code>--expand-var=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dformat_003dname"><code>--format=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dhelp"><code>--help</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Standard-options">Standard options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dhelp_002dformats"><code>--help-formats</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dinteractive"><code>--interactive</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dmktex_003dfiletype"><code>--mktex=<var>filetype</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dmode_003dstring"><code>--mode=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dmust_002dexist"><code>--must-exist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dno_002dcasefold_002dsearch"><code>--no-casefold-search</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dno_002dmktex_003dfiletype"><code>--no-mktex=<var>filetype</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dpath_003dstring"><code>--path=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dprogname_003dname"><code>--progname=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dsafe_002din_002dname_003dname"><code>--safe-in-name=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dsafe_002dout_002dname_003dname"><code>--safe-out-name=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dshow_002dpath_003dname"><code>--show-path=<var>name</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dsubdir_003dstring"><code>--subdir=<var>string</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dvar_002dbrace_002dvalue_003dvariable"><code>--var-brace-value=<var>variable</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dvar_002dvalue_003dvariable"><code>--var-value=<var>variable</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dversion"><code>--version</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Standard-options">Standard options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwith_002dmktextex_002ddefault"><code>--with-mktextex-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktexfmt_002ddefault"><code>--without-mktexfmt-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktexmf_002ddefault"><code>--without-mktexmf-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktexocp_002ddefault"><code>--without-mktexocp-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktexofm_002ddefault"><code>--without-mktexofm-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktexpk_002ddefault"><code>--without-mktexpk-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d_002dwithout_002dmktextfm_002ddefault"><code>--without-mktextfm-default</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002d1-debugging-value"><code>-1 <span class="roman">debugging value</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dA-option-to-ls"><code>-A <span class="roman">option to <code>ls</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dD-num"><code>-D <var>num</var></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002diname_002c-find-predicate"><code>-iname<span class="roman">, find predicate</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002dL-option-to-ls"><code>-L <span class="roman">option to <code>ls</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-4">.</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002e-directories_002c-ignored"><code>. <span class="roman">directories, ignored</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002e-files"><code>. <span class="roman">files</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002e2602gf"><code>.2602gf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eafm"><code>.afm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebase"><code>.base</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebib"><code>.bib</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebltxml"><code>.bltxml</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ebst"><code>.bst</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ecid"><code>.cid</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ecmap"><code>.cmap</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ecnf"><code>.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002edll"><code>.dll</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eenc"><code>.enc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eeps"><code>.eps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eepsi"><code>.epsi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002efea"><code>.fea</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002efmt"><code>.fmt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eist"><code>.ist</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002elig"><code>.lig</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emap"><code>.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emem"><code>.mem</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emf"><code>.mf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emft"><code>.mft</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emlbib"><code>.mlbib</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emlbst"><code>.mlbst</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002emp"><code>.mp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eocp"><code>.ocp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eofm"><code>.ofm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eopl"><code>.opl</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eotp"><code>.otp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eovf"><code>.ovf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eovp"><code>.ovp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfa"><code>.pfa</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epfb"><code>.pfb</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epk"><code>.pk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epool"><code>.pool</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epool-1"><code>.pool</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epool-2"><code>.pool</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002epro"><code>.pro</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002erhosts_002c-writable-by-TeX"><code>.rhosts<span class="roman">, writable by TeX</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eris"><code>.ris</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002esfd"><code>.sfd</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eso"><code>.so</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002etex"><code>.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002etex-file_002c-included-in-ls_002dR"><code>.tex <span class="roman">file, included in <samp>ls-R</samp></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002etfm"><code>.tfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ettc"><code>.ttc</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ettf"><code>.ttf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002evf"><code>.vf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002ew"><code>.w</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eweb"><code>.web</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002eweb-1"><code>.web</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-5">/</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002f-may-not-be-_002f"><code>/ <span class="roman">may not be /</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002f_002c-trailing-in-home-directory"><code>/<span class="roman">, trailing in home directory</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002f_002f"><code>//</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002fetc_002fprofile"><code>/etc/profile</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002fetc_002fprofile-and-aliases"><code>/etc/profile <span class="roman">and aliases</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_002fvar_002ftmp_002ftexfonts"><code>/var/tmp/texfonts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-6">2</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-2602gf"><code>2602gf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-7">8</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-8_002e3-filenames_002c-using">8.3 filenames, using</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-8">:</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003a-may-not-be-_003a"><code>: <span class="roman">may not be :</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_003a_003a-expansion"><code>:: <span class="roman">expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-9">\</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005c_002c-line-continuation-in-texmf_002ecnf"><code>\<span class="roman">, line continuation in <samp>texmf.cnf</samp></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005copenin"><code>\openin</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_005cspecial_002c-suppressing-warnings-about"><code>\special<span class="roman">, suppressing warnings about</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-10">{</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_007b-expansion"><code>{ <span class="roman">expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Brace-expansion">Brace expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_symbol-11">~</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-_007e-expansion"><code>~ <span class="roman">expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-A">A</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-absolute-filenames">absolute filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-access-system-call"><code>access <span class="roman">system call</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-access-warnings">access warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-AFMFONTS"><code>AFMFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-aliases-for-fonts">aliases for fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-aliases_002c-for-filenames">aliases, for filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filename-aliases">Filename aliases</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-all"><code>all</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-all-matches_002c-finding">all matches, finding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-alphabetical-order_002c-not">alphabetical order, not</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-announcement-mailing-list">announcement mailing list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Mailing-lists">Mailing lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-API_002c-re_002dentrant">API, re-entrant</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-append_002donly-directories-and-mktexpk">append-only directories and <code>mktexpk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-appendonlydir"><code>appendonlydir</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Apple-filesystem_002c-case_002dinsensitive">Apple filesystem, case-insensitive</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-arguments-to-mktex">arguments to <samp>mktex</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-arguments">mktex script arguments</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-argv_005b0_005d"><code>argv[0]</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-autoconf_002c-recommended"><code>autoconf<span class="roman">, recommended</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-automounter_002c-and-ls_002dR">automounter, and <samp>ls-R</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-auxiliary-tasks">auxiliary tasks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Auxiliary-tasks">Auxiliary tasks</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-B">B</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Bach_002c-Johann-Sebastian">Bach, Johann Sebastian</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-backslash_002dnewline">backslash-newline</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-basic-glyph-lookup">basic glyph lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-glyph-lookup">Basic glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Berry_002c-Karl">Berry, Karl</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BIBINPUTS"><code>BIBINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BIBINPUTS-1"><code>BIBINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-blank-lines_002c-in-texmf_002ecnf">blank lines, in <samp>texmf.cnf</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BLTXMLINPUTS"><code>BLTXMLINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-brace-expansion">brace expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Brace-expansion">Brace expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Breitenlohner_002c-Peter">Breitenlohner, Peter</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BSTINPUTS"><code>BSTINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-BSTINPUTS-1"><code>BSTINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bug-address">bug address</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reporting-bugs">Reporting bugs</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bug-checklist">bug checklist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bug-mailing-list">bug mailing list</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Mailing-lists">Mailing lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-bugs_002c-reporting">bugs, reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reporting-bugs">Reporting bugs</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-C">C</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-c_002d_002a_002eh"><code>c-*.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-c_002dauto_002eh"><code>c-auto.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cache-of-fonts_002c-local">cache of fonts, local</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-calling-sequence">calling sequence</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-casefolding-examples">casefolding examples</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-casefolding-fallback-rationale">casefolding fallback rationale</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-casefolding-search">casefolding search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-search">Casefolding search</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ChangeLog-entry"><code>ChangeLog <span class="roman">entry</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-checklist-for-bug-reports">checklist for bug reports</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-checksum"><code>checksum</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-circle-fonts">circle fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-client_005fpath-in-kpse_002d_003eformat_005finfo"><code>client_path <span class="roman">in <code>kpse-&gt;format_info</code></span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CLUAINPUTS"><code>CLUAINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CMAPFONTS"><code>CMAPFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmr10_002c-as-fallback-font"><code>cmr10<span class="roman">, as fallback font</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cmr10_002evf"><code>cmr10.vf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cnf_002ec"><code>cnf.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-cnf_002eh"><code>cnf.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-in-fontmap-files">comments, in fontmap files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-in-texmf_002ecnf">comments, in <samp>texmf.cnf</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-comments_002c-making">comments, making</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-common-features-in-glyph-lookup">common features in glyph lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-glyph-lookup">Basic glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-common-problems">common problems</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Common-problems">Common problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compilation-value_002c-source-for-path">compilation value, source for path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compiler-bugs">compiler bugs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-compiler-bugs_002c-finding">compiler bugs, finding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-conditions-for-use">conditions for use</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config-files">config files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config-files_002c-for-Kpathsea_002dusing-programs">config files, for Kpathsea-using programs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config-files_002c-programming-with">config files, programming with</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eh"><code>config.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002elog"><code>config.log</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps"><code>config.ps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002eps_002c-search-path-for"><code>config.ps<span class="roman">, search path for</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-config_002estatus"><code>config.status</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-bugs">configuration bugs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-file_002c-source-for-path">configuration file, source for path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-files-as-shell-scripts_002e">configuration files as shell scripts.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configuration-of-mktex-scripts">configuration of <samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-configure-options-for-mktex-scripts"><code>configure</code> options for <samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-context-diff">context diff</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-continuation-character">continuation character</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-core-dumps_002c-reporting">core dumps, reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-crashes_002c-reporting">crashes, reporting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-CWEBINPUTS"><code>CWEBINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-D">D</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-database-search">database search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-database_002c-for-filenames">database, for filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filename-database">Filename database</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-database_002c-format-of">database, format of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Database-format">Database format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debug_002eh"><code>debug.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugger">debugger</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging">debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging-options_002c-in-Kpathsea_002dusing-program">debugging options, in Kpathsea-using program</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-debugging-output">debugging output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default-expansion">default expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-default_005ftexsizes"><code>default_texsizes</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-device_002c-wrong">device, wrong</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-directories_002c-making-append_002donly">directories, making append-only</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-directory-permissions">directory permissions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-directory-structure_002c-for-TeX-files">directory structure, for TeX files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-directory-structure">TeX directory structure</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disabling-mktex-scripts">disabling <samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disk-search">disk search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disk-searching_002c-avoiding">disk searching, avoiding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-disk-usage_002c-reducing">disk usage, reducing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-doc-files"><code>doc files</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DOS-compatible-names">DOS compatible names</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dosnames"><code>dosnames</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dot-files">dot files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-doubled-colons">doubled colons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dpinnn-directories"><code>dpi<var>nnn</var> directories</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVILJMAKEPK"><code>DVILJMAKEPK</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVILJSIZES"><code>DVILJSIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dvipdfmx_002ecfg"><code>dvipdfmx.cfg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSFONTS"><code>DVIPSFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSHEADERS"><code>DVIPSHEADERS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSMAKEPK"><code>DVIPSMAKEPK</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-DVIPSSIZES"><code>DVIPSSIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dynamic-creation-of-files">dynamic creation of files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-E">E</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-EC-fonts_002c-and-dynamic-source-creation">EC fonts, and dynamic source creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-elt_002ddirs_002ec"><code>elt-dirs.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-elt_002ddirs_002ec-1"><code>elt-dirs.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-enabling-mktex-scripts">enabling <samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ENCFONTS"><code>ENCFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-engine-name">engine name</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environment-variable_002c-source-for-path">environment variable, source for path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environment-variables-for-TeX">environment variables for TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environment-variables-in-paths">environment variables in paths</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-environment-variables_002c-old">environment variables, old</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-epoch_002c-seconds-since">epoch, seconds since</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-error-message-macros">error message macros</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-examples_002c-of-casefolding-searches">examples, of casefolding searches</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-excessive-startup-time">excessive startup time</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slow-path-searching">Slow path searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expand_002ec"><code>expand.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Brace-expansion">Brace expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expanding-symlinks">expanding symlinks</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-default">expansion, default</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-path-element">expansion, path element</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-search-path">expansion, search path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-expansion">Path expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-subdirectory">expansion, subdirectory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-tilde">expansion, tilde</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-expansion_002c-variable">expansion, variable</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-explicitly-relative-filenames">explicitly relative filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-extensions_002c-filename">extensions, filename</a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-externally_002dbuilt-filename-database">externally-built filename database</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filename-database">Filename database</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-extra-colons">extra colons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-F">F</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-failed-mktex_2026-script-invocation">failed <code>mktex&hellip;</code> script invocation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fallback-font">fallback font</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fallback-resolutions">fallback resolutions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FAQ_002c-Kpathsea">FAQ, Kpathsea</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Common-problems">Common problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Farwell_002c-Matthew">Farwell, Matthew</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-formats_002c-supported">file formats, supported</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-lookup">file lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-permissions">file permissions</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-file-types_002c-registering-new">file types, registering new</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filename-aliases">filename aliases</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filename-aliases">Filename aliases</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filename-database">filename database</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Filename-database">Filename database</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filenames_002c-absolute-or-explicitly-relative">filenames, absolute or explicitly relative</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-files_002c-unable-to-find">files, unable to find</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filesystem-search">filesystem search</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-filesystem_002c-case_002d_0028in_0029sensitive">filesystem, case-(in)sensitive</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Findutils_002c-GNU-package">Findutils, GNU package</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-examples">Casefolding examples</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-floating-directories">floating directories</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fmtutil"><code>fmtutil</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fmtutil_002ecnf"><code>fmtutil.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fmtutils_002ecnf"><code>fmtutils.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-alias-files">font alias files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-generation-failures">font generation failures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-of-last-resort">font of last resort</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-font-set_002c-infinite">font set, infinite</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FONTCIDMAPS"><code>FONTCIDMAPS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FONTFEATURES"><code>FONTFEATURES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontmap-files">fontmap files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontmaps-1"><code>fontmaps</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontmaps">fontmaps</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontname">fontname</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fontnames_002c-arbitrary-length">fontnames, arbitrary length</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FOOINPUTS"><code>FOOINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-FOOINPUTS-1"><code>FOOINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fopen_002c-redefined"><code>fopen<span class="roman">, redefined</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-format-of-external-database">format of external database</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Database-format">Database format</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ftp_002ecs_002estanford_002eedu"><code>ftp.cs.stanford.edu</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ftp_002etug_002eorg"><code>ftp.tug.org</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-fundamental-purpose-of-Kpathsea">fundamental purpose of Kpathsea</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-G">G</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gdb_002c-recommended"><code>gdb<span class="roman">, recommended</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-gf"><code>gf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GFFONTS"><code>GFFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-globally-writable-directories">globally writable directories</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-glyph-lookup">glyph lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-lookup">Glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-glyph-lookup-bitmap-tolerance">glyph lookup bitmap tolerance</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-glyph-lookup">Basic glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GLYPHFONTS"><code>GLYPHFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GLYPHFONTS-1"><code>GLYPHFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-glyphlist_002etxt"><code>glyphlist.txt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GNU-C-compiler-bugs">GNU C compiler bugs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GNU-General-Public-License">GNU General Public License</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-group_002dwritable-directories">group-writable directories</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-GSFTOPK_005fDEBUG-_0028128_0029"><code>GSFTOPK_DEBUG <span class="roman">(128)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-H">H</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hash-table-buckets_002c-printing">hash table buckets, printing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hash-table-routines">hash table routines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-hash_005fsummary_005fonly-variable-for-debugging"><code>hash_summary_only <span class="roman">variable for debugging</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-history-of-Kpathsea">history of Kpathsea</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Hoekwater_002c-Taco">Hoekwater, Taco</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-home-directories-in-paths">home directories in paths</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-HOME_002c-as-_007e-expansion"><code>HOME<span class="roman">, as ~ expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-I">I</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-identifiers_002c-characters-valid-in">identifiers, characters valid in</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-include-fontmap-directive"><code>include <span class="roman">fontmap directive</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-INDEXSTYLE"><code>INDEXSTYLE</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-input-lines_002c-reading">input lines, reading</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interactive-query">interactive query</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-interface_002c-not-frozen">interface, not frozen</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-introduction">introduction</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-K">K</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kdebug_003a">&lsquo;<samp>kdebug:</samp>&rsquo;</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kdefault_002ec"><code>kdefault.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Knuth_002c-Donald-E_002e">Knuth, Donald E.</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Knuth_002c-Donald-E_002e_002c-archive-of-programs-by">Knuth, Donald E., archive of programs by</a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Kpathsea-config-file_002c-source-for-path">Kpathsea config file, source for path</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_002eh"><code>kpathsea.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fcnf_005fget"><code>kpathsea_cnf_get</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPATHSEA_005fDEBUG"><code>KPATHSEA_DEBUG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPATHSEA_005fDEBUG-1"><code>KPATHSEA_DEBUG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005ffind_005ffile"><code>kpathsea_find_file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005ffind_005ffile-1"><code>kpathsea_find_file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005ffind_005fglyph"><code>kpathsea_find_glyph</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-lookup">Glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005ffinish"><code>kpathsea_finish</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005finit_005fprog"><code>kpathsea_init_prog</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005finit_005fprog-1"><code>kpathsea_init_prog</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fin_005fname_005fok"><code>kpathsea_in_name_ok</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fnew"><code>kpathsea_new</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fopen_005ffile"><code>kpathsea_open_file</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fout_005fname_005fok"><code>kpathsea_out_name_ok</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fset_005fprogram_005fname"><code>kpathsea_set_program_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpathsea_005fvar_005fvalue"><code>kpathsea_var_value</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPATHSEA_005fWARNING"><code>KPATHSEA_WARNING</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003edebug"><code>kpse-&gt;debug</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003edebug-1"><code>kpse-&gt;debug</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003edebug-variable"><code>kpse-&gt;debug <span class="roman">variable</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003eformat_005finfo"><code>kpse-&gt;format_info</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003einvocation_005fname"><code>kpse-&gt;invocation_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003einvocation_005fshort_005fname"><code>kpse-&gt;invocation_short_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_002d_003eprogram_005fname"><code>kpse-&gt;program_name</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpsewhich"><code>kpsewhich</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-kpsewhich">Invoking kpsewhich</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Kpsewhich_002c-and-debugging">Kpsewhich, and debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fBITMAP_005fTOLERANCE"><code>KPSE_BITMAP_TOLERANCE</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-glyph-lookup">Basic glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fEXPAND-_002816_0029"><code>KPSE_DEBUG_EXPAND <span class="roman">(16)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fFOPEN-_00284_0029"><code>KPSE_DEBUG_FOPEN <span class="roman">(4)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fHASH-_00282_0029"><code>KPSE_DEBUG_HASH <span class="roman">(2)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fPATHS-_00288_0029"><code>KPSE_DEBUG_PATHS <span class="roman">(8)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fSEARCH-_002832_0029"><code>KPSE_DEBUG_SEARCH <span class="roman">(32)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fSTAT-_00281_0029"><code>KPSE_DEBUG_STAT <span class="roman">(1)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDEBUG_005fVARS-_002864_0029"><code>KPSE_DEBUG_VARS <span class="roman">(64)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-KPSE_005fDOT-expansion"><code>KPSE_DOT <span class="roman">expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#KPSE_005fDOT-expansion">KPSE_DOT expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-kpse_005fformat_005finfo_005ftype"><code>kpse_format_info_type</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-L">L</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-last_002dresort-font">last-resort font</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lcircle10"><code>lcircle10</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leading-colons">leading colons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leaf-directories-wrongly-guessed">leaf directories wrongly guessed</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-leaf-directory-trick">leaf directory trick</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-license-for-using-the-library">license for using the library</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-LIGFONTS"><code>LIGFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lines_002c-reading-arbitrary_002dlength">lines, reading arbitrary-length</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Linux-File-System-Standard">Linux File System Standard</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-local-cache-of-fonts">local cache of fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-log-file">log file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-logging-successful-searches">logging successful searches</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lost_002bfound-directory"><code>lost+found <span class="roman">directory</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-lostchar"><code>lostchar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ls_002dR"><code>ls-R</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ls_002dR-database-file"><code>ls-R <span class="roman">database file</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ls_002dR_002c-simplest-build"><code>ls-R<span class="roman">, simplest build</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-M">M</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Mac-filesystem_002c-case_002dinsensitive">Mac filesystem, case-insensitive</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MacKenzie_002c-David">MacKenzie, David</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MacKenzie_002c-David-1">MacKenzie, David</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-magic-characters">magic characters</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mailing-lists">mailing lists</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Mailing-lists">Mailing lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MAKETEX_005fDEBUG-_0028512_0029"><code>MAKETEX_DEBUG <span class="roman">(512)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MAKETEX_005fFINE_005fDEBUG-_00281024_0029"><code>MAKETEX_FINE_DEBUG <span class="roman">(1024)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-memory-allocation-routines">memory allocation routines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-metafont-driver-files">metafont driver files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-failures">Metafont failures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-installation">Metafont installation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-making-too_002dlarge-fonts">Metafont making too-large fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Metafont-using-the-wrong-device">Metafont using the wrong device</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MFBASES"><code>MFBASES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MFINPUTS"><code>MFINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MFPOOL"><code>MFPOOL</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MFTINPUTS"><code>MFTINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MISCFONTS"><code>MISCFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mismatched-checksum-warnings">mismatched checksum warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-missfont_002elog"><code>missfont.log</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MISSFONT_005fLOG"><code>MISSFONT_LOG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-missing-character-warnings">missing character warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mkocp"><code>mkocp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mkofm"><code>mkofm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex-script-configuration"><samp>mktex</samp> script configuration</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex-script-names"><samp>mktex</samp> script names</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex-scripts"><samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex_002ecnf"><code>mktex.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex_002ecnf-1"><code>mktex.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex_002eopt"><code>mktex.opt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktex_002eopt-1"><code>mktex.opt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexdir"><code>mktexdir</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexfmt"><code>mktexfmt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexmf"><code>mktexmf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexpk"><code>mktexpk</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktexpk-can_0027t-guess-mode"><code>mktexpk</code> can&rsquo;t guess mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktextex"><code>mktextex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mktextfm"><code>mktextfm</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MLBIBINPUTS"><code>MLBIBINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MLBSTINPUTS"><code>MLBSTINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-mode-directory_002c-omitting">mode directory, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Morgan_002c-Tim">Morgan, Tim</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MPINPUTS"><code>MPINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MPMEMS"><code>MPMEMS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MPPOOL"><code>MPPOOL</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MPSUPPORT"><code>MPSUPPORT</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-MT_005fFEATURES"><code>MT_FEATURES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-multiple-TeX-hierarchies">multiple TeX hierarchies</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Brace-expansion">Brace expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-must-exist">must exist</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-N">N</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-names-for-mktex-scripts">names for <samp>mktex</samp> scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Neumann_002c-Gustaf">Neumann, Gustaf</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-NFS-and-ls_002dR">NFS and <samp>ls-R</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nomfdrivers"><code>nomfdrivers</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-nomode"><code>nomode</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-none"><code>none</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-null-pointers_002c-dereferencing">null pointers, dereferencing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-numeric-debugging-values">numeric debugging values</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-O">O</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-obtaining-TeX">obtaining TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OCPINPUTS"><code>OCPINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OFMFONTS"><code>OFMFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-online-Metafont-display_002c-spurious">online Metafont display, spurious</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OPENTYPEFONTS"><code>OPENTYPEFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-optimization-caveat">optimization caveat</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-options-for-debugging">options for debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OTPINPUTS"><code>OTPINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-overview-of-path-searching">overview of path searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-overview-of-programming-with-Kpathsea">overview of programming with Kpathsea</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OVFFONTS"><code>OVFFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-OVPFONTS"><code>OVPFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-P">P</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-expansion">path expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-expansion">Path expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-searching">path searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching">Path searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-searching-options">path searching options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-searching_002c-overview">path searching, overview</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-searching_002c-standalone">path searching, standalone</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-kpsewhich">Invoking kpsewhich</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-path-sources">path sources</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pathsearch_002eh"><code>pathsearch.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pc-Pascal-compiler"><code>pc <span class="roman">Pascal compiler</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdfglyphlist_002etxt"><code>pdfglyphlist.txt</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftex_002ecfg"><code>pdftex.cfg</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PDFTEXCONFIG"><code>PDFTEXCONFIG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pdftexconfig_002etex"><code>pdftexconfig.tex</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-permission-denied">permission denied</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-permissions_002c-directory">permissions, directory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-permissions_002c-file">permissions, file</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PKFONTS"><code>PKFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-plain_002ebase"><code>plain.base</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-privacy_002c-semblance-of">privacy, semblance of</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-problems_002c-common">problems, common</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Common-problems">Common problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-proginit_002eh"><code>proginit.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-program_002dvarying-paths">program-varying paths</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-programming-overview">programming overview</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-programming-with-config-files">programming with config files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-programming-with-Kpathsea">programming with Kpathsea</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-programs-using-the-library">programs using the library</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-proof-mode">proof mode</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-PSHEADERS"><code>PSHEADERS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-pxp-Pascal-preprocessor"><code>pxp <span class="roman">Pascal preprocessor</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Q">Q</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-quoting-variable-values">quoting variable values</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-R">R</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-rationale-for-casefolding-fallback">rationale for casefolding fallback</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-re_002dentrant-API">re-entrant API</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-readable"><code>readable</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reading-arbitrary_002dlength-lines">reading arbitrary-length lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-recording-successful-searches">recording successful searches</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-relative-filenames">relative filenames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-reporting-bugs">reporting bugs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reporting-bugs">Reporting bugs</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resident_002ec"><code>resident.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resolution_002c-setting">resolution, setting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-searching-options">Path searching options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-resolutions_002c-last_002dresort">resolutions, last-resort</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-retrieving-TeX">retrieving TeX</a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-right_002dhand-side-of-variable-assignments">right-hand side of variable assignments</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-RISINPUTS"><code>RISINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Rokicki_002c-Tom">Rokicki, Tom</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-root-user"><tt>root</tt> user</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-runtime-configuration-files">runtime configuration files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-runtime-debugging">runtime debugging</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-S">S</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Sauter-fonts_002c-and-dynamic-source-creation">Sauter fonts, and dynamic source creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-scripts-for-file-creation">scripts for file creation</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-scripts">mktex scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-search-path_002c-defined">search path, defined</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-search_002c-case_002dinsensitive">search, case-insensitive</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-search">Casefolding search</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-for-files">searching for files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-for-glyphs">searching for glyphs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-lookup">Glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-overview">searching overview</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-the-database">searching the database</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-searching-the-disk">searching the disk</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-security-considerations">security considerations</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SELFAUTODIR">SELFAUTODIR</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SELFAUTOLOC">SELFAUTOLOC</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SELFAUTOPARENT">SELFAUTOPARENT</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sending-patches">sending patches</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-setgid-scripts">setgid scripts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-SFDFONTS"><code>SFDFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell-scripts-as-configuration-files">shell scripts as configuration files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell-variables">shell variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-shell_005fescape_002c-example-for-code"><code>shell_escape<span class="roman">, example for code</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-site-overrides-for-mktex_2026">site overrides for <code>mktex&hellip;</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-skeleton-TeX-directory">skeleton TeX directory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-directory-structure">TeX directory structure</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-slow-startup-time">slow startup time</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slow-path-searching">Slow path searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-source-files"><code>source files</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-sources-for-search-paths">sources for search paths</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-special"><code>special</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-stack-trace">stack trace</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standalone-path-searching">standalone path searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Invoking-kpsewhich">Invoking kpsewhich</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-error-and-debugging-output">standard error and debugging output</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Debugging">Debugging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-standard-options">standard options</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Standard-options">Standard options</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-startup-time_002c-excessive">startup time, excessive</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Slow-path-searching">Slow path searching</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-string-routines">string routines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-strip"><code>strip</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-stripsupplier"><code>stripsupplier</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-striptypeface"><code>striptypeface</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-st_005fnlink"><code>st_nlink</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-ST_005fNLINK_005fTRICK"><code>ST_NLINK_TRICK</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-subdirectory-searching">subdirectory searching</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-suffixes_002c-filename">suffixes, filename</a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-suggestions_002c-making">suggestions, making</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Sun-2">Sun 2</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-supplier-directory_002c-omitting">supplier directory, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-supplier-directory_002c-omitting-1">supplier directory, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-supported-file-formats">supported file formats</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-suppressing-warnings">suppressing warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-symbolic-links-not-found">symbolic links not found</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-symbolic-links_002c-and-ls_002dR">symbolic links, and <samp>ls-R</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-symlinks_002c-resolving">symlinks, resolving</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Calling-sequence">Calling sequence</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-system-C-compiler-bugs">system C compiler bugs</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-system_002ddependent-casefolding-behavior">system-dependent casefolding behavior</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-T">T</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-T1FONTS"><code>T1FONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-T1INPUTS"><code>T1INPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-T42FONTS"><code>T42FONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tcfmgr_002emap"><code>tcfmgr.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TDS">TDS</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-directory-structure">TeX directory structure</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-directory-structure">TeX directory structure</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-directory-structure">TeX directory structure</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-environment-variables">TeX environment variables</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-failures">TeX failures</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-or-Metafont-failing">TeX or Metafont failing</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-file-lookup">TeX file lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-glyph-lookup">TeX glyph lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-lookup">Glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-support">TeX support</a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-support">TeX support</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TeX-Users-Group">TeX Users Group</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Introduction">Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dfile_002ec"><code>tex-file.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dfile_002eh"><code>tex-file.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dglyph_002ec"><code>tex-glyph.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Glyph-lookup">Glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dglyph_002eh"><code>tex-glyph.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-overview">Programming overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dk_0040tug_002eorg"><code>tex-k@tug.org</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Mailing-lists">Mailing lists</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002dk_0040tug_002eorg-_0028bug-address_0029"><code>tex-k@tug.org <span class="roman">(bug address)</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Reporting-bugs">Reporting bugs</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tex_002eweb"><code>tex.web</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXBIB"><code>TEXBIB</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXBIB-1"><code>TEXBIB</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXCONFIG"><code>TEXCONFIG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXDOCS"><code>TEXDOCS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTMAPS"><code>TEXFONTMAPS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS"><code>TEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS-1"><code>TEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS-2"><code>TEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFONTS-3"><code>TEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texfonts_002emap"><code>texfonts.map</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXFORMATS"><code>TEXFORMATS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXINDEXSTYLE"><code>TEXINDEXSTYLE</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXINPUTS"><code>TEXINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXINPUTS-1"><code>TEXINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMF"><code>TEXMF</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#TeX-directory-structure">TeX directory structure</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_002ecnf"><code>texmf.cnf</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_002ecnf-missing_002c-warning-about"><samp>texmf.cnf</samp> missing, warning about</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_002ecnf_002c-and-variable-expansion"><code>texmf.cnf<span class="roman">, and variable expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_002ecnf_002c-definition-for"><code>texmf.cnf<span class="roman">, definition for</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_002ecnf_002c-source-for-path"><code>texmf.cnf<span class="roman">, source for path</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Path-sources">Path sources</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFCNF"><code>TEXMFCNF</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFCNF-1"><code>TEXMFCNF</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFDBS"><code>TEXMFDBS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFDBS-1"><code>TEXMFDBS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFINI"><code>TEXMFINI</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFINI-1"><code>TEXMFINI</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFINI-2"><code>TEXMFINI</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFLOG"><code>TEXMFLOG</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFOUTPUT"><code>TEXMFOUTPUT</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFSCRIPTS"><code>TEXMFSCRIPTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmfvar"><code>texmfvar</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXMFVAR"><code>TEXMFVAR</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-texmf_005fcasefold_005fsearch"><code>texmf_casefold_search</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-search">Casefolding search</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPICTS"><code>TEXPICTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPKS"><code>TEXPKS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPOOL"><code>TEXPOOL</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPSHEADERS"><code>TEXPSHEADERS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXPSHEADERS-1"><code>TEXPSHEADERS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXSIZES"><code>TEXSIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEXSOURCES"><code>TEXSOURCES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEX_005fHUSH"><code>TEX_HUSH</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TEX_005fHUSH-1"><code>TEX_HUSH</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TFMFONTS"><code>TFMFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tilde-expansion">tilde expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tilde_002ec"><code>tilde.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-time-system-call"><code>time <span class="roman">system call</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tolerance-for-glyph-lookup">tolerance for glyph lookup</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Basic-glyph-lookup">Basic glyph lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trailing-_002f-in-home-directory">trailing &lsquo;<samp>/</samp>&rsquo; in home directory</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trailing-colons">trailing colons</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Default-expansion">Default expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TRFONTS"><code>TRFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trick-for-detecting-leaf-directories">trick for detecting leaf directories</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Subdirectory-expansion">Subdirectory expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-trojan-horse-attack">trojan horse attack</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Security">Security</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-try_005fstd_005fextension_005ffirst"><code>try_std_extension_first</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#File-lookup">File lookup</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-TTFONTS"><code>TTFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-tug_002eorg"><code>tug.org</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-typeface-directory_002c-omitting">typeface directory, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-typeface-directory_002c-omitting-1">typeface directory, omitting</a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-U">U</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unable-to-find-files">unable to find files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-find-files">Unable to find files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unable-to-generate-fonts">unable to generate fonts</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Unable-to-generate-fonts">Unable to generate fonts</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-uname"><code>uname</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unixtex_002eftp"><code>unixtex.ftp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unknown-special-warnings">unknown special warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unreadable-file-warnings">unreadable file warnings</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unreadable-files">unreadable files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-unusable-ls_002dR-warning">unusable <samp>ls-R</samp> warning</a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-usage-patterns_002c-finding">usage patterns, finding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Logging">Logging</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-USERPROFILE_002c-as-_007e-expansion"><code>USERPROFILE<span class="roman">, as ~ expansion</span></code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Tilde-expansion">Tilde expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-USE_005fTEXMFVAR"><code>USE_TEXMFVAR</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-USE_005fVARTEXFONTS"><code>USE_VARTEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-V">V</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-varfonts"><code>varfonts</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-variable-expansion">variable expansion</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-variable_002ec"><code>variable.c</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Variable-expansion">Variable expansion</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-variable_002eh"><code>variable.h</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Programming-with-config-files">Programming with config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VARTEXFONTS"><code>VARTEXFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-configuration">mktex configuration</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VAX-11_002f750">VAX 11/750</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-version-numbers_002c-determining">version numbers, determining</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Bug-checklist">Bug checklist</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VF-files_002c-not-found">VF files, not found</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-VFFONTS"><code>VFFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Vojta_002c-Paul">Vojta, Paul</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-W">W</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Walsh_002c-Norman">Walsh, Norman</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warning-about-unusable-ls_002dR">warning about unusable <samp>ls-R</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#ls_002dR">ls-R</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warning_002c-about-missing-texmf_002ecnf">warning, about missing <samp>texmf.cnf</samp></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warnings_002c-file-access">warnings, file access</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Searching-overview">Searching overview</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-warnings_002c-suppressing">warnings, suppressing</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Suppressing-warnings">Suppressing warnings</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-WEB2C"><code>WEB2C</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Weber_002c-Olaf">Weber, Olaf</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-WEBINPUTS"><code>WEBINPUTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whitespace_002c-in-fontmap-files">whitespace, in fontmap files</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fontmap">Fontmap</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-whitespace_002c-not-ignored-on-continuation-lines">whitespace, not ignored on continuation lines</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Config-files">Config files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-Windows-and-casefolding">Windows and casefolding</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Casefolding-rationale">Casefolding rationale</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-www_002etug_002eorg"><code>www.tug.org</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#unixtex_002eftp">unixtex.ftp</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-X">X</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XDvi"><code>XDvi</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Specially_002drecognized-files">Specially-recognized files</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XDVIFONTS"><code>XDVIFONTS</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Supported-file-formats">Supported file formats</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XDVIMAKEPK"><code>XDVIMAKEPK</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#mktex-script-names">mktex script names</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-XDVISIZES"><code>XDVISIZES</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="#Fallback-font">Fallback font</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+<tr><th id="Index_cp_letter-Z">Z</th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="#index-zuhn_002c-david">zuhn, david</a>:</td><td>&nbsp;</td><td valign="top"><a href="#History">History</a></td></tr>
+<tr><td colspan="4"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a class="summary-letter" href="#Index_cp_symbol-1"><b>!</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-2"><b>$</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-3"><b>-</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-4"><b>.</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-5"><b>/</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-6"><b>2</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-7"><b>8</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-8"><b>:</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-9"><b>\</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-10"><b>{</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_symbol-11"><b>~</b></a>
+ &nbsp;
+<br>
+<a class="summary-letter" href="#Index_cp_letter-A"><b>A</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-B"><b>B</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-C"><b>C</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-D"><b>D</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-E"><b>E</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-F"><b>F</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-G"><b>G</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-H"><b>H</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-I"><b>I</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-K"><b>K</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-L"><b>L</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-M"><b>M</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-N"><b>N</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-O"><b>O</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-P"><b>P</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Q"><b>Q</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-R"><b>R</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-S"><b>S</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-T"><b>T</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-U"><b>U</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-V"><b>V</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-W"><b>W</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-X"><b>X</b></a>
+ &nbsp;
+<a class="summary-letter" href="#Index_cp_letter-Z"><b>Z</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr>
+
+
+
+</body>
+</html>
diff --git a/systems/doc/kpathsea/kpathsea.pdf b/systems/doc/kpathsea/kpathsea.pdf
new file mode 100644
index 0000000000..cd2acf69f1
--- /dev/null
+++ b/systems/doc/kpathsea/kpathsea.pdf
Binary files differ
diff --git a/systems/doc/luatex/luatex-backend.tex b/systems/doc/luatex/luatex-backend.tex
new file mode 100644
index 0000000000..21cdd728c1
--- /dev/null
+++ b/systems/doc/luatex/luatex-backend.tex
@@ -0,0 +1,1084 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-backend
+
+\startchapter[reference=backend,title={The backend libraries}]
+
+\startsection[title={The \type {pdf} library}][library=pdf]
+
+\topicindex{backend}
+\topicindex{\PDF}
+
+This library contains variables and functions that are related to the \PDF\
+backend. You can find more details about the expected values to setters in \in
+{section} [backendprimitives].
+
+\startsubsection[title={\type {mapfile}, \type {mapline}}]
+
+\topicindex{map files}
+\topicindex{files+map}
+
+\startfunctioncall
+pdf.mapfile(<string> map file)
+pdf.mapline(<string> map line)
+\stopfunctioncall
+
+These two functions can be used to replace primitives \orm {pdfmapfile} and
+\orm {pdfmapline} inherited from \PDFTEX. They expect a string as only
+parameter and have no return value. The first character in a map line can be
+\type {-}, \type {+} or \type {=} which means as much as remove, add or replace
+this line. They are not state setters but act immediately.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][catalog|info|names|trailer]}}]
+
+\topicindex{\PDF+trailer}
+\topicindex{\PDF+catalog}
+\topicindex{\PDF+info}
+
+\libindex{setcatalog} \libindex{getcatalog}
+\libindex{setinfo} \libindex{getinfo}
+\libindex{setnames} \libindex{getnames}
+\libindex{settrailer} \libindex{gettrailer}
+
+These functions complement the corresponding \PDF\ backend token lists dealing
+with metadata. The value types are strings and they are written to the \PDF\
+file directly after the token registers set at the \TEX\ end are written.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][pageattributes|pageresources|pagesattributes]}}]
+
+\libindex{setpageattributes} \libindex{getpageattributes}
+\libindex{setpageresources} \libindex{getpageresources}
+\libindex{setpagesattributes} \libindex{getpagesattributes}
+
+\topicindex{\PDF+page attributes}
+\topicindex{\PDF+page resources}
+
+These functions complement the corresponding \PDF\ backend token lists dealing
+with page resources. The variables have no interaction with the corresponding \PDF\
+backend token register. They are written to the \PDF\ file directly after the
+token registers set at the \TEX\ end are written.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][xformattributes|xformresources]}}]
+
+\libindex{setxformattributes} \libindex{getxformattributes}
+\libindex{setxformresources} \libindex{getxformresources}
+
+\topicindex{\PDF+xform attributes}
+\topicindex{\PDF+xform resources}
+
+These functions complement the corresponding \PDF\ backend token lists dealing
+with reuseable boxes and images. The variables have no interaction with the
+corresponding \PDF\ backend token register. They are written to the \PDF\
+file directly after the token registers set at the \TEX\ end are written.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][major|minor]version}}]
+
+\topicindex{\PDF+version}
+
+\libindex{getmajorversion} \libindex{setmajorversion}
+\libindex{getminorversion} \libindex{setminorversion}
+
+You can set both the major and minor version of the output. The major version is
+normally~1 but when set to~2 some data will not be written to the file in order
+to comply with the standard. What minor version you set depends on what \PDF\
+features you use. This is out of control of \LUATEX.
+
+\stopsubsection
+
+\startsubsection[title={\type {getcreationdate}}]
+
+\topicindex{\PDF+date}
+
+\libindex{getcreationdate}
+
+This function returns a string with the date in the format that ends up in the
+\PDF\ file, in this case it's: {\tttf \cldcontext{pdf.getcreationdate()}}.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]inclusionerrorlevel} and \type {[set|get]ignoreunknownimages}}]
+
+\topicindex{\PDF+options}
+
+\libindex{getinclusionerrorlevel} \libindex{setinclusionerrorlevel}
+\libindex{getignoreunknownimages} \libindex{setignoreunknownimages}
+
+These variable control how error in included image are treated. They are modeled
+after the \PDFTEX\ equivalents.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]suppressoptionalinfo}, \type {[set|get]trailerid}
+and \type {[set|get]omitcidset}}]
+
+\topicindex{\PDF+options}
+\topicindex{\PDF+trailer}
+
+\libindex{getsuppressoptionalinfo} \libindex{setsuppressoptionalinfo}
+\libindex{gettrailerid} \libindex{settrailerid}
+\libindex{getomitcidset} \libindex{setomitcidset}
+\libindex{getomitcharset} \libindex{setomitcharset}
+
+The optional info bitset (a number) determines what kind of info gets flushed.
+By default we flush all. See \in {section} [sec:pdfextensions] for more details.
+
+You can set your own trailer id. This has to be string containing valid \PDF\
+array content with checksums.
+
+The cidset and charset flags (numbers) disables inclusion of a so called \type
+{CIDSet} and \type {CharSet} entries, which can be handy when aiming at some of
+the many \PDF\ substandards.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][obj|]compresslevel} and \type {[set|get]recompress}}]
+
+\topicindex{\PDF+compression}
+
+\libindex{getcompresslevel} \libindex{setcompresslevel}
+\libindex{getobjcompresslevel} \libindex{setobjcompresslevel}
+\libindex{getrecompress} \libindex{setrecompress}
+
+These functions set the level stream compression. When object compression is
+enabled multiple objects will be packed in a compressed stream which saves space.
+The minimum values are~0, the maxima are~9.
+
+When recompression is to~1 compressed objects will be decompressed and when
+compresslevel is larger than zero they will then be recompressed. This is mostly
+a debugging feature and should not be relied upon.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]gentounicode}}]
+
+\topicindex{\PDF+unicode}
+
+\libindex{getgentounicode} \libindex{setgentounicode}
+
+This flag enables tounicode generation (like in \PDFTEX). Normally the values are
+provided by the font loader.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]decimaldigits}}]
+
+\topicindex{\PDF+precision}
+
+\libindex{getdecimaldigits} \libindex{setdecimaldigits}
+
+These two functions set the accuracy of floats written to the \PDF file. You can
+set any value but the backend will not go below~3 and above~6.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]pkresolution}}]
+
+\topicindex{\PDF+resolution}
+
+\libindex{getpkresolution} \libindex{setpkresolution}
+
+These setter takes two arguments: the resolution and an optional zero or one that
+indicates if this is a fixed one. The getter returns these two values.
+
+\stopsubsection
+
+\startsubsection[title={\type {getlast[obj|link|annot]} and \type {getretval}}]
+
+\topicindex{\PDF+objects}
+\topicindex{\PDF+annotations}
+
+\libindex{getlastobj} \libindex{setlastobj}
+\libindex{getlastlink} \libindex{setlastlink}
+\libindex{getlastannot} \libindex{setlastannot}
+\libindex{getretval}
+
+These status variables are similar to the ones traditionally used in the backend
+interface at the \TEX\ end.
+
+\stopsubsection
+
+\startsubsection[title={\type {getmaxobjnum} and \type {getobjtype}, \type {getfontname},
+\type {getfontobjnum}, \type {getfontsize}, \type {getxformname}}]
+
+\libindex{getmaxobjnum}
+\libindex{getobjtype}
+\libindex{getfontname}
+\libindex{getfontobjnum}
+\libindex{getfontsize}
+\libindex{getxformname}
+
+These introspective helpers are mostly used when you construct \PDF\ objects
+yourself and need for instance information about a (to be) embedded font.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]origin}}]
+
+\topicindex{\PDF+positioning}
+
+\libindex{setorigin} \libindex{getorigin}
+
+This one is used to set the horizonal and|/|or vertical offset, a traditional
+backend property.
+
+\starttyping
+pdf.setorigin() -- sets both to 0pt
+pdf.setorigin(tex.sp("1in")) -- sets both to 1in
+pdf.setorigin(tex.sp("1in"),tex.sp("1in"))
+\stoptyping
+
+The counterpart of this function returns two values.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]imageresolution}}]
+
+\topicindex{\PDF+resolution}
+
+\libindex{setimageresolution} \libindex{getimageresolution}
+
+These two functions relate to the imageresolution that is used when the image
+itself doesn't provide a non|-|zero x or y resolution.
+
+\stopsubsection
+
+\startsubsection[title={\type {[set|get][link|dest|thread|xform]margin}}]
+
+\topicindex{\PDF+margins}
+
+\libindex{getlinkmargin} \libindex{setlinkmargin}
+\libindex{getdestmargin} \libindex{setdestmargin}
+\libindex{getthreadmargin} \libindex{setthreadmargin}
+\libindex{getxformmargin} \libindex{setxformmargin}
+\libindex{getmarginmargin} \libindex{setmarginmargin}
+
+These functions can be used to set and retrieve the margins that are added to the
+natural bounding boxes of the respective objects.
+
+\stopsubsection
+
+\startsubsection[title={\type {get[pos|hpos|vpos]}}]
+
+\topicindex{\PDF+positions}
+
+\libindex{getpos}
+\libindex{gethpos}
+\libindex{getvpos}
+
+These functions get current location on the output page, measured from its lower
+left corner. The values return scaled points as units.
+
+\starttyping
+local h, v = pdf.getpos()
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {[has|get]matrix}}]
+
+\topicindex{\PDF+matrix}
+
+\libindex{getmatrix} \libindex{hasmatrix}
+
+The current matrix transformation is available via the \type {getmatrix} command,
+which returns 6 values: \type {sx}, \type {rx}, \type {ry}, \type {sy}, \type
+{tx}, and \type {ty}. The \type {hasmatrix} function returns \type {true} when a
+matrix is applied.
+
+\starttyping
+if pdf.hasmatrix() then
+ local sx, rx, ry, sy, tx, ty = pdf.getmatrix()
+ -- do something useful or not
+end
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {print}}]
+
+\topicindex{\PDF+print to}
+
+\libindex{print}
+
+You can print a string to the \PDF\ document from within a \lpr {latelua} call.
+This function is not to be used inside \prm {directlua} unless you know {\it
+exactly} what you are doing.
+
+\startfunctioncall
+pdf.print(<string> s)
+pdf.print(<string> type, <string> s)
+\stopfunctioncall
+
+The optional parameter can be used to mimic the behavior of \PDF\ literals: the
+\type {type} is \type {direct} or \type {page}.
+
+\stopsubsection
+
+\startsubsection[title={\type {immediateobj}}]
+
+\topicindex{\PDF+objects}
+
+\libindex{immediateobj}
+
+This function creates a \PDF\ object and immediately writes it to the \PDF\ file.
+It is modelled after \PDFTEX's \prm {immediate} \orm {pdfobj} primitives. All
+function variants return the object number of the newly generated object.
+
+\startfunctioncall
+<number> n =
+ pdf.immediateobj(<string> objtext)
+<number> n =
+ pdf.immediateobj("file", <string> filename)
+<number> n =
+ pdf.immediateobj("stream", <string> streamtext, <string> attrtext)
+<number> n =
+ pdf.immediateobj("streamfile", <string> filename, <string> attrtext)
+\stopfunctioncall
+
+The first version puts the \type {objtext} raw into an object. Only the object
+wrapper is automatically generated, but any internal structure (like \type {<<
+>>} dictionary markers) needs to be provided by the user. The second version with
+keyword \type {file} as first argument puts the contents of the file with name
+\type {filename} raw into the object. The third version with keyword \type
+{stream} creates a stream object and puts the \type {streamtext} raw into the
+stream. The stream length is automatically calculated. The optional \type
+{attrtext} goes into the dictionary of that object. The fourth version with
+keyword \type {streamfile} does the same as the third one, it just reads the
+stream data raw from a file.
+
+An optional first argument can be given to make the function use a previously
+reserved \PDF\ object.
+
+\startfunctioncall
+<number> n =
+ pdf.immediateobj(<integer> n, <string> objtext)
+<number> n =
+ pdf.immediateobj(<integer> n, "file", <string> filename)
+<number> n =
+ pdf.immediateobj(<integer> n, "stream", <string> streamtext, <string> attrtext)
+<number> n =
+ pdf.immediateobj(<integer> n, "streamfile", <string> filename, <string> attrtext)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type{obj}}]
+
+\topicindex{\PDF+objects}
+
+\libindex{obj}
+
+This function creates a \PDF\ object, which is written to the \PDF\ file only
+when referenced, e.g., by \type {refobj()}.
+
+All function variants return the object number of the newly generated object, and
+there are two separate calling modes. The first mode is modelled after \PDFTEX's
+\orm {pdfobj} primitive.
+
+\startfunctioncall
+<number> n =
+ pdf.obj(<string> objtext)
+<number> n =
+ pdf.obj("file", <string> filename)
+<number> n =
+ pdf.obj("stream", <string> streamtext, <string> attrtext)
+<number> n =
+ pdf.obj("streamfile", <string> filename, <string> attrtext)
+\stopfunctioncall
+
+An optional first argument can be given to make the function use a previously
+reserved \PDF\ object.
+
+\startfunctioncall
+<number> n =
+ pdf.obj(<integer> n, <string> objtext)
+<number> n =
+ pdf.obj(<integer> n, "file", <string> filename)
+<number> n =
+ pdf.obj(<integer> n, "stream", <string> streamtext, <string> attrtext)
+<number> n =
+ pdf.obj(<integer> n, "streamfile", <string> filename, <string> attrtext)
+\stopfunctioncall
+
+The second mode accepts a single argument table with key--value pairs.
+
+\startfunctioncall
+<number> n = pdf.obj {
+ type = <string>,
+ immediate = <boolean>,
+ objnum = <number>,
+ attr = <string>,
+ compresslevel = <number>,
+ objcompression = <boolean>,
+ file = <string>,
+ string = <string>,
+ nolength = <boolean>,
+}
+\stopfunctioncall
+
+The \type {type} field can have the values \type {raw} and \type {stream}, this
+field is required, the others are optional (within constraints). When \type
+{nolength} is set, there will be no \type {/Length} entry added to the
+dictionary.
+
+Note: this mode makes \type{obj} look more flexible than it actually is: the
+constraints from the separate parameter version still apply, so for example you
+can't have both \type {string} and \type {file} at the same time.
+
+\stopsubsection
+
+\startsubsection[title={\type {refobj}}]
+
+\topicindex{\PDF+objects}
+
+\libindex{refobj}
+
+This function, the \LUA\ version of the \orm {pdfrefobj} primitive, references an
+object by its object number, so that the object will be written to the \PDF\ file.
+
+\startfunctioncall
+pdf.refobj(<integer> n)
+\stopfunctioncall
+
+This function works in both the \prm {directlua} and \lpr {latelua} environment.
+Inside \prm {directlua} a new whatsit node \quote {pdf_refobj} is created, which
+will be marked for flushing during page output and the object is then written
+directly after the page, when also the resources objects are written to the \PDF\
+file. Inside \lpr {latelua} the object will be marked for flushing.
+
+This function has no return values.
+
+\stopsubsection
+
+\startsubsection[title={\type {reserveobj}}]
+
+\topicindex{\PDF+objects}
+
+\libindex{reserveobj}
+
+This function creates an empty \PDF\ object and returns its number.
+
+\startfunctioncall
+<number> n = pdf.reserveobj()
+<number> n = pdf.reserveobj("annot")
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {getpageref}}]
+
+\topicindex{\PDF+pages}
+
+\libindex{getpageref}
+
+The object number of a page can be fetched with this function. This can be a
+forward reference so when you ask for a future page, you do get a number back.
+
+\startfunctioncall
+<number> n = pdf.getpageref(123)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {registerannot}}]
+
+\topicindex{\PDF+annotations}
+
+\libindex{registerannot}
+
+This function adds an object number to the \type {/Annots} array for the current
+page without doing anything else. This function can only be used from within
+\lpr {latelua}.
+
+\startfunctioncall
+pdf.registerannot (<number> objnum)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {newcolorstack}}]
+
+\topicindex{\PDF+color stack}
+
+\libindex{newcolorstack}
+
+This function allocates a new color stack and returns it's id. The arguments
+are the same as for the similar backend extension primitive.
+
+\startfunctioncall
+pdf.newcolorstack("0 g","page",true) -- page|direct|origin
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {setfontattributes}}]
+
+\topicindex{\PDF+fonts}
+
+\libindex{setfontattributes}
+
+This function will force some additional code into the font resource. It can for
+instance be used to add a custom \type {ToUnicode} vector to a bitmap file.
+
+\startfunctioncall
+pdf.setfontattributes(<number> font id, <string> pdf code)
+\stopfunctioncall
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {pdfe} library}][library=pdfe]
+
+\startsubsection[title={Introduction}]
+
+\topicindex{\PDF+objects}
+
+\topicindex{\PDF+analyze}
+\topicindex{\PDF+\type{pdfe}}
+
+The \type {pdfe} library replaces the \type {epdf} library and provides an
+interface to \PDF\ files. It uses the same code as is used for \PDF\ image
+inclusion. The \type {pplib} library by Paweł Jackowski replaces the \type
+{poppler} (derived from \type {xpdf}) library.
+
+A \PDF\ file is basically a tree of objects and one descends into the tree via
+dictionaries (key/value) and arrays (index/value). There are a few topmost
+dictionaries that start at root that are accessed more directly.
+
+Although everything in \PDF\ is basically an object we only wrap a few in so
+called userdata \LUA\ objects.
+
+\starttabulate
+\BC \PDF \BC \LUA \NC \NR
+\NC null \NC nil \NC \NR
+\NC boolean \NC boolean \NC \NR
+\NC integer \NC integer \NC \NR
+\NC float \NC number \NC \NR
+\NC name \NC string \NC \NR
+\NC string \NC string \NC \NR
+\NC array \NC array userdatum \NC \NR
+\NC dictionary \NC dictionary userdatum \NC \NR
+\NC stream \NC stream userdatum (with related dictionary) \NC \NR
+\NC reference \NC reference userdatum \NC \NR
+\stoptabulate
+
+The regular getters return these \LUA\ data types but one can also get more
+detailed information.
+
+\stopsubsection
+
+\startsubsection[title={\type {open}, \type {new}, \type {getstatus}, \type {close}, \type {unencrypt}}]
+
+\libindex {open}
+\libindex {new}
+\libindex {new}
+\libindex {getstatus}
+\libindex {close}
+\libindex {unencrypt}
+
+A document is loaded from a file or string
+
+\starttyping
+<pdfe document> = pdfe.open(filename)
+<pdfe document> = pdfe.new(somestring,somelength)
+\stoptyping
+
+Such a document is closed with:
+
+\starttyping
+pdfe.close(<pdfe document>)
+\stoptyping
+
+You can check if a document opened well by:
+
+\starttyping
+pdfe.getstatus(<pdfe document>)
+\stoptyping
+
+The returned codes are:
+
+\starttabulate[|c|l|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type {-2} \NC the document failed to open \NC \NR
+\NC \type {-1} \NC the document is (still) protected \NC \NR
+\NC \type {0} \NC the document is not encrypted \NC \NR
+\NC \type {2} \NC the document has been unencrypted \NC \NR
+\LL
+\stoptabulate
+
+An encrypted document can be unencrypted by the next command where instead of
+either password you can give \type {nil}:
+
+\starttyping
+pdfe.unencrypt(<pdfe document>,userpassword,ownerpassword)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getsize}, \type {getversion}, \type {getnofobjects}, \type {getnofpages}}]
+
+\libindex {getsize}
+\libindex {getversion}
+\libindex {getnofobjects}
+\libindex {getnofpages}
+
+A successfully opened document can provide some information:
+
+\starttyping
+bytes = getsize(<pdfe document>)
+major, minor = getversion(<pdfe document>)
+n = getnofobjects(<pdfe document>)
+n = getnofpages(<pdfe document>)
+bytes, waste = getnofpages(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[catalog|trailer|info]}}]
+
+\libindex {getcatalog}
+\libindex {gettrailer}
+\libindex {getinfo}
+
+For accessing the document structure you start with the so called catalog, a
+dictionary:
+
+\starttyping
+<pdfe dictionary> = pdfe.getcatalog(<pdfe document>)
+\stoptyping
+
+The other two root dictionaries are accessed with:
+
+\starttyping
+<pdfe dictionary> = pdfe.gettrailer(<pdfe document>)
+<pdfe dictionary> = pdfe.getinfo(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getpage}, \type {getbox}}]
+
+\libindex {getpage}
+\libindex {getbox}
+
+A specific page can conveniently be reached with the next command, which
+returns a dictionary. The first argument is to be a page dictionary.
+
+\starttyping
+<pdfe dictionary> = pdfe.getpage(<pdfe dictionary>,pagenumber)
+\stoptyping
+
+Another convenience command gives you the (bounding) box of a (normally page)
+which can be inheritted from the document itself. An example of a valid box name
+is \type {MediaBox}.
+
+\starttyping
+pages = pdfe.getbox(<pdfe document>,boxname)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[string|integer|number|boolean|name]}}]
+
+\libindex {getstring}
+\libindex {getinteger}
+\libindex {getnumber}
+\libindex {getboolean}
+\libindex {getname}
+
+Common values in dictionaries and arrays are strings, integers, floats, booleans
+and names (which are also strings) and these are also normal \LUA\ objects:
+
+\starttyping
+s = getstring (<pdfe array|dictionary>,index|key)
+i = getinteger(<pdfe array|dictionary>,index|key)
+n = getnumber (<pdfe array|dictionary>,index|key)
+b = getboolean(<pdfe array|dictionary>,index|key)
+n = getname (<pdfe array|dictionary>,index|key)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {get[from][dictionary|array|stream]}}]
+
+\libindex {getdictionary} \libindex {getfromdictionary}
+\libindex {getarray} \libindex {getfromarray}
+\libindex {getstream} \libindex {getfromstream}
+
+Normally you will use an index in an array and key in a dictionary but dictionaries
+also accept an index. The size of an array or dictionary is available with the
+usual \type {#} operator.
+
+\starttyping
+<pdfe dictionary> = getdictionary(<pdfe array|dictionary>,index|key)
+<pdfe array> = getarray (<pdfe array|dictionary>,index|key)
+<pdfe stream>,
+<pdfe dictionary> = getstream (<pdfe array|dictionary>,index|key)
+\stoptyping
+
+These commands return dictionaries, arrays and streams, which are dictionaries
+with a blob of data attached.
+
+Before we come to an alternative access mode, we mention that the objects provide
+access in a different way too, for instance this is valid:
+
+\starttyping
+print(pdfe.open("foo.pdf").Catalog.Type)
+\stoptyping
+
+At the topmost level there are \type {Catalog}, \type {Info}, \type {Trailer}
+and \type {Pages}, so this is also okay:
+
+\starttyping
+print(pdfe.open("foo.pdf").Pages[1])
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {[open|close|readfrom][whole|]stream}}]
+
+\libindex {openstream}
+\libindex {closestream}
+\libindex {readfromstream}
+\libindex {readfromwholestream}
+
+Streams are sort of special. When your index or key hits a stream you get back a
+stream object and dictionary object. The dictionary you can access in the usual
+way and for the stream there are the following methods:
+
+\starttyping
+okay = openstream(<pdfe stream>,[decode])
+ closestream(<pdfe stream>)
+str, n = readfromstream(<pdfe stream>)
+str, n = readwholestream(<pdfe stream>,[decode])
+\stoptyping
+
+You either read in chunks, or you ask for the whole. When reading in chunks, you
+need to open and close the stream yourself. The \type {n} value indicates the
+length read. The \type {decode} parameter controls if the stream data gets
+uncompressed.
+
+As with dictionaries, you can access fields in a stream dictionary in the usual
+\LUA\ way too. You get the content when you \quote {call} the stream. You can
+pass a boolean that indicates if the stream has to be decompressed.
+
+% pdfe.objectcodes = objectcodes
+% pdfe.stringcodes = stringcodes
+% pdfe.encryptioncodes = encryptioncodes
+
+\stopsubsection
+
+\startsubsection[title={\type {getfrom[dictionary|array]}}]
+
+\libindex {getfromdictionary}
+\libindex {getfromarray}
+
+In addition to the interface described before, there is also a bit lower level
+interface available.
+
+\starttyping
+key, type, value, detail = getfromdictionary(<pdfe dictionary>,index)
+type, value, detail = getfromarray(<pdfe array>,index)
+\stoptyping
+
+\starttabulate[|c|l|l|l|]
+\DB type \BC meaning \BC value \BC detail \NC \NR
+\NC \type {0} \NC none \NC nil \NC \NC \NR
+\NC \type {1} \NC null \NC nil \NC \NC \NR
+\NC \type {2} \NC boolean \NC boolean \NC \NC \NR
+\NC \type {3} \NC boolean \NC integer \NC \NC \NR
+\NC \type {4} \NC number \NC float \NC \NC \NR
+\NC \type {5} \NC name \NC string \NC \NC \NR
+\NC \type {6} \NC string \NC string \NC hex \NC \NR
+\NC \type {7} \NC array \NC arrayobject \NC size \NC \NR
+\NC \type {8} \NC dictionary \NC dictionaryobject \NC size \NC \NR
+\NC \type {9} \NC stream \NC streamobject \NC dictionary size \NC \NR
+\NC \type {10} \NC reference \NC integer \NC \NC \NR
+\LL
+\stoptabulate
+
+A \type {hex} string is (in the \PDF\ file) surrounded by \type {<>} while plain
+strings are bounded by \type {<>}.
+
+\stopsubsection
+
+\startsubsection[title={\type {[dictionary|array]totable}}]
+
+\libindex {dictionarytotable}
+\libindex {arraytotable}
+
+All entries in a dictionary or table can be fetched with the following commands
+where the return values are a hashed or indexed table.
+
+\starttyping
+hash = dictionarytotable(<pdfe dictionary>)
+list = arraytotable(<pdfe array>)
+\stoptyping
+
+You can get a list of pages with:
+
+\starttyping
+{ { <pdfe dictionary>, size, objnum }, ... } = pagestotable(<pdfe document>)
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\type {getfromreference}}]
+
+\libindex {getfromreference}
+
+Because you can have unresolved references, a reference object can be resolved
+with:
+
+\starttyping
+<pdfe dictionary|array|stream> = getfromreference(<pdfe reference>)
+\stoptyping
+
+So, you get back a new \type {pdfe} userdata object that you can query.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Memory streams}][library=pdfe]
+
+\topicindex{\PDF+memory streams}
+
+\libindex {new}
+
+The \type {pdfe.new} that takes three arguments:
+
+\starttabulate
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type {stream} \NC this is a (in low level \LUA\ speak) light userdata
+ object, i.e.\ a pointer to a sequence of bytes \NC \NR
+\NC \type {length} \NC this is the length of the stream in bytes (the stream can
+ have embedded zeros) \NC \NR
+\NC \type {name} \NC optional, this is a unique identifier that is used for
+ hashing the stream, so that multiple doesn't use more
+ memory \NC \NR
+\LL
+\stoptabulate
+
+The third argument is optional. When it is not given the function will return an
+\type {pdfe} document object as with a regular file, otherwise it will return a
+filename that can be used elsewhere (e.g.\ in the image library) to reference the
+stream as pseudo file.
+
+Instead of a light userdata stream (which is actually fragile but handy when you
+come from a library) you can also pass a \LUA\ string, in which case the given
+length is (at most) the string length.
+
+The function returns an \type {pdfe} object and a string. The string can be used in
+the \type {img} library instead of a filename. You need to prevent garbage
+collection of the object when you use it as image (for instance by storing it
+somewhere).
+
+Both the memory stream and it's use in the image library is experimental and can
+change. In case you wonder where this can be used: when you use the swiglib
+library for \type {graphicmagick}, it can return such a userdata object. This
+permits conversion in memory and passing the result directly to the backend. This
+might save some runtime in one|-|pass workflows. This feature is currently not
+meant for production and we might come up with a better implementation.
+
+\stopsection
+
+\startsection[title={The \type {pdfscanner} library}][library=pdfscanner]
+
+\topicindex{\PDF+scanner}
+
+\libindex {scan}
+
+The \type {pdfscanner} library allows interpretation of \PDF\ content streams and
+\type {/ToUnicode} (cmap) streams. You can get those streams from the \type
+{pdfe} library, as explained in an earlier section. There is only a single
+top|-|level function in this library:
+
+\startfunctioncall
+pdfscanner.scan (<pdfe stream>, <table> operatortable, <table> info)
+pdfscanner.scan (<pdfe array>, <table> operatortable, <table> info)
+pdfscanner.scan (<string>, <table> operatortable, <table> info)
+\stopfunctioncall
+
+The first argument should be a \LUA\ string or a stream or array onject coming
+from the \type {pdfe} library. The second argument, \type {operatortable}, should
+be a \LUA\ table where the keys are \PDF\ operator name strings and the values
+are \LUA\ functions (defined by you) that are used to process those operators.
+The functions are called whenever the scanner finds one of these \PDF\ operators
+in the content stream(s). The functions are called with two arguments: the \type
+{scanner} object itself, and the \type {info} table that was passed are the third
+argument to \type {pdfscanner.scan}.
+
+Internally, \type {pdfscanner.scan} loops over the \PDF\ operators in the
+stream(s), collecting operands on an internal stack until it finds a \PDF\
+operator. If that \PDF\ operator's name exists in \type {operatortable}, then the
+associated function is executed. After the function has run (or when there is no
+function to execute) the internal operand stack is cleared in preparation for the
+next operator, and processing continues.
+
+The \type {scanner} argument to the processing functions is needed because it
+offers various methods to get the actual operands from the internal operand
+stack.
+
+A simple example of processing a \PDF's document stream could look like this:
+
+\starttyping
+local operatortable = { }
+
+operatortable.Do = function(scanner,info)
+ local resources = info.resources
+ if resources then
+ local val = scanner:pop()
+ local name = val[2]
+ local xobject = resources.XObject
+ print(info.space .. "Uses XObject " .. name)
+ local resources = xobject.Resources
+ if resources then
+ local newinfo = {
+ space = info.space .. " ",
+ resources = resources,
+ }
+ pdfscanner.scan(entry, operatortable, newinfo)
+ end
+ end
+end
+
+local function Analyze(filename)
+ local doc = pdfe.open(filename)
+ if doc then
+ local pages = doc.Pages
+ for i=1,#pages do
+ local page = pages[i]
+ local info = {
+ space = " " ,
+ resources = page.Resources,
+ }
+ print("Page " .. i)
+ -- pdfscanner.scan(page.Contents,operatortable,info)
+ pdfscanner.scan(page.Contents(),operatortable,info)
+ end
+ end
+end
+
+Analyze("foo.pdf")
+\stoptyping
+
+This example iterates over all the actual content in the \PDF, and prints out the
+found \type {XObject} names. While the code demonstrates quite some of the \type
+{pdfe} functions, let's focus on the type \type {pdfscanner} specific code
+instead.
+
+From the bottom up, the following line runs the scanner with the \PDF\ page's
+top|-|level content given in the first argument.
+
+The third argument, \type {info}, contains two entries: \type {space} is used to
+indent the printed output, and \type {resources} is needed so that embedded \type
+{XForms} can find their own content.
+
+The second argument, \type {operatortable} defines a processing function for a
+single \PDF\ operator, \type {Do}.
+
+The function \type {Do} prints the name of the current \type {XObject}, and then
+starts a new scanner for that object's content stream, under the condition that
+the \type {XObject} is in fact a \type {/Form}. That nested scanner is called
+with new \type {info} argument with an updated \type {space} value so that the
+indentation of the output nicely nests, and with a new \type {resources} field
+to help the next iteration down to properly process any other, embedded \type
+{XObject}s.
+
+Of course, this is not a very useful example in practice, but for the purpose of
+demonstrating \type {pdfscanner}, it is just long enough. It makes use of only
+one \type {scanner} method: \type {scanner:pop()}. That function pops the top
+operand of the internal stack, and returns a \LUA\ table where the object at index
+one is a string representing the type of the operand, and object two is its
+value.
+
+The list of possible operand types and associated \LUA\ value types is:
+
+\starttabulate[|l|l|]
+\DB types \BC type \NC \NR
+\TB
+\NC \type{integer} \NC <number> \NC \NR
+\NC \type{real} \NC <number> \NC \NR
+\NC \type{boolean} \NC <boolean> \NC \NR
+\NC \type{name} \NC <string> \NC \NR
+\NC \type{operator} \NC <string> \NC \NR
+\NC \type{string} \NC <string> \NC \NR
+\NC \type{array} \NC <table> \NC \NR
+\NC \type{dict} \NC <table> \NC \NR
+\LL
+\stoptabulate
+
+In case of \type {integer} or \type {real}, the value is always a \LUA\ (floating
+point) number. In case of \type {name}, the leading slash is always stripped.
+
+In case of \type {string}, please bear in mind that \PDF\ actually supports
+different types of strings (with different encodings) in different parts of the
+\PDF\ document, so you may need to reencode some of the results; \type {pdfscanner}
+always outputs the byte stream without reencoding anything. \type {pdfscanner}
+does not differentiate between literal strings and hexadecimal strings (the
+hexadecimal values are decoded), and it treats the stream data for inline images
+as a string that is the single operand for \type {EI}.
+
+In case of \type {array}, the table content is a list of \type {pop} return
+values and in case of \type {dict}, the table keys are \PDF\ name strings and the
+values are \type {pop} return values.
+
+\libindex{pop}
+\libindex{popnumber}
+\libindex{popname}
+\libindex{popstring}
+\libindex{poparray}
+\libindex{popdictionary}
+\libindex{popboolean}
+\libindex{done}
+
+There are a few more methods defined that you can ask \type {scanner}:
+
+\starttabulate[|l|p|]
+\DB method \BC explanation \NC \NR
+\TB
+\NC \type{pop} \NC see above \NC \NR
+\NC \type{popnumber} \NC return only the value of a \type {real} or \type {integer} \NC \NR
+\NC \type{popname} \NC return only the value of a \type {name} \NC \NR
+\NC \type{popstring} \NC return only the value of a \type {string} \NC \NR
+\NC \type{poparray} \NC return only the value of a \type {array} \NC \NR
+\NC \type{popdictionary} \NC return only the value of a \type {dict} \NC \NR
+\NC \type{popboolean} \NC return only the value of a \type {boolean} \NC \NR
+\NC \type{done} \NC abort further processing of this \type {scan()} call \NC \NR
+\LL
+\stoptabulate
+
+The \type {pop*} are convenience functions, and come in handy when you know the
+type of the operands beforehand (which you usually do, in \PDF). For example, the
+\type {Do} function could have used \type {local name = scanner:popname()}
+instead, because the single operand to the \type {Do} operator is always a \PDF\
+name object.
+
+The \type {done} function allows you to abort processing of a stream once you
+have learned everything you want to learn. This comes in handy while parsing
+\type {/ToUnicode}, because there usually is trailing garbage that you are not
+interested in. Without \type {done}, processing only ends at the end of the
+stream, possibly wasting \CPU\ cycles.
+
+{\em We keep the older names \type {popNumber}, \type {popName}, \type
+{popString}, \type {popArray}, \type {popDict} and \type {popBool} around.}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-callbacks.tex b/systems/doc/luatex/luatex-callbacks.tex
new file mode 100644
index 0000000000..b2b706ea91
--- /dev/null
+++ b/systems/doc/luatex/luatex-callbacks.tex
@@ -0,0 +1,1149 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-callbacks
+
+\startchapter[reference=callbacks,title={\LUA\ callbacks}]
+
+\startsection[title={Registering callbacks}][library=callback]
+
+\topicindex{callbacks}
+
+\libindex{register}
+\libindex{list}
+\libindex{find}
+
+This library has functions that register, find and list callbacks. Callbacks are
+\LUA\ functions that are called in well defined places. There are two kind of
+callbacks: those that mix with existing functionality, and those that (when
+enabled) replace functionality. In mosty cases the second category is expected to
+behave similar to the built in functionality because in a next step specific
+data is expected. For instance, you can replace the hyphenation routine. The
+function gets a list that can be hyphenated (or not). The final list should be
+valid and is (normally) used for constructing a paragraph. Another function can
+replace the ligature builder and|/|or kerner. Doing something else is possible
+but in the end might not give the user the expected outcome.
+
+The first thing you need to do is registering a callback:
+
+\startfunctioncall
+id, error =
+ callback.register(<string> callback_name, <function> func)
+id, error =
+ callback.register(<string> callback_name, nil)
+id, error =
+ callback.register(<string> callback_name, false)
+\stopfunctioncall
+
+Here the \syntax {callback_name} is a predefined callback name, see below. The
+function returns the internal \type {id} of the callback or \type {nil}, if the
+callback could not be registered. In the latter case, \type {error} contains an
+error message, otherwise it is \type {nil}.
+
+\LUATEX\ internalizes the callback function in such a way that it does not matter
+if you redefine a function accidentally.
+
+Callback assignments are always global. You can use the special value \type {nil}
+instead of a function for clearing the callback.
+
+For some minor speed gain, you can assign the boolean \type {false} to the
+non|-|file related callbacks, doing so will prevent \LUATEX\ from executing
+whatever it would execute by default (when no callback function is registered at
+all). Be warned: this may cause all sorts of grief unless you know \notabene
+{exactly} what you are doing!
+
+\startfunctioncall
+<table> info =
+ callback.list()
+\stopfunctioncall
+
+The keys in the table are the known callback names, the value is a boolean where
+\type {true} means that the callback is currently set (active).
+
+\startfunctioncall
+<function> f = callback.find(callback_name)
+\stopfunctioncall
+
+If the callback is not set, \type {find} returns \type {nil}.
+
+\stopsection
+
+\startsection[title={File discovery callbacks}][library=callback]
+
+The behaviour documented in this subsection is considered stable in the sense that
+there will not be backward|-|incompatible changes any more.
+
+\subsection{\cbk {find_read_file} and \cbk {find_write_file}}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<number> id_number, <string> asked_name)
+\stopfunctioncall
+
+Arguments:
+
+\startitemize
+
+\sym{id_number}
+
+This number is zero for the log or \prm {input} files. For \TEX's \prm {read}
+or \prm {write} the number is incremented by one, so \type {\read0} becomes~1.
+
+\sym{asked_name}
+
+This is the user|-|supplied filename, as found by \prm {input}, \prm {openin}
+or \prm {openout}.
+
+\stopitemize
+
+Return value:
+
+\startitemize
+
+\sym{actual_name}
+
+This is the filename used. For the very first file that is read in by \TEX, you
+have to make sure you return an \type {actual_name} that has an extension and
+that is suitable for use as \type {jobname}. If you don't, you will have to
+manually fix the name of the log file and output file after \LUATEX\ is finished,
+and an eventual format filename will become mangled. That is because these file
+names depend on the jobname.
+
+You have to return \type {nil} if the file cannot be found.
+
+\stopitemize
+
+\subsection{\cbk {find_font_file}}
+
+\topicindex{callbacks+font files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is an \OTF\ or \TFM\ font metrics file.
+
+Return \type {nil} if the file cannot be found.
+
+\subsection{\cbk {find_output_file}}
+
+\topicindex{callbacks+output file}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is the \PDF\ or \DVI\ file for writing.
+
+\subsection{\cbk {find_format_file}}
+
+\topicindex{callbacks+format file}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is a format file for reading (the format file for writing
+is always opened in the current directory).
+
+\subsection{\cbk {find_vf_file}}
+
+\topicindex{callbacks+font files}
+
+Like \cbk {find_font_file}, but for virtual fonts. This applies to both \ALEPH's
+\OVF\ files and traditional Knuthian \VF\ files.
+
+\subsection{\cbk {find_map_file}}
+
+\topicindex{callbacks+font files}
+
+Like \cbk {find_font_file}, but for map files.
+
+\subsection{\cbk {find_enc_file}}
+
+\topicindex{callbacks+font files}
+
+Like \cbk {find_font_file}, but for enc files.
+
+\subsection{\cbk {find_pk_file}}
+
+\topicindex{callbacks+font files}
+
+Like \cbk {find_font_file}, but for pk bitmap files. This callback takes two
+arguments: \type {name} and \type {dpi}. In your callback you can decide to
+look for:
+
+\starttyping
+<base res>dpi/<fontname>.<actual res>pk
+\stoptyping
+
+but other strategies are possible. It is up to you to find a \quote {reasonable}
+bitmap file to go with that specification.
+
+\subsection{\cbk {find_data_file}}
+
+\topicindex{callbacks+data files}
+
+Like \cbk {find_font_file}, but for embedded files (\type {\pdfobj file '...'}).
+
+\subsection{\cbk {find_opentype_file}}
+
+\topicindex{callbacks+font files}
+
+Like \cbk {find_font_file}, but for \OPENTYPE\ font files.
+
+\subsection{\cbk {find_truetype_file} and \cbk {find_type1_file}}
+
+\topicindex{callbacks+font files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is a font file. This callback is called while \LUATEX\ is
+building its internal list of needed font files, so the actual timing may
+surprise you. Your return value is later fed back into the matching \type
+{read_file} callback.
+
+Strangely enough, \cbk {find_type1_file} is also used for \OPENTYPE\ (\OTF)
+fonts.
+
+\subsection{\cbk {find_image_file}}
+
+\topicindex{callbacks+image files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<string> actual_name =
+ function (<string> asked_name)
+\stopfunctioncall
+
+The \type {asked_name} is an image file. Your return value is used to open a file
+from the hard disk, so make sure you return something that is considered the name
+of a valid file by your operating system.
+
+\subsection[iocallback]{File reading callbacks}
+
+The behavior documented in this subsection is considered stable in the sense that
+there will not be backward-incompatible changes any more.
+
+\subsection{\cbk {open_read_file}}
+
+\topicindex{callbacks+opening files}
+
+Your callback function should have the following conventions:
+
+\startfunctioncall
+<table> env =
+ function (<string> file_name)
+\stopfunctioncall
+
+Argument:
+
+\startitemize
+
+\sym{file_name}
+
+The filename returned by a previous \cbk {find_read_file} or the return value of
+\type {kpse.find_file()} if there was no such callback defined.
+
+\stopitemize
+
+Return value:
+
+\startitemize
+
+\sym{env}
+
+This is a table containing at least one required and one optional callback
+function for this file. The required field is \type {reader} and the associated
+function will be called once for each new line to be read, the optional one is
+\type {close} that will be called once when \LUATEX\ is done with the file.
+
+\LUATEX\ never looks at the rest of the table, so you can use it to store your
+private per|-|file data. Both the callback functions will receive the table as
+their only argument.
+
+\stopitemize
+
+\subsubsection{\type {reader}}
+
+\topicindex{callbacks+reader}
+
+\LUATEX\ will run this function whenever it needs a new input line from the file.
+
+\startfunctioncall
+function(<table> env)
+ return <string> line
+end
+\stopfunctioncall
+
+Your function should return either a string or \type {nil}. The value \type {nil}
+signals that the end of file has occurred, and will make \TEX\ call the optional
+\type {close} function next.
+
+\subsubsection{\type {close}}
+
+\topicindex{callbacks+closing files}
+
+\LUATEX\ will run this optional function when it decides to close the file.
+
+\startfunctioncall
+function(<table> env)
+end
+\stopfunctioncall
+
+Your function should not return any value.
+
+\subsection{General file readers}
+
+\topicindex{callbacks+readers}
+
+There is a set of callbacks for the loading of binary data files. These all use
+the same interface:
+
+\startfunctioncall
+function(<string> name)
+ return <boolean> success, <string> data, <number> data_size
+end
+\stopfunctioncall
+
+The \type {name} will normally be a full path name as it is returned by either
+one of the file discovery callbacks or the internal version of \type
+{kpse.find_file()}.
+
+\startitemize
+
+\sym{success}
+
+Return \type {false} when a fatal error occurred (e.g.\ when the file cannot be
+found, after all).
+
+\sym{data}
+
+The bytes comprising the file.
+
+\sym{data_size}
+
+The length of the \type {data}, in bytes.
+
+\stopitemize
+
+Return an empty string and zero if the file was found but there was a
+reading problem.
+
+The list of functions is:
+
+\starttabulate[|l|p|]
+\DB function \BC usage \NC \NR
+\TB
+\NC \type{read_font_file} \NC ofm or tfm files \NC \NR
+\NC \type{read_vf_file} \NC virtual fonts \NC \NR
+\NC \type{read_map_file} \NC map files \NC \NR
+\NC \type{read_enc_file} \NC encoding files \NC \NR
+\NC \type{read_pk_file} \NC pk bitmap files \NC \NR
+\NC \type{read_data_file} \NC embedded files (as is possible with \PDF\ objects) \NC \NR
+\NC \type{read_truetype_file} \NC \TRUETYPE\ font files \NC \NR
+\NC \type{read_type1_file} \NC \TYPEONE\ font files \NC \NR
+\NC \type{read_opentype_file} \NC \OPENTYPE\ font files \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Data processing callbacks}][library=callback]
+
+\subsection{\cbk {process_input_buffer}}
+
+\topicindex{callbacks+input buffer}
+
+This callback allows you to change the contents of the line input buffer just
+before \LUATEX\ actually starts looking at it.
+
+\startfunctioncall
+function(<string> buffer)
+ return <string> adjusted_buffer
+end
+\stopfunctioncall
+
+If you return \type {nil}, \LUATEX\ will pretend like your callback never
+happened. You can gain a small amount of processing time from that. This callback
+does not replace any internal code.
+
+\subsection{\cbk {process_output_buffer}}
+
+\topicindex{callbacks+output buffer}
+
+This callback allows you to change the contents of the line output buffer just
+before \LUATEX\ actually starts writing it to a file as the result of a \prm
+{write} command. It is only called for output to an actual file (that is,
+excluding the log, the terminal, and so called \prm {write} 18 calls).
+
+\startfunctioncall
+function(<string> buffer)
+ return <string> adjusted_buffer
+end
+\stopfunctioncall
+
+If you return \type {nil}, \LUATEX\ will pretend like your callback never
+happened. You can gain a small amount of processing time from that. This callback
+does not replace any internal code.
+
+\subsection{\cbk {process_jobname}}
+
+\topicindex{callbacks+jobname}
+
+This callback allows you to change the jobname given by \prm {jobname} in \TEX\
+and \type {tex.jobname} in Lua. It does not affect the internal job name or the
+name of the output or log files.
+
+\startfunctioncall
+function(<string> jobname)
+ return <string> adjusted_jobname
+end
+\stopfunctioncall
+
+The only argument is the actual job name; you should not use \type {tex.jobname}
+inside this function or infinite recursion may occur. If you return \type {nil},
+\LUATEX\ will pretend your callback never happened. This callback does not
+replace any internal code.
+
+\stopsection
+
+\startsection[title={Node list processing callbacks}][library=callback]
+
+The description of nodes and node lists is in~\in{chapter}[nodes].
+
+\subsection{\cbk {contribute_filter}}
+
+\topicindex{callbacks+contributions}
+
+This callback is called when \LUATEX\ adds contents to list:
+
+\startfunctioncall
+function(<string> extrainfo)
+end
+\stopfunctioncall
+
+The string reports the group code. From this you can deduce from
+what list you can give a treat.
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{pre_box} \NC interline material is being added \NC \NR
+\NC \type{pre_adjust} \NC \prm {vadjust} material is being added \NC \NR
+\NC \type{box} \NC a typeset box is being added (always called) \NC \NR
+\NC \type{adjust} \NC \prm {vadjust} material is being added \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {buildpage_filter}}
+
+\topicindex{callbacks+building pages}
+
+This callback is called whenever \LUATEX\ is ready to move stuff to the main
+vertical list. You can use this callback to do specialized manipulation of the
+page building stage like imposition or column balancing.
+
+\startfunctioncall
+function(<string> extrainfo)
+end
+\stopfunctioncall
+
+The string \type {extrainfo} gives some additional information about what \TEX's
+state is with respect to the \quote {current page}. The possible values for the
+\cbk {buildpage_filter} callback are:
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{alignment} \NC a (partial) alignment is being added \NC \NR
+\NC \type{after_output} \NC an output routine has just finished \NC \NR
+\NC \type{new_graf} \NC the beginning of a new paragraph \NC \NR
+\NC \type{vmode_par} \NC \prm {par} was found in vertical mode \NC \NR
+\NC \type{hmode_par} \NC \prm {par} was found in horizontal mode \NC \NR
+\NC \type{insert} \NC an insert is added \NC \NR
+\NC \type{penalty} \NC a penalty (in vertical mode) \NC \NR
+\NC \type{before_display} \NC immediately before a display starts \NC \NR
+\NC \type{after_display} \NC a display is finished \NC \NR
+\NC \type{end} \NC \LUATEX\ is terminating (it's all over) \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {build_page_insert}}
+
+\topicindex{callbacks+inserts}
+
+This callback is called when the pagebuilder adds an insert. There is not much
+control over this mechanism but this callback permits some last minute
+manipulations of the spacing before an insert, something that might be handy when
+for instance multiple inserts (types) are appended in a row.
+
+\startfunctioncall
+function(<number> n, <number> i)
+ return <number> register
+end
+\stopfunctioncall
+
+with
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{n} \NC the insert class \NC \NR
+\NC \type{i} \NC the order of the insert \NC \NR
+\LL
+\stoptabulate
+
+The return value is a number indicating the skip register to use for the
+prepended spacing. This permits for instance a different top space (when \type
+{i} equals one) and intermediate space (when \type {i} is larger than one). Of
+course you can mess with the insert box but you need to make sure that \LUATEX\
+is happy afterwards.
+
+\subsection{\cbk {pre_linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback is called just before \LUATEX\ starts converting a list of nodes
+into a stack of \prm {hbox}es, after the addition of \prm {parfillskip}.
+
+\startfunctioncall
+function(<node> head, <string> groupcode)
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+The string called \type {groupcode} identifies the nodelist's context within
+\TEX's processing. The range of possibilities is given in the table below, but
+not all of those can actually appear in \cbk {pre_linebreak_filter}, some are
+for the \cbk {hpack_filter} and \cbk {vpack_filter} callbacks that will be
+explained in the next two paragraphs.
+
+\starttabulate[|l|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \type{<empty>} \NC main vertical list \NC \NR
+\NC \type{hbox} \NC \prm {hbox} in horizontal mode \NC \NR
+\NC \type{adjusted_hbox} \NC \prm {hbox} in vertical mode \NC \NR
+\NC \type{vbox} \NC \prm {vbox} \NC \NR
+\NC \type{vtop} \NC \prm {vtop} \NC \NR
+\NC \type{align} \NC \prm {halign} or \prm {valign} \NC \NR
+\NC \type{disc} \NC discretionaries \NC \NR
+\NC \type{insert} \NC packaging an insert \NC \NR
+\NC \type{vcenter} \NC \prm {vcenter} \NC \NR
+\NC \type{local_box} \NC \lpr {localleftbox} or \lpr {localrightbox} \NC \NR
+\NC \type{split_off} \NC top of a \prm {vsplit} \NC \NR
+\NC \type{split_keep} \NC remainder of a \prm {vsplit} \NC \NR
+\NC \type{align_set} \NC alignment cell \NC \NR
+\NC \type{fin_row} \NC alignment row \NC \NR
+\LL
+\stoptabulate
+
+As for all the callbacks that deal with nodes, the return value can be one of
+three things:
+
+\startitemize
+\startitem
+ boolean \type {true} signals successful processing
+\stopitem
+\startitem
+ \type {<node>} signals that the \quote {head} node should be replaced by the
+ returned node
+\stopitem
+\startitem
+ boolean \type {false} signals that the \quote {head} node list should be
+ ignored and flushed from memory
+\stopitem
+\stopitemize
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback replaces \LUATEX's line breaking algorithm.
+
+\startfunctioncall
+function(<node> head, <boolean> is_display)
+ return <node> newhead
+end
+\stopfunctioncall
+
+The returned node is the head of the list that will be added to the main vertical
+list, the boolean argument is true if this paragraph is interrupted by a
+following math display.
+
+If you return something that is not a \type {<node>}, \LUATEX\ will apply the
+internal linebreak algorithm on the list that starts at \type {<head>}.
+Otherwise, the \type {<node>} you return is supposed to be the head of a list of
+nodes that are all allowed in vertical mode, and at least one of those has to
+represent a hbox. Failure to do so will result in a fatal error.
+
+Setting this callback to \type {false} is possible, but dangerous, because it is
+possible you will end up in an unfixable \quote {deadcycles loop}.
+
+\subsection{\type {append_to_vlist_filter}}
+
+\topicindex{callbacks+contributions}
+
+This callback is called whenever \LUATEX\ adds a box to a vertical list:
+
+\startfunctioncall
+function(<node> box, <string> locationcode, <number prevdepth>,
+ <boolean> mirrored)
+ return list, prevdepth
+end
+\stopfunctioncall
+
+It is ok to return nothing in which case you also need to flush the box or deal
+with it yourself. The prevdepth is also optional. Locations are \type {box},
+\type {alignment}, \type {equation}, \type {equation_number} and \type
+{post_linebreak}.
+
+\subsection{\cbk {post_linebreak_filter}}
+
+\topicindex{callbacks+linebreaks}
+
+This callback is called just after \LUATEX\ has converted a list of nodes into a
+stack of \prm {hbox}es.
+
+\startfunctioncall
+function(<node> head, <string> groupcode)
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {hpack_filter}}
+
+\topicindex{callbacks+packing}
+
+This callback is called when \TEX\ is ready to start boxing some horizontal mode
+material. Math items and line boxes are ignored at the moment.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size,
+ <string> packtype [, <string> direction] [, <node> attributelist])
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+The \type {packtype} is either \type {additional} or \type {exactly}. If \type
+{additional}, then the \type {size} is a \type {\hbox spread ...} argument. If
+\type {exactly}, then the \type {size} is a \type {\hbox to ...}. In both cases,
+the number is in scaled points.
+
+The \type {direction} is either one of the three-letter direction specifier
+strings, or \type {nil}.
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {vpack_filter}}
+
+\topicindex{callbacks+packing}
+
+This callback is called when \TEX\ is ready to start boxing some vertical mode
+material. Math displays are ignored at the moment.
+
+This function is very similar to the \cbk {hpack_filter}. Besides the fact
+that it is called at different moments, there is an extra variable that matches
+\TEX's \prm {maxdepth} setting.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size, <string> packtype,
+ <number> maxdepth [, <string> direction] [, <node> attributelist]))
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\type {hpack_quality}}
+
+\topicindex{callbacks+packing}
+
+This callback can be used to intercept the overfull messages that can result from
+packing a horizontal list (as happens in the par builder). The function takes a
+few arguments:
+
+\startfunctioncall
+function(<string> incident, <number> detail, <node> head, <number> first,
+ <number> last)
+ return <node> whatever
+end
+\stopfunctioncall
+
+The incident is one of \type {overfull}, \type {underfull}, \type {loose} or
+\type {tight}. The detail is either the amount of overflow in case of \type
+{overfull}, or the badness otherwise. The head is the list that is constructed
+(when protrusion or expansion is enabled, this is an intermediate list).
+Optionally you can return a node, for instance an overfull rule indicator. That
+node will be appended to the list (just like \TEX's own rule would).
+
+\subsection{\type {vpack_quality}}
+
+\topicindex{callbacks+packing}
+
+This callback can be used to intercept the overfull messages that can result from
+packing a vertical list (as happens in the page builder). The function takes a
+few arguments:
+
+\startfunctioncall
+function(<string> incident, <number> detail, <node> head, <number> first,
+ <number> last)
+end
+\stopfunctioncall
+
+The incident is one of \type {overfull}, \type {underfull}, \type {loose} or
+\type {tight}. The detail is either the amount of overflow in case of \type
+{overfull}, or the badness otherwise. The head is the list that is constructed.
+
+\subsection{\cbk {process_rule}}
+
+\topicindex{callbacks+rules}
+
+This is an experimental callback. It can be used with rules of subtype~4
+(user). The callback gets three arguments: the node, the width and the
+height. The callback can use \type {pdf.print} to write code to the \PDF\
+file but beware of not messing up the final result. No checking is done.
+
+\subsection{\type {pre_output_filter}}
+
+\topicindex{callbacks+output}
+
+This callback is called when \TEX\ is ready to start boxing the box 255 for \prm
+{output}.
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> size, <string> packtype,
+ <number> maxdepth [, <string> direction])
+ return true | false | <node> newhead
+end
+\stopfunctioncall
+
+This callback does not replace any internal code.
+
+\subsection{\cbk {hyphenate}}
+
+\topicindex{callbacks+hyphenation}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to insert discretionary nodes in the node
+list it receives.
+
+Setting this callback to \type {false} will prevent the internal discretionary
+insertion pass.
+
+\subsection{\cbk {ligaturing}}
+
+\topicindex{callbacks+ligature building}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to apply ligaturing to the node list it
+receives.
+
+You don't have to worry about return values because the \type {head} node that is
+passed on to the callback is guaranteed not to be a glyph_node (if need be, a
+temporary node will be prepended), and therefore it cannot be affected by the
+mutations that take place. After the callback, the internal value of the \quote
+{tail of the list} will be recalculated.
+
+The \type {next} of \type {head} is guaranteed to be non-nil.
+
+The \type {next} of \type {tail} is guaranteed to be nil, and therefore the
+second callback argument can often be ignored. It is provided for orthogonality,
+and because it can sometimes be handy when special processing has to take place.
+
+Setting this callback to \type {false} will prevent the internal ligature
+creation pass.
+
+You must not ruin the node list. For instance, the head normally is a local par node,
+and the tail a glue. Messing too much can push \LUATEX\ into panic mode.
+
+\subsection{\cbk {kerning}}
+
+\topicindex{callbacks+kerning}
+
+\startfunctioncall
+function(<node> head, <node> tail)
+end
+\stopfunctioncall
+
+No return values. This callback has to apply kerning between the nodes in the
+node list it receives. See \cbk {ligaturing} for calling conventions.
+
+Setting this callback to \type {false} will prevent the internal kern insertion
+pass.
+
+You must not ruin the node list. For instance, the head normally is a local par node,
+and the tail a glue. Messing too much can push \LUATEX\ into panic mode.
+
+\subsection{\type {insert_local_par}}
+
+Each paragraph starts with a local par node that keeps track of for instance
+the direction. You can hook a callback into the creator:
+
+\startfunctioncall
+function(<node> local_par, <string> location)
+end
+\stopfunctioncall
+
+There is no return value and you should make sure that the node stays valid
+as otherwise \TEX\ can get confused.
+
+\subsection{\cbk {mlist_to_hlist}}
+
+\topicindex{callbacks+math}
+
+This callback replaces \LUATEX's math list to node list conversion algorithm.
+
+\startfunctioncall
+function(<node> head, <string> display_type, <boolean> need_penalties)
+ return <node> newhead
+end
+\stopfunctioncall
+
+The returned node is the head of the list that will be added to the vertical or
+horizontal list, the string argument is either \quote {text} or \quote {display}
+depending on the current math mode, the boolean argument is \type {true} if
+penalties have to be inserted in this list, \type {false} otherwise.
+
+Setting this callback to \type {false} is bad, it will almost certainly result in
+an endless loop.
+
+\stopsection
+
+\startsection[title={Information reporting callbacks}][library=callback]
+
+\subsection{\cbk {pre_dump}}
+
+\topicindex{callbacks+dump}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This function is called just before dumping to a format file starts. It does not
+replace any code and there are neither arguments nor return values.
+
+\subsection{\cbk {start_run}}
+
+\topicindex{callbacks+job run}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's banner. Note that for
+successful use, this callback has to be set in the \LUA\ initialization script,
+otherwise it will be seen only after the run has already started.
+
+\subsection{\cbk {stop_run}}
+
+\topicindex{callbacks+job run}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's statistics and \quote
+{output written to} messages. The engine can still do housekeeping and therefore
+you should not rely on this hook for postprocessing the \PDF\ or log file.
+
+\subsection{\cbk {start_page_number}}
+
+\topicindex{callbacks+pages}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+Replaces the code that prints the \type {[} and the page number at the begin of
+\prm {shipout}. This callback will also override the printing of box information
+that normally takes place when \prm {tracingoutput} is positive.
+
+\subsection{\cbk {stop_page_number}}
+
+\topicindex{callbacks+pages}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+Replaces the code that prints the \type {]} at the end of \prm {shipout}.
+
+\subsection{\cbk {show_error_hook}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback is run from inside the \TEX\ error function, and the idea is to
+allow you to do some extra reporting on top of what \TEX\ already does (none of
+the normal actions are removed). You may find some of the values in the \type
+{status} table useful. This callback does not replace any internal code.
+
+\subsection{\cbk {show_error_message}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints the error message. The usual
+interaction after the message is not affected.
+
+\subsection{\cbk {show_lua_error_hook}}
+
+\topicindex{callbacks+errors}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback replaces the code that prints the extra \LUA\ error message.
+
+\subsection{\cbk {start_file}}
+
+\topicindex{callbacks+files}
+
+\startfunctioncall
+function(category,filename)
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's when a file is opened like
+\type {(filename} for regular files. The category is a number:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 1 \NC a normal data file, like a \TEX\ source \NC \NR
+\NC 2 \NC a font map coupling font names to resources \NC \NR
+\NC 3 \NC an image file (\type {png}, \type {pdf}, etc) \NC \NR
+\NC 4 \NC an embedded font subset \NC \NR
+\NC 5 \NC a fully embedded font \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\cbk {stop_file}}
+
+\topicindex{callbacks+files}
+
+\startfunctioncall
+function(category)
+end
+\stopfunctioncall
+
+This callback replaces the code that prints \LUATEX's when a file is closed like
+the \type {)} for regular files.
+
+\subsection{\cbk {call_edit}}
+
+\topicindex{callbacks+editing}
+
+\startfunctioncall
+function(filename,linenumber)
+end
+\stopfunctioncall
+
+This callback replaces the call to an external editor when \quote{E} is pressed
+in reply to an error message. Processing will end immediately after the callback
+returns control to the main program.
+
+\subsection{\cbk {finish_synctex}}
+
+\topicindex{callbacks+synctex}
+
+This callback can be used to wrap up alternative synctex methods. It kicks in
+after the normal synctex finalizer (that happens to remove the synctex files
+after a run when native synctex is not enabled).
+
+\subsection{\cbk {wrapup_run}}
+
+\topicindex{callbacks+wrapping up}
+
+This callback is called after the \PDF\ and log files are closed. Use it at your own
+risk.
+
+\stopsection
+
+\startsection[title={\PDF\ related callbacks}][library=callback]
+
+\subsection{\cbk {finish_pdffile}}
+
+\topicindex{callbacks+\PDF\ file}
+
+\startfunctioncall
+function()
+end
+\stopfunctioncall
+
+This callback is called when all document pages are already written to the \PDF\
+file and \LUATEX\ is about to finalize the output document structure. Its
+intended use is final update of \PDF\ dictionaries such as \type {/Catalog} or
+\type {/Info}. The callback does not replace any code. There are neither
+arguments nor return values.
+
+\subsection{\cbk {finish_pdfpage}}
+
+\topicindex{callbacks+\PDF\ file}
+
+\startfunctioncall
+function(shippingout)
+end
+\stopfunctioncall
+
+This callback is called after the \PDF\ page stream has been assembled and before
+the page object gets finalized.
+
+\subsection{\cbk {page_objnum_provider}}
+
+\topicindex{callbacks+\PDF\ file}
+
+This is one that experts can use to juggle the page tree, a data structure
+that determines the order in a \PDF\ file:
+
+\startfunctioncall
+function(objnum)
+ return objnum
+end
+\stopfunctioncall
+
+We can for instance swap the first and last page:
+
+\starttyping
+local n = 0
+callback.register("page_objnum_provider",function(objnum)
+ n = n + 1
+ if n == 1 then
+ return pdf.getpageref(tex.count[0])
+ elseif n == tex.count[0] then
+ return pdf.getpageref(1)
+ else
+ return objnum
+ end
+end)
+\stoptyping
+
+When you mess things up \unknown\ don't complain.
+
+\subsection{\cbk {process_pdf_image_content}}
+
+\topicindex{callbacks+image content}
+
+When a page from a \PDF\ file is embedded its page stream as well as related
+objects are copied to the target file. However, it can be that the page stream
+has operators that assume additional resources, for instance marked text. You can
+decide to filter that for which \LUATEX\ provides a callback. Here is a simple
+demonstration of use:
+
+\starttyping
+pdf.setrecompress(1)
+
+callback.register("process_pdf_image_content",function(s)
+ print(s)
+ return s
+end)
+\stoptyping
+
+You need to explicitly enable recompression because otherwise the content stream
+gets just passed on in its original compressed form.
+
+\stopsection
+
+\startsection[title={Font-related callbacks}][library=callback]
+
+\subsection{\cbk {define_font}}
+
+\topicindex{callbacks+fonts}
+
+\startfunctioncall
+function(<string> name, <number> size, <number> id)
+ return <table> font | <number> id
+end
+\stopfunctioncall
+
+The string \type {name} is the filename part of the font specification, as given
+by the user.
+
+The number \type {size} is a bit special:
+
+\startitemize[packed]
+\startitem
+ If it is positive, it specifies an \quote{at size} in scaled points.
+\stopitem
+\startitem
+ If it is negative, its absolute value represents a \quote {scaled} setting
+ relative to the designsize of the font.
+\stopitem
+\stopitemize
+
+The \type {id} is the internal number assigned to the font.
+
+The internal structure of the \type {font} table that is to be returned is
+explained in \in {chapter} [fonts]. That table is saved internally, so you can
+put extra fields in the table for your later \LUA\ code to use. In alternative,
+\type {retval} can be a previously defined fontid. This is useful if a previous
+definition can be reused instead of creating a whole new font structure.
+
+Setting this callback to \type {false} is pointless as it will prevent font
+loading completely but will nevertheless generate errors.
+
+\subsection{\cbk {glyph_not_found}}
+
+\topicindex{callbacks+fonts}
+
+This callback kicks in when the backend cannot insert a glyph. When no callback
+is defined a message is written to the log.
+
+\startfunctioncall
+function(<number> id, <number> char)
+ -- do something with font id and char code
+end
+\stopfunctioncall
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-contents.tex b/systems/doc/luatex/luatex-contents.tex
new file mode 100644
index 0000000000..815ca4bbe7
--- /dev/null
+++ b/systems/doc/luatex/luatex-contents.tex
@@ -0,0 +1,19 @@
+\environment luatex-style
+
+\startcomponent luatex-contents
+
+\starttitle[title=Contents]
+
+\start
+
+ \definecolor[maincolor][black]
+
+ \placelist
+ [chapter,section,subsection]
+ [criterium=text]
+
+\stop
+
+\stoptitle
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-enhancements.tex b/systems/doc/luatex/luatex-enhancements.tex
new file mode 100644
index 0000000000..d6651507a2
--- /dev/null
+++ b/systems/doc/luatex/luatex-enhancements.tex
@@ -0,0 +1,1371 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-enhancements
+
+\startchapter[reference=enhancements,title={Basic \TEX\ enhancements}]
+
+\startsection[title={Introduction}]
+
+\startsubsection[title={Primitive behaviour}]
+
+From day one, \LUATEX\ has offered extra features compared to the superset of
+\PDFTEX, which includes \ETEX, and \ALEPH. This has not been limited to the
+possibility to execute \LUA\ code via \prm {directlua}, but \LUATEX\ also adds
+functionality via new \TEX|-|side primitives or extensions to existing ones.
+
+When \LUATEX\ starts up in \quote {iniluatex} mode (\type {luatex -ini}), it
+defines only the primitive commands known by \TEX82 and the one extra command
+\prm {directlua}. As is fitting, a \LUA\ function has to be called to add the
+extra primitives to the user environment. The simplest method to get access to
+all of the new primitive commands is by adding this line to the format generation
+file:
+
+\starttyping
+\directlua { tex.enableprimitives('',tex.extraprimitives()) }
+\stoptyping
+
+But be aware that the curly braces may not have the proper \prm {catcode}
+assigned to them at this early time (giving a \quote {Missing number} error), so
+it may be needed to put these assignments before the above line:
+
+\starttyping
+\catcode `\{=1
+\catcode `\}=2
+\stoptyping
+
+More fine|-|grained primitives control is possible and you can look up the
+details in \in {section} [luaprimitives]. For simplicity's sake, this manual
+assumes that you have executed the \prm {directlua} command as given above.
+
+The startup behaviour documented above is considered stable in the sense that
+there will not be backward|-|incompatible changes any more. We have promoted some
+rather generic \PDFTEX\ primitives to core \LUATEX\ ones, and the few that we
+inherited from \ALEPH\ (\OMEGA) are also promoted. Effectively this means that we
+now only have the \type {tex}, \type {etex} and \type {luatex} sets left.
+
+In \in {Chapter} [modifications] we discuss several primitives that are derived
+from \PDFTEX\ and \ALEPH\ (\OMEGA). Here we stick to real new ones. In the
+chapters on fonts and math we discuss a few more new ones.
+
+\stopsubsection
+
+\startsubsection[title={Version information}]
+
+\startsubsubsection[title={\lpr {luatexbanner}, \lpr {luatexversion} and \lpr {luatexrevision}}]
+
+\topicindex{version}
+\topicindex{banner}
+
+There are three new primitives to test the version of \LUATEX:
+
+\unexpanded\def\VersionHack#1% otherwise different luatex and luajittex runs
+ {\ctxlua{%
+ local banner = "\luatexbanner"
+ local banner = string.match(banner,"(.+)\letterpercent(") or banner
+ context(string.gsub(banner ,"jit",""))%
+ }}
+
+\starttabulate[|l|l|pl|]
+\DB primitive \BC value
+ \BC explanation \NC \NR
+\TB
+\NC \lpr {luatexbanner} \NC \VersionHack{\luatexbanner}
+ \NC the banner reported on the command line \NC \NR
+\NC \lpr {luatexversion} \NC \the\luatexversion
+ \NC a combination of major and minor number \NC \NR
+\NC \lpr {luatexrevision} \NC \luatexrevision
+ \NC the revision number, the current value is \NC \NR
+\LL
+\stoptabulate
+
+The official \LUATEX\ version is defined as follows:
+
+\startitemize
+\startitem
+ The major version is the integer result of \lpr {luatexversion} divided by
+ 100. The primitive is an \quote {internal variable}, so you may need to prefix
+ its use with \prm {the} depending on the context.
+\stopitem
+\startitem
+ The minor version is the two|-|digit result of \lpr {luatexversion} modulo 100.
+\stopitem
+\startitem
+ The revision is reported by \lpr {luatexrevision}. This primitive expands to
+ a positive integer.
+\stopitem
+\startitem
+ The full version number consists of the major version, minor version and
+ revision, separated by dots.
+\stopitem
+\stopitemize
+
+\stopsubsubsection
+
+\startsubsubsection[title={\lpr {formatname}}]
+
+\topicindex{format}
+
+The \lpr {formatname} syntax is identical to \prm {jobname}. In \INITEX, the
+expansion is empty. Otherwise, the expansion is the value that \prm {jobname} had
+during the \INITEX\ run that dumped the currently loaded format. You can use this
+token list to provide your own version info.
+
+\stopsubsubsection
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\UNICODE\ text support}]
+
+\startsubsection[title={Extended ranges}]
+
+\topicindex{\UNICODE}
+
+Text input and output is now considered to be \UNICODE\ text, so input characters
+can use the full range of \UNICODE\ ($2^{20}+2^{16}-1 = \hbox{0x10FFFF}$). Later
+chapters will talk of characters and glyphs. Although these are not
+interchangeable, they are closely related. During typesetting, a character is
+always converted to a suitable graphic representation of that character in a
+specific font. However, while processing a list of to|-|be|-|typeset nodes, its
+contents may still be seen as a character. Inside \LUATEX\ there is no clear
+separation between the two concepts. Because the subtype of a glyph node can be
+changed in \LUA\ it is up to the user. Subtypes larger than 255 indicate that
+font processing has happened.
+
+A few primitives are affected by this, all in a similar fashion: each of them has
+to accommodate for a larger range of acceptable numbers. For instance, \prm
+{char} now accepts values between~0 and $1{,}114{,}111$. This should not be a
+problem for well|-|behaved input files, but it could create incompatibilities for
+input that would have generated an error when processed by older \TEX|-|based
+engines. The affected commands with an altered initial (left of the equal sign)
+or secondary (right of the equal sign) value are: \prm {char}, \prm {lccode},
+\prm {uccode}, \lpr {hjcode}, \prm {catcode}, \prm {sfcode}, \lpr {efcode}, \lpr
+{lpcode}, \lpr {rpcode}, \prm {chardef}.
+
+As far as the core engine is concerned, all input and output to text files is
+\UTF-8 encoded. Input files can be pre|-|processed using the \type {reader}
+callback. This will be explained in \in {section} [iocallback]. Normalization of
+the \UNICODE\ input is on purpose not built|-|in and can be handled by a macro
+package during callback processing. We have made some practical choices and the
+user has to live with those.
+
+Output in byte|-|sized chunks can be achieved by using characters just outside of
+the valid \UNICODE\ range, starting at the value $1{,}114{,}112$ (0x110000). When
+the time comes to print a character $c>=1{,}114{,}112$, \LUATEX\ will actually
+print the single byte corresponding to $c$ minus 1{,}114{,}112.
+
+Output to the terminal uses \type {^^} notation for the lower control range
+($c<32$), with the exception of \type {^^I}, \type {^^J} and \type {^^M}. These
+are considered \quote {safe} and therefore printed as|-|is. You can disable
+escaping with \type {texio.setescape(false)} in which case you get the normal
+characters on the console.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {Uchar}}]
+
+\topicindex{\UNICODE}
+
+The expandable command \lpr {Uchar} reads a number between~0 and $1{,}114{,}111$
+and expands to the associated \UNICODE\ character.
+
+\stopsubsection
+
+\startsubsection[title={Extended tables}]
+
+All traditional \TEX\ and \ETEX\ registers can be 16-bit numbers. The affected
+commands are:
+
+\startfourcolumns
+\startlines
+\prm {count}
+\prm {dimen}
+\prm {skip}
+\prm {muskip}
+\prm {marks}
+\prm {toks}
+\prm {countdef}
+\prm {dimendef}
+\prm {skipdef}
+\prm {muskipdef}
+\prm {toksdef}
+\prm {insert}
+\prm {box}
+\prm {unhbox}
+\prm {unvbox}
+\prm {copy}
+\prm {unhcopy}
+\prm {unvcopy}
+\prm {wd}
+\prm {ht}
+\prm {dp}
+\prm {setbox}
+\prm {vsplit}
+\stoplines
+\stopfourcolumns
+
+Because font memory management has been rewritten, character properties in fonts
+are no longer shared among font instances that originate from the same metric
+file. Of course we share fonts in the backend when possible so that the resulting
+\PDF\ file is as efficient as possible, but for instance also expansion and
+protrusion no longer use copies as in \PDFTEX.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Attributes}]
+
+\startsubsection[title={Nodes}]
+
+\topicindex {nodes}
+
+When \TEX\ reads input it will interpret the stream according to the properties
+of the characters. Some signal a macro name and trigger expansion, others open
+and close groups, trigger math mode, etc. What's left over becomes the typeset
+text. Internally we get linked list of nodes. Characters become \nod {glyph}
+nodes that have for instance a \type {font} and \type {char} property and \typ
+{\kern 10pt} becomes a \nod {kern} node with a \type {width} property. Spaces are
+alien to \TEX\ as they are turned into \nod {glue} nodes. So, a simple paragraph
+is mostly a mix of sequences of \nod {glyph} nodes (words) and \nod {glue} nodes
+(spaces).
+
+The sequences of characters at some point are extended with \nod {disc} nodes
+that relate to hyphenation. After that font logic can be applied and we get a
+list where some characters can be replaced, for instance multiple characters can
+become one ligature, and font kerns can be injected. This is driven by the
+font properties.
+
+Boxes (like \prm {hbox} and \prm {vbox}) become \nod {hlist} or \nod {vlist}
+nodes with \type {width}, \type {height}, \type {depth} and \type {shift}
+properties and a pointer \type {list} to its actual content. Boxes can be
+constructed explicitly or can be the result of subprocesses. For instance, when
+lines are broken into paragraphs, the lines are a linked list of \nod {hlist}
+nodes.
+
+So, to summarize: all that you enter as content eventually becomes a node, often
+as part of a (nested) list structure. They have a relative small memory footprint
+and carry only the minimal amount of information needed. In traditional \TEX\ a
+character node only held the font and slot number, in \LUATEX\ we also store some
+language related information, the expansion factor, etc. Now that we have access
+to these nodes from \LUA\ it makes sense to be able to carry more information
+with an node and this is where attributes kick in.
+
+\stopsubsection
+
+\startsubsection[title={Attribute registers}]
+
+\topicindex {attributes}
+
+Attributes are a completely new concept in \LUATEX. Syntactically, they behave a
+lot like counters: attributes obey \TEX's nesting stack and can be used after
+\prm {the} etc.\ just like the normal \prm {count} registers.
+
+\startsyntax
+\attribute <16-bit number> <optional equals> <32-bit number>!crlf
+\attributedef <csname> <optional equals> <16-bit number>
+\stopsyntax
+
+Conceptually, an attribute is either \quote {set} or \quote {unset}. Unset
+attributes have a special negative value to indicate that they are unset, that
+value is the lowest legal value: \type {-"7FFFFFFF} in hexadecimal, a.k.a.
+$-2147483647$ in decimal. It follows that the value \type {-"7FFFFFFF} cannot be
+used as a legal attribute value, but you {\it can\/} assign \type {-"7FFFFFFF} to
+\quote {unset} an attribute. All attributes start out in this \quote {unset}
+state in \INITEX.
+
+Attributes can be used as extra counter values, but their usefulness comes mostly
+from the fact that the numbers and values of all \quote {set} attributes are
+attached to all nodes created in their scope. These can then be queried from any
+\LUA\ code that deals with node processing. Further information about how to use
+attributes for node list processing from \LUA\ is given in~\in {chapter}[nodes].
+
+Attributes are stored in a sorted (sparse) linked list that are shared when
+possible. This permits efficient testing and updating. You can define many
+thousands of attributes but normally such a large number makes no sense and is
+also not that efficient because each node carries a (possibly shared) link to a
+list of currently set attributes. But they are a convenient extension and one of
+the first extensions we implemented in \LUATEX.
+
+\stopsubsection
+
+\startsubsection[title={Box attributes}]
+
+\topicindex {attributes}
+\topicindex {boxes}
+
+Nodes typically receive the list of attributes that is in effect when they are
+created. This moment can be quite asynchronous. For example: in paragraph
+building, the individual line boxes are created after the \prm {par} command has
+been processed, so they will receive the list of attributes that is in effect
+then, not the attributes that were in effect in, say, the first or third line of
+the paragraph.
+
+Similar situations happen in \LUATEX\ regularly. A few of the more obvious
+problematic cases are dealt with: the attributes for nodes that are created
+during hyphenation, kerning and ligaturing borrow their attributes from their
+surrounding glyphs, and it is possible to influence box attributes directly.
+
+When you assemble a box in a register, the attributes of the nodes contained in
+the box are unchanged when such a box is placed, unboxed, or copied. In this
+respect attributes act the same as characters that have been converted to
+references to glyphs in fonts. For instance, when you use attributes to implement
+color support, each node carries information about its eventual color. In that
+case, unless you implement mechanisms that deal with it, applying a color to
+already boxed material will have no effect. Keep in mind that this
+incompatibility is mostly due to the fact that separate specials and literals are
+a more unnatural approach to colors than attributes.
+
+It is possible to fine-tune the list of attributes that are applied to a \type
+{hbox}, \type {vbox} or \type {vtop} by the use of the keyword \type {attr}. The
+\type {attr} keyword(s) should come before a \type {to} or \type {spread}, if
+that is also specified. An example is:
+
+\startbuffer[tex]
+\attribute997=123
+\attribute998=456
+\setbox0=\hbox {Hello}
+\setbox2=\hbox attr 999 = 789 attr 998 = -"7FFFFFFF{Hello}
+\stopbuffer
+
+\startbuffer[lua]
+ for b=0,2,2 do
+ for a=997, 999 do
+ tex.sprint("box ", b, " : attr ",a," : ",tostring(tex.box[b] [a]))
+ tex.sprint("\\quad\\quad")
+ tex.sprint("list ",b, " : attr ",a," : ",tostring(tex.box[b].list[a]))
+ tex.sprint("\\par")
+ end
+ end
+\stopbuffer
+
+\typebuffer[tex]
+
+Box 0 now has attributes 997 and 998 set while box 2 has attributes 997 and 999
+set while the nodes inside that box will all have attributes 997 and 998 set.
+Assigning the maximum negative value causes an attribute to be ignored.
+
+To give you an idea of what this means at the \LUA\ end, take the following
+code:
+
+\typebuffer[lua]
+
+Later we will see that you can access properties of a node. The boxes here are so
+called \nod {hlist} nodes that have a field \type {list} that points to the
+content. Because the attributes are a list themselves you can access them by
+indexing the node (here we do that with \type {[a]}. Running this snippet gives:
+
+\start
+ \getbuffer[tex]
+ \startpacked \tt
+ \ctxluabuffer[lua]
+ \stoppacked
+\stop
+
+Because some values are not set we need to apply the \type {tostring} function
+here so that we get the word \type {nil}.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ related primitives}]
+
+\startsubsection[title={\prm {directlua}}]
+
+In order to merge \LUA\ code with \TEX\ input, a few new primitives are needed.
+The primitive \prm {directlua} is used to execute \LUA\ code immediately. The
+syntax is
+
+\startsyntax
+\directlua <general text>!crlf
+\directlua <16-bit number> <general text>
+\stopsyntax
+
+The \syntax {<general text>} is expanded fully, and then fed into the \LUA\
+interpreter. After reading and expansion has been applied to the \syntax
+{<general text>}, the resulting token list is converted to a string as if it was
+displayed using \type {\the\toks}. On the \LUA\ side, each \prm {directlua} block
+is treated as a separate chunk. In such a chunk you can use the \type {local}
+directive to keep your variables from interfering with those used by the macro
+package.
+
+The conversion to and from a token list means that you normally can not use \LUA\
+line comments (starting with \type {--}) within the argument. As there typically
+will be only one \quote {line} the first line comment will run on until the end
+of the input. You will either need to use \TEX|-|style line comments (starting
+with \%), or change the \TEX\ category codes locally. Another possibility is to
+say:
+
+\starttyping
+\begingroup
+\endlinechar=10
+\directlua ...
+\endgroup
+\stoptyping
+
+Then \LUA\ line comments can be used, since \TEX\ does not replace line endings
+with spaces. Of course such an approach depends on the macro package that you
+use.
+
+The \syntax {<16-bit number>} designates a name of a \LUA\ chunk and is
+taken from the \type {lua.name} array (see the documentation of the \type {lua}
+table further in this manual). When a chunk name starts with a \type {@} it will
+be displayed as a file name. This is a side effect of the way \LUA\ implements
+error handling.
+
+The \prm {directlua} command is expandable. Since it passes \LUA\ code to the
+\LUA\ interpreter its expansion from the \TEX\ viewpoint is usually empty.
+However, there are some \LUA\ functions that produce material to be read by \TEX,
+the so called print functions. The most simple use of these is \type
+{tex.print(<string> s)}. The characters of the string \type {s} will be placed on
+the \TEX\ input buffer, that is, \quote {before \TEX's eyes} to be read by \TEX\
+immediately. For example:
+
+\startbuffer
+\count10=20
+a\directlua{tex.print(tex.count[10]+5)}b
+\stopbuffer
+
+\typebuffer
+
+expands to
+
+\getbuffer
+
+Here is another example:
+
+\startbuffer
+$\pi = \directlua{tex.print(math.pi)}$
+\stopbuffer
+
+\typebuffer
+
+will result in
+
+\getbuffer
+
+Note that the expansion of \prm {directlua} is a sequence of characters, not of
+tokens, contrary to all \TEX\ commands. So formally speaking its expansion is
+null, but it places material on a pseudo-file to be immediately read by \TEX, as
+\ETEX's \prm {scantokens}. For a description of print functions look at \in
+{section} [sec:luaprint].
+
+Because the \syntax {<general text>} is a chunk, the normal \LUA\ error handling
+is triggered if there is a problem in the included code. The \LUA\ error messages
+should be clear enough, but the contextual information is still pretty bad.
+Often, you will only see the line number of the right brace at the end of the
+code.
+
+While on the subject of errors: some of the things you can do inside \LUA\ code
+can break up \LUATEX\ pretty bad. If you are not careful while working with the
+node list interface, you may even end up with assertion errors from within the
+\TEX\ portion of the executable.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {latelua} and \lpr {lateluafunction}}]
+
+Contrary to \prm {directlua}, \lpr {latelua} stores \LUA\ code in a whatsit
+that will be processed at the time of shipping out. Its intended use is a cross
+between \PDF\ literals (often available as \orm {pdfliteral}) and the
+traditional \TEX\ extension \prm {write}. Within the \LUA\ code you can print
+\PDF\ statements directly to the \PDF\ file via \type {pdf.print}, or you can
+write to other output streams via \type {texio.write} or simply using \LUA\ \IO\
+routines.
+
+\startsyntax
+\latelua <general text>!crlf
+\latelua <16-bit number> <general text>
+\stopsyntax
+
+Expansion of macros in the final \type {<general text>} is delayed until just
+before the whatsit is executed (like in \prm {write}). With regard to \PDF\
+output stream \lpr {latelua} behaves as \PDF\ page literals. The \syntax
+{name <general text>} and \syntax {<16-bit number>} behave in the same way as
+they do for \prm {directlua}.
+
+The \lpr {lateluafunction} primitive takes a number and is similar to \lpr
+{luafunction} but gets delated to shipout time. It's just there for completeness.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luaescapestring}}]
+
+\topicindex {escaping}
+
+This primitive converts a \TEX\ token sequence so that it can be safely used as
+the contents of a \LUA\ string: embedded backslashes, double and single quotes,
+and newlines and carriage returns are escaped. This is done by prepending an
+extra token consisting of a backslash with category code~12, and for the line
+endings, converting them to \type {n} and \type {r} respectively. The token
+sequence is fully expanded.
+
+\startsyntax
+\luaescapestring <general text>
+\stopsyntax
+
+Most often, this command is not actually the best way to deal with the
+differences between \TEX\ and \LUA. In very short bits of \LUA\ code it is often
+not needed, and for longer stretches of \LUA\ code it is easier to keep the code
+in a separate file and load it using \LUA's \type {dofile}:
+
+\starttyping
+\directlua { dofile('mysetups.lua') }
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luafunction}, \lpr {luafunctioncall} and \lpr {luadef}}]
+
+The \prm {directlua} commands involves tokenization of its argument (after
+picking up an optional name or number specification). The tokenlist is then
+converted into a string and given to \LUA\ to turn into a function that is
+called. The overhead is rather small but when you have millions of calls it can
+have some impact. For this reason there is a variant call available: \lpr
+{luafunction}. This command is used as follows:
+
+\starttyping
+\directlua {
+ local t = lua.get_functions_table()
+ t[1] = function() tex.print("!") end
+ t[2] = function() tex.print("?") end
+}
+
+\luafunction1
+\luafunction2
+\stoptyping
+
+Of course the functions can also be defined in a separate file. There is no limit
+on the number of functions apart from normal \LUA\ limitations. Of course there
+is the limitation of no arguments but that would involve parsing and thereby give
+no gain. The function, when called in fact gets one argument, being the index, so
+in the following example the number \type {8} gets typeset.
+
+\starttyping
+\directlua {
+ local t = lua.get_functions_table()
+ t[8] = function(slot) tex.print(slot) end
+}
+\stoptyping
+
+The \lpr {luafunctioncall} primitive does the same but is unexpandable, for
+instance in an \prm {edef}. In addition \LUATEX\ provides a definer:
+
+\starttyping
+ \luadef\MyFunctionA 1
+ \global\luadef\MyFunctionB 2
+\protected\global\luadef\MyFunctionC 3
+\stoptyping
+
+You should really use these commands with care. Some references get stored in
+tokens and assume that the function is available when that token expands. On the
+other hand, as we have tested this functionality in relative complex situations
+normal usage should not give problems.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {luabytecode} and \lpr {luabytecodecall}}]
+
+Analogue to the function callers discussed in the previous section we have byte
+code callers. Again the call variant is unexpandable.
+
+\starttyping
+\directlua {
+ lua.bytecode[9998] = function(s)
+ tex.sprint(s*token.scan_int())
+ end
+ lua.bytecode[5555] = function(s)
+ tex.sprint(s*token.scan_dimen())
+ end
+}
+\stoptyping
+
+This works with:
+
+\starttyping
+\luabytecode 9998 5 \luabytecode 5555 5sp
+\luabytecodecall9998 5 \luabytecodecall5555 5sp
+\stoptyping
+
+The variable \type {s} in the code is the number of the byte code register that
+can be used for diagnostic purposes. The advantage of bytecode registers over
+function calls is that they are stored in the format (but without upvalues).
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Catcode tables}]
+
+\startsubsection[title={Catcodes}]
+
+\topicindex {catcodes}
+
+Catcode tables are a new feature that allows you to switch to a predefined
+catcode regime in a single statement. You can have a practically unlimited number
+of different tables. This subsystem is backward compatible: if you never use the
+following commands, your document will not notice any difference in behaviour
+compared to traditional \TEX. The contents of each catcode table is independent
+from any other catcode table, and its contents is stored and retrieved from the
+format file.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {catcodetable}}]
+
+\startsyntax
+\catcodetable <15-bit number>
+\stopsyntax
+
+The primitive \lpr {catcodetable} switches to a different catcode table. Such a
+table has to be previously created using one of the two primitives below, or it
+has to be zero. Table zero is initialized by \INITEX.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {initcatcodetable}}]
+
+\startsyntax
+\initcatcodetable <15-bit number>
+\stopsyntax
+
+The primitive \lpr {initcatcodetable} creates a new table with catcodes
+identical to those defined by \INITEX. The new catcode table is allocated
+globally: it will not go away after the current group has ended. If the supplied
+number is identical to the currently active table, an error is raised. The
+initial values are:
+
+\starttabulate[|c|c|l|l|]
+\DB catcode \BC character \BC equivalent \BC category \NC \NR
+\TB
+\NC 0 \NC \tttf \letterbackslash \NC \NC \type {escape} \NC \NR
+\NC 5 \NC \tttf \letterhat\letterhat M \NC return \NC \type {car_ret} \NC \NR
+\NC 9 \NC \tttf \letterhat\letterhat @ \NC null \NC \type {ignore} \NC \NR
+\NC 10 \NC \tttf <space> \NC space \NC \type {spacer} \NC \NR
+\NC 11 \NC {\tttf a} \endash\ {\tttf z} \NC \NC \type {letter} \NC \NR
+\NC 11 \NC {\tttf A} \endash\ {\tttf Z} \NC \NC \type {letter} \NC \NR
+\NC 12 \NC everything else \NC \NC \type {other} \NC \NR
+\NC 14 \NC \tttf \letterpercent \NC \NC \type {comment} \NC \NR
+\NC 15 \NC \tttf \letterhat\letterhat ? \NC delete \NC \type {invalid_char} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\lpr {savecatcodetable}}]
+
+\startsyntax
+\savecatcodetable <15-bit number>
+\stopsyntax
+
+\lpr {savecatcodetable} copies the current set of catcodes to a new table with
+the requested number. The definitions in this new table are all treated as if
+they were made in the outermost level.
+
+The new table is allocated globally: it will not go away after the current group
+has ended. If the supplied number is the currently active table, an error is
+raised.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Suppressing errors}]
+
+\startsubsection[title={\lpr {suppressfontnotfounderror}}]
+
+\topicindex {errors}
+
+If this integer parameter is non|-|zero, then \LUATEX\ will not complain about
+font metrics that are not found. Instead it will silently skip the font
+assignment, making the requested csname for the font \prm {ifx} equal to \prm
+{nullfont}, so that it can be tested against that without bothering the user.
+
+\startsyntax
+\suppressfontnotfounderror = 1
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {suppresslongerror}}]
+
+\topicindex {errors}
+
+If this integer parameter is non|-|zero, then \LUATEX\ will not complain about
+\prm {par} commands encountered in contexts where that is normally prohibited
+(most prominently in the arguments of macros not defined as \prm {long}).
+
+\startsyntax
+\suppresslongerror = 1
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {suppressifcsnameerror}}]
+
+\topicindex {errors}
+
+If this integer parameter is non|-|zero, then \LUATEX\ will not complain about
+non-expandable commands appearing in the middle of a \prm {ifcsname} expansion.
+Instead, it will keep getting expanded tokens from the input until it encounters
+an \prm {endcsname} command. If the input expansion is unbalanced with respect
+to \prm {csname} \ldots \prm {endcsname} pairs, the \LUATEX\ process may hang
+indefinitely.
+
+\startsyntax
+\suppressifcsnameerror = 1
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {suppressoutererror}}]
+
+\topicindex {errors}
+
+If this new integer parameter is non|-|zero, then \LUATEX\ will not complain
+about \prm {outer} commands encountered in contexts where that is normally
+prohibited.
+
+\startsyntax
+\suppressoutererror = 1
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {suppressmathparerror}}]
+
+\topicindex {errors}
+\topicindex {math}
+
+The following setting will permit \prm {par} tokens in a math formula:
+
+\startsyntax
+\suppressmathparerror = 1
+\stopsyntax
+
+So, the next code is valid then:
+
+\starttyping
+$ x + 1 =
+
+a $
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={\lpr {suppressprimitiveerror}}]
+
+\topicindex {errors}
+\topicindex {primitives}
+
+When set to a non|-|zero value the following command will not issue an error:
+
+\startsyntax
+\suppressprimitiveerror = 1
+
+\primitive\notaprimitive
+\stopsyntax
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Fonts}]
+
+\startsubsection[title={Font syntax}]
+
+\topicindex {fonts}
+
+\LUATEX\ will accept a braced argument as a font name:
+
+\starttyping
+\font\myfont = {cmr10}
+\stoptyping
+
+This allows for embedded spaces, without the need for double quotes. Macro
+expansion takes place inside the argument.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {fontid} and \lpr {setfontid}}]
+
+\startsyntax
+\fontid\font
+\stopsyntax
+
+This primitive expands into a number. It is not a register so there is no need to
+prefix with \prm {number} (and using \prm {the} gives an error). The currently
+used font id is \fontid\font. Here are some more:
+
+\starttabulate[|l|c|c|]
+\DB style \BC command \BC font id \NC \NR
+\TB
+\NC normal \NC \type {\tf} \NC \bf \fontid\font \NC \NR
+\NC bold \NC \type {\bf} \NC \bf \fontid\font \NC \NR
+\NC italic \NC \type {\it} \NC \it \fontid\font \NC \NR
+\NC bold italic \NC \type {\bi} \NC \bi \fontid\font \NC \NR
+\LL
+\stoptabulate
+
+These numbers depend on the macro package used because each one has its own way
+of dealing with fonts. They can also differ per run, as they can depend on the
+order of loading fonts. For instance, when in \CONTEXT\ virtual math \UNICODE\
+fonts are used, we can easily get over a hundred ids in use. Not all ids have to
+be bound to a real font, after all it's just a number.
+
+The primitive \lpr {setfontid} can be used to enable a font with the given id,
+which of course needs to be a valid one.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {noligs} and \lpr {nokerns}}]
+
+\topicindex {ligatures+suppress}
+\topicindex {kerns+suppress}
+
+These primitives prohibit ligature and kerning insertion at the time when the
+initial node list is built by \LUATEX's main control loop. You can enable these
+primitives when you want to do node list processing of \quote {characters}, where
+\TEX's normal processing would get in the way.
+
+\startsyntax
+\noligs <integer>!crlf
+\nokerns <integer>
+\stopsyntax
+
+These primitives can also be implemented by overloading the ligature building and
+kerning functions, i.e.\ by assigning dummy functions to their associated
+callbacks. Keep in mind that when you define a font (using \LUA) you can also
+omit the kern and ligature tables, which has the same effect as the above.
+
+\stopsubsection
+
+\startsubsection[title={\type{\nospaces}}]
+
+\topicindex {spaces+suppress}
+
+This new primitive can be used to overrule the usual \prm {spaceskip} related
+heuristics when a space character is seen in a text flow. The value~\type{1}
+triggers no injection while \type{2} results in injection of a zero skip. In \in
+{figure} [fig:nospaces] we see the results for four characters separated by a
+space.
+
+\startplacefigure[reference=fig:nospaces,title={The \lpr {nospaces} options.}]
+\startcombination[3*2]
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 10mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 1mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 1mm}}
+ {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 1mm}}
+\stopcombination
+\stopplacefigure
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Tokens, commands and strings}]
+
+\startsubsection[title={\lpr {scantextokens}}]
+
+\topicindex {tokens+scanning}
+
+The syntax of \lpr {scantextokens} is identical to \prm {scantokens}. This
+primitive is a slightly adapted version of \ETEX's \prm {scantokens}. The
+differences are:
+
+\startitemize
+\startitem
+ The last (and usually only) line does not have a \prm {endlinechar}
+ appended.
+\stopitem
+\startitem
+ \lpr {scantextokens} never raises an EOF error, and it does not execute
+ \prm {everyeof} tokens.
+\stopitem
+\startitem
+ There are no \quote {\unknown\ while end of file \unknown} error tests
+ executed. This allows the expansion to end on a different grouping level or
+ while a conditional is still incomplete.
+\stopitem
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title={\lpr {toksapp}, \lpr {tokspre}, \lpr {etoksapp}, \lpr {etokspre},
+\lpr {gtoksapp}, \lpr {gtokspre}, \lpr {xtoksapp}, \lpr {xtokspre}}]
+
+Instead of:
+
+\starttyping
+\toks0\expandafter{\the\toks0 foo}
+\stoptyping
+
+you can use:
+
+\starttyping
+\etoksapp0{foo}
+\stoptyping
+
+The \type {pre} variants prepend instead of append, and the \type {e} variants
+expand the passed general text. The \type {g} and \type {x} variants are global.
+
+\stopsubsection
+
+\startsubsection[title={\prm {csstring}, \lpr {begincsname} and \lpr {lastnamedcs}}]
+
+These are somewhat special. The \prm {csstring} primitive is like
+\prm {string} but it omits the leading escape character. This can be
+somewhat more efficient than stripping it afterwards.
+
+The \lpr {begincsname} primitive is like \prm {csname} but doesn't create
+a relaxed equivalent when there is no such name. It is equivalent to
+
+\starttyping
+\ifcsname foo\endcsname
+ \csname foo\endcsname
+\fi
+\stoptyping
+
+The advantage is that it saves a lookup (don't expect much speedup) but more
+important is that it avoids using the \prm {if} test. The \lpr {lastnamedcs}
+is one that should be used with care. The above example could be written as:
+
+\starttyping
+\ifcsname foo\endcsname
+ \lastnamedcs
+\fi
+\stoptyping
+
+This is slightly more efficient than constructing the string twice (deep down in
+\LUATEX\ this also involves some \UTF8 juggling), but probably more relevant is
+that it saves a few tokens and can make code a bit more readable.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {clearmarks}}]
+
+\topicindex {marks}
+
+This primitive complements the \ETEX\ mark primitives and clears a mark class
+completely, resetting all three connected mark texts to empty. It is an
+immediate command.
+
+\startsyntax
+\clearmarks <16-bit number>
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\lpr {alignmark} and \lpr {aligntab}}]
+
+The primitive \lpr {alignmark} duplicates the functionality of \type {#} inside
+alignment preambles, while \lpr {aligntab} duplicates the functionality of \type
+{&}.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {letcharcode}}]
+
+This primitive can be used to assign a meaning to an active character, as in:
+
+\starttyping
+\def\foo{bar} \letcharcode123=\foo
+\stoptyping
+
+This can be a bit nicer than using the uppercase tricks (using the property of
+\prm {uppercase} that it treats active characters special).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {glet}}]
+
+This primitive is similar to:
+
+\starttyping
+\protected\def\glet{\global\let}
+\stoptyping
+
+but faster (only measurable with millions of calls) and probably more convenient
+(after all we also have \type {\gdef}).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {expanded}, \lpr {immediateassignment} and \lpr {immediateassigned}}]
+
+\topicindex {expansion}
+
+The \lpr {expanded} primitive takes a token list and expands it content which can
+come in handy: it avoids a tricky mix of \prm {expandafter} and \prm {noexpand}.
+You can compare it with what happens inside the body of an \prm {edef}. But this
+kind of expansion it still doesn't expand some primitive operations.
+
+\startbuffer
+\newcount\NumberOfCalls
+
+\def\TestMe{\advance\NumberOfCalls1 }
+
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+The result is a macro that has the not expanded code in its body:
+
+\getbuffer
+
+Instead we can define \tex {TestMe} in a way that expands the assignment
+immediately. You need of course to be aware of preventing look ahead interference
+by using a space or \tex {relax} (often an expression works better as it doesn't
+leave an \tex {relax}).
+
+\startbuffer
+\def\TestMe{\immediateassignment\advance\NumberOfCalls1 }
+
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+\edef\Tested{\TestMe foo:\the\NumberOfCalls}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+This time the counter gets updates and we don't see interference in the
+resulting \tex {Tested} macro:
+
+\getbuffer
+
+Here is a somewhat silly example of expanded comparison:
+
+\startbuffer
+\def\expandeddoifelse#1#2#3#4%
+ {\immediateassignment\edef\tempa{#1}%
+ \immediateassignment\edef\tempb{#2}%
+ \ifx\tempa\tempb
+ \immediateassignment\def\next{#3}%
+ \else
+ \immediateassignment\def\next{#4}%
+ \fi
+ \next}
+
+\edef\Tested
+ {(\expandeddoifelse{abc}{def}{yes}{nop}/%
+ \expandeddoifelse{abc}{abc}{yes}{nop})}
+
+\meaning\Tested
+\stopbuffer
+
+\typebuffer
+
+It gives:
+
+\getbuffer
+
+A variant is:
+
+\starttyping
+\def\expandeddoifelse#1#2#3#4%
+ {\immediateassigned{
+ \edef\tempa{#1}%
+ \edef\tempb{#2}%
+ }%
+ \ifx\tempa\tempb
+ \immediateassignment\def\next{#3}%
+ \else
+ \immediateassignment\def\next{#4}%
+ \fi
+ \next}
+\stoptyping
+
+The possible error messages are the same as using assignments in preambles of
+alignments and after the \prm {accent} command. The supported assignments are the
+so called prefixed commands (except box assignments).
+
+\stopsubsection
+
+\startsubsection[title={\lpr {ifcondition}}]
+
+\topicindex {conditions}
+
+This is a somewhat special one. When you write macros conditions need to be
+properly balanced in order to let \TEX's fast branch skipping work well. This new
+primitive is basically a no||op flagged as a condition so that the scanner can
+recognize it as an if|-|test. However, when a real test takes place the work is
+done by what follows, in the next example \tex {something}.
+
+\starttyping
+\unexpanded\def\something#1#2%
+ {\edef\tempa{#1}%
+ \edef\tempb{#2}
+ \ifx\tempa\tempb}
+
+\ifcondition\something{a}{b}%
+ \ifcondition\something{a}{a}%
+ true 1
+ \else
+ false 1
+ \fi
+\else
+ \ifcondition\something{a}{a}%
+ true 2
+ \else
+ false 2
+ \fi
+\fi
+\stoptyping
+
+If you are familiar with \METAPOST, this is a bit like \type {vardef} where the macro
+has a return value. Here the return value is a test.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Boxes, rules and leaders}]
+
+\startsubsection[title={\lpr {outputbox}}]
+
+\topicindex {output}
+
+This integer parameter allows you to alter the number of the box that will be
+used to store the page sent to the output routine. Its default value is 255, and
+the acceptable range is from 0 to 65535.
+
+\startsyntax
+\outputbox = 12345
+\stopsyntax
+
+\stopsubsection
+
+\startsubsection[title={\prm {vpack}, \prm {hpack} and \prm {tpack}}]
+
+These three primitives are like \prm {vbox}, \prm {hbox} and \prm {vtop}
+but don't apply the related callbacks.
+
+\stopsubsection
+
+\startsubsection[title={\prm {vsplit}}]
+
+\topicindex {splitting}
+
+The \prm {vsplit} primitive has to be followed by a specification of the required
+height. As alternative for the \type {to} keyword you can use \type {upto} to get
+a split of the given size but result has the natural dimensions then.
+
+\stopsubsection
+
+\startsubsection[title={Images and reused box objects},reference=sec:imagedandforms]
+
+These two concepts are now core concepts and no longer whatsits. They are in fact
+now implemented as rules with special properties. Normal rules have subtype~0,
+saved boxes have subtype~1 and images have subtype~2. This has the positive side
+effect that whenever we need to take content with dimensions into account, when
+we look at rule nodes, we automatically also deal with these two types.
+
+The syntax of the \type {\save...resource} is the same as in \PDFTEX\ but you
+should consider them to be backend specific. This means that a macro package
+should treat them as such and check for the current output mode if applicable.
+
+\starttabulate[|l|p|]
+\DB command \BC explanation \NC \NR
+\TB
+\NC \lpr {saveboxresource} \NC save the box as an object to be included later \NC \NR
+\NC \lpr {saveimageresource} \NC save the image as an object to be included later \NC \NR
+\NC \lpr {useboxresource} \NC include the saved box object here (by index) \NC \NR
+\NC \lpr {useimageresource} \NC include the saved image object here (by index) \NC \NR
+\NC \lpr {lastsavedboxresourceindex} \NC the index of the last saved box object \NC \NR
+\NC \lpr {lastsavedimageresourceindex} \NC the index of the last saved image object \NC \NR
+\NC \lpr {lastsavedimageresourcepages} \NC the number of pages in the last saved image object \NC \NR
+\LL
+\stoptabulate
+
+\LUATEX\ accepts optional dimension parameters for \type {\use...resource} in the
+same format as for rules. With images, these dimensions are then used instead of
+the ones given to \lpr {useimageresource} but the original dimensions are not
+overwritten, so that a \lpr {useimageresource} without dimensions still
+provides the image with dimensions defined by \lpr {saveimageresource}. These
+optional parameters are not implemented for \lpr {saveboxresource}.
+
+\starttyping
+\useimageresource width 20mm height 10mm depth 5mm \lastsavedimageresourceindex
+\useboxresource width 20mm height 10mm depth 5mm \lastsavedboxresourceindex
+\stoptyping
+
+The box resources are of course implemented in the backend and therefore we do
+support the \type {attr} and \type {resources} keys that accept a token list. New
+is the \type {type} key. When set to non|-|zero the \type {/Type} entry is
+omitted. A value of 1 or 3 still writes a \type {/BBox}, while 2 or 3 will write
+a \type {/Matrix}.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {nohrule} and \lpr {novrule}}]
+
+\topicindex {rules}
+
+Because introducing a new keyword can cause incompatibilities, two new primitives
+were introduced: \lpr {nohrule} and \lpr {novrule}. These can be used to
+reserve space. This is often more efficient than creating an empty box with fake
+dimensions.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {gleaders}}]
+
+\topicindex {leaders}
+
+This type of leaders is anchored to the origin of the box to be shipped out. So
+they are like normal \prm {leaders} in that they align nicely, except that the
+alignment is based on the {\it largest\/} enclosing box instead of the {\it
+smallest\/}. The \type {g} stresses this global nature.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Languages}]
+
+\startsubsection[title={\lpr {hyphenationmin}}]
+
+\topicindex {languages}
+\topicindex {hyphenation}
+
+This primitive can be used to set the minimal word length, so setting it to a value
+of~$5$ means that only words of 6 characters and more will be hyphenated, of course
+within the constraints of the \prm {lefthyphenmin} and \prm {righthyphenmin}
+values (as stored in the glyph node). This primitive accepts a number and stores
+the value with the language.
+
+\stopsubsection
+
+\startsubsection[title={\prm {boundary}, \prm {noboundary}, \prm {protrusionboundary} and \prm {wordboundary}}]
+
+The \prm {noboundary} command is used to inject a whatsit node but now injects a normal
+node with type \nod {boundary} and subtype~0. In addition you can say:
+
+\starttyping
+x\boundary 123\relax y
+\stoptyping
+
+This has the same effect but the subtype is now~1 and the value~123 is stored.
+The traditional ligature builder still sees this as a cancel boundary directive
+but at the \LUA\ end you can implement different behaviour. The added benefit of
+passing this value is a side effect of the generalization. The subtypes~2 and~3
+are used to control protrusion and word boundaries in hyphenation and have
+related primitives.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Control and debugging}]
+
+\startsubsection[title={Tracing}]
+
+\topicindex {tracing}
+
+If \prm {tracingonline} is larger than~2, the node list display will also print
+the node number of the nodes.
+
+\stopsubsection
+
+\startsubsection[title={\lpr {outputmode}}]
+
+\topicindex {output}
+\topicindex {backend}
+
+The \lpr {outputmode} variable tells \LUATEX\ what it has to produce:
+
+\starttabulate[|l|l|]
+\DB value \BC output \NC \NR
+\TB
+\NC \type {0} \NC \DVI\ code \NC \NR
+\NC \type {1} \NC \PDF\ code \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\lpr {draftmode}}]
+
+The value of the \lpr {draftmode} counter signals the backend if it should output
+less. The \PDF\ backend accepts a value of~1, while the \DVI\ backend ignores the
+value. This is no critical feature so we can remove it in future versions when it
+can make the backend cleaner.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Files}]
+
+\startsubsection[title={File syntax}]
+
+\topicindex {files+names}
+
+\LUATEX\ will accept a braced argument as a file name:
+
+\starttyping
+\input {plain}
+\openin 0 {plain}
+\stoptyping
+
+This allows for embedded spaces, without the need for double quotes. Macro
+expansion takes place inside the argument.
+
+The \lpr {tracingfonts} primitive that has been inherited from \PDFTEX\ has
+been adapted to support variants in reporting the font. The reason for this
+extension is that a csname not always makes sense. The zero case is the default.
+
+\starttabulate[|l|l|]
+\DB value \BC reported \NC \NR
+\TB
+\NC \type{0} \NC \type{\foo xyz} \NC \NR
+\NC \type{1} \NC \type{\foo (bar)} \NC \NR
+\NC \type{2} \NC \type{<bar> xyz} \NC \NR
+\NC \type{3} \NC \type{<bar @ ..pt> xyz} \NC \NR
+\NC \type{4} \NC \type{<id>} \NC \NR
+\NC \type{5} \NC \type{<id: bar>} \NC \NR
+\NC \type{6} \NC \type{<id: bar @ ..pt> xyz} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Writing to file}]
+
+\topicindex {files+writing}
+
+You can now open upto 127 files with \prm {openout}. When no file is open
+writes will go to the console and log. As a consequence a system command is
+no longer possible but one can use \type {os.execute} to do the same.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Math}]
+
+\topicindex {math}
+
+We will cover math extensions in its own chapter because not only the font
+subsystem and spacing model have been enhanced (thereby introducing many new
+primitives) but also because some more control has been added to existing
+functionality. Much of this relates to the different approaches of traditional
+\TEX\ fonts and \OPENTYPE\ math.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-export-titlepage.tex b/systems/doc/luatex/luatex-export-titlepage.tex
new file mode 100644
index 0000000000..db841a7851
--- /dev/null
+++ b/systems/doc/luatex/luatex-export-titlepage.tex
@@ -0,0 +1,31 @@
+\environment luatex-style
+
+\startcomponent luatex-export-titlepage
+
+\setupexport
+ [cssfile=extra-styles.css]
+
+\settaggedmetadata
+ [ title={LuaTeX Reference Manual},
+ copyright={LuaTeX Development Team},
+ version={\documentvariable{version}},
+ status={\documentvariable{status}},
+ snapshot={\documentvariable{snapshot}},
+ date={\rawdate[weekday,day,month,year]},
+ url={www.luatex.org}]
+
+\setupbackgrounds
+ [leftpage]
+ [setups=pagenumber:left]
+
+\setupbackgrounds
+ [rightpage]
+ [setups=pagenumber:right]
+
+\startpreamble
+ This document is derived from the original manual. When examples are given,
+ they assume processing by \LUATEX\ and therefore will not show up as
+ intended. The \PDF\ version is the real reference.
+\stoppreamble
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-firstpage.tex b/systems/doc/luatex/luatex-firstpage.tex
new file mode 100644
index 0000000000..e64cc61528
--- /dev/null
+++ b/systems/doc/luatex/luatex-firstpage.tex
@@ -0,0 +1,32 @@
+\startcomponent luatex-firstpage
+
+\startstandardmakeup
+
+ \start
+ \raggedleft
+ \definedfont[Bold*default at 48pt]
+ \setupinterlinespace
+ \blue \documentvariable{manual} \endgraf Reference \endgraf Manual \endgraf
+ \stop
+
+ \vfill
+
+ \definedfont[Bold*default at 12pt]
+
+ \starttabulate[|l|l|]
+ \NC copyright \EQ Lua\TeX\ development team \NC \NR
+ \NC more info \EQ www.luatex.org \NC \NR
+ \NC version \EQ \currentdate \doifsomething{\documentvariable{snapshot}}{(snapshot \documentvariable{snapshot})} \NC \NR
+ \stoptabulate
+
+\stopstandardmakeup
+
+\setupbackgrounds
+ [leftpage]
+ [setups=pagenumber:left]
+
+\setupbackgrounds
+ [rightpage]
+ [setups=pagenumber:right]
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-fontloader.tex b/systems/doc/luatex/luatex-fontloader.tex
new file mode 100644
index 0000000000..e99ea1d2ff
--- /dev/null
+++ b/systems/doc/luatex/luatex-fontloader.tex
@@ -0,0 +1,1164 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-fontloader
+
+\startchapter[reference=fontloader,title={The fontloader}]
+
+\topicindex {fonts+loading}
+
+The fontloader library is sort of independent of the rest in the sense that it
+can load font into a \LUA\ table that then can be converted into a table suitable
+for \TEX. The library is an adapted subset of \FONTFORGE\ and as such gives a
+similar view on a font (which has advantages when you want to debug). We will not
+discuss \OPENTYPE\ in detail here as the \MICROSOFT\ website offers enough
+information about it. The tables returned by the loader are not that far from the
+standard. We have no plans to extend the loader (it may even become an external
+module at some time).
+
+\startsection[title={Getting quick information on a font}][library=fontloader]
+
+\topicindex {fonts+information}
+
+\libindex{info}
+
+When you want to locate font by name you need some basic information that is
+hidden in the font files. For that reason we provide an efficient helper that
+gets the basic information without loading all of the font. Normally this helper
+is used to create a font (name) database.
+
+\startfunctioncall
+<table> info =
+ fontloader.info(<string> filename)
+\stopfunctioncall
+
+This function returns either \type {nil}, or a \type {table}, or an array of
+small tables (in the case of a \TRUETYPE\ collection). The returned table(s) will
+contain some fairly interesting information items from the font(s) defined by the
+file:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{fontname} \NC string \NC the \POSTSCRIPT\ name of the font\NC \NR
+\NC \type{fullname} \NC string \NC the formal name of the font\NC \NR
+\NC \type{familyname} \NC string \NC the family name this font belongs to\NC \NR
+\NC \type{weight} \NC string \NC a string indicating the color value of the font\NC \NR
+\NC \type{version} \NC string \NC the internal font version\NC \NR
+\NC \type{italicangle} \NC float \NC the slant angle\NC \NR
+\NC \type{units_per_em} \NC number \NC 1000 for \POSTSCRIPT-based fonts, usually 2048 for \TRUETYPE\NC \NR
+\NC \type{pfminfo} \NC table \NC (see \in{section}[fontloaderpfminfotable])\NC \NR
+\LL
+\stoptabulate
+
+Getting information through this function is (sometimes much) more efficient than
+loading the font properly, and is therefore handy when you want to create a
+dictionary of available fonts based on a directory contents.
+
+\stopsection
+
+\startsection[title={Loading an \OPENTYPE\ or \TRUETYPE\ file}][library=fontloader]
+
+\topicindex {\OPENTYPE}
+\topicindex {\TRUETYPE}
+
+\libindex{open}
+\libindex{close}
+\libindex{to_table}
+
+If you want to use an \OPENTYPE\ font, you have to get the metric information
+from somewhere. Using the \type {fontloader} library, the simplest way to get
+that information is thus:
+
+\starttyping
+function load_font (filename)
+ local metrics = nil
+ local font = fontloader.open(filename)
+ if font then
+ metrics = fontloader.to_table(font)
+ fontloader.close(font)
+ end
+ return metrics
+end
+
+myfont = load_font('/opt/tex/texmf/fonts/data/arial.ttf')
+\stoptyping
+
+The main function call is
+
+\startfunctioncall
+<userdata> f, <table> w = fontloader.open(<string> filename)
+<userdata> f, <table> w = fontloader.open(<string> filename, <string> fontname)
+\stopfunctioncall
+
+The first return value is a userdata representation of the font. The second
+return value is a table containing any warnings and errors reported by fontloader
+while opening the font. In normal typesetting, you would probably ignore the
+second argument, but it can be useful for debugging purposes.
+
+For \TRUETYPE\ collections (when filename ends in 'ttc') and \DFONT\ collections,
+you have to use a second string argument to specify which font you want from the
+collection. Use the \type {fontname} strings that are returned by \type
+{fontloader.info} for that.
+
+To turn the font into a table, \type {fontloader.to_table} is used on the font
+returned by \type {fontloader.open}.
+
+\startfunctioncall
+<table> f = fontloader.to_table(<userdata> font)
+\stopfunctioncall
+
+This table cannot be used directly by \LUATEX\ and should be turned into another
+one as described in~\in {chapter} [fonts]. Do not forget to store the \type
+{fontname} value in the \type {psname} field of the metrics table to be returned
+to \LUATEX, otherwise the font inclusion backend will not be able to find the
+correct font in the collection.
+
+See \in {section} [fontloadertables] for details on the userdata object returned
+by \type {fontloader.open} and the layout of the \type {metrics} table returned
+by \type {fontloader.to_table}.
+
+The font file is parsed and partially interpreted by the font loading routines
+from \FONTFORGE. The file format can be \OPENTYPE, \TRUETYPE, \TRUETYPE\
+Collection, \CFF, or \TYPEONE.
+
+There are a few advantages to this approach compared to reading the actual font
+file ourselves:
+
+\startitemize
+
+\startitem
+ The font is automatically re|-|encoded, so that the \type {metrics} table for
+ \TRUETYPE\ and \OPENTYPE\ fonts is using \UNICODE\ for the character indices.
+\stopitem
+
+\startitem
+ Many features are pre|-|processed into a format that is easier to handle than
+ just the bare tables would be.
+\stopitem
+
+\startitem
+ \POSTSCRIPT|-|based \OPENTYPE\ fonts do not store the character height and
+ depth in the font file, so the character boundingbox has to be calculated in
+ some way.
+\stopitem
+
+\stopitemize
+
+A loaded font is discarded with:
+
+\startfunctioncall
+fontloader.close(<userdata> font)
+\stopfunctioncall
+
+\stopsection
+
+\startsection[title={Applying a \quote{feature file}}][library=fontloader]
+
+\libindex{apply_featurefile}
+
+You can apply a \quote{feature file} to a loaded font:
+
+\startfunctioncall
+<table> errors = fontloader.apply_featurefile(<userdata> font, <string> filename)
+\stopfunctioncall
+
+A \quote {feature file} is a textual representation of the features in an
+\OPENTYPE\ font. See
+
+\starttyping
+http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html
+\stoptyping
+
+and
+
+\starttyping
+http://fontforge.sourceforge.net/featurefile.html
+\stoptyping
+
+for a more detailed description of feature files.
+
+If the function fails, the return value is a table containing any errors reported
+by fontloader while applying the feature file. On success, \type {nil} is
+returned.
+
+\stopsection
+
+\startsection[title={Applying an \quote{\AFM\ file}}][library=fontloader]
+
+\topicindex {\TYPEONE}
+
+\libindex{apply_afmfile}
+
+You can apply an \quote {\AFM\ file} to a loaded font:
+
+\startfunctioncall
+<table> errors = fontloader.apply_afmfile(<userdata> font, <string> filename)
+\stopfunctioncall
+
+An \AFM\ file is a textual representation of (some of) the meta information
+in a \TYPEONE\ font. See
+
+\starttyping
+ftp://ftp.math.utah.edu/u/ma/hohn/linux/postscript/5004.AFM_Spec.pdf
+\stoptyping
+
+for more information about \AFM\ files.
+
+Note: If you \type {fontloader.open} a \TYPEONE\ file named \type {font.pfb},
+the library will automatically search for and apply \type {font.afm} if it exists
+in the same directory as the file \type {font.pfb}. In that case, there is no
+need for an explicit call to \type {apply_afmfile()}.
+
+If the function fails, the return value is a table containing any errors reported
+by fontloader while applying the AFM file. On success, \type {nil} is returned.
+
+\stopsection
+
+\startsection[title={Fontloader font tables},reference=fontloadertables][library=fontloader]
+
+\topicindex {fontloader+tables}
+
+\libindex{fields}
+
+As mentioned earlier, the return value of \type {fontloader.open} is a userdata
+object. One way to have access to the actual metrics is to call \type
+{fontloader.to_table} on this object, returning the table structure that is
+explained in the following sections. In teh following sections we will not
+explain each field in detail. Most fields are self descriptive and for the more
+technical aspects you need to consult the relevant font references.
+
+It turns out that the result from \type {fontloader.to_table} sometimes needs
+very large amounts of memory (depending on the font's complexity and size) so it
+is possible to access the userdata object directly.
+
+\startitemize
+\startitem
+ All top|-|level keys that would be returned by \type {to_table()}
+ can also be accessed directly.
+\stopitem
+\startitem
+ The top|-|level key \quote {glyphs} returns a {\it virtual\/} array that
+ allows indices from \type {f.glyphmin} to (\type {f.glyphmax}).
+\stopitem
+\startitem
+ The items in that virtual array (the actual glyphs) are themselves also
+ userdata objects, and each has accessors for all of the keys explained in the
+ section \quote {Glyph items} below.
+\stopitem
+\startitem
+ The top|-|level key \quote {subfonts} returns an {\it actual} array of userdata
+ objects, one for each of the subfonts (or nil, if there are no subfonts).
+\stopitem
+\stopitemize
+
+A short example may be helpful. This code generates a printout of all
+the glyph names in the font \type {PunkNova.kern.otf}:
+
+\starttyping
+local f = fontloader.open('PunkNova.kern.otf')
+print (f.fontname)
+local i = 0
+if f.glyphcnt > 0 then
+ for i=f.glyphmin,f.glyphmax do
+ local g = f.glyphs[i]
+ if g then
+ print(g.name)
+ end
+ i = i + 1
+ end
+end
+fontloader.close(f)
+\stoptyping
+
+In this case, the \LUATEX\ memory requirement stays below 100MB on the test
+computer, while the internal structure generated by \type {to_table()} needs more
+than 2GB of memory (the font itself is 6.9MB in disk size).
+
+Only the top|-|level font, the subfont table entries, and the glyphs are virtual
+objects, everything else still produces normal \LUA\ values and tables.
+
+If you want to know the valid fields in a font or glyph structure, call the \type
+{fields} function on an object of a particular type (either glyph or font):
+
+\startfunctioncall
+<table> fields = fontloader.fields(<userdata> font)
+<table> fields = fontloader.fields(<userdata> font_glyph)
+\stopfunctioncall
+
+For instance:
+
+\startfunctioncall
+local fields = fontloader.fields(f)
+local fields = fontloader.fields(f.glyphs[0])
+\stopfunctioncall
+
+\stopsection
+
+\startsection[title={Table types}][library=fontloader]
+
+\startsubsection[title={The main table}]
+
+The top|-|level keys in the returned table are (the explanations in this part of
+the documentation are not yet finished):
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \NC explanation \NC \NR
+\TB
+\NC \type{table_version} \NC number \NC indicates the metrics version (currently~0.3)\NC \NR
+\NC \type{fontname} \NC string \NC \POSTSCRIPT\ font name\NC \NR
+\NC \type{fullname} \NC string \NC official (human-oriented) font name\NC \NR
+\NC \type{familyname} \NC string \NC family name\NC \NR
+\NC \type{weight} \NC string \NC weight indicator\NC \NR
+\NC \type{copyright} \NC string \NC copyright information\NC \NR
+\NC \type{filename} \NC string \NC the file name\NC \NR
+\NC \type{version} \NC string \NC font version\NC \NR
+\NC \type{italicangle} \NC float \NC slant angle\NC \NR
+\NC \type{units_per_em} \NC number \NC 1000 for \POSTSCRIPT-based fonts, usually 2048 for \TRUETYPE\NC \NR
+\NC \type{ascent} \NC number \NC height of ascender in \type {units_per_em}\NC \NR
+\NC \type{descent} \NC number \NC depth of descender in \type {units_per_em}\NC \NR
+\NC \type{upos} \NC float \NC \NC \NR
+\NC \type{uwidth} \NC float \NC \NC \NR
+\NC \type{uniqueid} \NC number \NC \NC \NR
+\NC \type{glyphs} \NC array \NC \NC \NR
+\NC \type{glyphcnt} \NC number \NC number of included glyphs\NC \NR
+\NC \type{glyphmax} \NC number \NC maximum used index the glyphs array\NC \NR
+\NC \type{glyphmin} \NC number \NC minimum used index the glyphs array\NC \NR
+\NC \type{notdef_loc} \NC number \NC location of the \type {.notdef} glyph
+ or \type {-1} when not present \NC \NR
+\NC \type{hasvmetrics} \NC number \NC \NC \NR
+\NC \type{onlybitmaps} \NC number \NC \NC \NR
+\NC \type{serifcheck} \NC number \NC \NC \NR
+\NC \type{isserif} \NC number \NC \NC \NR
+\NC \type{issans} \NC number \NC \NC \NR
+\NC \type{encodingchanged} \NC number \NC \NC \NR
+\NC \type{strokedfont} \NC number \NC \NC \NR
+\NC \type{use_typo_metrics} \NC number \NC \NC \NR
+\NC \type{weight_width_slope_only} \NC number \NC \NC \NR
+\NC \type{head_optimized_for_cleartype} \NC number \NC \NC \NR
+\NC \type{uni_interp} \NC enum \NC \nod {unset}, \type {none}, \type {adobe},
+ \type {greek}, \type {japanese}, \type {trad_chinese},
+ \type {simp_chinese}, \type {korean}, \type {ams}\NC \NR
+\NC \type{origname} \NC string \NC the file name, as supplied by the user\NC \NR
+\NC \type{map} \NC table \NC \NC \NR
+\NC \type{private} \NC table \NC \NC \NR
+\NC \type{xuid} \NC string \NC \NC \NR
+\NC \type{pfminfo} \NC table \NC \NC \NR
+\NC \type{names} \NC table \NC \NC \NR
+\NC \type{cidinfo} \NC table \NC \NC \NR
+\NC \type{subfonts} \NC array \NC \NC \NR
+\NC \type{commments} \NC string \NC \NC \NR
+\NC \type{fontlog} \NC string \NC \NC \NR
+\NC \type{cvt_names} \NC string \NC \NC \NR
+\NC \type{anchor_classes} \NC table \NC \NC \NR
+\NC \type{ttf_tables} \NC table \NC \NC \NR
+\NC \type{ttf_tab_saved} \NC table \NC \NC \NR
+\NC \type{kerns} \NC table \NC \NC \NR
+\NC \type{vkerns} \NC table \NC \NC \NR
+\NC \type{texdata} \NC table \NC \NC \NR
+\NC \type{lookups} \NC table \NC \NC \NR
+\NC \type{gpos} \NC table \NC \NC \NR
+\NC \type{gsub} \NC table \NC \NC \NR
+\NC \type{mm} \NC table \NC \NC \NR
+\NC \type{chosenname} \NC string \NC \NC \NR
+\NC \type{macstyle} \NC number \NC \NC \NR
+\NC \type{fondname} \NC string \NC \NC \NR
+%NC \type{design_size} \NC number \NC \NC \NR
+\NC \type{fontstyle_id} \NC number \NC \NC \NR
+\NC \type{fontstyle_name} \NC table \NC \NC \NR
+%NC \type{design_range_bottom} \NC number \NC \NC \NR
+%NC \type{design_range_top} \NC number \NC \NC \NR
+\NC \type{strokewidth} \NC float \NC \NC \NR
+\NC \type{mark_classes} \NC table \NC \NC \NR
+\NC \type{creationtime} \NC number \NC \NC \NR
+\NC \type{modificationtime} \NC number \NC \NC \NR
+\NC \type{os2_version} \NC number \NC \NC \NR
+\NC \type{math} \NC table \NC \NC \NR
+\NC \type{validation_state} \NC table \NC \NC \NR
+\NC \type{horiz_base} \NC table \NC \NC \NR
+\NC \type{vert_base} \NC table \NC \NC \NR
+\NC \type{extrema_bound} \NC number \NC \NC \NR
+\NC \type{truetype} \NC boolean \NC signals a \TRUETYPE\ font \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {glyphs}}]
+
+The \type {glyphs} is an array containing the per|-|character
+information (quite a few of these are only present if non|-|zero).
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{name} \NC string \NC the glyph name \NC \NR
+\NC \type{unicode} \NC number \NC unicode code point, or -1 \NC \NR
+\NC \type{boundingbox} \NC array \NC array of four numbers, see note below \NC \NR
+\NC \type{width} \NC number \NC only for horizontal fonts \NC \NR
+\NC \type{vwidth} \NC number \NC only for vertical fonts \NC \NR
+\NC \type{tsidebearing} \NC number \NC only for vertical ttf/otf fonts, and only if non|-|zero \NC \NR
+\NC \type{lsidebearing} \NC number \NC only if non|-|zero and not equal to boundingbox[1] \NC \NR
+\NC \type{class} \NC string \NC one of "none", "base", "ligature", "mark", "component"
+ (if not present, the glyph class is \quote {automatic}) \NC \NR
+\NC \type{kerns} \NC array \NC only for horizontal fonts, if set \NC \NR
+\NC \type{vkerns} \NC array \NC only for vertical fonts, if set \NC \NR
+\NC \type{dependents} \NC array \NC linear array of glyph name strings, only if nonempty\NC \NR
+\NC \type{lookups} \NC table \NC only if nonempty \NC \NR
+\NC \type{ligatures} \NC table \NC only if nonempty \NC \NR
+\NC \type{anchors} \NC table \NC only if set \NC \NR
+\NC \type{comment} \NC string \NC only if set \NC \NR
+\NC \type{tex_height} \NC number \NC only if set \NC \NR
+\NC \type{tex_depth} \NC number \NC only if set \NC \NR
+\NC \type{italic_correction} \NC number \NC only if set \NC \NR
+\NC \type{top_accent} \NC number \NC only if set \NC \NR
+\NC \type{is_extended_shape} \NC number \NC only if this character is part of a math extension list \NC \NR
+\NC \type{altuni} \NC table \NC alternate \UNICODE\ items \NC \NR
+\NC \type{vert_variants} \NC table \NC \NC \NR
+\NC \type{horiz_variants} \NC table \NC \NC \NR
+\NC \type{mathkern} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+On \type {boundingbox}: The boundingbox information for \TRUETYPE\ fonts and
+\TRUETYPE-based \OTF\ fonts is read directly from the font file.
+\POSTSCRIPT-based fonts do not have this information, so the boundingbox of
+traditional \POSTSCRIPT\ fonts is generated by interpreting the actual bezier
+curves to find the exact boundingbox. This can be a slow process, so the
+boundingboxes of \POSTSCRIPT-based \OTF\ fonts (and raw \CFF\ fonts) are
+calculated using an approximation of the glyph shape based on the actual glyph
+points only, instead of taking the whole curve into account. This means that
+glyphs that have missing points at extrema will have a too|-|tight boundingbox,
+but the processing is so much faster that in our opinion the tradeoff is worth
+it.
+
+The \type {kerns} and \type {vkerns} are linear arrays of small hashes:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{char} \NC string \NC \NC \NR
+\NC \type{off} \NC number \NC \NC \NR
+\NC \type{lookup} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {lookups} is a hash, based on lookup subtable names, with
+the value of each key inside that a linear array of small hashes:
+
+% TODO: fix this description
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{type} \NC enum \NC \type {position}, \type {pair}, \type
+ {substitution}, \type {alternate}, \type
+ {multiple}, \type {ligature}, \type
+ {lcaret}, \cbk {kerning}, \type {vkerning},
+ \type {anchors}, \type {contextpos}, \type
+ {contextsub}, \type {chainpos}, \type
+ {chainsub}, \type {reversesub}, \type
+ {max}, \type {kernback}, \type {vkernback}
+ \NC \NR
+\NC \type{specification} \NC table \NC extra data \NC \NR
+\LL
+\stoptabulate
+
+For the first seven values of \type {type}, there can be additional
+sub|-|information, stored in the sub-table \type {specification}:
+
+\starttabulate[|l|l|p|]
+\DB value \BC type \BC explanation \NC \NR
+\TB
+\NC \type{position} \NC table \NC a table of the \type {offset_specs} type \NC \NR
+\NC \type{pair} \NC table \NC one string: \type {paired}, and an array of one
+ or two \type {offset_specs} tables: \type {offsets} \NC \NR
+\NC \type{substitution} \NC table \NC one string: \type {variant} \NC \NR
+\NC \type{alternate} \NC table \NC one string: \type {components} \NC \NR
+\NC \type{multiple} \NC table \NC one string: \type {components} \NC \NR
+\NC \type{ligature} \NC table \NC two strings: \type {components}, \type {char} \NC \NR
+\NC \type{lcaret} \NC array \NC linear array of numbers \NC \NR
+\LL
+\stoptabulate
+
+Tables for \type {offset_specs} contain up to four number|-|valued fields: \type
+{x} (a horizontal offset), \type {y} (a vertical offset), \type {h} (an advance
+width correction) and \type {v} (an advance height correction).
+
+The \type {ligatures} is a linear array of small hashes:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{lig} \NC table \NC uses the same substructure as a single item in
+ the \type {lookups} table explained above \NC \NR
+\NC \type{char} \NC string \NC \NC \NR
+\NC \type{components} \NC array \NC linear array of named components \NC \NR
+\NC \type{ccnt} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {anchor} table is indexed by a string signifying the anchor type, which
+is one of:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{mark} \NC table \NC placement mark \NC \NR
+\NC \type{basechar} \NC table \NC mark for attaching combining items to a base char \NC \NR
+\NC \type{baselig} \NC table \NC mark for attaching combining items to a ligature \NC \NR
+\NC \type{basemark} \NC table \NC generic mark for attaching combining items to connect to \NC \NR
+\NC \type{centry} \NC table \NC cursive entry point \NC \NR
+\NC \type{cexit} \NC table \NC cursive exit point \NC \NR
+\LL
+\stoptabulate
+
+The content of these is a short array of defined anchors, with the
+entry keys being the anchor names. For all except \type {baselig}, the
+value is a single table with this definition:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{x} \NC number \NC x location \NC \NR
+\NC \type{y} \NC number \NC y location \NC \NR
+\NC \type{ttf_pt_index} \NC number \NC truetype point index, only if given \NC \NR
+\LL
+\stoptabulate
+
+For \type {baselig}, the value is a small array of such anchor sets sets, one for
+each constituent item of the ligature.
+
+For clarification, an anchor table could for example look like this :
+
+\starttyping
+['anchor'] = {
+ ['basemark'] = {
+ ['Anchor-7'] = { ['x']=170, ['y']=1080 }
+ },
+ ['mark'] ={
+ ['Anchor-1'] = { ['x']=160, ['y']=810 },
+ ['Anchor-4'] = { ['x']=160, ['y']=800 }
+ },
+ ['baselig'] = {
+ [1] = { ['Anchor-2'] = { ['x']=160, ['y']=650 } },
+ [2] = { ['Anchor-2'] = { ['x']=460, ['y']=640 } }
+ }
+ }
+\stoptyping
+
+Note: The \type {baselig} table can be sparse!
+
+\stopsubsection
+
+\startsubsection[title={\type {map}}]
+
+The top|-|level map is a list of encoding mappings. Each of those is a table
+itself.
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{enccount} \NC number \NC \NC \NR
+\NC \type{encmax} \NC number \NC \NC \NR
+\NC \type{backmax} \NC number \NC \NC \NR
+\NC \type{remap} \NC table \NC \NC \NR
+\NC \type{map} \NC array \NC non|-|linear array of mappings\NC \NR
+\NC \type{backmap} \NC array \NC non|-|linear array of backward mappings\NC \NR
+\NC \type{enc} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {remap} table is very small:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{firstenc} \NC number \NC \NC \NR
+\NC \type{lastenc} \NC number \NC \NC \NR
+\NC \type{infont} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {enc} table is a bit more verbose:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{enc_name} \NC string \NC \NC \NR
+\NC \type{char_cnt} \NC number \NC \NC \NR
+\NC \type{char_max} \NC number \NC \NC \NR
+\NC \type{unicode} \NC array \NC of \UNICODE\ position numbers\NC \NR
+\NC \type{psnames} \NC array \NC of \POSTSCRIPT\ glyph names\NC \NR
+\NC \type{builtin} \NC number \NC \NC \NR
+\NC \type{hidden} \NC number \NC \NC \NR
+\NC \type{only_1byte} \NC number \NC \NC \NR
+\NC \type{has_1byte} \NC number \NC \NC \NR
+\NC \type{has_2byte} \NC number \NC \NC \NR
+\NC \type{is_unicodebmp} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_unicodefull} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_custom} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_original} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_compact} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_japanese} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_korean} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{is_tradchinese} \NC number \NC only if non|-|zero [name?]\NC \NR
+\NC \type{is_simplechinese} \NC number \NC only if non|-|zero\NC \NR
+\NC \type{low_page} \NC number \NC \NC \NR
+\NC \type{high_page} \NC number \NC \NC \NR
+\NC \type{iconv_name} \NC string \NC \NC \NR
+\NC \type{iso_2022_escape} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {private}}]
+
+This is the font's private \POSTSCRIPT\ dictionary, if any. Keys and values are
+both strings.
+
+\stopsubsection
+
+\startsubsection[title={\type {cidinfo}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{registry} \NC string \NC \NC \NR
+\NC \type{ordering} \NC string \NC \NC \NR
+\NC \type{supplement} \NC number \NC \NC \NR
+\NC \type{version} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[reference=fontloaderpfminfotable,title={\type {pfminfo}}]
+
+The \type {pfminfo} table contains most of the OS/2 information:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{pfmset} \NC number \NC \NC \NR
+\NC \type{winascent_add} \NC number \NC \NC \NR
+\NC \type{windescent_add} \NC number \NC \NC \NR
+\NC \type{hheadascent_add} \NC number \NC \NC \NR
+\NC \type{hheaddescent_add} \NC number \NC \NC \NR
+\NC \type{typoascent_add} \NC number \NC \NC \NR
+\NC \type{typodescent_add} \NC number \NC \NC \NR
+\NC \type{subsuper_set} \NC number \NC \NC \NR
+\NC \type{panose_set} \NC number \NC \NC \NR
+\NC \type{hheadset} \NC number \NC \NC \NR
+\NC \type{vheadset} \NC number \NC \NC \NR
+\NC \type{pfmfamily} \NC number \NC \NC \NR
+\NC \type{weight} \NC number \NC \NC \NR
+\NC \type{width} \NC number \NC \NC \NR
+\NC \type{avgwidth} \NC number \NC \NC \NR
+\NC \type{firstchar} \NC number \NC \NC \NR
+\NC \type{lastchar} \NC number \NC \NC \NR
+\NC \type{fstype} \NC number \NC \NC \NR
+\NC \type{linegap} \NC number \NC \NC \NR
+\NC \type{vlinegap} \NC number \NC \NC \NR
+\NC \type{hhead_ascent} \NC number \NC \NC \NR
+\NC \type{hhead_descent} \NC number \NC \NC \NR
+\NC \type{os2_typoascent} \NC number \NC \NC \NR
+\NC \type{os2_typodescent} \NC number \NC \NC \NR
+\NC \type{os2_typolinegap} \NC number \NC \NC \NR
+\NC \type{os2_winascent} \NC number \NC \NC \NR
+\NC \type{os2_windescent} \NC number \NC \NC \NR
+\NC \type{os2_subxsize} \NC number \NC \NC \NR
+\NC \type{os2_subysize} \NC number \NC \NC \NR
+\NC \type{os2_subxoff} \NC number \NC \NC \NR
+\NC \type{os2_subyoff} \NC number \NC \NC \NR
+\NC \type{os2_supxsize} \NC number \NC \NC \NR
+\NC \type{os2_supysize} \NC number \NC \NC \NR
+\NC \type{os2_supxoff} \NC number \NC \NC \NR
+\NC \type{os2_supyoff} \NC number \NC \NC \NR
+\NC \type{os2_strikeysize} \NC number \NC \NC \NR
+\NC \type{os2_strikeypos} \NC number \NC \NC \NR
+\NC \type{os2_family_class} \NC number \NC \NC \NR
+\NC \type{os2_xheight} \NC number \NC \NC \NR
+\NC \type{os2_capheight} \NC number \NC \NC \NR
+\NC \type{os2_defaultchar} \NC number \NC \NC \NR
+\NC \type{os2_breakchar} \NC number \NC \NC \NR
+\NC \type{os2_vendor} \NC string \NC \NC \NR
+\NC \type{codepages} \NC table \NC A two-number array of encoded code pages \NC \NR
+\NC \type{unicoderages} \NC table \NC A four-number array of encoded unicode ranges \NC \NR
+\NC \type{panose} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {panose} subtable has exactly 10 string keys:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{familytype} \NC string \NC Values as in the \OPENTYPE\ font
+ specification: \type {Any}, \type {No Fit},
+ \type {Text and Display}, \type {Script},
+ \type {Decorative}, \type {Pictorial} \NC
+ \NR
+\NC \type{serifstyle} \NC string \NC See the \OPENTYPE\ font specification for
+ values \NC \NR
+\NC \type{weight} \NC string \NC idem \NC \NR
+\NC \type{proportion} \NC string \NC idem \NC \NR
+\NC \type{contrast} \NC string \NC idem \NC \NR
+\NC \type{strokevariation} \NC string \NC idem \NC \NR
+\NC \type{armstyle} \NC string \NC idem \NC \NR
+\NC \type{letterform} \NC string \NC idem \NC \NR
+\NC \type{midline} \NC string \NC idem \NC \NR
+\NC \type{xheight} \NC string \NC idem \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[reference=fontloadernamestable,title={\type {names}}]
+
+Each item has two top|-|level keys:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{lang} \NC string \NC language for this entry \NC \NR
+\NC \type{names} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {names} keys are the actual \TRUETYPE\ name strings. The possible keys
+are: \type {copyright}, \type {family}, \type {subfamily}, \type {uniqueid},
+\type {fullname}, \type {version}, \type {postscriptname}, \type {trademark},
+\type {manufacturer}, \type {designer}, \type {descriptor}, \type {venderurl},
+\type {designerurl}, \type {license}, \type {licenseurl}, \type {idontknow},
+\type {preffamilyname}, \type {prefmodifiers}, \type {compatfull}, \type
+{sampletext}, \type {cidfindfontname}, \type {wwsfamily} and \type
+{wwssubfamily}.
+
+\stopsubsection
+
+\startsubsection[title={\type {anchor_classes}}]
+
+The anchor_classes classes:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{name} \NC string \NC a descriptive id of this anchor class\NC \NR
+\NC \type{lookup} \NC string \NC \NC \NR
+\NC \type{type} \NC string \NC one of \nod {mark}, \type {mkmk}, \type {curs}, \type {mklg} \NC \NR
+\LL
+\stoptabulate
+
+% type is actually a lookup subtype, not a feature name. Officially, these
+% strings should be gpos_mark2mark etc.
+
+\stopsubsection
+
+\startsubsection[title={\type {gpos}}]
+
+The \type {gpos} table has one array entry for each lookup. (The \type {gpos_}
+prefix is somewhat redundant.)
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{type} \NC string \NC one of \type {gpos_single}, \type {gpos_pair},
+ \type {gpos_cursive}, \type {gpos_mark2base},\crlf
+ \type {gpos_mark2ligature}, \type {gpos_mark2mark}, \type {gpos_context},\crlf \type {gpos_contextchain} \NC \NR
+\NC \type{flags} \NC table \NC \NC \NR
+\NC \type{name} \NC string \NC \NC \NR
+\NC \type{features} \NC array \NC \NC \NR
+\NC \type{subtables} \NC array \NC \NC \NR
+\LL
+\stoptabulate
+
+The flags table has a true value for each of the lookup flags that is actually
+set:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{r2l} \NC boolean \NC \NC \NR
+\NC \type{ignorebaseglyphs} \NC boolean \NC \NC \NR
+\NC \type{ignoreligatures} \NC boolean \NC \NC \NR
+\NC \type{ignorecombiningmarks} \NC boolean \NC \NC \NR
+\NC \type{mark_class} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+The features subtable items of gpos have:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{tag} \NC string \NC \NC \NR
+\NC \type{scripts} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The scripts table within features has:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{script} \NC string \NC \NC \NR
+\NC \type{langs} \NC array of strings \NC \NC \NR
+\LL
+\stoptabulate
+
+The subtables table has:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{name} \NC string \NC \NC \NR
+\NC \type{suffix} \NC string \NC (only if used)\NC \NR % used by gpos_single to get a default
+\NC \type{anchor_classes} \NC number \NC (only if used)\NC \NR
+\NC \type{vertical_kerning} \NC number \NC (only if used)\NC \NR
+\NC \type{kernclass} \NC table \NC (only if used)\NC \NR
+\LL
+\stoptabulate
+
+The kernclass with subtables table has:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{firsts} \NC array of strings \NC \NC \NR
+\NC \type{seconds} \NC array of strings \NC \NC \NR
+\NC \type{lookup} \NC string or array \NC associated lookup(s) \NC \NR
+\NC \type{offsets} \NC array of numbers \NC \NC \NR
+\LL
+\stoptabulate
+
+Note: the kernclass (as far as we can see) always has one entry so it could be one level
+deep instead. Also the seconds start at \type {[2]} which is close to the fontforge
+internals so we keep that too.
+
+\stopsubsection
+
+\startsubsection[title={\type {gsub}}]
+
+This has identical layout to the \type {gpos} table, except for the
+type:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{type} \NC string \NC one of \type {gsub_single}, \type {gsub_multiple},
+ \type {gsub_alternate}, \type {gsub_ligature},\crlf
+ \type {gsub_context}, \type {gsub_contextchain},
+ \type {gsub_reversecontextchain} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {ttf_tables} and \type {ttf_tab_saved}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{tag} \NC string \NC \NC \NR
+\NC \type{len} \NC number \NC \NC \NR
+\NC \type{maxlen} \NC number \NC \NC \NR
+\NC \type{data} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {mm}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{axes} \NC table \NC array of axis names \NC \NR
+\NC \type{instance_count} \NC number \NC \NC \NR
+\NC \type{positions} \NC table \NC array of instance positions
+ (\#axes * instances )\NC \NR
+\NC \type{defweights} \NC table \NC array of default weights for instances \NC \NR
+\NC \type{cdv} \NC string \NC \NC \NR
+\NC \type{ndv} \NC string \NC \NC \NR
+\NC \type{axismaps} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {axismaps}:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{blends} \NC table \NC an array of blend points \NC \NR
+\NC \type{designs} \NC table \NC an array of design values \NC \NR
+\NC \type{min} \NC number \NC \NC \NR
+\NC \type{def} \NC number \NC \NC \NR
+\NC \type{max} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {mark_classes}}]
+
+The keys in this table are mark class names, and the values are a
+space|-|separated string of glyph names in this class.
+
+\stopsubsection
+
+\startsubsection[title={\type {math}}]
+
+The math table has the variables that are also discussed in the chapter aboout
+math: \type {ScriptPercentScaleDown}, \type {ScriptScriptPercentScaleDown}, \type
+{DelimitedSubFormulaMinHeight}, \type {DisplayOperatorMinHeight}, \type
+{MathLeading}, \type {AxisHeight}, \type {AccentBaseHeight}, \type
+{FlattenedAccentBaseHeight}, \type {SubscriptShiftDown}, \type {SubscriptTopMax},
+\type {SubscriptBaselineDropMin}, \type {SuperscriptShiftUp}, \type
+{SuperscriptShiftUpCramped}, \type {SuperscriptBottomMin}, \type
+{SuperscriptBaselineDropMax}, \type {SubSuperscriptGapMin}, \type
+{SuperscriptBottomMaxWithSubscript}, \type {SpaceAfterScript}, \type
+{UpperLimitGapMin}, \type {UpperLimitBaselineRiseMin}, \type {LowerLimitGapMin},
+\type {LowerLimitBaselineDropMin}, \type {StackTopShiftUp}, \type
+{StackTopDisplayStyleShiftUp}, \type {StackBottomShiftDown}, \type
+{StackBottomDisplayStyleShiftDown}, \type {StackGapMin}, \type
+{StackDisplayStyleGapMin}, \type {StretchStackTopShiftUp}, \type
+{StretchStackBottomShiftDown}, \type {StretchStackGapAboveMin}, \type
+{StretchStackGapBelowMin}, \type {FractionNumeratorShiftUp}, \type
+{FractionNumeratorDisplayStyleShiftUp}, \type {FractionDenominatorShiftDown},
+\type {FractionDenominatorDisplayStyleShiftDown}, \type
+{FractionNumeratorGapMin}, \type {FractionNumeratorDisplayStyleGapMin} \type
+{FractionRuleThickness}, \type {FractionDenominatorGapMin}, \type
+{FractionDenominatorDisplayStyleGapMin}, \type {SkewedFractionHorizontalGap},
+\type {SkewedFractionVerticalGap}, \type {OverbarVerticalGap}, \type
+{OverbarRuleThickness}, \type {OverbarExtraAscender}, \type
+{UnderbarVerticalGap}, \type {UnderbarRuleThickness}, \type
+{UnderbarExtraDescender}, \type {RadicalVerticalGap}, \type
+{RadicalDisplayStyleVerticalGap}, \type {RadicalRuleThickness}, \type
+{RadicalExtraAscender}, \type {RadicalKernBeforeDegree}, \type
+{RadicalKernAfterDegree}, \type {RadicalDegreeBottomRaisePercent}, \type
+{MinConnectorOverlap}, \type {FractionDelimiterSize} and \type
+{FractionDelimiterDisplayStyleSize}.
+
+\stopsubsection
+
+\startsubsection[title={\type {validation_state}}]
+
+This is just a bonus table with keys: \type {bad_ps_fontname}, \type {bad_glyph_table}, \type {bad_cff_table}, \type {bad_metrics_table}, \type {bad_cmap_table}, \type {bad_bitmaps_table}, \type {bad_gx_table}, \type {bad_ot_table}, \type {bad_os2_version} and \type {bad_sfnt_header}.
+
+\stopsubsection
+
+\startsubsection[title={\type {horiz_base} and \type {vert_base}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{tags} \NC table \NC an array of script list tags\NC \NR
+\NC \type{scripts} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {scripts} subtable:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{baseline} \NC table \NC \NC \NR
+\NC \type{default_baseline} \NC number \NC \NC \NR
+\NC \type{lang} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+
+The \type {lang} subtable:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{tag} \NC string \NC a script tag \NC \NR
+\NC \type{ascent} \NC number \NC \NC \NR
+\NC \type{descent} \NC number \NC \NC \NR
+\NC \type{features} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {features} points to an array of tables with the same layout except
+that in those nested tables, the tag represents a language.
+
+\stopsubsection
+
+\startsubsection[title={\type {altuni}}]
+
+An array of alternate \UNICODE\ values. Inside that array are hashes with:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{unicode} \NC number \NC this glyph is also used for this unicode \NC \NR
+\NC \type{variant} \NC number \NC the alternative is driven by this unicode selector \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {vert_variants} and \type {horiz_variants}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{variants} \NC string \NC \NC \NR
+\NC \type{italic_correction} \NC number \NC \NC \NR
+\NC \type{parts} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+The \type {parts} table is an array of smaller tables:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{component} \NC string \NC \NC \NR
+\NC \type{extender} \NC number \NC \NC \NR
+\NC \type{start} \NC number \NC \NC \NR
+\NC \type{end} \NC number \NC \NC \NR
+\NC \type{advance} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {mathkern}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{top_right} \NC table \NC \NC \NR
+\NC \type{bottom_right} \NC table \NC \NC \NR
+\NC \type{top_left} \NC table \NC \NC \NR
+\NC \type{bottom_left} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+Each of the subtables is an array of small hashes with two keys:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{height} \NC number \NC \NC \NR
+\NC \type{kern} \NC number \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {kerns}}]
+
+Substructure is identical to the per|-|glyph subtable.
+
+\stopsubsection
+
+\startsubsection[title={\type {vkerns}}]
+
+Substructure is identical to the per|-|glyph subtable.
+
+\stopsubsection
+
+\startsubsection[title={\type {texdata}}]
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{type} \NC string \NC \nod {unset}, \type {text}, \nod {math}, \type {mathext} \NC \NR
+\NC \type{params} \NC array \NC 22 font numeric parameters \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {lookups}}]
+
+Top|-|level \type {lookups} is quite different from the ones at character level.
+The keys in this hash are strings, the values the actual lookups, represented as
+dictionary tables.
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{type} \NC string \NC \NC \NR
+\NC \type{format} \NC enum \NC one of \type {glyphs}, \type {class}, \type {coverage},
+ \type {reversecoverage} \NC \NR
+\NC \type{tag} \NC string \NC \NC \NR
+\NC \type{current_class} \NC array \NC \NC \NR
+\NC \type{before_class} \NC array \NC \NC \NR
+\NC \type{after_class} \NC array \NC \NC \NR
+\NC \type{rules} \NC array \NC an array of rule items\NC \NR
+\LL
+\stoptabulate
+
+Rule items have one common item and one specialized item:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{lookups} \NC array \NC a linear array of lookup names \NC \NR
+\NC \type{glyphs} \NC array \NC only if the parent's format is \type {glyphs} \NC \NR
+\NC \type{class} \NC array \NC only if the parent's format is \type {class} \NC \NR
+\NC \type{coverage} \NC array \NC only if the parent's format is \type {coverage} \NC \NR
+\NC \type{reversecoverage} \NC array \NC only if the parent's format is \type {reversecoverage} \NC \NR
+\LL
+\stoptabulate
+
+A glyph table is:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{names} \NC string \NC \NC \NR
+\NC \type{back} \NC string \NC \NC \NR
+\NC \type{fore} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+A class table is:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{current} \NC array \NC of numbers \NC \NR
+\NC \type{before} \NC array \NC of numbers \NC \NR
+\NC \type{after} \NC array \NC of numbers \NC \NR
+\LL
+\stoptabulate
+
+for coverage:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{current} \NC array \NC of strings \NC \NR
+\NC \type{before} \NC array \NC of strings \NC \NR
+\NC \type{after} \NC array \NC of strings \NC \NR
+\LL
+\stoptabulate
+
+and for reverse coverage:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{current} \NC array \NC of strings \NC \NR
+\NC \type{before} \NC array \NC of strings \NC \NR
+\NC \type{after} \NC array \NC of strings \NC \NR
+\NC \type{replacements} \NC string \NC \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-fonts.tex b/systems/doc/luatex/luatex-fonts.tex
new file mode 100644
index 0000000000..0e1cc8cc5a
--- /dev/null
+++ b/systems/doc/luatex/luatex-fonts.tex
@@ -0,0 +1,858 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-fonts
+
+\startchapter[reference=fonts,title={Font structure}]
+
+\startsection[title={The font tables}]
+
+\topicindex {fonts}
+\topicindex {fonts+tables}
+
+All \TEX\ fonts are represented to \LUA\ code as tables, and internally as
+\CCODE~structures. All keys in the table below are saved in the internal font
+structure if they are present in the table returned by the \cbk {define_font}
+callback, or if they result from the normal \TFM|/|\VF\ reading routines if there
+is no \cbk {define_font} callback defined.
+
+The column \quote {\VF} means that this key will be created by the \type
+{font.read_vf()} routine, \quote {\TFM} means that the key will be created by the
+\type {font.read_tfm()} routine, and \quote {used} means whether or not the
+\LUATEX\ engine itself will do something with the key. The top|-|level keys in
+the table are as follows:
+
+\starttabulate[|l|c|c|c|l|pl|]
+\DB key \BC vf \BC tfm \BC used \BC value type \BC description \NC \NR
+\TB
+\NC \type{name} \NC yes \NC yes \NC yes \NC string \NC metric (file) name \NC \NR
+\NC \type{area} \NC no \NC yes \NC yes \NC string \NC (directory) location, typically empty \NC \NR
+\NC \type{used} \NC no \NC yes \NC yes \NC boolean \NC indicates usage (initial: false) \NC \NR
+\NC \type{characters} \NC yes \NC yes \NC yes \NC table \NC the defined glyphs of this font \NC \NR
+\NC \type{checksum} \NC yes \NC yes \NC no \NC number \NC default: 0 \NC \NR
+\NC \type{designsize} \NC no \NC yes \NC yes \NC number \NC expected size (default: 655360 == 10pt) \NC \NR
+\NC \type{direction} \NC no \NC yes \NC yes \NC number \NC default: 0 \NC \NR
+\NC \type{encodingbytes} \NC no \NC no \NC yes \NC number \NC default: depends on \type {format} \NC \NR
+\NC \type{encodingname} \NC no \NC no \NC yes \NC string \NC encoding name \NC \NR
+\NC \type{fonts} \NC yes \NC no \NC yes \NC table \NC locally used fonts \NC \NR
+\NC \type{psname} \NC no \NC no \NC yes \NC string \NC This is the \POSTSCRIPT\ fontname in the incoming font
+ source, and it's used as fontname identifier in the \PDF\
+ output. This has to be a valid string, e.g.\ no spaces
+ and such, as the backend will not do a cleanup. This gives
+ complete control to the loader. \NC \NR
+\NC \type{fullname} \NC no \NC no \NC yes \NC string \NC output font name, used as a fallback in the \PDF\ output
+ if the \type {psname} is not set \NC \NR
+\NC \type{header} \NC yes \NC no \NC no \NC string \NC header comments, if any \NC \NR
+\NC \type{hyphenchar} \NC no \NC no \NC yes \NC number \NC default: \TEX's \prm {hyphenchar} \NC \NR
+\NC \type{parameters} \NC no \NC yes \NC yes \NC hash \NC default: 7 parameters, all zero \NC \NR
+\NC \type{size} \NC no \NC yes \NC yes \NC number \NC the required scaling (by default the same as designsize) \NC \NR
+\NC \type{skewchar} \NC no \NC no \NC yes \NC number \NC default: \TEX's \prm {skewchar} \NC \NR
+\NC \type{type} \NC yes \NC no \NC yes \NC string \NC basic type of this font \NC \NR
+\NC \type{format} \NC no \NC no \NC yes \NC string \NC disk format type \NC \NR
+\NC \type{embedding} \NC no \NC no \NC yes \NC string \NC \PDF\ inclusion \NC \NR
+\NC \type{filename} \NC no \NC no \NC yes \NC string \NC the name of the font on disk \NC \NR
+\NC \type{tounicode} \NC no \NC yes \NC yes \NC number \NC When this is set to~1 \LUATEX\ assumes per|-|glyph
+ tounicode entries are present in the font. \NC \NR
+\NC \type{stretch} \NC no \NC no \NC yes \NC number \NC the \quote {stretch} value from \lpr {expandglyphsinfont} \NC \NR
+\NC \type{shrink} \NC no \NC no \NC yes \NC number \NC the \quote {shrink} value from \lpr {expandglyphsinfont} \NC \NR
+\NC \type{step} \NC no \NC no \NC yes \NC number \NC the \quote {step} value from \lpr {expandglyphsinfont} \NC \NR
+\NC \type{expansion_factor} \NC no \NC no \NC no \NC number \NC the actual expansion factor of an expanded font \NC \NR
+\NC \type{attributes} \NC no \NC no \NC yes \NC string \NC the \orm {pdffontattr} \NC \NR
+\NC \type{cache} \NC no \NC no \NC yes \NC string \NC This key controls caching of the \LUA\ table on the
+ \TEX\ end where \type {yes} means: use a reference to
+ the table that is passed to \LUATEX\ (this is the
+ default), and \type {no} means: don't store the
+ table reference, don't cache any \LUA\ data for this
+ font while \type {renew} means: don't store the table
+ reference, but save a reference to the table that is
+ created at the first access to one of its fields in the
+ font. \NC \NR
+\NC \type{nomath} \NC no \NC no \NC yes \NC boolean \NC This key allows a minor speedup for text fonts. If it
+ is present and true, then \LUATEX\ will not check the
+ character entries for math|-|specific keys. \NC \NR
+\NC \type{oldmath} \NC no \NC no \NC yes \NC boolean \NC This key flags a font as representing an old school \TEX\
+ math font and disables the \OPENTYPE\ code path. \NC \NR
+\NC \type{slant} \NC no \NC no \NC yes \NC number \NC This parameter will tilt the font and
+ does the same as \type {SlantFont} in the map file for
+ \TYPEONE\ fonts. \NC \NR
+\NC \type{extend} \NC no \NC no \NC yes \NC number \NC This parameter will scale the font horizontally and
+ does the same as \type {ExtendFont} in the map file for
+ \TYPEONE\ fonts. \NC \NR
+\NC \type{squeeze} \NC no \NC no \NC yes \NC number \NC This parameter will scale the font vertically and has
+ no equivalent in the map file. \NC \NR
+\NC \type{width} \NC no \NC no \NC yes \NC number \NC The backend will inject \PDF\ operators that set the
+ penwidth. The value is (as usual in \TEX) divided by 1000.
+ It works with the \type {mode} file. \NC \NR
+\NC \type{mode} \NC no \NC no \NC yes \NC number \NC The backend will inject \PDF\ operators that relate to the
+ drawing mode with 0~being a fill, 1~being an outline,
+ 2~both draw and fill and 3~no painting at all. \NC \NR
+\LL
+\stoptabulate
+
+The saved reference in the \type {cache} option is thread|-|local, so be careful
+when you are using coroutines: an error will be thrown if the table has been
+cached in one thread, but you reference it from another thread.
+
+The key \type {name} is always required. The keys \type {stretch}, \type
+{shrink}, \type {step} only have meaning when used together: they can be used to
+replace a post|-|loading \lpr {expandglyphsinfont} command. The \type
+{auto_expand} option is not supported in \LUATEX. In fact, the primitives that
+create expanded or protruding copies are probably only useful when used with
+traditional fonts because all these extra \OPENTYPE\ properties are kept out of
+the picture. The \type {expansion_factor} is value that can be present inside a
+font in \type {font.fonts}. It is the actual expansion factor (a value between
+\type {-shrink} and \type {stretch}, with step \type {step}) of a font that was
+automatically generated by the font expansion algorithm.
+
+Because we store the actual state of expansion with each glyph and don't have
+special font instances, we can change some font related parameters before lines
+are constructed, like:
+
+\starttyping
+font.setexpansion(font.current(),100,100,20)
+\stoptyping
+
+This is mostly meant for experiments (or an optimizing routing written in \LUA)
+so there is no primitive.
+
+The key \type {attributes} can be used to set font attributes in the \PDF\ file.
+The key \type {used} is set by the engine when a font is actively in use, this
+makes sure that the font's definition is written to the output file (\DVI\ or
+\PDF). The \TFM\ reader sets it to false. The \type {direction} is a number
+signalling the \quote {normal} direction for this font. There are sixteen
+possibilities:
+
+\starttabulate[|Tc|c|Tc|c|Tc|c|Tc|c|]
+\DB \# \BC dir \BC \# \BC dir \BC \# \BC dir \BC \# \BC dir \NC \NR
+\TB
+\NC 0 \NC LT \NC 4 \NC RT \NC 8 \NC TT \NC 12 \NC BT \NC \NR
+\NC 1 \NC LL \NC 5 \NC RL \NC 9 \NC TL \NC 13 \NC BL \NC \NR
+\NC 2 \NC LB \NC 6 \NC RB \NC 10 \NC TB \NC 14 \NC BB \NC \NR
+\NC 3 \NC LR \NC 7 \NC RR \NC 11 \NC TR \NC 15 \NC BR \NC \NR
+\LL
+\stoptabulate
+
+These are \OMEGA|-|style direction abbreviations: the first character indicates
+the \quote {first} edge of the character glyphs (the edge that is seen first in
+the writing direction), the second the \quote {top} side. Keep in mind that
+\LUATEX\ has a bit different directional model so these values are not used for
+anything.
+
+The \type {parameters} is a hash with mixed key types. There are seven possible
+string keys, as well as a number of integer indices (these start from 8 up). The
+seven strings are actually used instead of the bottom seven indices, because that
+gives a nicer user interface.
+
+The names and their internal remapping are:
+
+\starttabulate[|l|c|]
+\DB name \BC remapping \NC \NR
+\TB
+\NC \type {slant} \NC 1 \NC \NR
+\NC \type {space} \NC 2 \NC \NR
+\NC \type {space_stretch} \NC 3 \NC \NR
+\NC \type {space_shrink} \NC 4 \NC \NR
+\NC \type {x_height} \NC 5 \NC \NR
+\NC \type {quad} \NC 6 \NC \NR
+\NC \type {extra_space} \NC 7 \NC \NR
+\LL
+\stoptabulate
+
+The keys \type {type}, \type {format}, \type {embedding}, \type {fullname} and
+\type {filename} are used to embed \OPENTYPE\ fonts in the result \PDF.
+
+The \type {characters} table is a list of character hashes indexed by an integer
+number. The number is the \quote {internal code} \TEX\ knows this character by.
+
+Two very special string indexes can be used also: \type {left_boundary} is a
+virtual character whose ligatures and kerns are used to handle word boundary
+processing. \type {right_boundary} is similar but not actually used for anything
+(yet).
+
+Each character hash itself is a hash. For example, here is the character \quote
+{f} (decimal 102) in the font \type {cmr10 at 10pt}. The numbers that represent
+dimensions are in scaled points.
+
+\starttyping
+[102] = {
+ ["width"] = 200250,
+ ["height"] = 455111,
+ ["depth"] = 0,
+ ["italic"] = 50973,
+ ["kerns"] = {
+ [63] = 50973,
+ [93] = 50973,
+ [39] = 50973,
+ [33] = 50973,
+ [41] = 50973
+ },
+ ["ligatures"] = {
+ [102] = { ["char"] = 11, ["type"] = 0 },
+ [108] = { ["char"] = 13, ["type"] = 0 },
+ [105] = { ["char"] = 12, ["type"] = 0 }
+ }
+}
+\stoptyping
+
+The following top|-|level keys can be present inside a character hash:
+
+\starttabulate[|l|c|c|c|l|p|]
+\DB key \BC vf \BC tfm \BC used \BC type \BC description \NC\NR
+\TB
+\NC \type{width} \NC yes \NC yes \NC yes \NC number \NC character's width, in sp (default 0) \NC\NR
+\NC \type{height} \NC no \NC yes \NC yes \NC number \NC character's height, in sp (default 0) \NC\NR
+\NC \type{depth} \NC no \NC yes \NC yes \NC number \NC character's depth, in sp (default 0) \NC\NR
+\NC \type{italic} \NC no \NC yes \NC yes \NC number \NC character's italic correction, in sp (default zero) \NC\NR
+\NC \type{top_accent} \NC no \NC no \NC maybe \NC number \NC character's top accent alignment place, in sp (default zero) \NC\NR
+\NC \type{bot_accent} \NC no \NC no \NC maybe \NC number \NC character's bottom accent alignment place, in sp (default zero) \NC\NR
+\NC \type{left_protruding} \NC no \NC no \NC maybe \NC number \NC character's \lpr {lpcode} \NC\NR
+\NC \type{right_protruding} \NC no \NC no \NC maybe \NC number \NC character's \lpr {rpcode} \NC\NR
+\NC \type{expansion_factor} \NC no \NC no \NC maybe \NC number \NC character's \lpr {efcode} \NC\NR
+\NC \type{tounicode} \NC no \NC no \NC maybe \NC string \NC character's \UNICODE\ equivalent(s), in \UTF|-|16BE hexadecimal format \NC\NR
+\NC \type{next} \NC no \NC yes \NC yes \NC number \NC the \quote {next larger} character index \NC\NR
+\NC \type{extensible} \NC no \NC yes \NC yes \NC table \NC the constituent parts of an extensible recipe \NC\NR
+\NC \type{vert_variants} \NC no \NC no \NC yes \NC table \NC constituent parts of a vertical variant set \NC \NR
+\NC \type{horiz_variants} \NC no \NC no \NC yes \NC table \NC constituent parts of a horizontal variant set \NC \NR
+\NC \type{kerns} \NC no \NC yes \NC yes \NC table \NC kerning information \NC\NR
+\NC \type{ligatures} \NC no \NC yes \NC yes \NC table \NC ligaturing information \NC\NR
+\NC \type{commands} \NC yes \NC no \NC yes \NC array \NC virtual font commands \NC\NR
+\NC \type{name} \NC no \NC no \NC no \NC string \NC the character (\POSTSCRIPT) name \NC\NR
+\NC \type{index} \NC no \NC no \NC yes \NC number \NC the (\OPENTYPE\ or \TRUETYPE) font glyph index \NC\NR
+\NC \type{used} \NC no \NC yes \NC yes \NC boolean \NC typeset already (default: false) \NC\NR
+\NC \type{mathkern} \NC no \NC no \NC yes \NC table \NC math cut-in specifications \NC\NR
+\LL
+\stoptabulate
+
+The values of \type {top_accent}, \type {bot_accent} and \type {mathkern} are
+used only for math accent and superscript placement, see \at {page} [math] in
+this manual for details. The values of \type {left_protruding} and \type
+{right_protruding} are used only when \lpr {protrudechars} is non-zero. Whether
+or not \type {expansion_factor} is used depends on the font's global expansion
+settings, as well as on the value of \lpr {adjustspacing}.
+
+The usage of \type {tounicode} is this: if this font specifies a \type
+{tounicode=1} at the top level, then \LUATEX\ will construct a \type {/ToUnicode}
+entry for the \PDF\ font (or font subset) based on the character|-|level \type
+{tounicode} strings, where they are available. If a character does not have a
+sensible \UNICODE\ equivalent, do not provide a string either (no empty strings).
+
+If the font level \type {tounicode} is not set, then \LUATEX\ will build up \type
+{/ToUnicode} based on the \TEX\ code points you used, and any character-level
+\type {tounicodes} will be ignored. The string format is exactly the format that
+is expected by Adobe \CMAP\ files (\UTF-16BE in hexadecimal encoding), minus the
+enclosing angle brackets. For instance the \type {tounicode} for a \type {fi}
+ligature would be \type {00660069}. When you pass a number the conversion will be
+done for you.
+
+A math character can have a \type {next} field that points to a next larger
+shape. However, the presence of \type {extensible} will overrule \type {next}, if
+that is also present. The \type {extensible} field in turn can be overruled by
+\type {vert_variants}, the \OPENTYPE\ version. The \type {extensible} table is
+very simple:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type{top} \NC number \NC top character index \NC\NR
+\NC \type{mid} \NC number \NC middle character index \NC\NR
+\NC \type{bot} \NC number \NC bottom character index \NC\NR
+\NC \type{rep} \NC number \NC repeatable character index \NC\NR
+\LL
+\stoptabulate
+
+The \type {horiz_variants} and \type {vert_variants} are arrays of components.
+Each of those components is itself a hash of up to five keys:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{glyph} \NC number \NC The character index. Note that this is an encoding number, not a name. \NC \NR
+\NC \type{extender} \NC number \NC One (1) if this part is repeatable, zero (0) otherwise. \NC \NR
+\NC \type{start} \NC number \NC The maximum overlap at the starting side (in scaled points). \NC \NR
+\NC \type{end} \NC number \NC The maximum overlap at the ending side (in scaled points). \NC \NR
+\NC \type{advance} \NC number \NC The total advance width of this item. It can be zero or missing,
+ then the natural size of the glyph for character \type {component}
+ is used. \NC \NR
+\LL
+\stoptabulate
+
+The \type {kerns} table is a hash indexed by character index (and \quote
+{character index} is defined as either a non|-|negative integer or the string
+value \type {right_boundary}), with the values of the kerning to be applied, in
+scaled points.
+
+The \type {ligatures} table is a hash indexed by character index (and \quote
+{character index} is defined as either a non|-|negative integer or the string
+value \type {right_boundary}), with the values being yet another small hash, with
+two fields:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC description \NC \NR
+\TB
+\NC \type{type} \NC number \NC the type of this ligature command, default 0 \NC \NR
+\NC \type{char} \NC number \NC the character index of the resultant ligature \NC \NR
+\LL
+\stoptabulate
+
+The \type {char} field in a ligature is required. The \type {type} field inside a
+ligature is the numerical or string value of one of the eight possible ligature
+types supported by \TEX. When \TEX\ inserts a new ligature, it puts the new glyph
+in the middle of the left and right glyphs. The original left and right glyphs
+can optionally be retained, and when at least one of them is kept, it is also
+possible to move the new \quote {insertion point} forward one or two places. The
+glyph that ends up to the right of the insertion point will become the next
+\quote {left}.
+
+\starttabulate[|l|c|l|l|]
+\DB textual (Knuth) \BC number \BC string \BC result \NC\NR
+\TB
+\NC \type{l + r =: n} \NC 0 \NC \type{=:} \NC \type{|n} \NC\NR
+\NC \type{l + r =:| n} \NC 1 \NC \type{=:|} \NC \type{|nr} \NC\NR
+\NC \type{l + r |=: n} \NC 2 \NC \type{|=:} \NC \type{|ln} \NC\NR
+\NC \type{l + r |=:| n} \NC 3 \NC \type{|=:|} \NC \type{|lnr} \NC\NR
+\NC \type{l + r =:|> n} \NC 5 \NC \type{=:|>} \NC \type{n|r} \NC\NR
+\NC \type{l + r |=:> n} \NC 6 \NC \type{|=:>} \NC \type{l|n} \NC\NR
+\NC \type{l + r |=:|> n} \NC 7 \NC \type{|=:|>} \NC \type{l|nr} \NC\NR
+\NC \type{l + r |=:|>> n} \NC 11 \NC \type{|=:|>>} \NC \type{ln|r} \NC\NR
+\LL
+\stoptabulate
+
+The default value is~0, and can be left out. That signifies a \quote {normal}
+ligature where the ligature replaces both original glyphs. In this table the~\type {|}
+indicates the final insertion point.
+
+The \type {commands} array is explained below.
+
+\stopsection
+
+\startsection[title={Real fonts}]
+
+\topicindex {fonts+real}
+\topicindex {fonts+virtual}
+
+Whether or not a \TEX\ font is a \quote {real} font that should be written to the
+\PDF\ document is decided by the \type {type} value in the top|-|level font
+structure. If the value is \type {real}, then this is a proper font, and the
+inclusion mechanism will attempt to add the needed font object definitions to the
+\PDF. Values for \type {type} are:
+
+\starttabulate[|l|p|]
+\DB value \BC description \NC\NR
+\TB
+\NC \type{real} \NC this is a base font \NC\NR
+\NC \type{virtual} \NC this is a virtual font \NC\NR
+\LL
+\stoptabulate
+
+The actions to be taken depend on a number of different variables:
+
+\startitemize[packed]
+\startitem
+ Whether the used font fits in an 8-bit encoding scheme or not. This is true for
+ traditional \TEX\ fonts that communicate via \TFM\ files.
+\stopitem
+\startitem
+ The type of the disk font file, for instance a bitmap file or an outline
+ \TYPEONE, \TRUETYPE\ or \OPENTYPE\ font.
+\stopitem
+\startitem
+ The level of embedding requested, although in most cases a subset of
+ characters is embedded. The times when nothing got embedded are (in our
+ opinion at least) basically gone.
+\stopitem
+\stopitemize
+
+A font that uses anything other than an 8-bit encoding vector has to be written
+to the \PDF\ in a different way. When the font table has \type {encodingbytes}
+set to~2, then it is a wide font, in all other cases it isn't. The value~2 is the
+default for \OPENTYPE\ and \TRUETYPE\ fonts loaded via \LUA. For \TYPEONE\ fonts,
+you have to set \type {encodingbytes} to~2 explicitly. For \PK\ bitmap fonts,
+wide font encoding is not supported at all.
+
+If no special care is needed, \LUATEX\ falls back to the mapfile|-|based solution
+used by \PDFTEX\ and \DVIPS, so that legacy fonts are supported transparently. If
+a \quote {wide} font is used, the new subsystem kicks in, and some extra fields
+have to be present in the font structure. In this case, \LUATEX\ does not use a
+map file at all. These extra fields are: \type {format}, \type {embedding}, \type
+{fullname}, \type {cidinfo} (as explained above), \type {filename}, and the \type
+{index} key in the separate characters.
+
+The \type {format} variable can have the following values. \type {type3} fonts
+are provided for backward compatibility only, and do not support the new wide
+encoding options.
+
+\starttabulate[|l|p|]
+\DB value \BC description \NC \NR
+\TB
+\NC \type{type1} \NC this is a \POSTSCRIPT\ \TYPEONE\ font \NC \NR
+\NC \type{type3} \NC this is a bitmapped (\PK) font \NC \NR
+\NC \type{truetype} \NC this is a \TRUETYPE\ or \TRUETYPE|-|based \OPENTYPE\ font \NC \NR
+\NC \type{opentype} \NC this is a \POSTSCRIPT|-|based \OPENTYPE\ font \NC \NR
+\LL
+\stoptabulate
+
+Valid values for the \type {embedding} variable are:
+
+\starttabulate[|l|p|]
+\DB value \BC description \NC \NR
+\TB
+\NC \type{no} \NC don't embed the font at all \NC \NR
+\NC \type{subset} \NC include and atttempt to subset the font \NC \NR
+\NC \type{full} \NC include this font in its entirety \NC \NR
+\LL
+\stoptabulate
+
+The other fields are used as follows. The \type {fullname} will be the
+\POSTSCRIPT|/|\PDF\ font name. The \type {cidinfo} will be used as the character
+set: the CID \type {/Ordering} and \type {/Registry} keys. The \type {filename}
+points to the actual font file. If you include the full path in the \type
+{filename} or if the file is in the local directory, \LUATEX\ will run a little
+bit more efficient because it will not have to re|-|run the \type {find_*_file}
+callback in that case.
+
+Be careful: when mixing old and new fonts in one document, it is possible to
+create \POSTSCRIPT\ name clashes that can result in printing errors. When this
+happens, you have to change the \type {fullname} of the font to a more unique
+one.
+
+Typeset strings are written out in a wide format using 2~bytes per glyph, using
+the \type {index} key in the character information as value. The overall effect
+is like having an encoding based on numbers instead of traditional (\POSTSCRIPT)
+name|-|based reencoding. One way to get the correct \type {index} numbers for
+\TYPEONE\ fonts is by loading the font via \type {fontloader.open} and use the
+table indices as \type {index} fields.
+
+In order to make sure that cut and paste of the final document works okay you can
+best make sure that there is a \type {tounicode} vector enforced. Not all \PDF\
+viewers handle this right so take \ACROBAT\ as reference.
+
+\stopsection
+
+\startsection[reference=virtualfonts,title={Virtual fonts}]
+
+\subsection{The structure}
+
+\topicindex {fonts+virtual}
+
+You have to take the following steps if you want \LUATEX\ to treat the returned
+table from \cbk {define_font} as a virtual font:
+
+\startitemize[packed]
+\startitem
+ Set the top|-|level key \type {type} to \type {virtual}. In most cases it's
+ optional because we look at the \type {commands} entry anyway.
+\stopitem
+\startitem
+ Make sure there is at least one valid entry in \type {fonts} (see below),
+ although recent versions of \LUATEX\ add a default entry when this table is
+ missing.
+\stopitem
+\startitem
+ Add a \type {commands} array to those characters that matter. A virtual
+ character can itself point to virtual characters but be careful with nesting
+ as you can create loops and overflow the stack (which often indicates an
+ error anyway).
+\stopitem
+\stopitemize
+
+The presence of the toplevel \type {type} key with the specific value \type
+{virtual} will trigger handling of the rest of the special virtual font fields in
+the table, but the mere existence of 'type' is enough to prevent \LUATEX\ from
+looking for a virtual font on its own. This also works \quote {in reverse}: if
+you are absolutely certain that a font is not a virtual font, assigning the value
+\type {real} to \type {type} will inhibit \LUATEX\ from looking for a virtual
+font file, thereby saving you a disk search. This only matters when we load a
+\TFM\ file.
+
+The \type {fonts} is an (indexed) \LUA\ table. The values are one- or two|-|key
+hashes themselves, each entry indicating one of the base fonts in a virtual font.
+In case your font is referring to itself, you can use the \type {font.nextid()}
+function which returns the index of the next to be defined font which is probably
+the currently defined one. So, a table looks like this:
+
+\starttyping
+fonts = {
+ { name = "ptmr8a", size = 655360 },
+ { name = "psyr", size = 600000 },
+ { id = 38 }
+}
+\stoptyping
+
+The first referenced font (at index~1) in this virtual font is \type {ptrmr8a}
+loaded at 10pt, and the second is \type {psyr} loaded at a little over 9pt. The
+third one is a previously defined font that is known to \LUATEX\ as font id~38.
+The array index numbers are used by the character command definitions that are
+part of each character.
+
+The \type {commands} array is a hash where each item is another small array,
+with the first entry representing a command and the extra items being the
+parameters to that command. The allowed commands and their arguments are:
+
+\starttabulate[|l|l|l|p|]
+\DB command \BC arguments \BC type \BC description \NC \NR
+\TB
+\NC \type{font} \NC 1 \NC number \NC select a new font from the local \type {fonts} table \NC \NR
+\NC \type{char} \NC 1 \NC number \NC typeset this character number from the current font,
+ and move right by the character's width \NC \NR
+\NC \type{node} \NC 1 \NC node \NC output this node (list), and move right
+ by the width of this list\NC \NR
+\NC \type{slot} \NC 2 \NC 2 numbers \NC a shortcut for the combination of a font and char command\NC \NR
+\NC \type{push} \NC 0 \NC \NC save current position\NC \NR
+\NC \type{nop} \NC 0 \NC \NC do nothing \NC \NR
+\NC \type{pop} \NC 0 \NC \NC pop position \NC \NR
+\NC \type{rule} \NC 2 \NC 2 numbers \NC output a rule $ht*wd$, and move right. \NC \NR
+\NC \type{down} \NC 1 \NC number \NC move down on the page \NC \NR
+\NC \type{right} \NC 1 \NC number \NC move right on the page \NC \NR
+\NC \type{special} \NC 1 \NC string \NC output a \prm {special} command \NC \NR
+\NC \type{pdf} \NC 2 \NC 2 strings \NC output a \PDF\ literal, the first string is one of \type {origin},
+ \type {page}, \type {text}, \type {font}, \type {direct} or \type {raw}; if you
+ have one string only \type {origin} is assumed \NC \NR
+\NC \type{lua} \NC 1 \NC string,
+ function \NC execute a \LUA\ script when the glyph is embedded; in case of a
+ function it gets the font id and character code passed \NC \NR
+\NC \type{image} \NC 1 \NC image \NC output an image (the argument can be either an \type {<image>} variable or an \type {image_spec} table) \NC \NR
+\NC \type{comment} \NC any \NC any \NC the arguments of this command are ignored \NC \NR
+\LL
+\stoptabulate
+
+When a font id is set to~0 then it will be replaced by the currently assigned
+font id. This prevents the need for hackery with future id's. Normally one could
+use \type {font.nextid} but when more complex fonts are built in the meantime
+other instances could have been loaded.
+
+The \type {pdf} option also accepts a \type {mode} keyword in which case the
+third argument sets the mode. That option will change the mode in an efficient
+way (passing an empty string would result in an extra empty lines in the \PDF\
+file. This option only makes sense for virtual fonts. The \type {font} mode only
+makes sense in virtual fonts. Modes are somewhat fuzzy and partially inherited
+from \PDFTEX.
+
+\starttabulate[|l|p|]
+\DB mode \BC description \NC \NR
+\TB
+\NC \type {origin} \NC enter page mode and set the position \NC \NR
+\NC \type {page} \NC enter page mode \NC \NR
+\NC \type {text} \NC enter text mode \NC \NR
+\NC \type {font} \NC enter font mode (kind of text mode, only in virtual fonts) \NC \NR
+\NC \type {always} \NC finish the current string and force a transform if needed \NC \NR
+\NC \type {raw} \NC finish the current string \NC \NR
+\LL
+\stoptabulate
+
+You always need to check what \PDF\ code is generated because there can be all
+kind of interferences with optimization in the backend and fonts are complicated
+anyway. Here is a rather elaborate glyph commands example using such keys:
+
+\starttyping
+...
+commands = {
+ { "push" }, -- remember where we are
+ { "right", 5000 }, -- move right about 0.08pt
+ { "font", 3 }, -- select the fonts[3] entry
+ { "char", 97 }, -- place character 97 (ASCII 'a')
+ -- { "slot", 2, 97 }, -- an alternative for the previous two
+ { "pop" }, -- go all the way back
+ { "down", -200000 }, -- move upwards by about 3pt
+ { "special", "pdf: 1 0 0 rg" } -- switch to red color
+ -- { "pdf", "origin", "1 0 0 rg" } -- switch to red color (alternative)
+ { "rule", 500000, 20000 } -- draw a bar
+ { "special", "pdf: 0 g" } -- back to black
+ -- { "pdf", "origin", "0 g" } -- back to black (alternative)
+}
+...
+\stoptyping
+
+The default value for \type {font} is always~1 at the start of the
+\type {commands} array. Therefore, if the virtual font is essentially only a
+re|-|encoding, then you do usually not have created an explicit \quote {font}
+command in the array.
+
+Rules inside of \type {commands} arrays are built up using only two dimensions:
+they do not have depth. For correct vertical placement, an extra \type {down}
+command may be needed.
+
+Regardless of the amount of movement you create within the \type {commands}, the
+output pointer will always move by exactly the width that was given in the \type
+{width} key of the character hash. Any movements that take place inside the \type
+{commands} array are ignored on the upper level.
+
+The special can have a \type {pdf:}, \type {pdf:origin:}, \type {pdf:page:},
+\type {pdf:direct:} or \type {pdf:raw:} prefix. When you have to concatenate
+strings using the \type {pdf} command might be more efficient.
+
+\subsection{Artificial fonts}
+
+Even in a \quote {real} font, there can be virtual characters. When \LUATEX\
+encounters a \type {commands} field inside a character when it becomes time to
+typeset the character, it will interpret the commands, just like for a true
+virtual character. In this case, if you have created no \quote {fonts} array,
+then the default (and only) \quote {base} font is taken to be the current font
+itself. In practice, this means that you can create virtual duplicates of
+existing characters which is useful if you want to create composite characters.
+
+Note: this feature does {\it not\/} work the other way around. There can not be
+\quote {real} characters in a virtual font! You cannot use this technique for
+font re-encoding either; you need a truly virtual font for that (because
+characters that are already present cannot be altered).
+
+\subsection{Example virtual font}
+
+\topicindex {fonts+virtual}
+
+Finally, here is a plain \TEX\ input file with a virtual font demonstration:
+
+\startbuffer
+\directlua {
+ callback.register('define_font',
+ function (name,size)
+ if name == 'cmr10-red' then
+ local f = font.read_tfm('cmr10',size)
+ f.name = 'cmr10-red'
+ f.type = 'virtual'
+ f.fonts = {
+ { name = 'cmr10', size = size }
+ }
+ for i,v in pairs(f.characters) do
+ if string.char(i):find('[tacohanshartmut]') then
+ v.commands = {
+ { "special", "pdf: 1 0 0 rg" },
+ { "char", i },
+ { "special", "pdf: 0 g" },
+ }
+ end
+ end
+ return f
+ else
+ return font.read_tfm(name,size)
+ end
+ end
+ )
+}
+
+\font\myfont = cmr10-red at 10pt \myfont This is a line of text \par
+\font\myfontx = cmr10 at 10pt \myfontx Here is another line of text \par
+\stopbuffer
+
+\typebuffer
+
+\stopsection
+
+\startsection[title={The \type {vf} library}]
+
+The \type {vf} library can be used when \LUA\ code, as defined in the \type
+{commands} of the font, is executed. The functions provided are similar as the
+commands: \type {char}, \type {down}, \type {fontid}, \type {image}, \type
+{node}, \type {nop}, \type {pop}, \type {push}, \type {right}, \nod {rule}, \type
+{special} and \type {pdf}. This library has been present for a while but not been
+advertised and tested much, if only because it's easy to define an invalid font
+(or mess up the \PDF\ stream). Keep in mind that the \LUA\ snippets are executed
+each time when a character is output.
+
+\stopsection
+
+\startsection[title={The \type {font} library}]
+
+\topicindex {fonts+library}
+
+The font library provides the interface into the internals of the font system,
+and it also contains helper functions to load traditional \TEX\ font metrics
+formats. Other font loading functionality is provided by the \type {fontloader}
+library that will be discussed in the next section.
+
+\subsection{Loading a \TFM\ file}
+
+\topicindex {fonts+tfm}
+
+The behaviour documented in this subsection is considered stable in the sense that
+there will not be backward|-|incompatible changes any more.
+
+\startfunctioncall
+<table> fnt =
+ font.read_tfm(<string> name, <number> s)
+\stopfunctioncall
+
+The number is a bit special:
+
+\startitemize
+\startitem
+ If it is positive, it specifies an \quote {at size} in scaled points.
+\stopitem
+\startitem
+ If it is negative, its absolute value represents a \quote {scaled}
+ setting relative to the designsize of the font.
+\stopitem
+\stopitemize
+
+\subsection{Loading a \VF\ file}
+
+\topicindex {fonts+vf}
+
+The behavior documented in this subsection is considered stable in the sense that
+there will not be backward-incompatible changes any more.
+
+\startfunctioncall
+<table> vf_fnt =
+ font.read_vf(<string> name, <number> s)
+\stopfunctioncall
+
+The meaning of the number \type {s} and the format of the returned table are
+similar to the ones in the \type {read_tfm} function.
+
+\subsection{The fonts array}
+
+\topicindex {fonts+virtual}
+
+The whole table of \TEX\ fonts is accessible from \LUA\ using a virtual array.
+
+\starttyping
+font.fonts[n] = { ... }
+<table> f = font.fonts[n]
+\stoptyping
+
+Because this is a virtual array, you cannot call \type {pairs} on it, but see
+below for the \type {font.each} iterator.
+
+The two metatable functions implementing the virtual array are:
+
+\startfunctioncall
+<table> f = font.getfont(<number> n)
+font.setfont(<number> n, <table> f)
+\stopfunctioncall
+
+Note that at the moment, each access to the \type {font.fonts} or call to \type
+{font.getfont} creates a \LUA\ table for the whole font unless you cached it.
+This process can be quite slow.
+
+\startfunctioncall
+<table> p = font.getparameters(<number> n)
+\stopfunctioncall
+
+This one will return a table of the parameters as known to \TEX. These can be
+different from the ones in the cached table.
+
+Also note the following: assignments can only be made to fonts that have already
+been defined in \TEX, but have not been accessed {\it at all\/} since that
+definition. This limits the usability of the write access to \type {font.fonts}
+quite a lot, a less stringent ruleset will likely be implemented later.
+
+\subsection{Checking a font's status}
+
+You can test for the status of a font by calling this function:
+
+\startfunctioncall
+<boolean> f =
+ font.frozen(<number> n)
+\stopfunctioncall
+
+The return value is one of \type {true} (unassignable), \type {false} (can be
+changed) or \type {nil} (not a valid font at all).
+
+\subsection{Defining a font directly}
+
+\topicindex {fonts+define}
+
+You can define your own font into \type {font.fonts} by calling this function:
+
+\startfunctioncall
+<number> i =
+ font.define(<table> f)
+\stopfunctioncall
+
+The return value is the internal id number of the defined font (the index into
+\type {font.fonts}). If the font creation fails, an error is raised. The table is
+a font structure. An alternative call is:
+
+\startfunctioncall
+<number> i =
+ font.define(<number> n, <table> f)
+\stopfunctioncall
+
+Where the first argument is a reserved font id (see below).
+
+\subsection{Extending a font}
+
+\topicindex {fonts+extend}
+
+Within reasonable bounds you can extend a font after it has been defined. Because
+some properties are best left unchanged this is limited to adding characters.
+
+\startfunctioncall
+font.addcharacters(<number n>, <table> f)
+\stopfunctioncall
+
+The table passed can have the fields \type {characters} which is a (sub)table
+like the one used in define, and for virtual fonts a \type {fonts} table can be
+added. The characters defined in the \type {characters} table are added (when not
+yet present) or replace an existing entry. Keep in mind that replacing can have
+side effects because a character already can have been used. Instead of posing
+restrictions we expect the user to be careful. (The \type {setfont} helper is
+a more drastic replacer.)
+
+\subsection{Projected next font id}
+
+\topicindex {fonts+id}
+
+\startfunctioncall
+<number> i =
+ font.nextid()
+\stopfunctioncall
+
+This returns the font id number that would be returned by a \type {font.define}
+call if it was executed at this spot in the code flow. This is useful for virtual
+fonts that need to reference themselves. If you pass \type {true} as argument,
+the id gets reserved and you can pass to \type {font.define} as first argument.
+This can be handy when you create complex virtual fonts.
+
+\startfunctioncall
+<number> i =
+ font.nextid(true)
+\stopfunctioncall
+
+\subsection{Font ids}
+
+\topicindex {fonts+id}
+\topicindex {fonts+current}
+
+\startfunctioncall
+<number> i =
+ font.id(<string> csname)
+\stopfunctioncall
+
+This returns the font id associated with \type {csname}, or $-1$ if \type
+{csname} is not defined.
+
+\startfunctioncall
+<number> i =
+ font.max()
+\stopfunctioncall
+
+This is the largest used index in \type {font.fonts}.
+
+\startfunctioncall
+<number> i = font.current()
+font.current(<number> i)
+\stopfunctioncall
+
+This gets or sets the currently used font number.
+
+\subsection{Iterating over all fonts}
+
+\topicindex {fonts+iterate}
+
+\startfunctioncall
+for i,v in font.each() do
+ ...
+end
+\stopfunctioncall
+
+This is an iterator over each of the defined \TEX\ fonts. The first returned
+value is the index in \type {font.fonts}, the second the font itself, as a \LUA\
+table. The indices are listed incrementally, but they do not always form an array
+of consecutive numbers: in some cases there can be holes in the sequence.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-graphics.tex b/systems/doc/luatex/luatex-graphics.tex
new file mode 100644
index 0000000000..038710cd58
--- /dev/null
+++ b/systems/doc/luatex/luatex-graphics.tex
@@ -0,0 +1,831 @@
+% language=uk
+
+% mp solve_path
+
+\environment luatex-style
+
+\startcomponent luatex-graphics
+
+\startchapter[reference=graphics,title={The graphic libraries}]
+
+\startsection[title={The \type {img} library}][library=img]
+
+\topicindex {images}
+\topicindex {images+library}
+\topicindex {graphics}
+
+The \type {img} library can be used as an alternative to \orm {pdfximage} and
+\orm {pdfrefximage}, and the associated \quote {satellite} commands like \type
+{\pdfximagebbox}. Image objects can also be used within virtual fonts via the
+\type {image} command listed in~\in {section} [virtualfonts].
+
+\subsection{\type {new}}
+
+\libindex{new}
+
+\startfunctioncall
+<image> var = img.new()
+<image> var = img.new(<table> image_spec)
+\stopfunctioncall
+
+This function creates a userdata object of type \quote {image}. The \type
+{image_spec} argument is optional. If it is given, it must be a table, and that
+table must contain a \type {filename} key. A number of other keys can also be
+useful, these are explained below.
+
+You can either say
+
+\starttyping
+a = img.new()
+\stoptyping
+
+followed by
+
+\starttyping
+a.filename = "foo.png"
+\stoptyping
+
+or you can put the file name (and some or all of the other keys) into a table
+directly, like so:
+
+\starttyping
+a = img.new({filename='foo.pdf', page=1})
+\stoptyping
+
+The generated \type {<image>} userdata object allows access to a set of
+user|-|specified values as well as a set of values that are normally filled in
+and updated automatically by \LUATEX\ itself. Some of those are derived from the
+actual image file, others are updated to reflect the \PDF\ output status of the
+object.
+
+There is one required user-specified field: the file name (\type {filename}). It
+can optionally be augmented by the requested image dimensions (\type {width},
+\type {depth}, \type {height}), user|-|specified image attributes (\type {attr}),
+the requested \PDF\ page identifier (\type {page}), the requested boundingbox
+(\type {pagebox}) for \PDF\ inclusion, the requested color space object (\type
+{colorspace}).
+
+The function \type {img.new} does not access the actual image file, it just
+creates the \type {<image>} userdata object and initializes some memory
+structures. The \type {<image>} object and its internal structures are
+automatically garbage collected.
+
+Once the image is scanned, all the values in the \type {<image>} except \type
+{width}, \type {height} and \type {depth}, become frozen, and you cannot change
+them any more.
+
+You can use \type {pdf.setignoreunknownimages(1)} (or at the \TEX\ end the \lpr
+{pdfvariable} \type {ignoreunknownimages}) to get around a quit when no known
+image type is found (based on name or preamble). Beware: this will not catch
+invalid images and we cannot guarantee side effects. A zero dimension image is
+still included when requested. No special flags are set. A proper workflow will
+not rely in such a catch but make sure that images are valid.
+
+\subsection{\type {fields}}
+
+\libindex{fields}
+
+\startfunctioncall
+<table> keys = img.fields()
+\stopfunctioncall
+
+This function returns a list of all the possible \type {image_spec} keys, both
+user-supplied and automatic ones.
+
+\starttabulate[|l|l|p|]
+\DB field name \BC type \BC description \NC \NR
+\TB
+\NC \type{attr} \NC string \NC the image attributes for \LUATEX \NC \NR
+\NC \type{bbox} \NC table \NC table with 4 boundingbox dimensions \type
+ {llx}, \type {lly}, \type {urx} and \type
+ {ury} overruling the \type {pagebox} entry \NC \NR
+\NC \type{colordepth} \NC number \NC the number of bits used by the color space \NC \NR
+\NC \type{colorspace} \NC number \NC the color space object number \NC \NR
+\NC \type{depth} \NC number \NC the image depth for \LUATEX \NC \NR
+\NC \type{filename} \NC string \NC the image file name \NC \NR
+\NC \type{filepath} \NC string \NC the full (expanded) file name of the image\NC \NR
+\NC \type{height} \NC number \NC the image height for \LUATEX \NC \NR
+\NC \type{imagetype} \NC string \NC one of \type {pdf}, \type {png}, \type {jpg},
+ \type {jp2} or \type {jbig2} \NC \NR
+\NC \type{index} \NC number \NC the \PDF\ image name suffix \NC \NR
+\NC \type{objnum} \NC number \NC the \PDF\ image object number \NC \NR
+\NC \type{page} \NC number \NC the identifier for the requested image page \NC \NR
+\NC \type{pagebox} \NC string \NC the requested bounding box, one of
+ \type {none}, \type {media}, \type {crop},
+ \type {bleed}, \type {trim}, \type {art} \NC \NR
+\NC \type{pages} \NC number \NC the total number of available pages \NC \NR
+\NC \type{rotation} \NC number \NC the image rotation from included \PDF\ file,
+ in multiples of 90~deg. \NC \NR
+\NC \type{stream} \NC string \NC the raw stream data for an \type {/Xobject}
+ \type {/Form} object\NC \NR
+\NC \type{transform} \NC number \NC the image transform, integer number 0..7 \NC \NR
+\NC \type{orientation} \NC number \NC the (jpeg) image orientation, integer number 1..8
+ (0 for unset) \NC \NR
+\NC \type{width} \NC number \NC the image width for \LUATEX \NC \NR
+\NC \type{xres} \NC number \NC the horizontal natural image resolution
+ (in \DPI) \NC \NR
+\NC \type{xsize} \NC number \NC the natural image width \NC \NR
+\NC \type{yres} \NC number \NC the vertical natural image resolution
+ (in \DPI) \NC \NR
+\NC \type{ysize} \NC number \NC the natural image height \NC \NR
+\NC \type{visiblefilename} \NC string \NC when set, this name will find its way in the
+ \PDF\ file as \type {PTEX} specification; when
+ an empty string is assigned nothing is written
+ to file; otherwise the natural filename is
+ taken \NC \NR
+\NC \type{userpassword} \NC string \NC the userpassword needed for opening a \PDF\ file \NC \NR
+\NC \type{ownerpassword} \NC string \NC the ownerpassword needed for opening a \PDF\ file \NC \NR
+\NC \type{keepopen} \NC boolean \NC keep the \PDF\ file open \NC \NR
+\NC \type{nobbox} \NC boolean \NC don't add a boundingbox specification for streams \NC \NR
+\NC \type{nolength} \NC boolean \NC don't add length key nor compress for streams \NC \NR
+\NC \type{nosize} \NC boolean \NC don't add size fields for streams \NC \NR
+\LL
+\stoptabulate
+
+A running (undefined) dimension in \type {width}, \type {height}, or \type
+{depth} is represented as \type {nil} in \LUA, so if you want to load an image at
+its \quote {natural} size, you do not have to specify any of those three fields.
+
+The \type {stream} parameter allows to fabricate an \type {/XObject} \type
+{/Form} object from a string giving the stream contents, e.g., for a filled
+rectangle:
+
+\startfunctioncall
+a.stream = "0 0 20 10 re f"
+\stopfunctioncall
+
+When writing the image, an \type {/Xobject} \type {/Form} object is created, like
+with embedded \PDF\ file writing. The object is written out only once. The \type
+{stream} key requires that also the \type {bbox} table is given. The \type
+{stream} key conflicts with the \type {filename} key. The \type {transform} key
+works as usual also with \type {stream}.
+
+The \type {bbox} key needs a table with four boundingbox values, e.g.:
+
+\startfunctioncall
+a.bbox = { "30bp", 0, "225bp", "200bp" }
+\stopfunctioncall
+
+This replaces and overrules any given \type {pagebox} value; with given \type
+{bbox} the box dimensions coming with an embedded \PDF\ file are ignored. The
+\type {xsize} and \type {ysize} dimensions are set accordingly, when the image is
+scaled. The \type {bbox} parameter is ignored for non-\PDF\ images.
+
+The \type {transform} allows to mirror and rotate the image in steps of 90~deg.
+The default value~$0$ gives an unmirrored, unrotated image. Values $1-3$ give
+counterclockwise rotation by $90$, $180$, or $270$~degrees, whereas with values
+$4-7$ the image is first mirrored and then rotated counterclockwise by $90$,
+$180$, or $270$~degrees. The \type {transform} operation gives the same visual
+result as if you would externally preprocess the image by a graphics tool and
+then use it by \LUATEX. If a \PDF\ file to be embedded already contains a \type
+{/Rotate} specification, the rotation result is the combination of the \type
+{/Rotate} rotation followed by the \type {transform} operation.
+
+\subsection{\type {scan}}
+
+\libindex{scan}
+
+\startfunctioncall
+<image> var = img.scan(<image> var)
+<image> var = img.scan(<table> image_spec)
+\stopfunctioncall
+
+When you say \type {img.scan(a)} for a new image, the file is scanned, and
+variables such as \type {xsize}, \type {ysize}, image \type {type}, number of
+\type {pages}, and the resolution are extracted. Each of the \type {width}, \type
+{height}, \type {depth} fields are set up according to the image dimensions, if
+they were not given an explicit value already. An image file will never be
+scanned more than once for a given image variable. With all subsequent \type
+{img.scan(a)} calls only the dimensions are again set up (if they have been
+changed by the user in the meantime).
+
+For ease of use, you can do right-away a
+
+\starttyping
+<image> a = img.scan { filename = "foo.png" }
+\stoptyping
+
+without a prior \type {img.new}.
+
+Nothing is written yet at this point, so you can do \type {a=img.scan}, retrieve
+the available info like image width and height, and then throw away \type {a}
+again by saying \type {a=nil}. In that case no image object will be reserved in
+the PDF, and the used memory will be cleaned up automatically.
+
+\subsection{\type {copy}}
+
+\libindex{copy}
+
+\startfunctioncall
+<image> var = img.copy(<image> var)
+<image> var = img.copy(<table> image_spec)
+\stopfunctioncall
+
+If you say \type {a = b}, then both variables point to the same \type {<image>}
+object. if you want to write out an image with different sizes, you can do
+\type {b = img.copy(a)}.
+
+Afterwards, \type {a} and \type {b} still reference the same actual image
+dictionary, but the dimensions for \type {b} can now be changed from their
+initial values that were just copies from \type {a}.
+
+\subsection{\type {write}, \type {immediatewrite}, \type {immediatewriteobject}}
+
+\topicindex {images+injection}
+\topicindex {images+immediate}
+\topicindex {images+object}
+
+\libindex{write}
+\libindex{immediatewrite}
+\libindex{immediatewriteobject}
+
+\startfunctioncall
+<image> var = img.write(<image> var)
+<image> var = img.write(<table> image_spec)
+\stopfunctioncall
+
+By \type {img.write(a)} a \PDF\ object number is allocated, and a rule node of
+subtype \type {image} is generated and put into the output list. By this the
+image \type {a} is placed into the page stream, and the image file is written out
+into an image stream object after the shipping of the current page is finished.
+
+Again you can do a terse call like
+
+\starttyping
+img.write { filename = "foo.png" }
+\stoptyping
+
+The \type {<image>} variable is returned in case you want it for later
+processing. You can also write an object.
+
+By \type {img.immediatewrite(a)} a \PDF\ object number is allocated, and the
+image file for image \type {a} is written out immediately into the \PDF\ file as
+an image stream object (like with \prm {immediate}\orm {pdfximage}). The object
+number of the image stream dictionary is then available by the \type {objnum}
+key. No \type {pdf_refximage} whatsit node is generated. You will need an
+\type {img.write(a)} or \type {img.node(a)} call to let the image appear on the
+page, or reference it by another trick; else you will have a dangling image
+object in the \PDF\ file.
+
+\startfunctioncall
+<image> var = img.immediatewrite(<image> var)
+<image> var = img.immediatewrite(<table> image_spec)
+\stopfunctioncall
+
+Also here you can do a terse call like
+
+\starttyping
+a = img.immediatewrite { filename = "foo.png" }
+\stoptyping
+
+The \type {<image>} variable is returned and you will most likely need it.
+
+The next function is kind of special as it copies an object from a (\PDF) image
+file. This features is experimental and might disappear.
+
+\startfunctioncall
+<integer> objnum = img.immediatewriteobject(<image> var, <integer> objnum)
+<integer> objnum = img.immediatewriteobject(<table> image_spec, <integer> objnum)
+\stopfunctioncall
+
+\subsection{\type {node}}
+
+\libindex{node}
+
+\startfunctioncall
+<node> n = img.node(<image> var)
+<node> n = img.node(<table> image_spec)
+\stopfunctioncall
+
+This function allocates a \PDF\ object number and returns a whatsit node of
+subtype \type {pdf_refximage}, filled with the image parameters \type {width},
+\type {height}, \type {depth}, and \type {objnum}. Also here you can do a terse
+call like:
+
+\starttyping
+n = img.node ({ filename = "foo.png" })
+\stoptyping
+
+This example outputs an image:
+
+\starttyping
+node.write(img.node{filename="foo.png"})
+\stoptyping
+
+\subsection{\type {types}}
+
+\topicindex {images+types}
+
+\libindex{types}
+
+\startfunctioncall
+<table> types = img.types()
+\stopfunctioncall
+
+This function returns a list with the supported image file type names, currently
+these are \type {pdf}, \type {png}, \type {jpg}, \type {jp2} (JPEG~2000), and
+\type {jbig2}.
+
+\subsection{\type {boxes}}
+
+\libindex{boxes}
+
+\startfunctioncall
+<table> boxes = img.boxes()
+\stopfunctioncall
+
+This function returns a list with the supported \PDF\ page box names, currently
+these are \type {media}, \type {crop}, \type {bleed}, \type {trim}, and \type
+{art}, all in lowercase.
+
+The \PDF\ file is kept open after its properties are determined. After inclusion,
+which happens when the page that references the image is flushed, the file is
+closed. This means that when you have thousands of images on one page, your
+operating system might decide to abort the run. When you include more than one
+page from a \PDF\ file you can set the \type {keepopen} flag when you allocate an
+image object, or pass the \type {keepopen} directive when you refer to the image
+with \lpr {useimageresource}. This only makes sense when you embed many pages.
+An \prm {immediate} applied to \lpr {saveimageresource} will also force a
+close after inclusion.
+
+\starttyping
+\immediate\useimageresource{foo.pdf}%
+ \saveimageresource \lastsavedimageresourceindex % closed
+ \useimageresource{foo.pdf}%
+ \saveimageresource \lastsavedimageresourceindex % kept open
+ \useimageresource{foo.pdf}%
+ \saveimageresource keepopen\lastsavedimageresourceindex % kept open
+
+\directlua{img.write(img.scan{ file = "foo.pdf" })} % closed
+\directlua{img.write(img.scan{ file = "foo.pdf", keepopen = true })} % kept open
+\stoptyping
+
+\stopsection
+
+\startsection[title={The \type {mplib} library}][library=mplib]
+
+\topicindex {\METAPOST}
+\topicindex {\METAPOST+mplib}
+\topicindex {images+mplib}
+\topicindex {images+\METAPOST}
+
+\libindex{version}
+
+The \MP\ library interface registers itself in the table \type {mplib}. It is
+based on \MPLIB\ version \ctxlua {context(mplib.version())}.
+
+\subsection{\type {new}}
+
+\libindex{new}
+
+To create a new \METAPOST\ instance, call
+
+\startfunctioncall
+<mpinstance> mp = mplib.new({...})
+\stopfunctioncall
+
+This creates the \type {mp} instance object. The argument hash can have a number
+of different fields, as follows:
+
+\starttabulate[|l|l|pl|pl|]
+\DB name \BC type \BC description \BC default \NC \NR
+\TB
+\NC \type{error_line} \NC number \NC error line width \NC 79 \NC \NR
+\NC \type{print_line} \NC number \NC line length in ps output \NC 100 \NC \NR
+\NC \type{random_seed} \NC number \NC the initial random seed \NC variable \NC \NR
+\NC \type{math_mode} \NC string \NC the number system to use:
+ \type {scaled},
+ \type {double} or
+ % \type {binary} or
+ \type {decimal} \NC \type {scaled} \NC \NR
+\NC \type{interaction} \NC string \NC the interaction mode:
+ \type {batch},
+ \type {nonstop},
+ \type {scroll} or
+ \type {errorstop} \NC \type {errorstop} \NC \NR
+\NC \type{job_name} \NC string \NC \type {--jobname} \NC \type {mpout} \NC \NR
+\NC \type{find_file} \NC function \NC a function to find files \NC only local files \NC \NR
+\LL
+\stoptabulate
+
+The binary mode is no longer available in the \LUATEX\ version of \MPLIB. It
+offers no real advantage and brings a ton of extra libraries with platform
+specific properties that we can now avoid. We might introduce a high resolution
+scaled variant at some point but only when it pays of performance wise.
+
+The \type {find_file} function should be of this form:
+
+\starttyping
+<string> found = finder (<string> name, <string> mode, <string> type)
+\stoptyping
+
+with:
+
+\starttabulate[|l|p|]
+\DB name \BC the requested file \NC \NR
+\TB
+\NC \type{mode} \NC the file mode: \type {r} or \type {w} \NC \NR
+\NC \type{type} \NC the kind of file, one of: \type {mp}, \type {tfm}, \type {map},
+ \type {pfb}, \type {enc} \NC \NR
+\LL
+\stoptabulate
+
+Return either the full path name of the found file, or \type {nil} if the file
+cannot be found.
+
+Note that the new version of \MPLIB\ no longer uses binary mem files, so the way
+to preload a set of macros is simply to start off with an \type {input} command
+in the first \type {execute} call.
+
+When you are processing a snippet of text starting with \type {btex} and
+ending with either \type {etex} or \type {verbatimtex}, the \METAPOST\
+\type {texscriptmode} parameter controls how spaces and newlines get honoured.
+The default value is~1. Possible values are:
+
+\starttabulate[|l|p|]
+\DB name \BC meaning \NC \NR
+\TB
+\NC \type {0} \NC no newlines \NC \NR
+\NC \type {1} \NC newlines in \type {verbatimtex} \NC \NR
+\NC \type {2} \NC newlines in \type {verbatimtex} and \type {etex} \NC \NR
+\NC \type {3} \NC no leading and trailing strip in \type {verbatimtex} \NC \NR
+\NC \type {4} \NC no leading and trailing strip in \type {verbatimtex} and \type {btex} \NC \NR
+\LL
+\stoptabulate
+
+That way the \LUA\ handler (assigned to \type {make_text}) can do what it likes.
+An \type {etex} has to be followed by a space or \type {;} or be at the end of a
+line and preceded by a space or at the beginning of a line.
+
+\subsection{\type {statistics}}
+
+\libindex{statistics}
+
+You can request statistics with:
+
+\startfunctioncall
+<table> stats = mp:statistics()
+\stopfunctioncall
+
+This function returns the vital statistics for an \MPLIB\ instance. There are
+four fields, giving the maximum number of used items in each of four allocated
+object classes:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{main_memory} \NC number \NC memory size \NC \NR
+\NC \type{hash_size} \NC number \NC hash size\NC \NR
+\NC \type{param_size} \NC number \NC simultaneous macro parameters\NC \NR
+\NC \type{max_in_open} \NC number \NC input file nesting levels\NC \NR
+\LL
+\stoptabulate
+
+Note that in the new version of \MPLIB, this is informational only. The objects
+are all allocated dynamically, so there is no chance of running out of space
+unless the available system memory is exhausted.
+
+\subsection{\type {execute}}
+
+\libindex{execute}
+
+You can ask the \METAPOST\ interpreter to run a chunk of code by calling
+
+\startfunctioncall
+<table> rettable = execute(mp,"metapost code")
+\stopfunctioncall
+
+for various bits of \METAPOST\ language input. Be sure to check the \type
+{rettable.status} (see below) because when a fatal \METAPOST\ error occurs the
+\MPLIB\ instance will become unusable thereafter.
+
+Generally speaking, it is best to keep your chunks small, but beware that all
+chunks have to obey proper syntax, like each of them is a small file. For
+instance, you cannot split a single statement over multiple chunks.
+
+In contrast with the normal stand alone \type {mpost} command, there is
+\notabene {no} implied \quote{input} at the start of the first chunk.
+
+\subsection{\type {finish}}
+
+\libindex{finish}
+
+\startfunctioncall
+<table> rettable = finish(mp)
+\stopfunctioncall
+
+If for some reason you want to stop using an \MPLIB\ instance while processing is
+not yet actually done, you can call \type finish}. Eventually, used memory
+will be freed and open files will be closed by the \LUA\ garbage collector, but
+an explicit \type finish} is the only way to capture the final part of the
+output streams.
+
+\subsection{Result table}
+
+\libindex {fields}
+
+The return value of \type {execute} and \type {finish} is a table with a
+few possible keys (only \type {status} is always guaranteed to be present).
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{log} \NC string \NC output to the \quote {log} stream \NC \NR
+\NC \type{term} \NC string \NC output to the \quote {term} stream \NC \NR
+\NC \type{error} \NC string \NC output to the \quote {error} stream
+ (only used for \quote {out of memory}) \NC \NR
+\NC \type{status} \NC number \NC the return value:
+ \type {0} = good,
+ \type {1} = warning,
+ \type {2} = errors,
+ \type {3} = fatal error \NC \NR
+\NC \type{fig} \NC table \NC an array of generated figures (if any) \NC \NR
+\LL
+\stoptabulate
+
+When \type {status} equals~3, you should stop using this \MPLIB\ instance
+immediately, it is no longer capable of processing input.
+
+If it is present, each of the entries in the \type {fig} array is a userdata
+representing a figure object, and each of those has a number of object methods
+you can call:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{boundingbox} \NC function \NC returns the bounding box, as an array of 4
+ values \NC \NR
+\NC \type{postscript} \NC function \NC returns a string that is the ps output of the
+ \type {fig}. this function accepts two optional
+ integer arguments for specifying the values of
+ \type {prologues} (first argument) and \type
+ {procset} (second argument) \NC \NR
+\NC \type{svg} \NC function \NC returns a string that is the svg output of the
+ \type {fig}. This function accepts an optional
+ integer argument for specifying the value of
+ \type {prologues} \NC \NR
+\NC \type{objects} \NC function \NC returns the actual array of graphic objects in
+ this \type {fig} \NC \NR
+\NC \type{copy_objects} \NC function \NC returns a deep copy of the array of graphic
+ objects in this \type {fig} \NC \NR
+\NC \type{filename} \NC function \NC the filename this \type {fig}'s \POSTSCRIPT\
+ output would have written to in stand alone
+ mode \NC \NR
+\NC \type{width} \NC function \NC the \type {fontcharwd} value \NC \NR
+\NC \type{height} \NC function \NC the \type {fontcharht} value \NC \NR
+\NC \type{depth} \NC function \NC the \type {fontchardp} value \NC \NR
+\NC \type{italcorr} \NC function \NC the \type {fontcharit} value \NC \NR
+\NC \type{charcode} \NC function \NC the (rounded) \type {charcode} value \NC \NR
+\LL
+\stoptabulate
+
+Note: you can call \type {fig:objects()} only once for any one \type {fig}
+object!
+
+When the boundingbox represents a \quote {negated rectangle}, i.e.\ when the
+first set of coordinates is larger than the second set, the picture is empty.
+
+Graphical objects come in various types that each has a different list of
+accessible values. The types are: \type {fill}, \type {outline}, \type {text},
+\type {start_clip}, \type {stop_clip}, \type {start_bounds}, \type {stop_bounds},
+\type {special}.
+
+There is a helper function (\type {mplib.fields(obj)}) to get the list of
+accessible values for a particular object, but you can just as easily use the
+tables given below.
+
+All graphical objects have a field \type {type} that gives the object type as a
+string value; it is not explicit mentioned in the following tables. In the
+following, \type {number}s are \POSTSCRIPT\ points represented as a floating
+point number, unless stated otherwise. Field values that are of type \type
+{table} are explained in the next section.
+
+\subsubsection{fill}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\NC \type{htap} \NC table \NC the list of knots for the reversed trajectory \NC \NR
+\NC \type{pen} \NC table \NC knots of the pen \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{linejoin} \NC number \NC line join style (bare number)\NC \NR
+\NC \type{miterlimit} \NC number \NC miterlimit\NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+The entries \type {htap} and \type {pen} are optional.
+
+\subsubsection{outline}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\NC \type{pen} \NC table \NC knots of the pen \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{linejoin} \NC number \NC line join style (bare number) \NC \NR
+\NC \type{miterlimit} \NC number \NC miterlimit \NC \NR
+\NC \type{linecap} \NC number \NC line cap style (bare number) \NC \NR
+\NC \type{dash} \NC table \NC representation of a dash list \NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+The entry \type {dash} is optional.
+
+\subsubsection{text}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{text} \NC string \NC the text \NC \NR
+\NC \type{font} \NC string \NC font tfm name \NC \NR
+\NC \type{dsize} \NC number \NC font size \NC \NR
+\NC \type{color} \NC table \NC the object's color \NC \NR
+\NC \type{width} \NC number \NC \NC \NR
+\NC \type{height} \NC number \NC \NC \NR
+\NC \type{depth} \NC number \NC \NC \NR
+\NC \type{transform} \NC table \NC a text transformation \NC \NR
+\NC \type{prescript} \NC string \NC the prescript text \NC \NR
+\NC \type{postscript} \NC string \NC the postscript text \NC \NR
+\LL
+\stoptabulate
+
+\subsubsection{special}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{prescript} \NC string \NC special text \NC \NR
+\LL
+\stoptabulate
+
+\subsubsection{start_bounds, start_clip}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\LL
+\stoptabulate
+
+\subsubsection{stop_bounds, stop_clip}
+
+Here are no fields available.
+
+\subsection{Subsidiary table formats}
+
+\subsubsection{Paths and pens}
+
+Paths and pens (that are really just a special type of paths as far as \MPLIB\ is
+concerned) are represented by an array where each entry is a table that
+represents a knot.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{left_type} \NC string \NC when present: endpoint, but usually absent \NC \NR
+\NC \type{right_type} \NC string \NC like \type {left_type} \NC \NR
+\NC \type{x_coord} \NC number \NC X coordinate of this knot \NC \NR
+\NC \type{y_coord} \NC number \NC Y coordinate of this knot \NC \NR
+\NC \type{left_x} \NC number \NC X coordinate of the precontrol point of this knot \NC \NR
+\NC \type{left_y} \NC number \NC Y coordinate of the precontrol point of this knot \NC \NR
+\NC \type{right_x} \NC number \NC X coordinate of the postcontrol point of this knot \NC \NR
+\NC \type{right_y} \NC number \NC Y coordinate of the postcontrol point of this knot \NC \NR
+\LL
+\stoptabulate
+
+There is one special case: pens that are (possibly transformed) ellipses have an
+extra string-valued key \type {type} with value \type {elliptical} besides the
+array part containing the knot list.
+
+\subsubsection{Colors}
+
+A color is an integer array with 0, 1, 3 or 4 values:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{0} \NC marking only \NC no values \NC \NR
+\NC \type{1} \NC greyscale \NC one value in the range $(0,1)$, \quote {black} is $0$ \NC \NR
+\NC \type{3} \NC \RGB \NC three values in the range $(0,1)$, \quote {black} is $0,0,0$ \NC \NR
+\NC \type{4} \NC \CMYK \NC four values in the range $(0,1)$, \quote {black} is $0,0,0,1$ \NC \NR
+\LL
+\stoptabulate
+
+If the color model of the internal object was \type {uninitialized}, then it was
+initialized to the values representing \quote {black} in the colorspace \type
+{defaultcolormodel} that was in effect at the time of the \type {shipout}.
+
+\subsubsection{Transforms}
+
+Each transform is a six|-|item array.
+
+\starttabulate[|l|l|p|]
+\DB index \BC type \BC explanation \NC \NR
+\TB
+\NC \type{1} \NC number \NC represents x \NC \NR
+\NC \type{2} \NC number \NC represents y \NC \NR
+\NC \type{3} \NC number \NC represents xx \NC \NR
+\NC \type{4} \NC number \NC represents yx \NC \NR
+\NC \type{5} \NC number \NC represents xy \NC \NR
+\NC \type{6} \NC number \NC represents yy \NC \NR
+\LL
+\stoptabulate
+
+Note that the translation (index 1 and 2) comes first. This differs from the
+ordering in \POSTSCRIPT, where the translation comes last.
+
+\subsubsection{Dashes}
+
+Each \type {dash} is two-item hash, using the same model as \POSTSCRIPT\ for the
+representation of the dashlist. \type {dashes} is an array of \quote {on} and
+\quote {off}, values, and \type {offset} is the phase of the pattern.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{dashes} \NC hash \NC an array of on-off numbers \NC \NR
+\NC \type{offset} \NC number \NC the starting offset value \NC \NR
+\LL
+\stoptabulate
+
+\subsection{Pens and \type {pen_info}}
+
+\libindex{pen_info}
+
+There is helper function (\type {pen_info(obj)}) that returns a table containing
+a bunch of vital characteristics of the used pen (all values are floats):
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{width} \NC number \NC width of the pen \NC \NR
+\NC \type{sx} \NC number \NC $x$ scale \NC \NR
+\NC \type{rx} \NC number \NC $xy$ multiplier \NC \NR
+\NC \type{ry} \NC number \NC $yx$ multiplier \NC \NR
+\NC \type{sy} \NC number \NC $y$ scale \NC \NR
+\NC \type{tx} \NC number \NC $x$ offset \NC \NR
+\NC \type{ty} \NC number \NC $y$ offset \NC \NR
+\LL
+\stoptabulate
+
+\subsection{Character size information}
+
+These functions find the size of a glyph in a defined font. The \type {fontname}
+is the same name as the argument to \type {infont}; the \type {char} is a glyph
+id in the range 0 to 255; the returned \type {w} is in AFM units.
+
+\subsubsection{\type {char_width}}
+
+\libindex{char_width}
+
+\startfunctioncall
+<number> w = char_width(mp,<string> fontname, <number> char)
+\stopfunctioncall
+
+\subsubsection{\type {char_height}}
+
+\libindex{char_height}
+
+\startfunctioncall
+<number> w = char_height(mp,<string> fontname, <number> char)
+\stopfunctioncall
+
+\subsubsection{\type {char_depth}}
+
+\libindex{char_depth}
+
+\startfunctioncall
+<number> w = char_depth(mp,<string> fontname, <number> char)
+\stopfunctioncall
+
+\subsubsection{\type {get_[boolean|numeric|string|path]}}
+
+\libindex{get_boolean}
+\libindex{get_numeric}
+\libindex{get_path}
+\libindex{get_string}
+
+When a script call brings you from the \METAPOST\ run (temporarily) back to
+\LUA\ you can access variables, but only if they are known (so for instance
+anonymous capsules like loop variables are not accessible).
+
+\startfunctioncall
+<boolean> w = get_boolean(mp,<string> name)
+<number> n = get_numeric(mp,<string> name)
+<string> s = get_string (mp,<string> name)
+<table> p = get_path (mp,<string> name)
+\stopfunctioncall
+
+The path is returned a a table with subtables that have six numbers: the
+coordinates of the point, pre- and postcontrol. A \type {cycle} fields indicates
+if a path is cyclic.
+
+\stopsection
+
+\stopchapter
diff --git a/systems/doc/luatex/luatex-introduction.tex b/systems/doc/luatex/luatex-introduction.tex
new file mode 100644
index 0000000000..c03725357b
--- /dev/null
+++ b/systems/doc/luatex/luatex-introduction.tex
@@ -0,0 +1,174 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-introduction
+
+\startchapter[title=Introduction]
+
+This is the reference manual of \LUATEX. We don't claim it is complete and we
+assume that the reader knows about \TEX\ as described in \quotation {The \TEX\
+Book}, the \quotation {\ETEX\ manual}, the \quotation {\PDFTEX\ manual}, etc.
+Additional reference material is published in journals of user groups and
+\CONTEXT\ related documentation.
+
+It took about a decade to reach stable version 1.0, but for good reason.
+Successive versions brought new functionality, more control, some cleanup of
+internals. Experimental features evolved into stable ones or were dropped.
+Already quite early \LUATEX\ could be used for production and it was used on a
+daily basis by the authors. Successive versions sometimes demanded an adaption to
+the \LUA\ interfacing, but the concepts were unchanged. The current version can
+be considered stable in functionality and there will be no fundamental changes.
+Of course we then can decide to move towards version 2.00 with different
+properties.
+
+Don't expect \LUATEX\ to behave the same as \PDFTEX ! Although the core
+functionality of that 8 bit engine was starting point, it has been combined with
+the directional support of \OMEGA\ (\ALEPH). But, \LUATEX\ can behave different
+due to its wide (32 bit) characters, many registers and large memory support. The
+\PDF\ code produced differs from \PDFTEX\ but users will normally not notice
+that. There is native \UTF\ input, support for large (more than 8 bit) fonts, and
+the math machinery is tuned for \OPENTYPE\ math. There is support for directional
+typesetting too. The log output can differ from other engines and will likely
+differ more as we move forward. When you run plain \TEX\ for sure \LUATEX\ runs
+slower than \PDFTEX\ but when you run for instance \CONTEXT\ \MKIV\ in many cases
+it runs faster, especially when you have a bit more complex documents or input.
+Anyway, 32 bit all||over combined with more features has a price, but on a modern
+machine this is no real problem.
+
+Testing is done with \CONTEXT, but \LUATEX\ should work fine with other macro
+packages too. For that purpose we provide generic font handlers that are mostly
+the same as used in \CONTEXT. Discussing specific implementations is beyond this
+manual. Even when we keep \LUATEX\ lean and mean, we already have enough to
+discuss here.
+
+\LUATEX\ consists of a number of interrelated but (still) distinguishable parts.
+The organization of the source code is adapted so that it can glue all these
+components together. We continue cleaning up side effects of the accumulated
+code in \TEX\ engines (especially code that is not needed any longer).
+
+\startitemize [unpacked]
+ \startitem
+ We started out with most of \PDFTEX\ version 1.40.9. The code base was
+ converted to \CCODE\ and split in modules. Experimental features were
+ removed and utility macros are not inherited because their functionality
+ can be programmed in \LUA. The number of backend interface commands has
+ been reduced to a few. The so called extensions are separated from the
+ core (which we try to keep close to the original \TEX\ core). Some
+ mechanisms like expansion and protrusion can behave different from the
+ original due to some cleanup and optimization. Some whatsit based
+ functionality (image support and reusable content) is now core
+ functionality. We don't stay in sync with \PDFTEX\ development.
+ \stopitem
+ \startitem
+ The direction model from \ALEPH\ RC4 (which is derived from \OMEGA) is
+ included. The related primitives are part of core \LUATEX\ but at the
+ node level directional support is no longer based on so called whatsits
+ but on real nodes with relevant properties. The number of directions is
+ limited to the useful set and the backend has been made direction aware.
+ \stopitem
+ \startitem
+ Neither \ALEPH's I/O translation processes, nor tcx files, nor \ENCTEX\
+ are available. These encoding|-|related functions are superseded by a
+ \LUA|-|based solution (reader callbacks). In a similar fashion all file
+ \IO\ can be intercepted.
+ \stopitem
+ \startitem
+ We currently use \LUA\ 5.3.*. There are few \LUA\ libraries that we
+ consider part of the core \LUA\ machinery, for instance \type {lpeg}.
+ There are additional \LUA\ libraries that interface to the internals of
+ \TEX. We also keep the \LUA\ 5.2 \type {bit32} library around.
+ \stopitem
+ \startitem
+ There are various \TEX\ extensions but only those that cannot be done
+ using the \LUA\ interfaces. The math machinery often has two code paths:
+ one traditional and the other more suitable for wide \OPENTYPE\ fonts. Here
+ we follow the \MICROSOFT\ specifications as much as possible. Some math
+ functionality has been opened up a bit so that users have more control.
+ \stopitem
+ \startitem
+ The fontloader uses parts of \FONTFORGE\ 2008.11.17 combined with
+ additional code specific for usage in a \TEX\ engine. We try to minimize
+ specific font support to what \TEX\ needs: character references and
+ dimensions and delegate everything else to \LUA. That way we keep \TEX\
+ open for extensions without touching the core. In order to minimize
+ dependencies at some point we may decide to make this an optional
+ library.
+ \stopitem
+ \startitem
+ The \METAPOST\ library is integral part of \LUATEX. This gives \TEX\ some
+ graphical capabilities using a relative high speed graphical subsystem.
+ Again \LUA\ is used as glue between the frontend and backend. Further
+ development of \METAPOST\ is closely related to \LUATEX.
+ \stopitem
+ \startitem
+ The virtual font technology that comes with \TEX\ has been integrated
+ into the font machinery in a way that permits creating virtual fonts
+ at runtime. Because \LUATEX\ can also act as a \LUA\ interpreter this
+ means that a complete \TEX\ workflow can be built without the need for
+ additional programs.
+ \stopitem
+ \startitem
+ The versions starting from 1.09 no longer use the poppler library for
+ inclusion but a lightweight dedicated one. This removes a dependency but
+ also makes the inclusion code of \LUATEX\ different from \PDFTEX. In fact
+ it was already much different due to the \LUA\ image interfacing.
+ \stopitem
+\stopitemize
+
+We try to keep upcoming versions compatible but intermediate releases can contain
+experimental features. A general rule is that versions that end up on \TEXLIVE\
+and|/|or are released around \CONTEXT\ meetings are stable. Any version between
+the yearly \TEXLIVE\ releases are to be considered beta and in the repository end
+up as trunk releases. We have an experimental branch that we use for development
+but there is no support for any of its experimental features. Intermediate
+releases (from trunk) are normally available via the \CONTEXT\ distribution
+channels (the garden and so called minimals).
+
+Version 1.10 is more or less an endpoint in development: this is what you get.
+Because not only \CONTEXT, that we can adapt rather easily, uses \LUATEX, we
+cannot change fundamentals without unforeseen consequences. By now it has been
+proven that \LUA\ can be used to extend the core functionality so there is no
+need to add more, and definitely no hard coded solutions for (not so) common
+problems. Of course there will be bug fixes, maybe some optimization, and there
+might even be some additions or non|-|intrusive improvements, but only after
+testing outside the stable release. After all, the binary is already more than
+large enough and there is not that much to gain.
+
+You might find \LUA\ helpers that are not yet documented. These are considered
+experimental, although when you encounter them in a \CONTEXT\ version that has
+been around for a while you can assume that they will stay. Of course it can just
+be that we forgot to document them yet.
+
+A manual like this is not really meant as tutorial, for that we refer to
+documents that ship with \CONTEXT, articles, etc. It is also never complete
+enough for all readers. We try to keep up but the reader needs to realize that
+it's all volunteer work done in spare time. And for sure, complaining about a bad
+manual or crappy documentation will not really motivate us to spend more time on
+it. That being said, we hope that this document is useful.
+
+\blank[big]
+
+\testpage[5]
+
+\startlines
+Hans Hagen
+Harmut Henkel
+Taco Hoekwater
+Luigi Scarso
+\stoplines
+
+\blank[3*big]
+
+\starttabulate[|||]
+\NC Version \EQ \currentdate \NC \NR
+\NC \LUATEX \EQ \cldcontext{LUATEXENGINE} %
+ \cldcontext{"\letterpercent 0.2f",LUATEXVERSION} / %
+ \cldcontext{LUATEXFUNCTIONALITY}
+ \NC \NR
+\NC \CONTEXT \EQ MkIV \contextversion \NC \NR
+\stoptabulate
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-languages.tex b/systems/doc/luatex/luatex-languages.tex
new file mode 100644
index 0000000000..98960aa65d
--- /dev/null
+++ b/systems/doc/luatex/luatex-languages.tex
@@ -0,0 +1,1113 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-languages
+
+\startchapter[reference=languages,title={Languages, characters, fonts and glyphs}]
+
+\startsection[title={Introduction}]
+
+\topicindex {languages}
+
+\LUATEX's internal handling of the characters and glyphs that eventually become
+typeset is quite different from the way \TEX82 handles those same objects. The
+easiest way to explain the difference is to focus on unrestricted horizontal mode
+(i.e.\ paragraphs) and hyphenation first. Later on, it will be easy to deal
+with the differences that occur in horizontal and math modes.
+
+In \TEX82, the characters you type are converted into \type {char} node records
+when they are encountered by the main control loop. \TEX\ attaches and processes
+the font information while creating those records, so that the resulting \quote
+{horizontal list} contains the final forms of ligatures and implicit kerning.
+This packaging is needed because we may want to get the effective width of for
+instance a horizontal box.
+
+When it becomes necessary to hyphenate words in a paragraph, \TEX\ converts (one
+word at time) the \type {char} node records into a string by replacing ligatures
+with their components and ignoring the kerning. Then it runs the hyphenation
+algorithm on this string, and converts the hyphenated result back into a \quote
+{horizontal list} that is consecutively spliced back into the paragraph stream.
+Keep in mind that the paragraph may contain unboxed horizontal material, which
+then already contains ligatures and kerns and the words therein are part of the
+hyphenation process.
+
+Those \type {char} node records are somewhat misnamed, as they are glyph
+positions in specific fonts, and therefore not really \quote {characters} in the
+linguistic sense. There is no language information inside the \type {char} node
+records at all. Instead, language information is passed along using \type
+{language whatsit} nodes inside the horizontal list.
+
+In \LUATEX, the situation is quite different. The characters you type are always
+converted into \nod {glyph} node records with a special subtype to identify them
+as being intended as linguistic characters. \LUATEX\ stores the needed language
+information in those records, but does not do any font|-|related processing at
+the time of node creation. It only stores the index of the current font and a
+reference to a character in that font.
+
+When it becomes necessary to typeset a paragraph, \LUATEX\ first inserts all
+hyphenation points right into the whole node list. Next, it processes all the
+font information in the whole list (creating ligatures and adjusting kerning),
+and finally it adjusts all the subtype identifiers so that the records are \quote
+{glyph nodes} from now on.
+
+\stopsection
+
+\startsection[title={Characters, glyphs and discretionaries},reference=charsandglyphs]
+
+\topicindex {characters}
+\topicindex {glyphs}
+\topicindex {hyphenation}
+
+\TEX82 (including \PDFTEX) differentiates between \type {char} nodes and \type
+{lig} nodes. The former are simple items that contained nothing but a \quote
+{character} and a \quote {font} field, and they lived in the same memory as
+tokens did. The latter also contained a list of components, and a subtype
+indicating whether this ligature was the result of a word boundary, and it was
+stored in the same place as other nodes like boxes and kerns and glues.
+
+In \LUATEX, these two types are merged into one, somewhat larger structure called
+a \nod {glyph} node. Besides having the old character, font, and component
+fields there are a few more, like \quote {attr} that we will see in \in {section}
+[glyphnodes], these nodes also contain a subtype, that codes four main types and
+two additional ghost types. For ligatures, multiple bits can be set at the same
+time (in case of a single|-|glyph word).
+
+\startitemize
+ \startitem
+ \type {character}, for characters to be hyphenated: the lowest bit
+ (bit 0) is set to 1.
+ \stopitem
+ \startitem
+ \nod {glyph}, for specific font glyphs: the lowest bit (bit 0) is
+ not set.
+ \stopitem
+ \startitem
+ \type {ligature}, for constructed ligatures bit 1 is set.
+ \stopitem
+ \startitem
+ \type {ghost}, for so called \quote {ghost objects} bit 2 is set.
+ \stopitem
+ \startitem
+ \type {left}, for ligatures created from a left word boundary and for
+ ghosts created from \lpr {leftghost} bit 3 gets set.
+ \stopitem
+ \startitem
+ \type {right}, for ligatures created from a right word boundary and
+ for ghosts created from \lpr {rightghost} bit 4 is set.
+ \stopitem
+\stopitemize
+
+The \nod {glyph} nodes also contain language data, split into four items that
+were current when the node was created: the \prm {setlanguage} (15~bits), \prm
+{lefthyphenmin} (8~bits), \prm {righthyphenmin} (8~bits), and \prm {uchyph}
+(1~bit).
+
+Incidentally, \LUATEX\ allows 16383 separate languages, and words can be 256
+characters long. The language is stored with each character. You can set
+\prm {firstvalidlanguage} to for instance~1 and make thereby language~0
+an ignored hyphenation language.
+
+The new primitive \lpr {hyphenationmin} can be used to signal the minimal length
+of a word. This value is stored with the (current) language.
+
+Because the \prm {uchyph} value is saved in the actual nodes, its handling is
+subtly different from \TEX82: changes to \prm {uchyph} become effective
+immediately, not at the end of the current partial paragraph.
+
+Typeset boxes now always have their language information embedded in the nodes
+themselves, so there is no longer a possible dependency on the surrounding
+language settings. In \TEX82, a mid|-|paragraph statement like \type {\unhbox0}
+would process the box using the current paragraph language unless there was a
+\prm {setlanguage} issued inside the box. In \LUATEX, all language variables
+are already frozen.
+
+In traditional \TEX\ the process of hyphenation is driven by \type {lccode}s. In
+\LUATEX\ we made this dependency less strong. There are several strategies
+possible. When you do nothing, the currently used \type {lccode}s are used, when
+loading patterns, setting exceptions or hyphenating a list.
+
+When you set \prm {savinghyphcodes} to a value greater than zero the current set
+of \type {lccode}s will be saved with the language. In that case changing a \type
+{lccode} afterwards has no effect. However, you can adapt the set with:
+
+\starttyping
+\hjcode`a=`a
+\stoptyping
+
+This change is global which makes sense if you keep in mind that the moment that
+hyphenation happens is (normally) when the paragraph or a horizontal box is
+constructed. When \prm {savinghyphcodes} was zero when the language got
+initialized you start out with nothing, otherwise you already have a set.
+
+When a \lpr {hjcode} is greater than 0 but less than 32 is indicates the
+to be used length. In the following example we map a character (\type {x}) onto
+another one in the patterns and tell the engine that \type {œ} counts as one
+character. Because traditionally zero itself is reserved for inhibiting
+hyphenation, a value of 32 counts as zero.
+
+Here are some examples (we assume that French patterns are used):
+
+\starttabulate[||||]
+\NC \NC \type{foobar} \NC \type{foo-bar} \NC \NR
+\NC \type{\hjcode`x=`o} \NC \type{fxxbar} \NC \type{fxx-bar} \NC \NR
+\NC \type{\lefthyphenmin3} \NC \type{œdipus} \NC \type{œdi-pus} \NC \NR
+\NC \type{\lefthyphenmin4} \NC \type{œdipus} \NC \type{œdipus} \NC \NR
+\NC \type{\hjcode`œ=2} \NC \type{œdipus} \NC \type{œdi-pus} \NC \NR
+\NC \type{\hjcode`i=32 \hjcode`d=32} \NC \type{œdipus} \NC \type{œdipus} \NC \NR
+\NC
+\stoptabulate
+
+Carrying all this information with each glyph would give too much overhead and
+also make the process of setting up these codes more complex. A solution with
+\type {hjcode} sets was considered but rejected because in practice the current
+approach is sufficient and it would not be compatible anyway.
+
+Beware: the values are always saved in the format, independent of the setting
+of \prm {savinghyphcodes} at the moment the format is dumped.
+
+A boundary node normally would mark the end of a word which interferes with for
+instance discretionary injection. For this you can use the \prm {wordboundary}
+as a trigger. Here are a few examples of usage:
+
+\startbuffer
+ discrete---discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\discretionary{}{}{---}discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{}{}{---}discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{}{}{---}\wordboundary discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+\startbuffer
+ discrete\wordboundary\discretionary{---}{}{}\wordboundary discrete
+\stopbuffer
+\typebuffer \startnarrower \dontcomplain \hsize 1pt \getbuffer \par \stopnarrower
+
+We only accept an explicit hyphen when there is a preceding glyph and we skip a
+sequence of explicit hyphens since that normally indicates a \type {--} or \type
+{---} ligature in which case we can in a worse case usage get bad node lists
+later on due to messed up ligature building as these dashes are ligatures in base
+fonts. This is a side effect of separating the hyphenation, ligaturing and
+kerning steps.
+
+The start and end of a sequence of characters is signalled by a \nod {glue}, \nod
+{penalty}, \nod {kern} or \nod {boundary} node. But by default also a \nod
+{hlist}, \nod {vlist}, \nod {rule}, \nod {dir}, \nod {whatsit}, \nod {ins}, and
+\nod {adjust} node indicate a start or end. You can omit the last set from the
+test by setting \lpr {hyphenationbounds} to a non|-|zero value:
+
+\starttabulate[|c|l|]
+\DB value \BC behaviour \NC \NR
+\TB
+\NC \type{0} \NC not strict \NC \NR
+\NC \type{1} \NC strict start \NC \NR
+\NC \type{2} \NC strict end \NC \NR
+\NC \type{3} \NC strict start and strict end \NC \NR
+\LL
+\stoptabulate
+
+The word start is determined as follows:
+
+\starttabulate[|l|l|]
+\DB node \BC behaviour \NC \NR
+\TB
+\BC boundary \NC yes when wordboundary \NC \NR
+\BC hlist \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC vlist \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC rule \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC dir \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC whatsit \NC when hyphenationbounds 1 or 3 \NC \NR
+\BC glue \NC yes \NC \NR
+\BC math \NC skipped \NC \NR
+\BC glyph \NC exhyphenchar (one only) : yes (so no -- ---) \NC \NR
+\BC otherwise \NC yes \NC \NR
+\LL
+\stoptabulate
+
+The word end is determined as follows:
+
+\starttabulate[|l|l|]
+\DB node \BC behaviour \NC \NR
+\TB
+\BC boundary \NC yes \NC \NR
+\BC glyph \NC yes when different language \NC \NR
+\BC glue \NC yes \NC \NR
+\BC penalty \NC yes \NC \NR
+\BC kern \NC yes when not italic (for some historic reason) \NC \NR
+\BC hlist \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC vlist \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC rule \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC dir \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC whatsit \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC ins \NC when hyphenationbounds 2 or 3 \NC \NR
+\BC adjust \NC when hyphenationbounds 2 or 3 \NC \NR
+\LL
+\stoptabulate
+
+\in {Figures} [hb:1] upto \in [hb:5] show some examples. In all cases we set the
+min values to 1 and make sure that the words hyphenate at each character.
+
+\hyphenation{o-n-e t-w-o}
+
+\def\SomeTest#1#2%
+ {\lefthyphenmin \plusone
+ \righthyphenmin \plusone
+ \parindent \zeropoint
+ \everypar \emptytoks
+ \dontcomplain
+ \hbox to 2cm {%
+ \vtop {%
+ \hsize 1pt
+ \hyphenationbounds#1
+ #2
+ \par}}}
+
+\startplacefigure[reference=hb:1,title={\type{one}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one}} {\type{0}}
+ {\SomeTest{1}{one}} {\type{1}}
+ {\SomeTest{2}{one}} {\type{2}}
+ {\SomeTest{3}{one}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:2,title={\type{one\null two}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one\null two}} {\type{0}}
+ {\SomeTest{1}{one\null two}} {\type{1}}
+ {\SomeTest{2}{one\null two}} {\type{2}}
+ {\SomeTest{3}{one\null two}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:3,title={\type{\null one\null two}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{\null one\null two}} {\type{0}}
+ {\SomeTest{1}{\null one\null two}} {\type{1}}
+ {\SomeTest{2}{\null one\null two}} {\type{2}}
+ {\SomeTest{3}{\null one\null two}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:4,title={\type{one\null two\null}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{one\null two\null}} {\type{0}}
+ {\SomeTest{1}{one\null two\null}} {\type{1}}
+ {\SomeTest{2}{one\null two\null}} {\type{2}}
+ {\SomeTest{3}{one\null two\null}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+\startplacefigure[reference=hb:5,title={\type{\null one\null two\null}}]
+ \startcombination[4*1]
+ {\SomeTest{0}{\null one\null two\null}} {\type{0}}
+ {\SomeTest{1}{\null one\null two\null}} {\type{1}}
+ {\SomeTest{2}{\null one\null two\null}} {\type{2}}
+ {\SomeTest{3}{\null one\null two\null}} {\type{3}}
+ \stopcombination
+\stopplacefigure
+
+% (Future versions of \LUATEX\ might provide more granularity.)
+
+In traditional \TEX\ ligature building and hyphenation are interwoven with the
+line break mechanism. In \LUATEX\ these phases are isolated. As a consequence we
+deal differently with (a sequence of) explicit hyphens. We already have added
+some control over aspects of the hyphenation and yet another one concerns
+automatic hyphens (e.g.\ \type {-} characters in the input).
+
+When \lpr {automatichyphenmode} has a value of 0, a hyphen will be turned into
+an automatic discretionary. The snippets before and after it will not be
+hyphenated. A side effect is that a leading hyphen can lead to a split but one
+will seldom run into that situation. Setting a pre and post character makes this
+more prominent. A value of 1 will prevent this side effect and a value of 2 will
+not turn the hyphen into a discretionary. Experiments with other options, like
+permitting hyphenation of the words on both sides were discarded.
+
+\startbuffer[a]
+before-after \par
+before--after \par
+before---after \par
+\stopbuffer
+
+\startbuffer[b]
+-before \par
+after- \par
+--before \par
+after-- \par
+---before \par
+after--- \par
+\stopbuffer
+
+\startbuffer[c]
+before-after \par
+before--after \par
+before---after \par
+\stopbuffer
+
+\startbuffer[demo]
+\startcombination[nx=4,ny=3,location=top]
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[a]}} {A~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[a]}} {A~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[a]}} {A~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[a]}} {A~2~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[b]}} {B~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[b]}} {B~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[b]}} {B~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[b]}} {B~2~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize6em \getbuffer[c]}} {C~0~6em}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\zerocount \hsize2pt \getbuffer[c]}} {C~0~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plusone \hsize2pt \getbuffer[c]}} {C~1~2pt}
+ {\framed[align=normal,strut=no,top=\vskip.5ex,bottom=\vskip.5ex]{\automatichyphenmode\plustwo \hsize2pt \getbuffer[c]}} {C~2~2pt}
+\stopcombination
+\stopbuffer
+
+\startplacefigure[locationreference=automatichyphenmode:1,title={The automatic modes \type {0} (default), \type {1} and \type {2}, with a \prm {hsize}
+of 6em and 2pt (which triggers a linebreak).}]
+ \dontcomplain \tt \getbuffer[demo]
+\stopplacefigure
+
+\startplacefigure[reference=automatichyphenmode:2,title={The automatic modes \type {0} (default), \type {1} and \type {2}, with \lpr {preexhyphenchar} and \lpr {postexhyphenchar} set to characters \type {A} and \type {B}.}]
+ \postexhyphenchar`A\relax
+ \preexhyphenchar `B\relax
+ \dontcomplain \tt \getbuffer[demo]
+\stopplacefigure
+
+In \in {figure} [automatichyphenmode:1] \in {and} [automatichyphenmode:2] we show
+what happens with three samples:
+
+Input A: \typebuffer[a]
+Input B: \typebuffer[b]
+Input C: \typebuffer[c]
+
+As with primitive companions of other single character commands, the \prm {-}
+command has a more verbose primitive version in \lpr {explicitdiscretionary}
+and the normally intercepted in the hyphenator character \type {-} (or whatever
+is configured) is available as \lpr {automaticdiscretionary}.
+
+\stopsection
+
+\startsection[title={The main control loop}]
+
+\topicindex {main loop}
+\topicindex {hyphenation}
+
+In \LUATEX's main loop, almost all input characters that are to be typeset are
+converted into \nod {glyph} node records with subtype \quote {character}, but
+there are a few exceptions.
+
+\startitemize[n]
+
+\startitem
+ The \prm {accent} primitive creates nodes with subtype \quote {glyph}
+ instead of \quote {character}: one for the actual accent and one for the
+ accentee. The primary reason for this is that \prm {accent} in \TEX82 is
+ explicitly dependent on the current font encoding, so it would not make much
+ sense to attach a new meaning to the primitive's name, as that would
+ invalidate many old documents and macro packages. A secondary reason is that
+ in \TEX82, \prm {accent} prohibits hyphenation of the current word. Since
+ in \LUATEX\ hyphenation only takes place on \quote {character} nodes, it is
+ possible to achieve the same effect. Of course, modern \UNICODE\ aware macro
+ packages will not use the \prm {accent} primitive at all but try to map
+ directly on composed characters.
+
+ This change of meaning did happen with \prm {char}, that now generates
+ \quote {glyph} nodes with a character subtype. In traditional \TEX\ there was
+ a strong relationship between the 8|-|bit input encoding, hyphenation and
+ glyphs taken from a font. In \LUATEX\ we have \UTF\ input, and in most cases
+ this maps directly to a character in a font, apart from glyph replacement in
+ the font engine. If you want to access arbitrary glyphs in a font directly
+ you can always use \LUA\ to do so, because fonts are available as \LUA\
+ table.
+\stopitem
+
+\startitem
+ All the results of processing in math mode eventually become nodes with
+ \quote {glyph} subtypes. In fact, the result of processing math is just
+ a regular list of glyphs, kerns, glue, penalties, boxes etc.
+\stopitem
+
+\startitem
+ The \ALEPH|-|derived commands \lpr {leftghost} and \lpr {rightghost}
+ create nodes of a third subtype: \quote {ghost}. These nodes are ignored
+ completely by all further processing until the stage where inter|-|glyph
+ kerning is added.
+\stopitem
+
+\startitem
+ Automatic discretionaries are handled differently. \TEX82 inserts an empty
+ discretionary after sensing an input character that matches the \prm
+ {hyphenchar} in the current font. This test is wrong in our opinion: whether
+ or not hyphenation takes place should not depend on the current font, it is a
+ language property. \footnote {When \TEX\ showed up we didn't have \UNICODE\
+ yet and being limited to eight bits meant that one sometimes had to
+ compromise between supporting character input, glyph rendering, hyphenation.}
+
+ In \LUATEX, it works like this: if \LUATEX\ senses a string of input
+ characters that matches the value of the new integer parameter \prm
+ {exhyphenchar}, it will insert an explicit discretionary after that series of
+ nodes. Initially \TEX\ sets the \type {\exhyphenchar=`\-}. Incidentally, this
+ is a global parameter instead of a language-specific one because it may be
+ useful to change the value depending on the document structure instead of the
+ text language.
+
+ The insertion of discretionaries after a sequence of explicit hyphens happens
+ at the same time as the other hyphenation processing, {\it not\/} inside the
+ main control loop.
+
+ The only use \LUATEX\ has for \prm {hyphenchar} is at the check whether a
+ word should be considered for hyphenation at all. If the \prm {hyphenchar}
+ of the font attached to the first character node in a word is negative, then
+ hyphenation of that word is abandoned immediately. This behaviour is added
+ for backward compatibility only, and the use of \type {\hyphenchar=-1} as a
+ means of preventing hyphenation should not be used in new \LUATEX\ documents.
+\stopitem
+
+\startitem
+ The \prm {setlanguage} command no longer creates whatsits. The meaning of
+ \prm {setlanguage} is changed so that it is now an integer parameter like all
+ others. That integer parameter is used in \type {\glyph_node} creation to add
+ language information to the glyph nodes. In conjunction, the \prm {language}
+ primitive is extended so that it always also updates the value of \prm
+ {setlanguage}.
+\stopitem
+
+\startitem
+ The \prm {noboundary} command (that prohibits word boundary processing
+ where that would normally take place) now does create nodes. These nodes are
+ needed because the exact place of the \prm {noboundary} command in the
+ input stream has to be retained until after the ligature and font processing
+ stages.
+\stopitem
+
+\startitem
+ There is no longer a \type {main_loop} label in the code. Remember that
+ \TEX82 did quite a lot of processing while adding \type {char_nodes} to the
+ horizontal list? For speed reasons, it handled that processing code outside
+ of the \quote {main control} loop, and only the first character of any \quote
+ {word} was handled by that \quote {main control} loop. In \LUATEX, there is
+ no longer a need for that (all hard work is done later), and the (now very
+ small) bits of character|-|handling code have been moved back inline. When
+ \prm {tracingcommands} is on, this is visible because the full word is
+ reported, instead of just the initial character.
+\stopitem
+
+\stopitemize
+
+Because we tend to make hard coded behaviour configurable a few new primitives
+have been added:
+
+\starttyping
+\hyphenpenaltymode
+\automatichyphenpenalty
+\explicithyphenpenalty
+\stoptyping
+
+The first parameter has the following consequences for automatic discs (the ones
+resulting from an \prm {exhyphenchar}:
+
+\starttabulate[|c|l|l|]
+\DB mode \BC automatic disc \type {-} \BC explicit disc \prm{-} \NC \NR
+\TB
+\NC \type{0} \NC \prm {exhyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{1} \NC \prm {hyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\NC \type{2} \NC \prm {exhyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\NC \type{3} \NC \prm {hyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{4} \NC \lpr {automatichyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{5} \NC \prm {exhyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{6} \NC \prm {hyphenpenalty} \NC \lpr {explicithyphenpenalty} \NC \NR
+\NC \type{7} \NC \lpr {automatichyphenpenalty} \NC \prm {exhyphenpenalty} \NC \NR
+\NC \type{8} \NC \lpr {automatichyphenpenalty} \NC \prm {hyphenpenalty} \NC \NR
+\LL
+\stoptabulate
+
+other values do what we always did in \LUATEX: insert \prm {exhyphenpenalty}.
+
+\stopsection
+
+\startsection[title={Loading patterns and exceptions},reference=patternsexceptions]
+
+\topicindex {hyphenation}
+\topicindex {hyphenation+patterns}
+\topicindex {hyphenation+exceptions}
+\topicindex {patterns}
+\topicindex {exceptions}
+
+Although we keep the traditional approach towards hyphenation (which is still
+superior) the implementation of the hyphenation algorithm in \LUATEX\ is quite
+different from the one in \TEX82.
+
+After expansion, the argument for \prm {patterns} has to be proper \UTF8 with
+individual patterns separated by spaces, no \prm {char} or \prm {chardef}d
+commands are allowed. The current implementation is quite strict and will reject
+all non|-|\UNICODE\ characters. Likewise, the expanded argument for \prm
+{hyphenation} also has to be proper \UTF8, but here a bit of extra syntax is
+provided:
+
+\startitemize[n]
+\startitem
+ Three sets of arguments in curly braces (\type {{}{}{}}) indicate a desired
+ complex discretionary, with arguments as in \prm {discretionary}'s command in
+ normal document input.
+\stopitem
+\startitem
+ A \type {-} indicates a desired simple discretionary, cf.\ \type {\-} and
+ \type {\discretionary{-}{}{}} in normal document input.
+\stopitem
+\startitem
+ Internal command names are ignored. This rule is provided especially for \prm
+ {discretionary}, but it also helps to deal with \prm {relax} commands that
+ may sneak in.
+\stopitem
+\startitem
+ An \type {=} indicates a (non|-|discretionary) hyphen in the document input.
+\stopitem
+\stopitemize
+
+The expanded argument is first converted back to a space|-|separated string while
+dropping the internal command names. This string is then converted into a
+dictionary by a routine that creates key|-|value pairs by converting the other
+listed items. It is important to note that the keys in an exception dictionary
+can always be generated from the values. Here are a few examples:
+
+\starttabulate[|l|l|l|]
+\DB value \BC implied key (input) \BC effect \NC\NR
+\TB
+\NC \type {ta-ble} \NC table \NC \type {ta\-ble} ($=$ \type {ta\discretionary{-}{}{}ble}) \NC\NR
+\NC \type {ba{k-}{}{c}ken} \NC backen \NC \type {ba\discretionary{k-}{}{c}ken} \NC\NR
+\LL
+\stoptabulate
+
+The resultant patterns and exception dictionary will be stored under the language
+code that is the present value of \prm {language}.
+
+In the last line of the table, you see there is no \prm {discretionary} command
+in the value: the command is optional in the \TEX-based input syntax. The
+underlying reason for that is that it is conceivable that a whole dictionary of
+words is stored as a plain text file and loaded into \LUATEX\ using one of the
+functions in the \LUA\ \type {lang} library. This loading method is quite a bit
+faster than going through the \TEX\ language primitives, but some (most?) of that
+speed gain would be lost if it had to interpret command sequences while doing so.
+
+It is possible to specify extra hyphenation points in compound words by using
+\type {{-}{}{-}} for the explicit hyphen character (replace \type {-} by the
+actual explicit hyphen character if needed). For example, this matches the word
+\quote {multi|-|word|-|boundaries} and allows an extra break inbetween \quote
+{boun} and \quote {daries}:
+
+\starttyping
+\hyphenation{multi{-}{}{-}word{-}{}{-}boun-daries}
+\stoptyping
+
+The motivation behind the \ETEX\ extension \prm {savinghyphcodes} was that
+hyphenation heavily depended on font encodings. This is no longer true in
+\LUATEX, and the corresponding primitive is basically ignored. Because we now
+have \lpr {hjcode}, the case relate codes can be used exclusively for \prm
+{uppercase} and \prm {lowercase}.
+
+The three curly brace pair pattern in an exception can be somewhat unexpected so
+we will try to explain it by example. The pattern \type {foo{}{}{x}bar} pattern
+creates a lookup \type {fooxbar} and the pattern \type {foo{}{}{}bar} creates
+\type {foobar}. Then, when a hit happens there is a replacement text (\type {x})
+or none. Because we introduced penalties in discretionary nodes, the exception
+syntax now also can take a penalty specification. The value between square brackets
+is a multiplier for \lpr {exceptionpenalty}. Here we have set it to 10000 so
+effectively we get 30000 in the example.
+
+\def\ShowSample#1#2%
+ {\startlinecorrection[blank]
+ \hyphenation{#1}%
+ \exceptionpenalty=10000
+ \bTABLE[foregroundstyle=type]
+ \bTR
+ \bTD[align=middle,nx=4] \type{#1} \eTD
+ \eTR
+ \bTR
+ \bTD[align=middle] \type{10em} \eTD
+ \bTD[align=middle] \type {3em} \eTD
+ \bTD[align=middle] \type {0em} \eTD
+ \bTD[align=middle] \type {6em} \eTD
+ \eTR
+ \bTR
+ \bTD[width=10em]\vtop{\hsize 10em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\hsize 3em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\hsize 0em 123 #2 123\par}\eTD
+ \bTD[width=10em]\vtop{\setupalign[verytolerant,stretch]\rmtf\hsize 6em 123 #2 #2 #2 #2 123\par}\eTD
+ \eTR
+ \eTABLE
+ \stoplinecorrection}
+
+\ShowSample{x{a-}{-b}{}x{a-}{-b}{}x{a-}{-b}{}x{a-}{-b}{}xx}{xxxxxx}
+\ShowSample{x{a-}{-b}{}x{a-}{-b}{}[3]x{a-}{-b}{}[1]x{a-}{-b}{}xx}{xxxxxx}
+
+\ShowSample{z{a-}{-b}{z}{a-}{-b}{z}{a-}{-b}{z}{a-}{-b}{z}z}{zzzzzz}
+\ShowSample{z{a-}{-b}{z}{a-}{-b}{z}[3]{a-}{-b}{z}[1]{a-}{-b}{z}z}{zzzzzz}
+
+\stopsection
+
+\startsection[title={Applying hyphenation}]
+
+\topicindex {hyphenation+how it works}
+\topicindex {hyphenation+discretionaries}
+\topicindex {discretionaries}
+
+The internal structures \LUATEX\ uses for the insertion of discretionaries in
+words is very different from the ones in \TEX82, and that means there are some
+noticeable differences in handling as well.
+
+First and foremost, there is no \quote {compressed trie} involved in hyphenation.
+The algorithm still reads pattern files generated by \PATGEN, but \LUATEX\ uses a
+finite state hash to match the patterns against the word to be hyphenated. This
+algorithm is based on the \quote {libhnj} library used by \OPENOFFICE, which in
+turn is inspired by \TEX.
+
+There are a few differences between \LUATEX\ and \TEX82 that are a direct result
+of the implementation:
+
+\startitemize
+\startitem
+ \LUATEX\ happily hyphenates the full \UNICODE\ character range.
+\stopitem
+\startitem
+ Pattern and exception dictionary size is limited by the available memory
+ only, all allocations are done dynamically. The trie|-|related settings in
+ \type {texmf.cnf} are ignored.
+\stopitem
+\startitem
+ Because there is no \quote {trie preparation} stage, language patterns never
+ become frozen. This means that the primitive \prm {patterns} (and its \LUA\
+ counterpart \type {lang.patterns}) can be used at any time, not only in
+ ini\TEX.
+\stopitem
+\startitem
+ Only the string representation of \prm {patterns} and \prm {hyphenation} is
+ stored in the format file. At format load time, they are simply
+ re|-|evaluated. It follows that there is no real reason to preload languages
+ in the format file. In fact, it is usually not a good idea to do so. It is
+ much smarter to load patterns no sooner than the first time they are actually
+ needed.
+\stopitem
+\startitem
+ \LUATEX\ uses the language-specific variables \lpr {prehyphenchar} and \lpr
+ {posthyphenchar} in the creation of implicit discretionaries, instead of
+ \TEX82's \prm {hyphenchar}, and the values of the language|-|specific
+ variables \lpr {preexhyphenchar} and \lpr {postexhyphenchar} for explicit
+ discretionaries (instead of \TEX82's empty discretionary).
+\stopitem
+\startitem
+ The value of the two counters related to hyphenation, \prm {hyphenpenalty}
+ and \prm {exhyphenpenalty}, are now stored in the discretionary nodes. This
+ permits a local overload for explicit \prm {discretionary} commands. The
+ value current when the hyphenation pass is applied is used. When no callbacks
+ are used this is compatible with traditional \TEX. When you apply the \LUA\
+ \type {lang.hyphenate} function the current values are used.
+\stopitem
+\startitem
+ The hyphenation exception dictionary is maintained as key|-|value hash, and
+ that is also dynamic, so the \type {hyph_size} setting is not used either.
+\stopitem
+\stopitemize
+
+Because we store penalties in the disc node the \prm {discretionary} command has
+been extended to accept an optional penalty specification, so you can do the
+following:
+
+\startbuffer
+\hsize1mm
+1:foo{\hyphenpenalty 10000\discretionary{}{}{}}bar\par
+2:foo\discretionary penalty 10000 {}{}{}bar\par
+3:foo\discretionary{}{}{}bar\par
+\stopbuffer
+
+\typebuffer
+
+This results in:
+
+\blank \start \getbuffer \stop \blank
+
+Inserted characters and ligatures inherit their attributes from the nearest glyph
+node item (usually the preceding one, but the following one for the items
+inserted at the left-hand side of a word).
+
+Word boundaries are no longer implied by font switches, but by language switches.
+One word can have two separate fonts and still be hyphenated correctly (but it
+can not have two different languages, the \prm {setlanguage} command forces a
+word boundary).
+
+All languages start out with \type {\prehyphenchar=`\-}, \type {\posthyphenchar=0},
+\type {\preexhyphenchar=0} and \type {\postexhyphenchar=0}. When you assign the
+values of one of these four parameters, you are actually changing the settings
+for the current \prm {language}, this behaviour is compatible with \prm {patterns}
+and \prm {hyphenation}.
+
+\LUATEX\ also hyphenates the first word in a paragraph. Words can be up to 256
+characters long (up from 64 in \TEX82). Longer words are ignored right now, but
+eventually either the limitation will be removed or perhaps it will become
+possible to silently ignore the excess characters (this is what happens in
+\TEX82, but there the behaviour cannot be controlled).
+
+If you are using the \LUA\ function \type {lang.hyphenate}, you should be aware
+that this function expects to receive a list of \quote {character} nodes. It will
+not operate properly in the presence of \quote {glyph}, \quote {ligature}, or
+\quote {ghost} nodes, nor does it know how to deal with kerning.
+
+\stopsection
+
+\startsection[title={Applying ligatures and kerning}]
+
+\topicindex {ligatures}
+\topicindex {kerning}
+
+After all possible hyphenation points have been inserted in the list, \LUATEX\
+will process the list to convert the \quote {character} nodes into \quote {glyph}
+and \quote {ligature} nodes. This is actually done in two stages: first all
+ligatures are processed, then all kerning information is applied to the result
+list. But those two stages are somewhat dependent on each other: If the used font
+makes it possible to do so, the ligaturing stage adds virtual \quote {character}
+nodes to the word boundaries in the list. While doing so, it removes and
+interprets \prm {noboundary} nodes. The kerning stage deletes those word
+boundary items after it is done with them, and it does the same for \quote
+{ghost} nodes. Finally, at the end of the kerning stage, all remaining \quote
+{character} nodes are converted to \quote {glyph} nodes.
+
+This word separation is worth mentioning because, if you overrule from \LUA\ only
+one of the two callbacks related to font handling, then you have to make sure you
+perform the tasks normally done by \LUATEX\ itself in order to make sure that the
+other, non|-|overruled, routine continues to function properly.
+
+Although we could improve the situation the reality is that in modern \OPENTYPE\
+fonts ligatures can be constructed in many ways: by replacing a sequence of
+characters by one glyph, or by selectively replacing individual glyphs, or by
+kerning, or any combination of this. Add to that contextual analysis and it will
+be clear that we have to let \LUA\ do that job instead. The generic font handler
+that we provide (which is part of \CONTEXT) distinguishes between base mode
+(which essentially is what we describe here and which delegates the task to \TEX)
+and node mode (which deals with more complex fonts.
+
+Let's look at an example. Take the word \type {office}, hyphenated \type
+{of-fice}, using a \quote {normal} font with all the \type {f}-\type {f} and
+\type {f}-\type {i} type ligatures:
+
+\starttabulate[|l|l|]
+\NC initial \NC \type {{o}{f}{f}{i}{c}{e}} \NC\NR
+\NC after hyphenation \NC \type {{o}{f}{{-},{},{}}{f}{i}{c}{e}} \NC\NR
+\NC first ligature stage \NC \type {{o}{{f-},{f},{<ff>}}{i}{c}{e}} \NC\NR
+\NC final result \NC \type {{o}{{f-},{<fi>},{<ffi>}}{c}{e}} \NC\NR
+\stoptabulate
+
+That's bad enough, but let us assume that there is also a hyphenation point
+between the \type {f} and the \type {i}, to create \type {of-f-ice}. Then the
+final result should be:
+
+\starttyping
+{o}{{f-},
+ {{f-},
+ {i},
+ {<fi>}},
+ {{<ff>-},
+ {i},
+ {<ffi>}}}{c}{e}
+\stoptyping
+
+with discretionaries in the post-break text as well as in the replacement text of
+the top-level discretionary that resulted from the first hyphenation point.
+
+Here is that nested solution again, in a different representation:
+
+\testpage[4]
+
+\starttabulate[|l|c|c|c|c|c|c|]
+\DB \BC pre \BC \BC post \BC \BC replace \BC \NC \NR
+\TB
+\NC topdisc \NC \type {f-} \NC (1) \NC \NC sub 1 \NC \NC sub 2 \NC \NR
+\NC sub 1 \NC \type {f-} \NC (2) \NC \type {i} \NC (3) \NC \type {<fi>} \NC (4) \NC \NR
+\NC sub 2 \NC \type {<ff>-} \NC (5) \NC \type {i} \NC (6) \NC \type {<ffi>} \NC (7) \NC \NR
+\LL
+\stoptabulate
+
+When line breaking is choosing its breakpoints, the following fields will
+eventually be selected:
+
+\starttabulate[|l|c|c|]
+\NC \type {of-f-ice} \NC \type {f-} \NC (1) \NC \NR
+\NC \NC \type {f-} \NC (2) \NC \NR
+\NC \NC \type {i} \NC (3) \NC \NR
+\NC \type {of-fice} \NC \type {f-} \NC (1) \NC \NR
+\NC \NC \type {<fi>} \NC (4) \NC \NR
+\NC \type {off-ice} \NC \type {<ff>-} \NC (5) \NC \NR
+\NC \NC \type {i} \NC (6) \NC \NR
+\NC \type {office} \NC \type {<ffi>} \NC (7) \NC \NR
+\stoptabulate
+
+The current solution in \LUATEX\ is not able to handle nested discretionaries,
+but it is in fact smart enough to handle this fictional \type {of-f-ice} example.
+It does so by combining two sequential discretionary nodes as if they were a
+single object (where the second discretionary node is treated as an extension of
+the first node).
+
+One can observe that the \type {of-f-ice} and \type {off-ice} cases both end with
+the same actual post replacement list (\type {i}), and that this would be the
+case even if \type {i} was the first item of a potential following ligature like
+\type {ic}. This allows \LUATEX\ to do away with one of the fields, and thus make
+the whole stuff fit into just two discretionary nodes.
+
+The mapping of the seven list fields to the six fields in this discretionary node
+pair is as follows:
+
+\starttabulate[|l|c|c|]
+\DB field \BC description \NC \NC \NR
+\TB
+\NC \type {disc1.pre} \NC \type {f-} \NC (1) \NC \NR
+\NC \type {disc1.post} \NC \type {<fi>} \NC (4) \NC \NR
+\NC \type {disc1.replace} \NC \type {<ffi>} \NC (7) \NC \NR
+\NC \type {disc2.pre} \NC \type {f-} \NC (2) \NC \NR
+\NC \type {disc2.post} \NC \type {i} \NC (3,6) \NC \NR
+\NC \type {disc2.replace} \NC \type {<ff>-} \NC (5) \NC \NR
+\LL
+\stoptabulate
+
+What is actually generated after ligaturing has been applied is therefore:
+
+\starttyping
+{o}{{f-},
+ {<fi>},
+ {<ffi>}}
+ {{f-},
+ {i},
+ {<ff>-}}{c}{e}
+\stoptyping
+
+The two discretionaries have different subtypes from a discretionary appearing on
+its own: the first has subtype 4, and the second has subtype 5. The need for
+these special subtypes stems from the fact that not all of the fields appear in
+their \quote {normal} location. The second discretionary especially looks odd,
+with things like the \type {<ff>-} appearing in \type {disc2.replace}. The fact
+that some of the fields have different meanings (and different processing code
+internally) is what makes it necessary to have different subtypes: this enables
+\LUATEX\ to distinguish this sequence of two joined discretionary nodes from the
+case of two standalone discretionaries appearing in a row.
+
+Of course there is still that relationship with fonts: ligatures can be implemented by
+mapping a sequence of glyphs onto one glyph, but also by selective replacement and
+kerning. This means that the above examples are just representing the traditional
+approach.
+
+\stopsection
+
+\startsection[title={Breaking paragraphs into lines}]
+
+\topicindex {linebreaks}
+\topicindex {paragraphs}
+\topicindex {discretionaries}
+
+This code is almost unchanged, but because of the above|-|mentioned changes
+with respect to discretionaries and ligatures, line breaking will potentially be
+different from traditional \TEX. The actual line breaking code is still based on
+the \TEX82 algorithms, and it does not expect there to be discretionaries inside
+of discretionaries. But, as patterns evolve and font handling can influence
+discretionaries, you need to be aware of the fact that long term consistency is not
+an engine matter only.
+
+But that situation is now fairly common in \LUATEX, due to the changes to the
+ligaturing mechanism. And also, the \LUATEX\ discretionary nodes are implemented
+slightly different from the \TEX82 nodes: the \type {no_break} text is now
+embedded inside the disc node, where previously these nodes kept their place in
+the horizontal list. In traditional \TEX\ the discretionary node contains a
+counter indicating how many nodes to skip, but in \LUATEX\ we store the pre, post
+and replace text in the discretionary node.
+
+The combined effect of these two differences is that \LUATEX\ does not always use
+all of the potential breakpoints in a paragraph, especially when fonts with many
+ligatures are used. Of course kerning also complicates matters here.
+
+\stopsection
+
+\startsection[title={The \type {lang} library}][library=lang]
+
+\subsection {\type {new} and \type {id}}
+
+\topicindex {languages+library}
+
+\libindex {new}
+\libindex {id}
+
+This library provides the interface to \LUATEX's structure representing a
+language, and the associated functions.
+
+\startfunctioncall
+<language> l = lang.new()
+<language> l = lang.new(<number> id)
+\stopfunctioncall
+
+This function creates a new userdata object. An object of type \type {<language>}
+is the first argument to most of the other functions in the \type {lang} library.
+These functions can also be used as if they were object methods, using the colon
+syntax. Without an argument, the next available internal id number will be
+assigned to this object. With argument, an object will be created that links to
+the internal language with that id number.
+
+\startfunctioncall
+<number> n = lang.id(<language> l)
+\stopfunctioncall
+
+The number returned is the internal \prm {language} id number this object refers to.
+
+\subsection {\type {hyphenation}}
+
+\libindex {hyphenation}
+
+You can hyphenate a string directly with:
+
+\startfunctioncall
+<string> n = lang.hyphenation(<language> l)
+lang.hyphenation(<language> l, <string> n)
+\stopfunctioncall
+
+\subsection {\type {clear_hyphenation} and \type {clean}}
+
+\libindex {clear_hyphenation}
+\libindex {clean}
+
+This either returns the current hyphenation exceptions for this language, or adds
+new ones. The syntax of the string is explained in~\in {section}
+[patternsexceptions].
+
+\startfunctioncall
+lang.clear_hyphenation(<language> l)
+\stopfunctioncall
+
+This call clears the exception dictionary (string) for this language.
+
+\startfunctioncall
+<string> n = lang.clean(<language> l, <string> o)
+<string> n = lang.clean(<string> o)
+\stopfunctioncall
+
+This function creates a hyphenation key from the supplied hyphenation value. The
+syntax of the argument string is explained in \in {section} [patternsexceptions].
+This function is useful if you want to do something else based on the words in a
+dictionary file, like spell|-|checking.
+
+\subsection {\type {patterns} and \type {clear_patterns}}
+
+\libindex {patterns}
+\libindex {clear_patterns}
+
+\startfunctioncall
+<string> n = lang.patterns(<language> l)
+lang.patterns(<language> l, <string> n)
+\stopfunctioncall
+
+This adds additional patterns for this language object, or returns the current
+set. The syntax of this string is explained in \in {section}
+[patternsexceptions].
+
+\startfunctioncall
+lang.clear_patterns(<language> l)
+\stopfunctioncall
+
+This can be used to clear the pattern dictionary for a language.
+
+\subsection {\type {hyphenationmin}}
+
+\libindex {hyphenationmin}
+
+This function sets (or gets) the value of the \TEX\ parameter
+\type {\hyphenationmin}.
+
+\startfunctioncall
+n = lang.hyphenationmin(<language> l)
+lang.hyphenationmin(<language> l, <number> n)
+\stopfunctioncall
+
+\subsection {\type {[pre|post][ex|]hyphenchar}}
+
+\libindex {prehyphenchar}
+\libindex {posthyphenchar}
+\libindex {preexhyphenchar}
+\libindex {postexhyphenchar}
+
+\startfunctioncall
+<number> n = lang.prehyphenchar(<language> l)
+lang.prehyphenchar(<language> l, <number> n)
+
+<number> n = lang.posthyphenchar(<language> l)
+lang.posthyphenchar(<language> l, <number> n)
+\stopfunctioncall
+
+These two are used to get or set the \quote {pre|-|break} and \quote
+{post|-|break} hyphen characters for implicit hyphenation in this language. The
+intial values are decimal 45 (hyphen) and decimal~0 (indicating emptiness).
+
+\startfunctioncall
+<number> n = lang.preexhyphenchar(<language> l)
+lang.preexhyphenchar(<language> l, <number> n)
+
+<number> n = lang.postexhyphenchar(<language> l)
+lang.postexhyphenchar(<language> l, <number> n)
+\stopfunctioncall
+
+These gets or set the \quote {pre|-|break} and \quote {post|-|break} hyphen
+characters for explicit hyphenation in this language. Both are initially
+decimal~0 (indicating emptiness).
+
+\subsection {\type {hyphenate}}
+
+\libindex {hyphenate}
+
+The next call inserts hyphenation points (discretionary nodes) in a node list. If
+\type {tail} is given as argument, processing stops on that node. Currently,
+\type {success} is always true if \type {head} (and \type {tail}, if specified)
+are proper nodes, regardless of possible other errors.
+
+\startfunctioncall
+<boolean> success = lang.hyphenate(<node> head)
+<boolean> success = lang.hyphenate(<node> head, <node> tail)
+\stopfunctioncall
+
+Hyphenation works only on \quote {characters}, a special subtype of all the glyph
+nodes with the node subtype having the value \type {1}. Glyph modes with
+different subtypes are not processed. See \in {section} [charsandglyphs] for
+more details.
+
+\subsection {\type {[set|get]hjcode}}
+
+\libindex {sethjcode}
+\libindex {gethjcode}
+
+The following two commands can be used to set or query hj codes:
+
+\startfunctioncall
+lang.sethjcode(<language> l, <number> char, <number> usedchar)
+<number> usedchar = lang.gethjcode(<language> l, <number> char)
+\stopfunctioncall
+
+When you set a hjcode the current sets get initialized unless the set was already
+initialized due to \prm {savinghyphcodes} being larger than zero.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% \parindent0pt \hsize=1.1cm
+% 12-34-56 \par
+% 12-34-\hbox{56} \par
+% 12-34-\vrule width 1em height 1.5ex \par
+% 12-\hbox{34}-56 \par
+% 12-\vrule width 1em height 1.5ex-56 \par
+% \hjcode`\1=`\1 \hjcode`\2=`\2 \hjcode`\3=`\3 \hjcode`\4=`\4 \vskip.5cm
+% 12-34-56 \par
+% 12-34-\hbox{56} \par
+% 12-34-\vrule width 1em height 1.5ex \par
+% 12-\hbox{34}-56 \par
+% 12-\vrule width 1em height 1.5ex-56 \par
+
diff --git a/systems/doc/luatex/luatex-logos.tex b/systems/doc/luatex/luatex-logos.tex
new file mode 100644
index 0000000000..d67ce5c0b1
--- /dev/null
+++ b/systems/doc/luatex/luatex-logos.tex
@@ -0,0 +1,21 @@
+\startenvironment luatex-logos
+
+\usemodule[abr-02]
+
+\logo[DFONT] {dfont}
+\logo[CFF] {cff}
+\logo[CMAP] {CMap}
+\logo[PATGEN] {patgen}
+\logo[MP] {MetaPost}
+\logo[METAPOST] {MetaPost}
+\logo[MPLIB] {MPlib}
+\logo[COCO] {coco}
+\logo[SUNOS] {SunOS}
+\logo[BSD] {bsd}
+\logo[SYSV] {sysv}
+\logo[DPI] {dpi}
+\logo[DLL] {dll}
+\logo[OPENOFFICE]{OpenOffice}
+\logo[OCP] {OCP}
+
+\stopenvironment
diff --git a/systems/doc/luatex/luatex-lua.tex b/systems/doc/luatex/luatex-lua.tex
new file mode 100644
index 0000000000..3d6d20c35d
--- /dev/null
+++ b/systems/doc/luatex/luatex-lua.tex
@@ -0,0 +1,760 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-lua
+
+\startchapter[reference=lua,title={Using \LUATEX}]
+
+\startsection[title={Initialization},reference=init]
+
+\startsubsection[title={\LUATEX\ as a \LUA\ interpreter}]
+
+\topicindex {initialization}
+\topicindex {\LUA+interpreter}
+
+There are some situations that make \LUATEX\ behave like a standalone \LUA\
+interpreter:
+
+\startitemize[packed]
+\startitem
+ if a \type {--luaonly} option is given on the commandline, or
+\stopitem
+\startitem
+ if the executable is named \type {texlua} or \type {luatexlua}, or
+\stopitem
+\startitem
+ if the only non|-|option argument (file) on the commandline has the extension
+ \type {lua} or \type {luc}.
+\stopitem
+\stopitemize
+
+In this mode, it will set \LUA's \type {arg[0]} to the found script name, pushing
+preceding options in negative values and the rest of the command line in the
+positive values, just like the \LUA\ interpreter.
+
+\LUATEX\ will exit immediately after executing the specified \LUA\ script and is,
+in effect, a somewhat bulky stand alone \LUA\ interpreter with a bunch of extra
+preloaded libraries.
+
+\stopsubsection
+
+\startsubsection[title={\LUATEX\ as a \LUA\ byte compiler}]
+
+\topicindex {\LUA+byte code}
+
+There are two situations that make \LUATEX\ behave like the \LUA\ byte compiler:
+
+\startitemize[packed]
+\startitem if a \type {--luaconly} option is given on the command line, or \stopitem
+\startitem if the executable is named \type {texluac} \stopitem
+\stopitemize
+
+In this mode, \LUATEX\ is exactly like \type {luac} from the stand alone \LUA\
+distribution, except that it does not have the \type {-l} switch, and that it
+accepts (but ignores) the \type {--luaconly} switch. The current version of \LUA\
+can dump bytecode using \type {string.dump} so we might decide to drop this
+version of \LUATEX.
+
+\stopsubsection
+
+\startsubsection[title={Other commandline processing}]
+
+\topicindex {command line}
+
+When the \LUATEX\ executable starts, it looks for the \type {--lua} command line
+option. If there is no \type {--lua} option, the command line is interpreted in a
+similar fashion as the other \TEX\ engines. Some options are accepted but have no
+consequence. The following command|-|line options are understood:
+
+\starttabulate[|l|p|]
+\DB commandline argument \BC explanation \NC \NR
+\TB
+\NC \type{--credits} \NC display credits and exit \NC \NR
+\NC \type{--debug-format} \NC enable format debugging \NC \NR
+\NC \type{--draftmode} \NC switch on draft mode i.e.\ generate no output in \PDF\ mode \NC \NR
+\NC \type{--[no-]file-line-error} \NC disable/enable \type {file:line:error} style messages \NC \NR
+\NC \type{--[no-]file-line-error-style} \NC aliases of \type {--[no-]file-line-error} \NC \NR
+\NC \type{--fmt=FORMAT} \NC load the format file \type {FORMAT} \NC\NR
+\NC \type{--halt-on-error} \NC stop processing at the first error\NC \NR
+\NC \type{--help} \NC display help and exit \NC\NR
+\NC \type{--ini} \NC be \type {iniluatex}, for dumping formats \NC\NR
+\NC \type{--interaction=STRING} \NC set interaction mode: \type {batchmode}, \type {nonstopmode},
+ \type {scrollmode} or \type {errorstopmode} \NC \NR
+\NC \type{--jobname=STRING} \NC set the job name to \type {STRING} \NC \NR
+\NC \type{--kpathsea-debug=NUMBER} \NC set path searching debugging flags according to the bits of
+ \type {NUMBER} \NC \NR
+\NC \type{--lua=FILE} \NC load and execute a \LUA\ initialization script \NC\NR
+\NC \type{--[no-]mktex=FMT} \NC disable/enable \type {mktexFMT} generation with \type {FMT} is
+ \type {tex} or \type {tfm} \NC \NR
+\NC \type{--nosocket} \NC disable the \LUA\ socket library \NC\NR
+\NC \type{--output-comment=STRING} \NC use \type {STRING} for \DVI\ file comment instead of date (no
+ effect for \PDF) \NC \NR
+\NC \type{--output-directory=DIR} \NC use \type {DIR} as the directory to write files to \NC \NR
+\NC \type{--output-format=FORMAT} \NC use \type {FORMAT} for job output; \type {FORMAT} is \type {dvi}
+ or \type {pdf} \NC \NR
+\NC \type{--progname=STRING} \NC set the program name to \type {STRING} \NC \NR
+\NC \type{--recorder} \NC enable filename recorder \NC \NR
+\NC \type{--safer} \NC disable easily exploitable \LUA\ commands \NC\NR
+\NC \type{--[no-]shell-escape} \NC disable/enable system calls \NC \NR
+\NC \type{--shell-restricted} \NC restrict system calls to a list of commands given in \type
+ {texmf.cnf} \NC \NR
+\NC \type{--synctex=NUMBER} \NC enable \type {synctex} \NC \NR
+\NC \type{--utc} \NC use utc times when applicable \NC \NR
+\NC \type{--version} \NC display version and exit \NC \NR
+\LL
+\stoptabulate
+
+We don't support \prm {write} 18 because \type {os.execute} can do the same. It
+simplifies the code and makes more write targets possible.
+
+The value to use for \prm {jobname} is decided as follows:
+
+\startitemize
+\startitem
+ If \type {--jobname} is given on the command line, its argument will be the
+ value for \prm {jobname}, without any changes. The argument will not be
+ used for actual input so it need not exist. The \type {--jobname} switch only
+ controls the \prm {jobname} setting.
+\stopitem
+\startitem
+ Otherwise, \prm {jobname} will be the name of the first file that is read
+ from the file system, with any path components and the last extension (the
+ part following the last \type {.}) stripped off.
+\stopitem
+\startitem
+ There is an exception to the previous point: if the command line goes into
+ interactive mode (by starting with a command) and there are no files input
+ via \prm {everyjob} either, then the \prm {jobname} is set to \type
+ {texput} as a last resort.
+\stopitem
+\stopitemize
+
+The file names for output files that are generated automatically are created by
+attaching the proper extension (\type {log}, \type {pdf}, etc.) to the found
+\prm {jobname}. These files are created in the directory pointed to by \type
+{--output-directory}, or in the current directory, if that switch is not present.
+
+Without the \type {--lua} option, command line processing works like it does in
+any other \WEBC|-|based typesetting engine, except that \LUATEX\ has a few extra
+switches and lacks some others. Also, if the \type {--lua} option is present,
+\LUATEX\ will enter an alternative mode of command line processing in comparison
+to the standard \WEBC\ programs. In this mode, a small series of actions is taken
+in the following order:
+
+\startitemize[n]
+
+\startitem
+ First, it will parse the command line as usual, but it will only interpret a
+ small subset of the options immediately: \type {--safer}, \type {--nosocket},
+ \type {--[no-]shell-escape}, \type {--enable-write18}, \type
+ {--disable-write18}, \type {--shell-restricted}, \type {--help}, \type
+ {--version}, and \type {--credits}.
+\stopitem
+
+\startitem
+ Next \LUATEX\ searches for the requested \LUA\ initialization script. If it
+ cannot be found using the actual name given on the command line, a second
+ attempt is made by prepending the value of the environment variable \type
+ {LUATEXDIR}, if that variable is defined in the environment.
+\stopitem
+
+\startitem
+ Then it checks the various safety switches. You can use those to disable some
+ \LUA\ commands that can easily be abused by a malicious document. At the
+ moment, \type {--safer} \type {nil}s the following functions:
+
+ \blank
+
+ \starttabulate[|c|l|]
+ \DB library \BC functions \NC \NR
+ \TB
+ \NC \type {os} \NC \type {execute} \type {exec} \type {spawn} \type {setenv}
+ \type {rename} \type {remove} \type {tmpdir} \NC \NR
+ \NC \type {io} \NC \type {popen} \type {output} \type {tmpfile} \NC \NR
+ \NC \type {lfs} \NC \type {rmdir} \type {mkdir} \type {chdir} \type {lock}
+ \type {touch} \NC \NR
+ \LL
+ \stoptabulate
+
+ \blank
+
+ Furthermore, it disables loading of compiled \LUA\ libraries and it makes
+ \type {io.open()} fail on files that are opened for anything besides reading.
+\stopitem
+
+\startitem
+ When \LUATEX\ starts it sets the \type {locale} to a neutral value. If for
+ some reason you use \type {os.locale}, you need to make sure you \type {nil}
+ it afterwards because otherwise it can interfere with code that for instance
+ generates dates. You can ignore the \type {locale} with:
+
+ \starttyping
+ os.setlocale(nil,nil)
+ \stoptyping
+
+ The \type {--nosocket} option makes the socket library unavailable, so that \LUA\
+ cannot use networking.
+
+ The switches \type {--[no-]shell-escape}, \type {--[enable|disable]-write18}, and
+ \type {--shell-restricted} have the same effects as in \PDFTEX, and additionally
+ make \type {io.popen()}, \type {os.execute}, \type {os.exec} and \type {os.spawn}
+ adhere to the requested option.
+\stopitem
+
+\startitem
+ Next the initialization script is loaded and executed. From within the
+ script, the entire command line is available in the \LUA\ table \type {arg},
+ beginning with \type {arg[0]}, containing the name of the executable. As
+ consequence warnings about unrecognized options are suppressed.
+\stopitem
+
+\stopitemize
+
+Command line processing happens very early on. So early, in fact, that none of
+\TEX's initializations have taken place yet. For that reason, the tables that
+deal with typesetting, like \type {tex}, \type {token}, \type {node} and
+\type {pdf}, are off|-|limits during the execution of the startup file (they
+are \type {nil}'d). Special care is taken that \type {texio.write} and \type
+{texio.write_nl} function properly, so that you can at least report your actions
+to the log file when (and if) it eventually becomes opened (note that \TEX\ does
+not even know its \prm {jobname} yet at this point).
+
+Everything you do in the \LUA\ initialization script will remain visible during
+the rest of the run, with the exception of the \TEX\ specific libraries like
+\type {tex}, \type {token}, \type {node} and \type {pdf} tables. These will be
+initialized to their documented state after the execution of the script. You
+should not store anything in variables or within tables with these four global
+names, as they will be overwritten completely.
+
+We recommend you use the startup file only for your own \TEX|-|independent
+initializations (if you need any), to parse the command line, set values in the
+\type {texconfig} table, and register the callbacks you need.
+
+\LUATEX\ allows some of the command line options to be overridden by reading
+values from the \type {texconfig} table at the end of script execution (see the
+description of the \type {texconfig} table later on in this document for more
+details on which ones exactly).
+
+Unless the \type {texconfig} table tells \LUATEX\ not to initialize \KPATHSEA\
+at all (set \type {texconfig.kpse_init} to \type {false} for that), \LUATEX\
+acts on some more command line options after the initialization script is
+finished: in order to initialize the built|-|in \KPATHSEA\ library properly,
+\LUATEX\ needs to know the correct program name to use, and for that it needs to
+check \type {--progname}, or \type {--ini} and \type {--fmt}, if \type
+{--progname} is missing.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ behaviour}]
+
+\startsubsection[title={The \LUA\ version}]
+
+\topicindex {\LUA+libraries}
+\topicindex {\LUA+extensions}
+
+We currently use \LUA\ 5.3 and will follow developments of the language but
+normally with some delay. Therefore the user needs to keep an eye on (subtle)
+differences in successive versions of the language. Also, \LUAJITTEX\ lags behind
+in the sense that \LUAJIT\ is not in sync with regular \LUA\ development. Here is
+an example of one aspect.
+
+\LUA s \type {tostring} function (and \type {string.format} may return values in
+scientific notation, thereby confusing the \TEX\ end of things when it is used as
+the right|-|hand side of an assignment to a \prm {dimen} or \prm {count}. The
+output of these serializers also depend on the \LUA\ version, so in \LUA\ 5.3 you
+can get different output than from 5.2.
+
+\stopsubsection
+
+\startsubsection[title={Integration in the \TDS\ ecosystem}]
+
+The main \TEX\ distributions follow the \TEX\ directory structure (\TDS).
+\LUATEX\ is able to use the kpathsea library to find \type {require()}d modules.
+For this purpose, \type {package.searchers[2]} is replaced by a different loader
+function, that decides at runtime whether to use kpathsea or the built|-|in core
+\LUA\ function. It uses \KPATHSEA\ when that is already initialized at that point
+in time, otherwise it reverts to using the normal \type {package.path} loader.
+
+Initialization of \KPATHSEA\ can happen either implicitly (when \LUATEX\ starts
+up and the startup script has not set \type {texconfig.kpse_init} to false), or
+explicitly by calling the \LUA\ function \type {kpse.set_program_name()}.
+
+\stopsubsection
+
+\startsubsection[title={Loading libraries}]
+
+\LUATEX\ is able to use dynamically loadable \LUA\ libraries, unless
+\type {--safer} was given as an option on the command line. For this purpose,
+\type {package.searchers[3]} is replaced by a different loader function, that
+decides at runtime whether to use \KPATHSEA\ or the built|-|in core \LUA\
+function. It uses \KPATHSEA\ when that is already initialized at that point in
+time, otherwise it reverts to using the normal \type {package.cpath} loader.
+
+This functionality required an extension to kpathsea. There is a new kpathsea
+file format: \type {kpse_clua_format} that searches for files with extension
+\type {.dll} and \type {.so}. The \type {texmf.cnf} setting for this variable is
+\type {CLUAINPUTS}, and by default it has this value:
+
+\starttyping
+CLUAINPUTS=.:$SELFAUTOLOC/lib/{$progname,$engine,}/lua//
+\stoptyping
+
+This path is imperfect (it requires a \TDS\ subtree below the binaries
+directory), but the architecture has to be in the path somewhere, and the
+currently simplest way to do that is to search below the binaries directory only.
+Of course it no big deal to write an alternative loader and use that in a macro
+package. One level up (a \type {lib} directory parallel to \type {bin}) would
+have been nicer, but that is not doable because \TEXLIVE\ uses a \type
+{bin/<arch>} structure.
+
+Loading dynamic \LUA\ libraries will fail if there are two \LUA\ libraries loaded
+at the same time (which will typically happen on \type {win32}, because there is
+one \LUA\ 5.3 inside \LUATEX, and another will likely be linked to the \DLL\ file
+of the module itself).
+
+\stopsubsection
+
+\startsubsection[title={Executing programs}]
+
+In keeping with the other \TEX|-|like programs in \TEXLIVE, the two \LUA\ functions
+\type {os.execute} and \type {io.popen}, as well as the two new functions \type
+{os.exec} and \type {os.spawn} that are explained below, take the value of \type
+{shell_escape} and|/|or \type {shell_escape_commands} in account. Whenever
+\LUATEX\ is run with the assumed intention to typeset a document (and by that we
+mean that it is called as \type {luatex}, as opposed to \type {texlua}, and that
+the command line option \type {--luaonly} was not given), it will only run the
+four functions above if the matching \type {texmf.cnf} variable(s) or their \type
+{texconfig} (see \in {section} [texconfig]) counterparts allow execution of the
+requested system command. In \quote {script interpreter} runs of \LUATEX, these
+settings have no effect, and all four functions have their original meaning.
+
+Some libraries have a few more functions, either coded in \CCODE\ or in \LUA. For
+instance, when we started with \LUATEX\ we added some helpers to the \type
+{luafilesystem} namespace \type {lfs}. The two boolean functions \type
+{lfs.isdir} and \type {lfs.isfile} were speedy and better variants of what could
+be done with \type {lfs.attributes}. The additional function \type
+{lfs.shortname} takes a file name and returns its short name on \type {win32}
+platforms. Finally, for non|-|\type {win32} platforms only, we provided \type
+{lfs.readlink} that takes an existing symbolic link as argument and returns its
+name. However, the \type library evolved so we have dropped these in favour of
+pure \LUA\ variants. The \type {shortname} helper is obsolete and now just
+returns the name.
+
+\stopsubsection
+
+\startsubsection[title={Multibyte \type {string} functions}]
+
+The \type {string} library has a few extra functions, for example \libidx
+{string} {explode}. This function takes upto two arguments: \type
+{string.explode(s[,m])} and returns an array containing the string argument \type
+{s} split into sub-strings based on the value of the string argument \type {m}.
+The second argument is a string that is either empty (this splits the string into
+characters), a single character (this splits on each occurrence of that
+character, possibly introducing empty strings), or a single character followed by
+the plus sign \type {+} (this special version does not create empty sub-strings).
+The default value for \type {m} is \quote {\type { +}} (multiple spaces). Note:
+\type {m} is not hidden by surrounding braces as it would be if this function was
+written in \TEX\ macros.
+
+The \type {string} library also has six extra iterators that return strings
+piecemeal: \libidx {string} {utfvalues}, \libidx {string} {utfcharacters},
+\libidx {string} {characters}, \libidx {string} {characterpairs}, \libidx
+{string} {bytes} and \libidx {string} {bytepairs}.
+
+\startitemize
+\startitem
+ \type {string.utfvalues(s)}: an integer value in the \UNICODE\ range
+\stopitem
+\startitem
+ \type {string.utfcharacters(s)}: a string with a single \UTF-8 token in it
+\stopitem
+\startitem
+ \type {string.cWharacters(s)}: a string containing one byte
+\stopitem
+\startitem
+ \type {string.characterpairs(s)}: two strings each containing one byte or an
+ empty second string if the string length was odd
+\stopitem
+\startitem
+ \type {string.bytes(s)}: a single byte value
+\stopitem
+\startitem
+ \type {string.bytepairs(s)}: two byte values or nil instead of a number as
+ its second return value if the string length was odd
+\stopitem
+\stopitemize
+
+The \type {string.characterpairs()} and \type {string.bytepairs()} iterators
+are useful especially in the conversion of \UTF16 encoded data into \UTF8.
+
+There is also a two|-|argument form of \type {string.dump()}. The second argument
+is a boolean which, if true, strips the symbols from the dumped data. This
+matches an extension made in \type {luajit}. This is typically a function that
+gets adapted as \LUA\ itself progresses.
+
+The \type {string} library functions \type {len}, \type {lower}, \type {sub}
+etc.\ are not \UNICODE|-|aware. For strings in the \UTF8 encoding, i.e., strings
+containing characters above code point 127, the corresponding functions from the
+\type {slnunicode} library can be used, e.g., \type {unicode.utf8.len}, \type
+{unicode.utf8.lower} etc.\ The exceptions are \type {unicode.utf8.find}, that
+always returns byte positions in a string, and \type {unicode.utf8.match} and
+\type {unicode.utf8.gmatch}. While the latter two functions in general {\it
+are} \UNICODE|-|aware, they fall|-|back to non|-|\UNICODE|-|aware behavior when
+using the empty capture \type {()} but other captures work as expected. For the
+interpretation of character classes in \type {unicode.utf8} functions refer to
+the library sources at \hyphenatedurl {http://luaforge.net/projects/sln}.
+
+Version 5.3 of \LUA\ provides some native \UTF8 support but we have added a few
+similar helpers too: \libidx {string} {utfvalue}, \libidx {string} {utfcharacter}
+and \libidx {string} {utflength}.
+
+\startitemize
+\startitem
+ \type {string.utfvalue(s)}: returns the codepoints of the characters in the
+ given string
+\stopitem
+\startitem
+ \type {string.utfcharacter(c,...)}: returns a string with the characters of
+ the given code points
+\stopitem
+\startitem
+ \type {string.utflength(s)}: returns the length oif the given string
+\stopitem
+\stopitemize
+
+These three functions are relative fast and don't do much checking. They can be
+used as building blocks for other helpers.
+
+\stopsubsection
+
+\startsubsection[title={Extra \type {os} library functions}]
+
+The \type {os} library has a few extra functions and variables: \libidx {os}
+{selfdir}, \libidx {os} {exec}, \libidx {os} {spawn}, \libidx {os} {setenv},
+\libidx {os} {env}, \libidx {os} {gettimeofday}, \libidx {os} {times}, \libidx
+{os} {tmpdir}, \libidx {os} {type}, \libidx {os} {name} and \libidx {os} {uname},
+that we will discuss here.
+
+\startitemize
+
+\startitem
+ \type {os.selfdir} is a variable that holds the directory path of the
+ actual executable. For example: \type {\directlua {tex.sprint(os.selfdir)}}.
+\stopitem
+
+\startitem
+ \type {os.exec(commandline)} is a variation on \type {os.execute}. Here
+ \type {commandline} can be either a single string or a single table.
+
+ \startitemize
+
+ \startitem
+ If the argument is a table \LUATEX\ first checks if there is a value at
+ integer index zero. If there is, this is the command to be executed.
+ Otherwise, it will use the value at integer index one. If neither are
+ present, nothing at all happens.
+ \stopitem
+
+ \startitem
+ The set of consecutive values starting at integer~1 in the table are the
+ arguments that are passed on to the command (the value at index~1 becomes
+ \type {arg[0]}). The command is searched for in the execution path, so
+ there is normally no need to pass on a fully qualified path name.
+ \stopitem
+
+ \startitem
+ If the argument is a string, then it is automatically converted into a
+ table by splitting on whitespace. In this case, it is impossible for the
+ command and first argument to differ from each other.
+ \stopitem
+
+ \startitem
+ In the string argument format, whitespace can be protected by putting
+ (part of) an argument inside single or double quotes. One layer of quotes
+ is interpreted by \LUATEX, and all occurrences of \type {\"}, \type {\'}
+ or \type {\\} within the quoted text are unescaped. In the table format,
+ there is no string handling taking place.
+ \stopitem
+
+ \stopitemize
+
+ This function normally does not return control back to the \LUA\ script: the
+ command will replace the current process. However, it will return the two
+ values \type {nil} and \type {error} if there was a problem while
+ attempting to execute the command.
+
+ On \MSWINDOWS, the current process is actually kept in memory until after the
+ execution of the command has finished. This prevents crashes in situations
+ where \TEXLUA\ scripts are run inside integrated \TEX\ environments.
+
+ The original reason for this command is that it cleans out the current
+ process before starting the new one, making it especially useful for use in
+ \TEXLUA.
+\stopitem
+
+\startitem
+ \type {os.spawn(commandline)} is a returning version of \type {os.exec},
+ with otherwise identical calling conventions.
+
+ If the command ran ok, then the return value is the exit status of the
+ command. Otherwise, it will return the two values \type {nil} and \type
+ {error}.
+\stopitem
+
+\startitem
+ \type {os.setenv(key,value)} sets a variable in the environment. Passing
+ \type {nil} instead of a value string will remove the variable.
+\stopitem
+
+\startitem
+ \type {os.env} is a hash table containing a dump of the variables and
+ values in the process environment at the start of the run. It is writeable,
+ but the actual environment is \notabene {not} updated automatically.
+\stopitem
+
+\startitem
+ \type {os.gettimeofday()} returns the current \quote {\UNIX\ time}, but as a
+ float. This function is not available on the \SUNOS\ platforms, so do not use
+ this function for portable documents.
+\stopitem
+
+\startitem
+ \type {os.times()}returns the current process times according to \ the
+ \UNIX\ C library function \quote {times}. This function is not available on
+ the \MSWINDOWS\ and \SUNOS\ platforms, so do not use this function for
+ portable documents.
+\stopitem
+
+\startitem
+ \type {os.tmpdir()} creates a directory in the \quote {current directory}
+ with the name \type {luatex.XXXXXX} where the \type {X}-es are replaced by a
+ unique string. The function also returns this string, so you can \type
+ {lfs.chdir()} into it, or \type {nil} if it failed to create the directory.
+ The user is responsible for cleaning up at the end of the run, it does not
+ happen automatically.
+\stopitem
+
+\startitem
+ \type {os.type} is a string that gives a global indication of the class of
+ operating system. The possible values are currently \type {windows}, \type
+ {unix}, and \type {msdos} (you are unlikely to find this value \quote {in the
+ wild}).
+\stopitem
+
+\startitem
+ \type {os.name} is a string that gives a more precise indication of the
+ operating system. These possible values are not yet fixed, and for \type
+ {os.type} values \type {windows} and \type {msdos}, the \type {os.name}
+ values are simply \type {windows} and \type {msdos}
+
+ The list for the type \type {unix} is more precise: \type {linux}, \type
+ {freebsd}, \type {kfreebsd}, \type {cygwin}, \type {openbsd}, \type
+ {solaris}, \type {sunos} (pre-solaris), \type {hpux}, \type {irix}, \type
+ {macosx}, \type {gnu} (hurd), \type {bsd} (unknown, but \BSD|-|like), \type
+ {sysv} (unknown, but \SYSV|-|like), \type {generic} (unknown).
+\stopitem
+
+\startitem
+ \type {os.uname} returns a table with specific operating system
+ information acquired at runtime. The keys in the returned table are all
+ string values, and their names are: \type {sysname}, \type {machine}, \type
+ {release}, \type {version}, and \type {nodename}.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title={Binary input from files with \type {fio}}]
+
+There is a whole set of helpers for reading numbers and strings from a file:
+\libidx {fio} {readcardinal1}, \libidx {fio} {readcardinal2}, \libidx {fio}
+{readcardinal3}, \libidx {fio} {readcardinal4}, \libidx {fio}
+{readcardinaltable}, \libidx {fio} {readinteger1}, \libidx {fio} {readinteger2},
+\libidx {fio} {readinteger3}, \libidx {fio} {readinteger4}, \libidx {fio}
+{readintegertable}, \libidx {fio} {readfixed2}, \libidx {fio} {readfixed4},
+\libidx {fio} {read2dot14}, \libidx {fio} {setposition}, \libidx {fio}
+{getposition}, \libidx {fio} {skipposition}, \libidx {fio} {readbytes}, \libidx
+{fio} {readbytetable}. They work on normal \LUA\ file handles.
+
+%libidx{fio}{readline}
+%libidx{fio}{recordfilename}
+%libidx{fio}{checkpermission}
+
+This library provides a set of functions for reading numbers from a file and
+in addition to the regular \type {io} library functions.
+
+\starttabulate
+\NC \type{readcardinal1(f)} \NC a 1 byte unsigned integer \NC \NR
+\NC \type{readcardinal2(f)} \NC a 2 byte unsigned integer \NC \NR
+\NC \type{readcardinal3(f)} \NC a 3 byte unsigned integer \NC \NR
+\NC \type{readcardinal4(f)} \NC a 4 byte unsigned integer \NC \NR
+\NC \type{readcardinaltable(f,n,b)} \NC \type {n} cardinals of \type {b} bytes \NC \NR
+\NC \type{readinteger1(f)} \NC a 1 byte signed integer \NC \NR
+\NC \type{readinteger2(f)} \NC a 2 byte signed integer \NC \NR
+\NC \type{readinteger3(f)} \NC a 3 byte signed integer \NC \NR
+\NC \type{readinteger4(f)} \NC a 4 byte signed integer \NC \NR
+\NC \type{readintegertable(f,n,b)} \NC \type {n} integers of \type {b} bytes \NC \NR
+\NC \type{readfixed2(f)} \NC a 2 byte float (used in font files) \NC \NR
+\NC \type{readfixed4(f)} \NC a 4 byte float (used in font files) \NC \NR
+\NC \type{read2dot14(f)} \NC a 2 byte float (used in font files) \NC \NR
+\NC \type{setposition(f,p)} \NC goto position \type {p} \NC \NR
+\NC \type{getposition(f)} \NC get the current position \NC \NR
+\NC \type{skipposition(f,n)} \NC skip \type {n} positions \NC \NR
+\NC \type{readbytes(f,n)} \NC \type {n} bytes \NC \NR
+\NC \type{readbytetable(f,n)} \NC \type {n} bytes\NC \NR
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Binary input from strings with \type {sio}}]
+
+A similar set of function as in the \type {fio} library is available in the \type
+{sio} library: \libidx {sio} {readcardinal1}, \libidx {sio} {readcardinal2},
+\libidx {sio} {readcardinal3}, \libidx {sio} {readcardinal4}, \libidx {sio}
+{readcardinaltable}, \libidx {sio} {readinteger1}, \libidx {sio} {readinteger2},
+\libidx {sio} {readinteger3}, \libidx {sio} {readinteger4}, \libidx {sio}
+{readintegertable}, \libidx {sio} {readfixed2}, \libidx {sio} {readfixed4},
+\libidx {sio} {read2dot14}, \libidx {sio} {setposition}, \libidx {sio}
+{getposition}, \libidx {sio} {skipposition}, \libidx {sio} {readbytes} and
+\libidx {sio} {readbytetable}. Here the first argument is a string instead of a
+file handle. More details can be found in the previous section.
+
+\stopsubsection
+
+\startsubsection[title={Hashes conform \type {sha2}}]
+
+This library is a side effect of the \type {pdfe} library that needs such
+helpers. The \libidx{sha2}{digest256}, \libidx{sha2}{digest384} and
+\libidx{sha2}{digest512} functions accept a string and return a string with the
+hash.
+
+\stopsubsection
+
+\startsubsection[title={Locales}]
+
+\index {locales}
+
+In stock \LUA, many things depend on the current locale. In \LUATEX, we can't do
+that, because it makes documents unportable. While \LUATEX\ is running if
+forces the following locale settings:
+
+\starttyping
+LC_CTYPE=C
+LC_COLLATE=C
+LC_NUMERIC=C
+\stoptyping
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={\LUA\ modules}]
+
+\topicindex {\LUA+libraries}
+\topicindex {\LUA+modules}
+
+Some modules that are normally external to \LUA\ are statically linked in with
+\LUATEX, because they offer useful functionality:
+
+\startitemize
+
+\startitem
+ \type {lpeg}, by Roberto Ierusalimschy, \hyphenatedurl
+ {http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html}. This library is not
+ \UNICODE|-|aware, but interprets strings on a byte|-|per|-|byte basis. This
+ mainly means that \type {lpeg.S} cannot be used with \UTF8 characters encoded
+ in more than two bytes, and thus \type {lpeg.S} will look for one of those
+ two bytes when matching, not the combination of the two. The same is true for
+ \type {lpeg.R}, although the latter will display an error message if used
+ with multibyte characters. Therefore \type {lpeg.R('aä')} results in the
+ message \type {bad argument #1 to 'R' (range must have two characters)},
+ since to \type {lpeg}, \type {ä} is two 'characters' (bytes), so \type {aä}
+ totals three. In practice this is no real issue and with some care you can
+ deal with \UNICODE\ just fine.
+\stopitem
+
+\startitem
+ \type {slnunicode}, from the \type {selene} libraries, \hyphenatedurl
+ {http://luaforge.net/projects/sln}. This library has been slightly extended
+ so that the \type {unicode.utf8.*} functions also accept the first 256 values
+ of plane~18. This is the range \LUATEX\ uses for raw binary output, as
+ explained above. We have no plans to provide more like this because you can
+ basically do all that you want in \LUA.
+\stopitem
+
+\startitem
+ \type {luazip}, from the kepler project, \hyphenatedurl
+ {http://www.keplerproject.org/luazip/}.
+\stopitem
+
+\startitem
+ \type {luafilesystem}, also from the kepler project, \hyphenatedurl
+ {http://www.keplerproject.org/luafilesystem/}.
+\stopitem
+
+\startitem
+ \type {lzlib}, by Tiago Dionizio, \hyphenatedurl
+ {http://luaforge.net/projects/lzlib/}.
+\stopitem
+
+\startitem
+ \type {md5}, by Roberto Ierusalimschy \hyphenatedurl
+ {http://www.inf.puc-rio.br/~roberto/md5/md5-5/md5.html}.
+\stopitem
+
+\startitem
+ \type {luasocket}, by Diego Nehab \hyphenatedurl
+ {http://w3.impa.br/~diego/software/luasocket/}. The \type {.lua} support
+ modules from \type {luasocket} are also preloaded inside the executable,
+ there are no external file dependencies.
+\stopitem
+
+\stopitemize
+
+\stopsection
+
+\startsection[title={Testing}]
+
+\topicindex {testing}
+\topicindex {\PDF+date}
+
+For development reasons you can influence the used startup date and time. This can
+be done in two ways.
+
+\startitemize[n]
+
+\startitem
+ By setting the environmment variable \type {SOURCE_DATE_EPOCH}. This will
+ influence the \TEX\ parameters \type {time} and \type {date}, the random seed,
+ the \PDF\ timestamp and the \PDF\ id that is derived from the time as well. This
+ variable is consulted when the \KPSE\ library is enabled. Resolving is
+ delegated to this library.
+\stopitem
+
+\startitem
+ By setting the \type {start_time} variable in the \type {texconfig} table; as
+ with other variables we use the internal name there. For compatibility
+ reasons we also honour a \type {SOURCE_DATE_EPOCH} entry. It should be noted
+ that there are no such variables in other engines and this method is only
+ relevant in case the while setup happens in \LUA.
+\stopitem
+
+\stopitemize
+
+When Universal Time is needed, you can pass the flag \type {utc} to the engine. This
+property also works when the date and time are set by \LUATEX\ itself. It has a
+complementary entry \type {use_utc_time} in the \type {texconfig} table.
+
+There is some control possible, for instance prevent filename to be written to
+the \PDF\ file. This is discussed elsewhere. In \CONTEXT\ we provide the command
+line argument \type {--nodates} that does a bit more disabling of dates.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-math.tex b/systems/doc/luatex/luatex-math.tex
new file mode 100644
index 0000000000..fd038150f5
--- /dev/null
+++ b/systems/doc/luatex/luatex-math.tex
@@ -0,0 +1,1647 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-math
+
+\startchapter[reference=math,title={Math}]
+
+\startsection[title={Traditional alongside \OPENTYPE}]
+
+\topicindex {math}
+
+The handling of mathematics in \LUATEX\ differs quite a bit from how \TEX82 (and
+therefore \PDFTEX) handles math. First, \LUATEX\ adds primitives and extends some
+others so that \UNICODE\ input can be used easily. Second, all of \TEX82's
+internal special values (for example for operator spacing) have been made
+accessible and changeable via control sequences. Third, there are extensions that
+make it easier to use \OPENTYPE\ math fonts. And finally, there are some
+extensions that have been proposed or considered in the past that are now added
+to the engine.
+
+\stopsection
+
+\startsection[title={Unicode math characters}]
+
+\topicindex {math+\UNICODE}
+\topicindex {\UNICODE+math}
+
+Character handling is now extended up to the full \UNICODE\ range (the \type {\U}
+prefix), which is compatible with \XETEX.
+
+The math primitives from \TEX\ are kept as they are, except for the ones that
+convert from input to math commands: \type {mathcode}, and \type {delcode}. These
+two now allow for a 21-bit character argument on the left hand side of the equals
+sign.
+
+Some of the new \LUATEX\ primitives read more than one separate value. This is
+shown in the tables below by a plus sign.
+
+The input for such primitives would look like this:
+
+\starttyping
+\def\overbrace{\Umathaccent 0 1 "23DE }
+\stoptyping
+
+The altered \TEX82 primitives are:
+
+\starttabulate[|l|l|r|c|l|r|]
+\DB primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR
+\TB
+\NC \prm {mathcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC 8000 \NC \NR
+\NC \prm {delcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC FFFFFF \NC \NR
+\LL
+\stoptabulate
+
+The unaltered ones are:
+
+\starttabulate[|l|l|r|]
+\DB primitive \BC min \BC max \NC \NR
+\TB
+\NC \prm {mathchardef} \NC 0 \NC 8000 \NC \NR
+\NC \prm {mathchar} \NC 0 \NC 7FFF \NC \NR
+\NC \prm {mathaccent} \NC 0 \NC 7FFF \NC \NR
+\NC \prm {delimiter} \NC 0 \NC 7FFFFFF \NC \NR
+\NC \prm {radical} \NC 0 \NC 7FFFFFF \NC \NR
+\LL
+\stoptabulate
+
+For practical reasons \prm {mathchardef} will silently accept values larger
+that \type {0x8000} and interpret it as \lpr {Umathcharnumdef}. This is needed
+to satisfy older macro packages.
+
+The following new primitives are compatible with \XETEX:
+
+% somewhat fuzzy:
+
+\starttabulate[|l|l|r|c|l|r|]
+\DB primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR
+\TB
+\NC \lpr {Umathchardef} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcharnumdef}\rlap{\high{5}} \NC -80000000 \NC 7FFFFFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcode} \NC 0 \NC 10FFFF \NC = \NC 0+0+0 \NC 7+FF+10FFFF \NC \NR
+\NC \lpr {Udelcode} \NC 0 \NC 10FFFF \NC = \NC 0+0 \NC FF+10FFFF \NC \NR
+\NC \lpr {Umathchar} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathaccent} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Udelimiter} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Uradical} \NC 0+0 \NC FF+10FFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcharnum} \NC -80000000 \NC 7FFFFFFF \NC \NC \NC \NC \NR
+\NC \lpr {Umathcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF \NC \NR
+\NC \lpr {Udelcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF \NC \NR
+\LL
+\stoptabulate
+
+Specifications typically look like:
+
+\starttyping
+\Umathchardef\xx="1"0"456
+\Umathcode 123="1"0"789
+\stoptyping
+
+The new primitives that deal with delimiter|-|style objects do not set up a
+\quote {large family}. Selecting a suitable size for display purposes is expected
+to be dealt with by the font via the \lpr {Umathoperatorsize} parameter.
+
+For some of these primitives, all information is packed into a single signed
+integer. For the first two (\lpr {Umathcharnum} and \lpr {Umathcodenum}), the
+lowest 21 bits are the character code, the 3 bits above that represent the math
+class, and the family data is kept in the topmost bits. This means that the values
+for math families 128--255 are actually negative. For \lpr {Udelcodenum} there
+is no math class. The math family information is stored in the bits directly on
+top of the character code. Using these three commands is not as natural as using
+the two- and three|-|value commands, so unless you know exactly what you are
+doing and absolutely require the speedup resulting from the faster input
+scanning, it is better to use the verbose commands instead.
+
+The \lpr {Umathaccent} command accepts optional keywords to control various
+details regarding math accents. See \in {section} [mathacc] below for details.
+
+There are more new primitives and all of these will be explained in following
+sections:
+
+\starttabulate[|l|l|]
+\DB primitive \BC value range (in hex) \NC \NR
+\TB
+\NC \lpr {Uroot} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Uoverdelimiter} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Uunderdelimiter} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Udelimiterover} \NC 0 + 0--FF + 10FFFF \NC \NR
+\NC \lpr {Udelimiterunder} \NC 0 + 0--FF + 10FFFF \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Math styles}]
+
+\subsection{\lpr {mathstyle}}
+
+\topicindex {math+styles}
+
+It is possible to discover the math style that will be used for a formula in an
+expandable fashion (while the math list is still being read). To make this
+possible, \LUATEX\ adds the new primitive: \lpr {mathstyle}. This is a \quote
+{convert command} like e.g. \prm {romannumeral}: its value can only be read,
+not set.
+
+The returned value is between 0 and 7 (in math mode), or $-1$ (all other modes).
+For easy testing, the eight math style commands have been altered so that they can
+be used as numeric values, so you can write code like this:
+
+\starttyping
+\ifnum\mathstyle=\textstyle
+ \message{normal text style}
+\else \ifnum\mathstyle=\crampedtextstyle
+ \message{cramped text style}
+\fi \fi
+\stoptyping
+
+Sometimes you won't get what you expect so a bit of explanation might help to
+understand what happens. When math is parsed and expanded it gets turned into a
+linked list. In a second pass the formula will be build. This has to do with the
+fact that in order to determine the automatically chosen sizes (in for instance
+fractions) following content can influence preceding sizes. A side effect of this
+is for instance that one cannot change the definition of a font family (and
+thereby reusing numbers) because the number that got used is stored and used in
+the second pass (so changing \type {\fam 12} mid|-|formula spoils over to
+preceding use of that family).
+
+The style switching primitives like \prm {textstyle} are turned into nodes so the
+styles set there are frozen. The \prm {mathchoice} primitive results in four
+lists being constructed of which one is used in the second pass. The fact that
+some automatic styles are not yet known also means that the \lpr {mathstyle}
+primitive expands to the current style which can of course be different from the
+one really used. It's a snapshot of the first pass state. As a consequence in the
+following example you get a style number (first pass) typeset that can actually
+differ from the used style (second pass). In the case of a math choice used
+ungrouped, the chosen style is used after the choice too, unless you group.
+
+\startbuffer[1]
+ [a:\mathstyle]\quad
+ \bgroup
+ \mathchoice
+ {\bf \scriptstyle (x:d :\mathstyle)}
+ {\bf \scriptscriptstyle (x:t :\mathstyle)}
+ {\bf \scriptscriptstyle (x:s :\mathstyle)}
+ {\bf \scriptscriptstyle (x:ss:\mathstyle)}
+ \egroup
+ \quad[b:\mathstyle]\quad
+ \mathchoice
+ {\bf \scriptstyle (y:d :\mathstyle)}
+ {\bf \scriptscriptstyle (y:t :\mathstyle)}
+ {\bf \scriptscriptstyle (y:s :\mathstyle)}
+ {\bf \scriptscriptstyle (y:ss:\mathstyle)}
+ \quad[c:\mathstyle]\quad
+ \bgroup
+ \mathchoice
+ {\bf \scriptstyle (z:d :\mathstyle)}
+ {\bf \scriptscriptstyle (z:t :\mathstyle)}
+ {\bf \scriptscriptstyle (z:s :\mathstyle)}
+ {\bf \scriptscriptstyle (z:ss:\mathstyle)}
+ \egroup
+ \quad[d:\mathstyle]
+\stopbuffer
+
+\startbuffer[2]
+ [a:\mathstyle]\quad
+ \begingroup
+ \mathchoice
+ {\bf \scriptstyle (x:d :\mathstyle)}
+ {\bf \scriptscriptstyle (x:t :\mathstyle)}
+ {\bf \scriptscriptstyle (x:s :\mathstyle)}
+ {\bf \scriptscriptstyle (x:ss:\mathstyle)}
+ \endgroup
+ \quad[b:\mathstyle]\quad
+ \mathchoice
+ {\bf \scriptstyle (y:d :\mathstyle)}
+ {\bf \scriptscriptstyle (y:t :\mathstyle)}
+ {\bf \scriptscriptstyle (y:s :\mathstyle)}
+ {\bf \scriptscriptstyle (y:ss:\mathstyle)}
+ \quad[c:\mathstyle]\quad
+ \begingroup
+ \mathchoice
+ {\bf \scriptstyle (z:d :\mathstyle)}
+ {\bf \scriptscriptstyle (z:t :\mathstyle)}
+ {\bf \scriptscriptstyle (z:s :\mathstyle)}
+ {\bf \scriptscriptstyle (z:ss:\mathstyle)}
+ \endgroup
+ \quad[d:\mathstyle]
+\stopbuffer
+
+\typebuffer[1]
+
+% \typebuffer[2]
+
+This gives:
+
+\blank $\displaystyle \getbuffer[1]$ \blank
+\blank $\textstyle \getbuffer[1]$ \blank
+
+Using \prm {begingroup} \unknown\ \prm {endgroup} instead gives:
+
+\blank $\displaystyle \getbuffer[2]$ \blank
+\blank $\textstyle \getbuffer[2]$ \blank
+
+This might look wrong but it's just a side effect of \lpr {mathstyle} expanding
+to the current (first pass) style and the number being injected in the list that
+gets converted in the second pass. It all makes sense and it illustrates the
+importance of grouping. In fact, the math choice style being effective afterwards
+has advantages. It would be hard to get it otherwise.
+
+\subsection{\lpr {Ustack}}
+
+\topicindex {math+stacks}
+
+There are a few math commands in \TEX\ where the style that will be used is not
+known straight from the start. These commands (\prm {over}, \prm {atop},
+\prm {overwithdelims}, \prm {atopwithdelims}) would therefore normally return
+wrong values for \lpr {mathstyle}. To fix this, \LUATEX\ introduces a special
+prefix command: \lpr {Ustack}:
+
+\starttyping
+$\Ustack {a \over b}$
+\stoptyping
+
+The \lpr {Ustack} command will scan the next brace and start a new math group
+with the correct (numerator) math style.
+
+\subsection{Cramped math styles}
+
+\topicindex {math+styles}
+\topicindex {math+spacing}
+\topicindex {math+cramped}
+
+\LUATEX\ has four new primitives to set the cramped math styles directly:
+
+\starttyping
+\crampeddisplaystyle
+\crampedtextstyle
+\crampedscriptstyle
+\crampedscriptscriptstyle
+\stoptyping
+
+These additional commands are not all that valuable on their own, but they come
+in handy as arguments to the math parameter settings that will be added shortly.
+
+In Eijkhouts \quotation {\TEX\ by Topic} the rules for handling styles in scripts
+are described as follows:
+
+\startitemize
+\startitem
+ In any style superscripts and subscripts are taken from the next smaller style.
+ Exception: in display style they are in script style.
+\stopitem
+\startitem
+ Subscripts are always in the cramped variant of the style; superscripts are only
+ cramped if the original style was cramped.
+\stopitem
+\startitem
+ In an \type {..\over..} formula in any style the numerator and denominator are
+ taken from the next smaller style.
+\stopitem
+\startitem
+ The denominator is always in cramped style; the numerator is only in cramped
+ style if the original style was cramped.
+\stopitem
+\startitem
+ Formulas under a \type {\sqrt} or \prm {overline} are in cramped style.
+\stopitem
+\stopitemize
+
+In \LUATEX\ one can set the styles in more detail which means that you sometimes
+have to set both normal and cramped styles to get the effect you want. (Even) if
+we force styles in the script using \prm {scriptstyle} and \lpr
+{crampedscriptstyle} we get this:
+
+\startbuffer[demo]
+\starttabulate
+\DB style \BC example \NC \NR
+\TB
+\NC default \NC $b_{x=xx}^{x=xx}$ \NC \NR
+\NC script \NC $b_{\scriptstyle x=xx}^{\scriptstyle x=xx}$ \NC \NR
+\NC crampedscript \NC $b_{\crampedscriptstyle x=xx}^{\crampedscriptstyle x=xx}$ \NC \NR
+\LL
+\stoptabulate
+\stopbuffer
+
+\getbuffer[demo]
+
+Now we set the following parameters
+
+\startbuffer[setup]
+\Umathordrelspacing\scriptstyle=30mu
+\Umathordordspacing\scriptstyle=30mu
+\stopbuffer
+
+\typebuffer[setup]
+
+This gives a different result:
+
+\start\getbuffer[setup,demo]\stop
+
+But, as this is not what is expected (visually) we should say:
+
+\startbuffer[setup]
+\Umathordrelspacing\scriptstyle=30mu
+\Umathordordspacing\scriptstyle=30mu
+\Umathordrelspacing\crampedscriptstyle=30mu
+\Umathordordspacing\crampedscriptstyle=30mu
+\stopbuffer
+
+\typebuffer[setup]
+
+Now we get:
+
+\start\getbuffer[setup,demo]\stop
+
+\stopsection
+
+\startsection[title={Math parameter settings}]
+
+\subsection {Many new \lpr {Umath*} primitives}
+
+\topicindex {math+parameters}
+
+In \LUATEX, the font dimension parameters that \TEX\ used in math typesetting are
+now accessible via primitive commands. In fact, refactoring of the math engine
+has resulted in many more parameters than were not accessible before.
+
+\starttabulate
+\DB primitive name \BC description \NC \NR
+\TB
+\NC \lpr {Umathquad} \NC the width of 18 mu's \NC \NR
+\NC \lpr {Umathaxis} \NC height of the vertical center axis of
+ the math formula above the baseline \NC \NR
+\NC \lpr {Umathoperatorsize} \NC minimum size of large operators in display mode \NC \NR
+\NC \lpr {Umathoverbarkern} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathoverbarrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathoverbarvgap} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathunderbarkern} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathunderbarrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathunderbarvgap} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathradicalkern} \NC vertical clearance above the rule \NC \NR
+\NC \lpr {Umathradicalrule} \NC the width of the rule \NC \NR
+\NC \lpr {Umathradicalvgap} \NC vertical clearance below the rule \NC \NR
+\NC \lpr {Umathradicaldegreebefore}\NC the forward kern that takes place before placement of
+ the radical degree \NC \NR
+\NC \lpr {Umathradicaldegreeafter} \NC the backward kern that takes place after placement of
+ the radical degree \NC \NR
+\NC \lpr {Umathradicaldegreeraise} \NC this is the percentage of the total height and depth of
+ the radical sign that the degree is raised by; it is
+ expressed in \type {percents}, so 60\% is expressed as the
+ integer $60$ \NC \NR
+\NC \lpr {Umathstackvgap} \NC vertical clearance between the two
+ elements in a \prm {atop} stack \NC \NR
+\NC \lpr {Umathstacknumup} \NC numerator shift upward in \prm {atop} stack \NC \NR
+\NC \lpr {Umathstackdenomdown} \NC denominator shift downward in \prm {atop} stack \NC \NR
+\NC \lpr {Umathfractionrule} \NC the width of the rule in a \prm {over} \NC \NR
+\NC \lpr {Umathfractionnumvgap} \NC vertical clearance between the numerator and the rule \NC \NR
+\NC \lpr {Umathfractionnumup} \NC numerator shift upward in \prm {over} \NC \NR
+\NC \lpr {Umathfractiondenomvgap} \NC vertical clearance between the denominator and the rule \NC \NR
+\NC \lpr {Umathfractiondenomdown} \NC denominator shift downward in \prm {over} \NC \NR
+\NC \lpr {Umathfractiondelsize} \NC minimum delimiter size for \type {\...withdelims} \NC \NR
+\NC \lpr {Umathlimitabovevgap} \NC vertical clearance for limits above operators \NC \NR
+\NC \lpr {Umathlimitabovebgap} \NC vertical baseline clearance for limits above operators \NC \NR
+\NC \lpr {Umathlimitabovekern} \NC space reserved at the top of the limit \NC \NR
+\NC \lpr {Umathlimitbelowvgap} \NC vertical clearance for limits below operators \NC \NR
+\NC \lpr {Umathlimitbelowbgap} \NC vertical baseline clearance for limits below operators \NC \NR
+\NC \lpr {Umathlimitbelowkern} \NC space reserved at the bottom of the limit \NC \NR
+\NC \lpr {Umathoverdelimitervgap} \NC vertical clearance for limits above delimiters \NC \NR
+\NC \lpr {Umathoverdelimiterbgap} \NC vertical baseline clearance for limits above delimiters \NC \NR
+\NC \lpr {Umathunderdelimitervgap} \NC vertical clearance for limits below delimiters \NC \NR
+\NC \lpr {Umathunderdelimiterbgap} \NC vertical baseline clearance for limits below delimiters \NC \NR
+\NC \lpr {Umathsubshiftdrop} \NC subscript drop for boxes and subformulas \NC \NR
+\NC \lpr {Umathsubshiftdown} \NC subscript drop for characters \NC \NR
+\NC \lpr {Umathsupshiftdrop} \NC superscript drop (raise, actually) for boxes and subformulas \NC \NR
+\NC \lpr {Umathsupshiftup} \NC superscript raise for characters \NC \NR
+\NC \lpr {Umathsubsupshiftdown} \NC subscript drop in the presence of a superscript \NC \NR
+\NC \lpr {Umathsubtopmax} \NC the top of standalone subscripts cannot be higher than this
+ above the baseline \NC \NR
+\NC \lpr {Umathsupbottommin} \NC the bottom of standalone superscripts cannot be less than
+ this above the baseline \NC \NR
+\NC \lpr {Umathsupsubbottommax} \NC the bottom of the superscript of a combined super- and subscript
+ be at least as high as this above the baseline \NC \NR
+\NC \lpr {Umathsubsupvgap} \NC vertical clearance between super- and subscript \NC \NR
+\NC \lpr {Umathspaceafterscript} \NC additional space added after a super- or subscript \NC \NR
+\NC \lpr {Umathconnectoroverlapmin}\NC minimum overlap between parts in an extensible recipe \NC \NR
+\LL
+\stoptabulate
+
+Each of the parameters in this section can be set by a command like this:
+
+\starttyping
+\Umathquad\displaystyle=1em
+\stoptyping
+
+they obey grouping, and you can use \type {\the\Umathquad\displaystyle} if
+needed.
+
+\subsection{Font|-|based math parameters}
+
+\topicindex {math+parameters}
+
+While it is nice to have these math parameters available for tweaking, it would
+be tedious to have to set each of them by hand. For this reason, \LUATEX\
+initializes a bunch of these parameters whenever you assign a font identifier to
+a math family based on either the traditional math font dimensions in the font
+(for assignments to math family~2 and~3 using \TFM|-|based fonts like \type
+{cmsy} and \type {cmex}), or based on the named values in a potential \type
+{MathConstants} table when the font is loaded via Lua. If there is a \type
+{MathConstants} table, this takes precedence over font dimensions, and in that
+case no attention is paid to which family is being assigned to: the \type
+{MathConstants} tables in the last assigned family sets all parameters.
+
+In the table below, the one|-|letter style abbreviations and symbolic tfm font
+dimension names match those used in the \TeX book. Assignments to \prm
+{textfont} set the values for the cramped and uncramped display and text styles,
+\prm {scriptfont} sets the script styles, and \prm {scriptscriptfont} sets the
+scriptscript styles, so we have eight parameters for three font sizes. In the
+\TFM\ case, assignments only happen in family~2 and family~3 (and of course only
+for the parameters for which there are font dimensions).
+
+Besides the parameters below, \LUATEX\ also looks at the \quote {space} font
+dimension parameter. For math fonts, this should be set to zero.
+
+\def\MathLine#1#2#3#4#5%
+ {\TB
+ \NC \llap{\high{\tx #2\enspace}}\ttbf \string #1 \NC \tt #5 \NC \NR
+ \NC \tx #3 \NC \tt #4 \NC \NR}
+
+\starttabulate[|l|l|]
+\DB variable / style \BC tfm / opentype \NC \NR
+\MathLine{\Umathaxis} {} {} {AxisHeight} {axis_height}
+\MathLine{\Umathoperatorsize} {6} {D, D'} {DisplayOperatorMinHeight} {\emdash}
+\MathLine{\Umathfractiondelsize} {9} {D, D'} {FractionDelimiterDisplayStyleSize} {delim1}
+\MathLine{\Umathfractiondelsize} {9} {T, T', S, S', SS, SS'}{FractionDelimiterSize} {delim2}
+\MathLine{\Umathfractiondenomdown} {} {D, D'} {FractionDenominatorDisplayStyleShiftDown}{denom1}
+\MathLine{\Umathfractiondenomdown} {} {T, T', S, S', SS, SS'}{FractionDenominatorShiftDown} {denom2}
+\MathLine{\Umathfractiondenomvgap} {} {D, D'} {FractionDenominatorDisplayStyleGapMin} {3*default_rule_thickness}
+\MathLine{\Umathfractiondenomvgap} {} {T, T', S, S', SS, SS'}{FractionDenominatorGapMin} {default_rule_thickness}
+\MathLine{\Umathfractionnumup} {} {D, D'} {FractionNumeratorDisplayStyleShiftUp} {num1}
+\MathLine{\Umathfractionnumup} {} {T, T', S, S', SS, SS'}{FractionNumeratorShiftUp} {num2}
+\MathLine{\Umathfractionnumvgap} {} {D, D'} {FractionNumeratorDisplayStyleGapMin} {3*default_rule_thickness}
+\MathLine{\Umathfractionnumvgap} {} {T, T', S, S', SS, SS'}{FractionNumeratorGapMin} {default_rule_thickness}
+\MathLine{\Umathfractionrule} {} {} {FractionRuleThickness} {default_rule_thickness}
+\MathLine{\Umathskewedfractionhgap} {} {} {SkewedFractionHorizontalGap} {math_quad/2}
+\MathLine{\Umathskewedfractionvgap} {} {} {SkewedFractionVerticalGap} {math_x_height}
+\MathLine{\Umathlimitabovebgap} {} {} {UpperLimitBaselineRiseMin} {big_op_spacing3}
+\MathLine{\Umathlimitabovekern} {1} {} {0} {big_op_spacing5}
+\MathLine{\Umathlimitabovevgap} {} {} {UpperLimitGapMin} {big_op_spacing1}
+\MathLine{\Umathlimitbelowbgap} {} {} {LowerLimitBaselineDropMin} {big_op_spacing4}
+\MathLine{\Umathlimitbelowkern} {1} {} {0} {big_op_spacing5}
+\MathLine{\Umathlimitbelowvgap} {} {} {LowerLimitGapMin} {big_op_spacing2}
+\MathLine{\Umathoverdelimitervgap} {} {} {StretchStackGapBelowMin} {big_op_spacing1}
+\MathLine{\Umathoverdelimiterbgap} {} {} {StretchStackTopShiftUp} {big_op_spacing3}
+\MathLine{\Umathunderdelimitervgap} {} {} {StretchStackGapAboveMin} {big_op_spacing2}
+\MathLine{\Umathunderdelimiterbgap} {} {} {StretchStackBottomShiftDown} {big_op_spacing4}
+\MathLine{\Umathoverbarkern} {} {} {OverbarExtraAscender} {default_rule_thickness}
+\MathLine{\Umathoverbarrule} {} {} {OverbarRuleThickness} {default_rule_thickness}
+\MathLine{\Umathoverbarvgap} {} {} {OverbarVerticalGap} {3*default_rule_thickness}
+\MathLine{\Umathquad} {1} {} {<font_size(f)>} {math_quad}
+\MathLine{\Umathradicalkern} {} {} {RadicalExtraAscender} {default_rule_thickness}
+\MathLine{\Umathradicalrule} {2} {} {RadicalRuleThickness} {<not set>}
+\MathLine{\Umathradicalvgap} {3} {D, D'} {RadicalDisplayStyleVerticalGap} {default_rule_thickness+abs(math_x_height)/4}
+\MathLine{\Umathradicalvgap} {3} {T, T', S, S', SS, SS'}{RadicalVerticalGap} {default_rule_thickness+abs(default_rule_thickness)/4}
+\MathLine{\Umathradicaldegreebefore}{2} {} {RadicalKernBeforeDegree} {<not set>}
+\MathLine{\Umathradicaldegreeafter} {2} {} {RadicalKernAfterDegree} {<not set>}
+\MathLine{\Umathradicaldegreeraise} {2,7}{} {RadicalDegreeBottomRaisePercent} {<not set>}
+\MathLine{\Umathspaceafterscript} {4} {} {SpaceAfterScript} {script_space}
+\MathLine{\Umathstackdenomdown} {} {D, D'} {StackBottomDisplayStyleShiftDown} {denom1}
+\MathLine{\Umathstackdenomdown} {} {T, T', S, S', SS, SS'}{StackBottomShiftDown} {denom2}
+\MathLine{\Umathstacknumup} {} {D, D'} {StackTopDisplayStyleShiftUp} {num1}
+\MathLine{\Umathstacknumup} {} {T, T', S, S', SS, SS'}{StackTopShiftUp} {num3}
+\MathLine{\Umathstackvgap} {} {D, D'} {StackDisplayStyleGapMin} {7*default_rule_thickness}
+\MathLine{\Umathstackvgap} {} {T, T', S, S', SS, SS'}{StackGapMin} {3*default_rule_thickness}
+\MathLine{\Umathsubshiftdown} {} {} {SubscriptShiftDown} {sub1}
+\MathLine{\Umathsubshiftdrop} {} {} {SubscriptBaselineDropMin} {sub_drop}
+\MathLine{\Umathsubsupshiftdown} {8} {} {SubscriptShiftDownWithSuperscript} {\emdash}
+\MathLine{\Umathsubtopmax} {} {} {SubscriptTopMax} {abs(math_x_height*4)/5}
+\MathLine{\Umathsubsupvgap} {} {} {SubSuperscriptGapMin} {4*default_rule_thickness}
+\MathLine{\Umathsupbottommin} {} {} {SuperscriptBottomMin} {abs(math_x_height/4)}
+\MathLine{\Umathsupshiftdrop} {} {} {SuperscriptBaselineDropMax} {sup_drop}
+\MathLine{\Umathsupshiftup} {} {D} {SuperscriptShiftUp} {sup1}
+\MathLine{\Umathsupshiftup} {} {T, S, SS,} {SuperscriptShiftUp} {sup2}
+\MathLine{\Umathsupshiftup} {} {D', T', S', SS'} {SuperscriptShiftUpCramped} {sup3}
+\MathLine{\Umathsupsubbottommax} {} {} {SuperscriptBottomMaxWithSubscript} {abs(math_x_height*4)/5}
+\MathLine{\Umathunderbarkern} {} {} {UnderbarExtraDescender} {default_rule_thickness}
+\MathLine{\Umathunderbarrule} {} {} {UnderbarRuleThickness} {default_rule_thickness}
+\MathLine{\Umathunderbarvgap} {} {} {UnderbarVerticalGap} {3*default_rule_thickness}
+\MathLine{\Umathconnectoroverlapmin}{5} {} {MinConnectorOverlap} {0}
+\LL
+\stoptabulate
+
+Note 1: \OPENTYPE\ fonts set \lpr {Umathlimitabovekern} and \lpr
+{Umathlimitbelowkern} to zero and set \lpr {Umathquad} to the font size of the
+used font, because these are not supported in the \type {MATH} table,
+
+Note 2: Traditional \TFM\ fonts do not set \lpr {Umathradicalrule} because
+\TEX82\ uses the height of the radical instead. When this parameter is indeed not
+set when \LUATEX\ has to typeset a radical, a backward compatibility mode will
+kick in that assumes that an oldstyle \TEX\ font is used. Also, they do not set
+\lpr {Umathradicaldegreebefore}, \lpr {Umathradicaldegreeafter}, and \lpr
+{Umathradicaldegreeraise}. These are then automatically initialized to
+$5/18$quad, $-10/18$quad, and 60.
+
+Note 3: If \TFM\ fonts are used, then the \lpr {Umathradicalvgap} is not set
+until the first time \LUATEX\ has to typeset a formula because this needs
+parameters from both family~2 and family~3. This provides a partial backward
+compatibility with \TEX82, but that compatibility is only partial: once the \lpr
+{Umathradicalvgap} is set, it will not be recalculated any more.
+
+Note 4: When \TFM\ fonts are used a similar situation arises with respect to \lpr
+{Umathspaceafterscript}: it is not set until the first time \LUATEX\ has to
+typeset a formula. This provides some backward compatibility with \TEX82. But
+once the \lpr {Umathspaceafterscript} is set, \prm {scriptspace} will never be
+looked at again.
+
+Note 5: Traditional \TFM\ fonts set \lpr {Umathconnectoroverlapmin} to zero
+because \TEX82\ always stacks extensibles without any overlap.
+
+Note 6: The \lpr {Umathoperatorsize} is only used in \prm {displaystyle}, and is
+only set in \OPENTYPE\ fonts. In \TFM\ font mode, it is artificially set to one
+scaled point more than the initial attempt's size, so that always the \quote
+{first next} will be tried, just like in \TEX82.
+
+Note 7: The \lpr {Umathradicaldegreeraise} is a special case because it is the
+only parameter that is expressed in a percentage instead of a number of scaled
+points.
+
+Note 8: \type {SubscriptShiftDownWithSuperscript} does not actually exist in the
+\quote {standard} \OPENTYPE\ math font Cambria, but it is useful enough to be
+added.
+
+Note 9: \type {FractionDelimiterDisplayStyleSize} and \type
+{FractionDelimiterSize} do not actually exist in the \quote {standard} \OPENTYPE\
+math font Cambria, but were useful enough to be added.
+
+\stopsection
+
+\startsection[title={Math spacing}]
+
+\subsection{Inline surrounding space}
+
+\topicindex {math+spacing}
+
+Inline math is surrounded by (optional) \prm {mathsurround} spacing but that is a fixed
+dimension. There is now an additional parameter \lpr {mathsurroundskip}. When set to a
+non|-|zero value (or zero with some stretch or shrink) this parameter will replace
+\prm {mathsurround}. By using an additional parameter instead of changing the nature
+of \prm {mathsurround}, we can remain compatible. In the meantime a bit more
+control has been added via \lpr {mathsurroundmode}. This directive can take 6 values
+with zero being the default behaviour.
+
+\start
+
+\def\OneLiner#1#2%
+ {\NC \type{#1}
+ \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\mathsurroundmode#1\relax\hsize 100pt x$x$x}
+ \NC \dontleavehmode\inframed[align=normal,offset=0pt,frame=off]{\mathsurroundmode#1\relax\hsize 100pt x $x$ x}
+ \NC #2
+ \NC \NR}
+
+\startbuffer
+\mathsurround 10pt
+\mathsurroundskip20pt
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\starttabulate[|c|c|c|pl|]
+\DB mode \BC x\$x\$x \BC x \$x\$ x \BC effect \NC \NR
+\TB
+\OneLiner{0}{obey \prm {mathsurround} when \lpr {mathsurroundskip} is 0pt}
+\OneLiner{1}{only add skip to the left}
+\OneLiner{2}{only add skip to the right}
+\OneLiner{3}{add skip to the left and right}
+\OneLiner{4}{ignore the skip setting, obey \prm {mathsurround}}
+\OneLiner{5}{disable all spacing around math}
+\OneLiner{6}{only apply \lpr {mathsurroundskip} when also spacing}
+\OneLiner{7}{only apply \lpr {mathsurroundskip} when no spacing}
+\LL
+\stoptabulate
+
+\stop
+
+Method six omits the surround glue when there is (x)spacing glue present while
+method seven does the opposite, the glue is only applied when there is (x)space
+glue present too. Anything more fancy, like checking the begining or end of a
+paragraph (or edges of a box) would not be robust anyway. If you want that you
+can write a callback that runs over a list and analyzes a paragraph. Actually, in
+that case you could also inject glue (or set the properties of a math node)
+explicitly. So, these modes are in practice mostly useful for special purposes
+and experiments (they originate in a tracker item). Keep in mind that this glue
+is part of the math node and not always treated as normal glue: it travels with
+the begin and end math nodes. Also, method 6 and 7 will zero the skip related
+fields in a node when applicable in the first occasion that checks them
+(linebreaking or packaging).
+
+\subsection{Pairwise spacing}
+
+\topicindex {math+spacing}
+
+Besides the parameters mentioned in the previous sections, there are also 64 new
+primitives to control the math spacing table (as explained in Chapter~18 of the
+\TEX book). The primitive names are a simple matter of combining two math atom
+types, but for completeness' sake, here is the whole list:
+
+\starttwocolumns
+\startlines
+\lpr {Umathordordspacing}
+\lpr {Umathordopspacing}
+\lpr {Umathordbinspacing}
+\lpr {Umathordrelspacing}
+\lpr {Umathordopenspacing}
+\lpr {Umathordclosespacing}
+\lpr {Umathordpunctspacing}
+\lpr {Umathordinnerspacing}
+\lpr {Umathopordspacing}
+\lpr {Umathopopspacing}
+\lpr {Umathopbinspacing}
+\lpr {Umathoprelspacing}
+\lpr {Umathopopenspacing}
+\lpr {Umathopclosespacing}
+\lpr {Umathoppunctspacing}
+\lpr {Umathopinnerspacing}
+\lpr {Umathbinordspacing}
+\lpr {Umathbinopspacing}
+\lpr {Umathbinbinspacing}
+\lpr {Umathbinrelspacing}
+\lpr {Umathbinopenspacing}
+\lpr {Umathbinclosespacing}
+\lpr {Umathbinpunctspacing}
+\lpr {Umathbininnerspacing}
+\lpr {Umathrelordspacing}
+\lpr {Umathrelopspacing}
+\lpr {Umathrelbinspacing}
+\lpr {Umathrelrelspacing}
+\lpr {Umathrelopenspacing}
+\lpr {Umathrelclosespacing}
+\lpr {Umathrelpunctspacing}
+\lpr {Umathrelinnerspacing}
+\lpr {Umathopenordspacing}
+\lpr {Umathopenopspacing}
+\lpr {Umathopenbinspacing}
+\lpr {Umathopenrelspacing}
+\lpr {Umathopenopenspacing}
+\lpr {Umathopenclosespacing}
+\lpr {Umathopenpunctspacing}
+\lpr {Umathopeninnerspacing}
+\lpr {Umathcloseordspacing}
+\lpr {Umathcloseopspacing}
+\lpr {Umathclosebinspacing}
+\lpr {Umathcloserelspacing}
+\lpr {Umathcloseopenspacing}
+\lpr {Umathcloseclosespacing}
+\lpr {Umathclosepunctspacing}
+\lpr {Umathcloseinnerspacing}
+\lpr {Umathpunctordspacing}
+\lpr {Umathpunctopspacing}
+\lpr {Umathpunctbinspacing}
+\lpr {Umathpunctrelspacing}
+\lpr {Umathpunctopenspacing}
+\lpr {Umathpunctclosespacing}
+\lpr {Umathpunctpunctspacing}
+\lpr {Umathpunctinnerspacing}
+\lpr {Umathinnerordspacing}
+\lpr {Umathinneropspacing}
+\lpr {Umathinnerbinspacing}
+\lpr {Umathinnerrelspacing}
+\lpr {Umathinneropenspacing}
+\lpr {Umathinnerclosespacing}
+\lpr {Umathinnerpunctspacing}
+\lpr {Umathinnerinnerspacing}
+\stoplines
+\stoptwocolumns
+
+These parameters are of type \prm {muskip}, so setting a parameter can be done
+like this:
+
+\starttyping
+\Umathopordspacing\displaystyle=4mu plus 2mu
+\stoptyping
+
+They are all initialized by \type {initex} to the values mentioned in the table
+in Chapter~18 of the \TEX book.
+
+Note 1: for ease of use as well as for backward compatibility, \prm {thinmuskip},
+\prm {medmuskip} and \prm {thickmuskip} are treated specially. In their case a
+pointer to the corresponding internal parameter is saved, not the actual \prm
+{muskip} value. This means that any later changes to one of these three
+parameters will be taken into account.
+
+Note 2: Careful readers will realise that there are also primitives for the items
+marked \type {*} in the \TEX book. These will not actually be used as those
+combinations of atoms cannot actually happen, but it seemed better not to break
+orthogonality. They are initialized to zero.
+
+\subsection{Skips around display math}
+
+\topicindex {math+spacing}
+
+The injection of \prm {abovedisplayskip} and \prm {belowdisplayskip} is not
+symmetrical. An above one is always inserted, also when zero, but the below is
+only inserted when larger than zero. Especially the latter makes it sometimes hard
+to fully control spacing. Therefore \LUATEX\ comes with a new directive: \lpr
+{mathdisplayskipmode}. The following values apply:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0 \NC normal \TEX\ behaviour \NC \NR
+\NC 1 \NC always (same as 0) \NC \NR
+\NC 2 \NC only when not zero \NC \NR
+\NC 3 \NC never, not even when not zero \NC \NR
+\LL
+\stoptabulate
+
+\subsection {Nolimit correction}
+
+\topicindex {math+limits}
+
+There are two extra math parameters \lpr {Umathnolimitsupfactor} and \lpr
+{Umathnolimitsubfactor} that were added to provide some control over how limits
+are spaced (for example the position of super and subscripts after integral
+operators). They relate to an extra parameter \lpr {mathnolimitsmode}. The half
+corrections are what happens when scripts are placed above and below. The
+problem with italic corrections is that officially that correction italic is used
+for above|/|below placement while advanced kerns are used for placement at the
+right end. The question is: how often is this implemented, and if so, do the
+kerns assume correction too. Anyway, with this parameter one can control it.
+
+\starttabulate[|l|ck1|ck1|ck1|ck1|ck1|ck1|]
+ \NC
+ \NC \mathnolimitsmode0 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode1 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode2 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode3 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode4 $\displaystyle\int\nolimits^0_1$
+ \NC \mathnolimitsmode8000 $\displaystyle\int\nolimits^0_1$
+ \NC \NR
+ \TB
+ \BC mode
+ \NC \tttf 0
+ \NC \tttf 1
+ \NC \tttf 2
+ \NC \tttf 3
+ \NC \tttf 4
+ \NC \tttf 8000
+ \NC \NR
+ \BC superscript
+ \NC 0
+ \NC font
+ \NC 0
+ \NC 0
+ \NC +ic/2
+ \NC 0
+ \NC \NR
+ \BC subscript
+ \NC -ic
+ \NC font
+ \NC 0
+ \NC -ic/2
+ \NC -ic/2
+ \NC 8000ic/1000
+ \NC \NR
+\stoptabulate
+
+When the mode is set to one, the math parameters are used. This way a macro
+package writer can decide what looks best. Given the current state of fonts in
+\CONTEXT\ we currently use mode 1 with factor 0 for the superscript and 750 for
+the subscripts. Positive values are used for both parameters but the subscript
+shifts to the left. A \lpr {mathnolimitsmode} larger that 15 is considered to
+be a factor for the subscript correction. This feature can be handy when
+experimenting.
+
+\subsection {Math italic mess}
+
+\topicindex {math+italics}
+
+The \lpr {mathitalicsmode} parameter can be set to~1 to force italic correction
+before noads that represent some more complex structure (read: everything
+that is not an ord, bin, rel, open, close, punct or inner). We show a Cambria
+example.
+
+\starttexdefinition Whatever #1
+ \NC \type{\mathitalicsmode = #1}
+ \NC \mathitalicsmode#1\ruledhbox{$\left|T^1\right|$}
+ \NC \mathitalicsmode#1\ruledhbox{$\left|T\right|$}
+ \NC \mathitalicsmode#1\ruledhbox{$T+1$}
+ \NC \mathitalicsmode#1\ruledhbox{$T{1\over2}$}
+ \NC \mathitalicsmode#1\ruledhbox{$T\sqrt{1}$}
+ \NC \NR
+\stoptexdefinition
+
+\start
+ \switchtobodyfont[cambria]
+ \starttabulate[|c|c|c|c|c|c|]
+ \Whatever{0}%
+ \Whatever{1}%
+ \stoptabulate
+\stop
+
+This kind of parameters relate to the fact that italic correction in \OPENTYPE\
+math is bound to fuzzy rules. So, control is the solution.
+
+\subsection {Script and kerning}
+
+\topicindex {math+kerning}
+\topicindex {math+scripts}
+
+If you want to typeset text in math macro packages often provide something \type
+{\text} which obeys the script sizes. As the definition can be anything there is
+a good chance that the kerning doesn't come out well when used in a script. Given
+that the first glyph ends up in a \prm {hbox} we have some control over this.
+And, as a bonus we also added control over the normal sublist kerning. The \lpr
+{mathscriptboxmode} parameter defaults to~1.
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC \type {0} \NC forget about kerning \NC \NR
+\NC \type {1} \NC kern math sub lists with a valid glyph \NC \NR
+\NC \type {2} \NC also kern math sub boxes that have a valid glyph \NC \NR
+\NC \type {2} \NC only kern math sub boxes with a boundary node present\NC \NR
+\LL
+\stoptabulate
+
+Here we show some examples. Of course this doesn't solve all our problems, if
+only because some fonts have characters with bounding boxes that compensate for
+italics, while other fonts can lack kerns.
+
+\startbuffer[1]
+ $T_{\tf fluff}$
+\stopbuffer
+
+\startbuffer[2]
+ $T_{\text{fluff}}$
+\stopbuffer
+
+\startbuffer[3]
+ $T_{\text{\boundary1 fluff}}$
+\stopbuffer
+
+\unexpanded\def\Show#1#2#3%
+ {\doifelsenothing{#3}
+ {\small\tx\typeinlinebuffer[#1]}
+ {\doifelse{#3}{-}
+ {\small\bf\tt mode #2}
+ {\switchtobodyfont[#3]\showfontkerns\showglyphs\mathscriptboxmode#2\relax\inlinebuffer[#1]}}}
+
+\starttabulate[|lBT|c|c|c|c|c|]
+ \NC \NC \Show{1}{0}{} \NC\Show{1}{1}{} \NC \Show{2}{1}{} \NC \Show{2}{2}{} \NC \Show{3}{3}{} \NC \NR
+ \NC \NC \Show{1}{0}{-} \NC\Show{1}{1}{-} \NC \Show{2}{1}{-} \NC \Show{2}{2}{-} \NC \Show{3}{3}{-} \NC \NR
+ \NC modern \NC \Show{1}{0}{modern} \NC\Show{1}{1}{modern} \NC \Show{2}{1}{modern} \NC \Show{2}{2}{modern} \NC \Show{3}{3}{modern} \NC \NR
+ \NC lucidaot \NC \Show{1}{0}{lucidaot} \NC\Show{1}{1}{lucidaot} \NC \Show{2}{1}{lucidaot} \NC \Show{2}{2}{lucidaot} \NC \Show{3}{3}{lucidaot} \NC \NR
+ \NC pagella \NC \Show{1}{0}{pagella} \NC\Show{1}{1}{pagella} \NC \Show{2}{1}{pagella} \NC \Show{2}{2}{pagella} \NC \Show{3}{3}{pagella} \NC \NR
+ \NC cambria \NC \Show{1}{0}{cambria} \NC\Show{1}{1}{cambria} \NC \Show{2}{1}{cambria} \NC \Show{2}{2}{cambria} \NC \Show{3}{3}{cambria} \NC \NR
+ \NC dejavu \NC \Show{1}{0}{dejavu} \NC\Show{1}{1}{dejavu} \NC \Show{2}{1}{dejavu} \NC \Show{2}{2}{dejavu} \NC \Show{3}{3}{dejavu} \NC \NR
+\stoptabulate
+
+Kerning between a character subscript is controlled by \lpr {mathscriptcharmode}
+which also defaults to~1.
+
+Here is another example. Internally we tag kerns as italic kerns or font kerns
+where font kerns result from the staircase kern tables. In 2018 fonts like Latin
+Modern and Pagella rely on cheats with the boundingbox, Cambria uses staircase
+kerns and Lucida a mixture. Depending on how fonts evolve we might add some more
+control over what one can turn on and off.
+
+\def\MathSample#1#2#3%
+ {\NC
+ #1 \NC
+ #2 \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3T_{f}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3\gamma_{e}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3\gamma_{ee}$ \NC
+ \showglyphdata \switchtobodyfont[#2,17.3pt]$#3T_{\tf fluff}$ \NC
+ \NR}
+
+\starttabulate[|Tl|Tl|l|l|l|l|]
+ \FL
+ \MathSample{normal}{modern} {\mr}
+ \MathSample{} {pagella} {\mr}
+ \MathSample{} {cambria} {\mr}
+ \MathSample{} {lucidaot}{\mr}
+ \ML
+ \MathSample{bold} {modern} {\mb}
+ \MathSample{} {pagella} {\mb}
+ \MathSample{} {cambria} {\mb}
+ \MathSample{} {lucidaot}{\mb}
+ \LL
+\stoptabulate
+
+\subsection{Fixed scripts}
+
+We have three parameters that are used for this fixed anchoring:
+
+\starttabulate[|c|l|]
+\DB parameter \BC register \NC \NR
+\NC $d$ \NC \lpr {Umathsubshiftdown} \NC \NR
+\NC $u$ \NC \lpr {Umathsupshiftup} \NC \NR
+\NC $s$ \NC \lpr {Umathsubsupshiftdown} \NC \NR
+\LL
+\stoptabulate
+
+When we set \lpr {mathscriptsmode} to a value other than zero these are used
+for calculating fixed positions. This is something that is needed for instance
+for chemistry. You can manipulate the mentioned variables to achieve different
+effects.
+
+\def\SampleMath#1%
+ {$\mathscriptsmode#1\mathupright CH_2 + CH^+_2 + CH^2_2$}
+
+\starttabulate[|c|c|c|p|]
+\DB mode \BC down \BC up \BC example \NC \NR
+\TB
+\NC 0 \NC dynamic \NC dynamic \NC \SampleMath{0} \NC \NR
+\NC 1 \NC $d$ \NC $u$ \NC \SampleMath{1} \NC \NR
+\NC 2 \NC $s$ \NC $u$ \NC \SampleMath{2} \NC \NR
+\NC 3 \NC $s$ \NC $u + s - d$ \NC \SampleMath{3} \NC \NR
+\NC 4 \NC $d + (s-d)/2$ \NC $u + (s-d)/2$ \NC \SampleMath{4} \NC \NR
+\NC 5 \NC $d$ \NC $u + s - d$ \NC \SampleMath{5} \NC \NR
+\LL
+\stoptabulate
+
+The value of this parameter obeys grouping but applies to the whole current
+formula.
+
+% if needed we can put the value in stylenodes but maybe more should go there
+
+\subsection{Penalties: \lpr {mathpenaltiesmode}}
+
+\topicindex {math+penalties}
+
+Only in inline math penalties will be added in a math list. You can force
+penalties (also in display math) by setting:
+
+\starttyping
+\mathpenaltiesmode = 1
+\stoptyping
+
+This primnitive is not really needed in \LUATEX\ because you can use the callback
+\cbk {mlist_to_hlist} to force penalties by just calling the regular routine
+with forced penalties. However, as part of opening up and control this primitive
+makes sense. As a bonus we also provide two extra penalties:
+
+\starttyping
+\prebinoppenalty = -100 % example value
+\prerelpenalty = 900 % example value
+\stoptyping
+
+They default to inifinite which signals that they don't need to be inserted. When
+set they are injected before a binop or rel noad. This is an experimental feature.
+
+\subsection{Equation spacing: \lpr {matheqnogapstep}}
+
+By default \TEX\ will add one quad between the equation and the number. This is
+hard coded. A new primitive can control this:
+
+\startsyntax
+\matheqnogapstep = 1000
+\stopsyntax
+
+Because a math quad from the math text font is used instead of a dimension, we
+use a step to control the size. A value of zero will suppress the gap. The step
+is divided by 1000 which is the usual way to mimmick floating point factors in
+\TEX.
+
+\stopsection
+
+\startsection[title={Math constructs}]
+
+\subsection {Unscaled fences}
+
+\topicindex {math+fences}
+
+The \lpr {mathdelimitersmode} primitive is experimental and deals with the
+following (potential) problems. Three bits can be set. The first bit prevents an
+unwanted shift when the fence symbol is not scaled (a cambria side effect). The
+second bit forces italic correction between a preceding character ordinal and the
+fenced subformula, while the third bit turns that subformula into an ordinary so
+that the same spacing applies as with unfenced variants. Here we show Cambria
+(with \lpr {mathitalicsmode} enabled).
+
+\starttexdefinition Whatever #1
+ \NC \type{\mathdelimitersmode = #1}
+ \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f(x)$}
+ \NC \mathitalicsmode1\mathdelimitersmode#1\ruledhbox{\showglyphs\showfontkerns\showfontitalics$f\left(x\right)$}
+ \NC \NR
+\stoptexdefinition
+
+\start
+ \switchtobodyfont[cambria]
+ \starttabulate[|l|l|l|]
+ \Whatever{0}\Whatever{1}\Whatever{2}\Whatever{3}%
+ \Whatever{4}\Whatever{5}\Whatever{6}\Whatever{7}%
+ \stoptabulate
+\stop
+
+So, when set to 7 fenced subformulas with unscaled delimiters come out the same
+as unfenced ones. This can be handy for cases where one is forced to use \prm
+{left} and \prm {right} always because of unpredictable content. As said, it's an
+experimental feature (which somehow fits in the exceptional way fences are dealt
+with in the engine). The full list of flags is given in the next table:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC \type{"01} \NC don't apply the usual shift \NC \NR
+\NC \type{"02} \NC apply italic correction when possible \NC \NR
+\NC \type{"04} \NC force an ordinary subformula \NC \NR
+\NC \type{"08} \NC no shift when a base character \NC \NR
+\NC \type{"10} \NC only shift when an extensible \NC \NR
+\LL
+\stoptabulate
+
+The effect can depend on the font (and for Cambria one can use for instance \type {"16}).
+
+\subsection[mathacc]{Accent handling}
+
+\topicindex {math+accents}
+
+\LUATEX\ supports both top accents and bottom accents in math mode, and math
+accents stretch automatically (if this is supported by the font the accent comes
+from, of course). Bottom and combined accents as well as fixed-width math accents
+are controlled by optional keywords following \lpr {Umathaccent}.
+
+The keyword \type {bottom} after \lpr {Umathaccent} signals that a bottom accent
+is needed, and the keyword \type {both} signals that both a top and a bottom
+accent are needed (in this case two accents need to be specified, of course).
+
+Then the set of three integers defining the accent is read. This set of integers
+can be prefixed by the \type {fixed} keyword to indicate that a non-stretching
+variant is requested (in case of both accents, this step is repeated).
+
+A simple example:
+
+\starttyping
+\Umathaccent both fixed 0 0 "20D7 fixed 0 0 "20D7 {example}
+\stoptyping
+
+If a math top accent has to be placed and the accentee is a character and has a
+non-zero \type {top_accent} value, then this value will be used to place the
+accent instead of the \prm {skewchar} kern used by \TEX82.
+
+The \type {top_accent} value represents a vertical line somewhere in the
+accentee. The accent will be shifted horizontally such that its own \type
+{top_accent} line coincides with the one from the accentee. If the \type
+{top_accent} value of the accent is zero, then half the width of the accent
+followed by its italic correction is used instead.
+
+The vertical placement of a top accent depends on the \type {x_height} of the
+font of the accentee (as explained in the \TEX book), but if a value turns out
+to be zero and the font had a \type {MathConstants} table, then \type
+{AccentBaseHeight} is used instead.
+
+The vertical placement of a bottom accent is straight below the accentee, no
+correction takes place.
+
+Possible locations are \type {top}, \type {bottom}, \type {both} and \type
+{center}. When no location is given \type {top} is assumed. An additional
+parameter \nod {fraction} can be specified followed by a number; a value of for
+instance 1200 means that the criterium is 1.2 times the width of the nucleus. The
+fraction only applies to the stepwise selected shapes and is mostly meant for the
+\type {overlay} location. It also works for the other locations but then it
+concerns the width.
+
+\subsection{Radical extensions}
+
+\topicindex {math+radicals}
+
+The new primitive \lpr {Uroot} allows the construction of a radical noad
+including a degree field. Its syntax is an extension of \lpr {Uradical}:
+
+\starttyping
+\Uradical <fam integer> <char integer> <radicand>
+\Uroot <fam integer> <char integer> <degree> <radicand>
+\stoptyping
+
+The placement of the degree is controlled by the math parameters \lpr
+{Umathradicaldegreebefore}, \lpr {Umathradicaldegreeafter}, and \lpr
+{Umathradicaldegreeraise}. The degree will be typeset in \prm
+{scriptscriptstyle}.
+
+\subsection{Super- and subscripts}
+
+The character fields in a \LUA|-|loaded \OPENTYPE\ math font can have a \quote
+{mathkern} table. The format of this table is the same as the \quote {mathkern}
+table that is returned by the \type {fontloader} library, except that all height
+and kern values have to be specified in actual scaled points.
+
+When a super- or subscript has to be placed next to a math item, \LUATEX\ checks
+whether the super- or subscript and the nucleus are both simple character items.
+If they are, and if the fonts of both character items are \OPENTYPE\ fonts (as
+opposed to legacy \TEX\ fonts), then \LUATEX\ will use the \OPENTYPE\ math
+algorithm for deciding on the horizontal placement of the super- or subscript.
+
+This works as follows:
+
+\startitemize
+ \startitem
+ The vertical position of the script is calculated.
+ \stopitem
+ \startitem
+ The default horizontal position is flat next to the base character.
+ \stopitem
+ \startitem
+ For superscripts, the italic correction of the base character is added.
+ \stopitem
+ \startitem
+ For a superscript, two vertical values are calculated: the bottom of the
+ script (after shifting up), and the top of the base. For a subscript, the two
+ values are the top of the (shifted down) script, and the bottom of the base.
+ \stopitem
+ \startitem
+ For each of these two locations:
+ \startitemize
+ \startitem
+ find the math kern value at this height for the base (for a subscript
+ placement, this is the bottom_right corner, for a superscript
+ placement the top_right corner)
+ \stopitem
+ \startitem
+ find the math kern value at this height for the script (for a
+ subscript placement, this is the top_left corner, for a superscript
+ placement the bottom_left corner)
+ \stopitem
+ \startitem
+ add the found values together to get a preliminary result.
+ \stopitem
+ \stopitemize
+ \stopitem
+ \startitem
+ The horizontal kern to be applied is the smallest of the two results from
+ previous step.
+ \stopitem
+\stopitemize
+
+The math kern value at a specific height is the kern value that is specified by the
+next higher height and kern pair, or the highest one in the character (if there is no
+value high enough in the character), or simply zero (if the character has no math kern
+pairs at all).
+
+\subsection{Scripts on extensibles}
+
+\topicindex {math+scripts}
+\topicindex {math+delimiters}
+\topicindex {math+extensibles}
+
+The primitives \lpr {Uunderdelimiter} and \lpr {Uoverdelimiter} allow the
+placement of a subscript or superscript on an automatically extensible item and
+\lpr {Udelimiterunder} and \lpr {Udelimiterover} allow the placement of an
+automatically extensible item as a subscript or superscript on a nucleus. The
+input:
+
+% these produce radical noads .. in fact the code base has the numbers wrong for
+% quite a while, so no one seems to use this
+
+\startbuffer
+$\Uoverdelimiter 0 "2194 {\hbox{\strut overdelimiter}}$
+$\Uunderdelimiter 0 "2194 {\hbox{\strut underdelimiter}}$
+$\Udelimiterover 0 "2194 {\hbox{\strut delimiterover}}$
+$\Udelimiterunder 0 "2194 {\hbox{\strut delimiterunder}}$
+\stopbuffer
+
+\typebuffer will render this:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+The vertical placements are controlled by \lpr {Umathunderdelimiterbgap}, \lpr
+{Umathunderdelimitervgap}, \lpr {Umathoverdelimiterbgap}, and \lpr
+{Umathoverdelimitervgap} in a similar way as limit placements on large operators.
+The superscript in \lpr {Uoverdelimiter} is typeset in a suitable scripted style,
+the subscript in \lpr {Uunderdelimiter} is cramped as well.
+
+These primitives accepts an option \type {width} specification. When used the
+also optional keywords \type {left}, \type {middle} and \type {right} will
+determine what happens when a requested size can't be met (which can happen when
+we step to successive larger variants).
+
+An extra primitive \lpr {Uhextensible} is available that can be used like this:
+
+\startbuffer
+$\Uhextensible width 10cm 0 "2194$
+\stopbuffer
+
+\typebuffer This will render this:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+Here you can also pass options, like:
+
+\startbuffer
+$\Uhextensible width 1pt middle 0 "2194$
+\stopbuffer
+
+\typebuffer This gives:
+
+\blank \startnarrower \getbuffer \stopnarrower \blank
+
+\LUATEX\ internally uses a structure that supports \OPENTYPE\ \quote
+{MathVariants} as well as \TFM\ \quote {extensible recipes}. In most cases where
+font metrics are involved we have a different code path for traditional fonts end
+\OPENTYPE\ fonts.
+
+\subsection{Fractions}
+
+\topicindex {math+fractions}
+
+The \prm {abovewithdelims} command accepts a keyword \type {exact}. When issued
+the extra space relative to the rule thickness is not added. One can of course
+use the \type {\Umathfraction..gap} commands to influence the spacing. Also the
+rule is still positioned around the math axis.
+
+\starttyping
+$$ { {a} \abovewithdelims() exact 4pt {b} }$$
+\stoptyping
+
+The math parameter table contains some parameters that specify a horizontal and
+vertical gap for skewed fractions. Of course some guessing is needed in order to
+implement something that uses them. And so we now provide a primitive similar to the
+other fraction related ones but with a few options so that one can influence the
+rendering. Of course a user can also mess around a bit with the parameters
+\lpr {Umathskewedfractionhgap} and \lpr {Umathskewedfractionvgap}.
+
+The syntax used here is:
+
+\starttyping
+{ {1} \Uskewed / <options> {2} }
+{ {1} \Uskewedwithdelims / () <options> {2} }
+\stoptyping
+
+where the options can be \type {noaxis} and \type {exact}. By default we add half
+the axis to the shifts and by default we zero the width of the middle character.
+For Latin Modern the result looks as follows:
+
+\def\ShowA#1#2#3{$x + { {#1} \Uskewed / #3 {#2} } + x$}
+\def\ShowB#1#2#3{$x + { {#1} \Uskewedwithdelims / () #3 {#2} } + x$}
+
+\start
+ \switchtobodyfont[modern]
+ \starttabulate[||||||]
+ \NC \NC
+ \ShowA{a}{b}{} \NC
+ \ShowA{1}{2}{} \NC
+ \ShowB{a}{b}{} \NC
+ \ShowB{1}{2}{} \NC
+ \NR
+ \NC \type{exact} \NC
+ \ShowA{a}{b}{exact} \NC
+ \ShowA{1}{2}{exact} \NC
+ \ShowB{a}{b}{exact} \NC
+ \ShowB{1}{2}{exact} \NC
+ \NR
+ \NC \type{noaxis} \NC
+ \ShowA{a}{b}{noaxis} \NC
+ \ShowA{1}{2}{noaxis} \NC
+ \ShowB{a}{b}{noaxis} \NC
+ \ShowB{1}{2}{noaxis} \NC
+ \NR
+ \NC \type{exact noaxis} \NC
+ \ShowA{a}{b}{exact noaxis} \NC
+ \ShowA{1}{2}{exact noaxis} \NC
+ \ShowB{a}{b}{exact noaxis} \NC
+ \ShowB{1}{2}{exact noaxis} \NC
+ \NR
+ \stoptabulate
+\stop
+
+\subsection {Delimiters: \type{\Uleft}, \prm {Umiddle} and \prm {Uright}}
+
+\topicindex {math+delimiters}
+
+Normally you will force delimiters to certain sizes by putting an empty box or
+rule next to it. The resulting delimiter will either be a character from the
+stepwise size range or an extensible. The latter can be quite differently
+positioned than the characters as it depends on the fit as well as the fact if
+the used characters in the font have depth or height. Commands like (plain \TEX
+s) \type {\big} need use this feature. In \LUATEX\ we provide a bit more control
+by three variants that support optional parameters \type {height}, \type {depth}
+and \type {axis}. The following example uses this:
+
+\startbuffer
+\Uleft height 30pt depth 10pt \Udelimiter "0 "0 "000028
+\quad x\quad
+\Umiddle height 40pt depth 15pt \Udelimiter "0 "0 "002016
+\quad x\quad
+\Uright height 30pt depth 10pt \Udelimiter "0 "0 "000029
+\quad \quad \quad
+\Uleft height 30pt depth 10pt axis \Udelimiter "0 "0 "000028
+\quad x\quad
+\Umiddle height 40pt depth 15pt axis \Udelimiter "0 "0 "002016
+\quad x\quad
+\Uright height 30pt depth 10pt axis \Udelimiter "0 "0 "000029
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\ruledhbox{\mathematics{\getbuffer}}
+\stoplinecorrection
+
+The keyword \type {exact} can be used as directive that the real dimensions
+should be applied when the criteria can't be met which can happen when we're
+still stepping through the successively larger variants. When no dimensions are
+given the \type {noaxis} command can be used to prevent shifting over the axis.
+
+You can influence the final class with the keyword \type {class} which will
+influence the spacing. The numbers are the same as for character classes.
+
+\stopsection
+
+\startsection[title={Extracting values}]
+
+\subsection{Codes}
+
+\topicindex {math+codes}
+
+You can extract the components of a math character. Say that we have defined:
+
+\starttyping
+\Umathcode 1 2 3 4
+\stoptyping
+
+then
+
+\starttyping
+[\Umathcharclass1] [\Umathcharfam1] [\Umathcharslot1]
+\stoptyping
+
+will return:
+
+\starttyping
+[2] [3] [4]
+\stoptyping
+
+These commands are provides as convenience. Before they come available you could
+do the following:
+
+\starttyping
+\def\Umathcharclass{\directlua{tex.print(tex.getmathcode(token.scan_int())[1])}}
+\def\Umathcharfam {\directlua{tex.print(tex.getmathcode(token.scan_int())[2])}}
+\def\Umathcharslot {\directlua{tex.print(tex.getmathcode(token.scan_int())[3])}}
+\stoptyping
+
+\subsection {Last lines}
+
+\topicindex {math+last line}
+
+There is a new primitive to control the overshoot in the calculation of the
+previous line in mid|-|paragraph display math. The default value is 2 times
+the em width of the current font:
+
+\starttyping
+\predisplaygapfactor=2000
+\stoptyping
+
+If you want to have the length of the last line independent of math i.e.\ you don't
+want to revert to a hack where you insert a fake display math formula in order to
+get the length of the last line, the following will often work too:
+
+\starttyping
+\def\lastlinelength{\dimexpr
+ \directlua {tex.sprint (
+ (nodes.dimensions(node.tail(tex.lists.page_head).list))
+ )}sp
+\relax}
+\stoptyping
+
+\stopsection
+
+\startsection[title={Math mode}]
+
+\subsection {Verbose versions of single|-|character math commands}
+
+\topicindex {math+styles}
+
+\LUATEX\ defines six new primitives that have the same function as
+\type {^}, \type {_}, \type {$}, and \type {$$}:
+
+\starttabulate[|l|l|]
+\DB primitive \BC explanation \NC \NR
+\TB
+\NC \lpr {Usuperscript} \NC duplicates the functionality of \type {^} \NC \NR
+\NC \lpr {Usubscript} \NC duplicates the functionality of \type {_} \NC \NR
+\NC \lpr {Ustartmath} \NC duplicates the functionality of \type {$}, % $
+ when used in non-math mode. \NC \NR
+\NC \lpr {Ustopmath} \NC duplicates the functionality of \type {$}, % $
+ when used in inline math mode. \NC \NR
+\NC \lpr {Ustartdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+ when used in non-math mode. \NC \NR
+\NC \lpr {Ustopdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+ when used in display math mode. \NC \NR
+\LL
+\stoptabulate
+
+The \lpr {Ustopmath} and \lpr {Ustopdisplaymath} primitives check if the current
+math mode is the correct one (inline vs.\ displayed), but you can freely intermix
+the four mathon|/|mathoff commands with explicit dollar sign(s).
+
+\subsection{Script commands \lpr {Unosuperscript} and \lpr {Unosubscript}}
+
+\topicindex {math+styles}
+\topicindex {math+scripts}
+
+These two commands result in super- and subscripts but with the current style (at the
+time of rendering). So,
+
+\startbuffer[script]
+$
+ x\Usuperscript {1}\Usubscript {2} =
+ x\Unosuperscript{1}\Unosubscript{2} =
+ x\Usuperscript {1}\Unosubscript{2} =
+ x\Unosuperscript{1}\Usubscript {2}
+$
+\stopbuffer
+
+\typebuffer
+
+results in \inlinebuffer[script].
+
+\subsection{Allowed math commands in non|-|math modes}
+
+\topicindex {math+text}
+\topicindex {text+math}
+
+The commands \prm {mathchar}, and \lpr {Umathchar} and control sequences that are
+the result of \prm {mathchardef} or \lpr {Umathchardef} are also acceptable in
+the horizontal and vertical modes. In those cases, the \prm {textfont} from the
+requested math family is used.
+
+% \startsection[title={Math todo}]
+%
+% The following items are still todo.
+%
+% \startitemize
+% \startitem
+% Pre-scripts.
+% \stopitem
+% \startitem
+% Multi-story stacks.
+% \stopitem
+% \startitem
+% Flattened accents for high characters (maybe).
+% \stopitem
+% \startitem
+% Better control over the spacing around displays and handling of equation numbers.
+% \stopitem
+% \startitem
+% Support for multi|-|line displays using \MATHML\ style alignment points.
+% \stopitem
+% \stopitemize
+%
+% \stopsection
+
+\stopsection
+
+\startsection[title={Goodies}]
+
+\subsection {Flattening: \lpr {mathflattenmode}}
+
+\topicindex {math+flattening}
+
+The \TEX\ math engine collapses \type {ord} noads without sub- and superscripts
+and a character as nucleus. and which has the side effect that in \OPENTYPE\ mode
+italic corrections are applied (given that they are enabled).
+
+\startbuffer[sample]
+\switchtobodyfont[modern]
+$V \mathbin{\mathbin{v}} V$\par
+$V \mathord{\mathord{v}} V$\par
+\stopbuffer
+
+\typebuffer[sample]
+
+This renders as:
+
+\blank \start \mathflattenmode\plusone \getbuffer[sample] \stop \blank
+
+When we set \lpr {mathflattenmode} to 31 we get:
+
+\blank \start \mathflattenmode\numexpr1+2+4+8+16\relax \getbuffer[sample] \stop \blank
+
+When you see no difference, then the font probably has the proper character
+dimensions and no italic correction is needed. For Latin Modern (at least till
+2018) there was a visual difference. In that respect this parameter is not always
+needed unless of course you want efficient math lists anyway.
+
+You can influence flattening by adding the appropriate number to the value of the
+mode parameter. The default value is~1.
+
+\starttabulate[|Tc|c|]
+\DB mode \BC class \NC \NR
+\TB
+\NC 1 \NC ord \NC \NR
+\NC 2 \NC bin \NC \NR
+\NC 4 \NC rel \NC \NR
+\NC 8 \NC punct \NC \NR
+\NC 16 \NC inner \NC \NR
+\LL
+\stoptabulate
+
+\subsection {Less Tracing}
+
+\topicindex {math+tracing}
+
+Because there are quite some math related parameters and values, it is possible
+to limit tracing. Only when \type {tracingassigns} and|/|or \type
+{tracingrestores} are set to~2 or more they will be traced.
+
+\subsection {Math options with \lpr {mathoption}}
+
+The logic in the math engine is rather complex and there are often no universal
+solutions (read: what works out well for one font, fails for another). Therefore
+some variations in the implementation are driven by parameters (modes). In
+addition there is a new primitive \lpr {mathoption} which will be used for
+testing. Don't rely on any option to be there in a production version as they are
+meant for development.
+
+This option was introduced for testing purposes when the math engine got split
+code paths and it forces the engine to treat new fonts as old ones with respect
+to italic correction etc. There are no guarantees given with respect to the final
+result and unexpected side effects are not seen as bugs as they relate to font
+properties. Ther eis currently only one option:
+
+\startbuffer
+\mathoption old 1
+\stopbuffer
+
+The \type {oldmath} boolean flag in the \LUA\ font table is the official way to
+force old treatment as it's bound to fonts. Like with all options we may
+temporarily introduce with this command this feature is not meant for production.
+
+% % obsolete:
+%
+% \subsubsection {\type {\mathoption noitaliccompensation}}
+%
+% This option compensates placement for characters with a built|-|in italic
+% correction.
+%
+% \startbuffer
+% {\showboxes\int}\quad
+% {\showboxes\int_{|}^{|}}\quad
+% {\showboxes\int\limits_{|}^{|}}
+% \stopbuffer
+%
+% \typebuffer
+%
+% Gives (with computer modern that has such italics):
+%
+% \startlinecorrection[blank]
+% \switchtobodyfont[modern]
+% \startcombination[nx=2,ny=2,distance=5em]
+% {\mathoption noitaliccompensation 0\relax \mathematics{\getbuffer}}
+% {\nohyphens\type{0:inline}}
+% {\mathoption noitaliccompensation 0\relax \mathematics{\displaymath\getbuffer}}
+% {\nohyphens\type{0:display}}
+% {\mathoption noitaliccompensation 1\relax \mathematics{\getbuffer}}
+% {\nohyphens\type{1:inline}}
+% {\mathoption noitaliccompensation 1\relax \mathematics{\displaymath\getbuffer}}
+% {\nohyphens\type{1:display}}
+% \stopcombination
+% \stoplinecorrection
+
+% % obsolete:
+%
+% \subsubsection {\type {\mathoption nocharitalic}}
+%
+% When two characters follow each other italic correction can interfere. The
+% following example shows what this option does:
+%
+% \startbuffer
+% \catcode"1D443=11
+% \catcode"1D444=11
+% \catcode"1D445=11
+% P( PP PQR
+% \stopbuffer
+%
+% \typebuffer
+%
+% Gives (with computer modern that has such italics):
+%
+% \startlinecorrection[blank]
+% \switchtobodyfont[modern]
+% \startcombination[nx=2,ny=2,distance=5em]
+% {\mathoption nocharitalic 0\relax \mathematics{\getbuffer}}
+% {\nohyphens\type{0:inline}}
+% {\mathoption nocharitalic 0\relax \mathematics{\displaymath\getbuffer}}
+% {\nohyphens\type{0:display}}
+% {\mathoption nocharitalic 1\relax \mathematics{\getbuffer}}
+% {\nohyphens\type{1:inline}}
+% {\mathoption nocharitalic 1\relax \mathematics{\displaymath\getbuffer}}
+% {\nohyphens\type{1:display}}
+% \stopcombination
+% \stoplinecorrection
+
+% % obsolete:
+%
+% \subsubsection {\type {\mathoption useoldfractionscaling}}
+%
+% This option has been introduced as solution for tracker item 604 for fuzzy cases
+% around either or not present fraction related settings for new fonts.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-modifications.tex b/systems/doc/luatex/luatex-modifications.tex
new file mode 100644
index 0000000000..294f3fc3f8
--- /dev/null
+++ b/systems/doc/luatex/luatex-modifications.tex
@@ -0,0 +1,1380 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-modifications
+
+\startchapter[reference=modifications,title={Modifications}]
+
+\startsection[title=The merged engines]
+
+\startsubsection[title=The need for change]
+
+\topicindex {engines}
+\topicindex {history}
+
+The first version of \LUATEX\ only had a few extra primitives and it was largely
+the same as \PDFTEX. Then we merged substantial parts of \ALEPH\ into the code
+and got more primitives. When we got more stable the decision was made to clean
+up the rather hybrid nature of the program. This means that some primitives have
+been promoted to core primitives, often with a different name, and that others
+were removed. This made it possible to start cleaning up the code base. In \in
+{chapter} [enhancements] we discussed some new primitives, here we will cover
+most of the adapted ones.
+
+Besides the expected changes caused by new functionality, there are a number of
+not|-|so|-|expected changes. These are sometimes a side|-|effect of a new
+(conflicting) feature, or, more often than not, a change necessary to clean up
+the internal interfaces. These will also be mentioned.
+
+\stopsubsection
+
+\startsubsection[title=Changes from \TEX\ 3.1415926]
+
+\topicindex {\TEX}
+
+Of course it all starts with traditional \TEX. Even if we started with \PDFTEX,
+most still comes from the original. But we divert a bit.
+
+\startitemize
+
+\startitem
+ The current code base is written in \CCODE, not \PASCAL. We use \CWEB\ when
+ possible. As a consequence instead of one large file plus change files, we
+ now have multiple files organized in categories like \type {tex}, \type
+ {pdf}, \type {lang}, \type {font}, \type {lua}, etc. There are some artifacts
+ of the conversion to \CCODE, but in due time we will clean up the source code
+ and make sure that the documentation is done right. Many files are in the
+ \CWEB\ format, but others, like those interfacing to \LUA, are \CCODE\ files.
+ Of course we want to stay as close as possible to the original so that the
+ documentation of the fundamentals behind \TEX\ by Don Knuth still applies.
+\stopitem
+
+\startitem
+ See \in {chapter} [languages] for many small changes related to paragraph
+ building, language handling and hyphenation. The most important change is
+ that adding a brace group in the middle of a word (like in \type {of{}fice})
+ does not prevent ligature creation.
+\stopitem
+
+\startitem
+ There is no pool file, all strings are embedded during compilation.
+\stopitem
+
+\startitem
+ The specifier \type {plus 1 fillll} does not generate an error. The extra
+ \quote{l} is simply typeset.
+\stopitem
+
+\startitem
+ The upper limit to \prm {endlinechar} and \prm {newlinechar} is 127.
+\stopitem
+
+\startitem
+ Magnification (\prm {mag}) is only supported in \DVI\ output mode. You can
+ set this parameter and it even works with \type {true} units till you switch
+ to \PDF\ output mode. When you use \PDF\ output you can best not touch the
+ \prm {mag} variable. This fuzzy behaviour is not much different from using
+ \PDF\ backend related functionality while eventually \DVI\ output is
+ required.
+
+ After the output mode has been frozen (normally that happens when the first
+ page is shipped out) or when \PDF\ output is enabled, the \type {true}
+ specification is ignored. When you preload a plain format adapted to
+ \LUATEX\ it can be that the \prm {mag} parameter already has been set.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from \ETEX\ 2.2]
+
+\topicindex {\ETEX}
+
+Being the de factor standard extension of course we provide the \ETEX\
+functionality, but with a few small adaptations.
+
+\startitemize
+
+\startitem
+ The \ETEX\ functionality is always present and enabled so the prepended
+ asterisk or \type {-etex} switch for \INITEX\ is not needed.
+\stopitem
+
+\startitem
+ The \TEXXET\ extension is not present, so the primitives \type
+ {\TeXXeTstate}, \type {\beginR}, \type {\beginL}, \type {\endR} and \type
+ {\endL} are missing. Instead we used the \OMEGA/\ALEPH\ approach to
+ directionality as starting point.
+\stopitem
+
+\startitem
+ Some of the tracing information that is output by \ETEX's \prm
+ {tracingassigns} and \prm {tracingrestores} is not there.
+\stopitem
+
+\startitem
+ Register management in \LUATEX\ uses the \OMEGA/\ALEPH\ model, so the maximum
+ value is 65535 and the implementation uses a flat array instead of the mixed
+ flat & sparse model from \ETEX.
+\stopitem
+
+\startitem
+ When kpathsea is used to find files, \LUATEX\ uses the \type {ofm} file
+ format to search for font metrics. In turn, this means that \LUATEX\ looks at
+ the \type {OFMFONTS} configuration variable (like \OMEGA\ and \ALEPH) instead
+ of \type {TFMFONTS} (like \TEX\ and \PDFTEX). Likewise for virtual fonts
+ (\LUATEX\ uses the variable \type {OVFFONTS} instead of \type {VFFONTS}).
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\startsubsection[title=Changes from \PDFTEX\ 1.40]
+
+\topicindex {\PDFTEX}
+
+Because we want to produce \PDF\ the most natural starting point was the popular
+\PDFTEX\ program. We inherit the stable features, dropped most of the
+experimental code and promoted some functionality to core \LUATEX\ functionality
+which in turn triggered renaming primitives.
+
+For compatibility reasons we still refer to \type {\pdf...} commands but \LUATEX\
+has a different backend interface. Instead of these primitives there are three
+interfacing primitives: \lpr {pdfextension}, \lpr {pdfvariable} and \lpr
+{pdffeedback} that take keywords and optional further arguments (below we will
+still use the \tex {pdf} prefix names as reference). This way we can extend the
+features when needed but don't need to adapt the core engine. The front- and
+backend are decoupled as much as possible.
+
+\startitemize
+
+\startitem
+ The (experimental) support for snap nodes has been removed, because it is
+ much more natural to build this functionality on top of node processing and
+ attributes. The associated primitives that are gone are: \orm
+ {pdfsnaprefpoint}, \orm {pdfsnapy}, and \orm {pdfsnapycomp}.
+\stopitem
+
+\startitem
+ The (experimental) support for specialized spacing around nodes has also been
+ removed. The associated primitives that are gone are: \orm
+ {pdfadjustinterwordglue}, \orm {pdfprependkern}, and \orm {pdfappendkern}, as
+ well as the five supporting primitives \orm {knbscode}, \orm {stbscode}, \orm
+ {shbscode}, \orm {knbccode}, and \orm {knaccode}.
+\stopitem
+
+\startitem
+ A number of \quote {\PDFTEX\ primitives} have been removed as they can be
+ implemented using \LUA: \orm {pdfelapsedtime}, \orm {pdfescapehex}, \orm
+ {pdfescapename}, \orm {pdfescapestring}, \orm {pdffiledump}, \orm
+ {pdffilemoddate}, \orm {pdffilesize}, \orm {pdfforcepagebox}, \orm
+ {pdflastmatch}, \orm {pdfmatch}, \orm {pdfmdfivesum}, \orm {pdfmovechars},
+ \orm {pdfoptionalwaysusepdfpagebox}, \orm {pdfoptionpdfinclusionerrorlevel},
+ \orm {pdfresettimer}, \orm {pdfshellescape}, \orm {pdfstrcmp} and \orm
+ {pdfunescapehex}.
+\stopitem
+
+\startitem
+ The version related primitives \orm {pdftexbanner}, \orm {pdftexversion}
+ and \orm {pdftexrevision} are no longer present as there is no longer a
+ relationship with \PDFTEX\ development.
+\stopitem
+
+\startitem
+ The experimental snapper mechanism has been removed and therefore also the
+ primitives \orm {pdfignoreddimen}, \orm {pdffirstlineheight}, \orm
+ {pdfeachlineheight}, \orm {pdfeachlinedepth} and \orm {pdflastlinedepth}.
+\stopitem
+
+\startitem
+ The experimental primitives \lpr {primitive}, \lpr {ifprimitive}, \lpr
+ {ifabsnum} and \lpr {ifabsdim} are promoted to core primitives. The \type
+ {\pdf*} prefixed originals are not available.
+\stopitem
+
+\startitem
+ Because \LUATEX\ has a different subsystem for managing images, more
+ diversion from its ancestor happened in the meantime. We don't adapt to
+ changes in \PDFTEX.
+\stopitem
+
+\startitem
+ Two extra token lists are provided, \orm {pdfxformresources} and \orm
+ {pdfxformattr}, as an alternative to \orm {pdfxform} keywords.
+\stopitem
+
+\startitem
+ Image specifications also support \type {visiblefilename}, \type
+ {userpassword} and \type {ownerpassword}. The password options are only
+ relevant for encrypted \PDF\ files.
+\stopitem
+
+\startitem
+ The current version of \LUATEX\ no longer replaces and|/|or merges fonts in
+ embedded \PDF\ files with fonts of the enveloping \PDF\ document. This
+ regression may be temporary, depending on how the rewritten font backend will
+ look like.
+\stopitem
+
+\startitem
+ The primitives \orm {pdfpagewidth} and \orm {pdfpageheight} have been removed
+ because \lpr {pagewidth} and \lpr {pageheight} have that purpose.
+\stopitem
+
+\startitem
+ The primitives \orm {pdfnormaldeviate}, \orm {pdfuniformdeviate}, \orm
+ {pdfsetrandomseed} and \orm {pdfrandomseed} have been promoted to core
+ primitives without \type {pdf} prefix so the original commands are no longer
+ recognized.
+\stopitem
+
+\startitem
+ The primitives \lpr {ifincsname}, \lpr {expanded} and \lpr {quitvmode}
+ are now core primitives.
+\stopitem
+
+\startitem
+ As the hz and protrusion mechanism are part of the core the related
+ primitives \lpr {lpcode}, \lpr {rpcode}, \lpr {efcode}, \lpr
+ {leftmarginkern}, \lpr {rightmarginkern} are promoted to core primitives. The
+ two commands \lpr {protrudechars} and \lpr {adjustspacing} replace their
+ prefixed with \type {\pdf} originals.
+\stopitem
+
+\startitem
+ The hz optimization code has been partially redone so that we no longer need
+ to create extra font instances. The front- and backend have been decoupled
+ and more efficient (\PDF) code is generated.
+\stopitem
+
+\startitem
+ When \lpr {adjustspacing} has value~2, hz optimization will be applied to
+ glyphs and kerns. When the value is~3, only glyphs will be treated. A value
+ smaller than~2 disables this feature.
+\stopitem
+
+\startitem
+ The \lpr {tagcode} primitive is promoted to core primitive.
+\stopitem
+
+\startitem
+ The \lpr {letterspacefont} feature is now part of the core but will not be
+ changed (improved). We just provide it for legacy use.
+\stopitem
+
+\startitem
+ The \orm {pdfnoligatures} primitive is now \lpr {ignoreligaturesinfont}.
+\stopitem
+
+\startitem
+ The \orm {pdfcopyfont} primitive is now \lpr {copyfont}.
+\stopitem
+
+\startitem
+ The \orm {pdffontexpand} primitive is now \lpr {expandglyphsinfont}.
+\stopitem
+
+\startitem
+ Because position tracking is also available in \DVI\ mode the \lpr {savepos},
+ \lpr {lastxpos} and \lpr {lastypos} commands now replace their \type {pdf}
+ prefixed originals.
+\stopitem
+
+\startitem
+ The introspective primitives \type {\pdflastximagecolordepth} and \type
+ {\pdfximagebbox} have been removed. One can use external applications to
+ determine these properties or use the built|-|in \type {img} library.
+\stopitem
+
+\startitem
+ The initializers \orm {pdfoutput} has been replaced by \lpr {outputmode} and
+ \orm {pdfdraftmode} is now \lpr {draftmode}.
+\stopitem
+
+\startitem
+ The pixel multiplier dimension \orm {pdfpxdimen} lost its prefix and is now
+ called \lpr {pxdimen}.
+\stopitem
+
+\startitem
+ An extra \orm {pdfimageaddfilename} option has been added that can be used to
+ block writing the filename to the \PDF\ file.
+\stopitem
+
+\startitem
+ The primitive \orm {pdftracingfonts} is now \lpr {tracingfonts} as it
+ doesn't relate to the backend.
+\stopitem
+
+\startitem
+ The experimental primitive \orm {pdfinsertht} is kept as \lpr {insertht}.
+\stopitem
+
+\startitem
+ There is some more control over what metadata goes into the \PDF\ file.
+\stopitem
+
+\startitem
+ The promotion of primitives to core primitives as well as the separation of
+ font- and backend means that the initialization namespace \type {pdftex} is
+ gone.
+\stopitem
+
+\stopitemize
+
+One change involves the so called xforms and ximages. In \PDFTEX\ these are
+implemented as so called whatsits. But contrary to other whatsits they have
+dimensions that need to be taken into account when for instance calculating
+optimal line breaks. In \LUATEX\ these are now promoted to a special type of rule
+nodes, which simplifies code that needs those dimensions.
+
+Another reason for promotion is that these are useful concepts. Backends can
+provide the ability to use content that has been rendered in several places, and
+images are also common. As already mentioned in \in {section}
+[sec:imagedandforms], we now have:
+
+\starttabulate[|l|l|]
+\DB \LUATEX \BC \PDFTEX \NC \NR
+\TB
+\NC \lpr {saveboxresource} \NC \orm {pdfxform} \NC \NR
+\NC \lpr {saveimageresource} \NC \orm {pdfximage} \NC \NR
+\NC \lpr {useboxresource} \NC \orm {pdfrefxform} \NC \NR
+\NC \lpr {useimageresource} \NC \orm {pdfrefximage} \NC \NR
+\NC \lpr {lastsavedboxresourceindex} \NC \orm {pdflastxform} \NC \NR
+\NC \lpr {lastsavedimageresourceindex} \NC \orm {pdflastximage} \NC \NR
+\NC \lpr {lastsavedimageresourcepages} \NC \orm {pdflastximagepages} \NC \NR
+\LL
+\stoptabulate
+
+There are a few \lpr {pdffeedback} features that relate to this but these are
+typical backend specific ones. The index that gets returned is to be considered
+as \quote {just a number} and although it still has the same meaning (object
+related) as before, you should not depend on that.
+
+The protrusion detection mechanism is enhanced a bit to enable a bit more complex
+situations. When protrusion characters are identified some nodes are skipped:
+
+\startitemize[packed,columns,two]
+\startitem zero glue \stopitem
+\startitem penalties \stopitem
+\startitem empty discretionaries \stopitem
+\startitem normal zero kerns \stopitem
+\startitem rules with zero dimensions \stopitem
+\startitem math nodes with a surround of zero \stopitem
+\startitem dir nodes \stopitem
+\startitem empty horizontal lists \stopitem
+\startitem local par nodes \stopitem
+\startitem inserts, marks and adjusts \stopitem
+\startitem boundaries \stopitem
+\startitem whatsits \stopitem
+\stopitemize
+
+Because this can not be enough, you can also use a protrusion boundary node to
+make the next node being ignored. When the value is~1 or~3, the next node will be
+ignored in the test when locating a left boundary condition. When the value is~2
+or~3, the previous node will be ignored when locating a right boundary condition
+(the search goes from right to left). This permits protrusion combined with for
+instance content moved into the margin:
+
+\starttyping
+\protrusionboundary1\llap{!\quad}«Who needs protrusion?»
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title=Changes from \ALEPH\ RC4]
+
+\topicindex {\ALEPH}
+
+Because we wanted proper directional typesetting the \ALEPH\ mechanisms looked
+most attractive. These are rather close to the ones provided by \OMEGA, so what
+we say next applies to both these programs.
+
+\startitemize
+
+\startitem
+ The extended 16-bit math primitives (\orm {omathcode} etc.) have been
+ removed.
+\stopitem
+
+\startitem
+ The \OCP\ processing has been removed completely and as a consequence, the
+ following primitives have been removed: \orm {ocp}, \orm {externalocp}, \orm
+ {ocplist}, \orm {pushocplist}, \orm {popocplist}, \orm {clearocplists}, \orm
+ {addbeforeocplist}, \orm {addafterocplist}, \orm {removebeforeocplist}, \orm
+ {removeafterocplist} and \orm {ocptracelevel}.
+\stopitem
+
+\startitem
+ \LUATEX\ only understands 4~of the 16~direction specifiers of \ALEPH: \type
+ {TLT} (latin), \type {TRT} (arabic), \type {RTT} (cjk), \type {LTL} (mongolian).
+ All other direction specifiers generate an error. In addition to a keyword
+ driven model we also provide an integer driven one.
+\stopitem
+
+\startitem
+ The input translations from \ALEPH\ are not implemented, the related
+ primitives are not available: \orm {DefaultInputMode}, \orm
+ {noDefaultInputMode}, \orm {noInputMode}, \orm {InputMode}, \orm
+ {DefaultOutputMode}, \orm {noDefaultOutputMode}, \orm {noOutputMode}, \orm
+ {OutputMode}, \orm {DefaultInputTranslation}, \orm
+ {noDefaultInputTranslation}, \orm {noInputTranslation}, \orm
+ {InputTranslation}, \orm {DefaultOutputTranslation}, \orm
+ {noDefaultOutputTranslation}, \orm {noOutputTranslation} and \orm
+ {OutputTranslation}.
+\stopitem
+
+\startitem
+ Several bugs have been fixed and confusing implementation details have been
+ sorted out.
+\stopitem
+
+\startitem
+ The scanner for direction specifications now allows an optional space after
+ the direction is completely parsed.
+\stopitem
+
+\startitem
+ The \type {^^} notation has been extended: after \type {^^^^} four
+ hexadecimal characters are expected and after \type {^^^^^^} six hexadecimal
+ characters have to be given. The original \TEX\ interpretation is still valid
+ for the \type {^^} case but the four and six variants do no backtracking,
+ i.e.\ when they are not followed by the right number of hexadecimal digits
+ they issue an error message. Because \type{^^^} is a normal \TEX\ case, we
+ don't support the odd number of \type {^^^^^} either.
+\stopitem
+
+\startitem
+ Glues {\it immediately after} direction change commands are not legal
+ breakpoints.
+\stopitem
+
+\startitem
+ Several mechanisms that need to be right|-|to|-|left aware have been
+ improved. For instance placement of formula numbers.
+\stopitem
+
+\startitem
+ The page dimension related primitives \lpr {pagewidth} and \lpr {pageheight}
+ have been promoted to core primitives. The \prm {hoffset} and \prm {voffset}
+ primitives have been fixed.
+\stopitem
+
+\startitem
+ The primitives \type {\charwd}, \type {\charht}, \type {\chardp} and \type
+ {\charit} have been removed as we have the \ETEX\ variants \type
+ {\fontchar*}.
+\stopitem
+
+\startitem
+ The two dimension registers \lpr {pagerightoffset} and \lpr
+ {pagebottomoffset} are now core primitives.
+\stopitem
+
+\startitem
+ The direction related primitives \lpr {pagedir}, \lpr {bodydir}, \lpr
+ {pardir}, \lpr {textdir}, \lpr {mathdir} and \lpr {boxdir} are now core
+ primitives.
+\stopitem
+
+\startitem
+ The promotion of primitives to core primitives as well as removing of all
+ others means that the initialization namespace \type {aleph} that early
+ versions of \LUATEX\ provided is gone.
+\stopitem
+
+\stopitemize
+
+The above let's itself summarize as: we took the 32 bit aspects and much of the
+directional mechanisms and merged it into the \PDFTEX\ code base as starting
+point for further development. Then we simplified directionality, fixed it and
+opened it up.
+
+\stopsubsection
+
+\startsubsection[title=Changes from standard \WEBC]
+
+\topicindex {\WEBC}
+
+The compilation framework is \WEBC\ and we keep using that but without the
+\PASCAL\ to \CCODE\ step. This framework also provides some common features that
+deal with reading bytes from files and locating files in \TDS. This is what we do
+different:
+
+\startitemize
+
+\startitem
+ There is no mltex support.
+\stopitem
+
+\startitem
+ There is no enctex support.
+\stopitem
+
+\startitem
+ The following encoding related command line switches are silently ignored,
+ even in non|-|\LUA\ mode: \type {-8bit}, \type {-translate-file}, \type
+ {-mltex}, \type {-enc} and \type {-etex}.
+\stopitem
+
+\startitem
+ The \prm {openout} whatsits are not written to the log file.
+\stopitem
+
+\startitem
+ Some of the so|-|called \WEBC\ extensions are hard to set up in non|-|\KPSE\
+ mode because \type {texmf.cnf} is not read: \type {shell-escape} is off (but
+ that is not a problem because of \LUA's \type {os.execute}), and the paranoia
+ checks on \type {openin} and \type {openout} do not happen. However, it is
+ easy for a \LUA\ script to do this itself by overloading \type {io.open} and
+ alike.
+\stopitem
+
+\startitem
+ The \quote{E} option does not do anything useful.
+\stopitem
+
+\stopitemize
+
+\stopsubsection
+
+\stopsection
+
+\startsection[reference=backendprimitives,title=The backend primitives]
+
+\startsubsection[title={Less primitives}]
+
+\topicindex {backend}
+\topicindex {\PDF+backend}
+
+In a previous section we mentioned that some \PDFTEX\ primitives were removed and
+others promoted to core \LUATEX\ primitives. That is only part of the story. In
+order to separate the backend specific primitives in de code these commands are
+now replaced by only a few. In traditional \TEX\ we only had the \DVI\ backend
+but now we have two: \DVI\ and \PDF. Additional functionality is implemented as
+\quote {extensions} in \TEX\ speak. By separating more strickly we are able to
+keep the core (frontend) clean and stable and isolate these extensions. If for
+some reason an extra backend option is needed, it can be implemented without
+touching the core. The three \PDF\ backend related primitives are:
+
+\starttyping
+\pdfextension command [specification]
+\pdfvariable name
+\pdffeedback name
+\stoptyping
+
+An extension triggers further parsing, depending on the command given. A variable is
+a (kind of) register and can be read and written, while a feedback is reporting
+something (as it comes from the backend it's normally a sequence of tokens).
+
+\stopsubsection
+
+\startsubsection[title={\lpr{pdfextension}, \lpr {pdfvariable} and \lpr {pdffeedback}},reference=sec:pdfextensions]
+
+In order for \LUATEX\ to be more than just \TEX\ you need to enable primitives. That
+has already been the case right from the start. If you want the traditional \PDFTEX\
+primitives (for as far their functionality is still around) you now can do this:
+
+\starttyping
+\protected\def\pdfliteral {\pdfextension literal}
+\protected\def\pdfcolorstack {\pdfextension colorstack}
+\protected\def\pdfsetmatrix {\pdfextension setmatrix}
+\protected\def\pdfsave {\pdfextension save\relax}
+\protected\def\pdfrestore {\pdfextension restore\relax}
+\protected\def\pdfobj {\pdfextension obj }
+\protected\def\pdfrefobj {\pdfextension refobj }
+\protected\def\pdfannot {\pdfextension annot }
+\protected\def\pdfstartlink {\pdfextension startlink }
+\protected\def\pdfendlink {\pdfextension endlink\relax}
+\protected\def\pdfoutline {\pdfextension outline }
+\protected\def\pdfdest {\pdfextension dest }
+\protected\def\pdfthread {\pdfextension thread }
+\protected\def\pdfstartthread {\pdfextension startthread }
+\protected\def\pdfendthread {\pdfextension endthread\relax}
+\protected\def\pdfinfo {\pdfextension info }
+\protected\def\pdfcatalog {\pdfextension catalog }
+\protected\def\pdfnames {\pdfextension names }
+\protected\def\pdfincludechars {\pdfextension includechars }
+\protected\def\pdffontattr {\pdfextension fontattr }
+\protected\def\pdfmapfile {\pdfextension mapfile }
+\protected\def\pdfmapline {\pdfextension mapline }
+\protected\def\pdftrailer {\pdfextension trailer }
+\protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
+\stoptyping
+
+The introspective primitives can be defined as:
+
+\starttyping
+\def\pdftexversion {\numexpr\pdffeedback version\relax}
+\def\pdftexrevision {\pdffeedback revision}
+\def\pdflastlink {\numexpr\pdffeedback lastlink\relax}
+\def\pdfretval {\numexpr\pdffeedback retval\relax}
+\def\pdflastobj {\numexpr\pdffeedback lastobj\relax}
+\def\pdflastannot {\numexpr\pdffeedback lastannot\relax}
+\def\pdfxformname {\numexpr\pdffeedback xformname\relax}
+\def\pdfcreationdate {\pdffeedback creationdate}
+\def\pdffontname {\numexpr\pdffeedback fontname\relax}
+\def\pdffontobjnum {\numexpr\pdffeedback fontobjnum\relax}
+\def\pdffontsize {\dimexpr\pdffeedback fontsize\relax}
+\def\pdfpageref {\numexpr\pdffeedback pageref\relax}
+\def\pdfcolorstackinit {\pdffeedback colorstackinit}
+\stoptyping
+
+The configuration related registers have become:
+
+\starttyping
+\edef\pdfcompresslevel {\pdfvariable compresslevel}
+\edef\pdfobjcompresslevel {\pdfvariable objcompresslevel}
+\edef\pdfrecompress {\pdfvariable recompress}
+\edef\pdfdecimaldigits {\pdfvariable decimaldigits}
+\edef\pdfgamma {\pdfvariable gamma}
+\edef\pdfimageresolution {\pdfvariable imageresolution}
+\edef\pdfimageapplygamma {\pdfvariable imageapplygamma}
+\edef\pdfimagegamma {\pdfvariable imagegamma}
+\edef\pdfimagehicolor {\pdfvariable imagehicolor}
+\edef\pdfimageaddfilename {\pdfvariable imageaddfilename}
+\edef\pdfpkresolution {\pdfvariable pkresolution}
+\edef\pdfpkfixeddpi {\pdfvariable pkfixeddpi}
+\edef\pdfinclusioncopyfonts {\pdfvariable inclusioncopyfonts}
+\edef\pdfinclusionerrorlevel {\pdfvariable inclusionerrorlevel}
+\edef\pdfignoreunknownimages {\pdfvariable ignoreunknownimages}
+\edef\pdfgentounicode {\pdfvariable gentounicode}
+\edef\pdfomitcidset {\pdfvariable omitcidset}
+\edef\pdfomitcharset {\pdfvariable omitcharset}
+\edef\pdfpagebox {\pdfvariable pagebox}
+\edef\pdfminorversion {\pdfvariable minorversion}
+\edef\pdfuniqueresname {\pdfvariable uniqueresname}
+
+\edef\pdfhorigin {\pdfvariable horigin}
+\edef\pdfvorigin {\pdfvariable vorigin}
+\edef\pdflinkmargin {\pdfvariable linkmargin}
+\edef\pdfdestmargin {\pdfvariable destmargin}
+\edef\pdfthreadmargin {\pdfvariable threadmargin}
+\edef\pdfxformmargin {\pdfvariable xformmargin}
+
+\edef\pdfpagesattr {\pdfvariable pagesattr}
+\edef\pdfpageattr {\pdfvariable pageattr}
+\edef\pdfpageresources {\pdfvariable pageresources}
+\edef\pdfxformattr {\pdfvariable xformattr}
+\edef\pdfxformresources {\pdfvariable xformresources}
+\edef\pdfpkmode {\pdfvariable pkmode}
+
+\edef\pdfsuppressoptionalinfo {\pdfvariable suppressoptionalinfo }
+\edef\pdftrailerid {\pdfvariable trailerid }
+\stoptyping
+
+The variables are internal ones, so they are anonymous. When you ask for the
+meaning of a few previously defined ones:
+
+\starttyping
+\meaning\pdfhorigin
+\meaning\pdfcompresslevel
+\meaning\pdfpageattr
+\stoptyping
+
+you will get:
+
+\starttyping
+macro:->[internal backend dimension]
+macro:->[internal backend integer]
+macro:->[internal backend tokenlist]
+\stoptyping
+
+The \prm {edef} can also be a \prm {def} but it's a bit more efficient to expand
+the lookup related register beforehand.
+
+The backend is derived from \PDFTEX\ so the same syntax applies. However, the
+\type {outline} command accepts a \type {objnum} followed by a number. No
+checking takes place so when this is used it had better be a valid (flushed)
+object.
+
+In order to be (more or less) compatible with \PDFTEX\ we also support the option
+to suppress some info but we do so via a bitset:
+
+\starttyping
+\pdfvariable suppressoptionalinfo \numexpr
+ 0
+ + 1 % PTEX.FullBanner
+ + 2 % PTEX.FileName
+ + 4 % PTEX.PageNumber
+ + 8 % PTEX.InfoDict
+ + 16 % Creator
+ + 32 % CreationDate
+ + 64 % ModDate
+ + 128 % Producer
+ + 256 % Trapped
+ + 512 % ID
+\relax
+\stoptyping
+
+In addition you can overload the trailer id, but we don't do any checking on
+validity, so you have to pass a valid array. The following is like the ones
+normally generated by the engine. You even need to include the brackets here!
+
+\starttyping
+\pdfvariable trailerid {[
+ <FA052949448907805BA83C1E78896398>
+ <FA052949448907805BA83C1E78896398>
+]}
+\stoptyping
+
+Although we started from a merge of \PDFTEX\ and \ALEPH, by now the code base as
+well as functionality has diverted from those parents. Here we show the options
+that can be passed to the extensions.
+
+\starttexsyntax
+\pdfextension literal
+ [ direct | page | raw ] { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension dest
+ num integer | name { tokens }!crlf
+ [ fitbh | fitbv | fitb | fith| fitv | fit |
+ fitr <rule spec> | xyz [ zoom <integer> ]
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension annot
+ reserveobjnum | useobjnum <integer>
+ { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension save
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension restore
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension setmatrix
+ { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+[ \immediate ] \pdfextension obj
+ reserveobjnum
+\stoptexsyntax
+
+\starttexsyntax
+[ \immediate ] \pdfextension obj
+ [ useobjnum <integer> ]
+ [ uncompressed ]
+ [ stream [ attr { tokens } ] ]
+ [ file ]
+ { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension refobj
+ <integer>
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension colorstack
+ <integer>
+ set { tokens } | push { tokens } | pop | current
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension startlink
+ [ attr { tokens } ]
+ user { tokens } | goto | thread
+ [ file { tokens } ]
+ [ page <integer> { tokens } | name { tokens } | num integer ]
+ [ newwindow | nonewwindow ]
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension endlink
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension startthread
+ num <integer> | name { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension endthread
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension thread
+ num <integer> | name { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension outline
+ [ attr { tokens } ]
+ [ useobjnum <integer> ]
+ [ count <integer> ]
+ { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension glyphtounicode
+ { tokens }
+ { tokens }
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension catalog
+ { tokens }
+ [ openaction
+ user { tokens } | goto | thread
+ [ file { tokens } ]
+ [ page <integer> { tokens } | name { tokens } | num <integer> ]
+ [ newwindow | nonewwindow ] ]
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension fontattr
+ <integer>
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension mapfile
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension mapline
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension includechars
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension info
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension names
+ {tokens}
+\stoptexsyntax
+
+\starttexsyntax
+\pdfextension trailer
+ {tokens}
+\stoptexsyntax
+
+\stopsubsection
+
+\startsubsection[title={Defaults}]
+
+The engine sets the following defaults.
+
+\starttyping
+\pdfcompresslevel 9
+\pdfobjcompresslevel 1 % used: (0,9)
+\pdfrecompress 0 % mostly for debugging
+\pdfdecimaldigits 4 % used: (3,6)
+\pdfgamma 1000
+\pdfimageresolution 71
+\pdfimageapplygamma 0
+\pdfimagegamma 2200
+\pdfimagehicolor 1
+\pdfimageaddfilename 1
+\pdfpkresolution 72
+\pdfpkfixeddpi 0
+\pdfinclusioncopyfonts 0
+\pdfinclusionerrorlevel 0
+\pdfignoreunknownimages 0
+\pdfgentounicode 0
+\pdfomitcidset 0
+\pdfomitcharset 0
+\pdfpagebox 0
+\pdfminorversion 4
+\pdfuniqueresname 0
+
+\pdfhorigin 1in
+\pdfvorigin 1in
+\pdflinkmargin 0pt
+\pdfdestmargin 0pt
+\pdfthreadmargin 0pt
+\pdfxformmargin 0pt
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={Backward compatibility}]
+
+If you also want some backward compatibility, you can add:
+
+\starttyping
+\let\pdfpagewidth \pagewidth
+\let\pdfpageheight \pageheight
+
+\let\pdfadjustspacing \adjustspacing
+\let\pdfprotrudechars \protrudechars
+\let\pdfnoligatures \ignoreligaturesinfont
+\let\pdffontexpand \expandglyphsinfont
+\let\pdfcopyfont \copyfont
+
+\let\pdfxform \saveboxresource
+\let\pdflastxform \lastsavedboxresourceindex
+\let\pdfrefxform \useboxresource
+
+\let\pdfximage \saveimageresource
+\let\pdflastximage \lastsavedimageresourceindex
+\let\pdflastximagepages\lastsavedimageresourcepages
+\let\pdfrefximage \useimageresource
+
+\let\pdfsavepos \savepos
+\let\pdflastxpos \lastxpos
+\let\pdflastypos \lastypos
+
+\let\pdfoutput \outputmode
+\let\pdfdraftmode \draftmode
+
+\let\pdfpxdimen \pxdimen
+
+\let\pdfinsertht \insertht
+
+\let\pdfnormaldeviate \normaldeviate
+\let\pdfuniformdeviate \uniformdeviate
+\let\pdfsetrandomseed \setrandomseed
+\let\pdfrandomseed \randomseed
+
+\let\pdfprimitive \primitive
+\let\ifpdfprimitive \ifprimitive
+
+\let\ifpdfabsnum \ifabsnum
+\let\ifpdfabsdim \ifabsdim
+\stoptyping
+
+And even:
+
+\starttyping
+\newdimen\pdfeachlineheight
+\newdimen\pdfeachlinedepth
+\newdimen\pdflastlinedepth
+\newdimen\pdffirstlineheight
+\newdimen\pdfignoreddimen
+\stoptyping
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Directions]
+
+\topicindex {\OMEGA}
+\topicindex {\ALEPH}
+\topicindex {directions}
+
+\startsubsection[title={Four directions}]
+
+The directional model in \LUATEX\ is inherited from \OMEGA|/|\ALEPH\ but we tried
+to improve it a bit. At some point we played with recovery of modes but that was
+disabled later on when we found that it interfered with nested directions. That
+itself had as side effect that the node list was no longer balanced with respect
+to directional nodes which in turn can give side effects when a series of dir
+changes happens without grouping.
+
+When extending the \PDF\ backend to support directions some inconsistencies were
+found and as a result we decided to support only the four models that make sense
+\type {TLT} (latin), \type {TRT} (arabic), \type {RTT} (cjk) and \type {LTL}
+(mongolian).
+
+\stopsubsection
+
+\startsubsection[title={How it works}]
+
+The approach is that we again make the list balanced but try to avoid some side
+effects. What happens is quite intuitive if we forget about spaces (turned into
+glue) but even there what happens makes sense if you look at it in detail.
+However that logic makes in|-|group switching kind of useless when no proper
+nested grouping is used: switching from right to left several times nested,
+results in spacing ending up after each other due to nested mirroring. Of course
+a sane macro package will manage this for the user but here we are discussing the
+low level dir injection.
+
+This is what happens:
+
+\starttyping
+\textdir TRT nur {\textdir TLT run \textdir TRT NUR} nur
+\stoptyping
+
+This becomes stepwise:
+
+\startnarrower
+\starttyping
+injected: [+TRT]nur {[+TLT]run [+TRT]NUR} nur
+balanced: [+TRT]nur {[+TLT]run [-TLT][+TRT]NUR[-TRT]} nur[-TRT]
+result : run {RUNrun } run
+\stoptyping
+\stopnarrower
+
+And this:
+
+\starttyping
+\textdir TRT nur {nur \textdir TLT run \textdir TRT NUR} nur
+\stoptyping
+
+becomes:
+
+\startnarrower
+\starttyping
+injected: [+TRT]nur {nur [+TLT]run [+TRT]NUR} nur
+balanced: [+TRT]nur {nur [+TLT]run [-TLT][+TRT]NUR[-TRT]} nur[-TRT]
+result : run {run RUNrun } run
+\stoptyping
+\stopnarrower
+
+Now, in the following examples watch where we put the braces:
+
+\startbuffer
+\textdir TRT nur {{\textdir TLT run} {\textdir TRT NUR}} nur
+\stopbuffer
+
+\typebuffer
+
+This becomes:
+
+\startnarrower
+\getbuffer
+\stopnarrower
+
+Compare this to:
+
+\startbuffer
+\textdir TRT nur {{\textdir TLT run }{\textdir TRT NUR}} nur
+\stopbuffer
+
+\typebuffer
+
+Which renders as:
+
+\startnarrower
+\getbuffer
+\stopnarrower
+
+So how do we deal with the next?
+
+\startbuffer
+\def\ltr{\textdir TLT\relax}
+\def\rtl{\textdir TRT\relax}
+
+run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur}
+run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run}
+\stopbuffer
+
+\typebuffer
+
+It gets typeset as:
+
+\startnarrower
+\startlines
+\getbuffer
+\stoplines
+\stopnarrower
+
+We could define the two helpers to look back, pick up a skip, remove it and
+inject it after the dir node. But that way we loose the subtype information that
+for some applications can be handy to be kept as|-|is. This is why we now have a
+variant of \lpr {textdir} which injects the balanced node before the skip.
+Instead of the previous definition we can use:
+
+\startbuffer[def]
+\def\ltr{\linedir TLT\relax}
+\def\rtl{\linedir TRT\relax}
+\stopbuffer
+
+\typebuffer[def]
+
+and this time:
+
+\startbuffer[txt]
+run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur}
+run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run}
+\stopbuffer
+
+\typebuffer[txt]
+
+comes out as a properly spaced:
+
+\startnarrower
+\startlines
+\getbuffer[def,txt]
+\stoplines
+\stopnarrower
+
+Anything more complex that this, like combination of skips and penalties, or
+kerns, should be handled in the input or macro package because there is no way we
+can predict the expected behaviour. In fact, the \lpr {linedir} is just a
+convenience extra which could also have been implemented using node list parsing.
+
+\stopsubsection
+
+\startsubsection[title={Controlling glue with \lpr {breakafterdirmode}}]
+
+Glue after a dir node is ignored in the linebreak decision but you can bypass that
+by setting \lpr {breakafterdirmode} to~\type {1}. The following table shows the
+difference. Watch your spaces.
+
+\def\ShowSome#1{%
+ \BC \type{#1}
+ \NC \breakafterdirmode\zerocount\hsize\zeropoint#1
+ \NC
+ \NC \breakafterdirmode\plusone\hsize\zeropoint#1
+ \NC
+ \NC \NR
+}
+
+\starttabulate[|l|Tp(1pt)|w(5em)|Tp(1pt)|w(5em)|]
+ \DB
+ \BC \type{0}
+ \NC
+ \BC \type{1}
+ \NC
+ \NC \NR
+ \TB
+ \ShowSome{pre {\textdir TLT xxx} post}
+ \ShowSome{pre {\textdir TLT xxx }post}
+ \ShowSome{pre{ \textdir TLT xxx} post}
+ \ShowSome{pre{ \textdir TLT xxx }post}
+ \ShowSome{pre { \textdir TLT xxx } post}
+ \ShowSome{pre {\textdir TLT\relax\space xxx} post}
+ \LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Controling parshapes with \lpr {shapemode}}]
+
+Another adaptation to the \ALEPH\ directional model is control over shapes driven
+by \prm {hangindent} and \prm {parshape}. This is controlled by a new parameter
+\lpr {shapemode}:
+
+\starttabulate[|c|l|l|]
+\DB value \BC \prm {hangindent} \BC \prm {parshape} \NC \NR
+\TB
+\BC \type{0} \NC normal \NC normal \NC \NR
+\BC \type{1} \NC mirrored \NC normal \NC \NR
+\BC \type{2} \NC normal \NC mirrored \NC \NR
+\BC \type{3} \NC mirrored \NC mirrored \NC \NR
+\LL
+\stoptabulate
+
+The value is reset to zero (like \prm {hangindent} and \prm {parshape})
+after the paragraph is done with. You can use negative values to prevent
+this. In \in {figure} [fig:shapemode] a few examples are given.
+
+\startplacefigure[reference=fig:shapemode,title={The effect of \type {shapemode}.}]
+ \startcombination[2*3]
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardir TLT \textdir TLT
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TLT: hangindent}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardir TLT \textdir TLT
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TLT: parshape}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardir TRT \textdir TRT
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TRT: hangindent mode 0}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \pardir TRT \textdir TRT
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TRT: parshape mode 0}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \shapemode=3
+ \pardir TRT \textdir TRT
+ \hangindent 40pt \hangafter -3
+ \leftskip10pt \input tufte \par
+ \egroup} {TRT: hangindent mode 1 & 3}
+ {\ruledvbox \bgroup \setuptolerance[verytolerant]
+ \hsize .45\textwidth \switchtobodyfont[6pt]
+ \shapemode=3
+ \pardir TRT \textdir TRT
+ \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize
+ \input tufte \par
+ \egroup} {TRT: parshape mode 2 & 3}
+ \stopcombination
+\stopplacefigure
+
+\stopsubsection
+
+\startsubsection[title={Symbols or numbers}]
+
+Internally the implementation is different from \ALEPH. First of all we use no
+whatsits but dedicated nodes, but also we have only 4 directions that are mapped
+onto 4 numbers. A text direction node can mark the start or end of a sequence of
+nodes, and therefore has two states. At the \TEX\ end we don't see these states
+because \TEX\ itself will add proper end state nodes if needed.
+
+The symbolic names \type {TLT}, \type {TRT}, etc.\ originate in \OMEGA. In
+\LUATEX\ we also have a number based model which sometimes makes more sense.
+
+\starttabulate[|c|l|l|]
+\DB value \BC equivalent \NC \NR
+\TB
+\BC \type {0} \NC TLT \NC \NR
+\BC \type {1} \NC TRT \NC \NR
+\BC \type {2} \NC LTL \NC \NR
+\BC \type {3} \NC RTT \NC \NR
+\LL
+\stoptabulate
+
+We support the \OMEGA\ primitives \orm {textdir}, \orm {pardir}, \orm {pagedir},
+\orm {pardir} and \orm {mathdir}. These accept three character keywords. The
+primitives that set the direction by number are: \lpr {textdirection}, \lpr
+{pardirection}, \lpr {pagedirection} and \lpr {bodydirection} and \lpr
+{mathdirection}. When specifying a direction for a box you can use \type {bdir}
+instead of \type {dir}.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Implementation notes]
+
+\startsubsection[title=Memory allocation]
+
+\topicindex {memory}
+
+The single internal memory heap that traditional \TEX\ used for tokens and nodes
+is split into two separate arrays. Each of these will grow dynamically when
+needed.
+
+The \type {texmf.cnf} settings related to main memory are no longer used (these
+are: \type {main_memory}, \type {mem_bot}, \type {extra_mem_top} and \type
+{extra_mem_bot}). \quote {Out of main memory} errors can still occur, but the
+limiting factor is now the amount of RAM in your system, not a predefined limit.
+
+Also, the memory (de)allocation routines for nodes are completely rewritten. The
+relevant code now lives in the C file \type {texnode.c}, and basically uses a
+dozen or so \quote {avail} lists instead of a doubly|-|linked model. An extra
+function layer is added so that the code can ask for nodes by type instead of
+directly requisitioning a certain amount of memory words.
+
+Because of the split into two arrays and the resulting differences in the data
+structures, some of the macros have been duplicated. For instance, there are now
+\type {vlink} and \type {vinfo} as well as \type {token_link} and \type
+{token_info}. All access to the variable memory array is now hidden behind a
+macro called \type {vmem}. We mention this because using the \TEX book as
+reference is still quite valid but not for memory related details. Another
+significant detail is that we have double linked node lists and that most nodes
+carry more data.
+
+The input line buffer and pool size are now also reallocated when needed, and the
+\type {texmf.cnf} settings \type {buf_size} and \type {pool_size} are silently
+ignored.
+
+\stopsubsection
+
+\startsubsection[title=Sparse arrays]
+
+The \prm {mathcode}, \prm {delcode}, \prm {catcode}, \prm {sfcode}, \prm {lccode}
+and \prm {uccode} (and the new \lpr {hjcode}) tables are now sparse arrays that
+are implemented in~\CCODE. They are no longer part of the \TEX\ \quote
+{equivalence table} and because each had 1.1 million entries with a few memory
+words each, this makes a major difference in memory usage. Performance is not
+really hurt by this.
+
+The \prm {catcode}, \prm {sfcode}, \prm {lccode}, \prm {uccode} and \lpr {hjcode}
+assignments don't show up when using the \ETEX\ tracing routines \prm
+{tracingassigns} and \prm {tracingrestores} but we don't see that as a real
+limitation.
+
+A side|-|effect of the current implementation is that \prm {global} is now more
+expensive in terms of processing than non|-|global assignments but not many users
+will notice that.
+
+The glyph ids within a font are also managed by means of a sparse array as glyph
+ids can go up to index $2^{21}-1$ but these are never accessed directly so again
+users will not notice this.
+
+\stopsubsection
+
+\startsubsection[title=Simple single|-|character csnames]
+
+\topicindex {csnames}
+
+Single|-|character commands are no longer treated specially in the internals,
+they are stored in the hash just like the multiletter csnames.
+
+The code that displays control sequences explicitly checks if the length is one
+when it has to decide whether or not to add a trailing space.
+
+Active characters are internally implemented as a special type of multi|-|letter
+control sequences that uses a prefix that is otherwise impossible to obtain.
+
+\stopsubsection
+
+\startsubsection[title=The compressed format file]
+
+\topicindex {format}
+
+The format is passed through \type {zlib}, allowing it to shrink to roughly half
+of the size it would have had in uncompressed form. This takes a bit more \CPU\
+cycles but much less disk \IO, so it should still be faster. We use a level~3
+compression which we found to be the optimal trade|-|off between filesize and
+decompression speed.
+
+\stopsubsection
+
+\startsubsection[title=Binary file reading]
+
+\topicindex {files+binary}
+
+All of the internal code is changed in such a way that if one of the \type
+{read_xxx_file} callbacks is not set, then the file is read by a \CCODE\ function
+using basically the same convention as the callback: a single read into a buffer
+big enough to hold the entire file contents. While this uses more memory than the
+previous code (that mostly used \type {getc} calls), it can be quite a bit faster
+(depending on your \IO\ subsystem).
+
+\stopsubsection
+
+\startsubsection[title=Tabs and spaces]
+
+\topicindex {space}
+\topicindex {newline}
+
+We conform to the way other \TEX\ engines handle trailing tabs and spaces. For
+decades trailing tabs and spaces (before a newline) were removed from the input
+but this behaviour was changed in September 2017 to only handle spaces. We are
+aware that this can introduce compatibility issues in existing workflows but
+because we don't want too many differences with upstream \TEXLIVE\ we just follow
+up on that patch (which is a functional one and not really a fix). It is up to
+macro packages maintainers to deal with possible compatibility issues and in
+\LUATEX\ they can do so via the callbacks that deal with reading from files.
+
+The previous behaviour was a known side effect and (as that kind of input
+normally comes from generated sources) it was normally dealt with by adding a
+comment token to the line in case the spaces and|/|or tabs were intentional and
+to be kept. We are aware of the fact that this contradicts some of our other
+choices but consistency with other engines and the fact that in \KPSE\ mode a
+common file \IO\ layer is used can have a side effect of breaking compatibility.
+We still stick to our view that at the log level we can (and might be) more
+incompatible. We already expose some more details.
+
+\stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-nodes.tex b/systems/doc/luatex/luatex-nodes.tex
new file mode 100644
index 0000000000..1b8de8d767
--- /dev/null
+++ b/systems/doc/luatex/luatex-nodes.tex
@@ -0,0 +1,2664 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-nodes
+
+\startchapter[reference=nodes,title={Nodes}]
+
+\startsection[title={\LUA\ node representation}][library=node]
+
+\topicindex {nodes}
+
+\libindex {fields}
+\libindex {subtypes}
+\libindex {values}
+
+\TEX's nodes are represented in \LUA\ as userdata objects with a variable set of
+fields. In the following syntax tables, such as the type of such a userdata object
+is represented as \syntax {<node>}.
+
+The current return value of \type {node.types()} is:
+\startluacode
+ for id, name in table.sortedhash(node.types()) do
+ context.type(name)
+ context(" (%s), ",id)
+ end
+ context.removeunwantedspaces()
+ context.removepunctuation()
+\stopluacode
+. % period
+
+The \prm {lastnodetype} primitive is \ETEX\ compliant. The valid range is still
+$[-1,15]$ and glyph nodes (formerly known as char nodes) have number~0 while
+ligature nodes are mapped to~7. That way macro packages can use the same symbolic
+names as in traditional \ETEX. Keep in mind that these \ETEX\ node numbers are
+different from the real internal ones and that there are more \ETEX\ node types
+than~15.
+
+You can ask for a list of fields with \type {node.fields} and for valid subtypes
+with \type {node.subtypes}. The \type {node.values} function reports some used
+values. Valid arguments are \nod {dir}, \type {direction}, \nod {glue}, \whs
+{pdf_literal}, \whs {pdf_action}, \whs {pdf_window} and \whs {color_stack}. Keep
+in mind that the setters normally expect a number, but this helper gives you a
+list of what numbers matter. For practical reason the \type {pagestate} values
+are also reported with this helper.
+
+\stopsection
+
+\startsection[title={Main text nodes}]
+
+\topicindex {nodes+text}
+
+These are the nodes that comprise actual typesetting commands. A few fields are
+present in all nodes regardless of their type, these are:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC the next node in a list, or nil \NC \NR
+\NC \type{id} \NC number \NC the node's type (\type {id}) number \NC \NR
+\NC \type{subtype} \NC number \NC the node \type {subtype} identifier \NC \NR
+\LL
+\stoptabulate
+
+The \type {subtype} is sometimes just a dummy entry because not all nodes
+actually use the \type {subtype}, but this way you can be sure that all nodes
+accept it as a valid field name, and that is often handy in node list traversal.
+In the following tables \type {next} and \type {id} are not explicitly mentioned.
+
+Besides these three fields, almost all nodes also have an \type {attr} field, and
+there is a also a field called \type {prev}. That last field is always present,
+but only initialized on explicit request: when the function \type {node.slide()}
+is called, it will set up the \type {prev} fields to be a backwards pointer in
+the argument node list. By now most of \TEX's node processing makes sure that the
+\type {prev} nodes are valid but there can be exceptions, especially when the
+internal magic uses a leading \nod {temp} nodes to temporarily store a state.
+
+\subsection{\nod {hlist} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{list} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width of the box \NC \NR
+\NC \type{height} \NC number \NC the height of the box \NC \NR
+\NC \type{depth} \NC number \NC the depth of the box \NC \NR
+\NC \type{shift} \NC number \NC a displacement perpendicular to the character
+ progression direction \NC \NR
+\NC \type{glue_order} \NC number \NC a number in the range $[0,4]$, indicating the
+ glue order \NC \NR
+\NC \type{glue_set} \NC number \NC the calculated glue ratio \NC \NR
+\NC \type{glue_sign} \NC number \NC 0 = \type {normal}, 1 = \type {stretching}, 2 =
+ \type {shrinking} \NC \NR
+\NC \type{head/list} \NC node \NC the first node of the body of this list \NC \NR
+\NC \type{dir} \NC string \NC the direction of this box, see~\in [dirnodes] \NC \NR
+\LL
+\stoptabulate
+
+\topicindex {nodes+lists}
+\topicindex {lists}
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error may result.
+
+Note: the field name \type {head} and \type {list} are both valid. Sometimes it
+makes more sense to refer to a list by \type {head}, sometimes \type {list} makes
+more sense.
+
+\subsection{\nod {vlist} nodes}
+
+\topicindex {nodes+lists}
+\topicindex {lists}
+
+This node is similar to \nod {hlist}, except that \quote {shift} is a displacement
+perpendicular to the line progression direction, and \quote {subtype} only has
+the values 0, 4, and~5.
+
+\subsection{\nod {rule} nodes}
+
+\topicindex {nodes+rules}
+\topicindex {rules}
+
+Contrary to traditional \TEX, \LUATEX\ has more \prm {rule} subtypes because we
+also use rules to store reuseable objects and images. User nodes are invisible
+and can be intercepted by a callback.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes {rule} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width of the rule where the special value
+ $-1073741824$ is used for \quote {running} glue dimensions \NC \NR
+\NC \type{height} \NC number \NC the height of the rule (can be negative) \NC \NR
+\NC \type{depth} \NC number \NC the depth of the rule (can be negative) \NC \NR
+\NC \type{left} \NC number \NC shift at the left end (also subtracted from width) \NC \NR
+\NC \type{right} \NC number \NC (subtracted from width) \NC \NR
+\NC \type{dir} \NC string \NC the direction of this rule, see~\in[dirnodes] \NC \NR
+\NC \type{index} \NC number \NC an optional index that can be referred to \NC \NR
+\NC \type{transform} \NC number \NC an private variable (also used to specify outline width) \NC \NR
+\LL
+\stoptabulate
+
+The \type {left} and type {right} keys are somewhat special (and experimental).
+When rules are auto adapting to the surrounding box width you can enforce a shift
+to the right by setting \type {left}. The value is also subtracted from the width
+which can be a value set by the engine itself and is not entirely under user
+control. The \type {right} is also subtracted from the width. It all happens in
+the backend so these are not affecting the calculations in the frontend (actually
+the auto settings also happen in the backend). For a vertical rule \type {left}
+affects the height and \type {right} affects the depth. There is no matching
+interface at the \TEX\ end (although we can have more keywords for rules it would
+complicate matters and introduce a speed penalty.) However, you can just
+construct a rule node with \LUA\ and write it to the \TEX\ input. The \type
+{outline} subtype is just a convenient variant and the \type {transform} field
+specifies the width of the outline.
+
+\subsection{\nod {ins} nodes}
+
+\topicindex {nodes+insertions}
+\topicindex {insertions}
+
+This node relates to the \prm {insert} primitive.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC the insertion class \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{cost} \NC number \NC the penalty associated with this insert \NC \NR
+\NC \type{height} \NC number \NC height of the insert \NC \NR
+\NC \type{depth} \NC number \NC depth of the insert \NC \NR
+\NC \type{head/list} \NC node \NC the first node of the body of this insert \NC \NR
+\LL
+\stoptabulate
+
+There is a set of extra fields that concern the associated glue: \type {width},
+\type {stretch}, \type {stretch_order}, \type {shrink} and \type {shrink_order}.
+These are all numbers.
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error may result. You can use
+\type {list} instead (often in functions you want to use local variable with similar
+names and both names are equally sensible).
+
+\subsection{\nod {mark} nodes}
+
+\topicindex {nodes+marks}
+\topicindex {marks}
+
+This one relates to the \prm {mark} primitive.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC unused \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{class} \NC number \NC the mark class \NC \NR
+\NC \type{mark} \NC table \NC a table representing a token list \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {adjust} nodes}
+
+\topicindex {nodes+adjust}
+\topicindex {adjust}
+
+This node comes from \prm {vadjust} primitive.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{adjust} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{head/list} \NC node \NC adjusted material \NC \NR
+\LL
+\stoptabulate
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error may be the result.
+
+\subsection{\nod {disc} nodes}
+
+\topicindex {nodes+discretionaries}
+\topicindex {discretionaries}
+
+The \prm {discretionary} and \prm {-}, the \type {-} character but also the
+hyphenation mechanism produces these nodes.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{disc} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{pre} \NC node \NC pointer to the pre|-|break text \NC \NR
+\NC \type{post} \NC node \NC pointer to the post|-|break text \NC \NR
+\NC \type{replace} \NC node \NC pointer to the no|-|break text \NC \NR
+\NC \type{penalty} \NC number \NC the penalty associated with the break, normally
+ \prm {hyphenpenalty} or \prm {exhyphenpenalty} \NC \NR
+\LL
+\stoptabulate
+
+The subtype numbers~4 and~5 belong to the \quote {of-f-ice} explanation given
+elsewhere. These disc nodes are kind of special as at some point they also keep
+information about breakpoints and nested ligatures.
+
+The \type {pre}, \type {post} and \type {replace} fields at the \LUA\ end are in
+fact indirectly accessed and have a \type {prev} pointer that is not \type {nil}.
+This means that when you mess around with the head of these (three) lists, you
+also need to reassign them because that will restore the proper \type {prev}
+pointer, so:
+
+\starttyping
+pre = d.pre
+-- change the list starting with pre
+d.pre = pre
+\stoptyping
+
+Otherwise you can end up with an invalid internal perception of reality and
+\LUATEX\ might even decide to crash on you. It also means that running forward
+over for instance \type {pre} is ok but backward you need to stop at \type {pre}.
+And you definitely must not mess with the node that \type {prev} points to, if
+only because it is not really a node but part of the disc data structure (so
+freeing it again might crash \LUATEX).
+
+\subsection{\nod {math} nodes}
+
+\topicindex {nodes+math}
+\topicindex {math+nodes}
+
+Math nodes represent the boundaries of a math formula, normally wrapped into
+\type {$} signs.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{math} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{surround} \NC number \NC width of the \prm {mathsurround} kern \NC \NR
+\LL
+\stoptabulate
+
+There is a set of extra fields that concern the associated glue: \type {width},
+\type {stretch}, \type {stretch_order}, \type {shrink} and \type {shrink_order}.
+These are all numbers.
+
+\subsection{\nod {glue} nodes}
+
+\topicindex {nodes+glue}
+\topicindex {glue}
+
+Skips are about the only type of data objects in traditional \TEX\ that are not a
+simple value. They are inserted when \TEX\ sees a space in the text flow but also
+by \prm {hskip} and \prm {vskip}. The structure that represents the glue
+components of a skip is called a \nod {glue_spec}, and it has the following
+accessible fields:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{width} \NC number \NC the horizontal or vertical displacement \NC \NR
+\NC \type{stretch} \NC number \NC extra (positive) displacement or stretch amount \NC \NR
+\NC \type{stretch_order} \NC number \NC factor applied to stretch amount \NC \NR
+\NC \type{shrink} \NC number \NC extra (negative) displacement or shrink amount\NC \NR
+\NC \type{shrink_order} \NC number \NC factor applied to shrink amount \NC \NR
+\LL
+\stoptabulate
+
+The effective width of some glue subtypes depends on the stretch or shrink needed
+to make the encapsulating box fit its dimensions. For instance, in a paragraph
+lines normally have glue representing spaces and these stretch or shrink to make
+the content fit in the available space. The \type {effective_glue} function that
+takes a glue node and a parent (hlist or vlist) returns the effective width of
+that glue item. When you pass \type {true} as third argument the value will be
+rounded.
+
+A \nod {glue_spec} node is a special kind of node that is used for storing a set
+of glue values in registers. Originally they were also used to store properties
+of glue nodes (using a system of reference counts) but we now keep these
+properties in the glue nodes themselves, which gives a cleaner interface to \LUA.
+
+The indirect spec approach was in fact an optimization in the original \TEX\
+code. First of all it can save quite some memory because all these spaces that
+become glue now share the same specification (only the reference count is
+incremented), and zero testing is also a bit faster because only the pointer has
+to be checked (this is no longer true for engines that implement for instance
+protrusion where we really need to ensure that zero is zero when we test for
+bounds). Another side effect is that glue specifications are read|-|only, so in
+the end copies need to be made when they are used from \LUA\ (each assignment to
+a field can result in a new copy). So in the end the advantages of sharing are
+not that high (and nowadays memory is less an issue, also given that a glue node
+is only a few memory words larger than a spec).
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{glue} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{leader} \NC node \NC pointer to a box or rule for leaders \NC \NR
+\LL
+\stoptabulate
+
+In addition there are the \type {width}, \type {stretch} \type {stretch_order},
+\type {shrink}, and \type {shrink_order} fields. Note that we use the key \type
+{width} in both horizontal and vertical glue. This suits the \TEX\ internals well
+so we decided to stick to that naming.
+
+A regular word space also results in a \type {spaceskip} subtype (this used to be
+a \type {userskip} with subtype zero).
+
+\subsection{\nod {kern} nodes}
+
+\topicindex {nodes+kerns}
+\topicindex {kerns}
+
+The \prm {kern} command creates such nodes but for instance the font and math
+machinery can also add them.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{kern} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{kern} \NC number \NC fixed horizontal or vertical advance \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {penalty} nodes}
+
+\topicindex {nodes+penalty}
+\topicindex {penalty}
+
+The \prm {penalty} command is one that generates these nodes.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{penalty} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{penalty} \NC number \NC the penalty value \NC \NR
+\LL
+\stoptabulate
+
+The subtypes are just informative and \TEX\ itself doesn't use them. When you
+run into an \type {linebreakpenalty} you need to keep in mind that it's a
+accumulation of \type {club}, \type{widow} and other relevant penalties.
+
+\subsection[glyphnodes]{\nod {glyph} nodes}
+
+\topicindex {nodes+glyph}
+\topicindex {glyphs}
+
+These are probably the mostly used nodes and although you can push them in the
+current list with for instance \prm {char} \TEX\ will normally do it for you when
+it considers some input to be text.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC bit field \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{char} \NC number \NC the character index in the font \NC \NR
+\NC \type{font} \NC number \NC the font identifier \NC \NR
+\NC \type{lang} \NC number \NC the language identifier \NC \NR
+\NC \type{left} \NC number \NC the frozen \type {\lefthyphenmnin} value \NC \NR
+\NC \type{right} \NC number \NC the frozen \type {\righthyphenmnin} value \NC \NR
+\NC \type{uchyph} \NC boolean \NC the frozen \prm {uchyph} value \NC \NR
+\NC \type{components} \NC node \NC pointer to ligature components \NC \NR
+\NC \type{xoffset} \NC number \NC a virtual displacement in horizontal direction \NC \NR
+\NC \type{yoffset} \NC number \NC a virtual displacement in vertical direction \NC \NR
+\NC \type{width} \NC number \NC the (original) width of the character \NC \NR
+\NC \type{height} \NC number \NC the (original) height of the character\NC \NR
+\NC \type{depth} \NC number \NC the (original) depth of the character\NC \NR
+\NC \type{expansion_factor} \NC number \NC the to be applied expansion_factor \NC \NR
+\NC \type{data} \NC number \NC a general purpose field for users (we had room for it) \NC \NR
+\LL
+\stoptabulate
+
+The \type {width}, \type {height} and \type {depth} values are read|-|only. The
+\type {expansion_factor} is assigned in the par builder and used in the backend.
+
+A warning: never assign a node list to the components field unless you are sure
+its internal link structure is correct, otherwise an error may be result. Valid
+bits for the \type {subtype} field are:
+
+\starttabulate[|c|l|]
+\DB bit \BC meaning \NC \NR
+\TB
+\NC 0 \NC character \NC \NR
+\NC 1 \NC ligature \NC \NR
+\NC 2 \NC ghost \NC \NR
+\NC 3 \NC left \NC \NR
+\NC 4 \NC right \NC \NR
+\LL
+\stoptabulate
+
+See \in {section} [charsandglyphs] for a detailed description of the \type
+{subtype} field.
+
+The \type {expansion_factor} has been introduced as part of the separation
+between font- and backend. It is the result of extensive experiments with a more
+efficient implementation of expansion. Early versions of \LUATEX\ already
+replaced multiple instances of fonts in the backend by scaling but contrary to
+\PDFTEX\ in \LUATEX\ we now also got rid of font copies in the frontend and
+replaced them by expansion factors that travel with glyph nodes. Apart from a
+cleaner approach this is also a step towards a better separation between front-
+and backend.
+
+The \type {is_char} function checks if a node is a glyph node with a subtype still
+less than 256. This function can be used to determine if applying font logic to a
+glyph node makes sense. The value \type {nil} gets returned when the node is not
+a glyph, a character number is returned if the node is still tagged as character
+and \type {false} gets returned otherwise. When nil is returned, the id is also
+returned. The \type {is_glyph} variant doesn't check for a subtype being less
+than 256, so it returns either the character value or nil plus the id. These
+helpers are not always faster than separate calls but they sometimes permit
+making more readable tests. The \type {uses_font} helpers takes a node
+and font id and returns true when a glyph or disc node references that font.
+
+\subsection{\nod {boundary} nodes}
+
+\topicindex {nodes+boundary}
+\topicindex {boundary}
+
+This node relates to the \prm {noboundary}, \prm {boundary}, \prm
+{protrusionboundary} and \prm {wordboundary} primitives.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{boundary} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{value} \NC number \NC values 0--255 are reserved \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {local_par} nodes}
+
+\topicindex {nodes+paragraphs}
+\topicindex {paragraphs}
+
+This node is inserted at the start of a paragraph. You should not mess
+too much with this one.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{pen_inter} \NC number \NC local interline penalty (from \lpr {localinterlinepenalty}) \NC \NR
+\NC \type{pen_broken} \NC number \NC local broken penalty (from \lpr {localbrokenpenalty}) \NC \NR
+\NC \type{dir} \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR
+\NC \type{box_left} \NC node \NC the \lpr {localleftbox} \NC \NR
+\NC \type{box_left_width} \NC number \NC width of the \lpr {localleftbox} \NC \NR
+\NC \type{box_right} \NC node \NC the \lpr {localrightbox} \NC \NR
+\NC \type{box_right_width} \NC number \NC width of the \lpr {localrightbox} \NC \NR
+\LL
+\stoptabulate
+
+A warning: never assign a node list to the \type {box_left} or \type {box_right}
+field unless you are sure its internal link structure is correct, otherwise an
+error may result.
+
+\subsection[dirnodes]{\nod {dir} nodes}
+
+\topicindex {nodes+direction}
+\topicindex {directions}
+
+Direction nodes mark parts of the running text that need a change of direction and \
+the \prm {textdir} command generates them.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{dir} \NC string \NC the direction (but see below) \NC \NR
+\NC \type{level} \NC number \NC nesting level of this direction whatsit \NC \NR
+\LL
+\stoptabulate
+
+Direction specifiers are three|-|letter combinations of \type {T}, \type {B},
+\type {R}, and \type {L}. These are built up out of three separate items:
+
+\startitemize[packed]
+\startitem
+ the first is the direction of the \quote{top} of paragraphs
+\stopitem
+\startitem
+ the second is the direction of the \quote{start} of lines
+\stopitem
+\startitem
+ the third is the direction of the \quote{top} of glyphs
+\stopitem
+\stopitemize
+
+However, only four combinations are accepted: \type {TLT}, \type {TRT}, \type
+{RTT}, and \type {LTL}. Inside actual \nod {dir} nodes, the representation of
+\nod {dir} is not a three|-|letter but a combination of numbers. When printed the
+direction is indicated by a \type {+} or \type {-}, indicating whether the value
+is pushed or popped from the direction stack.
+
+\subsection{\nod {marginkern} nodes}
+
+\topicindex {nodes+paragraphs}
+\topicindex {paragraphs}
+\topicindex {protrusion}
+
+Margin kerns result from protrusion.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{marginkern} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the advance of the kern \NC \NR
+\NC \type{glyph} \NC node \NC the glyph to be used \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Math noads}]
+
+\topicindex {nodes+math}
+\topicindex {math+nodes}
+
+These are the so||called \quote {noad}s and the nodes that are specifically
+associated with math processing. Most of these nodes contain subnodes so that the
+list of possible fields is actually quite small. First, the subnodes:
+
+\subsection{Math kernel subnodes}
+
+Many object fields in math mode are either simple characters in a specific family
+or math lists or node lists. There are four associated subnodes that represent
+these cases (in the following node descriptions these are indicated by the word
+\type {<kernel>}).
+
+The \type {next} and \type {prev} fields for these subnodes are unused.
+
+\subsection{\nod {math_char} and \nod {math_text_char} subnodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{char} \NC number \NC the character index \NC \NR
+\NC \type{fam} \NC number \NC the family number \NC \NR
+\LL
+\stoptabulate
+
+The \nod {math_char} is the simplest subnode field, it contains the character
+and family for a single glyph object. The \nod {math_text_char} is a special
+case that you will not normally encounter, it arises temporarily during math list
+conversion (its sole function is to suppress a following italic correction).
+
+\subsection{\nod {sub_box} and \nod {sub_mlist} subnodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{head/list} \NC node \NC list of nodes \NC \NR
+\LL
+\stoptabulate
+
+These two subnode types are used for subsidiary list items. For \nod {sub_box},
+the \type {head} points to a \quote {normal} vbox or hbox. For \nod {sub_mlist},
+the \type {head} points to a math list that is yet to be converted.
+
+A warning: never assign a node list to the \type {head} field unless you are sure
+its internal link structure is correct, otherwise an error is triggered.
+
+\subsection{\nod {delim} subnodes}
+
+There is a fifth subnode type that is used exclusively for delimiter fields. As
+before, the \type {next} and \type {prev} fields are unused.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{small_char} \NC number \NC character index of base character \NC \NR
+\NC \type{small_fam} \NC number \NC family number of base character \NC \NR
+\NC \type{large_char} \NC number \NC character index of next larger character \NC \NR
+\NC \type{large_fam} \NC number \NC family number of next larger character \NC \NR
+\LL
+\stoptabulate
+
+The fields \type {large_char} and \type {large_fam} can be zero, in that case the
+font that is set for the \type {small_fam} is expected to provide the large
+version as an extension to the \type {small_char}.
+
+\subsection{Math core nodes}
+
+First, there are the objects (the \TEX book calls them \quote {atoms}) that are
+associated with the simple math objects: ord, op, bin, rel, open, close, punct,
+inner, over, under, vcent. These all have the same fields, and they are combined
+into a single node type with separate subtypes for differentiation.
+
+Some noads have an option field. The values in this bitset are common:
+
+\starttabulate[|l|r|]
+\DB meaning \BC bits \NC \NR
+\TB
+\NC set \NC \type{0x08} \NC \NR
+\NC internal \NC \type{0x00} + \type{0x08} \NC \NR
+\NC internal \NC \type{0x01} + \type{0x08} \NC \NR
+\NC axis \NC \type{0x02} + \type{0x08} \NC \NR
+\NC no axis \NC \type{0x04} + \type{0x08} \NC \NR
+\NC exact \NC \type{0x10} + \type{0x08} \NC \NR
+\NC left \NC \type{0x11} + \type{0x08} \NC \NR
+\NC middle \NC \type{0x12} + \type{0x08} \NC \NR
+\NC right \NC \type{0x14} + \type{0x08} \NC \NR
+\NC no sub script \NC \type{0x21} + \type{0x08} \NC \NR
+\NC no super script \NC \type{0x22} + \type{0x08} \NC \NR
+\NC no script \NC \type{0x23} + \type{0x08} \NC \NR
+\LL
+\stoptabulate
+
+\subsection{simple \nod {noad} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{noad} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {accent} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{accent} \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{accent} \NC kernel node \NC top accent \NC \NR
+\NC \type{bot_accent} \NC kernel node \NC bottom accent \NC \NR
+\NC \type{fraction} \NC number \NC larger step criterium (divided by 1000) \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {style} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{style} \NC string \NC contains the style \NC \NR
+\LL
+\stoptabulate
+
+There are eight possibilities for the string value: one of \type {display},
+\type {text}, \type {script}, or \type {scriptscript}. Each of these can have
+be prefixed by \type {cramped}.
+
+\subsection{\nod {choice} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{display} \NC node \NC list of display size alternatives \NC \NR
+\NC \type{text} \NC node \NC list of text size alternatives \NC \NR
+\NC \type{script} \NC node \NC list of scriptsize alternatives \NC \NR
+\NC \type{scriptscript} \NC node \NC list of scriptscriptsize alternatives \NC \NR
+\LL
+\stoptabulate
+
+Warning: never assign a node list to the \type {display}, \type {text}, \type
+{script}, or \type {scriptscript} field unless you are sure its internal link
+structure is correct, otherwise an error can occur.
+
+\subsection{\nod {radical} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{radical} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{nucleus} \NC kernel node \NC base \NC \NR
+\NC \type{sub} \NC kernel node \NC subscript \NC \NR
+\NC \type{sup} \NC kernel node \NC superscript \NC \NR
+\NC \type{left} \NC delimiter node \NC \NC \NR
+\NC \type{degree} \NC kernel node \NC only set by \lpr {Uroot} \NC \NR
+\NC \type{width} \NC number \NC required width \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+Warning: never assign a node list to the \type {nucleus}, \type {sub}, \type
+{sup}, \type {left}, or \type {degree} field unless you are sure its internal
+link structure is correct, otherwise an error can be triggered.
+
+\subsection{\nod {fraction} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC (optional) width of the fraction \NC \NR
+\NC \type{num} \NC kernel node \NC numerator \NC \NR
+\NC \type{denom} \NC kernel node \NC denominator \NC \NR
+\NC \type{left} \NC delimiter node \NC left side symbol \NC \NR
+\NC \type{right} \NC delimiter node \NC right side symbol \NC \NR
+\NC \type{middle} \NC delimiter node \NC middle symbol \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\LL
+\stoptabulate
+
+Warning: never assign a node list to the \type {num}, or \type {denom} field
+unless you are sure its internal link structure is correct, otherwise an error
+can result.
+
+\subsection{\nod {fence} nodes}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{subtype} \NC number \NC \showsubtypes{fence} \NC \NR
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{delim} \NC delimiter node \NC delimiter specification \NC \NR
+\NC \type{italic} \NC number \NC italic correction \NC \NR
+\NC \type{height} \NC number \NC required height \NC \NR
+\NC \type{depth} \NC number \NC required depth \NC \NR
+\NC \type{options} \NC number \NC bitset of rendering options \NC \NR
+\NC \type{class} \NC number \NC spacing related class \NC \NR
+\LL
+\stoptabulate
+
+Warning: some of these fields are used by the renderer and might get adapted in
+the process.
+
+\stopsection
+
+\startsection[title={Front|-|end whatsits}]
+
+Whatsit nodes come in many subtypes that you can ask for them by running
+\type {node.whatsits}:
+\startluacode
+ for id, name in table.sortedpairs(node.whatsits()) do
+ context.type(name)
+ context(" (%s), ",id)
+ end
+ context.removeunwantedspaces()
+ context.removepunctuation()
+\stopluacode
+. % period
+
+Some of them are generic and independent of the output mode and others are
+specific to the chosen backend: \DVI\ or \PDF. Here we discuss the generic
+font|-|end nodes nodes.
+
+\subsection{\whs {open}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR
+\NC \type{name} \NC string \NC file name \NC \NR
+\NC \type{ext} \NC string \NC file extension \NC \NR
+\NC \type{area} \NC string \NC file area (this may become obsolete) \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {write}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR
+\NC \type{data} \NC table \NC a table representing the token list to be written \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {close}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{stream} \NC number \NC \TEX's stream id number \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {user_defined}}
+
+User|-|defined whatsit nodes can only be created and handled from \LUA\ code. In
+effect, they are an extension to the extension mechanism. The \LUATEX\ engine
+will simply step over such whatsits without ever looking at the contents.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{user_id} \NC number \NC id number \NC \NR
+\NC \type{type} \NC number \NC type of the value \NC \NR
+\NC \type{value} \NC number \NC a \LUA\ number \NC \NR
+\NC \NC node \NC a node list \NC \NR
+\NC \NC string \NC a \LUA\ string \NC \NR
+\NC \NC table \NC a \LUA\ table \NC \NR
+\LL
+\stoptabulate
+
+The \type {type} can have one of six distinct values. The number is the \ASCII\
+value if the first character of the type name (so you can use string.byte("l")
+instead of \type {108}).
+
+\starttabulate[|r|c|p|]
+\DB value \BC meaning \BC explanation \NC \NR
+\TB
+\NC 97 \NC a \NC list of attributes (a node list) \NC \NR
+\NC 100 \NC d \NC a \LUA\ number \NC \NR
+\NC 108 \NC l \NC a \LUA\ value (table, number, boolean, etc) \NC \NR
+\NC 110 \NC n \NC a node list \NC \NR
+\NC 115 \NC s \NC a \LUA\ string \NC \NR
+\NC 116 \NC t \NC a \LUA\ token list in \LUA\ table form (a list of triplets) \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {save_pos}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {late_lua}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{data} \NC string or function \NC the to be written information stored as \LUA\ value \NC \NR
+\NC \type{token} \NC string \NC the to be written information stored as token list \NC \NR
+\NC \type{name} \NC string \NC the name to use for \LUA\ error reporting \NC \NR
+\LL
+\stoptabulate
+
+The difference between \type {data} and \type {string} is that on assignment, the
+\type {data} field is converted to a token list, cf.\ use as \lpr {latelua}. The
+\type {string} version is treated as a literal string.
+
+\stopsection
+
+\startsection[title={\DVI\ backend whatsits}]
+
+\subsection{\whs {special}}
+
+There is only one \DVI\ backend whatsit, and it just flushes its content to the
+output file.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{data} \NC string \NC the \prm {special} information \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={\PDF\ backend whatsits}]
+
+\subsection{\whs {pdf_literal}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{mode} \NC number \NC the \quote {mode} setting of this literal \NC \NR
+\NC \type{data} \NC string \NC the to be written information stored as \LUA\ string \NC \NR
+\NC \type{token} \NC string \NC the to be written information stored as token list \NC \NR
+\LL
+\stoptabulate
+
+Possible mode values are:
+
+\starttabulate[|c|p|]
+\DB value \BC keyword \NC \NR
+\TB
+\NC 0 \NC \type{origin} \NC \NR
+\NC 1 \NC \type{page} \NC \NR
+\NC 2 \NC \type{direct} \NC \NR
+\NC 3 \NC \type{raw} \NC \NR
+\NC 4 \NC \type{text} \NC \NR
+\LL
+\stoptabulate
+
+The higher the number, the less checking and the more you can run into trouble.
+Especially the \type {raw} variant can produce bad \PDF\ so you can best check
+what you generate.
+
+\subsection{\whs {pdf_refobj}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_annot}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
+\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
+\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
+\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR
+\NC \type{data} \NC string \NC the annotation data \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_start_link}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
+\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
+\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
+\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR
+\NC \type{link_attr} \NC table \NC the link attribute token list \NC \NR
+\NC \type{action} \NC node \NC the action to perform \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_end_link}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_dest}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
+\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
+\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
+\NC \type{named_id} \NC number \NC is the \type {dest_id} a string value? \NC \NR
+\NC \type{dest_id} \NC number \NC the destination id \NC \NR
+\NC \NC string \NC the destination name \NC \NR
+\NC \type{dest_type} \NC number \NC type of destination \NC \NR
+\NC \type{xyz_zoom} \NC number \NC the zoom factor (times 1000) \NC \NR
+\NC \type{objnum} \NC number \NC the \PDF\ object number \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_action}}
+
+These are a special kind of items that only appear inside \PDF\ start link
+objects.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{action_type} \NC number \NC the kind of action involved \NC \NR
+\NC \type{action_id} \NC number or string \NC token list reference or string \NC \NR
+\NC \type{named_id} \NC number \NC the index of the destination \NC \NR
+\NC \type{file} \NC string \NC the target filename \NC \NR
+\NC \type{new_window} \NC number \NC the window state of the target \NC \NR
+\NC \type{data} \NC string \NC the name of the destination \NC \NR
+\LL
+\stoptabulate
+
+Valid action types are:
+
+\starttabulate[|l|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0 \NC \type{page} \NC \NR
+\NC 1 \NC \type{goto} \NC \NR
+\NC 2 \NC \type{thread} \NC \NR
+\NC 3 \NC \type{user} \NC \NR
+\LL
+\stoptabulate
+
+Valid window types are:
+
+\starttabulate[|l|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0 \NC \type{notset} \NC \NR
+\NC 1 \NC \type{new} \NC \NR
+\NC 2 \NC \type{nonew} \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_thread}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
+\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
+\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
+\NC \type{named_id} \NC number \NC is \type {tread_id} a string value? \NC \NR
+\NC \type{tread_id} \NC number \NC the thread id \NC \NR
+\NC \NC string \NC the thread name \NC \NR
+\NC \type{thread_attr} \NC number \NC extra thread information \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_start_thread}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
+\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
+\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
+\NC \type{named_id} \NC number \NC is \type {tread_id} a string value? \NC \NR
+\NC \type{tread_id} \NC number \NC the thread id \NC \NR
+\NC \NC string \NC the thread name \NC \NR
+\NC \type{thread_attr} \NC number \NC extra thread information \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_end_thread}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_colorstack}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{stack} \NC number \NC colorstack id number \NC \NR
+\NC \type{command} \NC number \NC command to execute \NC \NR
+\NC \type{data} \NC string \NC data \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_setmatrix}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{data} \NC string \NC data \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_save}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\whs {pdf_restore}}
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\LL
+\stoptabulate
+
+\stopsection
+
+\startsection[title={The \type {node} library}][library=node]
+
+\subsection {Introduction}
+
+The \type {node} library contains functions that facilitate dealing with (lists
+of) nodes and their values. They allow you to create, alter, copy, delete, and
+insert \LUATEX\ node objects, the core objects within the typesetter.
+
+\LUATEX\ nodes are represented in \LUA\ as userdata with the metadata type
+\type {luatex.node}. The various parts within a node can be accessed using
+named fields.
+
+Each node has at least the three fields \type {next}, \type {id}, and \type {subtype}:
+
+\startitemize[intro]
+
+\startitem
+ The \type {next} field returns the userdata object for the next node in a
+ linked list of nodes, or \type {nil}, if there is no next node.
+\stopitem
+
+\startitem
+ The \type {id} indicates \TEX's \quote{node type}. The field \type {id} has a
+ numeric value for efficiency reasons, but some of the library functions also
+ accept a string value instead of \type {id}.
+\stopitem
+
+\startitem
+ The \type {subtype} is another number. It often gives further information
+ about a node of a particular \type {id}, but it is most important when
+ dealing with \quote {whatsits}, because they are differentiated solely based
+ on their \type {subtype}.
+\stopitem
+
+\stopitemize
+
+The other available fields depend on the \type {id} (and for \quote {whatsits},
+the \type {subtype}) of the node.
+
+Support for \nod {unset} (alignment) nodes is partial: they can be queried and
+modified from \LUA\ code, but not created.
+
+Nodes can be compared to each other, but: you are actually comparing indices into
+the node memory. This means that equality tests can only be trusted under very
+limited conditions. It will not work correctly in any situation where one of the
+two nodes has been freed and|/|or reallocated: in that case, there will be false
+positives.
+
+At the moment, memory management of nodes should still be done explicitly by the
+user. Nodes are not \quote {seen} by the \LUA\ garbage collector, so you have to
+call the node freeing functions yourself when you are no longer in need of a node
+(list). Nodes form linked lists without reference counting, so you have to be
+careful that when control returns back to \LUATEX\ itself, you have not deleted
+nodes that are still referenced from a \type {next} pointer elsewhere, and that
+you did not create nodes that are referenced more than once. Normally the setters
+and getters handle this for you.
+
+There are statistics available with regards to the allocated node memory, which
+can be handy for tracing.
+
+\subsection{\type {is_node}}
+
+\topicindex {nodes+functions}
+
+\libindex {is_node}
+
+\startfunctioncall
+<boolean|integer> t =
+ node.is_node(<any> item)
+\stopfunctioncall
+
+This function returns a number (the internal index of the node) if the argument
+is a userdata object of type \type {<node>} and false when no node is passed.
+
+\subsection{\type {types} and \type {whatsits}}
+
+\libindex {types}
+\libindex {whatsits}
+
+This function returns an array that maps node id numbers to node type strings,
+providing an overview of the possible top|-|level \type {id} types.
+
+\startfunctioncall
+<table> t =
+ node.types()
+\stopfunctioncall
+
+\TEX's \quote {whatsits} all have the same \type {id}. The various subtypes are
+defined by their \type {subtype} fields. The function is much like \type {types},
+except that it provides an array of \type {subtype} mappings.
+
+\startfunctioncall
+<table> t =
+ node.whatsits()
+\stopfunctioncall
+
+\subsection{\type {id}}
+
+\libindex{id}
+
+This converts a single type name to its internal numeric representation.
+
+\startfunctioncall
+<number> id =
+ node.id(<string> type)
+\stopfunctioncall
+
+\subsection{\type {type} and \type {subtype}}
+
+\libindex {type}
+\libindex {subtype}
+
+In the argument is a number, then the next function converts an internal numeric
+representation to an external string representation. Otherwise, it will return
+the string \type {node} if the object represents a node, and \type {nil}
+otherwise.
+
+\startfunctioncall
+<string> type =
+ node.type(<any> n)
+\stopfunctioncall
+
+This next one converts a single whatsit name to its internal numeric
+representation (\type {subtype}).
+
+\startfunctioncall
+<number> subtype =
+ node.subtype(<string> type)
+\stopfunctioncall
+
+\subsection{\type {fields}}
+
+\libindex {fields}
+
+This function returns an array of valid field names for a particular type of
+node. If you want to get the valid fields for a \quote {whatsit}, you have to
+supply the second argument also. In other cases, any given second argument will
+be silently ignored.
+
+\startfunctioncall
+<table> t =
+ node.fields(<number> id)
+<table> t =
+ node.fields(<number> id, <number> subtype)
+\stopfunctioncall
+
+The function accepts string \type {id} and \type {subtype} values as well.
+
+\subsection{\type {has_field}}
+
+\libindex {has_field}
+
+This function returns a boolean that is only true if \type {n} is
+actually a node, and it has the field.
+
+\startfunctioncall
+<boolean> t =
+ node.has_field(<node> n, <string> field)
+\stopfunctioncall
+
+\subsection{\type {new}}
+
+\libindex{new}
+
+The \type {new} function creates a new node. All its fields are initialized to
+either zero or \type {nil} except for \type {id} and \type {subtype}. Instead of
+numbers you can also use strings (names). If you create a new \nod {whatsit} node
+the second argument is required. As with all node functions, this function
+creates a node at the \TEX\ level.
+
+\startfunctioncall
+<node> n =
+ node.new(<number> id)
+<node> n =
+ node.new(<number> id, <number> subtype)
+\stopfunctioncall
+
+\subsection{\type {free}, \type {flush_node} and \type {flush_list}}
+
+\libindex{free}
+\libindex{flush_node}
+\libindex{flush_list}
+
+The next one the node \type {n} from \TEX's memory. Be careful: no checks are
+done on whether this node is still pointed to from a register or some \type
+{next} field: it is up to you to make sure that the internal data structures
+remain correct.
+
+\startfunctioncall
+<node> next =
+ node.free(<node> n)
+flush_node(<node> n)
+\stopfunctioncall
+
+The \type {free} function returns the next field of the freed node, while the
+\type {flush_node} alternative returns nothing.
+
+A list starting with node \type {n} can be flushed from \TEX's memory too. Be
+careful: no checks are done on whether any of these nodes is still pointed to
+from a register or some \type {next} field: it is up to you to make sure that the
+internal data structures remain correct.
+
+\startfunctioncall
+node.flush_list(<node> n)
+\stopfunctioncall
+
+\subsection{\type {copy} and \type {copy_list}}
+
+\libindex{copy}
+\libindex{copy_list}
+
+This creates a deep copy of node \type {n}, including all nested lists as in the case
+of a hlist or vlist node. Only the \type {next} field is not copied.
+
+\startfunctioncall
+<node> m =
+ node.copy(<node> n)
+\stopfunctioncall
+
+A deep copy of the node list that starts at \type {n} can be created too. If
+\type {m} is also given, the copy stops just before node \type {m}.
+
+\startfunctioncall
+<node> m =
+ node.copy_list(<node> n)
+<node> m =
+ node.copy_list(<node> n, <node> m)
+\stopfunctioncall
+
+Note that you cannot copy attribute lists this way. However, there is normally no
+need to copy attribute lists as when you do assignments to the \type {attr} field
+or make changes to specific attributes, the needed copying and freeing takes
+place automatically.
+
+\subsection{\type {prev} and \type{next}}
+
+\libindex{prev}
+\libindex{next}
+
+These returns the node preceding or following the given node, or \type {nil} if
+there is no such node.
+
+\startfunctioncall
+<node> m =
+ node.next(<node> n)
+<node> m =
+ node.prev(<node> n)
+\stopfunctioncall
+
+\subsection{\type {current_attr}}
+
+\libindex{current_attr}
+
+This returns the currently active list of attributes, if there is one.
+
+\startfunctioncall
+<node> m =
+ node.current_attr()
+\stopfunctioncall
+
+The intended usage of \type {current_attr} is as follows:
+
+\starttyping
+local x1 = node.new("glyph")
+x1.attr = node.current_attr()
+local x2 = node.new("glyph")
+x2.attr = node.current_attr()
+\stoptyping
+
+or:
+
+\starttyping
+local x1 = node.new("glyph")
+local x2 = node.new("glyph")
+local ca = node.current_attr()
+x1.attr = ca
+x2.attr = ca
+\stoptyping
+
+The attribute lists are ref counted and the assignment takes care of incrementing
+the refcount. You cannot expect the value \type {ca} to be valid any more when
+you assign attributes (using \type {tex.setattribute}) or when control has been
+passed back to \TEX.
+
+Note: this function is somewhat experimental, and it returns the {\it actual}
+attribute list, not a copy thereof. Therefore, changing any of the attributes in
+the list will change these values for all nodes that have the current attribute
+list assigned to them.
+
+\subsection{\type {hpack}}
+
+\libindex {hpack}
+
+This function creates a new hlist by packaging the list that begins at node \type
+{n} into a horizontal box. With only a single argument, this box is created using
+the natural width of its components. In the three argument form, \type {info}
+must be either \type {additional} or \type {exactly}, and \type {w} is the
+additional (\type {\hbox spread}) or exact (\type {\hbox to}) width to be used.
+The second return value is the badness of the generated box.
+
+\startfunctioncall
+<node> h, <number> b =
+ node.hpack(<node> n)
+<node> h, <number> b =
+ node.hpack(<node> n, <number> w, <string> info)
+<node> h, <number> b =
+ node.hpack(<node> n, <number> w, <string> info, <string> dir)
+\stopfunctioncall
+
+Caveat: there can be unexpected side|-|effects to this function, like updating
+some of the \prm {marks} and \type {\inserts}. Also note that the content of
+\type {h} is the original node list \type {n}: if you call \type {node.free(h)}
+you will also free the node list itself, unless you explicitly set the \type
+{list} field to \type {nil} beforehand. And in a similar way, calling \type
+{node.free(n)} will invalidate \type {h} as well!
+
+\subsection{\type {vpack}}
+
+\libindex {vpack}
+
+This function creates a new vlist by packaging the list that begins at node \type
+{n} into a vertical box. With only a single argument, this box is created using
+the natural height of its components. In the three argument form, \type {info}
+must be either \type {additional} or \type {exactly}, and \type {w} is the
+additional (\type {\vbox spread}) or exact (\type {\vbox to}) height to be used.
+
+\startfunctioncall
+<node> h, <number> b =
+ node.vpack(<node> n)
+<node> h, <number> b =
+ node.vpack(<node> n, <number> w, <string> info)
+<node> h, <number> b =
+ node.vpack(<node> n, <number> w, <string> info, <string> dir)
+\stopfunctioncall
+
+The second return value is the badness of the generated box. See the description
+of \type {hpack} for a few memory allocation caveats.
+
+\subsection{\type {prepend_prevdepth}}
+
+\libindex {prepend_prevdepth}
+
+This function is somewhat special in the sense that it is an experimental helper
+that adds the interlinespace to a line keeping the baselineskip and lineskip into
+account.
+
+\startfunctioncall
+<node> n, <number> delta =
+ node.prepend_prevdepth(<node> n,<number> prevdepth)
+\stopfunctioncall
+
+\subsection{\type {dimensions} and \type {rangedimensions}}
+
+\libindex{dimensions}
+\libindex{rangedimensions}
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n)
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n, <string> dir)
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n, <node> t)
+<number> w, <number> h, <number> d =
+ node.dimensions(<node> n, <node> t, <string> dir)
+\stopfunctioncall
+
+This function calculates the natural in|-|line dimensions of the node list starting
+at node \type {n} and terminating just before node \type {t} (or the end of the
+list, if there is no second argument). The return values are scaled points. An
+alternative format that starts with glue parameters as the first three arguments
+is also possible:
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n)
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n, <string> dir)
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n, <node> t)
+<number> w, <number> h, <number> d =
+ node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ <node> n, <node> t, <string> dir)
+\stopfunctioncall
+
+This calling method takes glue settings into account and is especially useful for
+finding the actual width of a sublist of nodes that are already boxed, for
+example in code like this, which prints the width of the space in between the
+\type {a} and \type {b} as it would be if \type {\box0} was used as-is:
+
+\starttyping
+\setbox0 = \hbox to 20pt {a b}
+
+\directlua{print (node.dimensions(
+ tex.box[0].glue_set,
+ tex.box[0].glue_sign,
+ tex.box[0].glue_order,
+ tex.box[0].head.next,
+ node.tail(tex.box[0].head)
+)) }
+\stoptyping
+
+You need to keep in mind that this is one of the few places in \TEX\ where floats
+are used, which means that you can get small differences in rounding when you
+compare the width reported by \type {hpack} with \type {dimensions}.
+
+The second alternative saves a few lookups and can be more convenient in some
+cases:
+
+\startfunctioncall
+<number> w, <number> h, <number> d =
+ node.rangedimensions(<node> parent, <node> first)
+<number> w, <number> h, <number> d =
+ node.rangedimensions(<node> parent, <node> first, <node> last)
+\stopfunctioncall
+
+\subsection{\type {mlist_to_hlist}}
+
+\libindex {mlist_to_hlist}
+
+\startfunctioncall
+<node> h =
+ node.mlist_to_hlist(<node> n, <string> display_type, <boolean> penalties)
+\stopfunctioncall
+
+This runs the internal mlist to hlist conversion, converting the math list in
+\type {n} into the horizontal list \type {h}. The interface is exactly the same
+as for the callback \cbk {mlist_to_hlist}.
+
+\subsection{\type {slide}}
+
+\startfunctioncall
+<node> m =
+ node.slide(<node> n)
+\stopfunctioncall
+
+Returns the last node of the node list that starts at \type {n}. As a
+side|-|effect, it also creates a reverse chain of \type {prev} pointers between
+nodes.
+
+\subsection{\type {tail}}
+
+\libindex {tail}
+
+\startfunctioncall
+<node> m =
+ node.tail(<node> n)
+\stopfunctioncall
+
+Returns the last node of the node list that starts at \type {n}.
+
+\subsection{\type {length} and type {count}}
+
+\libindex {length}
+\libindex {count}
+
+\startfunctioncall
+<number> i =
+ node.length(<node> n)
+<number> i =
+ node.length(<node> n, <node> m)
+\stopfunctioncall
+
+Returns the number of nodes contained in the node list that starts at \type {n}.
+If \type {m} is also supplied it stops at \type {m} instead of at the end of the
+list. The node \type {m} is not counted.
+
+\startfunctioncall
+<number> i =
+ node.count(<number> id, <node> n)
+<number> i =
+ node.count(<number> id, <node> n, <node> m)
+\stopfunctioncall
+
+Returns the number of nodes contained in the node list that starts at \type {n}
+that have a matching \type {id} field. If \type {m} is also supplied, counting
+stops at \type {m} instead of at the end of the list. The node \type {m} is not
+counted. This function also accept string \type {id}'s.
+
+\subsection{\type {is_char} and \type {is_glyph}}
+
+\libindex {is_char}
+\libindex {is_glyph}
+
+The subtype of a glyph node signals if the glyph is already turned into a character reference
+or not.
+
+\startfunctioncall
+<boolean> b =
+ node.is_char(<node> n)
+<boolean> b =
+ node.is_glyph(<node> n)
+\stopfunctioncall
+
+\subsection{\type {traverse}}
+
+\libindex {traverse}
+
+\startfunctioncall
+<node> t, id, subtype =
+ node.traverse(<node> n)
+\stopfunctioncall
+
+This is a \LUA\ iterator that loops over the node list that starts at \type {n}.
+Typically code looks like this:
+
+\starttyping
+for n in node.traverse(head) do
+ ...
+end
+\stoptyping
+
+is functionally equivalent to:
+
+\starttyping
+do
+ local n
+ local function f (head,var)
+ local t
+ if var == nil then
+ t = head
+ else
+ t = var.next
+ end
+ return t
+ end
+ while true do
+ n = f (head, n)
+ if n == nil then break end
+ ...
+ end
+end
+\stoptyping
+
+It should be clear from the definition of the function \type {f} that even though
+it is possible to add or remove nodes from the node list while traversing, you
+have to take great care to make sure all the \type {next} (and \type {prev})
+pointers remain valid.
+
+If the above is unclear to you, see the section \quote {For Statement} in the
+\LUA\ Reference Manual.
+
+\subsection{\type {traverse_id}}
+
+\libindex {traverse_id}
+
+\startfunctioncall
+<node> t, subtype =
+ node.traverse_id(<number> id, <node> n)
+\stopfunctioncall
+
+This is an iterator that loops over all the nodes in the list that starts at
+\type {n} that have a matching \type {id} field.
+
+See the previous section for details. The change is in the local function \type
+{f}, which now does an extra while loop checking against the upvalue \type {id}:
+
+\starttyping
+ local function f(head,var)
+ local t
+ if var == nil then
+ t = head
+ else
+ t = var.next
+ end
+ while not t.id == id do
+ t = t.next
+ end
+ return t
+ end
+\stoptyping
+
+\subsection{\type {traverse_char} and \type {traverse_glyph}}
+
+\libindex {traverse_char}
+\libindex {traverse_glyph}
+
+The \type{traverse_char} iterator loops over the \nod {glyph} nodes in a list.
+Only nodes with a subtype less than 256 are seen.
+
+\startfunctioncall
+<node> n, font, char =
+ node.traverse_char(<node> n)
+\stopfunctioncall
+
+The \type{traverse_glyph} iterator loops over a list and returns the list and
+filters all glyphs:
+
+\startfunctioncall
+<node> n, font, char =
+ node.traverse_glyph(<node> n)
+\stopfunctioncall
+
+\subsection{\type {traverse_list}}
+
+\libindex {traverse_list}
+
+This iterator loops over the \nod {hlist} and \nod {vlist} nodes in a list.
+
+\startfunctioncall
+<node> n, id, subtype, list =
+ node.traverse_list(<node> n)
+\stopfunctioncall
+
+The four return values can save some time compared to fetching these fields but
+in practice you seldom need them all. So consider it a (side effect of
+experimental) convenience.
+
+\subsection{\type {has_glyph}}
+
+\libindex {has_glyph}
+
+This function returns the first glyph or disc node in the given list:
+
+\startfunctioncall
+<node> n =
+ node.has_glyph(<node> n)
+\stopfunctioncall
+
+\subsection{\type {end_of_math}}
+
+\libindex {end_of_math}
+
+\startfunctioncall
+<node> t =
+ node.end_of_math(<node> start)
+\stopfunctioncall
+
+Looks for and returns the next \type {math_node} following the \type {start}. If
+the given node is a math end node this helper returns that node, else it follows
+the list and returns the next math endnote. If no such node is found nil is
+returned.
+
+\subsection{\type {remove}}
+
+\libindex {remove}
+
+\startfunctioncall
+<node> head, current =
+ node.remove(<node> head, <node> current)
+\stopfunctioncall
+
+This function removes the node \type {current} from the list following \type
+{head}. It is your responsibility to make sure it is really part of that list.
+The return values are the new \type {head} and \type {current} nodes. The
+returned \type {current} is the node following the \type {current} in the calling
+argument, and is only passed back as a convenience (or \type {nil}, if there is
+no such node). The returned \type {head} is more important, because if the
+function is called with \type {current} equal to \type {head}, it will be
+changed.
+
+\subsection{\type {insert_before}}
+
+\libindex {insert_before}
+
+\startfunctioncall
+<node> head, new =
+ node.insert_before(<node> head, <node> current, <node> new)
+\stopfunctioncall
+
+This function inserts the node \type {new} before \type {current} into the list
+following \type {head}. It is your responsibility to make sure that \type
+{current} is really part of that list. The return values are the (potentially
+mutated) \type {head} and the node \type {new}, set up to be part of the list
+(with correct \type {next} field). If \type {head} is initially \type {nil}, it
+will become \type {new}.
+
+\subsection{\type {insert_after}}
+
+\libindex {insert_after}
+
+\startfunctioncall
+<node> head, new =
+ node.insert_after(<node> head, <node> current, <node> new)
+\stopfunctioncall
+
+This function inserts the node \type {new} after \type {current} into the list
+following \type {head}. It is your responsibility to make sure that \type
+{current} is really part of that list. The return values are the \type {head} and
+the node \type {new}, set up to be part of the list (with correct \type {next}
+field). If \type {head} is initially \type {nil}, it will become \type {new}.
+
+\subsection{\type {first_glyph}}
+
+\libindex {first_glyph}
+
+\startfunctioncall
+<node> n =
+ node.first_glyph(<node> n)
+<node> n =
+ node.first_glyph(<node> n, <node> m)
+\stopfunctioncall
+
+Returns the first node in the list starting at \type {n} that is a glyph node
+with a subtype indicating it is a glyph, or \type {nil}. If \type {m} is given,
+processing stops at (but including) that node, otherwise processing stops at the
+end of the list.
+
+\subsection{\type {ligaturing}}
+
+\libindex {ligaturing}
+
+\startfunctioncall
+<node> h, <node> t, <boolean> success =
+ node.ligaturing(<node> n)
+<node> h, <node> t, <boolean> success =
+ node.ligaturing(<node> n, <node> m)
+\stopfunctioncall
+
+Apply \TEX-style ligaturing to the specified nodelist. The tail node \type {m} is
+optional. The two returned nodes \type {h} and \type {t} are the new head and
+tail (both \type {n} and \type {m} can change into a new ligature).
+
+\subsection{\type {kerning}}
+
+\libindex {kerning}
+
+\startfunctioncall
+<node> h, <node> t, <boolean> success =
+ node.kerning(<node> n)
+<node> h, <node> t, <boolean> success =
+ node.kerning(<node> n, <node> m)
+\stopfunctioncall
+
+Apply \TEX|-|style kerning to the specified node list. The tail node \type {m} is
+optional. The two returned nodes \type {h} and \type {t} are the head and tail
+(either one of these can be an inserted kern node, because special kernings with
+word boundaries are possible).
+
+\subsection{\type {unprotect_glyph[s]}}
+
+\libindex {unprotect_glyphs}
+\libindex {unprotect_glyph}
+
+\startfunctioncall
+node.unprotect_glyph(<node> n)
+node.unprotect_glyphs(<node> n,[<node> n])
+\stopfunctioncall
+
+Subtracts 256 from all glyph node subtypes. This and the next function are
+helpers to convert from \type {characters} to \type {glyphs} during node
+processing. The second argument is optional and indicates the end of a range.
+
+\subsection{\type {protect_glyph[s]}}
+
+\libindex {protect_glyphs}
+\libindex {protect_glyph}
+
+\startfunctioncall
+node.protect_glyph(<node> n)
+node.protect_glyphs(<node> n,[<node> n])
+\stopfunctioncall
+
+Adds 256 to all glyph node subtypes in the node list starting at \type {n},
+except that if the value is 1, it adds only 255. The special handling of 1 means
+that \type {characters} will become \type {glyphs} after subtraction of 256. A
+single character can be marked by the singular call. The second argument is
+optional and indicates the end of a range.
+
+\subsection{\type {last_node}}
+
+\libindex {last_node}
+
+\startfunctioncall
+<node> n =
+ node.last_node()
+\stopfunctioncall
+
+This function pops the last node from \TEX's \quote{current list}. It returns
+that node, or \type {nil} if the current list is empty.
+
+\subsection{\type {write}}
+
+\libindex {write}
+
+\startfunctioncall
+node.write(<node> n)
+\stopfunctioncall
+
+This function that will append a node list to \TEX's \quote {current list}. The
+node list is not deep|-|copied! There is no error checking either! You mignt need
+to enforce horizontal mode in order for this to work as expected.
+
+\subsection{\type {protrusion_skippable}}
+
+\libindex {protrusion_skippable}
+
+\startfunctioncall
+<boolean> skippable =
+ node.protrusion_skippable(<node> n)
+\stopfunctioncall
+
+Returns \type {true} if, for the purpose of line boundary discovery when
+character protrusion is active, this node can be skipped.
+
+\stopsection
+
+\startsection[title={Glue handling}][library=node]
+
+\subsection{\type {setglue}}
+
+\libindex {setglue}
+
+You can set the properties of a glue in one go. If you pass no values, the glue
+will become a zero glue.
+
+\startfunctioncall
+node.setglue(<node> n)
+node.setglue(<node> n,width,stretch,shrink,stretch_order,shrink_order)
+\stopfunctioncall
+
+When you pass values, only arguments that are numbers are assigned so
+
+\starttyping
+node.setglue(n,655360,false,65536)
+\stoptyping
+
+will only adapt the width and shrink.
+
+When a list node is passed, you set the glue, order and sign instead.
+
+\subsection{\type {getglue}}
+
+\libindex {getglue}
+
+The next call will return 5 values or nothing when no glue is passed.
+
+\startfunctioncall
+<integer> width, <integer> stretch, <integer> shrink, <integer> stretch_order,
+ <integer> shrink_order = node.getglue(<node> n)
+\stopfunctioncall
+
+When the second argument is false, only the width is returned (this is consistent
+with \type {tex.get}).
+
+When a list node is passed, you get back the glue that is set, the order of that
+glue and the sign.
+
+\subsection{\type {is_zero_glue}}
+
+\libindex {is_zero_glue}
+
+This function returns \type {true} when the width, stretch and shrink properties
+are zero.
+
+\startfunctioncall
+<boolean> isglue =
+ node.is_zero_glue(<node> n)
+\stopfunctioncall
+
+\stopsection
+
+\startsection[title={Attribute handling}][library=node]
+
+\subsection{Attributes}
+
+\topicindex {attributes}
+
+The newly introduced attribute registers are non|-|trivial, because the value
+that is attached to a node is essentially a sparse array of key|-|value pairs. It
+is generally easiest to deal with attribute lists and attributes by using the
+dedicated functions in the \type {node} library, but for completeness, here is
+the low|-|level interface.
+
+Attributes appear as linked list of userdata objects in the \type {attr} field of
+individual nodes. They can be handled individually, but it is much safer and more
+efficient to use the dedicated functions associated with them.
+
+\subsection{\nod {attribute_list} nodes}
+
+\topicindex {nodes+attributes}
+
+An \nod {attribute_list} item is used as a head pointer for a list of attribute
+items. It has only one user-visible field:
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC pointer to the first attribute \NC \NR
+\LL
+\stoptabulate
+
+\subsection{\nod {attr} nodes}
+
+A normal node's attribute field will point to an item of type \nod
+{attribute_list}, and the \type {next} field in that item will point to the first
+defined \quote {attribute} item, whose \type {next} will point to the second
+\quote {attribute} item, etc.
+
+\starttabulate[|l|l|p|]
+\DB field \BC type \BC explanation \NC \NR
+\TB
+\NC \type{next} \NC node \NC pointer to the next attribute \NC \NR
+\NC \type{number} \NC number \NC the attribute type id \NC \NR
+\NC \type{value} \NC number \NC the attribute value \NC \NR
+\LL
+\stoptabulate
+
+As mentioned it's better to use the official helpers rather than edit these
+fields directly. For instance the \type {prev} field is used for other purposes
+and there is no double linked list.
+
+\subsection{\type {has_attribute}}
+
+\libindex {has_attribute}
+
+\startfunctioncall
+<number> v =
+ node.has_attribute(<node> n, <number> id)
+<number> v =
+ node.has_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Tests if a node has the attribute with number \type {id} set. If \type {val} is
+also supplied, also tests if the value matches \type {val}. It returns the value,
+or, if no match is found, \type {nil}.
+
+\subsection{\type {get_attribute}}
+
+\libindex {get_attribute}
+
+\startfunctioncall
+<number> v =
+ node.get_attribute(<node> n, <number> id)
+\stopfunctioncall
+
+Tests if a node has an attribute with number \type {id} set. It returns the
+value, or, if no match is found, \type {nil}. If no \type {id} is given then the
+zero attributes is assumed.
+
+\subsection{\type {find_attribute}}
+
+\libindex {find_attribute}
+
+\startfunctioncall
+<number> v, <node> n =
+ node.find_attribute(<node> n, <number> id)
+\stopfunctioncall
+
+Finds the first node that has attribute with number \type {id} set. It returns
+the value and the node if there is a match and otherwise nothing.
+
+\subsection{\type {set_attribute}}
+
+\libindex {set_attribute}
+
+\startfunctioncall
+node.set_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Sets the attribute with number \type {id} to the value \type {val}. Duplicate
+assignments are ignored.
+
+\subsection{\type {unset_attribute}}
+
+\libindex {unset_attribute}
+
+\startfunctioncall
+<number> v =
+ node.unset_attribute(<node> n, <number> id)
+<number> v =
+ node.unset_attribute(<node> n, <number> id, <number> val)
+\stopfunctioncall
+
+Unsets the attribute with number \type {id}. If \type {val} is also supplied, it
+will only perform this operation if the value matches \type {val}. Missing
+attributes or attribute|-|value pairs are ignored.
+
+If the attribute was actually deleted, returns its old value. Otherwise, returns
+\type {nil}.
+
+\subsection{\type {slide}}
+
+\libindex {slide}
+
+This helper makes sure that the node lists is double linked and returns the found
+tail node.
+
+\startfunctioncall
+<node> tail =
+ node.slide(<node> n)
+\stopfunctioncall
+
+After some callbacks automatic sliding takes place. This feature can be turned
+off with \type {node.fix_node_lists(false)} but you better make sure then that
+you don't mess up lists. In most cases \TEX\ itself only uses \type {next}
+pointers but your other callbacks might expect proper \type {prev} pointers too.
+Future versions of \LUATEX\ can add more checking but this will not influence
+usage.
+
+\subsection{\type {check_discretionary}, \type {check_discretionaries}}
+
+\libindex{check_discretionary}
+\libindex{check_discretionaries}
+
+When you fool around with disc nodes you need to be aware of the fact that they
+have a special internal data structure. As long as you reassign the fields when
+you have extended the lists it's ok because then the tail pointers get updated,
+but when you add to list without reassigning you might end up in trouble when
+the linebreak routine kicks in. You can call this function to check the list for
+issues with disc nodes.
+
+\startfunctioncall
+node.check_discretionary(<node> n)
+node.check_discretionaries(<node> head)
+\stopfunctioncall
+
+The plural variant runs over all disc nodes in a list, the singular variant
+checks one node only (it also checks if the node is a disc node).
+
+\subsection{\type {flatten_discretionaries}}
+
+\libindex {flatten_discretionaries}
+
+This function will remove the discretionaries in the list and inject the replace
+field when set.
+
+\startfunctioncall
+<node> head, count = node.flatten_discretionaries(<node> n)
+\stopfunctioncall
+
+\subsection{\type {family_font}}
+
+\libindex {family_font}
+
+When you pass a proper family identifier the next helper will return the font
+currently associated with it. You can normally also access the font with the
+normal font field or getter because it will resolve the family automatically for
+noads.
+
+\startfunctioncall
+<integer> id =
+ node.family_font(<integer> fam)
+\stopfunctioncall
+
+\stopsection
+
+\startsection[title={Two access models}][library=node]
+
+\topicindex{nodes+direct}
+\topicindex{direct nodes}
+
+\libindex {todirect}
+\libindex {tonode}
+\libindex {tostring}
+
+Deep down in \TEX\ a node has a number which is a numeric entry in a memory
+table. In fact, this model, where \TEX\ manages memory is real fast and one of
+the reasons why plugging in callbacks that operate on nodes is quite fast too.
+Each node gets a number that is in fact an index in the memory table and that
+number often is reported when you print node related information. You go from
+userdata nodes and there numeric references and back with:
+
+\startfunctioncall
+<integer> d = node.todirect(<node> n))
+<node> n = node.tonode(<integer> d))
+\stopfunctioncall
+
+The userdata model is rather robust as it is a virtual interface with some
+additional checking while the more direct access which uses the node numbers
+directly. However, even with userdata you can get into troubles when you free
+nodes that are no longer allocated or mess up lists. if you apply \type
+{tostring} to a node you see its internal (direct) number and id.
+
+The first model provides key based access while the second always accesses fields
+via functions:
+
+\starttyping
+nodeobject.char
+getfield(nodenumber,"char")
+\stoptyping
+
+If you use the direct model, even if you know that you deal with numbers, you
+should not depend on that property but treat it as an abstraction just like
+traditional nodes. In fact, the fact that we use a simple basic datatype has the
+penalty that less checking can be done, but less checking is also the reason why
+it's somewhat faster. An important aspect is that one cannot mix both methods,
+but you can cast both models. So, multiplying a node number makes no sense.
+
+So our advice is: use the indexed (table) approach when possible and investigate
+the direct one when speed might be a real issue. For that reason \LUATEX\ also
+provide the \type {get*} and \type {set*} functions in the top level node
+namespace. There is a limited set of getters. When implementing this direct
+approach the regular index by key variant was also optimized, so direct access
+only makes sense when nodes are accessed millions of times (which happens in some
+font processing for instance).
+
+We're talking mostly of getters because setters are less important. Documents
+have not that many content related nodes and setting many thousands of properties
+is hardly a burden contrary to millions of consultations.
+
+Normally you will access nodes like this:
+
+\starttyping
+local next = current.next
+if next then
+ -- do something
+end
+\stoptyping
+
+Here \type {next} is not a real field, but a virtual one. Accessing it results in
+a metatable method being called. In practice it boils down to looking up the node
+type and based on the node type checking for the field name. In a worst case you
+have a node type that sits at the end of the lookup list and a field that is last
+in the lookup chain. However, in successive versions of \LUATEX\ these lookups
+have been optimized and the most frequently accessed nodes and fields have a
+higher priority.
+
+Because in practice the \type {next} accessor results in a function call, there
+is some overhead involved. The next code does the same and performs a tiny bit
+faster (but not that much because it is still a function call but one that knows
+what to look up).
+
+\starttyping
+local next = node.next(current)
+if next then
+ -- do something
+end
+\stoptyping
+
+Some accessors are used frequently and for these we provide more efficient helpers:
+
+\starttabulate[|l|p|]
+\DB function \BC explanation \NC \NR
+\TB
+\NC \type{getnext} \NC parsing nodelist always involves this one \NC \NR
+\NC \type{getprev} \NC used less but a logical companion to \type {getnext} \NC \NR
+\NC \type{getboth} \NC returns the next and prev pointer of a node \NC \NR
+\NC \type{getid} \NC consulted a lot \NC \NR
+\NC \type{getsubtype} \NC consulted less but also a topper \NC \NR
+\NC \type{getfont} \NC used a lot in \OPENTYPE\ handling (glyph nodes are consulted a lot) \NC \NR
+\NC \type{getchar} \NC idem and also in other places \NC \NR
+\NC \type{getwhd} \NC returns the \type {width}, \type {height} and \type {depth} of a list, rule or
+ (unexpanded) glyph as well as glue (its spec is looked at) and unset nodes\NC \NR
+\NC \type{getdisc} \NC returns the \type {pre}, \type {post} and \type {replace} fields and
+ optionally when true is passed also the tail fields \NC \NR
+\NC \type{getlist} \NC we often parse nested lists so this is a convenient one too \NC \NR
+\NC \type{getleader} \NC comparable to list, seldom used in \TEX\ (but needs frequent consulting
+ like lists; leaders could have been made a dedicated node type) \NC \NR
+\NC \type{getfield} \NC generic getter, sufficient for the rest (other field names are
+ often shared so a specific getter makes no sense then) \NC \NR
+\NC \type{getbox} \NC gets the given box (a list node) \NC \NR
+\NC \type{getoffsets} \NC gets the \type {xoffset} and \type {yoffset} of a glyph or
+ \type {left} and \type {right} values of a rule \NC \NR
+\LL
+\stoptabulate
+
+In the direct namespace there are more such helpers and most of them are
+accompanied by setters. The getters and setters are clever enough to see what
+node is meant. We don't deal with whatsit nodes: their fields are always accessed
+by name. It doesn't make sense to add getters for all fields, we just identifier
+the most likely candidates. In complex documents, many node and fields types
+never get seen, or seen only a few times, but for instance glyphs are candidates
+for such optimization. The \type {node.direct} interface has some more helpers.
+\footnote {We can define the helpers in the node namespace with \type {getfield}
+which is about as efficient, so at some point we might provide that as module.}
+
+The \type {setdisc} helper takes three (optional) arguments plus an optional
+fourth indicating the subtype. Its \type {getdisc} takes an optional boolean;
+when its value is \type {true} the tail nodes will also be returned. The \type
+{setfont} helper takes an optional second argument, it being the character. The
+directmode setter \type {setlink} takes a list of nodes and will link them,
+thereby ignoring \type {nil} entries. The first valid node is returned (beware:
+for good reason it assumes single nodes). For rarely used fields no helpers are
+provided and there are a few that probably are used seldom too but were added for
+consistency. You can of course always define additional accessors using \type
+{getfield} and \type {setfield} with little overhead. When the second argument of
+\type {setattributelist} is \type {true} the current attribute list is assumed.
+
+\def\yes{$+$} \def\nop{$-$}
+
+\def\supported#1#2#3%
+ {\NC \type{#1}
+ \NC \ifx#2\yes\lix{node} {#1}\fi #2
+ \NC \ifx#3\yes\lix{node.direct}{#1}\fi #3 \NC
+ \NR}
+
+\starttabulate[|l|c|c|]
+\DB function \BC node \BC direct \NC \NR
+\TB
+\supported {check_discretionaries} \yes \yes
+\supported {check_discretionary} \yes \yes
+\supported {copy_list} \yes \yes
+\supported {copy} \yes \yes
+\supported {count} \yes \yes
+\supported {current_attr} \yes \yes
+\supported {dimensions} \yes \yes
+\supported {effective_glue} \yes \yes
+\supported {end_of_math} \yes \yes
+\supported {family_font} \yes \nop
+\supported {fields} \yes \nop
+\supported {find_attribute} \yes \yes
+\supported {first_glyph} \yes \yes
+\supported {flatten_discretionaries} \yes \yes
+\supported {flush_list} \yes \yes
+\supported {flush_node} \yes \yes
+\supported {free} \yes \yes
+\supported {get_attribute} \yes \yes
+\supported {get_synctex_fields} \nop \yes
+\supported {getattributelist} \nop \yes
+\supported {getboth} \yes \yes
+\supported {getbox} \nop \yes
+\supported {getchar} \yes \yes
+\supported {getcomponents} \nop \yes
+\supported {getdepth} \nop \yes
+\supported {getdirection} \nop \yes
+\supported {getdir} \nop \yes
+\supported {getdisc} \yes \yes
+\supported {getfam} \nop \yes
+\supported {getfield} \yes \yes
+\supported {getfont} \yes \yes
+\supported {getglue} \yes \yes
+\supported {getheight} \nop \yes
+\supported {getid} \yes \yes
+\supported {getkern} \nop \yes
+\supported {getlang} \nop \yes
+\supported {getleader} \yes \yes
+\supported {getlist} \yes \yes
+\supported {getnext} \yes \yes
+\supported {getnucleus} \nop \yes
+\supported {getoffsets} \nop \yes
+\supported {getpenalty} \nop \yes
+\supported {getprev} \yes \yes
+\supported {getproperty} \yes \yes
+\supported {getshift} \nop \yes
+\supported {getsubtype} \yes \yes
+\supported {getsub} \nop \yes
+\supported {getsup} \nop \yes
+\supported {getdata} \nop \yes
+\supported {getwhd} \yes \yes
+\supported {getwidth} \nop \yes
+\supported {has_attribute} \yes \yes
+\supported {has_field} \yes \yes
+\supported {has_glyph} \yes \yes
+\supported {hpack} \yes \yes
+\supported {id} \yes \nop
+\supported {insert_after} \yes \yes
+\supported {insert_before} \yes \yes
+\supported {is_char} \yes \yes
+\supported {is_direct} \nop \yes
+\supported {is_glyph} \yes \yes
+\supported {is_node} \yes \yes
+\supported {is_zero_glue} \yes \yes
+\supported {kerning} \yes \yes
+\supported {last_node} \yes \yes
+\supported {length} \yes \yes
+\supported {ligaturing} \yes \yes
+\supported {mlist_to_hlist} \yes \nop
+\supported {new} \yes \yes
+\supported {next} \yes \nop
+\supported {prepend_prevdepth} \nop \yes
+\supported {prev} \yes \nop
+\supported {protect_glyphs} \yes \yes
+\supported {protect_glyph} \yes \yes
+\supported {protrusion_skippable} \yes \yes
+\supported {rangedimensions} \yes \yes
+\supported {remove} \yes \yes
+\supported {set_attribute} \yes \yes
+\supported {set_synctex_fields} \nop \yes
+\supported {setattributelist} \nop \yes
+\supported {setboth} \nop \yes
+\supported {setbox} \nop \yes
+\supported {setchar} \nop \yes
+\supported {setcomponents} \nop \yes
+\supported {setdepth} \nop \yes
+\supported {setdirection} \nop \yes
+\supported {setdir} \nop \yes
+\supported {setdisc} \nop \yes
+\supported {setfam} \nop \yes
+\supported {setfield} \yes \yes
+\supported {setfont} \nop \yes
+\supported {setexpansion} \nop \yes
+\supported {setglue} \yes \yes
+\supported {setheight} \nop \yes
+\supported {setkern} \nop \yes
+\supported {setlang} \nop \yes
+\supported {setleader} \nop \yes
+\supported {setlink} \nop \yes
+\supported {setlist} \nop \yes
+\supported {setnext} \nop \yes
+\supported {setnucleus} \nop \yes
+\supported {setoffsets} \nop \yes
+\supported {setpenalty} \nop \yes
+\supported {setprev} \nop \yes
+\supported {setproperty} \yes \yes
+\supported {setshift} \nop \yes
+\supported {setsplit} \nop \yes
+\supported {setsubtype} \nop \yes
+\supported {setsub} \nop \yes
+\supported {setsup} \nop \yes
+\supported {setwhd} \nop \yes
+\supported {setwidth} \nop \yes
+\supported {slide} \yes \yes
+\supported {subtypes} \yes \nop
+\supported {subtype} \yes \nop
+\supported {tail} \yes \yes
+\supported {todirect} \yes \yes
+\supported {tonode} \yes \yes
+\supported {tostring} \yes \yes
+\supported {traverse_char} \yes \yes
+\supported {traverse_glyph} \yes \yes
+\supported {traverse_id} \yes \yes
+\supported {traverse} \yes \yes
+\supported {types} \yes \nop
+\supported {type} \yes \nop
+\supported {unprotect_glyphs} \yes \yes
+\supported {unprotect_glyph} \yes \yes
+\supported {unset_attribute} \yes \yes
+\supported {usedlist} \yes \yes
+\supported {uses_font} \yes \yes
+\supported {vpack} \yes \yes
+\supported {whatsits} \yes \nop
+\supported {write} \yes \yes
+\LL
+\stoptabulate
+
+The \type {node.next} and \type {node.prev} functions will stay but for
+consistency there are variants called \type {getnext} and \type {getprev}. We had
+to use \type {get} because \type {node.id} and \type {node.subtype} are already
+taken for providing meta information about nodes. Note: The getters do only basic
+checking for valid keys. You should just stick to the keys mentioned in the
+sections that describe node properties.
+
+Some of the getters and setters handle multiple node types, given that the field
+is relevant. In that case, some field names are considered similar (like \type
+{kern} and \type {width}, or \type {data} and \type {value}. In retrospect we
+could have normalized field names better but we decided to stick to the original
+(internal) names as much as possible. After all, at the \LUA\ end one can easily
+create synonyms.
+
+Some nodes have indirect references. For instance a math character refers to a
+family instead of a font. In that case we provide a virtual font field as
+accessor. So, \type {getfont} and \type {.font} can be used on them. The same is
+true for the \type {width}, \type {height} and \type {depth} of glue nodes. These
+actually access the spec node properties, and here we can set as well as get the
+values.
+
+In some places \LUATEX\ can do a bit of extra checking for valid node lists and
+you can enable that with:
+
+\startfunctioncall
+node.fix_node_lists(<boolean> b)
+\stopfunctioncall
+
+You can set and query the \SYNCTEX\ fields, a file number aka tag and a line
+number, for a glue, kern, hlist, vlist, rule and math nodes as well as glyph
+nodes (although this last one is not used in native \SYNCTEX).
+
+\startfunctioncall
+node.set_synctex_fields(<integer> f, <integer> l)
+<integer> f, <integer> l =
+ node.get_synctex_fields(<node> n)
+\stopfunctioncall
+
+Of course you need to know what you're doing as no checking on sane values takes
+place. Also, the synctex interpreter used in editors is rather peculiar and has
+some assumptions (heuristics).
+
+\stopsection
+
+\startsection[title={Properties}][library=node]
+
+\topicindex {nodes+properties}
+\topicindex {properties}
+
+\libindex{flush_properties_table}
+\libindex{get_properties_table}
+\libindex{set_properties_mode}
+
+Attributes are a convenient way to relate extra information to a node. You can
+assign them at the \TEX\ end as well as at the \LUA\ end and and consult them at
+the \LUA\ end. One big advantage is that they obey grouping. They are linked
+lists and normally checking for them is pretty efficient, even if you use a lot
+of them. A macro package has to provide some way to manage these attributes at the
+\TEX\ end because otherwise clashes in their usage can occur.
+
+Each node also can have a properties table and you can assign values to this
+table using the \type {setproperty} function and get properties using the \type
+{getproperty} function. Managing properties is way more demanding than managing
+attributes.
+
+Take the following example:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ node.setproperty(n,"foo")
+ print(node.getproperty(n))
+
+ node.setproperty(n,"bar")
+ print(node.getproperty(n))
+
+ node.free(n)
+}
+\stoptyping
+
+This will print \type {foo} and \type {bar} which in itself is not that useful
+when multiple mechanisms want to use this feature. A variant is:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ node.setproperty(n,{ one = "foo", two = "bar" })
+ print(node.getproperty(n).one)
+ print(node.getproperty(n).two)
+
+ node.free(n)
+}
+\stoptyping
+
+This time we store two properties with the node. It really makes sense to have a
+table as property because that way we can store more. But in order for that to
+work well you need to do it this way:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ local t = node.getproperty(n)
+
+ if not t then
+ t = { }
+ node.setproperty(n,t)
+ end
+ t.one = "foo"
+ t.two = "bar"
+
+ print(node.getproperty(n).one)
+ print(node.getproperty(n).two)
+
+ node.free(n)
+}
+\stoptyping
+
+Here our own properties will not overwrite other users properties unless of
+course they use the same keys. So, eventually you will end up with something:
+
+\starttyping
+\directlua {
+ local n = node.new("glyph")
+
+ local t = node.getproperty(n)
+
+ if not t then
+ t = { }
+ node.setproperty(n,t)
+ end
+ t.myself = { one = "foo", two = "bar" }
+
+ print(node.getproperty(n).myself.one)
+ print(node.getproperty(n).myself.two)
+
+ node.free(n)
+}
+\stoptyping
+
+This assumes that only you use \type {myself} as subtable. The possibilities are
+endless but care is needed. For instance, the generic font handler that ships
+with \CONTEXT\ uses the \type {injections} subtable and you should not mess with
+that one!
+
+There are a few helper functions that you normally should not touch as user: \typ
+{flush_properties_table} will wipe the table (normally a bad idea), \typ
+{get_properties_table} and will give the table that stores properties (using
+direct entries) and you can best not mess too much with that one either because
+\LUATEX\ itself will make sure that entries related to nodes will get wiped when
+nodes get freed, so that the \LUA\ garbage collector can do its job. In fact, the
+main reason why we have this mechanism is that it saves the user (or macro
+package) some work. One can easily write a property mechanism in \LUA\ where
+after a shipout properties gets cleaned up but it's not entirely trivial to make
+sure that with each freed node also its properties get freed, due to the fact
+that there can be nodes left over for a next page. And having a callback bound to
+the node deallocator would add way to much overhead.
+
+Managing properties in the node (de)allocator functions is disabled by default
+and is enabled by:
+
+\starttyping
+node.set_properties_mode(true)
+\stoptyping
+
+When we copy a node list that has a table as property, there are several possibilities: we do the same as
+a new node, we copy the entry to the table in properties (a reference), we do
+a deep copy of a table in the properties, we create a new table and give it
+the original one as a metatable. After some experiments (that also included
+timing) with these scenarios we decided that a deep copy made no sense, nor
+did nilling. In the end both the shallow copy and the metatable variant were
+both ok, although the second one is slower. The most important aspect to keep
+in mind is that references to other nodes in properties no longer can be
+valid for that copy. We could use two tables (one unique and one shared) or
+metatables but that only complicates matters.
+
+When defining a new node, we could already allocate a table but it is rather easy
+to do that at the lua end e.g.\ using a metatable \type {__index} method. That
+way it is under macro package control. When deleting a node, we could keep the
+slot (e.g. setting it to false) but it could make memory consumption raise
+unneeded when we have temporary large node lists and after that only small lists.
+Both are not done.
+
+So in the end this is what happens now: when a node is copied, and it has a table
+as property, the new node will share that table. If the second argument of \typ
+{set_properties_mode} is \type {true} then a metatable approach is chosen: the
+copy gets its own table with the original table as metatable. If you use the
+generic font loader the mode is enabled that way.
+
+A few more xperiments were done. For instance: copy attributes to the properties
+so that we have fast access at the \LUA\ end. In the end the overhead is not
+compensated by speed and convenience, in fact, attributes are not that slow when
+it comes to accessing them. So this was rejected.
+
+Another experiment concerned a bitset in the node but again the gain compared to
+attributes was neglectable and given the small amount of available bits it also
+demands a pretty strong agreement over what bit represents what, and this is
+unlikely to succeed in the \TEX\ community. It doesn't pay off.
+
+Just in case one wonders why properties make sense: it is not so much speed that
+we gain, but more convenience: storing all kind of (temporary) data in attributes
+is no fun and this mechanism makes sure that properties are cleaned up when a
+node is freed. Also, the advantage of a more or less global properties table is
+that we stay at the \LUA\ end. An alternative is to store a reference in the node
+itself but that is complicated by the fact that the register has some limitations
+(no numeric keys) and we also don't want to mess with it too much.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-preamble.tex b/systems/doc/luatex/luatex-preamble.tex
new file mode 100644
index 0000000000..635ff4134b
--- /dev/null
+++ b/systems/doc/luatex/luatex-preamble.tex
@@ -0,0 +1,110 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-preamble
+
+\startchapter[reference=preamble,title={Preamble}]
+
+\topicindex{nodes}
+\topicindex{boxes}
+\topicindex{\LUA}
+
+This is a reference manual, not a tutorial. This means that we discuss changes
+relative to traditonal \TEX\ and also present new functionality. As a consequence
+we will refer to concepts that we assume to be known or that might be explained
+later.
+
+The average user doesn't need to know much about what is in this manual. For
+instance fonts and languages are normally dealt with in the macro package that
+you use. Messing around with node lists is also often not really needed at the
+user level. If you do mess around, you'd better know what you're dealing with.
+Reading \quotation {The \TEX\ Book} by Donald Knuth is a good investment of time
+then also because it's good to know where it all started. A more summarizing
+overview is given by \quotation {\TEX\ by Topic} by Victor Eijkhout. You might
+want to peek in \quotation {The \ETEX\ manual} and documentation about \PDFTEX.
+
+But \unknown\ if you're here because of \LUA, then all you need to know is that
+you can call it from within a run. The macro package that you use probably will
+provide a few wrapper mechanisms but the basic \lpr {directlua} command that
+does the job is:
+
+\starttyping
+\directlua{tex.print("Hi there")}
+\stoptyping
+
+You can put code between curly braces but if it's a lot you can also put it in a
+file and load that file with the usual \LUA\ commands.
+
+If you still decide to read on, then it's good to know what nodes are, so we do a
+quick introduction here. If you input this text:
+
+\starttyping
+Hi There
+\stoptyping
+
+eventually we will get a linked lists of nodes, which in \ASCII\ art looks like:
+
+\starttyping
+H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e
+\stoptyping
+
+When we have a paragraph, we actually get something:
+
+\starttyping
+[localpar] <=> H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e <=> [glue]
+\stoptyping
+
+Each character becomes a so called glyph node, a record with properties like the
+current font, the character code and the current language. Spaces become glue
+nodes. There are many node types that we will discuss later. Each node points
+back to a previous node or next node, given that these exist.
+
+It's also good to know beforehand that \TEX\ is basically centered around
+creating paragraphs and pages. The par builder takes a list and breaks it into
+lines. We turn horizontal material into vertical. Lines are so called boxes and
+can be separated by glue, penalties and more. The page builder accumulates lines
+and when feasible triggers an output routine that will take the list so far.
+Constructing the actual page is not part of \TEX\ but done using primitives that
+permit manipulation of boxes. The result is handled back to \TEX\ and flushed to
+a (often \PDF) file.
+
+The \LUATEX\ engine provides hooks for \LUA\ code at nearly every reasonable
+point in the process: collecting content, hyphenating, applying font features,
+breaking into lines, etc. This means that you can overload \TEX's natural
+behaviour, which still is the benchmark. When we refer to \quote {callbacks} we
+means these hooks.
+
+Where plain \TEX\ is basically a basic framework for writing a specific style,
+macro packages like \CONTEXT\ and \LATEX\ provide the user a whole lot of
+additional tools to make documents look good. They hide the dirty details of font
+management, language demands, turning structure into typeset results, wrapping
+pages, including images, and so on. You should be aware of the fact that when you
+hook in your own code to manipulate lists, this can interfere with the macro
+package that you use.
+
+When you read about nodes in the following chapters it's good to keep in mind their
+commands that relate to then. Here are a few:
+
+\starttabulate[|l|l|p|]
+\DB command \BC node \BC explanation \NC \NR
+\TB
+\NC \prm {hbox} \NC \nod {hlist} \NC horizontal box \NC \NR
+\NC \prm {vbox} \NC \nod {vlist} \NC vertical box with the baseline at the bottom \NC \NR
+\NC \prm {vtop} \NC \nod {vlist} \NC vertical box with the baseline at the top \NC \NR
+\NC \prm {hskip} \NC \nod {glue} \NC horizontal skip with optional stretch and shrink \NC \NR
+\NC \prm {vskip} \NC \nod {glue} \NC vertical skip with optional stretch and shrink \NC \NR
+\NC \prm {kern} \NC \nod {kern} \NC horizontal or vertical fixed skip \NC \NR
+\NC \prm {discretionary} \NC \nod {disc} \NC hyphenation point (pre, post, replace) \NC \NR
+\NC \prm {char} \NC \nod {glyph} \NC a character \NC \NR
+\NC \prm {hrule} \NC \nod {rule} \NC a horizontal rule \NC \NR
+\NC \prm {vrule} \NC \nod {rule} \NC a vertical rule \NC \NR
+\NC \prm {textdir(ection)} \NC \nod {dir} \NC a change in text direction \NC \NR
+\LL
+\stoptabulate
+
+For now this should be enough to enable you to understand the next chapters.
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-registers.tex b/systems/doc/luatex/luatex-registers.tex
new file mode 100644
index 0000000000..2930230070
--- /dev/null
+++ b/systems/doc/luatex/luatex-registers.tex
@@ -0,0 +1,47 @@
+\environment luatex-style
+
+\startcomponent luatex-registers
+
+\startchapter[title=Topics]
+
+ \placeregister[topicindex]
+
+\stopchapter
+
+\startchapter[title=Primitives]
+
+ This register contains the primitives that are mentioned in the manual. There
+ are of course many more primitives. The \LUATEX\ primitives are typeset in
+ bold. The primitives from \PDFTEX\ are not supported that way but mentioned
+ anyway.
+
+ \placeregister[primitiveindex][indicator=no]
+
+\stopchapter
+
+\startchapter[title=Callbacks]
+
+ \placeregister[callbackindex]
+
+\stopchapter
+
+\startchapter[title=Nodes]
+
+ This register contains the nodes that are known to \LUATEX. The primary nodes
+ are in bold, whatsits that are determined by their subtype are normal. The
+ names prefixed by \type {pdf_} are backend specific.
+
+ \placeregister[nodeindex]
+
+\stopchapter
+
+\startchapter[title=Libraries]
+
+ This register contains the functions available in libraries. Not all functions
+ are documented, for instance because they can be experimental or obsolete.
+
+ \placeregister[libraryindex]
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-statistics.tex b/systems/doc/luatex/luatex-statistics.tex
new file mode 100644
index 0000000000..2428a2929d
--- /dev/null
+++ b/systems/doc/luatex/luatex-statistics.tex
@@ -0,0 +1,17 @@
+% language=uk
+
+\environment luatex-style
+
+\startcomponent luatex-statistics
+
+\startchapter[title={Statistics}]
+
+ \topicindex{fonts+used}
+
+ The following fonts are used in this document:
+
+ \showfontusage
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-style.tex b/systems/doc/luatex/luatex-style.tex
new file mode 100644
index 0000000000..502e894a8c
--- /dev/null
+++ b/systems/doc/luatex/luatex-style.tex
@@ -0,0 +1,443 @@
+\startenvironment luatex-style
+
+% todo: use \useMPlibrary[lua]
+
+\enabletrackers[fonts.usage]
+
+\usemodule[fonts-statistics]
+
+\setuplayout
+ [height=middle,
+ width=middle,
+ backspace=2cm,
+ topspace=10mm,
+ bottomspace=10mm,
+ header=10mm,
+ footer=10mm,
+ footerdistance=10mm,
+ headerdistance=10mm]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setuptolerance
+ [stretch,tolerant]
+
+\setuptype
+ [lines=hyphenated]
+
+\setuptyping
+ [lines=hyphenated]
+
+\setupitemize
+ [each]
+ [packed]
+
+\definesymbol[1][\Uchar"2023]
+\definesymbol[2][\endash]
+\definesymbol[3][\wait] % we want to catch it
+
+\setupitemize
+ [each]
+ [headcolor=maincolor,
+ symbolcolor=maincolor,
+ color=maincolor]
+
+\setupwhitespace
+ [medium]
+
+\setuptabulate
+ [blank={small,samepage},
+ headstyle=bold,
+ rulecolor=maincolor,
+ rulethickness=1pt,
+ foregroundcolor=white,
+ foregroundstyle=\ss\bfx\WORD,
+ backgroundcolor=maincolor]
+
+\setupcaptions
+ [headcolor=darkblue]
+
+\startluacode
+ local skipped = table.tohash { 'id', 'subtype', 'next', 'prev' }
+
+ function document.functions.showfields(s)
+ local t = string.split(s,',')
+ local f = node.fields(t[1],t[2])
+ if f then
+ local d = false
+ for i=1,#f do
+ local fi = f[i]
+ if skipped[fi] then
+ -- okay
+ elseif d then
+ context(', {\tttf %s}', fi)
+ else
+ context('{\tttf %s}', fi)
+ d = true
+ end
+ end
+ end
+ end
+
+ function document.functions.showid(s)
+ local t = string.split(s,',')
+ context('{tttf %s}',node.id(t[1]))
+ if t[2] then
+ context(', {tttf %s}',node.subtype(t[2]))
+ end
+ end
+
+ function document.functions.showsubtypes(s)
+ local s = node.subtypes(s)
+ local d = false
+ for k, v in table.sortedhash(s) do
+ if d then
+ context(', %s = {\\tttf %s}',k,v)
+ else
+ context('%s = {\\tttf %s}',k,v)
+ d = true
+ end
+ end
+ end
+\stopluacode
+
+\unexpanded\def\showfields #1{\ctxlua{document.functions.showfields("#1")}}
+\unexpanded\def\showid #1{\ctxlua{document.functions.showid("#1")}}
+\unexpanded\def\showsubtypes#1{\ctxlua{document.functions.showsubtypes("#1")}}
+
+\definecolor[blue] [b=.5]
+\definecolor[red] [r=.5]
+\definecolor[green] [g=.5]
+\definecolor[maincolor] [b=.5]
+\definecolor[keptcolor] [b=.5]
+\definecolor[othercolor][r=.5,g=.5]
+
+\writestatus{luatex manual}{}
+\writestatus{luatex manual}{defining lucodaot} \usebodyfont [lucidaot]
+\writestatus{luatex manual}{defining pagella} \usebodyfont [pagella]
+\writestatus{luatex manual}{defining cambria} \usebodyfont [cambria]
+\writestatus{luatex manual}{defining modern} \usebodyfont [modern]
+\writestatus{luatex manual}{defining dejavu} \setupbodyfont[dejavu,10pt]
+\writestatus{luatex manual}{}
+
+\setuphead [chapter] [align={flushleft,broad},style=\bfd]
+\setuphead [section] [align={flushleft,broad},style=\bfb]
+\setuphead [subsection] [align={flushleft,broad},style=\bfa]
+\setuphead [subsubsection][align={flushleft,broad},style=\bf]
+
+\setuphead [chapter] [color=maincolor]
+\setuphead [section] [color=maincolor]
+\setuphead [subsection] [color=maincolor]
+\setuphead [subsubsection][color=maincolor]
+
+\setupfloats
+ [ntop=4]
+
+\definehead
+ [remark]
+ [subsubsubject]
+
+\setupheadertexts
+ []
+
+% \setuplayout
+% [style=bold,
+% color=maincolor]
+
+\definemixedcolumns
+ [twocolumns]
+ [n=2,
+ balance=yes,
+ before=\blank,
+ after=\blank]
+
+\definemixedcolumns
+ [threecolumns]
+ [twocolumns]
+ [n=3]
+
+\definemixedcolumns
+ [fourcolumns]
+ [threecolumns]
+ [n=4]
+
+% if we do this we also need to do it in table cells
+%
+% \setuptyping
+% [color=maincolor]
+%
+% \setuptype
+% [color=maincolor]
+
+\definetyping
+ [functioncall]
+
+\startMPdefinitions
+
+ color luaplanetcolor ; luaplanetcolor := \MPcolor{maincolor} ;
+ color luaholecolor ; luaholecolor := white ;
+ numeric luaextraangle ; luaextraangle := 0 ;
+ numeric luaorbitfactor ; luaorbitfactor := .25 ;
+
+ vardef lualogo = image (
+
+ % Graphic design by A. Nakonechnyj. Copyright (c) 1998, All rights reserved.
+
+ save d, r, p ; numeric d, r, p ;
+
+ d := sqrt(2)/4 ; r := 1/4 ; p := r/8 ;
+
+ fill fullcircle scaled 1
+ withcolor luaplanetcolor ;
+ draw fullcircle rotated 40.5 scaled (1+r)
+ dashed evenly scaled p
+ withpen pencircle scaled (p/2)
+ withcolor (luaorbitfactor * luaholecolor) ;
+ fill fullcircle scaled r shifted (d+1/8,d+1/8)
+ rotated - luaextraangle
+ withcolor luaplanetcolor ;
+ fill fullcircle scaled r shifted (d-1/8,d-1/8)
+ withcolor luaholecolor ;
+ luaorbitfactor := .25 ;
+ ) enddef ;
+
+\stopMPdefinitions
+
+\startuseMPgraphic{luapage}
+ StartPage ;
+
+ fill Page withcolor \MPcolor{othercolor} ;
+
+ luaorbitfactor := 1 ;
+
+ picture p ; p := lualogo ysized (5*\measure{paperheight}/10) ;
+ draw p
+ shifted - center p
+ shifted (
+ \measure{spreadwidth} - .5*\measure{paperwidth} + \measure{spinewidth},
+ .375*\measure{paperheight}
+ )
+ ;
+
+ StopPage ;
+\stopuseMPgraphic
+
+% \starttexdefinition luaextraangle
+% % we can also just access the last page and so in mp directly
+% \ctxlua {
+% context(\lastpage == 0 and 0 or \realfolio*360/\lastpage)
+% }
+% \stoptexdefinition
+
+\startuseMPgraphic{luanumber}
+ % luaextraangle := \luaextraangle;
+ luaextraangle := if (LastPageNumber < 10) : 10 else : (RealPageNumber / LastPageNumber) * 360 fi;
+ luaorbitfactor := 0.25 ;
+ picture p ; p := lualogo ;
+ setbounds p to boundingbox fullcircle ;
+ draw p ysized 1cm ;
+\stopuseMPgraphic
+
+\definelayer
+ [page]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\setupbackgrounds
+ [leftpage]
+ [background=page]
+
+\setupbackgrounds
+ [rightpage]
+ [background=page]
+
+\definemeasure[banneroffset][\bottomspace-\footerheight-\footerdistance+2cm]
+
+\startsetups pagenumber:right
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=1.0cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay]
+ {\strut\useMPgraphic{luanumber}}
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=2.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,width=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\pagenumber}
+ \setlayerframed
+ [page]
+ [preset=rightbottom,x=3.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\getmarking[chapter]}
+\stopsetups
+
+\startsetups pagenumber:left
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=3.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\getmarking[chapter]}
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=2.5cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,width=1cm,offset=overlay,
+ foregroundstyle=bold,foregroundcolor=maincolor]
+ {\strut\pagenumber}
+ \setlayerframed
+ [page]
+ [preset=leftbottom,x=1.0cm,y=\measure{banneroffset}]
+ [frame=off,height=1cm,offset=overlay]
+ {\strut\useMPgraphic{luanumber}}
+\stopsetups
+
+\unexpanded\def\nonterminal#1>{\mathematics{\langle\hbox{\rm #1}\rangle}}
+
+% taco's brainwave -) .. todo: create a typing variant so that we can avoid the !crlf
+
+\newcatcodetable\syntaxcodetable
+
+\unexpanded\def\makesyntaxcodetable
+ {\begingroup
+ \catcode`\<=13 \catcode`\|=12
+ \catcode`\!= 0 \catcode`\\=12
+ \savecatcodetable\syntaxcodetable
+ \endgroup}
+
+\makesyntaxcodetable
+
+\unexpanded\def\startsyntax {\begingroup\catcodetable\syntaxcodetable \dostartsyntax}
+\unexpanded\def\syntax {\begingroup\catcodetable\syntaxcodetable \dosyntax}
+ \let\stopsyntax \relax
+
+\unexpanded\def\syntaxenvbody#1%
+ {\par
+ \tt
+ \startnarrower
+ % \maincolor
+ #1
+ \stopnarrower
+ \par}
+
+\unexpanded\def\syntaxbody#1%
+ {\begingroup
+ % \maincolor
+ \tt #1%
+ \endgroup}
+
+\bgroup \catcodetable\syntaxcodetable
+
+!gdef!dostartsyntax#1\stopsyntax{!let<!nonterminal!syntaxenvbody{#1}!endgroup}
+!gdef!dosyntax #1{!let<!nonterminal!syntaxbody{#1}!endgroup}
+
+!egroup
+
+\definetyping
+ [texsyntax]
+% [color=maincolor]
+
+% end of wave
+
+\setupinteraction
+ [state=start,
+ focus=standard,
+ style=,
+ color=,
+ contrastcolor=]
+
+\placebookmarks
+ [chapter,section,subsection]
+
+\setuplist
+ [chapter,section,subsection,subsubsection]
+ [interaction=all,
+ width=3em]
+
+\setuplist
+ [chapter]
+ [style=bold,
+ before={\testpage[4]\blank},
+ color=keptcolor]
+
+\setuplist
+ [section]
+ [before={\testpage[3]}]
+
+\setuplist
+ [subsection,subsubsection]
+ [margin=3em,
+ width=5em]
+
+\definestartstop
+ [notabene]
+ [style=slanted]
+
+\definestartstop
+ [preamble]
+ [style=normal,
+ before=\blank,
+ after=\blank]
+
+% Hans doesn't like the bookmarks opening by default so we comment this:
+%
+% \setupinteractionscreen
+% [option=bookmark]
+
+\startbuffer[stylecalculations]
+
+ \normalexpanded{\definemeasure[spinewidth] [0pt]}
+ \normalexpanded{\definemeasure[paperwidth] [\the\paperwidth ]}
+ \normalexpanded{\definemeasure[paperheight][\the\paperheight]}
+ \normalexpanded{\definemeasure[spreadwidth][\measure{paperwidth}]}
+
+\stopbuffer
+
+\getbuffer[stylecalculations]
+
+\dontcomplain
+
+\environment luatex-logos
+
+\defineregister[topicindex]
+\defineregister[primitiveindex]
+\defineregister[callbackindex]
+\defineregister[nodeindex]
+\defineregister[libraryindex]
+
+\unexpanded\def\lpr#1{\doifmode{*bodypart}{\primitiveindex[#1]{\bf\tex {#1}}}\tex {#1}}
+\unexpanded\def\prm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
+\unexpanded\def\orm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
+\unexpanded\def\cbk#1{\doifmode{*bodypart}{\callbackindex [#1]{\type {#1}}}\type{#1}}
+\unexpanded\def\nod#1{\doifmode{*bodypart}{\nodeindex [#1]{\bf\type{#1}}}\type{#1}}
+\unexpanded\def\whs#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
+\unexpanded\def\noa#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
+
+\hyphenation{sub-nodes}
+
+\def\currentlibraryindex{\namedstructureuservariable{section}{library}}
+
+\setupregister
+ [libraryindex]
+ [indicator=no,before=]
+
+\setupregister
+ [libraryindex]
+ [1]
+ [textstyle=\ttbf]
+
+\setupregister
+ [libraryindex]
+ [2]
+ [textstyle=\tttf]
+
+\unexpanded\def\lib #1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}\type{\currentlibraryindex.#1}}}
+\unexpanded\def\libindex#1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}}}
+\unexpanded\def\libidx#1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}\type{#1.#2}}}
+\unexpanded\def\lix #1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}}}
+
+% \setstructurepageregister[][keys:1=,entries:1=]
+
+\stopenvironment
diff --git a/systems/doc/luatex/luatex-tex.tex b/systems/doc/luatex/luatex-tex.tex
new file mode 100644
index 0000000000..48bdeef119
--- /dev/null
+++ b/systems/doc/luatex/luatex-tex.tex
@@ -0,0 +1,2774 @@
+% language=uk
+
+% lua.newtable
+
+\environment luatex-style
+
+\startcomponent luatex-tex
+
+\startchapter[reference=tex,title={The \TEX\ related libraries}]
+
+\startsection[title={The \type {lua} library}][library=lua]
+
+\startsubsection[title={Version information}]
+
+\topicindex{libraries+\type{lua}}
+\topicindex{version}
+
+\libindex{version}
+
+This library contains one read|-|only item:
+
+\starttyping
+<string> s = lua.version
+\stoptyping
+
+This returns the \LUA\ version identifier string. The value is currently
+\directlua {tex.print(lua.version)}.
+
+\stopsubsection
+
+\startsubsection[title={Bytecode registers}]
+
+\topicindex{bytecodes}
+\topicindex{registers+bytecodes}
+
+\libindex{bytecode}
+\libindex{setbytecode}
+\libindex{getbytecode}
+
+\LUA\ registers can be used to store \LUA\ code chunks. The accepted values for
+assignments are functions and \type {nil}. Likewise, the retrieved value is
+either a function or \type {nil}.
+
+\starttyping
+lua.bytecode[<number> n] = <function> f
+lua.bytecode[<number> n]()
+\stoptyping
+
+The contents of the \type {lua.bytecode} array is stored inside the format file
+as actual \LUA\ bytecode, so it can also be used to preload \LUA\ code. The
+function must not contain any upvalues. The associated function calls are:
+
+\startfunctioncall
+<function> f = lua.getbytecode(<number> n)
+lua.setbytecode(<number> n, <function> f)
+\stopfunctioncall
+
+Note: Since a \LUA\ file loaded using \type {loadfile(filename)} is essentially
+an anonymous function, a complete file can be stored in a bytecode register like
+this:
+
+\startfunctioncall
+lua.bytecode[n] = loadfile(filename)
+\stopfunctioncall
+
+Now all definitions (functions, variables) contained in the file can be
+created by executing this bytecode register:
+
+\startfunctioncall
+lua.bytecode[n]()
+\stopfunctioncall
+
+Note that the path of the file is stored in the \LUA\ bytecode to be used in
+stack backtraces and therefore dumped into the format file if the above code is
+used in \INITEX. If it contains private information, i.e. the user name, this
+information is then contained in the format file as well. This should be kept in
+mind when preloading files into a bytecode register in \INITEX.
+
+\stopsubsection
+
+\startsubsection[title={Chunk name registers}]
+
+\libindex{name}
+\libindex{setluaname}
+\libindex{getluaname}
+
+There is an array of 65536 (0--65535) potential chunk names for use with the
+\prm {directlua} and \lpr {latelua} primitives.
+
+\startfunctioncall
+lua.name[<number> n] = <string> s
+<string> s = lua.name[<number> n]
+\stopfunctioncall
+
+If you want to unset a \LUA\ name, you can assign \type {nil} to it. The function
+accessors are:
+
+\startfunctioncall
+lua.setluaname(<string> s,<number> n])
+<string> s = lua.getluaname(<number> n)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={Introspection}]
+
+\libindex{getstacktop}
+\libindex{getcalllevel}
+
+The \type {getstacktop} and\type {getcalllevel} functions return numbers
+indicating how much nesting is going on. They are only of use as breakpoints when
+checking some mechanism going haywire.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {status} library}][library=status]
+
+\topicindex{libraries+\type{status}}
+
+\libindex{list}
+\libindex{resetmessages}
+\libindex{setexitcode}
+
+This contains a number of run|-|time configuration items that you may find useful
+in message reporting, as well as an iterator function that gets all of the names
+and values as a table.
+
+\startfunctioncall
+<table> info = status.list()
+\stopfunctioncall
+
+The keys in the table are the known items, the value is the current value. Almost
+all of the values in \type {status} are fetched through a metatable at run|-|time
+whenever they are accessed, so you cannot use \type {pairs} on \type {status},
+but you {\it can\/} use \type {pairs} on \type {info}, of course. If you do not
+need the full list, you can also ask for a single item by using its name as an
+index into \type {status}. The current list is:
+
+\starttabulate[|l|p|]
+\DB key \BC explanation \NC \NR
+\TB
+\NC \type{banner} \NC terminal display banner \NC \NR
+\NC \type{best_page_break} \NC the current best break (a node) \NC \NR
+\NC \type{buf_size} \NC current allocated size of the line buffer \NC \NR
+\NC \type{callbacks} \NC total number of executed callbacks so far \NC \NR
+\NC \type{cs_count} \NC number of control sequences \NC \NR
+\NC \type{dest_names_size} \NC \PDF\ destination table size \NC \NR
+\NC \type{dvi_gone} \NC written \DVI\ bytes \NC \NR
+\NC \type{dvi_ptr} \NC not yet written \DVI\ bytes \NC \NR
+\NC \type{dyn_used} \NC token (multi|-|word) memory in use \NC \NR
+\NC \type{filename} \NC name of the current input file \NC \NR
+\NC \type{fix_mem_end} \NC maximum number of used tokens \NC \NR
+\NC \type{fix_mem_min} \NC minimum number of allocated words for tokens \NC \NR
+\NC \type{fix_mem_max} \NC maximum number of allocated words for tokens \NC \NR
+\NC \type{font_ptr} \NC number of active fonts \NC \NR
+\NC \type{hash_extra} \NC extra allowed hash \NC \NR
+\NC \type{hash_size} \NC size of hash \NC \NR
+\NC \type{indirect_callbacks} \NC number of those that were themselves a result of other callbacks (e.g. file readers) \NC \NR
+\NC \type{ini_version} \NC \type {true} if this is an \INITEX\ run \NC \NR
+\NC \type{init_pool_ptr} \NC \INITEX\ string pool index \NC \NR
+\NC \type{init_str_ptr} \NC number of \INITEX\ strings \NC \NR
+\NC \type{input_ptr} \NC the level of input we're at \NC \NR
+\NC \type{inputid} \NC numeric id of the current input \NC \NR
+\NC \type{largest_used_mark} \NC max referenced marks class \NC \NR
+\NC \type{lasterrorcontext} \NC last error context string (with newlines) \NC \NR
+\NC \type{lasterrorstring} \NC last \TEX\ error string \NC \NR
+\NC \type{lastluaerrorstring} \NC last \LUA\ error string \NC \NR
+\NC \type{lastwarningstring} \NC last warning tag, normally an indication of in what part\NC \NR
+\NC \type{lastwarningtag} \NC last warning string\NC \NR
+\NC \type{linenumber} \NC location in the current input file \NC \NR
+\NC \type{log_name} \NC name of the log file \NC \NR
+\NC \type{luabytecode_bytes} \NC number of bytes in \LUA\ bytecode registers \NC \NR
+\NC \type{luabytecodes} \NC number of active \LUA\ bytecode registers \NC \NR
+\NC \type{luastate_bytes} \NC number of bytes in use by \LUA\ interpreters \NC \NR
+\NC \type{luatex_engine} \NC the \LUATEX\ engine identifier \NC \NR
+\NC \type{luatex_hashchars} \NC length to which \LUA\ hashes strings ($2^n$) \NC \NR
+\NC \type{luatex_hashtype} \NC the hash method used (in \LUAJITTEX) \NC \NR
+\NC \type{luatex_version} \NC the \LUATEX\ version number \NC \NR
+\NC \type{luatex_revision} \NC the \LUATEX\ revision string \NC \NR
+\NC \type{max_buf_stack} \NC max used buffer position \NC \NR
+\NC \type{max_in_stack} \NC max used input stack entries \NC \NR
+\NC \type{max_nest_stack} \NC max used nesting stack entries \NC \NR
+\NC \type{max_param_stack} \NC max used parameter stack entries \NC \NR
+\NC \type{max_save_stack} \NC max used save stack entries \NC \NR
+\NC \type{max_strings} \NC maximum allowed strings \NC \NR
+\NC \type{nest_size} \NC nesting stack size \NC \NR
+\NC \type{node_mem_usage} \NC a string giving insight into currently used nodes \NC \NR
+\NC \type{obj_ptr} \NC max \PDF\ object pointer \NC \NR
+\NC \type{obj_tab_size} \NC \PDF\ object table size \NC \NR
+\NC \type{output_active} \NC \type {true} if the \prm {output} routine is active \NC \NR
+\NC \type{output_file_name} \NC name of the \PDF\ or \DVI\ file \NC \NR
+\NC \type{param_size} \NC parameter stack size \NC \NR
+\NC \type{pdf_dest_names_ptr} \NC max \PDF\ destination pointer \NC \NR
+\NC \type{pdf_gone} \NC written \PDF\ bytes \NC \NR
+\NC \type{pdf_mem_ptr} \NC max \PDF\ memory used \NC \NR
+\NC \type{pdf_mem_size} \NC \PDF\ memory size \NC \NR
+\NC \type{pdf_os_cntr} \NC max \PDF\ object stream pointer \NC \NR
+\NC \type{pdf_os_objidx} \NC \PDF\ object stream index \NC \NR
+\NC \type{pdf_ptr} \NC not yet written \PDF\ bytes \NC \NR
+\NC \type{pool_ptr} \NC string pool index \NC \NR
+\NC \type{pool_size} \NC current size allocated for string characters \NC \NR
+\NC \type{save_size} \NC save stack size \NC \NR
+\NC \type{shell_escape} \NC \type {0} means disabled, \type {1} means anything is permitted, and \type {2} is restricted \NC \NR
+\NC \type{safer_option} \NC \type {1} means safer is enforced \NC \NR
+\NC \type{kpse_used} \NC \type {1} means that kpse is used \NC \NR
+\NC \type{stack_size} \NC input stack size \NC \NR
+\NC \type{str_ptr} \NC number of strings \NC \NR
+\NC \type{total_pages} \NC number of written pages \NC \NR
+\NC \type{var_mem_max} \NC number of allocated words for nodes \NC \NR
+\NC \type{var_used} \NC variable (one|-|word) memory in use \NC \NR
+\NC \type{lc_collate} \NC the value of \type {LC_COLLATE} at startup time (becomes \type {C} at startup) \NC \NR
+\NC \type{lc_ctype} \NC the value of \type {LC_CTYPE} at startup time (becomes \type {C} at startup) \NC \NR
+%NC \type{lc_monetary} \NC the value of \type {LC_MONETARY} at startup time \NC \NR
+\NC \type{lc_numeric} \NC the value of \type {LC_NUMERIC} at startup time \NC \NR
+%NC \type{lc_time} \NC the value of \type {LC_TIME} at startup time (becomes \type {C} at startup) \NC \NR
+\LL
+\stoptabulate
+
+The error and warning messages can be wiped with the \type {resetmessages}
+function. A return value can be set with \type {setexitcode}.
+
+\stopsection
+
+\startsection[title={The \type {tex} library}][library=tex]
+
+\startsubsection[title={Introduction}]
+
+\topicindex{libraries+\type{tex}}
+
+The \type {tex} table contains a large list of virtual internal \TEX\
+parameters that are partially writable.
+
+The designation \quote {virtual} means that these items are not properly defined
+in \LUA, but are only front\-ends that are handled by a metatable that operates
+on the actual \TEX\ values. As a result, most of the \LUA\ table operators (like
+\type {pairs} and \type {#}) do not work on such items.
+
+At the moment, it is possible to access almost every parameter that you can use
+after \prm {the}, is a single tokens or is sort of special in \TEX. This excludes
+parameters that need extra arguments, like \type {\the\scriptfont}. The subset
+comprising simple integer and dimension registers are writable as well as
+readable (like \prm {tracingcommands} and \prm {parindent}).
+
+\stopsubsection
+
+\startsubsection[title={Internal parameter values, \type {set} and \type {get}}]
+
+\topicindex{parameters+internal}
+
+\libindex{set} \libindex{get}
+
+For all the parameters in this section, it is possible to access them directly
+using their names as index in the \type {tex} table, or by using one of the
+functions \type {tex.get} and \type {tex.set}.
+
+The exact parameters and return values differ depending on the actual parameter,
+and so does whether \type {tex.set} has any effect. For the parameters that {\em
+can} be set, it is possible to use \type {global} as the first argument to \type
+{tex.set}; this makes the assignment global instead of local.
+
+\startfunctioncall
+tex.set (["global",] <string> n, ...)
+... = tex.get (<string> n)
+\stopfunctioncall
+
+Glue is kind of special because there are five values involved. The return value
+is a \nod {glue_spec} node but when you pass \type {false} as last argument to
+\type {tex.get} you get the width of the glue and when you pass \type {true} you
+get all five values. Otherwise you get a node which is a copy of the internal
+value so you are responsible for its freeing at the \LUA\ end. When you set a
+glue quantity you can either pass a \nod {glue_spec} or upto five numbers. If
+you pass \type {true} to \type {get} you get 5 values returned for a glue and
+when you pass \type {false} you only get the width returned.
+
+\subsubsection{Integer parameters}
+
+The integer parameters accept and return \LUA\ numbers. These are read|-|write:
+
+\starttwocolumns
+\starttyping
+tex.adjdemerits
+tex.binoppenalty
+tex.brokenpenalty
+tex.catcodetable
+tex.clubpenalty
+tex.day
+tex.defaulthyphenchar
+tex.defaultskewchar
+tex.delimiterfactor
+tex.displaywidowpenalty
+tex.doublehyphendemerits
+tex.endlinechar
+tex.errorcontextlines
+tex.escapechar
+tex.exhyphenpenalty
+tex.fam
+tex.finalhyphendemerits
+tex.floatingpenalty
+tex.globaldefs
+tex.hangafter
+tex.hbadness
+tex.holdinginserts
+tex.hyphenpenalty
+tex.interlinepenalty
+tex.language
+tex.lastlinefit
+tex.lefthyphenmin
+tex.linepenalty
+tex.localbrokenpenalty
+tex.localinterlinepenalty
+tex.looseness
+tex.mag
+tex.maxdeadcycles
+tex.month
+tex.newlinechar
+tex.outputpenalty
+tex.pausing
+tex.postdisplaypenalty
+tex.predisplaydirection
+tex.predisplaypenalty
+tex.pretolerance
+tex.relpenalty
+tex.righthyphenmin
+tex.savinghyphcodes
+tex.savingvdiscards
+tex.showboxbreadth
+tex.showboxdepth
+tex.time
+tex.tolerance
+tex.tracingassigns
+tex.tracingcommands
+tex.tracinggroups
+tex.tracingifs
+tex.tracinglostchars
+tex.tracingmacros
+tex.tracingnesting
+tex.tracingonline
+tex.tracingoutput
+tex.tracingpages
+tex.tracingparagraphs
+tex.tracingrestores
+tex.tracingscantokens
+tex.tracingstats
+tex.uchyph
+tex.vbadness
+tex.widowpenalty
+tex.year
+\stoptyping
+\stoptwocolumns
+
+These are read|-|only:
+
+\startthreecolumns
+\starttyping
+tex.deadcycles
+tex.insertpenalties
+tex.parshape
+tex.prevgraf
+tex.spacefactor
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Dimension parameters}
+
+The dimension parameters accept \LUA\ numbers (signifying scaled points) or
+strings (with included dimension). The result is always a number in scaled
+points. These are read|-|write:
+
+\startthreecolumns
+\starttyping
+tex.boxmaxdepth
+tex.delimitershortfall
+tex.displayindent
+tex.displaywidth
+tex.emergencystretch
+tex.hangindent
+tex.hfuzz
+tex.hoffset
+tex.hsize
+tex.lineskiplimit
+tex.mathsurround
+tex.maxdepth
+tex.nulldelimiterspace
+tex.overfullrule
+tex.pagebottomoffset
+tex.pageheight
+tex.pageleftoffset
+tex.pagerightoffset
+tex.pagetopoffset
+tex.pagewidth
+tex.parindent
+tex.predisplaysize
+tex.scriptspace
+tex.splitmaxdepth
+tex.vfuzz
+tex.voffset
+tex.vsize
+tex.prevdepth
+tex.prevgraf
+tex.spacefactor
+\stoptyping
+\stopthreecolumns
+
+These are read|-|only:
+
+\startthreecolumns
+\starttyping
+tex.pagedepth
+tex.pagefilllstretch
+tex.pagefillstretch
+tex.pagefilstretch
+tex.pagegoal
+tex.pageshrink
+tex.pagestretch
+tex.pagetotal
+\stoptyping
+\stopthreecolumns
+
+Beware: as with all \LUA\ tables you can add values to them. So, the following is
+valid:
+
+\starttyping
+tex.foo = 123
+\stoptyping
+
+When you access a \TEX\ parameter a look up takes place. For read||only variables
+that means that you will get something back, but when you set them you create a
+new entry in the table thereby making the original invisible.
+
+There are a few special cases that we make an exception for: \type {prevdepth},
+\type {prevgraf} and \type {spacefactor}. These normally are accessed via the
+\type {tex.nest} table:
+
+\starttyping
+tex.nest[tex.nest.ptr].prevdepth = p
+tex.nest[tex.nest.ptr].spacefactor = s
+\stoptyping
+
+However, the following also works:
+
+\starttyping
+tex.prevdepth = p
+tex.spacefactor = s
+\stoptyping
+
+Keep in mind that when you mess with node lists directly at the \LUA\ end you
+might need to update the top of the nesting stack's \type {prevdepth} explicitly
+as there is no way \LUATEX\ can guess your intentions. By using the accessor in
+the \type {tex} tables, you get and set the values at the top of the nesting
+stack.
+
+\subsubsection{Direction parameters}
+
+The direction parameters are read|-|only and return a \LUA\ string.
+
+\startthreecolumns
+\starttyping
+tex.bodydir
+tex.mathdir
+tex.pagedir
+tex.pardir
+tex.textdir
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Glue parameters}
+
+The glue parameters accept and return a userdata object that represents a \nod {glue_spec} node.
+
+\startthreecolumns
+\starttyping
+tex.abovedisplayshortskip
+tex.abovedisplayskip
+tex.baselineskip
+tex.belowdisplayshortskip
+tex.belowdisplayskip
+tex.leftskip
+tex.lineskip
+tex.parfillskip
+tex.parskip
+tex.rightskip
+tex.spaceskip
+tex.splittopskip
+tex.tabskip
+tex.topskip
+tex.xspaceskip
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Muglue parameters}
+
+All muglue parameters are to be used read|-|only and return a \LUA\ string.
+
+\startthreecolumns
+\starttyping
+tex.medmuskip
+tex.thickmuskip
+tex.thinmuskip
+\stoptyping
+\stopthreecolumns
+
+\subsubsection{Tokenlist parameters}
+
+The tokenlist parameters accept and return \LUA\ strings. \LUA\ strings are
+converted to and from token lists using \prm {the} \prm {toks} style expansion:
+all category codes are either space (10) or other (12). It follows that assigning
+to some of these, like \quote {tex.output}, is actually useless, but it feels bad
+to make exceptions in view of a coming extension that will accept full|-|blown
+token strings.
+
+\startthreecolumns
+\starttyping
+tex.errhelp
+tex.everycr
+tex.everydisplay
+tex.everyeof
+tex.everyhbox
+tex.everyjob
+tex.everymath
+tex.everypar
+tex.everyvbox
+tex.output
+\stoptyping
+\stopthreecolumns
+
+\stopsubsection
+
+\startsubsection[title={Convert commands}]
+
+\topicindex{convert commands}
+
+All \quote {convert} commands are read|-|only and return a \LUA\ string. The
+supported commands at this moment are:
+
+\starttwocolumns
+\starttyping
+tex.eTeXVersion
+tex.eTeXrevision
+tex.formatname
+tex.jobname
+tex.luatexbanner
+tex.luatexrevision
+tex.fontname(number)
+tex.uniformdeviate(number)
+tex.number(number)
+tex.romannumeral(number)
+tex.fontidentifier(number)
+\stoptyping
+\stoptwocolumns
+
+If you are wondering why this list looks haphazard; these are all the cases of
+the \quote {convert} internal command that do not require an argument, as well as
+the ones that require only a simple numeric value. The special (\LUA|-|only) case
+of \type {tex.fontidentifier} returns the \type {csname} string that matches a
+font id number (if there is one).
+
+\stopsubsection
+
+\startsubsection[title={Last item commands}]
+
+\topicindex{last items}
+
+All \quote {last item} commands are read|-|only and return a number. The
+supported commands at this moment are:
+
+\startthreecolumns
+\starttyping
+tex.lastpenalty
+tex.lastkern
+tex.lastskip
+tex.lastnodetype
+tex.inputlineno
+tex.lastxpos
+tex.lastypos
+tex.randomseed
+tex.luatexversion
+tex.eTeXminorversion
+tex.eTeXversion
+tex.currentgrouplevel
+tex.currentgrouptype
+tex.currentiflevel
+tex.currentiftype
+tex.currentifbranch
+\stoptyping
+\stopthreecolumns
+
+\stopsubsection
+
+\startsubsection[title={Accessing registers: \type {set*}, \type {get*} and \type {is*}}]
+
+\topicindex{attributes}
+\topicindex{registers}
+
+\libindex{attribute} \libindex{setattribute} \libindex{getattribute} \libindex{isattribute}
+\libindex{count} \libindex{setcount} \libindex{getcount} \libindex{iscount}
+\libindex{dimen} \libindex{setdimen} \libindex{getdimen} \libindex{isdimen}
+\libindex{skip} \libindex{setskip} \libindex{getskip} \libindex{isskip}
+\libindex{muskip} \libindex{setmuskip} \libindex{getmuskip} \libindex{ismuskip}
+\libindex{glue} \libindex{setglue} \libindex{getglue} \libindex{isglue}
+\libindex{muglue} \libindex{setmuglue} \libindex{getmuglue} \libindex{ismuglue}
+\libindex{toks} \libindex{settoks} \libindex{gettoks} \libindex{istoks}
+\libindex{box} \libindex{setbox} \libindex{getbox} \libindex{isbox}
+
+\libindex{scantoks}
+
+\TEX's attributes (\lpr {attribute}), counters (\prm {count}), dimensions (\prm
+{dimen}), skips (\prm {skip}, \prm {muskip}) and token (\prm {toks}) registers
+can be accessed and written to using two times five virtual sub|-|tables of the
+\type {tex} table:
+
+\startthreecolumns
+\starttyping
+tex.attribute
+tex.count
+tex.dimen
+tex.skip
+tex.glue
+tex.muskip
+tex.muglue
+tex.toks
+\stoptyping
+\stopthreecolumns
+
+It is possible to use the names of relevant \lpr {attributedef}, \prm {countdef},
+\prm {dimendef}, \prm {skipdef}, or \prm {toksdef} control sequences as indices
+to these tables:
+
+\starttyping
+tex.count.scratchcounter = 0
+enormous = tex.dimen['maxdimen']
+\stoptyping
+
+In this case, \LUATEX\ looks up the value for you on the fly. You have to use a
+valid \prm {countdef} (or \lpr {attributedef}, or \prm {dimendef}, or \prm
+{skipdef}, or \prm {toksdef}), anything else will generate an error (the intent
+is to eventually also allow \type {<chardef tokens>} and even macros that expand
+into a number).
+
+\startitemize
+
+ \startitem
+ The count registers accept and return \LUA\ numbers.
+ \stopitem
+
+ \startitem
+ The dimension registers accept \LUA\ numbers (in scaled points) or
+ strings (with an included absolute dimension; \type {em} and \type {ex}
+ and \type {px} are forbidden). The result is always a number in scaled
+ points.
+ \stopitem
+
+ \startitem
+ The token registers accept and return \LUA\ strings. \LUA\ strings are
+ converted to and from token lists using \prm {the} \prm {toks} style
+ expansion: all category codes are either space (10) or other (12).
+ \stopitem
+
+ \startitem
+ The skip registers accept and return \nod {glue_spec} userdata node
+ objects (see the description of the node interface elsewhere in this
+ manual).
+ \stopitem
+
+ \startitem
+ The glue registers are just skip registers but instead of userdata
+ are verbose.
+ \stopitem
+
+ \startitem
+ Like the counts, the attribute registers accept and return \LUA\ numbers.
+ \stopitem
+
+\stopitemize
+
+As an alternative to array addressing, there are also accessor functions defined
+for all cases, for example, here is the set of possibilities for \prm {skip}
+registers:
+
+\startfunctioncall
+tex.setskip (["global",] <number> n, <node> s)
+tex.setskip (["global",] <string> s, <node> s)
+<node> s = tex.getskip (<number> n)
+<node> s = tex.getskip (<string> s)
+\stopfunctioncall
+
+We have similar setters for \type {count}, \type {dimen}, \type {muskip}, and
+\type {toks}. Counters and dimen are represented by numbers, skips and muskips by
+nodes, and toks by strings.
+
+Again the glue variants are not using the \nod {glue-spec} userdata nodes. The
+\type {setglue} function accepts upto 5 arguments: width, stretch, shrink,
+stretch order and shrink order and the \type {getglue} function reports them,
+unless the second argument is \type {false} in which care only the width is
+returned.
+
+Here is an example usign a threesome:
+
+\startfunctioncall
+local d = tex.getdimen("foo")
+if tex.isdimen("bar") then
+ tex.setdimen("bar",d)
+end
+\stopfunctioncall
+
+There are six extra skip (glue) related helpers:
+
+\startfunctioncall
+tex.setglue (["global"], <number> n,
+ width, stretch, shrink, stretch_order, shrink_order)
+tex.setglue (["global"], <string> s,
+ width, stretch, shrink, stretch_order, shrink_order)
+width, stretch, shrink, stretch_order, shrink_order =
+ tex.getglue (<number> n)
+width, stretch, shrink, stretch_order, shrink_order =
+ tex.getglue (<string> s)
+\stopfunctioncall
+
+The other two are \type {tex.setmuglue} and \type {tex.getmuglue}.
+
+There are such helpers for \type {dimen}, \type {count}, \type {skip}, \type
+{muskip}, \type {box} and \type {attribute} registers but the glue ones
+are special because they have to deal with more properties.
+
+As with the general \type {get} and \type {set} function discussed before, for
+the skip registers \type {getskip} returns a node and \type {getglue} returns
+numbers, while \type {setskip} accepts a node and \type {setglue} expects upto 5
+numbers. Again, when you pass \type {false} as second argument to \type {getglue}
+you only get the width returned. The same is true for the \type {mu} variants
+\type {getmuskip}, \type {setmuskip}, \type {getmuskip} and\type {setmuskip}.
+
+For tokens registers we have an alternative where a catcode table is specified:
+
+\startfunctioncall
+tex.scantoks(0,3,"$e=mc^2$")
+tex.scantoks("global",0,"$\int\limits^1_2$")
+\stopfunctioncall
+
+In the function-based interface, it is possible to define values globally by
+using the string \type {global} as the first function argument.
+
+\stopsubsection
+
+\startsubsection[title={Character code registers: \type {[get|set]*code[s]}}]
+
+\topicindex{characters+codes}
+
+\libindex{lccode} \libindex{setlccode} \libindex{getlccode}
+\libindex{uccode} \libindex{setuccode} \libindex{getuccode}
+\libindex{sfcode} \libindex{setsfcode} \libindex{getsfcode}
+\libindex{catcode} \libindex{setcatcode} \libindex{getcatcode}
+\libindex{mathcode} \libindex{setmathcode} \libindex{getmathcode}
+\libindex{delcode} \libindex{setdelcode} \libindex{getdelcode}
+
+\libindex{setdelcodes} \libindex{getdelcodes}
+\libindex{setmathcodes} \libindex{getmathcodes}
+
+\TEX's character code tables (\prm {lccode}, \prm {uccode}, \prm {sfcode}, \prm
+{catcode}, \prm {mathcode}, \prm {delcode}) can be accessed and written to using
+six virtual subtables of the \type {tex} table
+
+\startthreecolumns
+\starttyping
+tex.lccode
+tex.uccode
+tex.sfcode
+tex.catcode
+tex.mathcode
+tex.delcode
+\stoptyping
+\stopthreecolumns
+
+The function call interfaces are roughly as above, but there are a few twists.
+\type {sfcode}s are the simple ones:
+
+\startfunctioncall
+tex.setsfcode (["global",] <number> n, <number> s)
+<number> s = tex.getsfcode (<number> n)
+\stopfunctioncall
+
+The function call interface for \type {lccode} and \type {uccode} additionally
+allows you to set the associated sibling at the same time:
+
+\startfunctioncall
+tex.setlccode (["global"], <number> n, <number> lc)
+tex.setlccode (["global"], <number> n, <number> lc, <number> uc)
+<number> lc = tex.getlccode (<number> n)
+tex.setuccode (["global"], <number> n, <number> uc)
+tex.setuccode (["global"], <number> n, <number> uc, <number> lc)
+<number> uc = tex.getuccode (<number> n)
+\stopfunctioncall
+
+The function call interface for \type {catcode} also allows you to specify a
+category table to use on assignment or on query (default in both cases is the
+current one):
+
+\startfunctioncall
+tex.setcatcode (["global"], <number> n, <number> c)
+tex.setcatcode (["global"], <number> cattable, <number> n, <number> c)
+<number> lc = tex.getcatcode (<number> n)
+<number> lc = tex.getcatcode (<number> cattable, <number> n)
+\stopfunctioncall
+
+The interfaces for \type {delcode} and \type {mathcode} use small array tables to
+set and retrieve values:
+
+\startfunctioncall
+tex.setmathcode (["global"], <number> n, <table> mval )
+<table> mval = tex.getmathcode (<number> n)
+tex.setdelcode (["global"], <number> n, <table> dval )
+<table> dval = tex.getdelcode (<number> n)
+\stopfunctioncall
+
+Where the table for \type {mathcode} is an array of 3 numbers, like this:
+
+\starttyping
+{
+ <number> class,
+ <number> family,
+ <number> character
+}
+\stoptyping
+
+And the table for \type {delcode} is an array with 4 numbers, like this:
+
+\starttyping
+{
+ <number> small_fam,
+ <number> small_char,
+ <number> large_fam,
+ <number> large_char
+}
+\stoptyping
+
+You can also avoid the table:
+
+\startfunctioncall
+tex.setmathcode (["global"], <number> n, <number> class,
+ <number> family, <number> character)
+class, family, char =
+ tex.getmathcodes (<number> n)
+tex.setdelcode (["global"], <number> n, <number> smallfam,
+ <number> smallchar, <number> largefam, <number> largechar)
+smallfam, smallchar, largefam, largechar =
+ tex.getdelcodes (<number> n)
+\stopfunctioncall
+
+Normally, the third and fourth values in a delimiter code assignment will be zero
+according to \lpr {Udelcode} usage, but the returned table can have values there
+(if the delimiter code was set using \prm {delcode}, for example). Unset \type
+{delcode}'s can be recognized because \type {dval[1]} is $-1$.
+
+\stopsubsection
+
+\startsubsection[title={Box registers: \type {[get|set]box}}]
+
+\topicindex{registers}
+\topicindex{boxes}
+
+\libindex{box}
+\libindex{setbox} \libindex{getbox}
+
+It is possible to set and query actual boxes, coming for instance from \prm
+{hbox}, \prm {vbox} or \prm {vtop}, using the node interface as defined in the
+\type {node} library:
+
+\starttyping
+tex.box
+\stoptyping
+
+for array access, or
+
+\starttyping
+tex.setbox(["global",] <number> n, <node> s)
+tex.setbox(["global",] <string> cs, <node> s)
+<node> n = tex.getbox(<number> n)
+<node> n = tex.getbox(<string> cs)
+\stoptyping
+
+for function|-|based access. In the function-based interface, it is possible to
+define values globally by using the string \type {global} as the first function
+argument.
+
+Be warned that an assignment like
+
+\starttyping
+tex.box[0] = tex.box[2]
+\stoptyping
+
+does not copy the node list, it just duplicates a node pointer. If \type {\box2}
+will be cleared by \TEX\ commands later on, the contents of \type {\box0} becomes
+invalid as well. To prevent this from happening, always use \type
+{node.copy_list} unless you are assigning to a temporary variable:
+
+\starttyping
+tex.box[0] = node.copy_list(tex.box[2])
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={Reusing boxes: \type {[use|save]boxresource} and \type {getboxresourcedimensions}}]
+
+\topicindex{boxes+reuse}
+
+\libindex{useboxresource}
+\libindex{saveboxresource}
+\libindex{getboxresourcedimensions}
+
+The following function will register a box for reuse (this is modelled after so
+called xforms in \PDF). You can (re)use the box with \lpr {useboxresource} or
+by creating a rule node with subtype~2.
+
+\starttyping
+local index = tex.saveboxresource(n,attributes,resources,immediate,type,margin)
+\stoptyping
+
+The optional second and third arguments are strings, the fourth is a boolean. The
+fifth argument is a type. When set to non|-|zero the \type {/Type} entry is
+omitted. A value of 1 or 3 still writes a \type {/BBox}, while 2 or 3 will write
+a \type {/Matrix}. The sixth argument is the (virtual) margin that extends beyond
+the effective boundingbox as seen by \TEX. Instead of a box number one can also
+pass a \type {[h|v]list} node.
+
+You can generate the reference (a rule type) with:
+
+\starttyping
+local reused = tex.useboxresource(n,wd,ht,dp)
+\stoptyping
+
+The dimensions are optional and the final ones are returned as extra values. The
+following is just a bonus (no dimensions returned means that the resource is
+unknown):
+
+\starttyping
+local w, h, d, m = tex.getboxresourcedimensions(n)
+\stoptyping
+
+This returns the width, height, depth and margin of the resource.
+
+\stopsubsection
+
+\startsubsection[title={\type {triggerbuildpage}}]
+
+\topicindex{pages}
+
+\libindex{triggerbuildpage}
+
+You should not expect to much from the \type {triggerbuildpage} helpers because
+often \TEX\ doesn't do much if it thinks nothing has to be done, but it might be
+useful for some applications. It just does as it says it calls the internal
+function that build a page, given that there is something to build.
+
+\stopsubsection
+
+\startsubsection[title={\type {splitbox}}]
+
+\topicindex{boxes+split}
+
+\libindex{splitbox}
+
+You can split a box:
+
+\starttyping
+local vlist = tex.splitbox(n,height,mode)
+\stoptyping
+
+The remainder is kept in the original box and a packaged vlist is returned. This
+operation is comparable to the \prm {vsplit} operation. The mode can be \type
+{additional} or \type {exactly} and concerns the split off box.
+
+\stopsubsection
+
+\startsubsection[title={Accessing math parameters: \type {[get|set]math}}]
+
+\topicindex{math+parameters}
+\topicindex{parameters+math}
+
+\libindex{setmath}
+\libindex{getmath}
+
+It is possible to set and query the internal math parameters using:
+
+\startfunctioncall
+tex.setmath(["global",] <string> n, <string> t, <number> n)
+<number> n = tex.getmath(<string> n, <string> t)
+\stopfunctioncall
+
+As before an optional first parameter \type {global} indicates a global
+assignment.
+
+The first string is the parameter name minus the leading \quote {Umath}, and the
+second string is the style name minus the trailing \quote {style}. Just to be
+complete, the values for the math parameter name are:
+
+\starttyping
+quad axis operatorsize
+overbarkern overbarrule overbarvgap
+underbarkern underbarrule underbarvgap
+radicalkern radicalrule radicalvgap
+radicaldegreebefore radicaldegreeafter radicaldegreeraise
+stackvgap stacknumup stackdenomdown
+fractionrule fractionnumvgap fractionnumup
+fractiondenomvgap fractiondenomdown fractiondelsize
+limitabovevgap limitabovebgap limitabovekern
+limitbelowvgap limitbelowbgap limitbelowkern
+underdelimitervgap underdelimiterbgap
+overdelimitervgap overdelimiterbgap
+subshiftdrop supshiftdrop subshiftdown
+subsupshiftdown subtopmax supshiftup
+supbottommin supsubbottommax subsupvgap
+spaceafterscript connectoroverlapmin
+ordordspacing ordopspacing ordbinspacing ordrelspacing
+ordopenspacing ordclosespacing ordpunctspacing ordinnerspacing
+opordspacing opopspacing opbinspacing oprelspacing
+opopenspacing opclosespacing oppunctspacing opinnerspacing
+binordspacing binopspacing binbinspacing binrelspacing
+binopenspacing binclosespacing binpunctspacing bininnerspacing
+relordspacing relopspacing relbinspacing relrelspacing
+relopenspacing relclosespacing relpunctspacing relinnerspacing
+openordspacing openopspacing openbinspacing openrelspacing
+openopenspacing openclosespacing openpunctspacing openinnerspacing
+closeordspacing closeopspacing closebinspacing closerelspacing
+closeopenspacing closeclosespacing closepunctspacing closeinnerspacing
+punctordspacing punctopspacing punctbinspacing punctrelspacing
+punctopenspacing punctclosespacing punctpunctspacing punctinnerspacing
+innerordspacing inneropspacing innerbinspacing innerrelspacing
+inneropenspacing innerclosespacing innerpunctspacing innerinnerspacing
+\stoptyping
+
+The values for the style parameter are:
+
+\starttyping
+display crampeddisplay
+text crampedtext
+script crampedscript
+scriptscript crampedscriptscript
+\stoptyping
+
+The value is either a number (representing a dimension or number) or a glue spec
+node representing a muskip for \type {ordordspacing} and similar spacing
+parameters.
+
+\stopsubsection
+
+\startsubsection[title={Special list heads: \type {[get|set]list}}]
+
+\topicindex{lists}
+
+\libindex{lists}
+\libindex{setlist}
+\libindex{getlist}
+
+The virtual table \type {tex.lists} contains the set of internal registers that
+keep track of building page lists.
+
+\starttabulate[|l|p|]
+\DB field \BC explanation \NC \NR
+\TB
+\NC \type{page_ins_head} \NC circular list of pending insertions \NC \NR
+\NC \type{contrib_head} \NC the recent contributions \NC \NR
+\NC \type{page_head} \NC the current page content \NC \NR
+%NC \type{temp_head} \NC \NC \NR
+\NC \type{hold_head} \NC used for held-over items for next page \NC \NR
+\NC \type{adjust_head} \NC head of the current \prm {vadjust} list \NC \NR
+\NC \type{pre_adjust_head} \NC head of the current \type {\vadjust pre} list \NC \NR
+%NC \type{align_head} \NC \NC \NR
+\NC \type{page_discards_head} \NC head of the discarded items of a page break \NC \NR
+\NC \type{split_discards_head} \NC head of the discarded items in a vsplit \NC \NR
+\LL
+\stoptabulate
+
+The getter and setter functions are \type {getlist} and \type {setlist}. You have
+to be careful with what you set as \TEX\ can have expectations with regards to
+how a list is constructed or in what state it is.
+
+\stopsubsection
+
+\startsubsection[title={Semantic nest levels: \type {getnest} and \type {ptr}}]
+
+\topicindex{nesting}
+
+\libindex{nest}
+\libindex{ptr}
+%libindex{setnest} % only a message
+\libindex{getnest}
+
+The virtual table \type {nest} contains the currently active semantic nesting
+state. It has two main parts: a zero-based array of userdata for the semantic
+nest itself, and the numerical value \type {ptr}, which gives the highest
+available index. Neither the array items in \type {nest[]} nor \type {ptr} can be
+assigned to (as this would confuse the typesetting engine beyond repair), but you
+can assign to the individual values inside the array items, e.g.\ \type
+{tex.nest[tex.nest.ptr].prevdepth}.
+
+\type {tex.nest[tex.nest.ptr]} is the current nest state, \type {nest[0]} the
+outermost (main vertical list) level. The getter function is \type {getnest}. You
+can pass a number (which gives you a list), nothing or \type {top}, which returns
+the topmost list, or the string \type {ptr} which gives you the index of the
+topmost list.
+
+The known fields are:
+
+\starttabulate[|l|l|l|p|]
+\DB key \BC type \BC modes \BC explanation \NC \NR
+\TB
+\NC \type{mode} \NC number \NC all \NC a string:
+ \type {none} (this happens during \prm {write}),
+ \type {vmode}, \type {hmode}, \type {displaymath},
+ \type {innervmode}, \type {innerhmode}, \type {inlinemath};
+ these fields cannot be set \NC \NR
+\NC \type{modeline} \NC number \NC all \NC source input line where this mode was entered in,
+ negative inside the output routine \NC \NR
+\NC \type{head} \NC node \NC all \NC the head of the current list \NC \NR
+\NC \type{tail} \NC node \NC all \NC the tail of the current list \NC \NR
+\NC \type{prevgraf} \NC number \NC vmode \NC number of lines in the previous paragraph \NC \NR
+\NC \type{prevdepth} \NC number \NC vmode \NC depth of the previous paragraph \NC \NR
+\NC \type{spacefactor} \NC number \NC hmode \NC the current space factor \NC \NR
+\NC \type{dirs} \NC node \NC hmode \NC used for temporary storage by the line break algorithm\NC \NR
+\NC \type{noad} \NC node \NC mmode \NC used for temporary storage of a pending fraction numerator,
+ for \prm {over} etc. \NC \NR
+\NC \type{delimptr} \NC node \NC mmode \NC used for temporary storage of the previous math delimiter,
+ for \prm {middle} \NC \NR
+\NC \type{mathdir} \NC boolean \NC mmode \NC true when during math processing the \lpr {mathdir} is not
+ the same as the surrounding \lpr {textdir} \NC \NR
+\NC \type{mathstyle} \NC number \NC mmode \NC the current \lpr {mathstyle} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[reference=sec:luaprint,title={Print functions}]
+
+\topicindex{printing}
+
+The \type {tex} table also contains the three print functions that are the major
+interface from \LUA\ scripting to \TEX. The arguments to these three functions
+are all stored in an in|-|memory virtual file that is fed to the \TEX\ scanner as
+the result of the expansion of \prm {directlua}.
+
+The total amount of returnable text from a \prm {directlua} command is only
+limited by available system \RAM. However, each separate printed string has to
+fit completely in \TEX's input buffer. The result of using these functions from
+inside callbacks is undefined at the moment.
+
+\subsubsection{\type {print}}
+
+\libindex{print}
+
+\startfunctioncall
+tex.print(<string> s, ...)
+tex.print(<number> n, <string> s, ...)
+tex.print(<table> t)
+tex.print(<number> n, <table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a separate input line. If there is a
+table argument instead of a list of strings, this has to be a consecutive array
+of strings to print (the first non-string value will stop the printing process).
+
+The optional parameter can be used to print the strings using the catcode regime
+defined by \lpr {catcodetable}~\type {n}. If \type {n} is $-1$, the currently
+active catcode regime is used. If \type {n} is $-2$, the resulting catcodes are
+the result of \prm {the} \prm {toks}: all category codes are 12 (other) except for
+the space character, that has category code 10 (space). Otherwise, if \type {n}
+is not a valid catcode table, then it is ignored, and the currently active
+catcode regime is used instead.
+
+The very last string of the very last \type {tex.print} command in a \prm
+{directlua} will not have the \prm {endlinechar} appended, all others do.
+
+\subsubsection{\type {sprint}}
+
+\libindex{sprint}
+
+\startfunctioncall
+tex.sprint(<string> s, ...)
+tex.sprint(<number> n, <string> s, ...)
+tex.sprint(<table> t)
+tex.sprint(<number> n, <table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a special kind of input line that
+makes it suitable for use as a partial line input mechanism:
+
+\startitemize[packed]
+\startitem
+ \TEX\ does not switch to the \quote {new line} state, so that leading spaces
+ are not ignored.
+\stopitem
+\startitem
+ No \prm {endlinechar} is inserted.
+\stopitem
+\startitem
+ Trailing spaces are not removed. Note that this does not prevent \TEX\ itself
+ from eating spaces as result of interpreting the line. For example, in
+
+ \starttyping
+ before\directlua{tex.sprint("\\relax")tex.sprint(" inbetween")}after
+ \stoptyping
+
+ the space before \type {in between} will be gobbled as a result of the \quote
+ {normal} scanning of \prm {relax}.
+\stopitem
+\stopitemize
+
+If there is a table argument instead of a list of strings, this has to be a
+consecutive array of strings to print (the first non-string value will stop the
+printing process).
+
+The optional argument sets the catcode regime, as with \type {tex.print}. This
+influences the string arguments (or numbers turned into strings).
+
+Although this needs to be used with care, you can also pass token or node
+userdata objects. These get injected into the stream. Tokens had best be valid
+tokens, while nodes need to be around when they get injected. Therefore it is
+important to realize the following:
+
+\startitemize
+\startitem
+ When you inject a token, you need to pass a valid token userdata object. This
+ object will be collected by \LUA\ when it no longer is referenced. When it gets
+ printed to \TEX\ the token itself gets copied so there is no interference with the
+ \LUA\ garbage collection. You manage the object yourself. Because tokens are
+ actually just numbers, there is no real extra overhead at the \TEX\ end.
+\stopitem
+\startitem
+ When you inject a node, you need to pass a valid node userdata object. The
+ node related to the object will not be collected by \LUA\ when it no longer
+ is referenced. It lives on at the \TEX\ end in its own memory space. When it
+ gets printed to \TEX\ the node reference is used assuming that node stays
+ around. There is no \LUA\ garbage collection involved. Again, you manage the
+ object yourself. The node itself is freed when \TEX\ is done with it.
+\stopitem
+\stopitemize
+
+If you consider the last remark you might realize that we have a problem when a
+printed mix of strings, tokens and nodes is reused. Inside \TEX\ the sequence
+becomes a linked list of input buffers. So, \type {"123"} or \type {"\foo{123}"}
+gets read and parsed on the fly, while \typ {<token userdata>} already is
+tokenized and effectively is a token list now. A \typ {<node userdata>} is also
+tokenized into a token list but it has a reference to a real node. Normally this
+goes fine. But now assume that you store the whole lot in a macro: in that case
+the tokenized node can be flushed many times. But, after the first such flush the
+node is used and its memory freed. You can prevent this by using copies which is
+controlled by setting \lpr {luacopyinputnodes} to a non|-|zero value. This is one
+of these fuzzy areas you have to live with if you really mess with these low
+level issues.
+
+\subsubsection{\type {tprint}}
+
+\libindex{tprint}
+
+\startfunctioncall
+tex.tprint({<number> n, <string> s, ...}, {...})
+\stopfunctioncall
+
+This function is basically a shortcut for repeated calls to \type
+{tex.sprint(<number> n, <string> s, ...)}, once for each of the supplied argument
+tables.
+
+\subsubsection{\type {cprint}}
+
+\libindex{cprint}
+
+This function takes a number indicating the to be used catcode, plus either a
+table of strings or an argument list of strings that will be pushed into the
+input stream.
+
+\startfunctioncall
+tex.cprint( 1," 1: $&{\\foo}") tex.print("\\par") -- a lot of \bgroup s
+tex.cprint( 2," 2: $&{\\foo}") tex.print("\\par") -- matching \egroup s
+tex.cprint( 9," 9: $&{\\foo}") tex.print("\\par") -- all get ignored
+tex.cprint(10,"10: $&{\\foo}") tex.print("\\par") -- all become spaces
+tex.cprint(11,"11: $&{\\foo}") tex.print("\\par") -- letters
+tex.cprint(12,"12: $&{\\foo}") tex.print("\\par") -- other characters
+tex.cprint(14,"12: $&{\\foo}") tex.print("\\par") -- comment triggers
+\stopfunctioncall
+
+% \subsubsection{\type {write}, \type {twrite}, \type {nwrite}}
+\subsubsection{\type {write}}
+
+\libindex{write}
+% \libindex{twrite}
+% \libindex{nwrite}
+
+\startfunctioncall
+tex.write(<string> s, ...)
+tex.write(<table> t)
+\stopfunctioncall
+
+Each string argument is treated by \TEX\ as a special kind of input line that
+makes it suitable for use as a quick way to dump information:
+
+\startitemize
+\item All catcodes on that line are either \quote{space} (for '~') or \quote
+ {character} (for all others).
+\item There is no \prm {endlinechar} appended.
+\stopitemize
+
+If there is a table argument instead of a list of strings, this has to be a
+consecutive array of strings to print (the first non-string value will stop the
+printing process).
+
+% The functions \type {twrite} and \type {nwrite} can be used to write a token or
+% node back to \TEX\, possibly intermixed with regular strings that will be
+% tokenized. You have to make sure that you pass the right data because sometimes
+% \TEX\ has expectations that need to be met.
+
+\stopsubsection
+
+\startsubsection[title={Helper functions}]
+
+\subsubsection{\type {round}}
+
+\topicindex {helpers}
+
+\libindex{round}
+
+\startfunctioncall
+<number> n = tex.round(<number> o)
+\stopfunctioncall
+
+Rounds \LUA\ number \type {o}, and returns a number that is in the range of a
+valid \TEX\ register value. If the number starts out of range, it generates a
+\quote {number too big} error as well.
+
+\subsubsection{\type {scale}}
+
+\libindex{scale}
+
+\startfunctioncall
+<number> n = tex.scale(<number> o, <number> delta)
+<table> n = tex.scale(table o, <number> delta)
+\stopfunctioncall
+
+Multiplies the \LUA\ numbers \type {o} and \nod {delta}, and returns a rounded
+number that is in the range of a valid \TEX\ register value. In the table
+version, it creates a copy of the table with all numeric top||level values scaled
+in that manner. If the multiplied number(s) are of range, it generates
+\quote{number too big} error(s) as well.
+
+Note: the precision of the output of this function will depend on your computer's
+architecture and operating system, so use with care! An interface to \LUATEX's
+internal, 100\% portable scale function will be added at a later date.
+
+\subsubsection{\type {number} and \type {romannumeral}}
+
+\libindex{number}
+\libindex{romannumeral}
+
+These are the companions to the primitives \prm {number} and \prm
+{romannumeral}. They can be used like:
+
+\startfunctioncall
+tex.print(tex.romannumeral(123))
+\stopfunctioncall
+
+\subsubsection{\type {fontidentifier} and \type {fontname}}
+
+\libindex{fontidentifier}
+\libindex{fontname}
+
+The first one returns the name only, the second one reports the size too.
+
+\startfunctioncall
+tex.print(tex.fontname(tex.fontname))
+tex.print(tex.fontname(tex.fontidentidier))
+\stopfunctioncall
+
+\subsubsection{\type {sp}}
+
+\libindex{sp}
+
+\startfunctioncall
+<number> n = tex.sp(<number> o)
+<number> n = tex.sp(<string> s)
+\stopfunctioncall
+
+Converts the number \type {o} or a string \type {s} that represents an explicit
+dimension into an integer number of scaled points.
+
+For parsing the string, the same scanning and conversion rules are used that
+\LUATEX\ would use if it was scanning a dimension specifier in its \TEX|-|like
+input language (this includes generating errors for bad values), expect for the
+following:
+
+\startitemize[n]
+\startitem
+ only explicit values are allowed, control sequences are not handled
+\stopitem
+\startitem
+ infinite dimension units (\type {fil...}) are forbidden
+\stopitem
+\startitem
+ \type {mu} units do not generate an error (but may not be useful either)
+\stopitem
+\stopitemize
+
+\subsubsection{\type {tex.getlinenumber} and \type {tex.setlinenumber}}
+
+\libindex{getlinenumber}
+\libindex{setlinenumber}
+
+You can mess with the current line number:
+
+\startfunctioncall
+local n = tex.getlinenumber()
+tex.setlinenumber(n+10)
+\stopfunctioncall
+
+which can be shortcut to:
+
+\startfunctioncall
+tex.setlinenumber(10,true)
+\stopfunctioncall
+
+This might be handy when you have a callback that read numbers from a file and
+combines them in one line (in which case an error message probably has to refer
+to the original line). Interference with \TEX's internal handling of numbers is
+of course possible.
+
+\subsubsection{\type {error} and \type {show_context}}
+
+\topicindex{errors}
+
+\libindex{error}
+\libindex{show_context}
+
+\startfunctioncall
+tex.error(<string> s)
+tex.error(<string> s, <table> help)
+\stopfunctioncall
+
+This creates an error somewhat like the combination of \prm {errhelp} and \prm
+{errmessage} would. During this error, deletions are disabled.
+
+The array part of the \type {help} table has to contain strings, one for each
+line of error help.
+
+In case of an error the \type {show_context} function will show the current
+context where we're at (in the expansion).
+
+\subsubsection{\type {run}, \type {finish}}
+
+\libindex{run}
+\libindex{finish}
+
+These two functions start the interpretations and force its end. A runs normally
+boils down to \TEX\ entering the so called main loop. A token is fetched and
+depending on it current meaning some actions takes place. Sometimes that actions
+comes immediately, sometimes more scanning is needed. Quite often tokens get
+pushed back into the input. This all means that the \TEX\ scanner is constantly
+pushing and popping input states, but in the end after all the action is done
+returns to the main loop.
+
+\subsubsection{\type {runtoks}}
+
+Because of the fact that \TEX\ is in a complex dance of expanding, dealing with
+fonts, typesetting paragraphs, messing around with boxes, building pages, and so
+on, you cannot easily run a nested \TEX\ run (read nested main loop). However,
+there is an option to force a local run with \type {runtoks}. The content of the
+given token list register gets expanded locally after which we return to where we
+triggered this expansion, at the \LUA\ end. Instead a function can get passed
+that does some work. You have to make sure that at the end \TEX\ is in a sane
+state and this is not always trivial. A more complex mechanism would complicate
+\TEX\ itself (and probably also harm performance) so this simple local expansion
+loop has to do.
+
+\startfunctioncall
+tex.runtoks(<token register>)
+tex.runtoks(<lua function>)
+\stopfunctioncall
+
+When the \prm {tracingnesting} parameter is set to a value larger than~2 some
+information is reported about the state of the local loop.
+
+\subsubsection{\type {forcehmode}}
+
+\libindex{forcehmode}
+
+An example of a (possible error triggering) complication is that \TEX\ expects to
+be in some state, say horizontal mode, and you have to make sure it is when you
+start feeding back something from \LUA\ into \TEX. Normally a user will not run
+into issues but when you start writing tokens or nodes or have a nested run there
+can be situations that you need to run \type {forcehmode}. There is no recipe for
+this and intercepting possible cases would weaken \LUATEX's flexibility.
+
+\subsubsection{\type {hashtokens}}
+
+\libindex{hashtokens}
+
+\topicindex{hash}
+
+\startfunctioncall
+for i,v in pairs (tex.hashtokens()) do ... end
+\stopfunctioncall
+
+Returns a list of names. This can be useful for debugging, but note that this
+also reports control sequences that may be unreachable at this moment due to
+local redefinitions: it is strictly a dump of the hash table. You can use \type
+{token.create} to inspect properties, for instance when the \type {command} key
+in a created table equals \type {123}, you have the \type {cmdname} value \type
+{undefined_cs}.
+
+\subsubsection{\type {definefont}}
+
+\topicindex{fonts+defining}
+
+\libindex{definefont}
+
+\startfunctioncall
+tex.definefont(<string> csname, <number> fontid)
+tex.definefont(<boolean> global, <string> csname, <number> fontid)
+\stopfunctioncall
+
+Associates \type {csname} with the internal font number \type {fontid}. The
+definition is global if (and only if) \type {global} is specified and true (the
+setting of \type {globaldefs} is not taken into account).
+
+\stopsubsection
+
+\startsubsection[reference=luaprimitives,title={Functions for dealing with primitives}]
+
+\subsubsection{\type {enableprimitives}}
+
+\libindex{enableprimitives}
+
+\topicindex{initialization}
+\topicindex{primitives}
+
+\startfunctioncall
+tex.enableprimitives(<string> prefix, <table> primitive names)
+\stopfunctioncall
+
+This function accepts a prefix string and an array of primitive names. For each
+combination of \quote {prefix} and \quote {name}, the \type
+{tex.enableprimitives} first verifies that \quote {name} is an actual primitive
+(it must be returned by one of the \type {tex.extraprimitives} calls explained
+below, or part of \TEX82, or \prm {directlua}). If it is not, \type
+{tex.enableprimitives} does nothing and skips to the next pair.
+
+But if it is, then it will construct a csname variable by concatenating the
+\quote {prefix} and \quote {name}, unless the \quote {prefix} is already the
+actual prefix of \quote {name}. In the latter case, it will discard the \quote
+{prefix}, and just use \quote {name}.
+
+Then it will check for the existence of the constructed csname. If the csname is
+currently undefined (note: that is not the same as \prm {relax}), it will
+globally define the csname to have the meaning: run code belonging to the
+primitive \quote {name}. If for some reason the csname is already defined, it
+does nothing and tries the next pair.
+
+An example:
+
+\starttyping
+tex.enableprimitives('LuaTeX', {'formatname'})
+\stoptyping
+
+will define \type {\LuaTeXformatname} with the same intrinsic meaning as the
+documented primitive \lpr {formatname}, provided that the control sequences \type
+{\LuaTeXformatname} is currently undefined.
+
+When \LUATEX\ is run with \type {--ini} only the \TEX82 primitives and \prm
+{directlua} are available, so no extra primitives {\bf at all}.
+
+If you want to have all the new functionality available using their default
+names, as it is now, you will have to add
+
+\starttyping
+\ifx\directlua\undefined \else
+ \directlua {tex.enableprimitives('',tex.extraprimitives ())}
+\fi
+\stoptyping
+
+near the beginning of your format generation file. Or you can choose different
+prefixes for different subsets, as you see fit.
+
+Calling some form of \type {tex.enableprimitives} is highly important though,
+because if you do not, you will end up with a \TEX82-lookalike that can run \LUA\
+code but not do much else. The defined csnames are (of course) saved in the
+format and will be available at runtime.
+
+\subsubsection{\type {extraprimitives}}
+
+\libindex{extraprimitives}
+
+\startfunctioncall
+<table> t = tex.extraprimitives(<string> s, ...)
+\stopfunctioncall
+
+This function returns a list of the primitives that originate from the engine(s)
+given by the requested string value(s). The possible values and their (current)
+return values are given in the following table. In addition the somewhat special
+primitives \quote{\tex{ }}, \quote{\tex {/}} and \quote{\type {-}} are defined.
+
+\startluacode
+function document.showprimitives(tag)
+ for k, v in table.sortedpairs(tex.extraprimitives(tag)) do
+ if v ~= ' ' and v ~= "/" and v ~= "-" then
+ context.type(v)
+ context.space()
+ end
+ end
+end
+\stopluacode
+
+\starttabulate[|l|pl|]
+\DB name \BC values \NC \NR
+\TB
+\NC tex \NC \ctxlua{document.showprimitives('tex') } \NC \NR
+\NC core \NC \ctxlua{document.showprimitives('core') } \NC \NR
+\NC etex \NC \ctxlua{document.showprimitives('etex') } \NC \NR
+\NC luatex \NC \ctxlua{document.showprimitives('luatex') } \NC \NR
+\LL
+\stoptabulate
+
+Note that \type {luatex} does not contain \type {directlua}, as that is
+considered to be a core primitive, along with all the \TEX82 primitives, so it is
+part of the list that is returned from \type {'core'}.
+
+Running \type {tex.extraprimitives} will give you the complete list of
+primitives \type {-ini} startup. It is exactly equivalent to \type
+{tex.extraprimitives("etex","luatex")}.
+
+\subsubsection{\type {primitives}}
+
+\libindex{primitives}
+
+\startfunctioncall
+<table> t = tex.primitives()
+\stopfunctioncall
+
+This function returns a list of all primitives that \LUATEX\ knows about.
+
+\stopsubsection
+
+\startsubsection[title={Core functionality interfaces}]
+
+\subsubsection{\type {badness}}
+
+\libindex{badness}
+
+\startfunctioncall
+<number> b = tex.badness(<number> t, <number> s)
+\stopfunctioncall
+
+This helper function is useful during linebreak calculations. \type {t} and \type
+{s} are scaled values; the function returns the badness for when total \type {t}
+is supposed to be made from amounts that sum to \type {s}. The returned number is
+a reasonable approximation of \mathematics {100(t/s)^3};
+
+\subsubsection{\type {tex.resetparagraph}}
+
+\topicindex {paragraphs+reset}
+
+\libindex{resetparagraph}
+
+This function resets the parameters that \TEX\ normally resets when a new paragraph
+is seen.
+
+\subsubsection{\type {linebreak}}
+
+\topicindex {linebreaks}
+
+\libindex{linebreak}
+
+\startfunctioncall
+local <node> nodelist, <table> info =
+ tex.linebreak(<node> listhead, <table> parameters)
+\stopfunctioncall
+
+The understood parameters are as follows:
+
+\starttabulate[|l|l|p|]
+\DB name \BC type \BC explanation \NC \NR
+\TB
+\NC \type{pardir} \NC string \NC \NC \NR
+\NC \type{pretolerance} \NC number \NC \NC \NR
+\NC \type{tracingparagraphs} \NC number \NC \NC \NR
+\NC \type{tolerance} \NC number \NC \NC \NR
+\NC \type{looseness} \NC number \NC \NC \NR
+\NC \type{hyphenpenalty} \NC number \NC \NC \NR
+\NC \type{exhyphenpenalty} \NC number \NC \NC \NR
+\NC \type{pdfadjustspacing} \NC number \NC \NC \NR
+\NC \type{adjdemerits} \NC number \NC \NC \NR
+\NC \type{pdfprotrudechars} \NC number \NC \NC \NR
+\NC \type{linepenalty} \NC number \NC \NC \NR
+\NC \type{lastlinefit} \NC number \NC \NC \NR
+\NC \type{doublehyphendemerits} \NC number \NC \NC \NR
+\NC \type{finalhyphendemerits} \NC number \NC \NC \NR
+\NC \type{hangafter} \NC number \NC \NC \NR
+\NC \type{interlinepenalty} \NC number or table \NC if a table, then it is an array like \prm {interlinepenalties} \NC \NR
+\NC \type{clubpenalty} \NC number or table \NC if a table, then it is an array like \prm {clubpenalties} \NC \NR
+\NC \type{widowpenalty} \NC number or table \NC if a table, then it is an array like \prm {widowpenalties} \NC \NR
+\NC \type{brokenpenalty} \NC number \NC \NC \NR
+\NC \type{emergencystretch} \NC number \NC in scaled points \NC \NR
+\NC \type{hangindent} \NC number \NC in scaled points \NC \NR
+\NC \type{hsize} \NC number \NC in scaled points \NC \NR
+\NC \type{leftskip} \NC glue_spec node \NC \NC \NR
+\NC \type{rightskip} \NC glue_spec node \NC \NC \NR
+\NC \type{parshape} \NC table \NC \NC \NR
+\LL
+\stoptabulate
+
+Note that there is no interface for \prm {displaywidowpenalties}, you have to
+pass the right choice for \type {widowpenalties} yourself.
+
+It is your own job to make sure that \type {listhead} is a proper paragraph list:
+this function does not add any nodes to it. To be exact, if you want to replace
+the core line breaking, you may have to do the following (when you are not
+actually working in the \cbk {pre_linebreak_filter} or \cbk {linebreak_filter}
+callbacks, or when the original list starting at listhead was generated in
+horizontal mode):
+
+\startitemize
+\startitem
+ add an \quote {indent box} and perhaps a \nod {local_par} node at the start
+ (only if you need them)
+\stopitem
+\startitem
+ replace any found final glue by an infinite penalty (or add such a penalty,
+ if the last node is not a glue)
+\stopitem
+\startitem
+ add a glue node for the \prm {parfillskip} after that penalty node
+\stopitem
+\startitem
+ make sure all the \type {prev} pointers are OK
+\stopitem
+\stopitemize
+
+The result is a node list, it still needs to be vpacked if you want to assign it
+to a \prm {vbox}. The returned \type {info} table contains four values that are
+all numbers:
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC prevdepth \NC depth of the last line in the broken paragraph \NC \NR
+\NC prevgraf \NC number of lines in the broken paragraph \NC \NR
+\NC looseness \NC the actual looseness value in the broken paragraph \NC \NR
+\NC demerits \NC the total demerits of the chosen solution \NC \NR
+\LL
+\stoptabulate
+
+Note there are a few things you cannot interface using this function: You cannot
+influence font expansion other than via \type {pdfadjustspacing}, because the
+settings for that take place elsewhere. The same is true for hbadness and hfuzz
+etc. All these are in the \type {hpack} routine, and that fetches its own
+variables via globals.
+
+\subsubsection{\type {shipout}}
+
+\topicindex {shipout}
+
+\libindex{shipout}
+
+\startfunctioncall
+tex.shipout(<number> n)
+\stopfunctioncall
+
+Ships out box number \type {n} to the output file, and clears the box register.
+
+\subsubsection{\type {getpagestate}}
+
+\topicindex {pages}
+
+\libindex{getpagestate}
+
+This helper reports the current page state: \type {empty}, \type {box_there} or
+\type {inserts_only} as integer value.
+
+\subsubsection{\type {getlocallevel}}
+
+\topicindex {nesting}
+
+\libindex{getlocallevel}
+
+This integer reports the current level of the local loop. It's only useful for
+debugging and the (relative state) numbers can change with the implementation.
+
+\stopsubsection
+
+\startsubsection[title={Randomizers}]
+
+\libindex{lua_math_random}
+\libindex{lua_math_randomseed}
+\libindex{init_rand}
+\libindex{normal_rand}
+\libindex{uniform_rand}
+\libindex{uniformdeviate}
+
+For practical reasons \LUATEX\ has its own random number generator. The original
+\LUA\ random function is available as \typ {tex.lua_math_random}. You can
+initialize with a new seed with \type {init_rand} (\typ {lua_math_randomseed} is
+equivalent to this one.
+
+There are three generators: \type {normal_rand} (no argument is used), \type
+{uniform_rand} (takes a number that will get rounded before being used) and \type
+{uniformdeviate} which behaves like the primitive and expects a scaled integer, so
+
+\startfunctioncall
+tex.print(tex.uniformdeviate(65536)/65536)
+\stopfunctioncall
+
+will give a random number between zero and one.
+
+\stopsubsection
+
+\startsubsection[reference=synctex,title={Functions related to synctex}]
+
+\topicindex {synctex}
+
+\libindex{set_synctex_mode} \libindex{get_synctex_mode}
+\libindex{set_synctex_no_files}
+\libindex{set_synctex_tag} \libindex{get_synctex_tag} \libindex{force_synctex_tag}
+\libindex{set_synctex_line} \libindex{get_synctex_line} \libindex{force_synctex_line}
+
+The next helpers only make sense when you implement your own synctex logic. Keep in
+mind that the library used in editors assumes a certain logic and is geared for
+plain and \LATEX, so after a decade users expect a certain behaviour.
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC \type{set_synctex_mode} \NC \type {0} is the default and used normal synctex
+ logic, \type {1} uses the values set by the next
+ helpers while \type {2} also sets these for glyph
+ nodes; \type{3} sets glyphs and glue and \type {4}
+ sets only glyphs \NC \NR
+\NC \type{set_synctex_tag} \NC set the current tag (file) value (obeys save stack) \NC \NR
+\NC \type{set_synctex_line} \NC set the current line value (obeys save stack) \NC \NR
+\NC \type{set_synctex_no_files} \NC disable synctex file logging \NC \NR
+\NC \type{get_synctex_mode} \NC returns the current mode (for values see above) \NC \NR
+\NC \type{get_synctex_tag} \NC get the currently set value of tag (file) \NC \NR
+\NC \type{get_synctex_line} \NC get the currently set value of line \NC \NR
+\NC \type{force_synctex_tag} \NC overload the tag (file) value (\type {0} resets) \NC \NR
+\NC \type{force_synctex_line} \NC overload the line value (\type {0} resets) \NC \NR
+\LL
+\stoptabulate
+
+The last one is somewhat special. Due to the way files are registered in \SYNCTEX\ we need
+to explicitly disable that feature if we provide our own alternative if we want to avoid
+that overhead. Passing a value of 1 disables registering.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {texconfig} table},reference=texconfig][library=texconfig]
+
+\topicindex{libraries+\type{texconfig}}
+
+\topicindex {configuration}
+
+This is a table that is created empty. A startup \LUA\ script could
+fill this table with a number of settings that are read out by
+the executable after loading and executing the startup file.
+
+\starttabulate[|l|l|l|p|]
+\DB key \BC type \BC default \BC explanation \NC \NR
+\TB
+\NC \type{kpse_init} \NC boolean \NC true
+\NC
+ \type {false} totally disables \KPATHSEA\ initialisation, and enables
+ interpretation of the following numeric key--value pairs. (only ever unset
+ this if you implement {\it all\/} file find callbacks!)
+\NC \NR
+\NC
+ \type{shell_escape} \NC string \NC \type {'f'} \NC Use \type {'y'} or \type
+ {'t'} or \type {'1'} to enable \type {\write18} unconditionally, \type {'p'}
+ to enable the commands that are listed in \type {shell_escape_commands}
+\NC \NR
+\NC
+ shell_escape_commands \NC string \NC \NC Comma-separated list of command
+ names that may be executed by \type {\write18} even if \type {shell_escape}
+ is set to \type {'p'}. Do {\it not\/} use spaces around commas, separate any
+ required command arguments by using a space, and use the \ASCII\ double quote
+ (\type {"}) for any needed argument or path quoting
+\NC \NR
+\NC \type{string_vacancies} \NC number \NC 75000 \NC cf.\ web2c docs \NC \NR
+\NC \type{pool_free} \NC number \NC 5000 \NC cf.\ web2c docs \NC \NR
+\NC \type{max_strings} \NC number \NC 15000 \NC cf.\ web2c docs \NC \NR
+\NC \type{strings_free} \NC number \NC 100 \NC cf.\ web2c docs \NC \NR
+\NC \type{nest_size} \NC number \NC 50 \NC cf.\ web2c docs \NC \NR
+\NC \type{max_in_open} \NC number \NC 15 \NC cf.\ web2c docs \NC \NR
+\NC \type{param_size} \NC number \NC 60 \NC cf.\ web2c docs \NC \NR
+\NC \type{save_size} \NC number \NC 4000 \NC cf.\ web2c docs \NC \NR
+\NC \type{stack_size} \NC number \NC 300 \NC cf.\ web2c docs \NC \NR
+\NC \type{dvi_buf_size} \NC number \NC 16384 \NC cf.\ web2c docs \NC \NR
+\NC \type{error_line} \NC number \NC 79 \NC cf.\ web2c docs \NC \NR
+\NC \type{half_error_line} \NC number \NC 50 \NC cf.\ web2c docs \NC \NR
+\NC \type{max_print_line} \NC number \NC 79 \NC cf.\ web2c docs \NC \NR
+\NC \type{hash_extra} \NC number \NC 0 \NC cf.\ web2c docs \NC \NR
+\NC \type{pk_dpi} \NC number \NC 72 \NC cf.\ web2c docs \NC \NR
+\NC \type{trace_file_names} \NC boolean \NC true
+\NC
+ \type {false} disables \TEX's normal file open|-|close feedback (the
+ assumption is that callbacks will take care of that)
+\NC \NR
+\NC \type{file_line_error} \NC boolean \NC false
+\NC
+ do \type {file:line} style error messages
+\NC \NR
+\NC \type{halt_on_error} \NC boolean \NC false
+\NC
+ abort run on the first encountered error
+\NC \NR
+\NC \type{formatname} \NC string \NC
+\NC
+ if no format name was given on the command line, this key will be tested first
+ instead of simply quitting
+\NC \NR
+\NC \type{jobname} \NC string \NC
+\NC
+ if no input file name was given on the command line, this key will be tested
+ first instead of simply giving up
+\NC \NR
+\LL
+\stoptabulate
+
+Note: the numeric values that match web2c parameters are only used if \type
+{kpse_init} is explicitly set to \type {false}. In all other cases, the normal
+values from \type {texmf.cnf} are used.
+
+\stopsection
+
+\startsection[title={The \type {texio} library}][library=texio]
+
+\topicindex{libraries+\type{texio}}
+\topicindex{\IO}
+
+This library takes care of the low|-|level I/O interface: writing to the log file
+and|/|or console.
+
+\startsubsection[title={\type {write}}]
+
+\libindex{write}
+
+\startfunctioncall
+texio.write(<string> target, <string> s, ...)
+texio.write(<string> s, ...)
+\stopfunctioncall
+
+Without the \type {target} argument, writes all given strings to the same
+location(s) \TEX\ writes messages to at this moment. If \prm {batchmode} is in
+effect, it writes only to the log, otherwise it writes to the log and the
+terminal. The optional \type {target} can be one of three possibilities: \type
+{term}, \type {log} or \type {term and log}.
+
+Note: If several strings are given, and if the first of these strings is or might
+be one of the targets above, the \type {target} must be specified explicitly to
+prevent \LUA\ from interpreting the first string as the target.
+
+\stopsubsection
+
+\startsubsection[title={\type {write_nl}}]
+
+\libindex{write_nl}
+
+\startfunctioncall
+texio.write_nl(<string> target, <string> s, ...)
+texio.write_nl(<string> s, ...)
+\stopfunctioncall
+
+This function behaves like \type {texio.write}, but make sure that the given
+strings will appear at the beginning of a new line. You can pass a single empty
+string if you only want to move to the next line.
+
+\stopsubsection
+
+\startsubsection[title={\type {setescape}}]
+
+\libindex{setescape}
+
+You can disable \type {^^} escaping of control characters by passing a value of
+zero.
+
+\stopsubsection
+
+\startsubsection[title={\type {closeinput}}]
+
+\libindex{closeinput}
+
+This function that should be used with care. It acts as \prm {endinput} but at
+the \LUA\ end. You can use it to (sort of) force a jump back to \TEX. Normally a
+\LUA\ will just collect prints and at the end bump an input level and flush these
+prints. This function can help you stay at the current level but you need to know
+what you're doing (or more precise: what \TEX\ is doing with input).
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {token} library}][library=token]
+
+\startsubsection[title={The scanner}]
+
+\topicindex{libraries+\type{token}}
+\topicindex{tokens}
+
+\libindex{scan_keyword}
+\libindex{scan_keywordcs}
+\libindex{scan_int}
+\libindex{scan_real}
+\libindex{scan_float}
+\libindex{scan_dimen}
+\libindex{scan_glue}
+\libindex{scan_toks}
+\libindex{scan_code}
+\libindex{scan_string}
+\libindex{scan_argument}
+\libindex{scan_word}
+\libindex{scan_csname}
+\libindex{scan_list}
+
+The token library provides means to intercept the input and deal with it at the
+\LUA\ level. The library provides a basic scanner infrastructure that can be used
+to write macros that accept a wide range of arguments. This interface is on
+purpose kept general and as performance is quite ok. One can build additional
+parsers without too much overhead. It's up to macro package writers to see how
+they can benefit from this as the main principle behind \LUATEX\ is to provide a
+minimal set of tools and no solutions. The scanner functions are probably the
+most intriguing.
+
+\starttabulate[|l|l|p|]
+\DB function \BC argument \BC result \NC \NR
+\TB
+\NC \type{scan_keyword} \NC string \NC returns true if the given keyword is gobbled; as with
+ the regular \TEX\ keyword scanner this is case insensitive
+ (and \ASCII\ based) \NC \NR
+\NC \type{scan_keywordcs} \NC string \NC returns true if the given keyword is gobbled; this variant
+ is case sensitive and also suitable for \UTF8 \NC \NR
+\NC \type{scan_int} \NC \NC returns an integer \NC \NR
+\NC \type{scan_real} \NC \NC returns a number from e.g.\ \type {1}, \type {1.1}, \type {.1} with optional collapsed signs \NC \NR
+\NC \type{scan_float} \NC \NC returns a number from e.g.\ \type {1}, \type {1.1}, \type {.1}, \type {1.1E10}, , \type {.1e-10} with optional collapsed signs \NC \NR
+\NC \type{scan_dimen} \NC infinity, mu-units \NC returns a number representing a dimension and or two numbers being the filler and order \NC \NR
+\NC \type{scan_glue} \NC mu-units \NC returns a glue spec node \NC \NR
+\NC \type{scan_toks} \NC definer, expand \NC returns a table of tokens tokens \NC \NR
+\NC \type{scan_code} \NC bitset \NC returns a character if its category is in the given bitset (representing catcodes) \NC \NR
+\NC \type{scan_string} \NC \NC returns a string given between \type {{}}, as \type {\macro} or as sequence of characters with catcode 11 or 12 \NC \NR
+\NC \type{scan_argument} \NC \NC this one is simular to \type {scanstring} but also accepts a \type {\cs}
+ (which then get expanded) \NC \NR
+\NC \type{scan_word} \NC \NC returns a sequence of characters with catcode 11 or 12 as string \NC \NR
+\NC \type{scan_csname} \NC \NC returns \type {foo} after scanning \type {\foo} \NC \NR
+\NC \type{scan_list} \NC \NC picks up a box specification and returns a \type {[h|v]list} node \NC \NR
+\LL
+\stoptabulate
+
+The scanners can be considered stable apart from the one scanning for a token.
+The \type {scan_code} function takes an optional number, the \type {keyword}
+function a normal \LUA\ string. The \type {infinity} boolean signals that we also
+permit \type {fill} as dimension and the \type {mu-units} flags the scanner that
+we expect math units. When scanning tokens we can indicate that we are defining a
+macro, in which case the result will also provide information about what
+arguments are expected and in the result this is separated from the meaning by a
+separator token. The \type {expand} flag determines if the list will be expanded.
+
+The string scanner scans for something between curly braces and expands on the
+way, or when it sees a control sequence it will return its meaning. Otherwise it
+will scan characters with catcode \type {letter} or \type {other}. So, given the
+following definition:
+
+\startbuffer
+\def\bar{bar}
+\def\foo{foo-\bar}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\starttabulate[|l|Tl|l|]
+\DB name \BC result \NC \NR
+\TB
+\NC \type {\directlua{token.scan_string()}{foo}} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")} {foo} \NC full expansion \NC \NR
+\NC \type {\directlua{token.scan_string()}foo} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")} foo \NC letters and others \NC \NR
+\NC \type {\directlua{token.scan_string()}\foo} \NC \directlua{context("{\\red\\type {"..token.scan_string().."}}")}\foo \NC meaning \NC \NR
+\LL
+\stoptabulate
+
+The \type {\foo} case only gives the meaning, but one can pass an already
+expanded definition (\prm {edef}'d). In the case of the braced variant one can of
+course use the \prm {detokenize} and \prm {unexpanded} primitives since there we
+do expand.
+
+The \type {scan_word} scanner can be used to implement for instance a number scanner:
+
+\starttyping
+function token.scan_number(base)
+ return tonumber(token.scan_word(),base)
+end
+\stoptyping
+
+This scanner accepts any valid \LUA\ number so it is a way to pick up floats
+in the input.
+
+You can use the \LUA\ interface as follows:
+
+\starttyping
+\directlua {
+ function mymacro(n)
+ ...
+ end
+}
+
+\def\mymacro#1{%
+ \directlua {
+ mymacro(\number\dimexpr#1)
+ }%
+}
+
+\mymacro{12pt}
+\mymacro{\dimen0}
+\stoptyping
+
+You can also do this:
+
+\starttyping
+\directlua {
+ function mymacro()
+ local d = token.scan_dimen()
+ ...
+ end
+}
+
+\def\mymacro{%
+ \directlua {
+ mymacro()
+ }%
+}
+
+\mymacro 12pt
+\mymacro \dimen0
+\stoptyping
+
+It is quite clear from looking at the code what the first method needs as
+argument(s). For the second method you need to look at the \LUA\ code to see what
+gets picked up. Instead of passing from \TEX\ to \LUA\ we let \LUA\ fetch from
+the input stream.
+
+In the first case the input is tokenized and then turned into a string, then it
+is passed to \LUA\ where it gets interpreted. In the second case only a function
+call gets interpreted but then the input is picked up by explicitly calling the
+scanner functions. These return proper \LUA\ variables so no further conversion
+has to be done. This is more efficient but in practice (given what \TEX\ has to
+do) this effect should not be overestimated. For numbers and dimensions it saves
+a bit but for passing strings conversion to and from tokens has to be done anyway
+(although we can probably speed up the process in later versions if needed).
+
+\stopsubsection
+
+\startsubsection[title= {Picking up one token}]
+
+\libindex {get_next}
+\libindex {scan_token}
+\libindex {expand}
+
+The scanners look for a sequence. When you want to pick up one token from the
+input you use \type {get_next}. This creates a token with the (low level)
+properties as discussed next. This token is just the next one. If you want to
+enforce expansion first you can use \type {scan_token}. Internally tokens are
+characterized by a number that packs a lot of information. In order to access
+the bits of information a token is wrapped in a userdata object.
+
+The \type {expand} function will trigger expansion of the next token in the
+input. This can be quite unpredictable but when you call it you probably know
+enough about \TEX\ not to be too worried about that. It basically is a call to
+the internal expand related function.
+
+\stopsubsection
+
+\startsubsection[title={Creating tokens}]
+
+\libindex{create}
+\libindex{new}
+
+\libindex{is_defined}
+\libindex{is_token}
+\libindex{biggest_char}
+
+\libindex{commands}
+\libindex{command_id}
+
+\libindex{get_command}
+\libindex{get_cmdname}
+\libindex{get_csname}
+\libindex{get_id}
+\libindex{get_active}
+\libindex{get_expandable}
+\libindex{get_protected}
+\libindex{get_mode}
+\libindex{get_index}
+\libindex{get_tok}
+
+\libindex{get_next}
+
+The creator function can be used as follows:
+
+\starttyping
+local t = token.create("relax")
+\stoptyping
+
+This gives back a token object that has the properties of the \prm {relax}
+primitive. The possible properties of tokens are:
+
+\starttabulate[|l|p|]
+\DB name \BC explanation \NC \NR
+\TB
+\NC \type {command} \NC a number representing the internal command number \NC \NR
+\NC \type {cmdname} \NC the type of the command (for instance the catcode in case of a
+ character or the classifier that determines the internal
+ treatment \NC \NR
+\NC \type {csname} \NC the associated control sequence (if applicable) \NC \NR
+\NC \type {id} \NC the unique id of the token \NC \NR
+\NC \type {tok} \NC the full token number as stored in \TEX \NC \NR
+\NC \type {active} \NC a boolean indicating the active state of the token \NC \NR
+\NC \type {expandable} \NC a boolean indicating if the token (macro) is expandable \NC \NR
+\NC \type {protected} \NC a boolean indicating if the token (macro) is protected \NC \NR
+\NC \type {mode} \NC a number either representing a character or another entity \NC \NR
+\NC \type {index} \NC a number running from 0x0000 upto 0xFFFF indicating a \TEX\ register index \NC \NR
+\LL
+\stoptabulate
+
+Alternatively you can use a getter \type {get_<fieldname>} to access a property
+of a token.
+
+The numbers that represent a catcode are the same as in \TEX\ itself, so using
+this information assumes that you know a bit about \TEX's internals. The other
+numbers and names are used consistently but are not frozen. So, when you use them
+for comparing you can best query a known primitive or character first to see the
+values.
+
+You can ask for a list of commands:
+
+\starttyping
+local t = token.commands()
+\stoptyping
+
+The id of a token class can be queried as follows:
+
+\starttyping
+local id = token.command_id("math_shift")
+\stoptyping
+
+If you really know what you're doing you can create character tokens by not
+passing a string but a number:
+
+\starttyping
+local letter_x = token.create(string.byte("x"))
+local other_x = token.create(string.byte("x"),12)
+\stoptyping
+
+Passing weird numbers can give side effects so don't expect too much help with
+that. As said, you need to know what you're doing. The best way to explore the
+way these internals work is to just look at how primitives or macros or \prm
+{chardef}'d commands are tokenized. Just create a known one and inspect its
+fields. A variant that ignores the current catcode table is:
+
+\starttyping
+local whatever = token.new(123,12)
+\stoptyping
+
+You can test if a control sequence is defined with \type {is_defined}, which
+accepts a string and returns a boolean:
+
+\starttyping
+local okay = token.is_defined("foo")
+\stoptyping
+
+The largest character possible is returned by \type {biggest_char}, just in case you
+need to know that boundary condition.
+
+\stopsubsection
+
+\startsubsection[title={Macros}]
+
+\topicindex {macros}
+
+\libindex{set_macro}
+\libindex{get_macro}
+\libindex{get_meaning}
+\libindex{set_char}
+\libindex{set_lua}
+\libindex{get_functions_table}
+
+The \type {set_macro} function can get upto 4 arguments:
+
+\starttyping
+set_macro("csname","content")
+set_macro("csname","content","global")
+set_macro("csname")
+\stoptyping
+
+You can pass a catcodetable identifier as first argument:
+
+\starttyping
+set_macro(catcodetable,"csname","content")
+set_macro(catcodetable,"csname","content","global")
+set_macro(catcodetable,"csname")
+\stoptyping
+
+The results are like:
+
+\starttyping
+ \def\csname{content}
+\gdef\csname{content}
+ \def\csname{}
+\stoptyping
+
+The \type {get_macro} function can be used to get the content of a macro while
+the \type {get_meaning} function gives the meaning including the argument
+specification (as usual in \TEX\ separated by \type {->}).
+
+The \type {set_char} function can be used to do a \prm {chardef} at the
+\LUA\ end, where invalid assignments are silently ignored:
+
+\starttyping
+set_char("csname",number)
+set_char("csname",number,"global")
+\stoptyping
+
+A special one is the following:
+
+\starttyping
+set_lua("mycode",id)
+set_lua("mycode",id,"global","protected")
+\stoptyping
+
+This creates a token that refers to a \LUA\ function with an entry in the table
+that you can access with \type {lua.get_functions_table}. It is the companion
+to \lpr {luadef}.
+
+\stopsubsection
+
+\startsubsection[title={Pushing back}]
+
+\libindex{get_next}
+\libindex{put_next}
+
+There is a (for now) experimental putter:
+
+\starttyping
+local t1 = token.get_next()
+local t2 = token.get_next()
+local t3 = token.get_next()
+local t4 = token.get_next()
+-- watch out, we flush in sequence
+token.put_next { t1, t2 }
+-- but this one gets pushed in front
+token.put_next ( t3, t4 )
+\stoptyping
+
+When we scan \type {wxyz!} we get \type {yzwx!} back. The argument is either a table
+with tokens or a list of tokens. The \type {token.expand} function will trigger
+expansion but what happens really depends on what you're doing where.
+
+\stopsubsection
+
+\startsubsection[title={Nota bene}]
+
+When scanning for the next token you need to keep in mind that we're not scanning
+like \TEX\ does: expanding, changing modes and doing things as it goes. When we
+scan with \LUA\ we just pick up tokens. Say that we have:
+
+\starttyping
+\bar
+\stoptyping
+
+but \type {\bar} is undefined. Normally \TEX\ will then issue an error message.
+However, when we have:
+
+\starttyping
+\def\foo{\bar}
+\stoptyping
+
+We get no error, unless we expand \type {\foo} while \type {\bar} is still
+undefined. What happens is that as soon as \TEX\ sees an undefined macro it will
+create a hash entry and when later it gets defined that entry will be reused. So,
+\type {\bar} really exists but can be in an undefined state.
+
+\startbuffer[demo]
+bar : \directlua{tex.print(token.scan_csname())}\bar
+foo : \directlua{tex.print(token.scan_csname())}\foo
+myfirstbar : \directlua{tex.print(token.scan_csname())}\myfirstbar
+\stopbuffer
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+This was entered as:
+
+\typebuffer[demo]
+
+The reason that you see \type {bar} reported and not \type {myfirstbar} is that
+\type {\bar} was already used in a previous paragraph.
+
+If we now say:
+
+\startbuffer
+\def\foo{}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+And if we say
+
+\startbuffer
+\def\foo{\bar}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+we get:
+
+\startlines
+\getbuffer[demo]
+\stoplines
+
+When scanning from \LUA\ we are not in a mode that defines (undefined) macros at
+all. There we just get the real primitive undefined macro token.
+
+\startbuffer
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\myfirstbar
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\mysecondbar
+\directlua{local t = token.get_next() tex.print(t.id.." "..t.tok)}\mythirdbar
+\stopbuffer
+
+\startlines
+\getbuffer
+\stoplines
+
+This was generated with:
+
+\typebuffer
+
+So, we do get a unique token because after all we need some kind of \LUA\ object
+that can be used and garbage collected, but it is basically the same one,
+representing an undefined control sequence.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={The \type {kpse} library}][library=kpse]
+
+\topicindex{libraries+\type{kpse}}
+
+This library provides two separate, but nearly identical interfaces to the
+\KPATHSEA\ file search functionality: there is a \quote {normal} procedural
+interface that shares its kpathsea instance with \LUATEX\ itself, and an object
+oriented interface that is completely on its own.
+
+\startsubsection[title={\type {set_program_name} and \type {new}}]
+
+\libindex{set_program_name}
+\libindex{default_texmfcnf}
+\libindex{new}
+
+The way the library looks up variables is driven by the \type {texmf.cmf} file
+where the currently set program name acts as filter. You can check what file is
+used by with \type {default_texmfcnf}.
+
+Before the search library can be used at all, its database has to be initialized.
+There are three possibilities, two of which belong to the procedural interface.
+
+First, when \LUATEX\ is used to typeset documents, this initialization happens
+automatically and the \KPATHSEA\ executable and program names are set to \type
+{luatex} (that is, unless explicitly prohibited by the user's startup script.
+See~\in {section} [init] for more details).
+
+Second, in \TEXLUA\ mode, the initialization has to be done explicitly via the
+\type {kpse.set_program_name} function, which sets the \KPATHSEA\ executable
+(and optionally program) name.
+
+\startfunctioncall
+kpse.set_program_name(<string> name)
+kpse.set_program_name(<string> name, <string> progname)
+\stopfunctioncall
+
+The second argument controls the use of the \quote {dotted} values in the \type
+{texmf.cnf} configuration file, and defaults to the first argument.
+
+Third, if you prefer the object oriented interface, you have to call a different
+function. It has the same arguments, but it returns a userdata variable.
+
+\startfunctioncall
+local kpathsea = kpse.new(<string> name)
+local kpathsea = kpse.new(<string> name, <string> progname)
+\stopfunctioncall
+
+Apart from these two functions, the calling conventions of the interfaces are
+identical. Depending on the chosen interface, you either call \type
+{kpse.find_file} or \type {kpathsea:find_file}, with identical arguments and
+return values.
+
+\stopsubsection
+
+\startsubsection[title={\type {record_input_file} and \type {record_output_file}}]
+
+\topicindex {files+recording}
+
+\libindex{record_input_file}
+\libindex{record_output_file}
+
+These two function can be used to register used files. Because callbacks can load
+files themselves you might need these helpers (if you use recording at all).
+
+\startfunctioncall
+kpse.record_input_file(<string> name)
+kpse.record_output_file(<string> name)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {find_file}}]
+
+\topicindex {files+finding}
+
+\libindex {find_file}
+
+The most often used function in the library is \type {find_file}:
+
+\startfunctioncall
+<string> f = kpse.find_file(<string> filename)
+<string> f = kpse.find_file(<string> filename, <string> ftype)
+<string> f = kpse.find_file(<string> filename, <boolean> mustexist)
+<string> f = kpse.find_file(<string> filename, <string> ftype, <boolean> mustexist)
+<string> f = kpse.find_file(<string> filename, <string> ftype, <number> dpi)
+\stopfunctioncall
+
+Arguments:
+
+\startitemize[intro]
+
+\sym{filename}
+
+the name of the file you want to find, with or without extension.
+
+\sym{ftype}
+
+maps to the \type {-format} argument of \KPSEWHICH. The supported \type {ftype}
+values are the same as the ones supported by the standalone \type {kpsewhich}
+program: \startluacode
+ local list = {
+ "afm",
+ "base",
+ "bib",
+ "bitmap font",
+ "bst",
+ "cid maps",
+ "clua",
+ "cmap files",
+ "cnf",
+ "cweb",
+ "dvips config",
+ "enc files",
+ "fmt",
+ "font feature files",
+ "gf",
+ "graphic|/|figure",
+ "ist",
+ "lig files",
+ "ls-R",
+ "lua",
+ "map",
+ "mem",
+ "MetaPost support",
+ "mf",
+ "mfpool",
+ "mft",
+ "misc fonts",
+ "mlbib",
+ "mlbst",
+ "mp",
+ "mppool",
+ "ocp",
+ "ofm",
+ "opentype fonts",
+ "opl",
+ "other binary files",
+ "other text files",
+ "otp",
+ "ovf",
+ "ovp",
+ "pdftex config",
+ "pk",
+ "PostScript header",
+ "subfont definition files",
+ "tex",
+ "TeX system documentation",
+ "TeX system sources",
+ "texmfscripts",
+ "texpool",
+ "tfm",
+ "Troff fonts",
+ "truetype fonts",
+ "type1 fonts",
+ "type42 fonts",
+ "vf",
+ "web",
+ "web2c files",
+ }
+ table.sort(list)
+ context("{\\tttf \letterpercent, t}",list)
+\stopluacode
+
+The default type is \type {tex}. Note: this is different from \KPSEWHICH, which
+tries to deduce the file type itself from looking at the supplied extension.
+
+\sym{mustexist}
+
+is similar to \KPSEWHICH's \type {-must-exist}, and the default is \type {false}.
+If you specify \type {true} (or a non|-|zero integer), then the \KPSE\ library
+will search the disk as well as the \type {ls-R} databases.
+
+\sym{dpi}
+
+This is used for the size argument of the formats \type {pk}, \type {gf}, and
+\type {bitmap font}. \stopitemize
+
+\stopsubsection
+
+\startsubsection[title={\type {lookup}}]
+
+\libindex{lookup}
+
+A more powerful (but slower) generic method for finding files is also available.
+It returns a string for each found file.
+
+\startfunctioncall
+<string> f, ... = kpse.lookup(<string> filename, <table> options)
+\stopfunctioncall
+
+The options match commandline arguments from \type {kpsewhich}:
+
+\starttabulate[|l|l|p|]
+\DB key \BC type \BC explanation \NC \NR
+\TB
+\NC \type{debug} \NC number \NC set debugging flags for this lookup\NC \NR
+\NC \type{format} \NC string \NC use specific file type (see list above)\NC \NR
+\NC \type{dpi} \NC number \NC use this resolution for this lookup; default 600\NC \NR
+\NC \type{path} \NC string \NC search in the given path\NC \NR
+\NC \type{all} \NC boolean \NC output all matches, not just the first\NC \NR
+\NC \type{mustexist} \NC boolean \NC search the disk as well as ls-R if necessary\NC \NR
+\NC \type{mktexpk} \NC boolean \NC disable/enable mktexpk generation for this lookup\NC \NR
+\NC \type{mktextex} \NC boolean \NC disable/enable mktextex generation for this lookup\NC \NR
+\NC \type{mktexmf} \NC boolean \NC disable/enable mktexmf generation for this lookup\NC \NR
+\NC \type{mktextfm} \NC boolean \NC disable/enable mktextfm generation for this lookup\NC \NR
+\NC \type{subdir} \NC string
+ or table \NC only output matches whose directory part
+ ends with the given string(s) \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\type {init_prog}}]
+
+\topicindex {initialization+bitmaps}
+
+\libindex{init_prog}
+
+Extra initialization for programs that need to generate bitmap fonts.
+
+\startfunctioncall
+kpse.init_prog(<string> prefix, <number> base_dpi, <string> mfmode)
+kpse.init_prog(<string> prefix, <number> base_dpi, <string> mfmode, <string> fallback)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {readable_file}}]
+
+\libindex{readable_file}
+
+Test if an (absolute) file name is a readable file.
+
+\startfunctioncall
+<string> f = kpse.readable_file(<string> name)
+\stopfunctioncall
+
+The return value is the actual absolute filename you should use, because the disk
+name is not always the same as the requested name, due to aliases and
+system|-|specific handling under e.g.\ \MSDOS. Returns \type {nil} if the file
+does not exist or is not readable.
+
+\stopsubsection
+
+\startsubsection[title={\type {expand_path}}]
+
+\libindex{expand_path}
+
+Like kpsewhich's \type {-expand-path}:
+
+\startfunctioncall
+<string> r = kpse.expand_path(<string> s)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {expand_var}}]
+
+\libindex{expand_var}
+
+Like kpsewhich's \type {-expand-var}:
+
+\startfunctioncall
+<string> r = kpse.expand_var(<string> s)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {expand_braces}}]
+
+\libindex{expand_braces}
+
+Like kpsewhich's \type {-expand-braces}:
+
+\startfunctioncall
+<string> r = kpse.expand_braces(<string> s)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {show_path}}]
+
+\libindex{show_path}
+
+Like kpsewhich's \type {-show-path}:
+
+\startfunctioncall
+<string> r = kpse.show_path(<string> ftype)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {var_value}}]
+
+\libindex{var_value}
+
+Like kpsewhich's \type {-var-value}:
+
+\startfunctioncall
+<string> r = kpse.var_value(<string> s)
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {version}}]
+
+\libindex{version}
+
+Returns the kpathsea version string.
+
+\startfunctioncall
+<string> r = kpse.version()
+\stopfunctioncall
+
+\stopsubsection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex-titlepage.tex b/systems/doc/luatex/luatex-titlepage.tex
new file mode 100644
index 0000000000..5a91f73e8b
--- /dev/null
+++ b/systems/doc/luatex/luatex-titlepage.tex
@@ -0,0 +1,53 @@
+\environment luatex-style
+
+\startcomponent luatex-titlepage
+
+\startstandardmakeup
+
+ \switchtobodyfont
+ [mainfacemedium]
+
+ \definedfont[Bold*default at \the\dimexpr.06\paperheight\relax] \setupinterlinespace
+
+ \setlayer
+ [page]
+ {\useMPgraphic{luapage}}
+
+ \setlayerframed
+ [page]
+ [preset=righttop,
+ location=middletop,
+ hoffset=.500\measured{paperwidth},
+ voffset=.175\measured{paperheight}]
+ [align=middle,
+ foregroundcolor=white,
+ frame=off]
+ {\documentvariable{manual}\crlf Reference\crlf Manual}
+
+ \definedfont[Bold*default at 14pt] \setupinterlinespace
+
+ \setlayerframed
+ [page]
+ [preset=rightbottom,
+ offset=.025\measured{paperheight}]
+ [align=flushright,
+ foregroundcolor=white,
+ frame=off]
+ {\doifsomething{\documentvariable{status}}{\documentvariable{status}\par}
+ \currentdate[month,space,year]\par
+ Version \documentvariable{version}}
+
+ \setlayerframed
+ [page]
+ [preset=middle,
+ hoffset=-.5\dimexpr\measured{paperwidth}-\measured{spinewidth}\relax]
+ [width=.7\measured{paperwidth},
+ align=normal,
+ foregroundstyle=\bf,
+ foregroundcolor=white,
+ frame=off]
+ {\getbuffer[backpage]}
+
+\stopstandardmakeup
+
+\stopcomponent
diff --git a/systems/doc/luatex/luatex.pdf b/systems/doc/luatex/luatex.pdf
new file mode 100644
index 0000000000..572b75d842
--- /dev/null
+++ b/systems/doc/luatex/luatex.pdf
Binary files differ
diff --git a/systems/doc/luatex/luatex.tex b/systems/doc/luatex/luatex.tex
new file mode 100644
index 0000000000..2d1d4efec6
--- /dev/null
+++ b/systems/doc/luatex/luatex.tex
@@ -0,0 +1,103 @@
+% macros=mkvi
+
+% \nopdfcompression
+
+% \disabledirectives[vspacing.synchronizepage]
+
+% wsl /data/context/runcontext.sh --global --path=/mnt/c/data/develop/context/manuals/mkiv/external/luatex luatex.tex
+%
+% same runtime as regular context or linux
+% author : Hans Hagen with Taco Hoekwater, Luigi Scarso & Hartmut Henkel
+% copyright : PRAGMA ADE & ConTeXt Development Team
+% license : Creative Commons Attribution ShareAlike 4.0 International
+% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
+% origin : the ConTeXt distribution
+%
+% comment : Because this manual is distributed with TeX distributions it comes with a rather
+% liberal license. We try to adapt these documents to upgrades in the (sub)systems
+% that they describe. Using parts of the content otherwise can therefore conflict
+% with existing functionality and we cannot be held responsible for that. Many of
+% the manuals contain characteristic graphics and personal notes or examples that
+% make no sense when used out-of-context.
+%
+% comment : Some (parts of) chapters might have been published in TugBoat, the NTG Maps, the
+% ConTeXt Group journal or otherwise. Thanks to the editors for corrections. Also
+% thanks to users for testing, feedback and corrections.
+
+% \tex vs \type vs \syntax vs. \luatex
+% \em \it \/
+
+% "context --nodates --nocompression luatex" can be used for comparison
+% runs, not that we do it
+
+% todo: all (sub)section to start/stop
+
+% \enabledirectives[hyphenator.flatten]
+
+% \setupsynctex[state=start,method=max] % adds 5 pct overhead
+
+% compoundhyphenmode : looks okay
+% endlocalcontrol : very experimental
+% fixupboxesmode : very experimental
+% mathflattenmode : looks okay
+% mathrulethicknessmode : looks okay
+
+% after adding primitives: context mult-prm.mkiv
+
+\environment luatex-style
+
+\startmode[book]
+ \environment luatex-style-book
+\stopmode
+
+\environment luatex-logos
+\environment luatex-private
+
+\startmode[export]
+
+ \setupbackend
+ [export=luatex]
+
+\stopmode
+
+\startdocument
+ [manual=Lua\TeX,
+ status=stable,
+ version=1.10]
+
+\startnotmode[*export]
+ \component luatex-titlepage
+ \component luatex-firstpage
+\stopnotmode
+
+\startmode[*export]
+ \component luatex-export-titlepage
+\stopmode
+
+\startfrontmatter
+ \component luatex-contents
+ \component luatex-introduction
+\stopfrontmatter
+
+\startbodymatter
+ \component luatex-preamble
+ \component luatex-enhancements
+ \component luatex-modifications
+ \component luatex-lua
+ \component luatex-languages
+ \component luatex-fonts
+ \component luatex-math
+ \component luatex-nodes
+ \component luatex-callbacks
+ \component luatex-tex
+ \component luatex-graphics
+ \component luatex-fontloader
+ \component luatex-backend
+\stopbodymatter
+
+\startbackmatter
+ \component luatex-registers
+ \component luatex-statistics
+\stopbackmatter
+
+\stopdocument
diff --git a/systems/doc/metapost/CHANGES b/systems/doc/metapost/CHANGES
new file mode 100644
index 0000000000..6a36eafb22
--- /dev/null
+++ b/systems/doc/metapost/CHANGES
@@ -0,0 +1,1590 @@
+
+This file is public domain.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.999:
+----------------------------------------------------------------------
+
+* The numbersystem 'binary' is now operational.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.902:
+----------------------------------------------------------------------
+
+* Fixed a crash in 'decimal' mode during choose_scale calculations.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.901:
+----------------------------------------------------------------------
+
+* Fixed a bug in 'decimal' mode that affected (among other things)
+ the directionpoint and bbox calculations.
+
+* Fixed a bug in 'decimal' mode calculation of sine / cosine that
+ affected the precision of the answer in situations where
+ 'numberprecision' was less than 34.
+
+* Updated the number parsing in 'decimal' mode to detect 'too precise'
+ input and optionally generate an error in that case (depends on
+ 'warningcheck')
+
+* Fixed a bug in the svg output where it could crash in 'decimal' mode.
+
+* Fixed a bug in the png output where it could get confused if there
+ was more than one text label
+
+* Fixed a bug in the png output for stroked paths
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.900:
+----------------------------------------------------------------------
+
+* Updated the embedded libraries, and a few build system fixes.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.890:
+----------------------------------------------------------------------
+
+* The numbersystem 'decimal' is now operational.
+
+* New internal: 'numberprecision', for use with 'the 'decimal' number
+ system. The (numeric) value expresses the desired calculation precision,
+ in decimal places.
+
+ system default min max
+ ============================
+ scaled 10 10 10 (assignment effectively ignored)
+ double 16 16 16 (assignment effectively ignored)
+ decimal 34 1 1000
+
+* Bug fix: in the 'double' numbersystem,
+
+ if X = scantokens decimal X:
+
+ will now always be true, because the 'decimal' operator now has
+ the same resolution as the scanning routine (which is two decimal
+ places more than in the previous release).
+
+* Fixed a bug in the handling of the / operator (wrong precendence).
+
+* Fixed a bug in arctime (did not handle negative values currectly).
+
+* Fixed TFM generation issues (various scale-related errors).
+
+* Fixed application crashes when there was no TEXMF tree to be found
+ anywhere.
+
+* It is no longer possible to assign to the 'numbersystem' internal.
+
+* There is a new definition of 'drawdot' in plain.mp.
+
+* PNG output did not output anything for draws of a single point.
+
+* Metapost now prints the full name of any preloaded files.
+
+* Fixed a bug in the handling of labels with embedded ascii zero(es).
+
+* Fixed handling of unknown command-line options, the reporting
+ on used libraries in the --version output, and the banner line.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.803:
+----------------------------------------------------------------------
+
+* Fixed a bug in the path tension handling that sometimes caused
+ distorted output.
+
+* A number of small alterations to the build system making it easier
+ to integrate metapost with W32TEX.
+
+* Fix the internal rounding functions in --numbersystem=double so that
+ they round exactly like in --numbersystem=scaled mode.
+
+* From Elie Roux: a fix to graph.mp to prevent log-scaled graphs with
+ large ranges from causing the "Value is too large" error.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.802:
+----------------------------------------------------------------------
+
+* Fixed a bug causing overly large characters in SVG output mode when
+ prologues != 3.
+
+* Removed a crash during free-ing of TFM metric data at the end of the
+ run.
+
+* Fixed a problem with colors in SVG output mode.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.801:
+----------------------------------------------------------------------
+
+* fixed an off-by-one error in the SVG output that prevented the last
+ font's glyphs from actually being output to the svg file under
+ prologues:=3;
+
+* fixed a bug in bbox calculations in that caused the max y to be set
+ based on the maximum x coordinate internal value instead of the
+ maximum y coordinate.
+
+* fixed a bug where metapost incorrectly produced a 'degenerate spec'
+ error.
+
+* build fixes for various platforms imported from TeXLive 2013, as
+ well as the latest kpathsea development etc.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.800:
+----------------------------------------------------------------------
+
+* A new string valued internal "outputformatoptions" is used by PNG
+ output mode to control the png file format. In the future, this
+ internal may also be used for options to the other output formats.
+
+ The syntax for "outputformatoptions" is a space-separated list of
+ settings. Individual settings are keyword+'='+value. The only
+ currently allowed ones are:
+ format=[rgba|rgb|graya|gray]
+ antialias=[none|fast|good|best]
+ No spaces are allowed on the left, nor on the right, of the equals
+ sign inside a setting.
+
+ The assignment that would match the compiled-in default setup is:
+ outputformatoptions := "format=rgba antialias=fast";
+ however, "outputformatoptions" is initially the empty string.
+
+ Some notes on the (new) PNG output formats:
+ - The 'rgb' and 'gray' subformats have a white background. The
+ 'rgba' and 'graya' subformats have a transparent background.
+ - Bitdepth is always 8.
+ - In all cases, the image is initially created in 8-bit RGB
+ mode. For 'gray' and 'graya', the RGB colors are reduced just
+ before the actual PNG file is written, using a standard rule:
+ g = 0.2126*r + 0.7152*g + 0.0722*b
+ - CMYK colors are always converted to RGB during generation of
+ the output image using:
+ r = 1 - (c+k>1 ? 1 : c+k);
+ g = 1 - (m+k>1 ? 1 : m+k);
+ b = 1 - (y+k>1 ? 1 : y+k);
+ - If you care about color conversions, you should be doing a
+ "within <pic>" loop inside "extra_endfig". The built-in
+ conversions are more of a fallback.
+
+* A new string-valued internal "outputfilename", which is set by
+ "shipout" to the value of the just created file name. Until the
+ first shipout has occurred, it is the empty string.
+
+
+* Fixed a number of bugs where Metapost loaded the default font map
+ file multiple times, resulting in lots of "fontmap entry for
+ `<fontname>' already exists, duplicates ignored" warnings.
+
+* The "glyph <> of <>" operation could crash on fonts with empty
+ subpaths in the charstrings.
+
+* Fixed a bug in the postscript encoding reader that caused a buffer
+ overflow (fatal error) for encoding files that do not end with a
+ newline.
+
+* Sped up png creation a bit by using smarter libpng options.
+
+* In the 'double' numbersystem, lots of precision was lost due to a bad
+ internal conversion of fractions to scaled values. This affected the
+ "rotated by", "directiontime", "sind" and "cosd" primitives, as well
+ as internal dependency calculations.
+
+* In the 'double' numbersystem, an internal rounding error caused
+ "directiontime" to return bad results for requests near zero.
+
+* There was a big scaling miscalculation while outputting glyphs in SVG
+ mode with "prologues:=3". The output labels were so big that they
+ fell completely outside of the generated image.
+
+* A problem resulting in 'This can't happen (endinput)' caused by a
+ missing "end" at the end of the run was fixed.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.790:
+----------------------------------------------------------------------
+
+* Lots of speedups.
+
+* Fixed bug in division expressions that started with a literal number.
+
+* A few problems with bad deallocations were solved.
+
+* A bug where after saving and redefinition of primitives, they later
+ were restored to 'undefined' instead of to their primitive meaning.
+
+* The "double" literal number parser now only accepts scientific
+ notation if the character following 'E' or 'e' is '+', '-', or
+ a digit.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.780:
+----------------------------------------------------------------------
+
+* The turningnumber calculation in 1.770 was bugged.
+
+* The picture export in 1.770 forgot to add trailing zeroes to the
+ log and term output channel resulting in rubbish output.
+
+* The arguments of the PS "dtransform" operator have been fixed
+ (was wrong since 1.750).
+
+* The warning limit in numbersystem=double mode is now exactly 2**52.
+
+* A bunch of obvious memory leaks fixed. Not all yet, but now the
+ MPlib seems to be usable even with many graphics.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.770:
+----------------------------------------------------------------------
+
+This is an alpha release for testing & debugging only!
+
+* The command line switch --numbersystem replaces --math.
+
+* Two new internals: numbersystem (string, read-only, either "scaled"
+ or "double" at the moment) and numberprecision (numeric, currently
+ a no-op).
+
+* There is a new bitmap backend:
+
+ outputformat:="png";
+
+ This backend uses cairo and libpng to generate PNG bitmap data.
+ The created PNG used RGB + Alpha, with anti-aliasing, at 72dpi,
+ and with a transparent background.
+
+* Associated with this, there are new internals "hppp" and "vppp",
+ that are used by the bitmap backend to decide on the scale of
+ the generated bitmap. Default value for both new internals is
+ "1.0", i.e. one pixel per Metapost point.
+
+ The internal names come from metafont.
+
+* There are two new primitives for use with picture item objects:
+
+ prescriptpart
+ postscriptpart
+
+* The C API has been extended to allow path control point resolution
+ without going through the Metapost input language, see
+ manual/mplibapi.tex for details.
+
+* The C API has been extended with a "math_mode" switch in the options
+ structure, and the memory size options as well as "ini_mode" have
+ been removed (the MPlib instance now always starts up in inimp mode)
+
+* The code for picture shipout now uses "double" for all floating point
+ values. This can give small differences in the actual output files in
+ traditional mode due to the required scaled -> double conversion, but
+ was necessary to support the new numerical backend code.
+
+* The Lua API internals have been updated to reflect the C API changes.
+
+* All known crashes in earlier versions of Metapost have been fixed.
+
+Known issues:
+
+* The manual is not up-to-date yet on the metapost input language
+ changes.
+
+* There are various memory leaks.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.750:
+----------------------------------------------------------------------
+
+This is an alpha release for testing & debugging only!
+
+* mpost now accepts --math=double as an argument. This switches the
+ internal arithmetic functions from using a scaled 32-bit data type
+ to 64-bit floating point.
+
+* With --math=double, the input scanner has been changed to allow
+ a := 1.0E20
+ as valid input format for a numerical value
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.504:
+----------------------------------------------------------------------
+
+* Small build system tweaks from TeXLive 2012.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.503:
+----------------------------------------------------------------------
+
+* String comparisons have been fixed, these were broken in previous
+ 1.50x versions.
+
+* verbatimtex ... etex processing had a horrible bug that is now
+ fixed.
+
+* A fix has been applied for a bug that made redeclared variable
+ subscript tags disappear.
+
+* The behavior of the %{<internal>} escape sequence in 'outputtemplate'
+ changed (but not that of the single-letter shortcuts). Internal
+ variables within %{...} are neither rounded nor zero-padded.
+
+* A very long list of improvements to the manual.
+
+* MetaPost now adheres to the openin_any / openout_any settings in
+ texmf.cnf
+
+* The 'prologues:=3 output' with embedded labels was unreliable,
+ especially when the resulting eps was included into a TeX document
+ via dvips.
+
+* 'newinternal numeric' has been fixed, it generated an error in
+ metapost 1.211 and earlier 1.50x versions.
+
+* Label regeneration sometimes failed to run when the file time stamps
+ were close together.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.502:
+----------------------------------------------------------------------
+
+* New build system and kpathsea imported from TeX Live.
+
+* Various bugfixes.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.501:
+----------------------------------------------------------------------
+
+* The maximum number of variable instances has increased from approx.
+ 33 million (2^25-1) to 2 billion (2^31-1).
+
+* New build system and kpathsea imported from TeX Live.
+
+* Many small bugfixes to 1.500.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.500:
+----------------------------------------------------------------------
+
+* Actual memory dump files do not exist any more. --mem=<MEM> and
+ all other methods of supplying a MEM file are now interpreted
+ somewhat like this pseudo-metapost-code:
+
+ begingroup;
+ let dump = end;
+ input MEM[.mp];
+ endgroup;
+
+ this process is supposed to be transparent besides the facto that
+ there is some extra terminal output and logging.
+
+* All memory is now allocated and freed dynamically. There are only
+ two remaining overflow errors(1):
+
+ "expansion depth" : this is a guard against infinite recursion,
+ the value is 10000.
+ "sizes per font" : this is maxed out for data-structure reasons,
+ the value is 32767.
+
+ from texmf.cnf, now only the "error_line", "half_error_line" and
+ "print_line settings" are used.
+
+ (1) but now you can reach the operating system limits, of course.
+
+* As this is an alpha release containing lots and lots of new code,
+ MetaPost starts up with the internal equivalent of 'loggingall;'
+ in effect. This results in log files that can help in debugging.
+
+* Expect bugs and (minor) memory leaks.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.212:
+----------------------------------------------------------------------
+
+* Small build system tweaks from TeXLive 2011.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.211:
+----------------------------------------------------------------------
+
+* In previous 1.20X versions, the 'glyph infont' operator did not handle
+ fonts with seac (old-style composite characters) properly.
+
+* Incorporated the latest versions of kpathsea and the build system
+ from TeXLive.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.210:
+----------------------------------------------------------------------
+
+* In previous 1.20X versions, btex ... etex handling forgot to take
+ the passed directory location of input-ed files into account.
+
+* verbatimtex ... etex is now copied as is. Whitespace stripping
+ and appending of % no longer happen.
+
+* The mpost executable now always strips exactly one extension from
+ the jobname (unless explicit --jobname was given)
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.209:
+----------------------------------------------------------------------
+
+* Previous 1.20X mem files were architecture-dependent.
+
+* Metapost now uses getopt once again, which makes the commandline
+ handling compatible with pre-1.20X versions. However, the syntax
+ -sprologues=1 is now no longer supported (the space between -s
+ prologues is now mandatory).
+
+* On some systems, metapost would crash inside the function that prints
+ the 'fatal error' message.
+
+* The 'glyph infont' operator would sometimes cause crashes, and in
+ other cases it generated bad output.
+
+* There was a space missing in the generated output when mpprocset
+ was set. This was still legal PostScript, but it confused mptopdf.
+
+* In previous 1.20X versions, the font map file was read for each
+ figure that contained a label, resulting in lots of harmless
+ but scary warnings being reported.
+
+* The --debug switch is now documented in the command-line help.
+
+* The help text now mentions the metapost version.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.208:
+----------------------------------------------------------------------
+
+* Previous versions of MetaPost 1.20x were overeager to remove file
+ extensions from the end of the jobname.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.207:
+----------------------------------------------------------------------
+
+* With the -file-line-error commandline option, MetaPost 1.20x always
+ reported the name of the most recently 'input' file instead of the
+ name of the actual current file.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.206:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Many of the commands in the MP language cause strings in the string
+ pool to be printed to new strings that are also built up in the
+ string pool. This could cause crashes when the new string wouldn't
+ fit in the memory allocated.
+
+* Failure to initialize the jobname in the MP_options struct could
+ cause crashes in library mode.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.205:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Metapost did not handle well files with extensions other than .mp.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.204:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Metapost could go into an endless output loop when characters in
+ bitmap fonts where used, because it tried to limit the %*Font output
+ line to a specific number of bytes.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.203:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Building version 1.202 for source required X11 headers to be installed.
+
+* Another infinite recursion trap added, now for erroneous vardefs
+ with suffixes (reported by Nicola Vitacolonna).
+
+* Fix infinite loop recursion on integer overflow (reported by Nicola
+ Vitacolonna, fix based on a hint from Dan Luecking).
+
+* In version 1.202, setting "job_name" from lua code caused a crash.
+
+* The "filename" field on the lua figure object in 1.202 was just the
+ extension, instead of the whole file name.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.202:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* Fix greypart <numeric> (always returned 0).
+
+* Make 'withcolor true' explicitly reset the color model to uninitialized.
+
+* Report which mem file can't be found, and use 'plain' instead of PLAIN
+ in the mem search warning messages.
+
+* Fix a crash on subsetting of some Type1 fonts because of a temporary
+ buffer overrun.
+
+* Correct a crash on SVG text output when the 8th bit is set.
+
+* Fix the use (reference) of 8-bit glyphs in SVG mode when prologues:=3.
+
+* Fix the output of text strings that reference the character at index 0.
+
+* Use ".ps" as file extension for negative charcodes (backward compatility).
+
+* Metapost sometimes printed "mp_vacuous" instead of "vacuous".
+
+* Fix rounding of negative scaled and fraction values.
+
+* Restore the error for 'arctime' out-of-bounds.
+
+* Moved the "turningnumber algorithms do not agree" message out of reach
+ (now only printed if tracingchoices>2 )
+
+* Fix a problem with dash scaling during picture copying.
+
+* TFM header bytes were written out with an offset of one.
+
+* Updated the mptrap files.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.201:
+----------------------------------------------------------------------
+
+Bug fixes:
+
+* There was a bug where sometimes the outer contour of a glyph that was
+ asked for via 'glyph X of' was missing from te output, depending on
+ the path drawing order inside the Type1 font.
+
+* Handling of MPTEXPRE label prefix files was broken.
+
+* Font subsetting for 8-bit characters in Type1 fonts was broken.
+
+* The use of "%{outputtemplate}" inside "outputtemplate" now generates
+ an error.
+
+* The first letter of the input file name was swallowed in the log file.
+
+* There is some rudimentary support for infinite recursion trapping now,
+ to help prevent segfaults&crashes due to C call stack exhaustion.
+
+* An unlucky change in glibc made compilation fail on new GNU/Linux
+ systems due to multiple incompatible definitions of 'getline()'.
+
+* There was a bug in the handling of quoted external commands for
+ MPXCOMMAND | MPXMAINCMD | TEX.
+
+* The main input file's opening brace and filename were not shown in
+ the log file output.
+
+* Non-colored picture objects (clipping and setbounds paths) are now
+ ignored when the color part is asked from within "within", for
+ backward compatibility reasons.
+
+* The trip and trap files are now part of the distribution and the
+ mptrap files have been updated.
+
+* The standard web2c argv[0] mem file mimicri was broken: 1.200 was
+ always looking for "mpost.mem" even when called under another name.
+
+* The manual pages for "mpost" and "dvitomp" have been updated, and the
+ old "mp" manual page has been removed.
+
+* The first letter of any missing input file name was not shown in the
+ terminal error message.
+
+* Output files are now once again written in the current directory even
+ if an explicit source directory is given. This includes the creation
+ of mpx files, but some trickery is used so that up-to-date existing
+ mpx files from the source directory take precedence.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.200:
+----------------------------------------------------------------------
+
+New features:
+
+* It is now possible to get the actual path drawing routines from a
+ font glyph. The syntax is :
+
+ q := glyph 113 of "cmr10";
+ q := glyph "one.oldstyle" of "lmr10";
+
+ "glyph" is a primary binary operator (like "subpath") that accepts
+ a string or number and a string, and the result is a picture.
+
+ The second argument is a tfm name. This will be combined with
+ a fontmap entry to find the font's PostScript source file.
+
+ If the first argument is a string, then it should be a Charstring
+ name in the postscript font source. If the first argument is
+ an integer, it is an index into the encoding of the font, and
+ the Charstring that is mapped to that index is taken (it follows
+ that numeric values have to be integers between 0 and 255).
+
+ The returned picture can be empty (if the tfm or the pfb or the
+ encoding or the Charstring was not found), otherwise it consists
+ of a list of 'fill' objects that use the the 'grey' color model.
+ Counterclockwise paths receive the grey value matching 'white',
+ clockwise paths 'black'.
+
+* MetaPost now supports string valued internal variables. Three of
+ these are predefined ("jobname", "outputformat", "outputtemplate"),
+ you can add more of them via "newinternal".
+
+ newinternal string s;
+ s := "hello";
+
+ The type of a new internal is either 'string' or 'numeric',
+ and defaults to numeric (this is for backward compatibility with
+ older versions of MetaPost). String internals are initialized to
+ the empty string, numeric internals are initialized to zero.
+
+* MetaPost now has a second backend that generates Scalable Vector
+ Graphics output. This new backend was requested by Dave Crossland, who
+ also provided the funding to make it possible. Dave, thank you again!
+
+ The default value of "outputformat" is "eps"; when you assign "svg"
+ you will get SVG output.
+
+ If you use text labels with SVG, you will probably also want to set
+
+ prologues:=3;
+
+ With this setting, MetaPost will convert the font into curves
+ (of course you also need a correct font map line, just as for
+ PostScript output).
+
+ With any other value of "prologues" you will simply get the SVG
+ default text font in a system-dependant encoding. This is unlikely
+ to be what you want!
+
+ A simple example:
+
+ outputformat := "svg";
+ outputtemplate := "%j-%c.svg";
+ beginfig(1);
+ fill fullcircle scaled 100 withcolor .4red;
+ endfig;
+ end.
+
+ In the lua bindings, there is the new figure method "svg()", that
+ gives back the SVG output string. This is subtly different from the
+ direct file output: the lua method does not prepend an XML declaration
+ (this makes embedded use of the generated XML easier).
+
+* The new internal string variable "outputtemplate" replaces
+ "filenametemplate". The big difference is that "outputtemplate"
+ is a true 'internal', so that you need a proper assignment.
+ On the positive side, this means that you can use its current
+ value with e.g. show and message.
+
+* "outputtemplate" has a new type of replacement: internal variable
+ names. Instead of the short "%j.%c", you could write:
+
+ outputtemplate := "%{jobname}.%{charcode}" ;
+
+ this type of replacement works for all internal variables,
+ including those defined via "newinternal".
+
+* There are two new numeric internals: "hour" and "minute".
+ (these are a consequence of the outputtemplate change)
+
+* The primitive "jobname" is now a string internal instead of a
+ special case. This implies you can assign to "jobname", but
+ such an assignment will only affect the picture output. The
+ job name for the purposes of log and mem file names is fixed
+ permanently at startup time and cannot be altered.
+
+* "mpost" can now pretend to be dvitomp. Either copy the executable
+ to the name "dvitomp", or pass the switch --dvitomp on the command
+ line.
+
+* The command line option --halt-on-error has been reinstated.
+
+* There is a new -s<internal>=<value> command line switch that can
+ be used to setup run time values. Such assignment will be executed
+ after initialization is complete (i.e. after mem file loading) but
+ before any other code is executed.
+
+ This works for all internal variables, including one defined
+ that may have been defined in the mem file via "newinternal".
+
+* "tracingstats:=1;" now prints the highest and total input levels.
+
+Bug fixes:
+
+* The turningnumber calculation had a rounding error in the internal
+ arithmetic that could cause incorrect numbers to be calculated
+ (typically resulting in a 'turning numbers do not match' error).
+
+* The parsing of command line arguments with options was broken.
+
+* Reading of files with 8-bit names has been fixed.
+
+* A patch by Melissa O'Neill fixes inclusion of some special Type1
+ formats.
+
+* There was a bug where, when "prologues:=3;", the lists of the
+ DocumentResources/DocumentSuppliedResources could appear in the eps
+ output partially uncommented.
+
+* Troff labels were completely broken in all MPlib-based versions.
+
+Other changes:
+
+* Many, many improvements to the manual and the tutorial. Sorry
+ Stephan, I don't know enough to list them all!
+
+* The old executable build system has been replaced by the new build
+ system from the TeXLive 2009 repository.
+
+* The MetaPost (and mplib) source code is now released under LGPL
+ instead of GPL, and uses a derivative of PyAvl instead of GNU libavl.
+
+* The web2c 'mktexfmt' feature is enabled for the program "mpost" once
+ again.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.102:
+----------------------------------------------------------------------
+
+* Printing of 8-bit string characters has been fixed.
+
+* In previous versions, TFM files and PFB fonts would not be read
+ properly on big-endian machines (e.g. powerpc)
+
+* The MetaPost distribution now contains "A Beginner's Guide to
+ MetaPost for Creating High-Quality Graphics" by Troy Henderson
+ and Stephan Hennig. This tutorial replaces Hobby's mpintro.tex.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.101:
+----------------------------------------------------------------------
+
+This is just a bugfix release. The following bugs / problem areas in
+MetaPost 1.100 have been fixed / improved:
+
+* TFM file generation was completely broken.
+
+* The job name discovery on the commandline has been improved.
+
+* Under some (rare) conditions MetaPost forgot to create a log file.
+
+* Labels containing char0 were exported to PostScript incorrectly.
+
+* On Windows, the DVI file that is the result from the internal call
+ to TeX for btex .. etex lables was not deleted automatically.
+
+----------------------------------------------------------------------
+What is new in MetaPost version 1.100:
+----------------------------------------------------------------------
+
+CHANGES compared to the previous release, 1.005:
+
+* This version is based on MPlib, the C conversion of MetaPost.
+
+ The one user-visible change is that the btex ... etex
+ label conversion is now handled internally instead of via
+ the external "mpware" programs. These programs are therefore
+ no longer distributed.
+
+* There is a new manual, mplibapi.pdf, that describes the internal
+ interface to MPlib.
+
+* The file 'mpintro' is no longer distributed because it is
+ obsolete (it has been that way for some time).
+
+* The distribution now includes Dan Luecking's mpsproof.tex.
+
+
+CHANGES compared to the previous beta, 1.091:
+
+* The DVI -> mpx converter was bugged when virtual fonts were used.
+
+* MP could crash when a string was added to the string pool that
+ was too large to fit.
+
+* The string pool compaction routine was called much too often, thus
+ preventing unnecessary slowdowns.
+
+* Various problems with uninitialized option settings and missing mem
+ files or pfb files have been fixed.
+
+* There was a line buffer overrun possible in the file reader.
+
+* mpost now honours --recorder and --file-line-error.
+
+* MP now accepts file names with paths (separator is /) and with
+ embedded spaces (using " for quoting)
+
+* There could be empty lines in the PS output.
+
+* Full 8-bit fonts (i.e. font using character slot 255) could create
+ an eternal loop.
+
+* The handling of equations with addition or substractions between two
+ unknowns in the right hand side was wrong.
+
+* The first line of the PS font encoding output could be broken
+ inbetween a glyph name and its preceding slash.
+
+* Font inclusion in the PS backend would fail for all fonts that had
+ glyph ids using the 8th bit.
+
+
+----------------------------------------------------------------------
+What is new in MetaPost beta version 1.091:
+----------------------------------------------------------------------
+
+* Dash lists were interfaced incorrectly by the lua bindings.
+
+* The Type 1 Font inclusion in the previous version produced invalid
+ subsets.
+
+* The configure script now also checks for sys/time.h
+
+* The error message you get for invalid mem files now mentions the
+ name of the file as well as the nature of the problem.
+
+----------------------------------------------------------------------
+What is new in MetaPost beta version 1.090:
+----------------------------------------------------------------------
+
+This MetaPost release is based on MPlib. For those of you who are not
+aware of the MPlib project yet:
+
+MPlib is the name of the new, revamped version of the MetaPost
+interpreter. It is implemented in Cweb, and internally consists
+of a core library, an mpx generation library, and a frontend
+driver program (mpost).
+
+There are no changes to the MetaPost language, but nevertheless there
+are some minor differences with the last pascal-web based version of
+MetaPost (1.005):
+
+* The MPlib distribution is released under the GPL version 2 or,
+ at your option, any later version.
+
+* The commandline is slightly different, run mpost --help for details.
+
+* The mem file format is changed, you have to regenerate any
+ existing ones.
+
+* The new mpx generation library includes the label generation
+ functionality that was previously provided by 'makempx', and
+ this internal code will be used instead of an external program.
+ That is, unless the MPXCOMMAND variable is set in the environment
+ or texmf.cnf. The 'mpware' programs became obsolete and are no
+ longer included in the distribution.
+
+* Most of the memory configuration variables from texmf.cnf
+ have become obsolete due to dynamic reallocation. The four remaining
+ ones are 'main_memory', 'hash_size', 'max_in_open', 'param_size'.
+ These are only taken into account at mem generation time, the
+ values are stored in and reloaded from the mem file.
+
+* The core MPlib library does not interpret an initial '&' as anything
+ special and it does not support re-initialization using a different
+ mem file either. The command line program mpost _does_ interpret '&'
+ as an alias for the -mem switch to preserve (some) compatility.
+
+* The MPlib distribution includes lua script language bindings.
+
+Following are the NEWS items for the previous beta releases of MPlib.
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.090:
+----------------------------------------------------------------------
+
+* The lua bindings to MPlib are added to the distribution, and
+ build.sh can now build an mplib.so loadable module for lua
+ (this needs an installed lua 5.1 distribution)
+
+* Some internal macros are renamed so that the exported C structure
+ fields could have better names, and a new document (mplibapi.tex)
+ provides the documentation of the C api and Lua bindings.
+
+* The texmf and manual trees are now included again.
+
+* (un)dumping mem files is delegated to a separate cweb source file.
+
+* All gcc-isms in the build and configure scripts have been removed.
+
+* The kpathsea library is updated.
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.085:
+----------------------------------------------------------------------
+
+* Determination of the mem name to use in non-ini mode is now much
+ closer to the web2c approach.
+
+* There is now a magic word in the beginning of the mem file to make
+ sure it is written by the correct version of MPlib.
+
+* Fixed the disappearing comment sign in the to-be-typeset document
+ created by the mpx generation subsystem.
+
+* Various identifiers have been renamed to avoid clashes (that prevented
+ the source from building correctly on many platforms)
+
+* A great many small changes and fixes have been added after running
+ splint on the generated C source.
+
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.080:
+----------------------------------------------------------------------
+
+* The MPlib distribution is released under the GPL version 2 or, at
+ your option, any later version. The copyright statements in the source
+ files have been updated to reflect this.
+
+* The mpost program banner now contains the kpathsea version, and no
+ longer mentions the fact that the source is now cweb at all.
+
+* The mpost program once again supports 'E' error responses.
+
+* There are some minor internal API changes, but there is still no
+ documentation for the API, so that is not very interesting yet.
+
+
+----------------------------------------------------------------------
+What is new in the beta release of MPlib 1.060:
+----------------------------------------------------------------------
+
+* The MPlib distribution is released under the GPL version 2.
+
+* This release is the first that replaces the old metapost distribution
+ completely. The executable is now named 'mpost' with engine name
+ 'metapost'.
+
+* The release now includes a cweb implementation of the makempx
+ functionality that is linked into the mpost executable.
+ This internal code will be used unless the MPXCOMMAND variable is set.
+ Because of this functionality, the mpware directory is no longer
+ included and the standalone programs 'makempx', 'newer', 'mpto',
+ 'dvitomp' and 'dmp'. are no longer maintained.
+
+* This is the first development release of the new cycle, and contains
+ all of the functionality of Metapost 1.005. The mpost version is now
+ 1.060, and the special version number for the cweb version has been
+ removed from the banner.
+
+----------------------------------------------------------------------
+What is new in the alpha release of MPlib (0.20.0):
+----------------------------------------------------------------------
+
+* Two bugs in MP 1.002 were fixed by Giuseppe Bilotta, both fixes
+ are about polygonals pens and will be included in the upcoming
+ MP 1.003 release also.
+
+* It is now possible to ask for the envelope of a path drawn as
+ traced by a (non-elliptical) pen:
+
+ path p,q;
+ p = fullcircle scaled 30;
+ q = envelope pensquare of p;
+
+* There is a lua interface now, and it is already used by luatex.
+
+ To play with this, currently the best solution is to fetch the
+ 0.25.0 beta of luatex: http://foundry.supelec.fr/projects/luatex
+ This embeds MPlib 0.25.0 as well as its documentation.
+
+* Many bugs were fixed.
+
+----------------------------------------------------------------------
+What is new in the alpha release of MPlib (0.10.0):
+----------------------------------------------------------------------
+
+* The source is converted to cweb, and split into a library part
+ (mpdir/lib/*.w) and a frontend executable (mpdir/mpost.w).
+
+* The front end executable is named "newmpost", this takes
+ care of configuring the MPlib library via C code, and uses
+ kpathsea for file searching. There is no change file involved,
+ and the web2c runtime library is not used.
+
+* Some of the internal arrays now grow dynamically when needed:
+
+ * the input buffer
+ * the string pool and number of strings
+ * the font memory and number of fonts
+ * the number of "readfrom" and "write" files
+ * the path segment size
+ * the input nesting stack
+ * the number of new internals
+ * the TFM writing arrays (but these are limited by TFM format)
+
+ Still not doing that (so these can only be changed in --ini mode):
+
+ * the main memory
+ * the hash size
+ * the number of simultaneous macro parameters
+ * the level of "input" file nesting
+
+* The following command-line options are ignored by the front-end
+ command (for now):
+
+ -[no-]file-line-error
+ -halt-on-error
+ -output-directory=
+ -[no-]parse-first-line
+ -recorder
+ -translate-file=
+ -8bit
+ -T
+
+ The other web2c command-line options should work as normal.
+
+* the mpware tools are not in this distribution, their functionality
+ will eventually be assimilated into the frontend application.
+
+* the build process depends on a local "ctangle" command being in the
+ path, for now. The confiration and building system is not yet complete.
+
+* API documentation is still missing, but the MetaPost input language
+ has not changed.
+
+
+----------------------------------------------------------------------
+What is new in version 1.005:
+----------------------------------------------------------------------
+
+* In MetaPost 1.004, mpost --version still incorrectly reported 1.003
+
+* C Compilation of MetaPost 1.004 was broken on MacOS X 10.5
+
+* The sources package did not contain mpboxes.pdf
+
+* Some last-minute fixes to the manual
+
+
+----------------------------------------------------------------------
+What is new in version 1.004:
+----------------------------------------------------------------------
+
+* The picture color component commands misbehaved in 1.003:
+ the current (default) colormodel was not taken into consideration,
+ so all colors had to be explicit for "redpart" etc. to work.
+ (this bug is the one broke the graph.mp package)
+
+ In 1.004 for "defaulted" colors, the suitable value in the current
+ (default) colormodel is returned without any errors. This change
+ also reverts to silently defaulting a 'black' color when asking
+ for the redpart etc. of an object that cannot be colored at all.
+
+* The picture color component commands misbehaved in 1.003 in
+ a different manner also: the defaults for uninitialized CMYK
+ color picture parts were still assuming 'black' was defined as
+ (1,1,1,1) instead of as (0,0,0,1).
+
+* The macro Gwithpc_ in the graph.mp package did not work properly
+ with non-rgb colormodel objects.
+
+* plain.mp has a new macro, 'colorpart', that returns the color
+ parts of a graphical object within a picture in a form suitable
+ for feeding it back to 'withcolor'.
+
+* The latest kpathsea library from TeXLive is included.
+
+* There is now a separate manual for the boxes package (mpboxes.pdf).
+
+
+----------------------------------------------------------------------
+What is new in version 1.003:
+----------------------------------------------------------------------
+
+* Polygonal pens now work better (bug #3 and #7 at supelec.fr).
+
+* When asking for a color part in a picture object, the color models
+ now have to match each other, otherwise an error will be reported
+ and the return value will be set to a 'black' part.
+
+* The Makefile fragment (metapost.mk) now defines a separate mpost
+ target for better integration in TeXLive.
+
+* There was a bug in the internal handling of withprescript and
+ withpostscript, resulting in incorrect output when paths using
+ such scripts were stored in picture variables.
+
+* A newline was missing from the PostScript output when the
+ procset internal variable was set, so the first line of that
+ accidentally became a PostScript comment.
+
+* Applicable changes from Knuth's updates for MetaFont 2.718281
+ are incorporated.
+
+* Mpto did not play nice with %&<format> verbatimtex lines, it now
+ automatically tries to detect comment-lines.
+
+* Dvitomp 1.003 has higher limits for some internal constants like
+ the number of allowed fonts in DVI files.
+
+* The manual is improved.
+
+
+
+----------------------------------------------------------------------
+What is new in version 1.002:
+----------------------------------------------------------------------
+
+* Version 1.001 introduced a memory allocation error in mpto that could
+ result in the program looping endlessly
+
+----------------------------------------------------------------------
+What is new in version 1.001:
+----------------------------------------------------------------------
+
+* The default cmyk 'black' color now uses only black, not all four
+ ink colors (after a discussion on the mailing list).
+
+* Some issues were reported with the new turningnumber algorithm,
+ all known problems are now fixed.
+
+* Gbor Braun discovered that mpost did not always download the font
+ encodings into all the created output files.
+
+* Akira Kakuto and Hartmut Henkel found some small issues in mpto
+ regarding trailing and leading whitespace.
+
+* A fix for the 'Helvetica' entries in trfonts.map was provided by
+ Werner Lemberg, and Michail Vidiassov supplied two extra font
+ entries for troff.map (Symbol and ZapfDingbats). Karl Berry
+ provided the new file troff-updmap.map, to be used by the updmap
+ tool in texlive.
+
+* Mpost now supports web2c's --output-directory option.
+
+* Any warnings about missing fonts and characters are now always
+ written to the terminal as well as to the log.
+
+* Now that makempx is a C program, it needed a different install line
+ in build.sh. Also, Olaf Mersmann contributed a patch to recognize
+ 'gmake' in build.sh
+
+* Luigi Scarso found some typing errors in the web source that prevented
+ clean weaving of the source.
+
+* Stephan Hennig fixed a number of problems in the manual (mpman.tex)
+ and the introduction paper (mpintro.tex). He also wrote new sections on
+ how to preview metapost graphics and on how to use metapost graphics
+ inside other documents. On top of that, the manual is now hypertext-aware,
+ and fixes for a whole series of small problems have been applied.
+
+----------------------------------------------------------------------
+What is new in version 1.000:
+----------------------------------------------------------------------
+
+* The use of DSC (document structuring) comments has been
+ been cleaned up, thanks to comments by Michail Vidiassov.
+
+* By setting prologues to 2 or 3, you can ask MetaPost to
+ reencode and include the used labels fonts in the output,
+ thus creating proper Encapsulated PostScript files even
+ if labels are present.
+
+* Support for greyscale and cmykcolor models is added.
+
+* The new drawing options "withprescript" and withpostscript"
+ allow the user to attach PostSCript special text to a specific
+ drawing object.
+
+* Setting the new internal "mpprocset" to 1 will make MetaPost
+ create a somewhat extended preamble that defines shortcuts
+ for the postscript commands (e..g "l" instead of "lineto").
+ For big images, this can help shrink the output a bit.
+
+* The pool file is now integrated in the executable, so there
+ is not separate 'mp.pool' anymore, except at build time.
+
+* Groff support is redone, and dmp now uses kpathsea searching.
+ Groff related changes are thanks to the efforts of Werner
+ Lemberg and Michail Vidiassov
+
+* makempx is now a compiled executable on all systems,
+ thank you Akira Kakuto
+
+* The error for 'special's longer then 255 characters
+ is removed, so specials can now be of any length.
+
+* There is new turningnumber implementation that attempts
+ to find the mathematically correct "turningnumber" of a
+ path. The formulae are derived from a mailinglist discussion
+ between (especially) Dan Luecking and Giuseppe Bilotta.
+
+* The manual is updated and modernized. It is currently
+ maintained by Stephan Hennig and Troy Henderson.
+
+------------------------------------------------------------------
+Changes in version 0.920:
+----------------------------------------------------------------------
+
+* Fixed a long-standing bug in web2c where changing values of the
+ memory_size setting in web2c could cause crashes and other random
+ problems. The memory array size is now written to the dump file
+ and loading is aborted if the values do not match.
+* Implement configurable figure output filename templates.
+* Implement cmyk, greyscale, and marking only color models.
+* The mpost executable is now version 0.920
+* mpost no longer autoconverts r==g==b colors to grayscale in the
+ postscript output.
+
+----------------------------------------------------------------------
+Changes in version 0.902:
+----------------------------------------------------------------------
+* Fix a bug in mpto resulting in correctly placed labels (with
+ thanks to Dan Luecking)
+* Fix a bug blocking compilation of dmp on MacOSX
+* The mpost,dmp,mpto executables are now version 0.902
+
+
+----------------------------------------------------------------------
+Changes in version 0.901:
+----------------------------------------------------------------------
+* A corrected bugfix for bug item 3 from version 0.9 (the old fix
+ made metapost fail the trap test)
+* Included mpost.mp for mem generation
+* Updated the trap test output.
+* The mpost executable is now version 0.901
+
+----------------------------------------------------------------------
+What is new in version 0.9:
+----------------------------------------------------------------------
+1. There is a new internal quantity called mpversion that reports the
+ current metapost version, and the version information is also written
+ to the PostScript file.
+2. The LaTeX sources of the mpman, mpintro, and mpgraph manuals have
+ become part of the distribution package.
+3. TEX.mp now has TeX format support through a pair of macros called
+ TEXPRE() and TEXPOST(). This llows you to process the contents of
+ the TEX() macro with, for example, LaTeX (instead of plain TeX).
+ An example is given in the manual.
+4. metapost now writes a %%HiReSBoundingBox comment
+5. The EPS output no longer contains actual spaces within PostScript
+ strings as for example output by label("a space"), but their
+ octal escape (\040) instead.
+6. The EPS output now also has a %%BeginProlog DSC comment
+ as well as %%EndProlog
+7. The comments in the Web source have been changed to point out
+ that on modern machines, acquiring the random seed has actually
+ become a system-dependant operation (a granularity of whole seconds
+ is not small enough on new machines).
+8. The 'newer' command now accepts more than 2 arguments, testing
+ each of the files in turn.
+
+----------------------------------------------------------------------
+Bugfixes in version 0.9:
+----------------------------------------------------------------------
+1. Documentation improvements: all known errata and typos have been
+ removed, better explanations of e.g. dash patterns and dotlabel have
+ been provided, and a number of omissions has been rectified.
+2. The BoundingBox was not computed correctly when a filldraw command
+ with a noticeable pen size was used at the edge of the picture.
+3. Paths starting with degenerate constructions like (0,0)--(0,0)--(0,0)
+ could overflow memory.
+4. The PostScript output could accidentally contain 8-bit characters
+ within PostScript strings in previous versions because a test was
+ shared between terminal printing and PostScript printing.
+5. A bug has been found in the assignment of serial numbers to independant
+ variables in metafont 2.71828. This bug affected MP as well, and the
+ same patch has been applied.
+6. The turningnumber was sometimes wrong in unexpected ways. The new
+ implementation is still sometimes wrong (when there are strange path
+ segments involved), but in a much more predictable way: the new code
+ always draws straight lines between the actual points, and calculates
+ the turningnumber based on that path instead of the actual path. The
+ effect is that cusps and loops within segments are now completely
+ ignored. A more thorough fix of turningnumber is planned for the
+ next release.
+7. There was an 'off by one' error in dvitomp wrt. the interpretation
+ of virtual fonts.
+8. mpto uses a new TeX macro for the generation of labels, making it
+ more robust wrt. strange user code within the actual label text.
+9. A missing colon in boxes.mp has been added
+10. A missing save in mfplain.mp has been added
+11. The generisize in boxes.mp has been fixed so that it now accepts [[ as
+ a valid variable name
+
+----------------------------------------------------------------------
+Version 0.641:
+----------------------------------------------------------------------
+The only change was to fix the code for transforming a picture that
+contains a filldraw. Version 0.64 introduced a bug that caused an
+inappropriate memory reference in that case.
+
+----------------------------------------------------------------------
+What is new in Version 0.64:
+----------------------------------------------------------------------
+1. A new primitive command closefrom filename closes a readfrom file
+ so that subsequent calls to readfrom with that file name will go back
+ to the beginning of the file.
+2. The ^^ notation for unprintable characters is now used only when printing
+ on the terminal or the log file. Internal computations and the write
+ command are all 8-bit clean. (This is partly due to material in mp.ch
+ that changes the initialization of the xchr array. Without these
+ system-dependent changes, the write command would map all non-ascii
+ characters to spaces.)
+3. Arithmetic overflow during a comparison such as 20000>-20000 is now
+ ignored. This avoids extraneous error message when using the graph.mp
+ macro package.
+4. Transformations with negative determinants now work properly on pictures
+ drawn with polygonal pens.
+5. When the readfrom operator is applied to a file that does not exist,
+ an attempt to close a non-open file could cause problems in some
+ implementations. This has now been fixed.
+6. Using draw picture_expression withpen where the picture_expression
+ was a scaled picture containing dashed lines, the dash lengths would
+ change. This bug has been fixed.
+7. The dashpart operator could return an invalid picture or a picture that
+ is not properly scaled. This has also been fixed.
+8. The |char_base| variable could become negative when using fonts that
+ do not start at character 0. There was also bad Pascal code in function
+ b_open_in. This has all been fixed.
+9. Dvitomp has been fixed to avoid a font data structure problem that
+ could cause some characters to come out in the wrong font when you
+ mix virtual and non-virtual fonts.
+10. Dvitomp now correctly prints font names when there is a checksum
+ mismatch, and it aborts instead of just printing an error if a tfm
+ or vf file is bad.
+11. In plain.mp, the drawdblarrow macro now uses filldraw so that it works
+ better with large pen sizes.
+
+----------------------------------------------------------------------
+Version 0.632:
+----------------------------------------------------------------------
+When prologues is negative, the output files use full precision for
+coordinates in "%%BoundingBox" comments. In btex..etex blocks,
+"number too large" and "invalid character" errors are suppressed.
+The result of btex..etex is now guaranteed to be in a setbounds path
+so that a for...within iteration will always treat it as a unit.
+
+There are also some obscure bug fixes involving string compaction when
+scanning a file name or when mp is compiled in debug mode. Some possible
+identifier name conflicts and range check errors have also been fixed.
+
+
+----------------------------------------------------------------------
+Version 0.631:
+----------------------------------------------------------------------
+This version fixes an obscure bug that could cause certain perfectly valid
+strings to be printed as "???" or " NONEXISTENT". It also includes a minor
+fix to the PATHEXPAND code that prevents running out of file descriptors.
+
+
+----------------------------------------------------------------------
+What is new in Version 0.63:
+----------------------------------------------------------------------
+1. Backslashes in the PostScript output are rendered correctly. They used
+ to come out as (\) instead of (\\).
+2. Recycling an independent variable should no longer cause spurious overflows.
+ (This bug was recently found in mf.web.)
+3. Pythagorean addition should now be faster in certain trivial cases.
+4. Rotating text by arbitrary angles should no longer cause bad PostScript
+ output. The problem was that arguments to "fshow" could be inaccurate.
+5. Obscure bugs inherited from mf.web are now fixed. These involve
+ balancing parentheses showing on the terminal, reporting the correct
+ line number in case of buffer overflow, and removing spurious reference
+ counts that could effect end-of-job statistics.
+6. Fonts with ec=255 should no longer cause mp's PostScript output routines
+ to go into a loop.
+7. When mp's string mechanism was heavily used, file names could occaisonally
+ be printed on the terminal and log file as "(?)". This has been fixed.
+8. Setting PATHEXPAND in site.h causes mp, dvitomp and dmp to understand "//"
+ in path variables as "search multiple levels of subdirectories". This is
+ for compatibility with recent versions of the Web2c TeX distribution.
+9. A typo in mpware/makempx and mpware/troffmpx has been fixed. Previous
+ versions of these scripts would not run on some systems.
+10. Data files *.d have been added to the doc directory. These are used by
+ doc/mpgraph.mp which generates figures for "Drawing Graphs with MetaPost".
+11. Typos in mpintro.tex and mp.web's TeX material have been fixed.
+12. Files examples.mp, mpintro.tex and mpintro.bib have moved from mplib to
+ the doc directory.
+13. The author's email address now appears in the README file.
+
+
+----------------------------------------------------------------------
+Macros added to the mplib directory between Versions 0.50 and 0.62:
+----------------------------------------------------------------------
+rboxes.mp is a slightly more general version of boxes.mp
+TEX.mp provides a way of running tex dynamically instead of as a pre-processor
+graph.mp, format.mp, and sarith.mp are documented in doc/mpgraph.ps
+(This is the same as ftp://netlib.att.com/netlib/att/cs/cstr/164.ps.Z)
+marith.mp, string.mp, texnum.mp, and troffnum.mp are low-level packages
+used by graph.mp, format.mp, and sarith.mp.
+
+
+----------------------------------------------------------------------
+Other minor bug fixes subsequent to Version 0.60
+----------------------------------------------------------------------
+1. plain.mp has been fixed so that the x**y works properly when x<0 and y is
+ a negative integer.
+2. Programs mptotex.c and mptotr.c which extract btex..etex material have been
+ fixed so they work properly with input files that do not end with a newline
+ character.
+3. Program dmp.c which handles troff output from btex..etex blocks has been
+ modified to avoid outputting any non-ASCII characters that the C function
+ isprint() accepts.
+4. Program dmp.c no longer gets troff graphics specials confused with text.
+ This seldom matters because btex..etex blocks are unlikely to contain
+ troff graphics.
+5. Pictures containing clipped subpictures could come out with some colors
+ in the subpicture wrong.
+6. Colors in PostSript output were not being restricted to the standard 0..1
+ range.
+7. Transforming a path or a pen should no longer generate extraneous overflow
+ errors in certain unusual situations.
+8. Drawing with a degenerate 2-vertex polygonal pen such as penrazor should
+ no longer cause an infinite loop in certain unusual situations.
+9. There were some bugs in the mfplain macros. (These macros are designed
+ to similate plain METAFONT.) The drawing and filling macros now apply
+ currenttransform to the path but not the pen rather than vice versa.
+ The predefined modes now set o_correction to 1.0.
+10. For security reasons, mp can no longer read or write files whose names
+ begin with '.'
+
+
+----------------------------------------------------------------------
+Changes to the MetaPost language between Version 0.50 and Version 0.60
+----------------------------------------------------------------------
+1. New operator `readfrom <filename>' and new command
+ `write <string expression> to <filename>' do file I/O. Plain defines
+ a special string EOF that readfrom returns to indicate end-of-file
+ and write..to understands as well.
+2. New iteration type `for p within <picture expression>: <loop text> endfor'
+ iterates through the interior components of the picture. An `interior
+ component' is a single pen stroke, filled outline, or piece of typeset
+ text. A part of the picture enclosed in a clipping or setbounds path
+ also counts as an interior component. If the whole picture is enclosed
+ in such a path, the for..within iteration looks inside. Note that a
+ picture generated by btex..etex is enclosed in a setbounds path.
+3. The length operator now applies to pictures. It returns the number of
+ interior components.
+4. New boolean operators stroked, filled, textual, clipped, bounded test
+ the first component of a picture. A picture enclosed in a clipping or
+ setbounds path counts as a single component.
+5. Part extraction operators now work for pictures. Standard operators
+ redpart, greenpart, bluepart apply to the color of the first component
+ and xpart, ypart, xxpart, xypart, yxpart, yypart extract parts of the
+ tranformation that has been applied to a text component. If `textual p'
+ is false, the transform components are all zero; if `clipped p' or
+ `bounded p' is true, the color parts are all zero. Additional operators
+ fontpart, textpart, pathpart, penpart, dashpart extract other information
+ from the first component of a picture. They all return null values when
+ the first component has the wrong type: fontpart and textpart return
+ null strings; pathpart returns the path (0,0); penpart returns nullpen;
+ and dashpart returns nullpicture.
+6. The construction `dashed nullpicture' is now a no-op. It used to be
+ an error.
+7. The clip and setbounds statements used to ignore operations on empty
+ pictures. Now they do not.
+8. Structuring comments in the PostScript output are now based on EPSF-3.0
+ as described in the 2nd Edition of the PostScript Reference Manual.
+ When prologues is 0, some structuring comments are included but the
+ output is not flagged a `conforming document'. Previous versions of
+ MetaPost behaved similarly but used slightly different structuring
+ comments.
+9. When warningcheck is 0, numeric tokens and results from the hex and
+ oct operators can be as large as 32767.99998. The old limit of about
+ 4096 applies only when warningcheck is positive.
+10. Various optimizations should make the output a little more compact.
+11. For PostScript engines that obey the scan-conversion rules documented
+ in the 2nd edition PostScript Language Reference Manual, hrules and
+ vrules in btex..etex blocks should now come out to exactly the right
+ number of pixels. The change affects all pen strokes drawn in MetaPost
+ It is implemented via PostScripts dtransform and idtransform operators.
+12. A bug involving setbounds and MetaPost's corner operators has been fixed.
+13. Degenerate elliptical pens no longer cause PostScript to divide by zero.
+14. Fixed a very obscure bug involving readstring and end-of-file.
+15. String compaction statistics are now printed correctly when the job
+ terminates with tracingstats positive.
+
+
+
+----------------------------------------------------------------------
+Changes to the source files between Version 0.50 and Version 0.60
+----------------------------------------------------------------------
+
+CHANGES to ./README.MP
+The installation instructions should now be clearer. They also explain
+how to cope with verious versions of WEB2C.
+
+CHANGES to ./site.h
+I removed unused entries and clarified instructions in commentary material.
+Confusing comments about possibly merging it with the WEB2C version of site.h
+were removed--I think such merging is a bad idea.
+
+CHANGES TO ./Makefile, mp/Makefile, mpware/Makefile:
+Improved default settings, simplified the `install' recipe,
+fixed a few missing depencies, portability problems, etc.
+
+RENAMED FILES
+ mp/mp.defines, mpware/mpware.defines, mpware/dvitompext.c
+TO mp/mp.def, mpware/mpware.def, mpware/dvimpext.c
+(The names also changed in the Makefiles and convert scripts)
+
+CHANGES TO mp/mp.web, mp/mp.ch, mp/mp.def, mp/mpext.c:
+Lots of new features were added as noted above. The only new system-
+dependencies are for `readfrom' and `write...to'.
+The change file now increases max_read_files; it doesn't bother with
+max_write_files, but perhaps it should. There is a new change entitled
+"Path selector for..readfrom file". From the web2C sources I borrowed
+a change "`logname' is declared in <unistd.h> in some systems". I also
+added a PASCAL-like eof() routine to mpext, removed a change entitled
+"avoid using eof() in read_psname_table" and added a new change
+"[48.1199] `eof'...[in read_mem_file]".
+
+Reorganization of math routines in the mp directory:
+I moved the floating-point math routines from mpext.c to mpath.c. A
+C-language version of the standard math routines was moved from mpmath.c
+to a new file pmath.c for use in mathtest only. This required chages to
+mathtest.c and time.c (also used only for mathtest). The point of all
+this is that there is now just one copy of the floating-point math routines
+and it is used for mathtest and (optionally) for mp itself.
+
+Routines in doc and mp/trapdir:
+The output was updated to Version 0.60. Another test file mptrap.mp
+tests new features. There have also been minor updates to the manual,
+although the new features for Version 0.60 are not included yet.
+
+CHANGES to macros in mplib:
+A minor change to boxes.mp should make it more robust. Changed default
+setting of tracinglostchars in mfplain.mp and plain.mp. Added a string
+constant EOF to plain.mp for use with readfrom and write..to.
+Changed mproof.tex to make it more portable as suggested by Knuth.
+
+CHANGES to mpware/dvitomp.web, mpware/dvitomp.ch:
+The web file was changed to output rules as horizontal or vertical
+penstrokes with butt endcaps. This also affected dvitomp.ch. Also in
+dvitomp.ch, put terminal output on stdout instead of stderr and require
+the output file to be given on the command line.
+
+CHANGES to mpware/makempx, mpware/troffmpx:
+Added comments explaining what path names need fixing. Portability improvements
+and dvitomp's output change affect makempx only.
+
+CHANGES to mpware/mptotex.c mpware/mptotr.c mpware/testex.err mpware/testex.mp:
+Ignore an initial newline in the TeX (or troff) material to avoid generating
+a blank line in the output file. The test file now covers this case.
+
+CHANGE to mpware/newer.c
+Minor changes to make it compile in strict ANSI/POSIX environments.
diff --git a/systems/doc/metapost/grdemo-doc.pdf b/systems/doc/metapost/grdemo-doc.pdf
new file mode 100644
index 0000000000..4d11331f52
--- /dev/null
+++ b/systems/doc/metapost/grdemo-doc.pdf
Binary files differ
diff --git a/systems/doc/metapost/grdemo.pdf b/systems/doc/metapost/grdemo.pdf
new file mode 100644
index 0000000000..faeaa99e6f
--- /dev/null
+++ b/systems/doc/metapost/grdemo.pdf
Binary files differ
diff --git a/systems/doc/metapost/mpboxes.pdf b/systems/doc/metapost/mpboxes.pdf
new file mode 100644
index 0000000000..dba64f0c39
--- /dev/null
+++ b/systems/doc/metapost/mpboxes.pdf
Binary files differ
diff --git a/systems/doc/metapost/mpgraph.pdf b/systems/doc/metapost/mpgraph.pdf
new file mode 100644
index 0000000000..2ec2ac7801
--- /dev/null
+++ b/systems/doc/metapost/mpgraph.pdf
Binary files differ
diff --git a/systems/doc/metapost/mpintro.pdf b/systems/doc/metapost/mpintro.pdf
new file mode 100644
index 0000000000..29b6d37175
--- /dev/null
+++ b/systems/doc/metapost/mpintro.pdf
Binary files differ
diff --git a/systems/doc/metapost/mplibapi.pdf b/systems/doc/metapost/mplibapi.pdf
new file mode 100644
index 0000000000..de3847e0e5
--- /dev/null
+++ b/systems/doc/metapost/mplibapi.pdf
Binary files differ
diff --git a/systems/doc/metapost/mpman.pdf b/systems/doc/metapost/mpman.pdf
new file mode 100644
index 0000000000..16e32d2ca4
--- /dev/null
+++ b/systems/doc/metapost/mpman.pdf
Binary files differ
diff --git a/systems/doc/metapost/source-manual/Makefile b/systems/doc/metapost/source-manual/Makefile
new file mode 100644
index 0000000000..e3e170652b
--- /dev/null
+++ b/systems/doc/metapost/source-manual/Makefile
@@ -0,0 +1,89 @@
+# Makefile for MetaPost documentation. Public domain.
+# Rules for the groff/troff docs are in TeX Live,
+# texmf-dist/doc/metapost/base/Makefile.
+
+RM = -rm -f
+latex = latex
+pdflatex = pdflatex
+contextpdf = texexec
+contextdvi = texexec --dvi
+dvips = dvips
+bibtex = bibtex
+mpost = mpost -tex=tex
+mkindex = makeindex -c -s mpman.ist
+
+all: pdf
+pdf: mpman.pdf mpgraph.pdf mpboxes.pdf mplibapi.pdf
+ps: mpman.ps mpgraph.ps mpboxes.ps mplibapi.ps
+
+mplibapi.pdf: mplibapi.tex
+ mv -f mpgraph.mp mpgraph.saved
+ $(contextpdf) mplibapi
+ mv -f mpgraph.saved mpgraph.mp
+
+mpboxes.pdf: mpboxes.tex mpboxes.bib mpboxes.mp
+ $(mpost) mpboxes
+ $(pdflatex) mpboxes
+ $(bibtex) mpboxes
+ $(pdflatex) mpboxes
+ $(mkindex) mpboxes
+ $(pdflatex) mpboxes
+
+mpgraph.pdf: mpgraph.tex mpgraph.bib mpgraph.mp
+ $(mpost) mpgraph
+ $(pdflatex) mpgraph
+ $(bibtex) mpgraph
+ $(pdflatex) mpgraph
+ $(pdflatex) mpgraph
+
+mpman.pdf: mpman.tex mpman-app-legacy.tex mpman-app-optab.tex mpman-app-refman.tex mpman-app-numbersystems.tex mpman.bib mpman.ist mpman.mp charts.mp mpman-charts.mp
+ $(mpost) mpman
+ $(mpost) mpman-charts
+ $(pdflatex) mpman
+ $(bibtex) mpman
+ $(pdflatex) mpman
+ $(pdflatex) mpman
+ $(mkindex) mpman
+ $(pdflatex) mpman
+
+mplibapi.ps: mplibapi.tex
+ mv -f mpgraph.mp mpgraph.saved
+ $(contextdvi) mplibapi
+ mv -f mpgraph.saved mpgraph.mp
+ $(dvips) mplibapi
+
+mpboxes.ps: mpboxes.tex mpboxes.bib mpboxes.mp
+ $(mpost) mpboxes
+ $(latex) mpboxes
+ $(bibtex) mpboxes
+ $(latex) mpboxes
+ $(latex) mpboxes
+ $(mkindex) mpboxes
+ $(latex) mpboxes
+ $(dvips) mpboxes
+
+mpgraph.ps: mpgraph.tex mpgraph.bib mpgraph.mp
+ $(mpost) mpgraph
+ $(latex) mpgraph
+ $(bibtex) mpgraph
+ $(latex) mpgraph
+ $(latex) mpgraph
+ $(dvips) mpgraph
+
+mpman.ps: mpman.tex mpman-app-legacy.tex mpman-app-optab.tex mpman-app-refman.tex mpman.bib mpman.ist mpman.mp charts.mp mpman-charts.mp
+ $(mpost) mpman
+ $(mpost) mpman-charts
+ $(latex) mpman
+ $(bibtex) mpman
+ $(latex) mpman
+ $(latex) mpman
+ $(mkindex) mpman
+ $(latex) mpman
+ $(dvips) mpman
+
+clean:
+ $(RM) *.aux *.bbl *.blg *.dvi *.idx *.ilg *.ind *.log *.mps *.mpx *.out *.toc mpxerr.*
+ $(RM) *.tui *.tuo *.tmp *-mpgraph.mp
+
+distclean: clean
+ $(RM) mp?*.pdf mp?*.ps
diff --git a/systems/doc/metapost/source-manual/README b/systems/doc/metapost/source-manual/README
new file mode 100644
index 0000000000..2f7a8f66ad
--- /dev/null
+++ b/systems/doc/metapost/source-manual/README
@@ -0,0 +1,21 @@
+Public domain.
+
+This is the source for the documentation for MetaPost, consisting of
+"A User's Manual for MetaPost", "Drawing Boxes with MetaPost",
+"Drawing Graphs with MetaPost" and the introductory article "The
+MetaPost System", written by John D. Hobby.
+They were converted to more modern LaTeX by Dylan Thurston,
+later updated Troy Henderson and Stephan Hennig, and currently
+maintained by the MetaPost developers. The manual
+may be freely used and modified, but John Hobby makes these requests:
+
+ - I request that it remain clear that I am the author of
+ "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+ - I request to be consulted before significant changes are made.
+
+See the end of mpman.tex or mpgraph.tex for the precise conditions.
+Auxiliary files (and the MetaPost software itself) are public domain,
+including the data (.d) files here, which due to file format limitations
+cannot incorporate a license themselves.
+
+See the Makefile for the sequence of commands to create the DVI/PS/PDF output.
diff --git a/systems/doc/metapost/source-manual/TODO b/systems/doc/metapost/source-manual/TODO
new file mode 100644
index 0000000000..db21b676ab
--- /dev/null
+++ b/systems/doc/metapost/source-manual/TODO
@@ -0,0 +1,124 @@
+This file contains an unsorted list of tasks to be done on the
+MetaPost manual. Feel free to add new, move or remove finished
+items.
+
+Where to put new items?
+-----------------------
+Section 'Wanted For Release' contains items that we want to be
+finished before the next release. Even minor issues can and
+should be added here.
+
+Items in section 'Mid Term Issues' have no dead-line, but should
+be self-contained enough to be done independent from other stuff.
+
+Items in section 'Long Term Issues' are less actively worked on.
+The reason they are less actively worked on is not lack of
+importance, but lack of developer resources. Nevertheless, they
+are on the agenda. Contributions are welcome!
+
+How to pick items?
+------------------
+You can indicate interest or active work on an item by putting your
+initials in parenthese in front of that item and checking the
+modified TODO file into the repository. That way, anybody who is
+subscribed to the metapost-commits list is notified of your
+interest. Additionally, it is wise to communicate that you're
+working on an issue (you didn't remember adding yourself) on the
+mp-implementors list or alternatively the metapost list.
+
+
+*****************************
+*** Wanted For Release ***
+*****************************
+* Describe boundingpath
+
+* Describe prescriptpart/postscriptpart.
+
+* Describe penrazor, penspeck.
+
+* Describe drawdot withpen counter-intuitivity. Describe recent change
+ in drawdot definition.
+
+
+
+*****************************
+*** Short term issues ***
+*****************************
+
+Integrating Text and Graphics:
+* Fix bad description of prologues in table ivartab.
+* Move discussion of prologues to sec. workflow2.
+* Discuss difference between
+ label(btex ... etex, ...)
+ draw btex ... etex
+
+Advanced Graphics:
+* Describe turningnumber (mention differences in sec. 'MetaPost
+ Versus METAFONT').
+* Make fig56 black and white.
+
+Notes on the MetaPost Workflow:
+* Describe variables jobname, charcode.
+
+Reference Manual:
+* Describe environment variables and configuration files.
+
+Legacy Information:
+* Cite original Hobby papers.
+
+Debugging:
+* turningnumber and tracingchoices > 2
+
+
+
+*****************************
+*** Mid Term Issues ***
+*****************************
+
+Introduction:
+* Revise introduction.
+
+Integrating Text and Graphics:
+* Completely revise this section and consolidate information
+ scattered around mpman.
+* More information and examples on alternatives for calling TeX
+ or LaTeX from within MetaPost.
+* Revise (and add more) flow charts for MetaPost workflow.
+* Describe whitespace handling of verbatimtex/btex/etex.
+* Why is verbatimtex\end{document}etex "safer", cf. sec. 13.1?
+* Discuss difference between "draw <pic> withpen" and
+ "label(<pic>, ...) withpen" (when label bug is fixed).
+
+Advanced Graphics:
+* Add a sub-section discussing colours.
+* Colour cars and change code example in section piccomp.
+
+Reference Manual:
+* Describe missing variables, constants, and operators.
+* Add description of interaction mode.
+
+Legacy Information:
+* Describe mpware (currently scattered around in mpman).
+
+
+
+
+*****************************
+*** Long Term Issues ***
+*****************************
+
+Title page:
+* Add decent title graphics.
+
+Reference Manual:
+* Review presentation of primitives and plain macros in appendix A.
+* Build reference manual automatically from mp.web (as a separate manual?).
+
+General:
+* Make mpman self-contained (no need to look-up sth. in 'The MetaFontbook').
+* Make manual sources compatible with preview mode (Emacs).
+* Make manual sources LaTeX2e conform.
+* Make manual sources look nice in Emacs (AUCTeX font-locking).
+* Review overall layout of the manuals (type area, float placement,
+ listing presentation etc.)
+
diff --git a/systems/doc/metapost/source-manual/agepop91.d b/systems/doc/metapost/source-manual/agepop91.d
new file mode 100644
index 0000000000..2dcd5dc0da
--- /dev/null
+++ b/systems/doc/metapost/source-manual/agepop91.d
@@ -0,0 +1,85 @@
+00 4011000
+01 3969000
+02 3806000
+03 3718000
+04 3717000
+05 3702000
+06 3681000
+07 3575000
+08 3512000
+09 3767000
+10 3703000
+11 3662000
+12 3484000
+13 3414000
+14 3409000
+15 3293000
+16 3362000
+17 3360000
+18 3391000
+19 3836000
+20 4120000
+21 4009000
+22 3767000
+23 3664000
+24 3812000
+25 3866000
+26 4069000
+27 4242000
+28 4086000
+29 4580000
+30 4501000
+31 4432000
+32 4387000
+33 4387000
+34 4534000
+35 4325000
+36 4201000
+37 4132000
+38 3788000
+39 4127000
+40 3836000
+41 3721000
+42 3634000
+43 3589000
+44 3998000
+45 2834000
+46 2823000
+47 2850000
+48 2857000
+49 2737000
+50 2528000
+51 2340000
+52 2298000
+53 2280000
+54 2200000
+55 2129000
+56 2195000
+57 2068000
+58 1946000
+59 2085000
+60 2124000
+61 2100000
+62 2076000
+63 2145000
+64 2138000
+65 2072000
+66 2069000
+67 2026000
+68 1911000
+69 1960000
+70 1886000
+71 1731000
+72 1649000
+73 1518000
+74 1458000
+75 1405000
+76 1334000
+77 1244000
+78 1204000
+79 1091000
+80 970000
+81 883000
+82 799000
+83 739000
+84 644000
diff --git a/systems/doc/metapost/source-manual/agepopm.d b/systems/doc/metapost/source-manual/agepopm.d
new file mode 100644
index 0000000000..7451d4601b
--- /dev/null
+++ b/systems/doc/metapost/source-manual/agepopm.d
@@ -0,0 +1,85 @@
+00 4.011
+01 3.969
+02 3.806
+03 3.718
+04 3.717
+05 3.702
+06 3.681
+07 3.575
+08 3.512
+09 3.767
+10 3.703
+11 3.662
+12 3.484
+13 3.414
+14 3.409
+15 3.293
+16 3.362
+17 3.36
+18 3.391
+19 3.836
+20 4.12
+21 4.009
+22 3.767
+23 3.664
+24 3.812
+25 3.866
+26 4.069
+27 4.242
+28 4.086
+29 4.58
+30 4.501
+31 4.432
+32 4.387
+33 4.387
+34 4.534
+35 4.325
+36 4.201
+37 4.132
+38 3.788
+39 4.127
+40 3.836
+41 3.721
+42 3.634
+43 3.589
+44 3.998
+45 2.834
+46 2.823
+47 2.85
+48 2.857
+49 2.737
+50 2.528
+51 2.34
+52 2.298
+53 2.28
+54 2.2
+55 2.129
+56 2.195
+57 2.068
+58 1.946
+59 2.085
+60 2.124
+61 2.1
+62 2.076
+63 2.145
+64 2.138
+65 2.072
+66 2.069
+67 2.026
+68 1.911
+69 1.96
+70 1.886
+71 1.731
+72 1.649
+73 1.518
+74 1.458
+75 1.405
+76 1.334
+77 1.244
+78 1.204
+79 1.091
+80 0.97
+81 0.883
+82 0.799
+83 0.739
+84 0.644
diff --git a/systems/doc/metapost/source-manual/charts.mp b/systems/doc/metapost/source-manual/charts.mp
new file mode 100644
index 0000000000..f7ba689a50
--- /dev/null
+++ b/systems/doc/metapost/source-manual/charts.mp
@@ -0,0 +1,120 @@
+% Support package for drawing charts.
+
+def _drawNode = drawboxed enddef;
+
+%%% These paramaters determine the size of nodes and the grid distance.
+newinternal applwidth; applwidth := 30bp;
+newinternal applheight; applheight := 14bp;
+newinternal extwidth; extwidth := 30bp;
+newinternal extheight; extheight := 14bp;
+newinternal rowscale; rowscale := 100bp;
+newinternal colscale; colscale := 100bp;
+
+%%% This macro builds and draws a rectangular node at a given location
+%%% with text indicating an application.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the box node.
+def appl(suffix i)(expr coor)(text t) =
+ boxit.i(t);
+ i.c = coor;
+ i.e = i.c + .5applwidth*right;
+ i.n = i.c + .5applheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws an oval node at a given location with
+%%% text indicating a file name extension.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the oval node.
+def ext(suffix i)(expr coor)(text t) =
+ circleit.i(t);
+ i.c = coor;
+ i.e = i.c + .5extwidth*right;
+ i.n = i.c + .5extheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws a rectangular node at a given location
+%%% with text indicating an application.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the box node.
+def appl_rc(suffix i)(expr coor)(text t) =
+ boxit.i(t);
+ i.c = (colscale * ypart coor, -rowscale * xpart coor);
+ i.e = i.c + .5applwidth*right;
+ i.n = i.c + .5applheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro builds and draws an oval node at a given location with
+%%% text indicating a file name extension.
+%% @param i Node suffix.
+%% @param row Row.
+%% @param col Column.
+%% @param text The text to render in the oval node.
+def ext_rc(suffix i)(expr coor)(text t) =
+ circleit.i(t);
+ i.c = (colscale * ypart coor, -rowscale * xpart coor);
+ i.e = i.c + .5extwidth*right;
+ i.n = i.c + .5extheight*up;
+ _drawNode(i);
+enddef;
+
+
+%%% This macro draws a straight arrow between two nodes. Arrow length
+%%% is corrected for the pen width, so that the arrow doesn't sink into
+%%% the frame of the target node. If pen width is changed, the code
+%%% "0.5bp" has to be replaced by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+def line(suffix a,b) =
+ begingroup
+ save p;path p;
+ p := a.c--b.c cutbefore bpath(a) cutafter bpath(b);
+ drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
+ endgroup
+enddef;
+
+
+%%% This macro draws a curved arrow between two nodes with determined
+%%% leaving and entering angles. Arrow length is corrected for the pen
+%%% width so that the arrow doesn't sink into the frame of the target
+%%% node. If pen width is changed, the code "0.5bp" has to be replaced
+%%% by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+%% @param anga Leaving angle at (center of) node a.
+%% @param angb Entering angle at (center of) node b.
+def curve(suffix a,b)(expr anga,angb) =
+ begingroup
+ save p;path p;
+ p := a.c{dir anga}..{dir angb}b.c cutbefore bpath(a) cutafter bpath(b);
+ drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
+ endgroup
+enddef;
+
+
+%%% This macro draws a curved arrow between two nodes with determined
+%%% leaving and entering angles offset. Arrow length is corrected for
+%%% the pen width so that the arrow doesn't sink into the frame of the
+%%% target node. If pen width is changed, the code "0.5bp" has to be
+%%% replaced by half of the new pen width.
+%% @param a Source node.
+%% @param b Target node.
+%% @param angr Offset to entering and leaving angles at nodes a and b.
+def curve_rel(suffix a,b)(expr angr) =
+ begingroup
+ save alpha;
+ alpha = angle(b.c-a.c);
+ curve(a, b, alpha+angr, alpha-angr);
+ endgroup
+enddef;
diff --git a/systems/doc/metapost/source-manual/cm2lm.map b/systems/doc/metapost/source-manual/cm2lm.map
new file mode 100644
index 0000000000..619facd6d0
--- /dev/null
+++ b/systems/doc/metapost/source-manual/cm2lm.map
@@ -0,0 +1,8 @@
+%%% This map file replaces Computer Modern fonts by Latin Modern.
+cmmi7 CMMI7 < lm-mathit.enc < lmmi7.pfb
+cmmi10 CMMI10 < lm-mathit.enc < lmmi10.pfb
+cmr7 CMR7 < lm-rm.enc < lmr7.pfb
+cmr10 CMR10 < lm-rm.enc < lmr10.pfb
+cmsy7 CMSY7 < lm-mathsy.enc < lmsy7.pfb
+cmsy10 CMSY10 < lm-mathsy.enc < lmsy10.pfb
+cmtt10 CMTT10 < lm-rm.enc < lmtt10.pfb
diff --git a/systems/doc/metapost/source-manual/countries.d b/systems/doc/metapost/source-manual/countries.d
new file mode 100644
index 0000000000..2b372f882c
--- /dev/null
+++ b/systems/doc/metapost/source-manual/countries.d
@@ -0,0 +1,60 @@
+20.910 75.7 US
+ 1.831 66.7 Alg
+ 1.694 70.9 Arg
+16.430 77.3 Aus
+ 0.180 53.0 Ban
+15.620 77.1 Bel
+ 3.090 65.2 Brz
+ 5.530 72.7 Bul
+ 0.404 54.9 Bur
+20.240 77.5 Can
+ 1.809 73.4 Chl
+ 0.547 70.0 Chn
+ 7.390 74.6 Tai
+ 1.139 71.0 Col
+ 7.876 72.9 Cze
+ 1.342 60.8 Egy
+ 0.120 51.3 Eth
+17.000 77.8 Fra
+17.446 75.8 Ger
+ 0.350 54.6 Gha
+ 5.286 77.7 Gre
+ 6.119 71.6 Hun
+ 0.321 57.2 Ind
+ 0.479 61.0 Inn
+ 1.440 64.5 Irn
+14.940 78.1 Ita
+22.900 79.2 Jap
+ 0.338 61.5 Ken
+ 0.205 52.6 Mad
+ 2.099 68.1 Mal
+ 2.170 72.2 Mex
+ 0.866 64.6 Mor
+ 0.078 47.4 Moz
+ 0.150 50.6 Nep
+14.980 77.8 Nth
+ 0.239 48.9 Nig
+ 1.427 69.0 NKo
+ 0.330 56.6 Pak
+ 1.903 64.3 Per
+ 0.697 64.6 Phi
+ 4.625 72.9 Pol
+ 4.323 74.7 Por
+ 4.896 71.9 Rom
+ 2.253 64.2 SAf
+ 4.920 69.7 SKo
+ 9.226 69.8 USS
+ 9.471 78.3 Spn
+ 0.409 71.1 Sri
+ 0.608 53.0 Sud
+21.900 77.8 Swe
+27.510 79.1 Swi
+ 1.608 69.4 Syr
+ 0.105 52.0 Tnz
+ 1.246 68.5 Tha
+ 1.380 69.8 Tur
+ 0.233 51.0 Uga
+14.580 76.5 UK
+ 2.158 74.2 Ven
+ 2.474 73.0 Yug
+ 0.258 53.9 Zai
diff --git a/systems/doc/metapost/source-manual/ctabbing.sty b/systems/doc/metapost/source-manual/ctabbing.sty
new file mode 100644
index 0000000000..b61ec6ed78
--- /dev/null
+++ b/systems/doc/metapost/source-manual/ctabbing.sty
@@ -0,0 +1,18 @@
+% Public domain.
+%
+% The ctabbing environment is a centered tabbing environment suitable for
+% displaying program fragments. The vertical spacing is exactly like that
+% for normal text in a center environment. This is achieved by setting
+% \@minipagetrue to fool \tabbing into thinking that it starts a minipage
+% and should therefore avoid all vertical space at the top. (Note that any
+% space at all would defeat the \vtop command in \ctabbing.) The
+% \vskip-\lastskip and \prevdepth saving commands avoid extra space after
+% \endtabbing
+
+\newdimen\ct@pd
+
+\def\ctabbing{\center\leavevmode\vtop\bgroup\@minipagetrue\begingroup\tabbing}
+
+\def\endctabbing{\endtabbing\endgroup\vskip-\lastskip
+ \global\ct@pd\prevdepth \egroup
+ \endcenter \global\prevdepth\ct@pd}
diff --git a/systems/doc/metapost/source-manual/demo.ms b/systems/doc/metapost/source-manual/demo.ms
new file mode 100644
index 0000000000..736c8641fb
--- /dev/null
+++ b/systems/doc/metapost/source-manual/demo.ms
@@ -0,0 +1,105 @@
+.so /usr/lib/tmac/tmac.pictures
+.nr PS 11
+.nr VS 13
+.TL
+MetaPost with troff
+.LP
+Since MetaPost is a picture-drawing language that outputs PostScript, it is
+necessary to use the
+.ft CW
+-mpictures
+.ft
+macro package. Suppose you have written some figures in MetaPost and placed
+the input in a file \f(CWfigures.mp\fR.
+Running
+.nf
+.ft CW
+ mp -T figures
+.ft
+.fi
+to invoke the MetaPost interpreter produces output files
+\f(CWfigures.1\fR, \f(CWfigures.2\fR, .\|.\|.
+via macro calls such as
+.nf
+.ft CW
+ .BP figures.1 height width
+.ft
+.fi
+as explained in the
+.ft CW
+-mpictures
+.ft
+documentation. Note that the picture gets rescaled if the height and width
+in the \f(CW.BP\fR command don't match \fImp\fR's idea of the picture dimensions.
+.PP
+For instance,
+.BP figs.1 1.08i 1.5i
+this figure was derived from a file
+.ft CW
+figs.mp
+.ft
+and included at this point by invoking the \f(CW.BP\fR
+macro with height 1.08 inches and width 1.5 inches. The macro tries to run text
+around the picture, but this can be stopped
+by using the \f(CW.EP\fR macro as was done here.
+.EP
+The file
+.ft CW
+figs.mp
+.ft
+looks like this:
+.nf
+.ft CW
+.nr PS 9
+.nr VS 11
+prologues:=1;
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \\s8A\\s+2 \\(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10bp,0);
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+.nr PS 11
+.nr VS 13
+.ft
+.fi
+.PP
+Note that the typesetting commands in the
+\f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks in the above example are processed by
+.nf
+.ft CW
+ eqn -d\\$\\$ | troff;
+.ft
+.fi
+If a different \fItroff\fR pipeline is desired, it can be specified via the
+.ft CW
+TROFF
+.ft
+environment variable. For example,
+.nf
+.ft CW
+ TROFF='tbl | eqn -d\\$\\$ | troff -Tpost'
+.ft
+.fi
+adds \fItbl\fR to the pipeline.
+.PP
+Macro definitions and such can be added via the standard
+\f(CWverbatimtex\fR.\|.\|.\f(CWetex\fR mechanism that adds the given material
+to the \fItroff\fR input. Such material should not generate any output since
+this would get mixed up with the next \f(CWbtex\fR.\|.\|.\f(CWetex\fR block.
+Thus, newlines between \f(CWverbatimtex\fR and \f(CWetex\fR must be
+protected with \f(CW\\\fR.
diff --git a/systems/doc/metapost/source-manual/energy.d b/systems/doc/metapost/source-manual/energy.d
new file mode 100644
index 0000000000..0a8fa42d58
--- /dev/null
+++ b/systems/doc/metapost/source-manual/energy.d
@@ -0,0 +1,75 @@
+1900 7.02 0.369 0.254 0.25
+1901 7.631 0.402 0.283 0.264
+1902 7.869 0.515 0.301 0.289
+1903 9.303 0.583 0.319 0.321
+1904 9.159 0.679 0.333 0.354
+1905 10.228 0.781 0.377 0.386
+1906 10.794 0.734 0.418 0.414
+1907 12.517 0.963 0.437 0.441
+1908 10.828 1.035 0.432 0.476
+1909 12.008 1.062 0.517 0.513
+1910 13.074 1.215 0.547 0.539
+1911 12.933 1.279 0.551 0.565
+1912 13.936 1.293 0.604 0.585
+1913 14.86 1.441 0.626 0.609
+1914 13.382 1.541 0.636 0.636
+1915 13.857 1.63 0.676 0.659
+1916 15.39 1.744 0.81 0.681
+1917 16.987 1.945 0.855 0.7
+1918 17.69 2.064 0.775 0.701
+1919 14.444 2.195 0.802 0.718
+1920 17.175 2.569 0.883 0.738
+1921 13.195 2.739 0.732 0.62
+1922 12.452 3.234 0.843 0.643
+1923 17.163 4.248 1.113 0.685
+1924 14.905 4.141 1.263 0.648
+1925 15.195 4.43 1.314 0.668
+1926 17.165 4.471 1.452 0.728
+1927 15.599 5.227 1.598 0.776
+1928 15.034 5.229 1.734 0.854
+1929 15.892 5.842 2.118 0.816
+1930 14.011 5.208 2.148 0.752
+1931 11.526 4.936 1.869 0.668
+1932 9.38 4.554 1.729 0.713
+1933 9.999 5.253 1.733 0.711
+1934 10.867 5.267 1.97 0.698
+1935 11.081 5.78 2.136 0.806
+1936 12.89 6.378 2.411 0.812
+1937 12.99 7.419 2.684 0.871
+1938 10.303 7.043 2.565 0.866
+1939 11.653 7.337 2.763 0.838
+1940 13.38 7.849 2.979 0.88
+1941 14.903 8.133 3.162 0.934
+1942 16.799 8.043 3.436 1.136
+1943 17.003 8.733 3.839 1.304
+1944 17.851 9.732 4.176 1.344
+1945 16.529 9.939 4.423 1.442
+1946 15.526 10.057 4.55 1.406
+1947 17.975 10.771 5.012 1.296
+1948 17.158 11.717 5.615 1.369
+1949 12.557 10.683 5.911 1.425
+1950 14.647 11.449 6.841 1.415
+1951 15.066 13.037 8.106 1.424
+1952 13.262 13.282 8.705 1.466
+1953 12.767 13.671 9.116 1.413
+1954 11.001 13.247 9.488 1.36
+1955 12.745 14.445 10.532 1.36
+1956 13.747 15.344 11.252 1.435
+1957 13.444 15.346 11.885 1.422
+1958 11.201 14.154 12.244 1.592
+1959 11.105 14.662 13.361 1.551
+1960 11.14 14.664 14.135 1.608
+1961 10.751 15.185 14.691 1.656
+1962 11.211 15.495 15.365 1.816
+1963 12.176 15.741 16.271 1.768
+1964 12.854 15.691 17.138 1.886
+1965 13.485 15.93 17.652 2.059
+1966 13.836 16.925 18.984 2.062
+1967 14.215 18.1 20.087 2.347
+1968 13.955 18.593 21.548 2.349
+1969 14.223 18.886 22.838 2.648
+1970 15.248 19.772 24.154 2.63
+
+Cols 2-5: U.S. annual production of
+2) coal, 3) crude oil, 4) natural gas, 5) hydroelectric power
+in quadrillions of British thermal units.
diff --git a/systems/doc/metapost/source-manual/figs.1 b/systems/doc/metapost/source-manual/figs.1
new file mode 100644
index 0000000000..b47233e3ad
--- /dev/null
+++ b/systems/doc/metapost/source-manual/figs.1
@@ -0,0 +1,227 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -6 -13 65 17
+%%Creator: MetaPost
+%%CreationDate: 1995.04.06:1004
+%%Pages: 1
+%%DocumentFonts: Times-Roman Times-Italic Symbol
+ /rptmr /Times-Roman def
+ /rptmri /Times-Italic def
+ /rpsyr /Symbol def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndProlog
+%%Page: 1 1
+newpath -2 -4.08002 moveto
+29.24002 -4.08002 lineto
+29.24002 7.36008 lineto
+-2 7.36008 lineto
+ closepath fill
+ 1 setgray
+newpath -3 -3.08002 moveto
+28.24002 -3.08002 lineto
+28.24002 8.36008 lineto
+-3 8.36008 lineto
+ closepath fill
+ 0 setgray
+0 0 moveto
+(A) rptmr 8.00009 fshow
+ 0 0.32968 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath 8.65166 3.8902 moveto
+8.65166 4.13197 lineto
+8.76155 4.24187 lineto
+8.95937 4.24187 lineto
+9.04727 4.15395 lineto
+9.09123 4.02208 lineto
+9.09123 3.95615 lineto
+9.04727 3.82426 lineto
+8.89342 3.73636 lineto
+8.71759 3.7803 lineto
+8.65166 3.8902 lineto
+ closepath stroke
+newpath 9.1352 4.26384 moveto
+9.1352 4.3078 lineto
+9.46486 4.37373 lineto
+9.79454 4.4177 lineto
+10.12422 4.43967 lineto
+10.4539 4.46164 lineto
+10.78358 4.48363 lineto
+11.11325 4.48363 lineto
+11.44293 4.5056 lineto
+11.77261 4.5056 lineto
+12.1023 4.5056 lineto
+12.43198 4.48363 lineto
+12.76164 4.46164 lineto
+13.09132 4.43967 lineto
+13.421 4.3957 lineto
+13.75069 4.35176 lineto
+14.08037 4.3078 lineto
+14.41003 4.26384 lineto
+14.73972 4.17592 lineto
+15.0694 4.08801 lineto
+15.39908 3.97812 lineto
+15.72876 3.86823 lineto
+16.05843 3.6924 lineto
+16.23427 3.56053 lineto
+16.3002 3.36272 lineto
+16.34415 3.03304 lineto
+16.36613 2.7693 lineto
+16.3881 2.32973 lineto
+16.4101 1.75829 lineto
+16.4101 1.62642 lineto
+16.3881 1.31871 lineto
+16.36613 1.18684 lineto
+16.25624 0.94508 lineto
+15.94855 0.74727 lineto
+15.61887 0.6154 lineto
+15.28918 0.54947 lineto
+14.9595 0.57144 lineto
+14.62982 0.63737 lineto
+14.30016 0.68134 lineto
+13.97047 0.70331 lineto
+13.6408 0.70331 lineto
+13.31111 0.65936 lineto
+12.98143 0.59341 lineto
+12.65176 0.52748 lineto
+12.32208 0.50551 lineto
+11.9924 0.50551 lineto
+11.66272 0.59341 lineto
+11.55283 0.74727 lineto
+11.55283 1.03299 lineto
+11.66272 1.18684 lineto
+11.9924 1.27475 lineto
+12.32208 1.27475 lineto
+12.65176 1.27475 lineto
+12.98143 1.29674 lineto
+13.26715 1.31871 lineto
+13.31111 1.36267 lineto
+13.31111 1.47256 lineto
+13.20122 1.56047 lineto
+12.87154 1.56047 lineto
+12.54187 1.5385 lineto
+12.21219 1.5385 lineto
+11.8825 1.5385 lineto
+11.55283 1.5385 lineto
+11.22314 1.56047 lineto
+11.00337 1.67036 lineto
+10.93742 1.84619 lineto
+10.93742 2.00005 lineto
+10.98138 2.1539 lineto
+11.13524 2.28577 lineto
+11.46492 2.32973 lineto
+11.79459 2.3517 lineto
+12.12427 2.3517 lineto
+12.45395 2.3517 lineto
+12.73967 2.37369 lineto
+12.78363 2.41765 lineto
+12.78363 2.57149 lineto
+12.7177 2.61545 lineto
+12.38802 2.61545 lineto
+12.05833 2.61545 lineto
+11.72865 2.61545 lineto
+11.39897 2.61545 lineto
+11.0693 2.61545 lineto
+10.73962 2.65941 lineto
+10.5638 2.81325 lineto
+10.51984 3.01106 lineto
+10.51984 3.12096 lineto
+10.5638 3.29678 lineto
+10.73962 3.47261 lineto
+11.0693 3.53854 lineto
+11.39897 3.53854 lineto
+11.72865 3.56053 lineto
+12.05833 3.5825 lineto
+12.38802 3.5825 lineto
+12.49791 3.62646 lineto
+12.51988 3.67043 lineto
+12.51988 3.75833 lineto
+12.47592 3.82426 lineto
+12.16823 3.84625 lineto
+11.83855 3.84625 lineto
+11.50887 3.84625 lineto
+11.1792 3.82426 lineto
+10.84952 3.82426 lineto
+10.51984 3.82426 lineto
+10.19016 3.80229 lineto
+9.86047 3.7803 lineto
+9.5308 3.75833 lineto
+9.20113 3.75833 lineto
+9.20113 3.82426 lineto
+9.24509 3.91219 lineto
+9.24509 4.10999 lineto
+9.1352 4.26384 lineto
+ closepath stroke
+newpath 16.498 3.71437 moveto
+16.498 3.86823 lineto
+16.54196 4.00009 lineto
+16.78372 4.17592 lineto
+17.1134 4.24187 lineto
+17.26726 4.1979 lineto
+17.33319 4.06604 lineto
+17.35516 3.97812 lineto
+17.39912 3.67043 lineto
+17.4211 3.47261 lineto
+17.44308 3.16492 lineto
+17.46506 2.81325 lineto
+17.48705 2.41765 lineto
+17.48705 1.31871 lineto
+17.46506 0.98903 lineto
+17.4211 0.8132 lineto
+17.28923 0.74727 lineto
+16.95955 0.68134 lineto
+16.67383 0.76926 lineto
+16.62987 0.9231 lineto
+16.62987 1.14288 lineto
+16.65186 1.47256 lineto
+16.65186 1.69235 lineto
+16.62987 1.69235 lineto
+16.6079 2.32973 lineto
+16.58592 2.65941 lineto
+16.56393 2.92314 lineto
+16.54196 3.23085 lineto
+16.51999 3.47261 lineto
+16.498 3.71437 lineto
+ closepath stroke
+20.8 0 moveto
+(a) rptmr 10.00005 fshow
+ 0 0.5 dtransform truncate idtransform setlinewidth pop
+newpath -3 -3.08002 moveto
+28.24002 -3.08002 lineto
+28.24002 8.36008 lineto
+-3 8.36008 lineto
+ closepath stroke
+newpath 62.48819 1.64003 moveto
+62.48819 8.05983 57.2839 13.26411 50.8641 13.26411 curveto
+44.4443 13.26411 39.24002 8.05983 39.24002 1.64003 curveto
+39.24002 -4.77977 44.4443 -9.98405 50.8641 -9.98405 curveto
+57.2839 -9.98405 62.48819 -4.77977 62.48819 1.64003 curveto closepath fill
+ 1 setgray
+newpath 61.48819 2.64003 moveto
+61.48819 9.05983 56.2839 14.26411 49.8641 14.26411 curveto
+43.4443 14.26411 38.24002 9.05983 38.24002 2.64003 curveto
+38.24002 -3.77977 43.4443 -8.98405 49.8641 -8.98405 curveto
+56.2839 -8.98405 61.48819 -3.77977 61.48819 2.64003 curveto closepath fill
+ 0 setgray
+gsave [0.9397 0.34203 -0.34203 0.9397 44.11798 -3.62311 ] concat 0 0 moveto
+(e) rptmri 10.00005 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 47.91821 2.01683 ] concat 0 0 moveto
+(i) rptmri 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 50.26746 2.87189 ] concat 0 0 moveto
+(w) rpsyr 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 55.24785 4.68463 ] concat 0 0 moveto
+(t) rptmri 6.99997 fshow grestore
+newpath 61.48819 2.64003 moveto
+61.48819 9.05983 56.2839 14.26411 49.8641 14.26411 curveto
+43.4443 14.26411 38.24002 9.05983 38.24002 2.64003 curveto
+38.24002 -3.77977 43.4443 -8.98405 49.8641 -8.98405 curveto
+56.2839 -8.98405 61.48819 -3.77977 61.48819 2.64003 curveto closepath stroke
+ 1 setlinecap
+newpath 28.24002 2.64003 moveto
+38.24002 2.64003 lineto stroke
+ [3 3 ] 0 setdash
+newpath -5.25 -11.98405 moveto
+64.48819 -11.98405 lineto
+64.48819 16.51411 lineto
+-5.25 16.51411 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/systems/doc/metapost/source-manual/figs.mp b/systems/doc/metapost/source-manual/figs.mp
new file mode 100644
index 0000000000..c8e87ba562
--- /dev/null
+++ b/systems/doc/metapost/source-manual/figs.mp
@@ -0,0 +1,24 @@
+% Examples for MetaPost doc, by John Hobby. Public domain.
+
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \s8A\s+2 \(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10,0)*bp;
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+
+end
diff --git a/systems/doc/metapost/source-manual/grdemo-doc.ms b/systems/doc/metapost/source-manual/grdemo-doc.ms
new file mode 100644
index 0000000000..19c0ed030d
--- /dev/null
+++ b/systems/doc/metapost/source-manual/grdemo-doc.ms
@@ -0,0 +1,184 @@
+.\" grdemo-doc.ms
+.\"
+.
+.nr PS 11
+.nr VS 13
+.
+.TL
+MetaPost with groff
+.
+.LP
+John Hobby's MetaPost program had an \f[I]AT&T troff\/\f[P]interface which
+have been changed to use \f[I]GNU troff\/\f[P] instead.
+.
+.
+.SH
+Usage
+.
+.LP
+Since MetaPost is a picture-drawing language that outputs PostScript, it is
+necessary to use the \f[CW]\%-mpspic\f[P] macro package, which is
+automatically included when \f[I]groff\/\f[P](1) is invoked with the
+\f[CW]\%-Tps\f[P] option to prepare output for PostScript printers or
+previewers.
+.
+.PP
+Suppose you have written some figures in MetaPost and placed the input in a
+file \f[CW]\%figures.mp\f[P].
+Running
+.
+.DS I
+.ft CW
+mp -T figures
+.ft
+.DE
+.
+to invoke the MetaPost interpreter produces output files
+\f[CW]\%figures.1\f[P], \f[CW]\%figures.2\f[P], \&.\|.\|.
+.
+.PP
+Standalone EPS pictures can be produced from such files by
+\f[CW]\%fixgrofffonts\f[P], that fixes comments according to
+Adobe Document Structuring Conventions (DSC), embeds
+font reencoding commands and non-standard fonts.
+.
+.DS I
+.nf
+.ft CW
+fixgrofffonts < figures.1 > figures1.eps
+fixgrofffonts < figures.2 > figures2.eps
+\&...
+.ft
+.fi
+.DE
+.
+.PP
+Before these figures can be included into \f[I]groff\/\f[P], they have to
+be processed with the \f[CW]\%fixmp\f[P] script:
+It adds an encoding vector for all text fonts back to the file (which
+MetaPost can't add itself) and changes the Adobe Document Structuring
+Conventions (DSC) comments to something \f[I]groff\/\f[P] can handle.
+.
+.DS I
+.nf
+.ft CW
+fixmp < figures.1 > figures.1ps
+fixmp < figures.2 > figures.2ps
+\&...
+.ft
+.fi
+.DE
+.
+Now the converted files can be included in a \f[I]groff\/\f[P] document via
+macro calls such as
+.
+.DS I
+.ft CW
+\&.PSPIC figures.1ps [width [height]]
+.ft
+.DE
+.
+as explained in the \f[I]grops\/\f[P](1) documentation.
+Note that the picture gets rescaled if the height and width in the
+\f[CW]\%.PSPIC\f[P] command don't match \f[I]mp\/\f[P]'s idea of the
+picture dimensions.
+.
+.
+.SH
+An example
+.
+.PSPIC grdemo.1ps
+.
+.LP
+This figure was derived from a file \f[CW]\%grdemo.mp\f[P] and included at
+this point by invoking the \f[CW]\%.PSPIC\f[P] macro (omitting the height
+and width parameters to avoid rescaling).
+.
+.PP
+The file \f[CW]\%grdemo.mp\f[P] looks like this:
+.
+.DS I
+.nf
+.ft CW
+.ps 9
+.vs 11
+verbatimtex
+\&.EQ
+delim $$
+\&.EN
+\e# etex
+
+input boxes
+
+beginfig(1);
+ pair shadowshift;
+ shadowshift = (1, -1) * bp;
+
+ def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+ enddef;
+
+ boxit.a(btex \e[12] \es8A\es+2 \e[lh] a etex);
+ circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+
+ b.w - a.e = (10bp, 0);
+
+ drawshadowed(a, b);
+ draw a.e .. b.w;
+
+ label.top(btex \e[Cs] \e[Po] \e[Eu] etex, a.n);
+ label.llft(btex \e[Fn] etex, a.s);
+
+ draw bbox currentpicture dashed evenly;
+endfig;
+
+end
+.ps 11
+.vs 13
+.ft
+.fi
+.DE
+.
+.
+.SH
+Changing GNU troff pipeline
+.PP
+Note that, by default, the typesetting commands in the \f[CW]\%btex\f[P]
+\&.\|.\|.\& \f[CW]\%etex\f[P] blocks in the above example
+are processed by
+.
+.DS I
+.ft CW
+eqn -Tps -d\e$\e$ | troff -Tps
+.ft
+.DE
+.
+If a different \f[I]troff\/\f[P] pipeline must be used it can be
+specified via the \f[CW]\%TROFF\f[P] environment variable.
+For \f[I]groff\f[P], the following is recommended:
+.
+.DS I
+.ft CW
+TROFF='groff -teZ'
+.ft
+.DE
+.
+It adds \f[I]tbl\/\f[P] to the pipeline in addition to \f[I]eqn\f[P],
+producing output for \f[I]groff\/\f[P]'s default `ps' device. Note that
+you then have to specify the left and right delimiters of \f[I]eqn\/\f[P]'s
+in-line equations within the document (which is good practice anyway).
+.
+.PP
+Macro definitions and such can be added via the standard
+\f[CW]\%verbatimtex\f[P] \&.\|.\|.\& \f[CW]\%etex\f[P] mechanism that adds
+the given material to the \f[I]troff\/\f[P] input.
+Such material should not generate any output since this would get mixed up
+with the next \f[CW]\%btex\f[P] .\|.\|.\& \f[CW]\%etex\f[P] block.
+Note the comment escape right before the first \f[CW]\%etex\f[P] command in
+the above example to avoid an empty line.
+.
+.\" eof
diff --git a/systems/doc/metapost/source-manual/grdemo-doc.ps b/systems/doc/metapost/source-manual/grdemo-doc.ps
new file mode 100644
index 0000000000..f60e465bf1
--- /dev/null
+++ b/systems/doc/metapost/source-manual/grdemo-doc.ps
@@ -0,0 +1,1025 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.19.3
+%%CreationDate: Sun Mar 12 16:21:58 2006
+%%DocumentNeededResources: font Symbol
+%%+ font ZapfDingbats
+%%+ font Times-Bold
+%%+ font Times-Roman
+%%+ font Times-Italic
+%%+ font Courier
+%%DocumentSuppliedResources: file grdemo.1ps
+%%+ procset grops 1.19 3
+%%+ font FreeEuro
+%%+ font ZapfDingbats-Reverse
+%%+ font Symbol-Slanted
+%%Pages: 2
+%%PageOrder: Ascend
+%%DocumentMedia: Default 595 842 0 () ()
+%%Orientation: Portrait
+%%EndComments
+%%BeginDefaults
+%%PageMedia: Default
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset grops 1.19 3
+%!PS-Adobe-3.0 Resource-ProcSet
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/setcmykcolor where{
+pop
+/Fk{
+setcmykcolor fill
+}bind def
+}if
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/setcmykcolor where{
+pop
+/Ck/setcmykcolor load def
+}if
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne
+2 index/UniqueID ne
+and
+{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+/setpagedevice{}def
+mark
+}bind def
+/PEND{
+cleartomark
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%BeginFeature: *PageSize Default
+<< /PageSize [ 595 842 ] /ImagingBBox null >> setpagedevice
+%%EndFeature
+%%IncludeResource: font Symbol
+%%IncludeResource: font ZapfDingbats
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Courier
+%%BeginResource: font FreeEuro
+%!PS-AdobeFont-1.0: FreeEuro 001.001
+%%Title: FreeEuro
+%Version: 001.001
+%%CreationDate: Sun Jan 8 10:14:22 2006
+%%Creator: root
+%Copyright: Created by Werner Lemberg with PfaEdit 1.0
+%Copyright: (http://pfaedit.sf.net); the serif shapes are based on the
+%Copyright: Omega fonts created by Yannis Haralambous.
+% Generated by FontForge 20060105 (http://fontforge.sf.net/)
+%%EndComments
+
+FontDirectory/FreeEuro known{/FreeEuro findfont dup/UniqueID known{dup
+/UniqueID get 4166882 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /FreeEuro def
+/FontBBox {4 -23 903 710 }readonly def
+/UniqueID 4166882 def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Created by Werner Lemberg with PfaEdit 1.0 \050http://pfaedit.sf.net\051; the serif shapes are based on the Omega fonts created by Yannis Haralambous.) readonly def
+ /FullName (FreeEuro) readonly def
+ /FamilyName (FreeEuro) readonly def
+ /Weight (Medium) readonly def
+ /FSType 12 def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 0/Euro.symbol put
+dup 1/Euro.symbol.bold put
+dup 2/Euro.symbol.slanted put
+dup 3/Euro.symbol.bold.slanted put
+dup 4/Euro.serif put
+dup 5/Euro.serif.bold put
+dup 6/Euro.serif.italic put
+dup 7/Euro.serif.bold.italic put
+dup 8/Euro.sansserif put
+dup 9/Euro.sansserif.bold put
+dup 10/Euro.sansserif.slanted put
+dup 11/Euro.sansserif.bold.slanted put
+dup 12/Euro.mono put
+dup 13/Euro.mono.bold put
+dup 14/Euro.mono.slanted put
+dup 15/Euro.mono.bold.slanted put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5A63F932884E18BF5153AD36053037D1C6CD
+04294AF6A35612DB9108AC8514CB5C4A8469971B75A09F9E662068B0685490EA8C73F2DE
+2FBBCF85D15AB9385E529DAB15A40D408002E88D0C107F711BC66BF0F2E92FDDC6B188F9
+1EEB6B86050D5032E6ABCB11E343C6D795217B5973972E99A9420651ACF3B8FD4CAD1DA4
+B00642AD077A5B86240F89F2BC011009CB2CF173FF68E9A88F0018F187D5E036FE8D904F
+211842FF01AA7CAADDEB9E5A534FA3F90BDB8F6FFE24F7AC6E7BD0A74CF29EBBA51871F0
+D1FF3262EA3CAFF583545FAB762B8D9BF14C8845C4EDB387B1248A4BCCB70AEDC6C67CF6
+C4648FA00124C44166D66DE1573C926CD9C6AE4F8B89E5987035D23195432204B648D458
+39F1769201B7C68828B3E49DFEF3065D705C2EBFFFB05B8A865CE4888872146C99671EFA
+EE1F514B94B86A47AAA5F21A39786E77D443FA4CF8B525C98FC02459528C08410C679440
+CC3A160C40B14E03FAB3E267943E1FBACDD4C082777B31AD3591DAEA25DC60E0EE11AB59
+52C58879FCB35A54009A156730AF209A8D4F00CF7DD9870C8DC3E48C19BED68742376268
+0408FFD4A34A0D8659D44FADC9FC9D3084601C93FD9FCA770B1191500ECB12C8DBDB2032
+007CECE3C6A2CC8593386DC1464B94A09EA2A83438C71ACC7CAD72D074ABF6FB98EFC81B
+6A3D672D2DCC637F34ACF18D469ED29FE2C49062380E6A32850F696834FC8E46A924164A
+C64DF8F848D4D000EB6FD06A44D0320975A8EEE85173E4D7E39EC9DB03A8ED20DAED86D2
+73CE5762A5D35D1A81987F9CD9921E39C2C5CEDD661C3B3EE86B703C101C410E41648347
+7599C4CCB91234510ABAC16898D9D10E30B5FC1BABE78DF2A009E09E52816F2413899184
+AB8F942A496B56C9FDE630B13AD9F0996ADE29CABAF1443452B427A2280AD00B85F4657C
+65B47E929FB0A2A31F257B24FE4ECBAFC878C306094088E00DB2DA6D36CECE30971846B6
+39DA9BA989109507FF21FD7198736278ED1CD021BFE7689D93B425D8B6CCCF07D37C22D7
+966FB87EFBE8F6A86D4F0C4BD38F5F3A41DCEDA924FD5F0D8FF089A0F44DFD37498507D3
+2A383FC717537744CC6868EB913D5C08CD0A3F935145FD5D811F01870F6136F4EFF757C5
+D03E73FC22F88624116C08C225C1711C96A01656999AAF7414163E75548AB89F8AA85F20
+9FA6EC242ECDA0953DC61EAE4107610380DFE2807101BDBA51391685990B3D1FFEFEC97E
+0F0DE04283920370575AC06B8597EE756EEF7A3543A3E5F1B74343702A201C43411E7B76
+DC6422E2529E740A6BC6BD44ABAACD955406734AF0852471CC7B49325286AFFD2F9CFD04
+BB9CA4D0F6F0494CED1D2984E2C607FD2CE5C5A1F538CF9107771E691FAD51AE5DA70748
+F14F2FF7CE61292F6FA50D4510E4100360A4A2EBF7F9A03F7A4DAC981C6DE582BAFEBC23
+AD97EB56656A218B24D47C4345B398C14ECF5B76037D83FEB71E65F89C01133A5228496C
+DF4BCC8BD4C615C9725511A2376A01C80F1EF38757CF104DD0809121EF1A2B9F11B5BDC7
+8E4F5A1463F37E952891370E1887644D26751A261FB5EE78BEA745F4F44A9B00098EDC4E
+3547F5AE50DCBF29EF5BF82D653A148D340BC600EB411F4EA8A6A2D0B548D0B217E78943
+BDAED70072716A4406D685B55C2C0F490D2B472C49B278DB78E9914C3623825E595A541F
+509F0E7BB1A827F4E6B0EA42C668932AB48D7B4A21AC0DA7451924D1AA7CDBE80C94F109
+1A4D91C3B908060FEB07D1B454A4CE4A60F8FACA6930313E09D5F11D1D8437E6B65EEE5B
+B5570C3B66ABC491BD8CF63C2C62BC7B38A0CDFFE9D75627E6D3B23B608C7EEBD8FC655C
+D197D28E8EB319814EA71B6AD63A966DB61D9C3C7D788683559C49338D037A235FD56FA0
+059DDC6017F0919926C323327C204139F07810575A8749877FB2C0C53AF4E3962613A0E8
+7D7C37A9974105992FC6B754CF23017C2E5851BCC90F48D6847EF1EF59E42032AFE03A98
+DB363827CA07E337A5852BE832772A2981864B8C1EDAD8759ACBC132ADD0BB360F40BAFD
+FC7E5D32D724CF82FD3342D431F8F4CD9BDE2B07C8D8EED411E3A5889A8163CD1E2C2786
+F78AD3C1D9879FD6E93BD1FD8949DE47A8BCD219422B2F1316950B72E1E5170701795A0A
+80709E894C218AA64DF5684719830066B995785AB9F1603FFDCEA945FEC09F57BF886F01
+A95811C7D4200E11C7CB373AAA4301E58F74E77519E11A89751A338B38D115B365547271
+DB19E51B85B30D1EB8E3E0B95436262D52471D65BBCF5DD94F6FF1210BF09628191F8F04
+3ED7109DE2AD284954564A1C80811B9AF1686DB799D36B50EB095AF37B9117992BB6B8F9
+0CE43ED10F9D0CE4B8ED76549239A626809ECA3D5A90E23D3CFBC776D6D816A293F2A80B
+7267D1842FA102BAD77A2A775CB55473F40D3976AFC77ECDA131FF663A12795528A7EC15
+1D7854E759321709A8F4750716C949D71D332F9B0B80130916826F07E0165A5A1C5F3D8E
+EF8CDB4EE3F688867FDDD47B4D67AD677F3134D90E07A1F0A8690169AC2E176BCB7CF260
+A70E374F3EC834E3B83D19CE3A52883024D2976E8E02C0B320CFD7B8BF66D11FBBF49353
+647AC4AB23A2A5689506AB83AD60AF8783E04815CABE60A3243FC633FD12D6DA50036691
+D3A0FBD4AD1309289565FC0C449510AD58085356AD829538B97A501FA73CEB693F09D551
+8FEAE6DE59FD7871AAED96A27127286C09FDD5A1EAE421CC38F56A4AF6AD5FA9BF96BF00
+2BE0A49BE6F27636DEB364A0762BCFF054020850C9222940B0E8A08E6A77240E1A0F42DC
+07DAD0283BCD9DAC20E2A7542F5D74FC90D2661AD95350566F27125160C0525364D8B764
+E06FBC0F85531185F8B92B4ADE928B2CF0DD4736CAA76F6659D128E416E9792F24CB6B41
+CF369FF2BF9C360FA006938067DA606B2B19C8599FB28306FDACBF29841A169F6368384E
+32B6BAD4179E345AB2B3CAB35E29E154228DCDC3D4C3317295A050A8AA86273BF7178A07
+65B598EE7061AE13B11B670F2E5F90F9FDD2F09A84F247DF9C90698A44A29BEC87B3C606
+E46A35D94986363CFEB26524FD7FB88092978128B0D246934D93BF90CDD94F7D243113C0
+8BDD1E09E4AC9F6E7A5A4FDB89150632CA41E3320D6B5AC722B27984D238D29A20F69BFD
+1AB94BFA39EE52371CBEC64E16E37319ED189F2CC3992EC03A780AE4AFAEAC4FFB7A8340
+36F307F1BAB17477BF14809DA90E0AFBD0E3182D7E40A1EB1AABA8C64D9CA02044E85A82
+7FDB6C215F77FADC0443A04083E23DF21523DE178DF165F369E93AD21F34B4D72C24D5F4
+D6D19BE8F5B01AFCBBEC537C509FD7B388AA66A3E4CBCAA85601C20BEBBD2D3F11CE1CBC
+E7D8FA53FA83710A80D8795AA5FF3C2E7F063DC05DC002E8278DCC1FAF9909FFE55A633D
+86BE4C570BD9820327490CA61CA4FDDE381CDF70D97FF279F6A458E5D7B8DE5E1384F894
+3064F4F17D369F014D5A68C9F2E170BB59634AF060678CB4DC84450B94E34CA704B5DCE3
+67125FEE35A1B0A27F40E38D00CB779ACB34284080D5D78E30DE6233F0AD3FC22D170A60
+E2B7D4F206862D1890D16E3C9D720CCA05930814E00337AD8607098C68CBEB919504277D
+B3AB769CD77745B375945BC4246B813F828099DAB82512936FE106B368F189ACE1A2EAE1
+4CF5FE1C91BD0D79CE179D34A0E85F8F1BFDEF9F28C1F26924D630E845CAA19BADC44B7B
+ED9C6452C0AD01D108967D85E0779AEE557A9207164D22DFF7BCCE92D5CB9809ADFD332F
+9567C92510CFC94796AA5A312C4484183B66C44DED8476F974CE6FEBFE86178B99F1820B
+07B3D7C80F5CCCAE591BD8920814B4398A502756D3C945D07C6CD9FC2414086434151E87
+30C14D38764C532BDD5830E24C16BFF8CC19181621DD26E67259711E6CC43ED8AAE343B4
+B728BFD242C6C314B3D453DD3B3BC3986E736B4085C8D7498C9778538AC0F2DE17B9F89A
+60082B571BE433119A9522F93A4C1222A26F94A199D71F50FA5BA94CDA733E26A43A3002
+564A841FCCC267EF8F1556CF85C8AF4A649F0AC533E0E859E3E2723525FCEC1B6E6A3CE9
+0B66D585B1E7C4B953ECF941B12D3003FE14852B7978126BE4B58DF8924651697B79F333
+F2D5BC34458DFD36826F8DFD374D0D59DD01FFC2C455B1A12AC80380F48A742013D0C3D9
+C7E040364633F0476D1ECE1870386871CE95099A30F881EBE00F6E140FE58F8C1D5F2B37
+35D12A9FF60157F8691DD64E60EF9B957C586D4E2E9D5474634F7AA44D50B11B001C66CC
+F283185C6E65E32D2F2B8127B986CF62455067A5E621738C8A381D2B6A033F6C389BE878
+3179A54AD38D69223AD779A159B2D7D0AD1670A03171EB4C27930E1878037813CBC46214
+7486F3B8E9F7016C9E2E4C60B03A4C976D48EE3A20131AA00F4B79707FD801B3F7A7759A
+3AFF3F6CEE749F2B32B01A582DC408384B8749307794914EAF7A0300E1C9AEF42DFFD828
+C5EE7D9730CE489F0A98C81E166B2B1EED3BCFACC370709947CFD29DEAD86C58FCF6AEA4
+8D670583BCA7018853B781340D7F4D1F2FA5703EDA8F1815F74407B4617016AD9BDF1F49
+340E7D89AF7CB5818B996201512968AA2B3D71C468C69DB46E514EC3CCBA360B3E80972D
+86145148DC0BDD4ADDDFDC7D835DAAC0AA9B96DDD91973288B3A2A28BD6BB415C2A79818
+7F58F3402DA53B0600FA53A01AEEBCE5081BCC0645348BD1772C54A608E88499CE0103EA
+C4ABC7FD74256C4F16A977BDF7F13843BFC6CCF16092740D9C1E7561EFD4EC6A3A30460E
+A434D1921727FA26D9F56627DCD6AF95951E602936C4AC6C7A6F6DFEF2C0CE0571458B27
+BB31DA11C9E09DD3917F61140EFC4F059AC2FAC839BDDC0695B293C42BD17B1895A6B2B2
+F955821C5CE356B1AA33C5F361BB0F43828A20B9F193E71E057F45B6CC8ABE53EEFF801F
+2B6CFB31B6DEB5D84EB8525B938AC424B3486DEA14982E5CF7F2D2C92F2D9B28033DE0C3
+4B610505771E0B1BE6AF03552EB8B44EC1190DAEB15DAAF21E7F2D437780484F0535D8ED
+941A8FA13D379B911FC7AC99E4657DABD37891C467E8854DEAD2E34E05962F0EEC30B5D4
+B8FA6EBA42C102564A2FCDF679AFB7FC145C98EDCC81BF33DCFEB593CF8E7C2F6E9E22B7
+8B1DEE3B75C0E87AB95C6341A1D09948BF338B682F515D89230F8CDBFC72D56A00003EAD
+F5BC0A6CC1A802A80480D6CEBA34631C7892909E049473E8328295069C0845571ECC9980
+CD8BCEB4C930C06601BFBE690FA0BB34631C7FF64D91A31BDF9035EC6E44EA12A79DF384
+FD82092DEAFB2D2E1B0C8ED903BCA55382F98FA5346ACC20900D86E64FF528C604D6815E
+3DEFC5F71EBBBAC2B5787B2F25AE820AFDD4038CD58B0F1710C1EEC7DA521071DCCFB9BF
+24C9EA1049EF59E61D20BFD50BCB5D8CBD0DC266B8836F34EB94858A54CE0C9E6088188A
+EDE0BE39FAFE697AA6C8805CAD63DEE8A0CA226C91405DE5FE7FE8820124D6D79EA5F956
+8C5CBFEA24C4F3D601428329453F226C4C3E3E429E429C2E96DF25EE1DD7B5B12B2C1DA7
+CB0EE6EB0D018C2DD437A6883D2C2E57B9CB264CD3369C20AB831CDDAC5F57E550727C0B
+CC9715B2C87C26C0A9A6A2F173C7B03F12F993B217466E7896E4764C6AF20CDF0634205F
+3E38E6C8C6DE3A4269C5C6CF03E49D60F0E2F3D7B3ED302C3BDA4EC6332867A19C9CE8FD
+6E2D0F2C597E11896A3E6EDC4B616F76B3355DFBF26DB2199963252C93AE423F1AE6683F
+115E9B68672BFF4C9134EED4C51AE587CC859F742A283F3C9B6088B0B9E65A1EA521578A
+E67D7396907129B83C1C9E2302D5FF46FCBF408E0FA69AA8F6E7193AE9E9DD5254201317
+B3D304BDCA689B683568BCAD9539C4D6BDA50814D8F251A70E76E7A5EECF719DD1655DA0
+605D9EFC940A8CF0FDEBC7146DE12F108959280903C34C69DC92F8205F2EE1D52F483AA7
+7E02F277A1186849056036CB24AB238AF08C903C4CEB4851991C24A8158EAE8D8F3BE56C
+355FC26D7BBD2849B7ED9E1A25DFE98BC62A6797615BCE59DEAAFD5B6D08298E2DDAA611
+3DE60AB83FF7687B7ADD6706822270ECA925B559F2F9EC59C9AB0F365868DEC3122EE67F
+BAFE7EBFACEC14D4D40C55F94ABBE8CE82CEA67FC1415D127786071CC06DCB653CCDED0B
+40A9D49994865CF45BA494AC11543A0546DC37417BD01DB100273EE3F0E7D12093E50FD0
+E71B9A0326E8F35FCD86B3285781008ED03FCA1850D685CA5B62518C9194A0C7E8CFD5A9
+FF6A0EF508ADBCEDAB7C7144272F8C7DB274CE7AA09CFABCCA3E6967EF259A72C3B8F4FD
+4605CBB99CE88B679F3EC9486C442B05D776B9D7FA8C04203DBDF33C0CF45B15E68C9376
+168229CC5176BC1E9707853192BD0C394E2D8880050594675F5B83488026791AEB1E6D79
+A424B8F90149F4855EF1BDF6CF0137D459D2A22DA3FF00743B52B2F9C316262EE53AE760
+43E2F267C2598CE66CFEAEF1459C307CA9B3FD8E897C93426545B80834EA16764633B2C5
+5B31557E6B5398F17D0BE5CC1348FE71014EF3BA2F917589AE4A4C9D8EF22A6D0A288557
+C4B2F2ABF2C30E778A5F21AA16BDD04CD8433514FBC7F81583F5D9CE3DE38542DCA55FFC
+9142EB3B797946A7A121C134C82DAED820D3FF0E7053B40134353012A44B15506385533D
+0702662BC8545130B7717B5E99BDC18E8473D2920C80CAD8F61D352C2B3718567B0BDFDF
+F063D2E1A568D6B17412149E4C9AFE3FD3F8186A8274FC01CA07504BE6751A7BDE74719E
+970A9F1744917E3521C4988E547EC1B63D33AD86390DB6CDBA9436884CEAA6064E383B61
+68BD405523A23D32B571E534354E1BD4EA3EDB7D1BBF2D0F6D6B36993DB0DF94C18BEBE2
+6F4B6475306784C091E139A759F627843CED43666D95AE257E650DDA0F6C0458CF27885F
+25D59FE5601777ADCCB42ABC20F960B17A2669B4277AEE51A3D33BB1914FC5985236A6E0
+0C32956A1CAB55DD020DAFA2BAE36638E5F5866AEAB8E3439EFEA9266CB28B9DBA4B1746
+046A71E3BF05F37FF84CEFD66479640C3BB43D915BFA3AF6F3916F2AAAE39DD4317563C2
+26E361EE278E9FE076EE6B4733720C53918CA5CC9C5F4C6C7A36D8E49A591074AEFF0363
+09E5834A3978ACEB9016F116D20B6854BC59484F344D069768C6DFC503EB95C9FEA0521B
+FD6E1C99FCD1268D18C1DD428C66DE9145071190FB17464C8C4FE87D9C0F3DA5FC3E933D
+7375E88DC3BA96858D671A6616F52E70EC6B5795114C3F03F8C78CC388AC01866B347196
+40705C2EA04CC1369A88B3A242FFCB32B48024742A03C94A6E715EF09F06CC999CA1E593
+AB6013B7E25685C4FA93429EE0613E3DA07C94D82B9A739B954BD6EA1E2A9DE55461211B
+4FBCCFF6BD480C845DC4B075B33551C760FE3D8F5EDB1201269AF48C8F8E96AFB5C7F767
+20AD3F9BDB225AF317770F1C2644589EDB5639376E30DB053930511FEE7C9FF81F6B76ED
+57E4C6CF157AF5EE0D8E05F0B9F1276385B3C4EF779593B0120AAE0073880C0DE6F76906
+8B96E92133050EF7BA0A6585AB37880501F42477E0AB8A5D314F7A5A1B760142A42A40F2
+2A12F0F79C747F8C57C688C5937BCCF9B217647EA1D7C16936055814F9260C647045F3C8
+997D40B7BB690B654B9F243D2FC9343C7BAEC4F79AC5CA9C8A43E414B4BC6A6B02828CC2
+1432BBC6E49EAB7DAE35926C6B0BFBC6AC3831834CF54A732E8531AC7D0A3AF62A5FF8F2
+4B59EF71698824E2AC5E4DC2D5C58B9FFA80817C4DA7638CE5B6F0F33164FCCDA6F82933
+AE42A26BA9AA939A7DBD55F35C29BB9D192251E945D9890F48F63D7BB58269031899F7D5
+A52C1747CBEE945D55154AD30301FCC6345DF34A177E9CAB110D7A52B63B131A1F7D7165
+BB5AC4B1842B9A1F3D86F521E4107B40963BB34CC61B10F79D936736DEAC7F25BBDEC228
+E7838F1032154ADF35F333077483AFCDD50410C07707A47F9306BF794A15B5452EEB34FA
+48A8C1BAA627EBB16BEBE9369AE7D100CF8D14E5B70613C8C8A53CA82495E8BAE8990ABE
+0ACC0B2E9CC44191A50417657662385821B1C897C88AB2A0B149090CE11B940AC6DDB64D
+0BF745858A1A56F811F1DE81458F50A704EA30F5F1918D9B5481E6E4681B389C447A65E3
+56A12C8592C8709C09135B06994590DD0B87D2952C871EF0B7365D04928A7B19AB3A10EF
+40B0BA1DAB4D3DC5789EBDB23E98698963FBD74DAAB6C8885A88634E9857CBCB163B1D0E
+32DF259DFEF7217D6744CC6F34E0D96C7BC93CC0A19F4EFBDAB6338CB56B46E538EE92B4
+353AA6663AC42A2EF78E4A228886577678FF36E5ED221A807E009D33A737F89F80461FA5
+5741EEF636D19FAD5870AF6F436DFCEA130C102156F134F77DFE4933628DBE64B477555D
+81CE6131866AA5712347043CF70634F92D5B984445D32A545607B62BA1C12D37FB6B17F3
+84838E274818032AD7A07CDF1F504B3CB5C5C9D8D16342CAB18697A5821B2E219D14F15C
+AAFB33A44E4E6D18C4DC64F79DDCBF2BFF7B3FE05709420DBBC24B8C23822755062B9784
+69AF6B01CDC9C45E55A71BC5BE1EDFDC23C430D61FF776BB4B2AB69BD391758462A9700E
+21B81CE478207D443C5A868946969DA1E63AA939D3563605C83C2AB2C5E7551169F466D7
+41FDCEE57EEE7897C41F0409AB61E86C947C83850C23DE579ED1A7EF7F941522F41337A7
+F2FF06D4D5CC4A9436A2CEB91B1D9218F46BCC3A1A5C57539BD6A56C6755A8ADD89884F1
+2FF46C13248D02EACB04008BCE1CCC3DA9CB7D4EF0AF02A97734C95D8C45CC360AAA467E
+97858E0B66978BB46353E9C0A653E49CC1E63C119FA50441846E5AE38D551BDF3A7CBD2B
+8E51C2C088A617B68E21DD2F44EF5033CD252A75C80F16F6C45EBC84E17FA58F8DA6800B
+8F61B060F54124F1B1F12AE75059159AF036C25DD06F4EEF5D8048079AC6CCB1BD5DA270
+005EC1428BC3F7A6369EC13EC8F99F77892D163FE605B8609940E1B27D784C57B7842BD7
+10C78480BF7EE7CF9BC29064CBCBE8B3B584C453C29851C39438E10BB9CAD4B2776B0899
+EDFF8CC4D35C8DF827743DC5D85681F4A7B9EAB43E133384B072F0D7A86EC6BFD5989503
+A95AA4DFF2FCB6BCEC468DFF75D20F9FD35015D4F98D65160E9EF8E1AE723433114B5458
+7B0A7314D320A942440D3D37F3BE4164C5D796C5D3597222EC88C7A14503EF964643B095
+E2F113FA22EA7999905633109628F97982451A9810D6A1DD84EB108D7A26E04C1C00488D
+322774F47B555B28D24732E6C0D4D701933C9506D379B3E5BC10609B167C1064F34A4327
+A50D0D2FB470994714FB881EE3B88B054633BFF034650C0C4E4AE5720C35C7F3E4CD30E3
+6B26D8CD1813A7703867952488E01B23FDF799AE3AB35E4880E41B4DDBCF8CB4FA68423E
+2D5E122264F8378BB8EA414C83D95A4A6D85995CE64A50B39C8E5F94955CDDBD88804D42
+279515FC1129FD2F50A170B214BED20695CCE59EAE0ACE91FCE6DD217B3A737A9DCAE11E
+A0C746306AA9447F469BE68D8488E392D00583BAF1E63782C73D5201359CE7A768F24489
+0FA50098398CB006F74E9877E9E4373228269506F44931115C0E44654AFD6B48E3E2F6DD
+47E738DE4CDC5344E1C26FAE5B73B9844F5CB2292D675CE88C2078DBDA11C2A9A58F4B10
+42850802766C9387734F22288F12E1F0D211FE150294FDD1744D8001AB95D9D63FD5C916
+B7886A1D6A076D14AD0B6D65E63D49CBC825E85CCFE3E6119DD05D6450980900600A0A07
+4BE3EE6801DAA9670D1BD6F7FE3332BF9B16C9D7DF782547006BF79DD5286A899E1153F1
+077B7AD8CDAC2724E1689A95B958D24566EA5759AF2276E2558AC8A110EA5CAB9C1BE598
+4031BBCA618B7EA15E87379927AF1D58AF01217B45B9CC67F79D96977624A9A01B1AA7A3
+1D0E4B61F6FC96A620867BAB29A7331DE35BC73E29DD89DEC1B5CA163679017FD5D52D6E
+F359C8ACD7D149B509EB1E9EA1EBDDD572720F11A390AC61F898295FCCA27F466787CE24
+3C889A45EB97AE0AD87B5DB995DECB80D8A73592C9E17F02ED6BEFD6CFC5E56275366022
+E3EE687762FDB605B7221C7004DA9E8B594D6CA0B0AA5AD97D0231C228E38D21F2652470
+2524A76555EA690062A1C811C7708F33A432E4B93683D416BC6BFD9A3A9CD114ECEAD652
+98376657CFC1B1826B77B533314A3962ABA6137CF6502713BDA51FFC763CF78C7A0AFC99
+CD496DFE069FACD2669351BED17106952A3E55A13210C5024885CAF002343A31D1E64745
+E973853B94DE520B204922CE2063140C7403D7E038EA2D21D86A72E417DEF576BC60ED61
+B74A8237ABEBD176625ADC0B1475EF4D985D05148D0233041FB5F02920F4F4C769E2DF96
+8463AB7054465464844A2A1F1C427B9369BBF6221B0D557C1F1AFF62F710BA060FAA89D7
+3C6E7F5B09B2D1E192F47743BE288AB84682254C54ECDB6FB52E1013CFD075D0430D321D
+C0A9B30AA8D1BF0676816E3FB7BB53E19B9C782E3B15732AF9A233408CD12FCBB1D3A963
+3910D9E4F84F1D89B0A26AFC1DF439654005CEDFD46A9B5FC815C91E72631D255475710A
+CADB424EC5D2A86681422B36B8A6BE4DCA28EA5A919D9EE1B4F722518925484A59C6A972
+F68A0BC736BEBEF281DFA37F4F51BE2746644CAAC585DE766DCDF6443263C9A403E4E110
+32721D8C79C005B982D7B1A3E19AEAF0C89A2AB06841D677F79C3152E4B130B122BFC8ED
+D6EFFAC69BA8C66C47F3D5321FB8A9C7156CFA2F0F577DF1CA2D8E9C6D854B401FF8DCF3
+BFBA7C98B11B3F128EA81DD1BB7B4FC24943B43772A6E731876CF46608CB88EB143AE9B1
+7D72DE503210705410B26CF1D70D7D4B98A2C4AC6F7AEBCE59BAB09F1C4D4E97EC3A9D91
+15554C98E2FC7DF130D4548875C0ECF16614BFDAC96E9230FAAB82C6EBDAA0EBCCD1ABC9
+F9DB0B987DF58240B927A6AF8BF1CA62C39DA2DFDF36DA884F67553F058CE4718777EDED
+34E30501AC3DD9B8F9008463A33AA8612595E855D009CF9F7C1BDAC1DBD1483BCFF8A7DD
+346DC22F31646C0CF07C753596AFC285F6136BF7E3C83B0FB75D9BDFA9979C0930A245D2
+7899ECA0F64F12C390EA7293E5EFA7A1D0721AAF72B313E6A14FD20B1B5AD9F3BE0F071E
+33E89D4F5CC7111B4C06F18782A5A8F840CF27EE20B8BDC0B16E295D4AC30C2E079F75CB
+23A338BB99D059095BE8E7D2FEE1BC421BEAFC536D2E2C40E05B6EF3CF483A34CE506816
+2CE04C4F2D9F17748F9FAFB67F046A168F4545D80ECF05266556DA6E75B018F790D5B821
+B5F9D115BA8E3A7B273B92E6E111CD257A6B12F4F25956AF908C8CEC671DBB796FA93893
+18D5B8473A04B63E0F751744D8050A1D266A15656A016697A9CA765660B5728E9BAC77CE
+F7EFA339B522C2C52E6C678C550388136C678B2CD1027214D0D086028A29DD4785EEB512
+BD60CF2132746757559BE4C6B802792700B911D098F4A95A758B6E30285F906B6EE7B60D
+991F86B1961FDC2BD5A9FA8F68E488AD57494765D9822A469FCAC1BDCE3F3685B09550D4
+49CE97D9FA83F187923C4DE772464EFE98A9789B93E5691C621E9B79F227041D22CB05A0
+22282BAA61BFC04863CEB7BA282CE68AE91CCDC2717747B3BCD808136F779DADFDBEECFF
+E610CEE002874E4B33EF0ED4602073C56693BA2479D885F53FE4F5C68DF9C6B09D021342
+C117F488BFC7F2A7BADC2E059F0BF05AED5F6B8467CBE018D7AC442BC3526F8566A71B4A
+69E93874F74F3B751B8C6811992D47DC4D080461269C6EB18AE76ECC66479B6A53E1984F
+A17E13F546FD4AC12024A1ACE29C9BDCD47274E480017759381B2081349FF3AC5BAA1902
+2D9EB3DDC8471B0D2D58E3717973F7B7CD8E8AEAA301A676579AD57D112CF6D8F659B8CC
+E055A155AB0F6C6B8A3254ADBD5E6BBAA336327F3AE20C109CA8C46EF35814473457E3F2
+EC80EE99547B84377DF391B0A9B2F60B818A0A3D49D5E36A2D7A05F4F77F964F81CC51D2
+272CD30B52AFB7AEE06129977A0AF98BFF236EADF92CD7508A2F3FE853EE26530922A59B
+639571AA10FA5FC0E1315B7215B76045E18141403E4B0B2A9EB724E69BB40AC1AB479216
+1686D2B0DF545D0FA08CFACB8C8145AA9FB982222EE247B7DF2D5F2B33A9B6AE29CC6166
+3F642883EB6757DB8F1845E1727B7AADAE2FD8E560922467E79EF1803A03C9D51F649DD4
+16C75835F9EEB1FA6FAE978B1B7B7792FB24EDFD9EF55E67CB02D5C23C9628F126BD3A12
+31869DAE5FBBCE60133DEB7D33F1E0ADFD9927A3E9E42B6AB0E5D703BD7271A179985FC3
+D91C2D161B76F70987073647B26542C83A34172663F6793DE8B8D9BCD72CCD48DF5563C0
+FBFA6CC45D99AB78CD6ED8B861948E54DFE9C99E169E35A88D03C1C9A7C84720A3956B00
+0842CF8C515E3A722DDD0B6627926110B335744866564CC638901758FE0EFA98F4E3F4CF
+DF911E5E395EC3D17807D7483008A95BA603AB80FB6A359BA3F0A8ADFE60F9CBADF67441
+1D0BE41B802B3EC9075DC1EB375EDCD27E113B4B1EA3C8ED0B1BBB2A3DB934CDC5CDA9B6
+0F85B33DD71FCA5B25B0AAA6B528229D84E1E7B97CB72C0F20248509A2B6CC53E5B7B694
+24FD8BFAE39C66E86DCEE0B602C9102A0575F15693B3C0A268C1C3F897F57E1CC5A58ADA
+4222A57B2A53B234BA19ADA37208C16B1B757E106D5D8AF0AFFD6BBA6E753805BBC2E9A4
+450A78025400D18B8FDCA54A18440331E48E52E3C4CA80FC171B02293CED081E887215EA
+D34DCF1D6FC2FE86502262006977878E4960326634F1A1EC8D2D96CF51EECDDD6D7CB410
+6D2B37136A13B4D2B67A2DCC74365A27E72B263FCF506B34116BB93BF76DA0C813CE6F63
+639BA86D000BEEED941AC2096A7F1C714615CE20F920BC4427BBB157105FC8FCC3D5FA6C
+9C0D797AB7ECA5DA2B5DF210C4523E406821B704383C63055EB87E8C82E68ABB062487C8
+834EB35BA973902999E27D9A7D143536CB253195A3801FAF741C1588C808A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+%%BeginResource: font ZapfDingbats-Reverse
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font ZapfDingbats
+/ZapfDingbats findfont[-1 0 0 1 0 0]makefont
+dup length 1 add dict begin
+{
+exch dup dup/FID ne exch/UniqueID ne and{
+exch def
+}{
+pop pop
+}ifelse
+}forall
+/FontName/ZapfDingbats-Reverse def
+/Metrics 202 dict dup begin
+/space[0 -278]def
+/a1[-939 -974]def
+/a2[-926 -961]def
+/a202[-939 -974]def
+/a3[-945 -980]def
+/a4[-685 -719]def
+/a5[-754 -789]def
+/a119[-755 -790]def
+/a118[-756 -791]def
+/a117[-655 -690]def
+/a11[-925 -960]def
+/a12[-904 -939]def
+/a13[-520 -549]def
+/a14[-821 -855]def
+/a15[-876 -911]def
+/a16[-898 -933]def
+/a105[-876 -911]def
+/a17[-910 -945]def
+/a18[-939 -974]def
+/a19[-721 -755]def
+/a20[-811 -846]def
+/a21[-727 -762]def
+/a22[-726 -761]def
+/a23[-572 -571]def
+/a24[-641 -677]def
+/a25[-728 -763]def
+/a26[-725 -760]def
+/a27[-724 -759]def
+/a28[-719 -754]def
+/a6[-459 -494]def
+/a7[-517 -552]def
+/a8[-502 -537]def
+/a9[-542 -577]def
+/a10[-657 -692]def
+/a29[-751 -786]def
+/a30[-753 -788]def
+/a31[-753 -788]def
+/a32[-755 -790]def
+/a33[-758 -793]def
+/a34[-759 -794]def
+/a35[-781 -816]def
+/a36[-788 -823]def
+/a37[-754 -789]def
+/a38[-806 -841]def
+/a39[-788 -823]def
+/a40[-798 -833]def
+/a41[-781 -816]def
+/a42[-796 -831]def
+/a43[-888 -923]def
+/a44[-709 -744]def
+/a45[-688 -723]def
+/a46[-714 -749]def
+/a47[-756 -790]def
+/a48[-757 -792]def
+/a49[-660 -695]def
+/a50[-741 -776]def
+/a51[-733 -768]def
+/a52[-757 -792]def
+/a53[-724 -759]def
+/a54[-672 -707]def
+/a55[-673 -708]def
+/a56[-647 -682]def
+/a57[-666 -701]def
+/a58[-791 -826]def
+/a59[-780 -815]def
+/a60[-754 -789]def
+/a61[-754 -789]def
+/a62[-673 -707]def
+/a63[-651 -687]def
+/a64[-661 -696]def
+/a65[-654 -689]def
+/a66[-752 -786]def
+/a67[-752 -787]def
+/a68[-678 -713]def
+/a69[-756 -791]def
+/a70[-749 -785]def
+/a71[-756 -791]def
+/a72[-838 -873]def
+/a73[-726 -761]def
+/a74[-727 -762]def
+/a203[-727 -762]def
+/a75[-724 -759]def
+/a204[-724 -759]def
+/a76[-857 -892]def
+/a77[-857 -892]def
+/a78[-753 -788]def
+/a79[-749 -784]def
+/a81[-403 -438]def
+/a82[-103 -138]def
+/a83[-242 -277]def
+/a84[-380 -415]def
+/a97[-357 -392]def
+/a98[-358 -392]def
+/a99[-633 -668]def
+/a100[-632 -668]def
+/a101[-697 -732]def
+/a102[-488 -544]def
+/a103[-510 -544]def
+/a104[-875 -910]def
+/a106[-632 -667]def
+/a107[-725 -760]def
+/a108[-760 -760]def
+/a112[-741 -776]def
+/a111[-561 -595]def
+/a110[-659 -694]def
+/a109[-592 -626]def
+/a120[-753 -788]def
+/a121[-753 -788]def
+/a122[-753 -788]def
+/a123[-753 -788]def
+/a124[-753 -788]def
+/a125[-753 -788]def
+/a126[-753 -788]def
+/a127[-753 -788]def
+/a128[-753 -788]def
+/a129[-753 -788]def
+/a130[-753 -788]def
+/a131[-753 -788]def
+/a132[-753 -788]def
+/a133[-753 -788]def
+/a134[-753 -788]def
+/a135[-753 -788]def
+/a136[-753 -788]def
+/a137[-753 -788]def
+/a138[-753 -788]def
+/a139[-753 -788]def
+/a140[-753 -788]def
+/a141[-753 -788]def
+/a142[-753 -788]def
+/a143[-753 -788]def
+/a144[-753 -788]def
+/a145[-753 -788]def
+/a146[-753 -788]def
+/a147[-753 -788]def
+/a148[-753 -788]def
+/a149[-753 -788]def
+/a150[-753 -788]def
+/a151[-753 -788]def
+/a152[-753 -788]def
+/a153[-753 -788]def
+/a154[-753 -788]def
+/a155[-753 -788]def
+/a156[-753 -788]def
+/a157[-753 -788]def
+/a158[-753 -788]def
+/a159[-753 -788]def
+/a160[-859 -894]def
+/a161[-803 -838]def
+/a163[-982 -1016]def
+/a164[-423 -458]def
+/a196[-713 -748]def
+/a165[-889 -924]def
+/a192[-713 -748]def
+/a166[-883 -918]def
+/a167[-892 -927]def
+/a168[-893 -928]def
+/a169[-893 -928]def
+/a170[-799 -834]def
+/a171[-838 -873]def
+/a172[-793 -828]def
+/a173[-889 -924]def
+/a162[-889 -924]def
+/a174[-882 -917]def
+/a175[-895 -930]def
+/a176[-896 -931]def
+/a177[-428 -463]def
+/a178[-848 -883]def
+/a179[-801 -836]def
+/a193[-801 -836]def
+/a180[-832 -867]def
+/a199[-832 -867]def
+/a181[-661 -696]def
+/a200[-661 -696]def
+/a182[-839 -874]def
+/a201[-839 -874]def
+/a183[-725 -760]def
+/a184[-911 -946]def
+/a197[-737 -771]def
+/a185[-830 -865]def
+/a194[-737 -771]def
+/a198[-854 -888]def
+/a186[-932 -967]def
+/a195[-854 -888]def
+/a187[-796 -831]def
+/a188[-837 -873]def
+/a189[-892 -927]def
+/a190[-935 -970]def
+/a191[-884 -918]def
+/a205[-474 -509]def
+/a206[-375 -410]def
+/a85[-474 -509]def
+/a86[-375 -410]def
+/a87[-199 -234]def
+/a88[-199 -234]def
+/a89[-355 -390]def
+/a90[-355 -390]def
+/a91[-241 -276]def
+/a92[-241 -276]def
+/a93[-282 -317]def
+/a94[-282 -317]def
+/a95[-299 -334]def
+/a96[-299 -334]def
+end def
+/ZapfDingbats-Reverse currentdict end definefont pop
+%%EndResource
+%%BeginResource: font Symbol-Slanted
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font Symbol
+/MakeTransformedFont{
+findfont dup maxlength dict begin
+{
+exch dup dup/FID ne exch/UniqueID ne and{
+exch def
+}{
+pop pop
+}ifelse
+}forall
+/FontBBox
+currentdict/FontBBox get
+4 array copy def
+FontBBox aload pop
+4 index transform 4 2 roll
+4 index transform 4 2 roll
+FontBBox astore pop
+FontMatrix exch matrix concatmatrix
+/FontMatrix exch def
+dup/FontName exch def
+currentdict end
+definefont pop
+}bind def
+/Symbol-Slanted
+[.89 0.0 15.5 dup sin exch cos div .89 0.0 0.0]
+/Symbol
+MakeTransformedFont
+%%EndResource
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron
+/Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Courier@0 ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE
+/Times-Roman@0 ENC0/Times-Roman RE/Times-Bold@0 ENC0/Times-Bold RE
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 13/Times-Bold@0 SF(MetaP)232.652 127 Q(ost with gr)-.26 E(off)-.234
+E/F1 11/Times-Roman@0 SF 1.485(John Hobby')72 169.9 R 4.235(sM)-.605 G
+1.485(etaPost program had an)-4.235 F/F2 11/Times-Italic@0 SF -.407(AT)
+4.235 G 1.485(&T tr).407 F(of)-.495 E(f)-.198 E F1(interf)2.156 E 1.485
+(ace which ha)-.11 F 1.815 -.165(ve b)-.22 H 1.484(een changed to use)
+.165 F F2(GNU tr)72 182.9 Q(of)-.495 E(f)-.198 E F1(instead.)4.906 E/F3
+11/Times-Bold@0 SF(Usage)72 208.9 Q F1 1.123
+(Since MetaPost is a picture-dra)72 225.8 R 1.123
+(wing language that outputs PostScript, it is necessary to use the)-.165
+F/F4 11/Courier@0 SF(-mpspic)72 238.8 Q F1 1.668
+(macro package, which is automatically included when)4.419 F F2(gr)4.418
+E(of)-.495 E(f)-.198 E F1 1.668(\(1\) is in)2.156 F -.22(vo)-.44 G -.11
+(ke).22 G 4.418(dw).11 G 1.668(ith the)-4.418 F F4(-Tps)72 251.8 Q F1
+(option to prepare output for PostScript printers or pre)2.75 E(vie)
+-.275 E(wers.)-.275 E 3.517(Suppose you ha)99.5 268.7 R 3.847 -.165
+(ve w)-.22 H 3.518
+(ritten some \214gures in MetaPost and placed the input in a \214le).165
+F F4(figures.mp)72 281.7 Q F1 5.5(.R)C(unning)-5.5 E F4(mp -T figures)
+108 301.2 Q F1(to in)72 320.7 Q -.22(vo)-.44 G .22 -.11(ke t).22 H
+(he MetaPost interpreter produces output \214les).11 E F4(figures.1)2.75
+E F1(,)A F4(figures.2)2.75 E F1 2.75(,.)C 1.833(..)-.917 G .476
+(Standalone EPS pictures can be produced from such \214les by)99.5 337.6
+R F4(fixgrofffonts)3.225 E F1 3.225(,t)C .475(hat \214x)-3.225 F(es)
+-.165 E .641(comments according to Adobe Document Structuring Con)72
+350.6 R -.165(ve)-.44 G .641(ntions \(DSC\), embeds font reencod-).165 F
+(ing commands and non-standard fonts.)72 363.6 Q F4
+(fixgrofffonts < figures.1 > figures1.eps)108 383.1 Q
+(fixgrofffonts < figures.2 > figures2.eps)108 396.1 Q(...)108 409.1 Q F1
+.469(Before these \214gures can be included into)99.5 432.5 R F2(gr)
+3.219 E(of)-.495 E(f)-.198 E F1 3.219(,t)2.156 G(he)-3.219 E 3.219(yh)
+-.165 G -2.475 -.22(av e)-3.219 H .469(to be processed with the)3.439 F
+F4(fixmp)3.219 E F1 1.415(script: It adds an encoding v)72 445.5 R 1.415
+(ector for all te)-.165 F 1.416
+(xt fonts back to the \214le \(which MetaPost can')-.165 F 4.166(ta)
+-.198 G(dd)-4.166 E .303
+(itself\) and changes the Adobe Document Structuring Con)72 458.5 R
+-.165(ve)-.44 G .302(ntions \(DSC\) comments to something).165 F F2(gr)
+72 471.5 Q(of)-.495 E(f)-.198 E F1(can handle.)4.906 E F4
+(fixmp < figures.1 > figures.1ps)108 491 Q
+(fixmp < figures.2 > figures.2ps)108 504 Q(...)108 517 Q F1(No)72 536.5
+Q 2.75(wt)-.275 G(he con)-2.75 E -.165(ve)-.44 G
+(rted \214les can be included in a).165 E F2(gr)2.75 E(of)-.495 E(f)
+-.198 E F1(document via macro calls such as)4.906 E F4
+(.PSPIC figures.1ps [width [height]])108 556 Q F1 .615(as e)72 575.5 R
+.615(xplained in the)-.165 F F2(gr)3.366 E(ops)-.495 E F1 .616
+(\(1\) documentation.).297 F .616
+(Note that the picture gets rescaled if the height and)6.116 F
+(width in the)72 588.5 Q F4(.PSPIC)2.75 E F1(command don')2.75 E 2.75
+(tm)-.198 G(atch)-2.75 E F2(mp)2.75 E F1 1.21 -.605('s i).209 H
+(dea of the picture dimensions.).605 E F3(An example)72 614.5 Q -6 -17
+79 79 -39 39 248.5 666.5 PBEGIN
+%%BeginDocument: grdemo.1ps
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -6 -17 73 22
+%%HiResBoundingBox: -5.5 -16.14502 72.741 21.95007
+%%Creator: MetaPost 0.901
+%%CreationDate: 2006.03.12:1621
+%%Pages: 1
+%%DocumentNeededResources: font Times-Roman
+%%+ font ZapfDingbats-Reverse
+%%+ font Times-Italic
+%%+ font Symbol-Slanted
+%%+ font FreeEuro
+%%EndComments
+%%BeginSetup
+ /ptmr8g ENC0 /Times-Roman RE
+ /ptmr8g /ptmr8g def
+ /zfzdrr /ZapfDingbats-Reverse def
+ /ptmri8g ENC0 /Times-Italic RE
+ /ptmri8g /ptmri8g def
+ /fsyro /Symbol-Slanted def
+ /zfeu /FreeEuro def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndSetup
+%%Page: 1 1
+newpath -2 -4.125 moveto
+38.60602 -4.125 lineto
+38.60602 8.78003 lineto
+-2 8.78003 lineto
+ closepath fill
+ 1 setgray
+newpath -3 -3.125 moveto
+37.60602 -3.125 lineto
+37.60602 9.78003 lineto
+-3 9.78003 lineto
+ closepath fill
+ 0 setgray
+0 0 moveto
+(\275) ptmr8g 10.00005 fshow
+10 0 moveto
+(A) ptmr8g 8.00009 fshow
+18.276 0 moveto
+(+) zfzdrr 10.00005 fshow
+30.166 0 moveto
+(a) ptmr8g 10.00005 fshow
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -3 -3.125 moveto
+37.60602 -3.125 lineto
+37.60602 9.78003 lineto
+-3 9.78003 lineto
+ closepath stroke
+newpath 70.491 2.32751 moveto
+70.491 8.37088 65.59187 13.27 59.54851 13.27 curveto
+53.50514 13.27 48.60602 8.37088 48.60602 2.32751 curveto
+48.60602 -3.71585 53.50514 -8.61497 59.54851 -8.61497 curveto
+65.59187 -8.61497 70.491 -3.71585 70.491 2.32751 curveto closepath fill
+ 1 setgray
+newpath 69.491 3.32751 moveto
+69.491 9.37088 64.59187 14.27 58.54851 14.27 curveto
+52.50514 14.27 47.60602 9.37088 47.60602 3.32751 curveto
+47.60602 -2.71585 52.50514 -7.61497 58.54851 -7.61497 curveto
+64.59187 -7.61497 69.491 -2.71585 69.491 3.32751 curveto closepath fill
+ 0 setgray
+gsave [0.9397 0.34203 -0.34203 0.9397 53.5435 -2.70255 ] concat 0 0 moveto
+(e) ptmri8g 10.00005 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 56.45497 2.82672 ] concat 0 0 moveto
+(i) ptmri8g 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 58.2902 3.4947 ] concat 0 0 moveto
+(w) fsyro 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 63.22362 5.29033 ] concat 0 0 moveto
+(t) ptmri8g 6.99997 fshow grestore
+newpath 69.491 3.32751 moveto
+69.491 9.37088 64.59187 14.27 58.54851 14.27 curveto
+52.50514 14.27 47.60602 9.37088 47.60602 3.32751 curveto
+47.60602 -2.71585 52.50514 -7.61497 58.54851 -7.61497 curveto
+64.59187 -7.61497 69.491 -2.71585 69.491 3.32751 curveto closepath stroke
+ 1 setlinecap
+newpath 37.60602 3.32751 moveto
+47.60602 3.32751 lineto stroke
+6.09799 12.92004 moveto
+(\244) ptmr8g 10.00005 fshow
+13.59799 12.92004 moveto
+(\243) ptmr8g 10.00005 fshow
+21.09799 12.92004 moveto
+(\004) zfeu 10.00005 fshow
+10.203 -12.00502 moveto
+(\204) ptmr8g 10.00005 fshow
+ [3 3 ] 0 setdash
+newpath -5.25 -15.89502 moveto
+72.491 -15.89502 lineto
+72.491 21.70007 lineto
+-5.25 21.70007 lineto
+ closepath stroke
+showpage
+%%EOF
+%%EndDocument
+end PEND F1 2.21(This \214gure w)72 683.4 R 2.21(as deri)-.11 F -.165
+(ve)-.275 G 4.96(df).165 G 2.21(rom a \214le)-4.96 F F4(grdemo.mp)4.959
+E F1 2.209(and included at this point by in)4.959 F -.22(vo)-.44 G 2.209
+(king the).22 F F4(.PSPIC)72 696.4 Q F1
+(macro \(omitting the height and width parameters to a)2.75 E -.22(vo)
+-.22 G(id rescaling\).).22 E(The \214le)99.5 713.3 Q F4(grdemo.mp)2.75 E
+F1(looks lik)2.75 E 2.75(et)-.11 G(his:)-2.75 E 0 Cg EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 11/Times-Roman@0 SF(-2-)281.587 49 Q/F1 9/Courier@0 SF(verbatimtex)
+108 83 Q(.EQ)108 94 Q(delim $$)108 105 Q(.EN)108 116 Q(\\# etex)108 127
+Q(input boxes)108 149 Q(beginfig\(1\);)108 171 Q(pair shadowshift;)118.8
+182 Q(shadowshift = \(1, -1\) * bp;)118.8 193 Q
+(def drawshadowed\(text t\) =)118.8 215 Q(forsuffixes $=t:)129.6 226 Q
+(fill bpath$ shifted shadowshift;)140.4 237 Q(unfill bpath$;)140.4 248 Q
+(drawboxed\($\);)140.4 259 Q(endfor)129.6 270 Q(enddef;)118.8 281 Q
+(boxit.a\(btex \\[12] \\s8A\\s+2 \\[lh] a etex\);)118.8 303 Q
+(circleit.b\(btex $e sup {i omega t}$ etex rotated 20\);)118.8 314 Q
+(b.w - a.e = \(10bp, 0\);)118.8 336 Q(drawshadowed\(a, b\);)118.8 358 Q
+(draw a.e .. b.w;)118.8 369 Q
+(label.top\(btex \\[Cs] \\[Po] \\[Eu] etex, a.n\);)118.8 391 Q
+(label.llft\(btex \\[Fn] etex, a.s\);)118.8 402 Q
+(draw bbox currentpicture dashed evenly;)118.8 424 Q(endfig;)108 435 Q
+(end)108 457 Q/F2 11/Times-Bold@0 SF(Changing GNU tr)72 489.5 Q
+(off pipeline)-.198 E F0 .378(Note that, by def)99.5 506.4 R .378
+(ault, the typesetting commands in the)-.11 F/F3 11/Courier@0 SF(btex)
+3.128 E F0 1.833(...)3.128 G F3(etex)1.295 E F0 .378(blocks in the abo)
+3.128 F -.165(ve)-.165 G -.165(ex)72 519.4 S(ample are processed by).165
+E F3(eqn -Tps -d\\$\\$ | troff -Tps)108 538.9 Q F0 .411(If a dif)72
+558.4 R(ferent)-.275 E/F4 11/Times-Italic@0 SF(tr)3.161 E(of)-.495 E(f)
+-.198 E F0 .41(pipeline must be used it can be speci\214ed via the)5.317
+F F3(TROFF)3.16 E F0(en)3.16 E .41(vironment v)-.44 F(ariable.)-.275 E
+-.165(Fo)72 571.4 S(r).165 E F4(gr)2.75 E(of)-.495 E(f)-.198 E F0 2.75
+(,t)C(he follo)-2.75 E(wing is recommended:)-.275 E F3
+(TROFF='groff -teZ')108 590.9 Q F0 1.576(It adds)72 610.4 R F4(tbl)4.326
+E F0 1.576(to the pipeline in addition to)4.887 F F4(eqn)4.326 E F0
+4.326(,p)C 1.576(roducing output for)-4.326 F F4(gr)4.327 E(of)-.495 E
+(f)-.198 E F0 2.787 -.605('s d)2.156 H(ef).605 E 1.577(ault `ps' de)-.11
+F(vice.)-.275 E .847(Note that you then ha)72 623.4 R 1.177 -.165(ve t)
+-.22 H 3.597(os).165 G .847(pecify the left and right delimiters of)
+-3.597 F F4(eqn)3.597 E F0 2.056 -.605('s i).264 H .846
+(n-line equations within).605 F
+(the document \(which is good practice an)72 636.4 Q(yw)-.165 E(ay\).)
+-.11 E .235(Macro de\214nitions and such can be added via the standard)
+99.5 653.3 R F3(verbatimtex)2.986 E F0 1.833(...)2.986 G F3(etex)1.153 E
+F0(mech-)2.986 E .556(anism that adds the gi)72 666.3 R -.165(ve)-.275 G
+3.306(nm).165 G .556(aterial to the)-3.306 F F4(tr)3.306 E(of)-.495 E(f)
+-.198 E F0 3.306(input. Such)5.462 F .556
+(material should not generate an)3.306 F 3.306(yo)-.165 G(ut-)-3.306 E
+.118(put since this w)72 679.3 R .118(ould get mix)-.11 F .118
+(ed up with the ne)-.165 F(xt)-.165 E F3(btex)2.868 E F0 1.833(...)2.868
+G F3(etex)1.035 E F0 2.868(block. Note)2.868 F .118(the comment escape)
+2.868 F(right before the \214rst)72 692.3 Q F3(etex)2.75 E F0
+(command in the abo)2.75 E .33 -.165(ve ex)-.165 H(ample to a).165 E
+-.22(vo)-.22 G(id an empty line.).22 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/systems/doc/metapost/source-manual/grdemo.eps b/systems/doc/metapost/source-manual/grdemo.eps
new file mode 100644
index 0000000000..ae476c1973
--- /dev/null
+++ b/systems/doc/metapost/source-manual/grdemo.eps
@@ -0,0 +1,779 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -6 -17 73 22
+%%HiResBoundingBox: -5.5 -16.14502 72.741 21.95007
+%%Creator: MetaPost 0.901
+%%CreationDate: 2006.03.12:1621
+%%Pages: 1
+%%DocumentNeededResources: font Times-Roman ZapfDingbats Times-Italic Symbol
+%%DocumentSuppliedResources: encoding groffEncoding
+%%+ font ZapfDingbats-Reverse Symbol-Slanted FreeEuro
+%%EndComments
+%%BeginSetup
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font ZapfDingbats
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Symbol
+%%BeginResource: font Symbol-Slanted
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font Symbol
+/MakeTransformedFont{
+findfont dup maxlength dict begin
+{
+exch dup dup/FID ne exch/UniqueID ne and{
+exch def
+}{
+pop pop
+}ifelse
+}forall
+/FontBBox
+currentdict/FontBBox get
+4 array copy def
+FontBBox aload pop
+4 index transform 4 2 roll
+4 index transform 4 2 roll
+FontBBox astore pop
+FontMatrix exch matrix concatmatrix
+/FontMatrix exch def
+dup/FontName exch def
+currentdict end
+definefont pop
+}bind def
+%%IncludeResource: font Symbol
+/Symbol-Slanted
+[.89 0.0 15.5 dup sin exch cos div .89 0.0 0.0]
+/Symbol
+MakeTransformedFont
+%%EndResource
+%%BeginResource: font ZapfDingbats-Reverse
+%!PS-Adobe-3.0 Resource-Font
+%%DocumentNeededResources: font ZapfDingbats
+%%IncludeResource: font ZapfDingbats
+/ZapfDingbats findfont[-1 0 0 1 0 0]makefont
+dup length 1 add dict begin
+{
+exch dup dup/FID ne exch/UniqueID ne and{
+exch def
+}{
+pop pop
+}ifelse
+}forall
+/FontName/ZapfDingbats-Reverse def
+/Metrics 202 dict dup begin
+/space[0 -278]def
+/a1[-939 -974]def
+/a2[-926 -961]def
+/a202[-939 -974]def
+/a3[-945 -980]def
+/a4[-685 -719]def
+/a5[-754 -789]def
+/a119[-755 -790]def
+/a118[-756 -791]def
+/a117[-655 -690]def
+/a11[-925 -960]def
+/a12[-904 -939]def
+/a13[-520 -549]def
+/a14[-821 -855]def
+/a15[-876 -911]def
+/a16[-898 -933]def
+/a105[-876 -911]def
+/a17[-910 -945]def
+/a18[-939 -974]def
+/a19[-721 -755]def
+/a20[-811 -846]def
+/a21[-727 -762]def
+/a22[-726 -761]def
+/a23[-572 -571]def
+/a24[-641 -677]def
+/a25[-728 -763]def
+/a26[-725 -760]def
+/a27[-724 -759]def
+/a28[-719 -754]def
+/a6[-459 -494]def
+/a7[-517 -552]def
+/a8[-502 -537]def
+/a9[-542 -577]def
+/a10[-657 -692]def
+/a29[-751 -786]def
+/a30[-753 -788]def
+/a31[-753 -788]def
+/a32[-755 -790]def
+/a33[-758 -793]def
+/a34[-759 -794]def
+/a35[-781 -816]def
+/a36[-788 -823]def
+/a37[-754 -789]def
+/a38[-806 -841]def
+/a39[-788 -823]def
+/a40[-798 -833]def
+/a41[-781 -816]def
+/a42[-796 -831]def
+/a43[-888 -923]def
+/a44[-709 -744]def
+/a45[-688 -723]def
+/a46[-714 -749]def
+/a47[-756 -790]def
+/a48[-757 -792]def
+/a49[-660 -695]def
+/a50[-741 -776]def
+/a51[-733 -768]def
+/a52[-757 -792]def
+/a53[-724 -759]def
+/a54[-672 -707]def
+/a55[-673 -708]def
+/a56[-647 -682]def
+/a57[-666 -701]def
+/a58[-791 -826]def
+/a59[-780 -815]def
+/a60[-754 -789]def
+/a61[-754 -789]def
+/a62[-673 -707]def
+/a63[-651 -687]def
+/a64[-661 -696]def
+/a65[-654 -689]def
+/a66[-752 -786]def
+/a67[-752 -787]def
+/a68[-678 -713]def
+/a69[-756 -791]def
+/a70[-749 -785]def
+/a71[-756 -791]def
+/a72[-838 -873]def
+/a73[-726 -761]def
+/a74[-727 -762]def
+/a203[-727 -762]def
+/a75[-724 -759]def
+/a204[-724 -759]def
+/a76[-857 -892]def
+/a77[-857 -892]def
+/a78[-753 -788]def
+/a79[-749 -784]def
+/a81[-403 -438]def
+/a82[-103 -138]def
+/a83[-242 -277]def
+/a84[-380 -415]def
+/a97[-357 -392]def
+/a98[-358 -392]def
+/a99[-633 -668]def
+/a100[-632 -668]def
+/a101[-697 -732]def
+/a102[-488 -544]def
+/a103[-510 -544]def
+/a104[-875 -910]def
+/a106[-632 -667]def
+/a107[-725 -760]def
+/a108[-760 -760]def
+/a112[-741 -776]def
+/a111[-561 -595]def
+/a110[-659 -694]def
+/a109[-592 -626]def
+/a120[-753 -788]def
+/a121[-753 -788]def
+/a122[-753 -788]def
+/a123[-753 -788]def
+/a124[-753 -788]def
+/a125[-753 -788]def
+/a126[-753 -788]def
+/a127[-753 -788]def
+/a128[-753 -788]def
+/a129[-753 -788]def
+/a130[-753 -788]def
+/a131[-753 -788]def
+/a132[-753 -788]def
+/a133[-753 -788]def
+/a134[-753 -788]def
+/a135[-753 -788]def
+/a136[-753 -788]def
+/a137[-753 -788]def
+/a138[-753 -788]def
+/a139[-753 -788]def
+/a140[-753 -788]def
+/a141[-753 -788]def
+/a142[-753 -788]def
+/a143[-753 -788]def
+/a144[-753 -788]def
+/a145[-753 -788]def
+/a146[-753 -788]def
+/a147[-753 -788]def
+/a148[-753 -788]def
+/a149[-753 -788]def
+/a150[-753 -788]def
+/a151[-753 -788]def
+/a152[-753 -788]def
+/a153[-753 -788]def
+/a154[-753 -788]def
+/a155[-753 -788]def
+/a156[-753 -788]def
+/a157[-753 -788]def
+/a158[-753 -788]def
+/a159[-753 -788]def
+/a160[-859 -894]def
+/a161[-803 -838]def
+/a163[-982 -1016]def
+/a164[-423 -458]def
+/a196[-713 -748]def
+/a165[-889 -924]def
+/a192[-713 -748]def
+/a166[-883 -918]def
+/a167[-892 -927]def
+/a168[-893 -928]def
+/a169[-893 -928]def
+/a170[-799 -834]def
+/a171[-838 -873]def
+/a172[-793 -828]def
+/a173[-889 -924]def
+/a162[-889 -924]def
+/a174[-882 -917]def
+/a175[-895 -930]def
+/a176[-896 -931]def
+/a177[-428 -463]def
+/a178[-848 -883]def
+/a179[-801 -836]def
+/a193[-801 -836]def
+/a180[-832 -867]def
+/a199[-832 -867]def
+/a181[-661 -696]def
+/a200[-661 -696]def
+/a182[-839 -874]def
+/a201[-839 -874]def
+/a183[-725 -760]def
+/a184[-911 -946]def
+/a197[-737 -771]def
+/a185[-830 -865]def
+/a194[-737 -771]def
+/a198[-854 -888]def
+/a186[-932 -967]def
+/a195[-854 -888]def
+/a187[-796 -831]def
+/a188[-837 -873]def
+/a189[-892 -927]def
+/a190[-935 -970]def
+/a191[-884 -918]def
+/a205[-474 -509]def
+/a206[-375 -410]def
+/a85[-474 -509]def
+/a86[-375 -410]def
+/a87[-199 -234]def
+/a88[-199 -234]def
+/a89[-355 -390]def
+/a90[-355 -390]def
+/a91[-241 -276]def
+/a92[-241 -276]def
+/a93[-282 -317]def
+/a94[-282 -317]def
+/a95[-299 -334]def
+/a96[-299 -334]def
+end def
+/ZapfDingbats-Reverse currentdict end definefont pop
+%%EndResource
+%%BeginResource: font FreeEuro
+%!PS-AdobeFont-1.0: FreeEuro 001.001
+%%Title: FreeEuro
+%Version: 001.001
+%%CreationDate: Sun Jan 8 10:14:22 2006
+%%Creator: root
+%Copyright: Created by Werner Lemberg with PfaEdit 1.0
+%Copyright: (http://pfaedit.sf.net); the serif shapes are based on the
+%Copyright: Omega fonts created by Yannis Haralambous.
+% Generated by FontForge 20060105 (http://fontforge.sf.net/)
+%%EndComments
+
+FontDirectory/FreeEuro known{/FreeEuro findfont dup/UniqueID known{dup
+/UniqueID get 4166882 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /FreeEuro def
+/FontBBox {4 -23 903 710 }readonly def
+/UniqueID 4166882 def
+/PaintType 0 def
+/FontInfo 10 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Created by Werner Lemberg with PfaEdit 1.0 \050http://pfaedit.sf.net\051; the serif shapes are based on the Omega fonts created by Yannis Haralambous.) readonly def
+ /FullName (FreeEuro) readonly def
+ /FamilyName (FreeEuro) readonly def
+ /Weight (Medium) readonly def
+ /FSType 12 def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 0/Euro.symbol put
+dup 1/Euro.symbol.bold put
+dup 2/Euro.symbol.slanted put
+dup 3/Euro.symbol.bold.slanted put
+dup 4/Euro.serif put
+dup 5/Euro.serif.bold put
+dup 6/Euro.serif.italic put
+dup 7/Euro.serif.bold.italic put
+dup 8/Euro.sansserif put
+dup 9/Euro.sansserif.bold put
+dup 10/Euro.sansserif.slanted put
+dup 11/Euro.sansserif.bold.slanted put
+dup 12/Euro.mono put
+dup 13/Euro.mono.bold put
+dup 14/Euro.mono.slanted put
+dup 15/Euro.mono.bold.slanted put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5A63F932884E18BF5153AD36053037D1C6CD
+04294AF6A35612DB9108AC8514CB5C4A8469971B75A09F9E662068B0685490EA8C73F2DE
+2FBBCF85D15AB9385E529DAB15A40D408002E88D0C107F711BC66BF0F2E92FDDC6B188F9
+1EEB6B86050D5032E6ABCB11E343C6D795217B5973972E99A9420651ACF3B8FD4CAD1DA4
+B00642AD077A5B86240F89F2BC011009CB2CF173FF68E9A88F0018F187D5E036FE8D904F
+211842FF01AA7CAADDEB9E5A534FA3F90BDB8F6FFE24F7AC6E7BD0A74CF29EBBA51871F0
+D1FF3262EA3CAFF583545FAB762B8D9BF14C8845C4EDB387B1248A4BCCB70AEDC6C67CF6
+C4648FA00124C44166D66DE1573C926CD9C6AE4F8B89E5987035D23195432204B648D458
+39F1769201B7C68828B3E49DFEF3065D705C2EBFFFB05B8A865CE4888872146C99671EFA
+EE1F514B94B86A47AAA5F21A39786E77D443FA4CF8B525C98FC02459528C08410C679440
+CC3A160C40B14E03FAB3E267943E1FBACDD4C082777B31AD3591DAEA25DC60E0EE11AB59
+52C58879FCB35A54009A156730AF209A8D4F00CF7DD9870C8DC3E48C19BED68742376268
+0408FFD4A34A0D8659D44FADC9FC9D3084601C93FD9FCA770B1191500ECB12C8DBDB2032
+007CECE3C6A2CC8593386DC1464B94A09EA2A83438C71ACC7CAD72D074ABF6FB98EFC81B
+6A3D672D2DCC637F34ACF18D469ED29FE2C49062380E6A32850F696834FC8E46A924164A
+C64DF8F848D4D000EB6FD06A44D0320975A8EEE85173E4D7E39EC9DB03A8ED20DAED86D2
+73CE5762A5D35D1A81987F9CD9921E39C2C5CEDD661C3B3EE86B703C101C410E41648347
+7599C4CCB91234510ABAC16898D9D10E30B5FC1BABE78DF2A009E09E52816F2413899184
+AB8F942A496B56C9FDE630B13AD9F0996ADE29CABAF1443452B427A2280AD00B85F4657C
+65B47E929FB0A2A31F257B24FE4ECBAFC878C306094088E00DB2DA6D36CECE30971846B6
+39DA9BA989109507FF21FD7198736278ED1CD021BFE7689D93B425D8B6CCCF07D37C22D7
+966FB87EFBE8F6A86D4F0C4BD38F5F3A41DCEDA924FD5F0D8FF089A0F44DFD37498507D3
+2A383FC717537744CC6868EB913D5C08CD0A3F935145FD5D811F01870F6136F4EFF757C5
+D03E73FC22F88624116C08C225C1711C96A01656999AAF7414163E75548AB89F8AA85F20
+9FA6EC242ECDA0953DC61EAE4107610380DFE2807101BDBA51391685990B3D1FFEFEC97E
+0F0DE04283920370575AC06B8597EE756EEF7A3543A3E5F1B74343702A201C43411E7B76
+DC6422E2529E740A6BC6BD44ABAACD955406734AF0852471CC7B49325286AFFD2F9CFD04
+BB9CA4D0F6F0494CED1D2984E2C607FD2CE5C5A1F538CF9107771E691FAD51AE5DA70748
+F14F2FF7CE61292F6FA50D4510E4100360A4A2EBF7F9A03F7A4DAC981C6DE582BAFEBC23
+AD97EB56656A218B24D47C4345B398C14ECF5B76037D83FEB71E65F89C01133A5228496C
+DF4BCC8BD4C615C9725511A2376A01C80F1EF38757CF104DD0809121EF1A2B9F11B5BDC7
+8E4F5A1463F37E952891370E1887644D26751A261FB5EE78BEA745F4F44A9B00098EDC4E
+3547F5AE50DCBF29EF5BF82D653A148D340BC600EB411F4EA8A6A2D0B548D0B217E78943
+BDAED70072716A4406D685B55C2C0F490D2B472C49B278DB78E9914C3623825E595A541F
+509F0E7BB1A827F4E6B0EA42C668932AB48D7B4A21AC0DA7451924D1AA7CDBE80C94F109
+1A4D91C3B908060FEB07D1B454A4CE4A60F8FACA6930313E09D5F11D1D8437E6B65EEE5B
+B5570C3B66ABC491BD8CF63C2C62BC7B38A0CDFFE9D75627E6D3B23B608C7EEBD8FC655C
+D197D28E8EB319814EA71B6AD63A966DB61D9C3C7D788683559C49338D037A235FD56FA0
+059DDC6017F0919926C323327C204139F07810575A8749877FB2C0C53AF4E3962613A0E8
+7D7C37A9974105992FC6B754CF23017C2E5851BCC90F48D6847EF1EF59E42032AFE03A98
+DB363827CA07E337A5852BE832772A2981864B8C1EDAD8759ACBC132ADD0BB360F40BAFD
+FC7E5D32D724CF82FD3342D431F8F4CD9BDE2B07C8D8EED411E3A5889A8163CD1E2C2786
+F78AD3C1D9879FD6E93BD1FD8949DE47A8BCD219422B2F1316950B72E1E5170701795A0A
+80709E894C218AA64DF5684719830066B995785AB9F1603FFDCEA945FEC09F57BF886F01
+A95811C7D4200E11C7CB373AAA4301E58F74E77519E11A89751A338B38D115B365547271
+DB19E51B85B30D1EB8E3E0B95436262D52471D65BBCF5DD94F6FF1210BF09628191F8F04
+3ED7109DE2AD284954564A1C80811B9AF1686DB799D36B50EB095AF37B9117992BB6B8F9
+0CE43ED10F9D0CE4B8ED76549239A626809ECA3D5A90E23D3CFBC776D6D816A293F2A80B
+7267D1842FA102BAD77A2A775CB55473F40D3976AFC77ECDA131FF663A12795528A7EC15
+1D7854E759321709A8F4750716C949D71D332F9B0B80130916826F07E0165A5A1C5F3D8E
+EF8CDB4EE3F688867FDDD47B4D67AD677F3134D90E07A1F0A8690169AC2E176BCB7CF260
+A70E374F3EC834E3B83D19CE3A52883024D2976E8E02C0B320CFD7B8BF66D11FBBF49353
+647AC4AB23A2A5689506AB83AD60AF8783E04815CABE60A3243FC633FD12D6DA50036691
+D3A0FBD4AD1309289565FC0C449510AD58085356AD829538B97A501FA73CEB693F09D551
+8FEAE6DE59FD7871AAED96A27127286C09FDD5A1EAE421CC38F56A4AF6AD5FA9BF96BF00
+2BE0A49BE6F27636DEB364A0762BCFF054020850C9222940B0E8A08E6A77240E1A0F42DC
+07DAD0283BCD9DAC20E2A7542F5D74FC90D2661AD95350566F27125160C0525364D8B764
+E06FBC0F85531185F8B92B4ADE928B2CF0DD4736CAA76F6659D128E416E9792F24CB6B41
+CF369FF2BF9C360FA006938067DA606B2B19C8599FB28306FDACBF29841A169F6368384E
+32B6BAD4179E345AB2B3CAB35E29E154228DCDC3D4C3317295A050A8AA86273BF7178A07
+65B598EE7061AE13B11B670F2E5F90F9FDD2F09A84F247DF9C90698A44A29BEC87B3C606
+E46A35D94986363CFEB26524FD7FB88092978128B0D246934D93BF90CDD94F7D243113C0
+8BDD1E09E4AC9F6E7A5A4FDB89150632CA41E3320D6B5AC722B27984D238D29A20F69BFD
+1AB94BFA39EE52371CBEC64E16E37319ED189F2CC3992EC03A780AE4AFAEAC4FFB7A8340
+36F307F1BAB17477BF14809DA90E0AFBD0E3182D7E40A1EB1AABA8C64D9CA02044E85A82
+7FDB6C215F77FADC0443A04083E23DF21523DE178DF165F369E93AD21F34B4D72C24D5F4
+D6D19BE8F5B01AFCBBEC537C509FD7B388AA66A3E4CBCAA85601C20BEBBD2D3F11CE1CBC
+E7D8FA53FA83710A80D8795AA5FF3C2E7F063DC05DC002E8278DCC1FAF9909FFE55A633D
+86BE4C570BD9820327490CA61CA4FDDE381CDF70D97FF279F6A458E5D7B8DE5E1384F894
+3064F4F17D369F014D5A68C9F2E170BB59634AF060678CB4DC84450B94E34CA704B5DCE3
+67125FEE35A1B0A27F40E38D00CB779ACB34284080D5D78E30DE6233F0AD3FC22D170A60
+E2B7D4F206862D1890D16E3C9D720CCA05930814E00337AD8607098C68CBEB919504277D
+B3AB769CD77745B375945BC4246B813F828099DAB82512936FE106B368F189ACE1A2EAE1
+4CF5FE1C91BD0D79CE179D34A0E85F8F1BFDEF9F28C1F26924D630E845CAA19BADC44B7B
+ED9C6452C0AD01D108967D85E0779AEE557A9207164D22DFF7BCCE92D5CB9809ADFD332F
+9567C92510CFC94796AA5A312C4484183B66C44DED8476F974CE6FEBFE86178B99F1820B
+07B3D7C80F5CCCAE591BD8920814B4398A502756D3C945D07C6CD9FC2414086434151E87
+30C14D38764C532BDD5830E24C16BFF8CC19181621DD26E67259711E6CC43ED8AAE343B4
+B728BFD242C6C314B3D453DD3B3BC3986E736B4085C8D7498C9778538AC0F2DE17B9F89A
+60082B571BE433119A9522F93A4C1222A26F94A199D71F50FA5BA94CDA733E26A43A3002
+564A841FCCC267EF8F1556CF85C8AF4A649F0AC533E0E859E3E2723525FCEC1B6E6A3CE9
+0B66D585B1E7C4B953ECF941B12D3003FE14852B7978126BE4B58DF8924651697B79F333
+F2D5BC34458DFD36826F8DFD374D0D59DD01FFC2C455B1A12AC80380F48A742013D0C3D9
+C7E040364633F0476D1ECE1870386871CE95099A30F881EBE00F6E140FE58F8C1D5F2B37
+35D12A9FF60157F8691DD64E60EF9B957C586D4E2E9D5474634F7AA44D50B11B001C66CC
+F283185C6E65E32D2F2B8127B986CF62455067A5E621738C8A381D2B6A033F6C389BE878
+3179A54AD38D69223AD779A159B2D7D0AD1670A03171EB4C27930E1878037813CBC46214
+7486F3B8E9F7016C9E2E4C60B03A4C976D48EE3A20131AA00F4B79707FD801B3F7A7759A
+3AFF3F6CEE749F2B32B01A582DC408384B8749307794914EAF7A0300E1C9AEF42DFFD828
+C5EE7D9730CE489F0A98C81E166B2B1EED3BCFACC370709947CFD29DEAD86C58FCF6AEA4
+8D670583BCA7018853B781340D7F4D1F2FA5703EDA8F1815F74407B4617016AD9BDF1F49
+340E7D89AF7CB5818B996201512968AA2B3D71C468C69DB46E514EC3CCBA360B3E80972D
+86145148DC0BDD4ADDDFDC7D835DAAC0AA9B96DDD91973288B3A2A28BD6BB415C2A79818
+7F58F3402DA53B0600FA53A01AEEBCE5081BCC0645348BD1772C54A608E88499CE0103EA
+C4ABC7FD74256C4F16A977BDF7F13843BFC6CCF16092740D9C1E7561EFD4EC6A3A30460E
+A434D1921727FA26D9F56627DCD6AF95951E602936C4AC6C7A6F6DFEF2C0CE0571458B27
+BB31DA11C9E09DD3917F61140EFC4F059AC2FAC839BDDC0695B293C42BD17B1895A6B2B2
+F955821C5CE356B1AA33C5F361BB0F43828A20B9F193E71E057F45B6CC8ABE53EEFF801F
+2B6CFB31B6DEB5D84EB8525B938AC424B3486DEA14982E5CF7F2D2C92F2D9B28033DE0C3
+4B610505771E0B1BE6AF03552EB8B44EC1190DAEB15DAAF21E7F2D437780484F0535D8ED
+941A8FA13D379B911FC7AC99E4657DABD37891C467E8854DEAD2E34E05962F0EEC30B5D4
+B8FA6EBA42C102564A2FCDF679AFB7FC145C98EDCC81BF33DCFEB593CF8E7C2F6E9E22B7
+8B1DEE3B75C0E87AB95C6341A1D09948BF338B682F515D89230F8CDBFC72D56A00003EAD
+F5BC0A6CC1A802A80480D6CEBA34631C7892909E049473E8328295069C0845571ECC9980
+CD8BCEB4C930C06601BFBE690FA0BB34631C7FF64D91A31BDF9035EC6E44EA12A79DF384
+FD82092DEAFB2D2E1B0C8ED903BCA55382F98FA5346ACC20900D86E64FF528C604D6815E
+3DEFC5F71EBBBAC2B5787B2F25AE820AFDD4038CD58B0F1710C1EEC7DA521071DCCFB9BF
+24C9EA1049EF59E61D20BFD50BCB5D8CBD0DC266B8836F34EB94858A54CE0C9E6088188A
+EDE0BE39FAFE697AA6C8805CAD63DEE8A0CA226C91405DE5FE7FE8820124D6D79EA5F956
+8C5CBFEA24C4F3D601428329453F226C4C3E3E429E429C2E96DF25EE1DD7B5B12B2C1DA7
+CB0EE6EB0D018C2DD437A6883D2C2E57B9CB264CD3369C20AB831CDDAC5F57E550727C0B
+CC9715B2C87C26C0A9A6A2F173C7B03F12F993B217466E7896E4764C6AF20CDF0634205F
+3E38E6C8C6DE3A4269C5C6CF03E49D60F0E2F3D7B3ED302C3BDA4EC6332867A19C9CE8FD
+6E2D0F2C597E11896A3E6EDC4B616F76B3355DFBF26DB2199963252C93AE423F1AE6683F
+115E9B68672BFF4C9134EED4C51AE587CC859F742A283F3C9B6088B0B9E65A1EA521578A
+E67D7396907129B83C1C9E2302D5FF46FCBF408E0FA69AA8F6E7193AE9E9DD5254201317
+B3D304BDCA689B683568BCAD9539C4D6BDA50814D8F251A70E76E7A5EECF719DD1655DA0
+605D9EFC940A8CF0FDEBC7146DE12F108959280903C34C69DC92F8205F2EE1D52F483AA7
+7E02F277A1186849056036CB24AB238AF08C903C4CEB4851991C24A8158EAE8D8F3BE56C
+355FC26D7BBD2849B7ED9E1A25DFE98BC62A6797615BCE59DEAAFD5B6D08298E2DDAA611
+3DE60AB83FF7687B7ADD6706822270ECA925B559F2F9EC59C9AB0F365868DEC3122EE67F
+BAFE7EBFACEC14D4D40C55F94ABBE8CE82CEA67FC1415D127786071CC06DCB653CCDED0B
+40A9D49994865CF45BA494AC11543A0546DC37417BD01DB100273EE3F0E7D12093E50FD0
+E71B9A0326E8F35FCD86B3285781008ED03FCA1850D685CA5B62518C9194A0C7E8CFD5A9
+FF6A0EF508ADBCEDAB7C7144272F8C7DB274CE7AA09CFABCCA3E6967EF259A72C3B8F4FD
+4605CBB99CE88B679F3EC9486C442B05D776B9D7FA8C04203DBDF33C0CF45B15E68C9376
+168229CC5176BC1E9707853192BD0C394E2D8880050594675F5B83488026791AEB1E6D79
+A424B8F90149F4855EF1BDF6CF0137D459D2A22DA3FF00743B52B2F9C316262EE53AE760
+43E2F267C2598CE66CFEAEF1459C307CA9B3FD8E897C93426545B80834EA16764633B2C5
+5B31557E6B5398F17D0BE5CC1348FE71014EF3BA2F917589AE4A4C9D8EF22A6D0A288557
+C4B2F2ABF2C30E778A5F21AA16BDD04CD8433514FBC7F81583F5D9CE3DE38542DCA55FFC
+9142EB3B797946A7A121C134C82DAED820D3FF0E7053B40134353012A44B15506385533D
+0702662BC8545130B7717B5E99BDC18E8473D2920C80CAD8F61D352C2B3718567B0BDFDF
+F063D2E1A568D6B17412149E4C9AFE3FD3F8186A8274FC01CA07504BE6751A7BDE74719E
+970A9F1744917E3521C4988E547EC1B63D33AD86390DB6CDBA9436884CEAA6064E383B61
+68BD405523A23D32B571E534354E1BD4EA3EDB7D1BBF2D0F6D6B36993DB0DF94C18BEBE2
+6F4B6475306784C091E139A759F627843CED43666D95AE257E650DDA0F6C0458CF27885F
+25D59FE5601777ADCCB42ABC20F960B17A2669B4277AEE51A3D33BB1914FC5985236A6E0
+0C32956A1CAB55DD020DAFA2BAE36638E5F5866AEAB8E3439EFEA9266CB28B9DBA4B1746
+046A71E3BF05F37FF84CEFD66479640C3BB43D915BFA3AF6F3916F2AAAE39DD4317563C2
+26E361EE278E9FE076EE6B4733720C53918CA5CC9C5F4C6C7A36D8E49A591074AEFF0363
+09E5834A3978ACEB9016F116D20B6854BC59484F344D069768C6DFC503EB95C9FEA0521B
+FD6E1C99FCD1268D18C1DD428C66DE9145071190FB17464C8C4FE87D9C0F3DA5FC3E933D
+7375E88DC3BA96858D671A6616F52E70EC6B5795114C3F03F8C78CC388AC01866B347196
+40705C2EA04CC1369A88B3A242FFCB32B48024742A03C94A6E715EF09F06CC999CA1E593
+AB6013B7E25685C4FA93429EE0613E3DA07C94D82B9A739B954BD6EA1E2A9DE55461211B
+4FBCCFF6BD480C845DC4B075B33551C760FE3D8F5EDB1201269AF48C8F8E96AFB5C7F767
+20AD3F9BDB225AF317770F1C2644589EDB5639376E30DB053930511FEE7C9FF81F6B76ED
+57E4C6CF157AF5EE0D8E05F0B9F1276385B3C4EF779593B0120AAE0073880C0DE6F76906
+8B96E92133050EF7BA0A6585AB37880501F42477E0AB8A5D314F7A5A1B760142A42A40F2
+2A12F0F79C747F8C57C688C5937BCCF9B217647EA1D7C16936055814F9260C647045F3C8
+997D40B7BB690B654B9F243D2FC9343C7BAEC4F79AC5CA9C8A43E414B4BC6A6B02828CC2
+1432BBC6E49EAB7DAE35926C6B0BFBC6AC3831834CF54A732E8531AC7D0A3AF62A5FF8F2
+4B59EF71698824E2AC5E4DC2D5C58B9FFA80817C4DA7638CE5B6F0F33164FCCDA6F82933
+AE42A26BA9AA939A7DBD55F35C29BB9D192251E945D9890F48F63D7BB58269031899F7D5
+A52C1747CBEE945D55154AD30301FCC6345DF34A177E9CAB110D7A52B63B131A1F7D7165
+BB5AC4B1842B9A1F3D86F521E4107B40963BB34CC61B10F79D936736DEAC7F25BBDEC228
+E7838F1032154ADF35F333077483AFCDD50410C07707A47F9306BF794A15B5452EEB34FA
+48A8C1BAA627EBB16BEBE9369AE7D100CF8D14E5B70613C8C8A53CA82495E8BAE8990ABE
+0ACC0B2E9CC44191A50417657662385821B1C897C88AB2A0B149090CE11B940AC6DDB64D
+0BF745858A1A56F811F1DE81458F50A704EA30F5F1918D9B5481E6E4681B389C447A65E3
+56A12C8592C8709C09135B06994590DD0B87D2952C871EF0B7365D04928A7B19AB3A10EF
+40B0BA1DAB4D3DC5789EBDB23E98698963FBD74DAAB6C8885A88634E9857CBCB163B1D0E
+32DF259DFEF7217D6744CC6F34E0D96C7BC93CC0A19F4EFBDAB6338CB56B46E538EE92B4
+353AA6663AC42A2EF78E4A228886577678FF36E5ED221A807E009D33A737F89F80461FA5
+5741EEF636D19FAD5870AF6F436DFCEA130C102156F134F77DFE4933628DBE64B477555D
+81CE6131866AA5712347043CF70634F92D5B984445D32A545607B62BA1C12D37FB6B17F3
+84838E274818032AD7A07CDF1F504B3CB5C5C9D8D16342CAB18697A5821B2E219D14F15C
+AAFB33A44E4E6D18C4DC64F79DDCBF2BFF7B3FE05709420DBBC24B8C23822755062B9784
+69AF6B01CDC9C45E55A71BC5BE1EDFDC23C430D61FF776BB4B2AB69BD391758462A9700E
+21B81CE478207D443C5A868946969DA1E63AA939D3563605C83C2AB2C5E7551169F466D7
+41FDCEE57EEE7897C41F0409AB61E86C947C83850C23DE579ED1A7EF7F941522F41337A7
+F2FF06D4D5CC4A9436A2CEB91B1D9218F46BCC3A1A5C57539BD6A56C6755A8ADD89884F1
+2FF46C13248D02EACB04008BCE1CCC3DA9CB7D4EF0AF02A97734C95D8C45CC360AAA467E
+97858E0B66978BB46353E9C0A653E49CC1E63C119FA50441846E5AE38D551BDF3A7CBD2B
+8E51C2C088A617B68E21DD2F44EF5033CD252A75C80F16F6C45EBC84E17FA58F8DA6800B
+8F61B060F54124F1B1F12AE75059159AF036C25DD06F4EEF5D8048079AC6CCB1BD5DA270
+005EC1428BC3F7A6369EC13EC8F99F77892D163FE605B8609940E1B27D784C57B7842BD7
+10C78480BF7EE7CF9BC29064CBCBE8B3B584C453C29851C39438E10BB9CAD4B2776B0899
+EDFF8CC4D35C8DF827743DC5D85681F4A7B9EAB43E133384B072F0D7A86EC6BFD5989503
+A95AA4DFF2FCB6BCEC468DFF75D20F9FD35015D4F98D65160E9EF8E1AE723433114B5458
+7B0A7314D320A942440D3D37F3BE4164C5D796C5D3597222EC88C7A14503EF964643B095
+E2F113FA22EA7999905633109628F97982451A9810D6A1DD84EB108D7A26E04C1C00488D
+322774F47B555B28D24732E6C0D4D701933C9506D379B3E5BC10609B167C1064F34A4327
+A50D0D2FB470994714FB881EE3B88B054633BFF034650C0C4E4AE5720C35C7F3E4CD30E3
+6B26D8CD1813A7703867952488E01B23FDF799AE3AB35E4880E41B4DDBCF8CB4FA68423E
+2D5E122264F8378BB8EA414C83D95A4A6D85995CE64A50B39C8E5F94955CDDBD88804D42
+279515FC1129FD2F50A170B214BED20695CCE59EAE0ACE91FCE6DD217B3A737A9DCAE11E
+A0C746306AA9447F469BE68D8488E392D00583BAF1E63782C73D5201359CE7A768F24489
+0FA50098398CB006F74E9877E9E4373228269506F44931115C0E44654AFD6B48E3E2F6DD
+47E738DE4CDC5344E1C26FAE5B73B9844F5CB2292D675CE88C2078DBDA11C2A9A58F4B10
+42850802766C9387734F22288F12E1F0D211FE150294FDD1744D8001AB95D9D63FD5C916
+B7886A1D6A076D14AD0B6D65E63D49CBC825E85CCFE3E6119DD05D6450980900600A0A07
+4BE3EE6801DAA9670D1BD6F7FE3332BF9B16C9D7DF782547006BF79DD5286A899E1153F1
+077B7AD8CDAC2724E1689A95B958D24566EA5759AF2276E2558AC8A110EA5CAB9C1BE598
+4031BBCA618B7EA15E87379927AF1D58AF01217B45B9CC67F79D96977624A9A01B1AA7A3
+1D0E4B61F6FC96A620867BAB29A7331DE35BC73E29DD89DEC1B5CA163679017FD5D52D6E
+F359C8ACD7D149B509EB1E9EA1EBDDD572720F11A390AC61F898295FCCA27F466787CE24
+3C889A45EB97AE0AD87B5DB995DECB80D8A73592C9E17F02ED6BEFD6CFC5E56275366022
+E3EE687762FDB605B7221C7004DA9E8B594D6CA0B0AA5AD97D0231C228E38D21F2652470
+2524A76555EA690062A1C811C7708F33A432E4B93683D416BC6BFD9A3A9CD114ECEAD652
+98376657CFC1B1826B77B533314A3962ABA6137CF6502713BDA51FFC763CF78C7A0AFC99
+CD496DFE069FACD2669351BED17106952A3E55A13210C5024885CAF002343A31D1E64745
+E973853B94DE520B204922CE2063140C7403D7E038EA2D21D86A72E417DEF576BC60ED61
+B74A8237ABEBD176625ADC0B1475EF4D985D05148D0233041FB5F02920F4F4C769E2DF96
+8463AB7054465464844A2A1F1C427B9369BBF6221B0D557C1F1AFF62F710BA060FAA89D7
+3C6E7F5B09B2D1E192F47743BE288AB84682254C54ECDB6FB52E1013CFD075D0430D321D
+C0A9B30AA8D1BF0676816E3FB7BB53E19B9C782E3B15732AF9A233408CD12FCBB1D3A963
+3910D9E4F84F1D89B0A26AFC1DF439654005CEDFD46A9B5FC815C91E72631D255475710A
+CADB424EC5D2A86681422B36B8A6BE4DCA28EA5A919D9EE1B4F722518925484A59C6A972
+F68A0BC736BEBEF281DFA37F4F51BE2746644CAAC585DE766DCDF6443263C9A403E4E110
+32721D8C79C005B982D7B1A3E19AEAF0C89A2AB06841D677F79C3152E4B130B122BFC8ED
+D6EFFAC69BA8C66C47F3D5321FB8A9C7156CFA2F0F577DF1CA2D8E9C6D854B401FF8DCF3
+BFBA7C98B11B3F128EA81DD1BB7B4FC24943B43772A6E731876CF46608CB88EB143AE9B1
+7D72DE503210705410B26CF1D70D7D4B98A2C4AC6F7AEBCE59BAB09F1C4D4E97EC3A9D91
+15554C98E2FC7DF130D4548875C0ECF16614BFDAC96E9230FAAB82C6EBDAA0EBCCD1ABC9
+F9DB0B987DF58240B927A6AF8BF1CA62C39DA2DFDF36DA884F67553F058CE4718777EDED
+34E30501AC3DD9B8F9008463A33AA8612595E855D009CF9F7C1BDAC1DBD1483BCFF8A7DD
+346DC22F31646C0CF07C753596AFC285F6136BF7E3C83B0FB75D9BDFA9979C0930A245D2
+7899ECA0F64F12C390EA7293E5EFA7A1D0721AAF72B313E6A14FD20B1B5AD9F3BE0F071E
+33E89D4F5CC7111B4C06F18782A5A8F840CF27EE20B8BDC0B16E295D4AC30C2E079F75CB
+23A338BB99D059095BE8E7D2FEE1BC421BEAFC536D2E2C40E05B6EF3CF483A34CE506816
+2CE04C4F2D9F17748F9FAFB67F046A168F4545D80ECF05266556DA6E75B018F790D5B821
+B5F9D115BA8E3A7B273B92E6E111CD257A6B12F4F25956AF908C8CEC671DBB796FA93893
+18D5B8473A04B63E0F751744D8050A1D266A15656A016697A9CA765660B5728E9BAC77CE
+F7EFA339B522C2C52E6C678C550388136C678B2CD1027214D0D086028A29DD4785EEB512
+BD60CF2132746757559BE4C6B802792700B911D098F4A95A758B6E30285F906B6EE7B60D
+991F86B1961FDC2BD5A9FA8F68E488AD57494765D9822A469FCAC1BDCE3F3685B09550D4
+49CE97D9FA83F187923C4DE772464EFE98A9789B93E5691C621E9B79F227041D22CB05A0
+22282BAA61BFC04863CEB7BA282CE68AE91CCDC2717747B3BCD808136F779DADFDBEECFF
+E610CEE002874E4B33EF0ED4602073C56693BA2479D885F53FE4F5C68DF9C6B09D021342
+C117F488BFC7F2A7BADC2E059F0BF05AED5F6B8467CBE018D7AC442BC3526F8566A71B4A
+69E93874F74F3B751B8C6811992D47DC4D080461269C6EB18AE76ECC66479B6A53E1984F
+A17E13F546FD4AC12024A1ACE29C9BDCD47274E480017759381B2081349FF3AC5BAA1902
+2D9EB3DDC8471B0D2D58E3717973F7B7CD8E8AEAA301A676579AD57D112CF6D8F659B8CC
+E055A155AB0F6C6B8A3254ADBD5E6BBAA336327F3AE20C109CA8C46EF35814473457E3F2
+EC80EE99547B84377DF391B0A9B2F60B818A0A3D49D5E36A2D7A05F4F77F964F81CC51D2
+272CD30B52AFB7AEE06129977A0AF98BFF236EADF92CD7508A2F3FE853EE26530922A59B
+639571AA10FA5FC0E1315B7215B76045E18141403E4B0B2A9EB724E69BB40AC1AB479216
+1686D2B0DF545D0FA08CFACB8C8145AA9FB982222EE247B7DF2D5F2B33A9B6AE29CC6166
+3F642883EB6757DB8F1845E1727B7AADAE2FD8E560922467E79EF1803A03C9D51F649DD4
+16C75835F9EEB1FA6FAE978B1B7B7792FB24EDFD9EF55E67CB02D5C23C9628F126BD3A12
+31869DAE5FBBCE60133DEB7D33F1E0ADFD9927A3E9E42B6AB0E5D703BD7271A179985FC3
+D91C2D161B76F70987073647B26542C83A34172663F6793DE8B8D9BCD72CCD48DF5563C0
+FBFA6CC45D99AB78CD6ED8B861948E54DFE9C99E169E35A88D03C1C9A7C84720A3956B00
+0842CF8C515E3A722DDD0B6627926110B335744866564CC638901758FE0EFA98F4E3F4CF
+DF911E5E395EC3D17807D7483008A95BA603AB80FB6A359BA3F0A8ADFE60F9CBADF67441
+1D0BE41B802B3EC9075DC1EB375EDCD27E113B4B1EA3C8ED0B1BBB2A3DB934CDC5CDA9B6
+0F85B33DD71FCA5B25B0AAA6B528229D84E1E7B97CB72C0F20248509A2B6CC53E5B7B694
+24FD8BFAE39C66E86DCEE0B602C9102A0575F15693B3C0A268C1C3F897F57E1CC5A58ADA
+4222A57B2A53B234BA19ADA37208C16B1B757E106D5D8AF0AFFD6BBA6E753805BBC2E9A4
+450A78025400D18B8FDCA54A18440331E48E52E3C4CA80FC171B02293CED081E887215EA
+D34DCF1D6FC2FE86502262006977878E4960326634F1A1EC8D2D96CF51EECDDD6D7CB410
+6D2B37136A13B4D2B67A2DCC74365A27E72B263FCF506B34116BB93BF76DA0C813CE6F63
+639BA86D000BEEED941AC2096A7F1C714615CE20F920BC4427BBB157105FC8FCC3D5FA6C
+9C0D797AB7ECA5DA2B5DF210C4523E406821B704383C63055EB87E8C82E68ABB062487C8
+834EB35BA973902999E27D9A7D143536CB253195A3801FAF741C1588C808A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
+%%EndResource
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+%!PS-Adobe-3.0 Resource-Encoding
+%
+% @psencodingfile{
+% author = "Werner Lemberg, Michail Vidiassov",
+% version = "1.0",
+% date = "2006-Feb-03",
+% filename = "groff.enc",
+% license = "public domain",
+% email = "groff@gnu.org",
+% docstring = "Groff default text encoding. Used with MetaPost."
+% }
+
+%%BeginResource: encoding groffEncoding
+/groffEncoding [
+% 0x00 | 0
+ /asciicircum /asciitilde /Scaron /Zcaron
+ /scaron /zcaron /Ydieresis /trademark
+ /quotesingle /Euro /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+% 0x10 | 16
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+% 0x20 | 32
+ /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus
+ /comma /hyphen /period /slash
+% 0x30 | 48
+ /zero /one /two /three
+ /four /five /six /seven
+ /eight /nine /colon /semicolon
+ /less /equal /greater /question
+% 0x40 | 64
+ /at /A /B /C
+ /D /E /F /G
+ /H /I /J /K
+ /L /M /N /O
+% 0x50 | 80
+ /P /Q /R /S
+ /T /U /V /W
+ /X /Y /Z /bracketleft
+ /backslash /bracketright /circumflex /underscore
+% 0x60 | 96
+ /quoteleft /a /b /c
+ /d /e /f /g
+ /h /i /j /k
+ /l /m /n /o
+% 0x70 | 112
+ /p /q /r /s
+ /t /u /v /w
+ /x /y /z /braceleft
+ /bar /braceright /tilde /.notdef
+% 0x80 | 128
+ /quotesinglbase /guillemotleft /guillemotright /bullet
+ /florin /fraction /perthousand /dagger
+ /daggerdbl /endash /emdash /ff
+ /fi /fl /ffi /ffl
+% 0x90 | 144
+ /dotlessi /dotlessj /grave /hungarumlaut
+ /dotaccent /breve /caron /ring
+ /ogonek /quotedblleft /quotedblright /oe
+ /lslash /quotedblbase /OE /Lslash
+% 0xA0 | 160
+ /.notdef /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guilsinglleft
+ /logicalnot /minus /registered /macron
+% 0xB0 | 176
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guilsinglright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0 | 192
+ /Agrave /Aacute /Acircumflex /Atilde
+ /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0 | 208
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls
+% 0xE0 | 224
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0 | 240
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis
+] def
+%%EndResource
+
+% eof
+%%BeginProlog
+ /ptmr8g groffEncoding /Times-Roman RE
+ /ptmr8g /ptmr8g def
+ /zfzdrr /ZapfDingbats-Reverse def
+ /ptmri8g groffEncoding /Times-Italic RE
+ /ptmri8g /ptmri8g def
+ /fsyro /Symbol-Slanted def
+ /zfeu /FreeEuro def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndSetup
+%%Page: 1 1
+newpath -2 -4.125 moveto
+38.60602 -4.125 lineto
+38.60602 8.78003 lineto
+-2 8.78003 lineto
+ closepath fill
+ 1 setgray
+newpath -3 -3.125 moveto
+37.60602 -3.125 lineto
+37.60602 9.78003 lineto
+-3 9.78003 lineto
+ closepath fill
+ 0 setgray
+0 0 moveto
+(\275) ptmr8g 10.00005 fshow
+10 0 moveto
+(A) ptmr8g 8.00009 fshow
+18.276 0 moveto
+(+) zfzdrr 10.00005 fshow
+30.166 0 moveto
+(a) ptmr8g 10.00005 fshow
+ 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash
+ 1 setlinejoin 10 setmiterlimit
+newpath -3 -3.125 moveto
+37.60602 -3.125 lineto
+37.60602 9.78003 lineto
+-3 9.78003 lineto
+ closepath stroke
+newpath 70.491 2.32751 moveto
+70.491 8.37088 65.59187 13.27 59.54851 13.27 curveto
+53.50514 13.27 48.60602 8.37088 48.60602 2.32751 curveto
+48.60602 -3.71585 53.50514 -8.61497 59.54851 -8.61497 curveto
+65.59187 -8.61497 70.491 -3.71585 70.491 2.32751 curveto closepath fill
+ 1 setgray
+newpath 69.491 3.32751 moveto
+69.491 9.37088 64.59187 14.27 58.54851 14.27 curveto
+52.50514 14.27 47.60602 9.37088 47.60602 3.32751 curveto
+47.60602 -2.71585 52.50514 -7.61497 58.54851 -7.61497 curveto
+64.59187 -7.61497 69.491 -2.71585 69.491 3.32751 curveto closepath fill
+ 0 setgray
+gsave [0.9397 0.34203 -0.34203 0.9397 53.5435 -2.70255 ] concat 0 0 moveto
+(e) ptmri8g 10.00005 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 56.45497 2.82672 ] concat 0 0 moveto
+(i) ptmri8g 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 58.2902 3.4947 ] concat 0 0 moveto
+(w) fsyro 6.99997 fshow grestore
+gsave [0.9397 0.34203 -0.34203 0.9397 63.22362 5.29033 ] concat 0 0 moveto
+(t) ptmri8g 6.99997 fshow grestore
+newpath 69.491 3.32751 moveto
+69.491 9.37088 64.59187 14.27 58.54851 14.27 curveto
+52.50514 14.27 47.60602 9.37088 47.60602 3.32751 curveto
+47.60602 -2.71585 52.50514 -7.61497 58.54851 -7.61497 curveto
+64.59187 -7.61497 69.491 -2.71585 69.491 3.32751 curveto closepath stroke
+ 1 setlinecap
+newpath 37.60602 3.32751 moveto
+47.60602 3.32751 lineto stroke
+6.09799 12.92004 moveto
+(\244) ptmr8g 10.00005 fshow
+13.59799 12.92004 moveto
+(\243) ptmr8g 10.00005 fshow
+21.09799 12.92004 moveto
+(\004) zfeu 10.00005 fshow
+10.203 -12.00502 moveto
+(\204) ptmr8g 10.00005 fshow
+ [3 3 ] 0 setdash
+newpath -5.25 -15.89502 moveto
+72.491 -15.89502 lineto
+72.491 21.70007 lineto
+-5.25 21.70007 lineto
+ closepath stroke
+showpage
+%%EOF
diff --git a/systems/doc/metapost/source-manual/grdemo.mp b/systems/doc/metapost/source-manual/grdemo.mp
new file mode 100644
index 0000000000..14fb760925
--- /dev/null
+++ b/systems/doc/metapost/source-manual/grdemo.mp
@@ -0,0 +1,37 @@
+verbatimtex
+.EQ
+delim $$
+.EN
+\# etex
+
+prologues := 2;
+
+input boxes
+
+beginfig(1);
+ pair shadowshift;
+ shadowshift = (1, -1) * bp;
+
+ def drawshadowed(text t) =
+ forsuffixes $ = t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+ enddef;
+
+ boxit.a(btex \[12] \s8A\s+2 \[lh] a etex);
+ circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+
+ b.w - a.e = (10bp, 0);
+
+ drawshadowed(a, b);
+ draw a.e .. b.w;
+
+ label.top(btex \[Cs] \[Po] \[Eu] etex, a.n);
+ label.llft(btex \[Fn] etex, a.s);
+
+ draw bbox currentpicture dashed evenly;
+endfig;
+
+end
diff --git a/systems/doc/metapost/source-manual/grdemo.ms b/systems/doc/metapost/source-manual/grdemo.ms
new file mode 100644
index 0000000000..fbcbfaceff
--- /dev/null
+++ b/systems/doc/metapost/source-manual/grdemo.ms
@@ -0,0 +1,124 @@
+.nr PS 11
+.nr VS 13
+.TL
+MetaPost with groff
+.LP
+Since MetaPost is a picture-drawing language that outputs PostScript,
+it is necessary to use the
+.ft CW
+-mpspic
+.ft
+macro package, which is automatically included when \fIgroff\fR
+is invoked with the
+.ft CW
+-Tps
+.ft
+option to prepare output for PostScript printers or previewers.
+.PP
+Suppose you have written some figures in MetaPost and placed
+the input in a file \f(CWfigures.mp\fR.
+Running
+.nf
+.ft CW
+ mp -T figures
+.ft
+.fi
+to invoke the MetaPost interpreter produces output files
+\f(CWfigures.1\fR, \f(CWfigures.2\fR, .\|.\|.
+which can be included in a \fIgroff\fR document via macro calls
+such as
+.nf
+.ft CW
+ .PSPIC figures.1 width height
+.ft
+.fi
+as explained in the \fIgrops\fR(1) documentation.
+Note that the picture gets rescaled if the height and width
+in the \f(CW.PSPIC\fR command don't match \fImp\fR's idea of
+the picture dimensions.
+.PP
+For instance,
+.PSPIC figs.1 1.5i 1.08i
+this figure was derived from a file
+.ft CW
+figs.mp
+.ft
+and included at this point by invoking the \f(CW.PSPIC\fR macro
+with height 1.08 inches and width 1.5 inches.
+.PP
+The file
+.ft CW
+figs.mp
+.ft
+looks like this:
+.nf
+.ft CW
+.nr PS 9
+.nr VS 11
+prologues:=1;
+input boxes
+beginfig(1);
+pair shadowshift; shadowshift=(1,-1)*bp;
+
+def drawshadowed(text t) =
+ forsuffixes $=t:
+ fill bpath$ shifted shadowshift;
+ unfill bpath$;
+ drawboxed($);
+ endfor
+enddef;
+
+boxit.a(btex \\s8A\\s+2 \\(lh a etex);
+circleit.b(btex $e sup {i omega t}$ etex rotated 20);
+b.w - a.e = (10bp,0);
+drawshadowed(a,b);
+draw a.e..b.w;
+
+draw bbox currentpicture dashed evenly;
+endfig;
+.nr PS 11
+.nr VS 13
+.ft
+.fi
+.PP
+Note that the typesetting commands in the
+\f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks in the above example
+are processed by
+.nf
+.ft CW
+ eqn -d\\$\\$ | troff -Tpost
+.ft
+.fi
+If a different \fItroff\fR pipeline is desired, it can be specified
+via the
+.ft CW
+TROFF
+.ft
+environment variable. For example,
+.nf
+.ft CW
+ TROFF='tbl | eqn -d\\$\\$ | troff -Tpost'
+.ft
+.fi
+adds \fItbl\fR to the pipeline in addition to \fIeqn\fR.
+.PP
+Macro definitions and such can be added via the standard
+\f(CWverbatimtex\fR.\|.\|.\f(CWetex\fR mechanism that adds the
+given material to the \fItroff\fR input. Such material should
+not generate any output since this would get mixed up with the
+next \f(CWbtex\fR.\|.\|.\f(CWetex\fR block. Thus, newlines between
+\f(CWverbatimtex\fR and \f(CWetex\fR must be protected with \f(CW\\\fR.
+.PP
+Unfortunately, typesetting of \f(CWbtex\fR.\|.\|.\f(CWetex\fR blocks
+currently doesn't work with \fIgroff\fR and equires a UNIX
+\fItroff\fR implementation, because MetaPost's \f(CWdmp\fR
+post-processor can't handle \fIgroff\fR's extended font and output
+file formats documented in \fIgroff_font\fR(5) and \fIgroff_out\fR(5).
+Nevertheless, using \fItroff\fR to prepare figures with MetaPost
+and \fIgroff\fR to typeset them may still be a useful combination
+if your \fItroff\fR implementation doesn't provide the
+.ft CW
+-mpictures
+.ft
+macro packages.
+
diff --git a/systems/doc/metapost/source-manual/lead.d b/systems/doc/metapost/source-manual/lead.d
new file mode 100644
index 0000000000..2d09412438
--- /dev/null
+++ b/systems/doc/metapost/source-manual/lead.d
@@ -0,0 +1,24 @@
+80 70.6
+81 56.4
+82 54.4
+83 46.4
+84 40.1
+85 20.1
+86 8.4
+87 8.0
+88 7.6
+89 7.2
+90 7.1
+
+82 .484
+83 .413
+84 .381
+85 .258
+86 .151
+87 .108
+88 .087
+89 .074
+90 .070
+
+First: National lead emissions in thousands of metric tons
+Second: Average lead level in micrograms per cubic meter of air
diff --git a/systems/doc/metapost/source-manual/matmul.d b/systems/doc/metapost/source-manual/matmul.d
new file mode 100644
index 0000000000..6a0afe941c
--- /dev/null
+++ b/systems/doc/metapost/source-manual/matmul.d
@@ -0,0 +1,21 @@
+20 .007861 ordinary MM: size, seconds
+30 .022051
+40 .050391
+60 .15922
+80 .4031
+120 1.53
+160 3.915
+240 18.55
+320 78.28
+480 279.24
+
+20 .006611 Strassen: size, seconds
+30 .020820
+40 .049219
+60 .163281
+80 .3975
+120 1.3125
+160 3.04
+240 9.95
+320 22.17
+480 72.60
diff --git a/systems/doc/metapost/source-manual/mpboxes.bib b/systems/doc/metapost/source-manual/mpboxes.bib
new file mode 100644
index 0000000000..6b4042b1a8
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpboxes.bib
@@ -0,0 +1,19 @@
+% BibTeX entries for MetaPost doc, by John Hobby. Public domain.
+
+@techreport{CSTR116,
+ author = "Kernighan, Brian W.",
+ title = "{PIC}---A Graphics Language for Typesetting",
+ type = "Computing Science Technical Report",
+ number = 116,
+ institution = "AT\&T Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ year = 1984
+}
+@incollection{ke:pic,
+ author = "Kernighan, Brian W.",
+ title = "Pic---A Graphics Language for Typesetting",
+ booktitle = "Unix Research System Papers, Tenth Edition",
+ publisher = "AT\&T Bell Laboratories",
+ pages = "53--77",
+ year = 1990
+}
diff --git a/systems/doc/metapost/source-manual/mpboxes.mp b/systems/doc/metapost/source-manual/mpboxes.mp
new file mode 100644
index 0000000000..10ec530dbe
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpboxes.mp
@@ -0,0 +1,146 @@
+% Figures for MetaPost doc, by John Hobby. Public domain.
+
+input boxes
+
+if scantokens(mpversion) < 1.200:
+ filenametemplate
+else:
+ outputtemplate :=
+fi
+"%j-%c.mps";
+
+%%% This redefinition of dotlabel draws dots as a closed path
+%%% which are rendered more smoothly in Adobe Reader.
+vardef dotlabel@#(expr s,z) text t_ =
+ label@#(s,z) t_;
+ addto currentpicture
+ contour (makepath pencircle scaled dotlabeldiam) shifted z t_;
+enddef;
+
+
+beginfig(48);
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+boxit(currentpicture);
+dx = dy = .25in;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+forsuffixes $=ne,e,se: makelabel.rt(str $, $); endfor
+forsuffixes $=nw,w,sw: makelabel.lft(str $, $); endfor
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+
+
+\beginfig(50)
+interim circmargin := .07in;
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+circleit(currentpicture);
+dx = dy;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+makelabel.rt("e", e);
+makelabel.lft("w", w);
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+
+
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+
+end
diff --git a/systems/doc/metapost/source-manual/mpboxes.tex b/systems/doc/metapost/source-manual/mpboxes.tex
new file mode 100644
index 0000000000..a167df8e26
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpboxes.tex
@@ -0,0 +1,572 @@
+\listfiles
+\RequirePackage{ifpdf}
+\ifpdf
+\ifnum\pdftexversion<140
+\else
+\pdfminorversion=5
+\pdfobjcompresslevel=1% Use compressed object streams.
+\fi
+\RequirePackage{cmap}
+\fi
+\documentclass{article} % article is NOT the original style
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{textcomp}
+\usepackage{mflogo}
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment{verbatim}{BVerbatim}{baseline=c}
+\usepackage{graphics}
+\usepackage[textwidth=6in,textheight=8.65in]{geometry}
+\usepackage{multicol}
+\usepackage{ltxtable}
+
+\newcommand\descr[1]{{\langle\hbox{\rm#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{$\langle$\invisgap{\rm#1}\invisgap$\rangle$}
+\newcommand\Ignore[1]{} % For fooling delatex so spell will work
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+\makeindex
+
+\author{John D. Hobby}
+\title{Drawing Boxes with {MetaPost}}
+\date{}
+
+\newcommand\myabstract{%
+ This paper describes a package for drawing boxes of different shapes.
+ The \texttt{boxes} package has been implemented as an extension to the
+ MetaPost graphics language and is a mandatory part of every MetaPost
+ installation.}
+
+\newcommand\mykeywords{%
+ typesetting; graphs; MetaPost}
+
+\usepackage[rgb,x11names]{xcolor}% Optimize for screen reading.
+\usepackage{hyperxmp}
+\usepackage{hyperref}
+\hypersetup{
+ pdftitle={Drawing Boxes with MetaPost},
+ pdfauthor={John D. Hobby and the MetaPost development team},
+ pdfkeywords={typesetting, boxes, MetaPost, TeX}
+}
+\hypersetup{
+ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer.
+ colorlinks,
+ linkcolor=RoyalBlue3,
+ urlcolor=Chocolate4,
+ citecolor=SpringGreen3
+}
+\usepackage[all]{hypcap}
+\ifpdf
+\pdfmapfile{=cm2lm.map}% replace CM by LM in figures
+\else
+\DeclareGraphicsExtensions{.mps}
+\DeclareGraphicsRule{mps}{eps}{*}{}
+\usepackage{breakurl}
+\fi
+
+
+\begin{document}
+ \maketitle
+ \begin{abstract} \myabstract \end{abstract}
+ \ifx\keywords\undefined \else
+ \begin{keywords} \mykeywords \end{keywords}
+ \fi
+
+\setlength{\columnsep}{2.5em}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+
+\section{Introduction}
+\label{intro}
+
+This document describes auxiliary macros not included in Plain MetaPost
+that make it convenient to do things that {\it pic} is good at
+\cite{ke:pic}. What follows is a description of how to use the macros
+contained in the file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}.
+This file is included in a special directory reserved for MetaPost
+macros and support software\footnote{The name of this directory is
+ likely to be something like \texttt{/usr/lib/mp/lib}, but this is
+ system dependent.} and can be accessed by giving the MetaPost command
+{\tt input boxes} before any figures that use the box making macros.
+The syntax for the {\tt input} command is \index{input?\texttt{input}}
+$$ {\tt input}\, \descr{file name} $$
+where a final ``{\tt .mp}'' can be omitted from the file name. The {\tt
+ input} command looks first in the current directory and then in the
+special macro directory. Users interested in writing macros may want to
+look at the {\tt boxes.mp} file in this directory.
+
+Since the advent of the \texttt{boxes} package several alternative
+packages for drawing boxes of all kinds have been developed by the
+MetaPost community. The most widely known ones are
+\texttt{MetaObj}\index{MetaObj?\texttt{MetaObj}},
+\texttt{MetaUML}\index{MetaUML?\texttt{MetaUML}},
+\texttt{expressg}\index{expressg?\texttt{expressg}}, and
+\texttt{blockdraw\_mp}\index{blockdraw\_mp?\texttt{blockdraw\_mp}}. If
+you intend to create lots of structural drawings, flow charts,
+\emph{etc.}, those packages might be an interesting ressource, too.
+
+
+\section{Rectangular Boxes}
+\label{rectbox}
+
+\mbox{}% Start paragraph.
+\index{variables!box|(}%
+\index{box variables|see{variables, box}}%
+%
+The main idea of the box-making macros is that one should
+say\index{boxit?\texttt{boxit}}\label{Dboxit}
+$$ {\tt boxit.} \descr{suffix}
+ \hbox{\tt(} \descr{picture expression} \hbox{\tt)}
+$$
+where the \tdescr{suffix} does not start with a subscript.\footnote{Some early
+versions of the box making macros did not allow any subscripts in the
+{\tt boxit} suffix.}
+This creates pair variables \tdescr{suffix}{\tt.c},
+\tdescr{suffix}{\tt.n}, \tdescr{suffix}{\tt.e}, \ldots\ that can then be
+used for positioning the picture before drawing it with a separate command such
+as\index{drawboxed?\texttt{drawboxed}}\label{Ddrbxed}
+$$ \hbox{\tt drawboxed(} \descr{suffix list} \hbox{\tt )} $$
+The argument to {\tt drawboxed} should be a comma-separated list of box names,
+where a box name\index{box name} is a \tdescr{suffix} with which {\tt boxit}
+has been called.
+
+For the command {\tt boxit.bb(pic)}, the box name is {\tt bb} and the
+contents of the box is the picture {\tt pic}. In this case, {\tt bb.c}
+the position where the center of picture {\tt pic} is to be placed, and
+{\tt bb.sw}, {\tt bb.se}, {\tt bb.ne}, and {\tt bb.nw} are the corners
+of a rectangular path that will surround the resulting picture.
+Variables {\tt bb.dx} and {\tt bb.dy} give the spacing between the
+shifted version of {\tt pic} and the surrounding rectangle, and {\tt
+bb.off} is the amount by which {\tt pic} has to be shifted to achieve
+all this.
+
+When the {\tt boxit} macro is called with box name~$b$, it gives linear
+equations that force $b${\tt.sw}, $b${\tt.se}, $b${\tt.ne}, and
+$b${\tt.nw} to be the corners of a rectangle aligned on the $x$ and $y$
+axes with the box contents centered inside as indicated by the gray
+rectangle in Figure~\ref{fig48}. The values of $b${\tt.dx},
+$b${\tt.dy}, and $b${\tt.c} are left unspecified so that the user can
+give equations for positioning the boxes. If no such equations are
+given, macros such as {\tt drawboxed} can detect this and give default
+values. The default values for {\tt dx} and {\tt dy} variables are
+controlled by the internal variables\index{internal
+variables|see{variables, internal}}\index{variables!internal} {\tt
+defaultdx}\index{defaultdx?\texttt{defaultdx}}\label{Ddefaultdx} and
+{\tt defaultdy}\index{defaultdy?\texttt{defaultdy}}\label{Ddefaultdy}.%
+%
+\index{variables!box|)}
+
+\begin{figure}[htp]
+$$ \includegraphics{mpboxes-48.mps} $$
+\caption[How a {\tt boxit} picture relates to the associated variables]
+ {The relationship between the picture given to {\tt boxit} and the
+ associated variables. The picture is indicated by a gray rectangle.}
+\label{fig48}
+\end{figure}
+
+If $b$ represents a box name, {\tt drawboxed($b$)} draws the rectangular
+boundary of box~$b$ and then the contents of the box. This bounding
+rectangle can be accessed separately as {\tt bpath~$b$}, or in
+general\index{bpath?\texttt{bpath}}\label{Dbpath}
+$$ {\tt bpath}\, \descr{box name} $$
+It is useful in combination with operators like
+{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}} and {\tt cutafter}\index{cutafter?\texttt{cutafter}}
+in order to control paths that enter the box.
+For example, if $a$ and $b$ are box names and $p$ is a path from $a${\tt.c}
+to $b${\tt.c},\index{drawarrow?\texttt{drawarrow}}
+$$ \hbox{\tt drawarrow $p$ cutbefore bpath $a$ cutafter bpath $b$} $$
+draws an arrow from the edge of box $a$ to the edge of box $b$.
+
+Figure~\ref{fig49} shows a practical example including some arrows drawn
+with {\tt cutafter bpath} \tdescr{box name}. It is instructive to
+compare Figure~\ref{fig49} to the similar figure in the pic manual
+\cite{ke:pic}. The figure uses a
+macro\index{boxjoin?\texttt{boxjoin}}\label{Dbxjoin}
+$$ \hbox{\tt boxjoin(} \descr{equation text} \hbox{\tt )} $$
+to control the relationship between consecutive boxes. Within the
+\tdescr{equation text}, {\tt a} and {\tt b} represent the box names given in
+consecutive calls to {\tt boxit} and the \tdescr{equation text} gives equations
+to control the relative sizes and positions of the boxes.
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+input boxes
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\includegraphics{mpboxes-49.mps}}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig49}
+\end{figure}
+
+For example, the second line of input for the above figure contains
+$$ \hbox{\tt boxjoin(a.se=b.sw; a.ne=b.nw)} $$
+This causes boxes to line up horizontally by giving additional equations that
+are invoked each time some box {\tt a} is followed by some other box~{\tt b}.
+These equations are first invoked on the next line when box~{\tt a} is followed
+by box~{\tt ni}. This yields
+$$ \hbox{\tt a.se=ni.sw; a.ne=ni.nw} $$
+The next pair of boxes is box~{\tt ni} and box~{\tt di}. This time the
+implicitly generated equations are
+$$ \hbox{\tt ni.se=di.sw; ni.ne=di.nw} $$
+This process continues until a new {\tt
+boxjoin}\index{boxjoin?\texttt{boxjoin}} is given. In this case the new
+declaration is
+$$ \hbox{\tt boxjoin(a.sw=b.nw; a.se=b.ne)} $$
+which causes boxes to be stacked below each other.
+
+After calling {\tt boxit} for the first eight boxes {\tt a} through {\tt
+dk}, the box heights are constrained to match but the widths are still
+unknown. Thus the {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}
+macro needs to assign default values to the \tdescr{box name}{\tt.dx}
+and \tdescr{box name}{\tt.dy} variables. First, {\tt di.dx} and {\tt
+di.dy} get default values so that all the boxes are forced to be large
+enough to contain the contents of box~{\tt di}.
+
+The macro that actually assigns default values to {\tt dx} and {\tt dy}
+variables is called {\tt
+fixsize}\index{fixsize?\texttt{fixsize}}\label{Dfixsiz}. It takes a
+list of box names and considers them one at a time, making sure that
+each box has a fixed size and shape. A macro called {\tt
+fixpos}\index{fixpos?\texttt{fixpos}}\label{Dfixpos} then takes this
+same list of box names and assigns default values to the \tdescr{box
+name}{\tt.off} variables as needed to fix the position of each box. By
+using {\tt fixsize} to fix the dimensions of each box before assigning
+default positions to any of them, the number of needing default
+positions can usually be cut to at most one.
+
+Since the bounding path for a box cannot be computed until the size,
+shape, and position of the box is determined, the {\tt
+bpath}\index{bpath?\texttt{bpath}} macro applies {\tt fixsize} and {\tt
+fixpos} to its argument. Other macros that do this
+include\index{pic?\texttt{pic}}\label{Dpic}
+$$ {\tt pic}\, \descr{box name} $$
+where the \tdescr{box name} is a suffix, possibly in parentheses. This returns
+the contents of the named box as a picture positioned so that
+$$ {\tt draw\ pic} \descr{box name} $$
+draws the box contents without the bounding rectangle. This operation
+can also be accomplished by the {\tt
+drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}\label{Ddrunbx}
+macro that takes a comma-separated list of box names. There is also a
+{\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}\label{Ddrbxes} macro
+that draws just the bounding rectangles.
+
+Another way to draw empty rectangles is by just saying\label{Deboxit}
+$$ {\tt boxit} \descr{box name} \hbox{\tt ()} $$
+with no picture argument as is done several times in Figure~\ref{fig49}.
+This is like calling {\tt boxit} with an empty picture.
+Alternatively the argument can be a string\label{Dsboxit} expression
+instead of a picture
+expression in which case the string is typeset in the default font.
+
+
+\section{Circular and Oval Boxes}
+\label{circbox}
+
+Circular and oval boxes are a lot like rectangular boxes except for the shape
+of the bounding path. Such boxes are set up by the
+{\tt circleit}\index{circleit?\texttt{circleit}}\label{Dcircit} macro:
+$$ {\tt circleit} \descr{box name}
+ \hbox{\tt(} \descr{box contents} \hbox{\tt)}
+$$
+where \tdescr{box name} is a suffix and \tdescr{box contents} is either a
+picture expression, a string expression, or \tdescr{empty}.
+
+\mbox{}% Start paragraph.
+\index{variables!box|(}%
+%
+The {\tt circleit} macro defines pair variables just as {\tt boxit}
+does, except that there are no corner points \tdescr{box name}{\tt.ne},
+\tdescr{box name}{\tt.sw}, etc. A call to
+$$ \hbox{\tt circleit.a(}\ldots \hbox{\tt )} $$
+gives relationships among points {\tt a.c}, {\tt a.s}, {\tt a.e}, {\tt
+a.n}, {\tt a.w} and distances {\tt a.dx} and {\tt a.dy}. Together with
+{\tt a.c} and {\tt a.off}, these variables describe how the picture is
+centered in an oval as can be seen from the Figure~\ref{fig50}.%
+%
+\index{variables!box|)}
+
+\begin{figure}[htp]
+$$ \includegraphics{mpboxes-50.mps} $$
+\caption[How a {\tt circleit} picture relates to the associated variables]
+ {The relationship between the picture given to {\tt circleit} and the
+ associated variables. The picture is indicated by a gray rectangle.}
+\label{fig50}
+\end{figure}
+
+The {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}, {\tt
+drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}, {\tt
+drawboxes}\index{drawboxes?\texttt{drawboxes}}, {\tt
+pic}\index{pic?\texttt{pic}}, and {\tt
+bpath}\index{bpath?\texttt{bpath}} macros work for {\tt circleit} boxes
+just as they do for {\tt boxit} boxes. By default, the boundary path
+for a {\tt circleit} box is a circle large enough to surround the box
+contents with a small safety margin controlled by the internal
+variable\index{variables!internal} {\tt
+circmargin}\label{Dcmargin}. Figure~\ref{fig51} gives a basic example
+of the use of {\tt bpath} with {\tt circleit} boxes.
+
+\begin{figure}[htbp]
+$$\begin{verbatim}
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpboxes-51.mps}} $$
+\caption[MetaPost code and the resulting figure.] {MetaPost code and
+ the resulting figure. Note that the {\tt drawshadowed} macro
+ used here is not part of the {\tt boxes.mp} macro package.}
+\label{fig51}
+\index{drawshadowed?\texttt{drawshadowed}}
+\end{figure}
+
+\mbox{}% Start paragraph.
+\index{variables!box|(}%
+%
+A full example of {\tt circleit} boxes appears in Figure~\ref{fig52}.
+The oval boundary paths around ``Start'' and ``Stop'' are due to the equations
+$$ \hbox{\tt aa.dx=aa.dy;} \quad {\rm and}\quad \hbox{\tt ee.dx=ee.dy} $$
+after
+$$ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}
+ \quad{\rm and}\quad
+ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}.
+$$
+The general rule is that {\tt bpath.}$c$ comes out circular if
+$c${\tt.dx}, $c${\tt.dy}, and $c\hbox{\tt.dx}-c\hbox{\tt.dy}$ are all
+unknown. Otherwise, the macros select an oval big enough to contain the
+given picture with the safety margin {\tt
+circmargin}\index{circmargin?\texttt{circmargin}}.%
+%
+\index{variables!box|)}
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\includegraphics{mpboxes-52.mps}}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig52}
+\end{figure}
+
+
+
+\appendix
+\section{Reference manual}
+\label{refman}
+
+Tables~\ref{pseudotab} to~\ref{ivartab} summarize macros, box variables
+and internal variables provided by the \texttt{boxes} package.
+
+\begin{table}[hp]
+\centering
+\caption{\strut Function-Like Macros}
+\label{pseudotab}
+\begin{tabular}[t]{|>{\ttfamily}l|l|l|r|>{\arraybackslash}p{2.5in}|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Arguments}&
+ \multicolumn1{|c}{Result}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+boxit\index{boxit?\texttt{boxit}}& suffix, picture& --& \pageref{Dboxit}&
+ Define a box containing the picture\\\hline
+boxit\index{boxit?\texttt{boxit}}& suffix, string& --& \pageref{Dsboxit}&
+ Define a box containing text\\\hline
+boxit\index{boxit?\texttt{boxit}}& suffix, \tdescr{empty}& --& \pageref{Deboxit}&
+ Define an empty box\\\hline
+boxjoin\index{boxjoin?\texttt{boxjoin}}& equations& --& \pageref{Dbxjoin}&
+ Give equations for connecting boxes\\\hline
+bpath\index{bpath?\texttt{bpath}}& suffix& path& \pageref{Dbpath}&
+ A box's bounding circle or rectangle\\\hline
+circleit\index{circleit?\texttt{circleit}}& suffix, picture& --& \pageref{Dcircit}&
+ Put picture in a circular box\\\hline
+circleit\index{circleit?\texttt{circleit}}& suffix, picture& --& \pageref{Dcircit}&
+ Put a string in a circular box\\\hline
+circleit\index{circleit?\texttt{circleit}}& suffix, \tdescr{empty}& --& \pageref{Dcircit}&
+ Define an empty circular box\\\hline
+drawboxed\index{drawboxed?\texttt{drawboxed}}& list of suffixes& --& \pageref{Ddrbxed}&
+ Draw the named boxes and their contents\\\hline
+drawboxes\index{drawboxes?\texttt{drawboxes}}& list of suffixes& --& \pageref{Ddrbxes}&
+ Draw the named boxes\\\hline
+drawunboxed\index{drawunboxed?\texttt{drawunboxed}}& list of suffixes& --& \pageref{Ddrunbx}&
+ Draw contents of named boxes\\\hline
+fixpos\index{fixpos?\texttt{fixpos}}& list of suffixes& --& \pageref{Dfixpos}&
+ Solve for the size and position of the named boxes\\\hline
+fixsize\index{fixsize?\texttt{fixsize}}& list of suffixes& --& \pageref{Dfixsiz}&
+ Solve for size of named boxes\\\hline
+pic\index{pic?\texttt{pic}}& suffix& picture& \pageref{Dpic}&
+ Box contents shifted into position\\\hline
+\end{tabular}
+\end{table}
+
+\begin{table}[hp]
+\centering
+\caption{\strut Box variables}
+\label{boxvartab}
+\index{variables!box}
+\begin{tabular}[t]{|>{\ttfamily $\descr{box name}$.}l|>{\arraybackslash}p{2in}|c|}
+\hline
+\multicolumn1{|c|}{Variable}& \multicolumn1{c|}{Explanation}& Validity\\
+\hline
+\hline
+c &center point &\\
+n &top center point &\\
+s &bottom center point &\\
+w &center left point &\\
+e &center right point &\\
+nw &top left corner &\texttt{boxit} only\\
+ne &top right corner &\texttt{boxit} only\\
+sw &bottom left corner &\texttt{boxit} only\\
+se &bottom right corner &\texttt{boxit} only\\
+dx &horizontal clearance &\\
+dy &vertical clearance &\\
+off &actual location of box contents &\\
+\hline
+\end{tabular}
+\end{table}
+
+\begin{table}[hp]
+\centering
+\caption{\strut Internal variables with numeric values}
+\label{ivartab}
+\index{variables!internal}
+\begin{tabular}[t]{|>{\ttfamily}l|r|>{\arraybackslash}p{3.5in}|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+circmargin\index{circmargin?\texttt{circmargin}}& \pageref{Dcmargin}&
+ clearance around contents of a circular or oval box\\\hline
+defaultdx\index{defaultdx?\texttt{defaultdx}}& \pageref{Ddefaultdx}&
+ usual horizontal space around box contents (default 3{\tt bp})\\\hline
+defaultdy\index{defaultdy?\texttt{defaultdy}}& \pageref{Ddefaultdy}&
+ usual vertical space around box contents (default 3{\tt bp})\\\hline
+\end{tabular}
+\end{table}
+
+
+\bibliographystyle{plain}
+\bibliography{mpboxes}
+
+\printindex
+
+\end{document}
+
+
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: t
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mpgraph.bib b/systems/doc/metapost/source-manual/mpgraph.bib
new file mode 100644
index 0000000000..27ef07de1f
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpgraph.bib
@@ -0,0 +1,98 @@
+% BibTeX entries for MetaPost doc, by John Hobby. Public domain.
+
+@string{jcompstatg = {Journal of Computational and Statistical Graphics}}
+
+@incollection{BenKer90,
+ author = "Jon L. Bentley and Brian W. Kernighan",
+ title = "Grap---A language for Typesetting Graphs",
+ booktitle = "Unix Research System Papers",
+ publisher = "{AT\&T} Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ edition = "Tenth",
+ volume = "{II}",
+ pages = "109--146",
+ year = 1990
+}
+@book{Cleve85,
+ author = "William S. Cleveland",
+ title = "The Elements of Graphing Data",
+ publisher = "Hobart Press",
+ address = "Summit, New Jersey",
+ year = "1985, revised 1994"
+}
+@book{Cleve93,
+ author = "Cleveland, William S.",
+ title = "Visualizing Data",
+ publisher = "Hobart Press",
+ address = "Summit, New Jersey",
+ year= 1993,
+}
+@book{Tufte83,
+ author = "Edward R. Tufte",
+ title = "Visual Display of Quantitative Information",
+ publisher = "Graphics Press",
+ address = "Box 430, Cheshire, Connecticut 06410",
+ year = 1983
+}
+@article{Cleve93a,
+ author = "Cleveland, William S.",
+ title = "A Model for Studying Display Methods of Statistical
+ Graphics (with discussion)",
+ journal = jcompstatg,
+ year = "to appear",
+ volume = 3
+}
+@book{Census92,
+ author = "U.S. Bureau of the Census",
+ title = "Statistical Abstracts of the United States: 1992",
+ edition = "112th",
+ address = "Washington, D.C.",
+ year = 1992
+}
+@book{LaTeXman,
+ author = "Leslie Lamport",
+ title = "{\LaTeX}: A Document Preparation System",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{ad:red,
+ author = "Adobe Systems Inc.",
+ title = "{P}ost{S}cript Language Reference Manual",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ edition = "second",
+ year = 1990
+}
+
+@inproceedings{ho:mp4,
+ author = "John D. Hobby",
+ title = "Introduction to {MetaPost}",
+ booktitle = "Euro{\TeX} '92 Proceedings",
+ month = sep,
+ year = 1992,
+ pages = "21--36"
+}
+[An updated version appeared in the April 1999 Issue of "Eutupon",
+ the news lettter for the Greek TeX friends group.
+]
+
+@techreport{ho:mp3,
+ title = "A User's manual for {MetaPost}",
+ author = "John D. Hobby",
+ institution = "AT\&T Bell Laboratories",
+ address = "Murray Hill, New Jersey",
+ type = "Computing Science Technical Report",
+ number = "no.~162",
+ note = {Available as http://cm.bell-labs.com/cs/cstr/162.ps.gz},
+ month = apr,
+ year = 1992
+}
+@book{kn:d,
+ author = "Donald E. Knuth",
+ note = "Volume D of {\it Computers and Typesetting}",
+ title = "{\MF} the Program",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
diff --git a/systems/doc/metapost/source-manual/mpgraph.mp b/systems/doc/metapost/source-manual/mpgraph.mp
new file mode 100644
index 0000000000..2c94edfe54
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpgraph.mp
@@ -0,0 +1,141 @@
+% Figures for MetaPost doc, by John Hobby. Public domain.
+
+input graph
+
+if scantokens(mpversion) < 1.200:
+ filenametemplate
+else:
+ outputtemplate :=
+fi
+"%j-%c.mps";
+
+%if false: %% Begin skipping already debugged figures
+%fi input sarith %% End skipping of already debugged figures
+
+beginfig(1);
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+endfig;
+
+
+beginfig(2);
+draw begingraph(3in,2in);
+ gdraw "agepop91.d" plot btex$\bullet$etex;
+ endgraph;
+endfig;
+
+
+beginfig(3);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ gdraw "agepopm.d";
+ endgraph;
+endfig;
+
+
+beginfig(4);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+endfig;
+
+
+beginfig(5);
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+endfig;
+
+
+beginfig(6);
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+endfig;
+
+
+input sarith
+
+beginfig(7);
+vardef newy(expr y) = (256/75)*y + mlog y enddef;
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ path p;
+ gdata("timepop.d", $, augment.p($1, newy(Scvnum $2)); );
+ gdraw p withpen nullpen;
+ for y=5,10,20,50,100,150,200,250:
+ grid.lft(format("%g",y), newy(y)) withcolor .85white;
+ endfor
+ autogrid(grid.bot,) withcolor .85white;
+ gdraw p;
+ frame.llft;
+ endgraph;
+endfig;
+
+beginfig(8);
+defaultfont:="cmr7";
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Life}\hbox{expectancy}} etex, OUT);
+ glabel.bot(btex Per capita G.N.P. (thousands of dollars) etex, OUT);
+ setcoords(log,linear);
+ gdata("countries.d", s,
+ glabel(s3, s1, s2);
+ )
+ endgraph;
+endfig;
+
+
+beginfig(9);
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Quadrillions}\hbox{of BTU}} etex, OUT);
+ path p[];
+ numeric t;
+ gdata("energy.d", $,
+ t:=0; augment.p1($1,0);
+ for j=2 upto 5:
+ t:=t+scantokens $[j]; augment.p[j]($1,t);
+ endfor)
+ picture lab[];
+ lab2=btex coal etex; lab3=btex crude oil etex;
+ lab4=btex natural gas etex; lab5=btex hydroelectric etex;
+ for j=5 downto 2:
+ gfill p[j]--reverse p[j-1]--cycle withcolor .16j*white;
+ glabel.lft(image(unfill bbox lab[j]; draw lab[j]), .7+length p[j]);
+ endfor
+ endgraph;
+endfig;
+
+
+beginfig(10);
+draw format("%g",2+2);
+endfig;
+
+beginfig(11);
+draw format("%3g","6.022e23");
+endfig;
+
+
+end
diff --git a/systems/doc/metapost/source-manual/mpgraph.tex b/systems/doc/metapost/source-manual/mpgraph.tex
new file mode 100644
index 0000000000..759c6e8506
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpgraph.tex
@@ -0,0 +1,1044 @@
+% $Id: mpgraph.tex 870 2009-03-06 11:04:56Z stephanhennig $
+% MetaPost graph doc, by John Hobby. License at end.
+\listfiles
+\RequirePackage{ifpdf}
+\ifpdf
+\ifnum\pdftexversion<140
+\else
+\pdfminorversion=5
+\pdfobjcompresslevel=1% Use compressed object streams.
+\fi
+\RequirePackage{cmap}
+\fi
+\documentclass{article} % article is NOT the original style
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{textcomp}
+\usepackage{mflogo}
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment{verbatim}{BVerbatim}{baseline=c}
+\usepackage{graphics}
+\usepackage[textwidth=6in,textheight=8.65in]{geometry}
+\usepackage{multicol}
+
+\newcommand\descr[1]{{\langle\hbox{\rm#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{$\langle$\invisgap{\rm#1}\invisgap$\rangle$}
+\newcommand\Ignore[1]{} % For fooling delatex so spell will work
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+\author{John D. Hobby}
+\title{Drawing Graphs with {MetaPost}}
+\date{}
+
+
+\newcommand\myabstract{%
+This paper describes a graph-drawing package that has been implemented
+as an extension to the MetaPost graphics language. MetaPost has
+a powerful macro facility for implementing such extensions. There are
+also some new language features that support the graph macros.
+Existing features for generating and manipulating pictures
+allow the user to do things that would be difficult to achieve
+in a stand-alone graph package.}
+
+\newcommand\mykeywords{%
+ typesetting; graphs; MetaPost}
+
+\usepackage[rgb,x11names]{xcolor}% Optimize for screen reading.
+\usepackage{hyperxmp}
+\usepackage{hyperref}
+\hypersetup{
+ pdftitle={Drawing Graphs with MetaPost},
+ pdfauthor={John D. Hobby and the MetaPost development team},
+ pdfkeywords={typesetting, graphs, MetaPost, TeX}
+}
+\hypersetup{
+ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer.
+ colorlinks,
+ linkcolor=RoyalBlue3,
+ urlcolor=Chocolate4,
+ citecolor=SpringGreen3
+}
+\usepackage[all]{hypcap}
+\ifpdf
+\pdfmapfile{=cm2lm.map}% replace CM by LM in figures
+\else
+\DeclareGraphicsExtensions{.mps}
+\DeclareGraphicsRule{mps}{eps}{*}{}
+\usepackage{breakurl}
+\fi
+
+
+\begin{document}
+ \maketitle
+ \begin{abstract} \myabstract \end{abstract}
+ \ifx\keywords\undefined \else
+ \begin{keywords} \mykeywords \end{keywords}
+ \fi
+
+\setlength{\columnsep}{2.5em}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+\section{Introduction}
+\label{intro}
+
+MetaPost is a batch-oriented graphics language based on Knuth's \MF\footnote{\MF\
+is a trademark of Addison Wesley Publishing Company.}, but with
+PostScript\footnote{PostScript is a registered trademark of Adobe Systems Inc.}
+output and numerous features for integrating text and graphics.
+The author has tried to make this paper as independent as possible of the
+user's manual~\cite{ho:mp3}, but fully appreciating all the material requires
+some knowledge of the MetaPost language.
+
+We concentrate on the mechanics of producing particular kinds of graphs
+because the question of what type of graph is best in a given situation
+is covered elsewhere; e.g., Cleveland~\cite{Cleve85,Cleve93,Cleve93a} and
+Tufte~\cite{Tufte83}.
+The goal is to provide at least the power of UNIX\footnote{UNIX is a registered
+trademark of UNIX System Laboratories, Inc.} {\it
+grap\/}~\cite{BenKer90}, but within the MetaPost language.
+Hence the package is implemented using MetaPost's powerful macro facility.
+
+The graph macros provide the following functionality:
+\begin{enumerate}
+\item Automatic scaling
+\item Automatic generation and labeling of tick marks or grid lines
+\item Multiple coordinate systems
+\item Linear and logarithmic scales
+\item Separate data files
+\item Ability to handle numbers outside the usual range
+\item Arbitrary plotting symbols
+\item Drawing, filling, and labeling commands for graphs
+\end{enumerate}
+In addition to these items, the user also has access to all the features
+described in the MetaPost user's manual~\cite{ho:mp3}.
+These include access to almost all the features of PostScript,
+ability to use and manipulate typeset text,
+ability to solve linear equations,
+and data types for points, curves, pictures, and coordinate transformations.
+
+Section~\ref{grmac} describes the graph macros from a user's perspective
+and presents several examples. Sections \ref{nummac} and~\ref{formsec} discuss
+auxiliary packages for manipulating and typesetting numbers and Section~\ref{concl}
+gives some concluding remarks. Appendix~\ref{summsec} summarizes the graph-drawing
+macros.
+
+
+\section{Using the Graph Macros}
+\label{grmac}
+
+A MetaPost input file that uses the graph macros should begin with
+$$ \hbox{\tt input graph} $$
+This reads a macro file {\tt graph.mp} and defines the graph-drawing commands
+explained below. The rest of the file should be one or more instances of
+$$ \vbox{\hbox{\tt beginfig($\descr{figure number}$);}
+ \hbox{\tt $\descr{graphics commands}$ endfig;}}
+$$
+followed by {\tt end}.
+
+The following \tdescr{graphics commands} suffice to generate the graph in
+Figure~\ref{fig1} from the data file {\tt agepop91.d}:
+$$\begin{verbatim}
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+\end{verbatim}
+$$
+(Each line of {\tt agepop91.d} gives an age followed the estimated number of
+Americans of that age in 1991 \cite{Census92}.)
+
+\begin{figure}[htp]
+$$ \includegraphics{mpgraph-1.mps} $$
+\caption{A graph of the 1991 age distribution in the United States}
+\label{fig1}
+\end{figure}
+
+\subsection{Basic Graph-Drawing Commands}
+
+% begingraph, endgraph, gdraw
+
+All graphs should begin with
+$$ \hbox{\tt begingraph($\descr{width}$,$\descr{height}$);} $$
+and end with {\tt endgraph}. This is syntactically a \tdescr{picture expression},
+so it should be preceded by {\tt draw} and followed by a semicolon as in the
+example.\footnote{See the User's Manual~\cite{ho:mp3} for explanations of {\tt draw}
+commands and syntactic elements like \tdescr{picture expression}.}
+The \tdescr{width} and \tdescr{height} give the dimensions of the
+graph itself without the axis labels.
+
+The command
+$$ {\tt gdraw}\ \descr{expression}\ \descr{option list} $$
+draws a graph line. If the \tdescr{expression} is of type string, it names a data
+file; otherwise it is a path that gives the function to draw. The
+\tdescr{option list} is zero or more drawing options
+$$ {\tt withpen} \descr{pen expression}
+ \mid {\tt withcolor} \descr{color expression}
+ \mid {\tt dashed} \descr{picture expression}
+$$
+that give the line width, color, or dash pattern as explained in the User's
+Manual~\cite{ho:mp3}.
+
+% plot <picture>
+
+In addition to the standard drawing options, the \tdescr{option list} in a
+{\tt gdraw} statement can contain
+$$ {\tt plot}\ \descr{picture expression} $$
+The \tdescr{picture expression} gives a plotting symbol to be drawn at each
+path knot. The {\tt plot} option suppresses line drawing so that%
+\footnote{Troff users should replace {\tt btex \$\string\bullet\$ etex} with
+{\tt btex \string\(bu etex}.}
+\Ignore{\)}% Help delatex so spell will work
+$$ \hbox{\verb|gdraw "agepop91.d" plot btex $\bullet$ etex|} $$
+generates only bullets as shown in Figure~\ref{fig2}.
+(Following the {\tt plot} option with a {\tt withpen} option would
+cause the line to reappear superimposed on the plotting symbols.)
+
+\begin{figure}[htp]
+$$ \includegraphics{mpgraph-2.mps} $$
+\caption{The 1991 age distribution plotted with bullets}
+\label{fig2}
+\end{figure}
+
+Watch out for the following: the \tdescr{picture expression} is placed
+with the lower-left corner at the path knot, not its center. If you
+want it to be dead-center, you have to correct the placement
+yourself. For the example above, you need something like this instead:
+
+\medskip
+\begin{verbatim}
+def MPbullet =
+ btex \lower\fontdimen22\cmsy \hbox to 0pt{\hss\cmsy\char15\hss} etex
+enddef;
+\end{verbatim}
+
+\medskip\noindent
+followed by:
+$$ \hbox{\verb|gdraw "agepop91.d" plot MPbullet|} $$
+
+
+% glabel, gdotlabel, OUT
+
+The {\tt glabel} and {\tt gdotlabel} commands add labels to a graph. The
+syntax for {\tt glabel} is
+$$ {\tt glabel.}\ \descr{label suffix}
+ \hbox{\tt ($\descr{string or picture expression}$, $\descr{location}$)}
+ \ \descr{option list}
+$$
+where \tdescr{location} identifies the location being labeled and
+\tdescr{label suffix} tells how the label is offset relative to that location.
+The {\tt gdotlabel} command is identical, except it marks the location with a
+dot. A \tdescr{label suffix} is as in plain MetaPost:
+\tdescr{empty} centers the label on the location;
+{\tt lft}, {\tt rt}, {\tt top}, {\tt bot} offset the label horizontally or
+vertically; and {\tt ulft}, {\tt urt}, {\tt llft}, {\tt lrt} give diagonal
+offsets. The \tdescr{location} can be a pair of graph coordinates, a knot
+number on the last {\tt gdraw} path, or the special location {\tt OUT}.
+Thus
+$$ \hbox{\verb|gdotlabel.top(btex $(50,0)$ etex, 50,0)|} $$
+would put a dot at graph coordinates {\tt(50,0)} and place the typeset text
+``$(50,0)$'' above it. Alternatively,
+$$ \hbox{\verb|glabel.ulft("Knot3", 3)|} $$
+typesets the string {\tt "Knot3"} and places it above and to the left of
+Knot~3 of the last {\tt gdraw} path. (The knot number 3 the path's ``time''
+parameter~\cite[Section 8.2]{ho:mp3}.)
+
+The \tdescr{location} {\tt OUT} places a label relative to the whole graph.
+For example, replacing ``{\tt gdraw "agepop91.d"}'' with
+$$\begin{verbatim}
+glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+glabel.bot(btex Age in years etex, OUT);
+gdraw "agepopm.d";
+\end{verbatim}
+$$
+in the input for Figure~\ref{fig1} generates Figure~\ref{fig3}.
+This improves the graph by adding axis labels and using a new data file
+{\tt agepopm.d} where the populations have been divided by one million to avoid
+large numbers. We shall see later that simple transformations such as this can
+be achieved without generating new data files.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpgraph-3.mps} $$
+\caption{An improved version of the 1991 age distribution graph}
+\label{fig3}
+\end{figure}
+
+All flavors of \TeX\ can handle multi-line labels via the \verb|\hbox| within
+\verb|\vbox| arrangement used above, but \LaTeX\ users will find it more natural
+to use the {\tt tabular} environment~\cite{LaTeXman}.
+Troff user's can use nofill mode:
+$$\begin{verbatim}
+btex .nf
+Population
+in millions etex
+\end{verbatim}
+$$
+
+
+\subsection{Coordinate Systems}
+\label{coords}
+
+The graph macros automatically shift and rescale coordinates from data files,
+{\tt gdraw} paths, and {\tt glabel} locations to fit the graph. Whether the
+range of $y$~coordinates is 0.64 to 4.6 or 640,000 to 4,600,000, they
+get scaled to fill about 88\% of the height specified in the {\tt begingraph}
+statement. Of course line widths, labels, and plotting symbols are not
+rescaled.
+
+% setrange
+
+The {\tt setrange} command controls the shifting and rescaling process by
+specifying the minimum and maximum graph coordinates:
+$$ \hbox{\tt setrange($\descr{coordinates}$,\,$\descr{coordinates}$)} $$
+where
+\begin{ctabbing}
+$\tt \descr{coordinates} \rightarrow \descr{pair expression}$\\
+$\tt \qquad \;|\; \descr{numeric or string expression}\hbox{\tt ,}
+ \descr{numeric or string expression}$
+\end{ctabbing}
+The first \tdescr{coordinates} give $(x_{\rm min},y_{\rm min})$ and the second give
+$(x_{\rm max},y_{\rm max})$. The lines $x=x_{\rm min}$, $x=x_{\rm max}$,
+$y=y_{\rm min}$, and $y=y_{\rm max}$ define the rectangular frame around the graph
+in Figures \ref{fig1}--\ref{fig3}. For example, an adding a statement
+$$ \hbox{\tt setrange(origin, whatever,\,whatever)} $$
+to the input for Figure~\ref{fig3} yields Figure~\ref{fig4}.
+The first \tdescr{coordinates} are given by the predefined pair constant
+{\tt origin}, and the other coordinates are left unspecified. Any unknown
+value would work as well, but {\tt whatever} is the standard MetaPost
+representation for an anonymous unknown value.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+\end{verbatim}
+\atop
+\includegraphics{mpgraph-4.mps}
+$$
+\caption{The 1991 age distribution graph and the input that creates it.}
+\label{fig4}
+\end{figure}
+
+% strings for big coordinates
+
+Notice that the syntax for {\tt setrange} allows coordinate values to be given
+as strings. Many commands in the graph package allow this option. It is
+provided because the MetaPost language uses fixed point numbers that must be
+less than 32768. This limitation is not as serious as it sounds because good
+graph design dictates that coordinate values should be ``of reasonable
+magnitude''~\cite{Cleve85,Tufte83}. If you really want $x$ and $y$
+to range from 0 to 1,000,000,
+$$ \hbox{\tt setrange(origin, "1e6",\,"1e6")} $$
+does the job. Any fixed or floating point representation is acceptable
+as long as the exponent is introduced by the letter ``{\tt e}''.
+
+% setcoords
+
+Coordinate systems need not be linear. The {\tt setcoords} command allows
+either or both axes to have logarithmic spacing:
+\begin{ctabbing}
+$\tt \descr{coordinate setting} \rightarrow setcoords\hbox{\tt (}
+ \descr{coordinate type}\hbox{\tt ,}\,\descr{coordinate type}\hbox{\tt )}$\\
+$\tt \descr{coordinate type} \rightarrow
+ log \;|\; linear \;|\; \hbox{\tt -}log \;|\; \hbox{\tt -}linear$
+\end{ctabbing}
+A negative \tdescr{coordinate type} makes $x$ (or $y$) run backwards so it is
+largest on the left side (or bottom) of the graph.
+
+Figure~\ref{fig5} graphs execution times for two matrix multiplication algorithms
+using
+$$ \hbox{\tt setcoords(log,log)} $$
+to specify logarithmic spacing on both axes. The data file {\tt matmul.d} gives
+timings for both algorithms:
+$$ \hbox to\hsize{\footnotesize\hfil$
+\begin{verbatim}
+20 .007861 standard MM: size, seconds
+30 .022051
+40 .050391
+60 .15922
+80 .4031
+120 1.53
+160 3.915
+240 18.55
+320 78.28
+480 279.24
+
+20 .006611 Strassen: size, seconds
+30 .020820
+40 .049219
+60 .163281
+80 .3975
+120 1.3125
+160 3.04
+240 9.95
+320 22.17
+480 72.60
+\end{verbatim}
+\hfil$}
+$$
+A blank line in a data file ends a data set. Subsequent {\tt gdraw} commands
+access additional data sets by just naming the same data file again.
+Since each line gives one $x$~coordinate and one $y$~coordinate, commentary
+material after the second data field on a line is ignored.
+
+\begin{figure}[htp]
+$$ \mathcenter{\includegraphics{mpgraph-5.mps}}
+ \quad
+\begin{BVerbatim}[baseline=c]
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+\end{BVerbatim}
+$$
+\caption{Timings for two matrix multiplication algorithms with the corresponding
+ MetaPost input.}
+\label{fig5}
+\end{figure}
+
+Placing a {\tt setcoords} command between two {\tt gdraw} commands graphs two
+functions in different coordinate systems as shown in Figure~\ref{fig6}.
+Whenever you give a {\tt setcoords} command, the interpreter examines what has
+been drawn, selects appropriate $x$ and $y$ ranges, and scales everything to
+fit. Everything drawn afterward is in a new coordinate system that need not
+have anything in common with the old coordinates unless {\tt setrange} commands
+enforce similar coordinate ranges. For instance, the two {\tt setrange}
+commands force both coordinate systems to have $x$ ranging from 80 to~90 and
+$y$~starting at 0.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+\end{verbatim}
+ \atop
+\mathcenter{\includegraphics{mpgraph-6.mps}}
+$$
+\caption{Annual lead emissions and average level at atmospheric monitoring
+ stations in the United States. The MetaPost input is shown above
+ the graph.}
+\label{fig6}
+\end{figure}
+
+% autogrid
+
+When you use multiple coordinate systems, you have to specify where the axis
+labels go. The default is to put tick marks on the bottom and the left side of
+the frame using the coordinate system in effect when the {\tt endgraph} command
+is interpreted. Figure~\ref{fig6} uses the
+$$ \hbox{\tt autogrid(,otick.lft)} $$
+to label the left side of the graph with the $y$~coordinates in effect before
+the {\tt setcoords} command. This suppresses the default axis labels, so another
+{\tt autogrid} command is needed to label the bottom and right sides of the
+graph using the new coordinate system. The general syntax is
+$$ \hbox{$\tt autogrid\hbox{\tt (}\descr{axis label command}\hbox{\tt ,}\,
+ \descr{axis label command}\hbox{\tt )}\ \descr{option list}$}
+$$
+where
+\begin{ctabbing}
+$\tt \descr{axis label command} \rightarrow \descr{empty}
+ \;|\; \descr{grid or tick}\, \descr{label suffix}$\\
+$\tt \descr{grid or tick} \rightarrow grid \;|\; itick \;|\; otick$
+\end{ctabbing}
+The \tdescr{label suffix} should be {\tt lft}, {\tt rt}, {\tt top},
+or {\tt bot}.
+
+The first argument to {\tt autogrid} tells how to label the $x$~axis and the
+second argument does the same for~$y$. An \tdescr{empty} argument suppresses
+labeling for that axis. Otherwise, the \tdescr{label suffix} tells which side
+of the graph gets the numeric label. Be careful to use {\tt bot} or {\tt top}
+for the $x$~axis and {\tt lft} or {\tt rt} for the $y$~axis. Use {\tt otick}
+for outward tick marks, {\tt itick} for inward tick marks, and {\tt grid} for
+grid lines. The \tdescr{option list} tells how to draw the tick marks or grid
+lines. Grid lines tend to be a little overpowering, so it is a good idea to
+give a {\tt withcolor} option to make them light gray so they do not make the
+graph too busy.
+
+
+\subsection{Explicit Grids and Framing}
+
+% otick, itick, grid, (format)
+
+In case {\tt autogrid} is not flexible enough, axis label commands generate
+grid lines or tick marks one at a time. The syntax is
+$$ \descr{grid or tick}\hbox{\tt .}\descr{label suffix}
+ \hbox{\tt ($\descr{label format}$,\,$\descr{numeric or string expression}$)}
+ \ \descr{option list}
+$$
+where \tdescr{grid or tick} and \tdescr{label suffix} are as in {\tt autogrid},
+and \tdescr{label format} is either a format string like \verb|"%g"| or a
+picture containing the typeset numeric label.
+
+The axis label commands use a macro
+$$ \hbox{\tt format($
+ \descr{format string}$,\,$\descr{numeric or string expression}$)}
+$$
+to typeset numeric labels. Full details appear in Section~\ref{formsec},
+but when the \tdescr{format string} is \verb|"%g"|, it uses decimal notation
+unless the number is large enough or small enough to require scientific notation.
+
+The example in Figure~\ref{fig7} invokes
+$$ \hbox{\verb|format("%g",y)|} $$
+explicitly so that grid lines can be placed at transformed coordinates.
+It defines the transformation ${\tt newy}(y)=y/75+\ln y$ and shows that
+this function increases almost linearly.\footnote{The manual~\cite{ho:mp3}
+explains how {\tt vardef} defines functions and {\tt mlog} computes logarithms.}
+This is a little like using logarithmic $y$-coordinates, except that $y$ is
+mapped to $y/75+\ln y$ instead of just $\ln y$.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+vardef newy(expr y) = (256/75)*y + mlog y enddef;
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ path p;
+ gdata("timepop.d", $, augment.p($1, newy(Scvnum $2)); );
+ gdraw p withpen nullpen;
+ for y=5,10,20,50,100,150,200,250:
+ grid.lft(format("%g",y), newy(y)) withcolor .85white;
+ endfor
+ autogrid(grid.bot,) withcolor .85white;
+ gdraw p;
+ frame.llft;
+ endgraph;
+\end{verbatim}
+ \atop
+ \includegraphics{mpgraph-7.mps}
+$$
+\caption{Population of the United States in millions versus time with the
+ population re-expressed as $p/75+\ln p$. The MetaPost input shown
+ above the graph assumes a data file {\tt ttimepop.d} that gives
+ (year, $p/75+\ln p$) pairs.}
+\label{fig7}
+\end{figure}
+
+% frame
+
+Figure~\ref{fig7} uses the command
+$$ \hbox{\tt frame.} \descr{label suffix}\ \descr{option list} $$
+to draw a special frame around the graph. In this case the \tdescr{label suffix}
+is {\tt llft} to draw just the bottom and left sides of the frame. Suffixes
+{\tt lrt}, {\tt ulft}, and {\tt urt} draw other combinations of two sides;
+suffixes {\tt lft}, {\tt rt}, {\tt top}, {\tt bot} draw one side, and \tdescr{empty}
+draws the whole frame. For example
+$$ \hbox{\verb|frame dashed evenly|} $$
+draws all four sides with dashed lines. The default four-sided frame is drawn
+only when there is no explicit {\tt frame} command.
+
+% auto, (sarith.mp)
+
+To label an axis as {\tt autogrid} does but with the labels transformed
+somehow, use
+$$ \hbox{{\tt auto.x}\quad or\quad {\tt auto.y}} $$
+for positioning tick marks or grid lines. These macros produce comma-separated
+lists for use in {\tt for} loops. Any $x$ or $y$ values in these lists that
+cannot be represented accurately within MetaPost's fixed-point number system
+are given as strings. A standard macro package that is loaded via
+$$ \hbox{\tt input sarith} $$
+defines arithmetic operators that work on numbers or strings. Binary operators
+{\tt Sadd}, {\tt Ssub}, {\tt Smul}, and {\tt Sdiv} do addition, subtraction
+multiplication, and division.
+
+One possible application is rescaling data.
+Figure~\ref{fig4} used a special data file {\tt agepopm.d} that had $y$~values
+divided by one million. This could be avoided by replacing
+``{\tt gdraw "agepopm.d"}'' by
+$$\begin{verbatim}
+gdraw "agepop91.d";
+for u=auto.y: otick.lft(format("%g",u Sdiv "1e6"), u); endfor
+autogrid(otick.bot,)
+\end{verbatim}
+$$
+
+
+\subsection{Processing Data Files}
+\label{dfilesec}
+
+% gdata
+
+The most general tool for processing data files is the {\tt gdata} command:
+$$ \hbox{\tt gdata(} \descr{string expression} \hbox{\tt,}\, \descr{variable}
+ \hbox{\tt,}\, \descr{commands} \hbox{\tt )}
+$$
+It takes a file name, a variable~$v$, and a list of commands to be executed for
+each line of the data file. The commands are executed with {\tt i} set to the
+input line number and strings $v${\tt 1}, $v${\tt 2}, $v${\tt 3}, \ldots\ set
+to the input fields on the current line. A null string marks the end of the
+$v$ array.
+
+Using a {\tt glabel} command inside of {\tt gdata} generates a scatter plot
+as shown in Figure~\ref{fig8}. The data file {\tt countries.d} begins
+$$\begin{verbatim}
+20.910 75.7 US
+ 1.831 66.7 Alg
+\end{verbatim}
+$$
+where the last field in each line gives the label to be plotted. Setting
+{\tt defaultfont} in the first line of input selects a small font for these
+labels. Without these labels, no {\tt gdata} command would be needed.
+Replacing the {\tt gdata} command with
+$$ \hbox{\verb|gdraw "countries.d" plot btex$\circ$etex|} $$
+would change the abbreviated country names to open circles.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+defaultfont:="cmr7";
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Life}\hbox{expectancy}} etex, OUT);
+ glabel.bot(btex Per capita G.N.P. (thousands of dollars) etex, OUT);
+ setcoords(log,linear);
+ gdata("countries.d", s,
+ glabel(s3, s1, s2);
+ )
+ endgraph;
+\end{verbatim}
+ \atop
+ \includegraphics{mpgraph-8.mps}
+$$
+\caption{A scatter plot and the commands that generated it}
+\label{fig8}
+\end{figure}
+
+Both {\tt gdraw} and {\tt gdata} ignore an optional initial `\%' on each input
+line, parse data fields separated by white space, and stop if they encounter an
+input line with no data fields. Leading percent signs make graph data
+look like MetaPost comments so that numeric data can be placed at the beginning
+of a MetaPost input file.
+
+% augment
+
+It is often useful to construct one or more paths when reading a data file
+with {\tt gdata}. The {\tt augment} command is designed for this:
+$$ \hbox{\tt augment.} \descr{path variable} \hbox{\tt(}\descr{coordinates}\hbox{\tt)}
+$$
+If the path variable does not have a known value, it becomes a path of length
+zero at the given coordinates; otherwise a line segment to the given coordinates
+is appended to the path. The \tdescr{coordinates} may be a pair expression or
+any combination of strings and numerics as explained at the beginning of
+Section~\ref{coords}.
+
+If a file {\tt timepop.d} gives $t$,~$p$ pairs, {\tt augment} can be used like
+this to graph {\tt newy(}$p${\tt)} versus~$t$:
+$$\begin{verbatim}
+path p;
+gdata("timepop.d", s, augment.p(s1, newy(scantokens s2)); );
+gdraw p;
+\end{verbatim}
+$$
+(MetaPost's {\tt scantokens} primitive interprets a string as if it were the
+contents of an input file. This finds the numeric value of data field
+{\tt s2}.)
+
+% gfill (energy.d)
+
+Figure~\ref{fig9} shows how to use {\tt augment} to read multiple column data
+and make multiple paths. Paths {\tt p2}, {\tt p3}, {\tt p4}, {\tt p5} give
+cumulative totals for columns 2 through 5 and pictures {\tt lab2} through
+{\tt lab5} give corresponding labels. The expression
+$$ \hbox{\verb|image(unfill bbox lab[j]; draw lab[j])|} $$
+executes the given drawing commands and returns the resulting picture:
+``{\tt unfill bbox lab[j]}'' puts down a white background and ``{\tt draw
+lab[j]}'' puts the label on the background.
+The {\tt gfill} command is just like {\tt gdraw}, except it takes a cyclic
+path and fills the interior with a solid color. The color is black unless
+a {\tt withcolor} clause specifies another color.
+See the manual~\cite{ho:mp3} for
+explanations of {\tt for} loops, arrays, colors, and path construction
+operators like \verb|--|, {\tt cycle}, and {\tt reverse}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Quadrillions}\hbox{of BTU}} etex, OUT);
+ path p[];
+ numeric t;
+ gdata("energy.d", $,
+ t:=0; augment.p1($1,0);
+ for j=2 upto 5:
+ t:=t+scantokens $[j]; augment.p[j]($1,t);
+ endfor)
+ picture lab[];
+ lab2=btex coal etex; lab3=btex crude oil etex;
+ lab4=btex natural gas etex; lab5=btex hydroelectric etex;
+ for j=5 downto 2:
+ gfill p[j]--reverse p[j-1]--cycle withcolor .16j*white;
+ glabel.lft(image(unfill bbox lab[j]; draw lab[j]), .7+length p[j]);
+ endfor
+ endgraph;
+\end{verbatim}
+ \atop
+ \includegraphics{mpgraph-9.mps}
+$$
+\caption{A graph of U.S. annual energy production
+ and the commands that generated it}
+\label{fig9}
+\end{figure}
+
+
+\section{Manipulating Big Numbers}
+\label{nummac}
+
+MetaPost inherits a fixed-point number system from Knuth's \MF~\cite{kn:d}.
+Numbers are expressed in multiples of $2^{-16}$ and they must have absolute
+value less than 32768. Knuth chose this system because it is perfectly adequate
+for font design, and it guaranteed to give identical results on all types of
+computers. Fixed-point numbers are seldom a problem in MetaPost because all
+computations are based on coordinates that are limited by the size the paper on
+which the output is to be printed. This does not hold for the input data in a
+graph-drawing application. Although graphs look best when coordinate axes are
+labeled with numbers of reasonable magnitude, the strict limits of fixed-point
+arithmetic would be inconvenient.
+
+% Sadd, Ssub, Smul, Sdiv
+
+A simple way to handle large numbers is to include the line
+$$ \hbox{\tt input sarith} $$
+and then use binary operators {\tt Sadd}, {\tt Ssub}, {\tt Smul}, and {\tt Sdiv}
+in place of \verb|+|, \verb|-|, \verb|*|, and \verb|/|. These operators are
+inefficient but very flexible. They accept numbers or strings and return
+strings in exponential notation with the exponent marked by ``{\tt e}'';
+e.g., \verb|"6.7e-11"| means $6.7\times10^{-11}$.
+
+% Sabs, Sleq, Sneq
+
+The unary operator\footnote{The argument to a unary operator need not be
+parenthesized unless it is an expression involving binary operators.}
+$$ {\tt Sabs}\ \descr{string} $$
+finds a string the represents the absolute value. Binary operators {\tt Sleq}
+and {\tt Sneq} perform numeric comparisons on strings and return boolean
+results.
+
+% Scvnum
+
+The operation
+$$ {\tt Scvnum}\ \descr{string} $$
+finds the numeric value for a string if this can be done without overflowing
+MetaPost's fixed-point number system. If the string does not contain
+``{\tt e}'', it is much more efficient to use the primitive operation
+$$ {\tt scantokens}\ \descr{string} $$
+
+% Mten
+
+The above operators are based on a low-level package that manipulates numbers
+in ``{\tt Mlog} form.'' A number $x$ in {\tt Mlog} form represents
+$$ \mu^{2^{16}x}, \quad {\rm where\ } \mu=-e^{2^{-24}}. $$
+Any value between $1.61\times10^{-28}$ and $3.88\times10^{55}$ can be
+represented this way. (There is a constant {\tt Mten} such that $k*{\tt Mten}$
+represents $10^k$ for any integer~$k$ in the interval $[-29,55]$.)
+
+% Mreadpath, Gpaths
+
+The main reason for mentioning {\tt Mlog} form is that it allows graph data
+to be manipulated as a MetaPost path. The function
+$$ \hbox{\tt Mreadpath($\descr{file name}$)} $$
+reads a data file and returns a path where all the coordinates are in
+{\tt Mlog} form. An internal variable {\tt Gpaths} determines whether
+{\tt gdraw} and {\tt gfill} expect paths to be given in {\tt Mlog} form.
+For example, this graphs the data in {\tt agepop91.d} with $y$ coordinates
+divided by one million:
+$$\begin{verbatim}
+interim Gpaths:=log;
+gdraw Mreadpath("agepop91.d") shifted (0,-6*Mten);
+\end{verbatim}
+$$
+
+
+\section{Typesetting Numbers}
+\label{formsec}
+
+% format
+
+The graph package needs to compute axis labels and then typeset them.
+The macro
+$$ \hbox{\tt format($\descr{string expression}$,\,%
+ $\descr{numeric or string expression}$)} $$
+does this. You must first {\tt input graph} or {\tt input format} to load the
+macro file. The macro takes a format string and a number to typeset and returns
+a picture containing the typeset result. Thus
+$$ \hbox{\verb|format("%g",2+2)|}\quad {\rm yields}\quad \includegraphics{mpgraph-10.mps} $$
+and
+$$ \hbox{\verb|format("%3g","6.022e23")|}
+ \quad {\rm yields}\quad \includegraphics{mpgraph-11.mps}
+$$
+
+A format string consists of
+\begin{itemize}
+\item an optional initial string not containing a percent sign,
+\item a percent sign,
+\item an optional numeric precision $p$,
+\item one of the conversion letters {\tt e}, {\tt f}, {\tt g}, {\tt G},
+\item an optional final string $\beta$.
+\end{itemize}
+The initial and final strings are typeset in the default font (usually
+{\tt cmr10}), and the typeset number is placed between them. For the {\tt e}
+and {\tt g} formats, the precision~$p$ is the number of significant digits
+allowed after rounding; for {\tt f} and {\tt G}, the number is rounded to the
+nearest multiple of $10^{-p}$. If the precision is not specified, the default
+is $p=3$. The {\tt e} format always uses scientific
+notation and the {\tt f} format uses ordinary decimal notation but reverts to
+scientific notation if the number is at least 10000. The {\tt g} and {\tt G}
+formats also revert to scientific notation for non-zero numbers of magnitude
+less than 0.001.
+
+% init_numbers
+
+The {\tt format} macro needs a set of templates to determine what font to use,
+how to position the exponent, etc. The templates are normally initialized
+automatically, but it is possible to set them explicitly by passing five picture
+expressions to {\tt init\_numbers}. For instance, the default definition for
+\TeX\ users is
+$$\begin{verbatim}
+init_numbers(btex$-$etex, btex$1$etex, btex${\times}10$etex,
+ btex${}^-$etex, btex${}^2$etex)
+\end{verbatim}
+$$
+The first argument tells how to typeset a leading minus sign;
+the second argument is an example of a 1-digit mantissa;
+third comes whatever to put after the mantissa in scientific notation;
+next come a leading minus sign for the exponent and a sample 1-digit exponent.
+
+% Fe_plus, Fe_base
+
+Picture variable \verb|Fe_plus| gives a leading plus sign for positive numbers,
+and \verb|Fe_base| gives whatever should precede the exponent when typesetting
+a power of ten. Calling \verb|init_numbers| initializes \verb|Fe_plus| to an
+empty picture and constructs \verb|Fe_base| from its second and third arguments.
+
+
+
+\section{Conclusion}
+\label{concl}
+
+The graph package makes it convenient to generate graphs from within the MetaPost
+language. The primary benefits are the power of the MetaPost language and its
+ability to interact with \TeX\ or troff for typesetting labels. Typeset labels
+can be stored in picture variables and manipulated in various ways such measuring
+the bounding box and providing a white background.
+
+We have seen how to generate shaded regions and control line width, color, and
+styles of dashed lines. Numerous other variations are possible.
+The full MetaPost language~\cite{ho:mp3} provides many other potentially useful
+features. It also has enough computing power to be useful for generating and
+processing data.
+
+
+
+\appendix
+\section{Summary of the Graph Package}
+\label{summsec}
+
+% Not described elsewhere: gdrawarrow, gdrawdblarrow, Gmarks, Gminlog, Autoform
+
+In the following descriptions, italic letters such as $w$ and $h$ denote
+expression parameters and words in angle brackets denote other syntactic
+elements. Unless specified otherwise, expression parameters can be either
+numerics or strings. An \tdescr{option list} is a list of drawing options such
+as {\tt withcolor .5white} or {\tt dashed evenly};
+a \tdescr{label suffix} is one of {\tt lft}, {\tt rt}, {\tt top}, {\tt bot},
+{\tt ulft}, {\tt urt}, {\tt llft}, {\tt lrt}.
+
+\subsection{Graph Administration}
+
+\begin{description}
+\item[{\tt begingraph($w$,$h$)}]
+ Begin a new graph with the frame width and height given by numeric
+ parameters $w$ and $h$.
+\item[{\tt endgraph}]
+ End a graph and return the resulting picture.
+\item[{\tt setcoords($t_x$,\,$t_y$)}]
+ Set up a new coordinate system as specified by numeric flags $t_x$,
+ $t_y$. Flag values are $\pm{\tt linear}$ and $\pm{\tt log}$.
+\item[{\tt setrange($\descr{coordinates}$,\,$\descr{coordinates}$)}]
+ Set the lower and upper limits for the current coordinate system.
+ Each \tdescr{coordinates} can be a single pair expression or two
+ numeric or string expressions.
+\end{description}
+
+\subsection{Drawing and Labeling}
+
+All of the drawing and labeling commands can be followed by an
+\tdescr{option list}. In addition to the usual MetaPost drawing options, the
+list can contain a {\tt plot} \tdescr{picture} clause to plot a specified
+picture at each data point.
+
+The drawing and labeling commands are closely related to a set of similarly
+named commands in plain MetaPost. The {\tt gdrawarrow} and {\tt gdrawdblarrow}
+commands are included to maintain this relationship.
+
+\begin{description}
+\item[{\tt gdotlabel.$\descr{label suffix}$($p$,\,$\descr{location}$)}]
+ This is like {\tt glabel} except it also puts a dot at the location
+ being labeled.
+\item[{\tt gdraw $p$}]
+ Draw path $p$, or if $p$ is a string, read coordinate pairs from
+ file~$p$ and draw a polygonal line through them.
+\item[{\tt gdrawarrow $p$}]
+ This is like {\tt dgraw} $p$ except it adds an arrowhead at the end of
+ the path.
+\item[{\tt gdrawdblarrow $p$}]
+ This is like {\tt dgraw} $p$ except it adds an arrowheads at each end of
+ the path.
+\item[{\tt gfill $p$}]
+ Fill cyclic path~$p$ or read coordinates from the file named by
+ string~$p$ and fill the resulting polygonal outline.
+\item[{\tt glabel.$\descr{label suffix}$($p$,\,$\descr{location}$)}]
+ If $p$ is not a picture, it should be a string. Typeset it using
+ {\tt defaultfont}, then place it near the given location and offset as
+ specified by the \tdescr{label suffix}. The \tdescr{location} can be
+ $x$~and $y$ coordinates, a pair giving $x$~and $y$, a numerc value giving
+ a time on the last path drawn, or {\tt OUT} to label the outside of the
+ graph.
+\end{description}
+
+\subsection{Grids, Tick Marks, and Framing}
+
+\begin{description}
+\item[{\tt auto.}$\descr{{\tt x} or {\tt y}}$]
+ Generate default $x$ or $y$ coordinates for tick marks.
+\item[{\tt autogrid($\descr{axis label command}$,\,$\descr{axis label command}$)}]
+ Draw default axis labels using the specified commands for the $x$ and
+ $y$ axes. An \tdescr{axis label command} may be \tdescr{empty} or it
+ may be {\tt itick}, {\tt otick}, or {\tt grid} followed by a
+ \tdescr{label suffix}.
+\item[{\tt frame.}$\descr{label suffix}$\ $\descr{option list}$]
+ Draw a frame around the graph, or draw the part of the frame specified
+ by the \tdescr{label suffix}.
+\item[{\tt grid.}$\descr{label suffix}$($f$,$z$)]
+ Draw a grid line across the graph from the side specified by the
+ \tdescr{label suffix}, and label it there using format string~$f$ and
+ coordinate value~$z$. If $f$ is a picture, it gives the label.
+\item[{\tt itick.}$\descr{label suffix}$($f$,$z$)]
+ This is like {\tt grid} except it draws an inward tick mark.
+\item[{\tt otick.}$\descr{label suffix}$($f$,$z$)]
+ This is like {\tt grid} except it draws an outward tick mark.
+\end{description}
+
+\subsection{Miscellaneous Commands}
+
+\begin{description}
+\item[{\tt augment.$\descr{variable}$($\descr{coordinates}$)}]
+ Append \tdescr{coordinates} to the path stored in \tdescr{variable}.
+\item[{\tt format($f$,\,$x$)}]
+ Typeset $x$ according to format string~$f$ and return the resulting
+ picture.
+\item[{\tt gdata($f$,\,$\descr{variable}$,\,$\descr{commands}$)}]
+ Read the file named by string~$f$ and execute \tdescr{commands} for each
+ input line using the \tdescr{variable} as an array to store data fields.
+\item[{\tt init\_numbers($s$,\,$m$,\,$x$,\,$t$,\,$e$)}]
+ Provide five pictures as templates for future {\tt format} operations:
+ $s$ is a leading minus; $m$ is a sample mantissa; $x$ follows the
+ mantissa; $t$ is a leading minus for the exponent~$e$.
+\item[{\tt Mreadpath($f$)}]
+ Read a path for the data file named by string~$f$ and return it in
+ ``{\tt Mlog} form''.
+\end{description}
+
+\subsection{Arithmetic on Numeric Strings}
+
+It is necessary to {\tt input sarith} before using the following macros:
+\begin{description}
+\item[{\tt Sabs $x$}]
+ Compute $|x|$ and return a numeric string.
+\item[{\tt $x$ Sadd $y$}]
+ Compute $x+y$ and return a numeric string.
+\item[{\tt Scvnum $x$}]
+ Return the numeric value for string $x$.
+\item[{\tt $x$ Sdiv $y$}]
+ Compute $x/y$ and return a numeric string.
+\item[{\tt $x$ Sleq $y$}]
+ Return the boolean result of the comparison $x\leq y$.
+\item[{\tt $x$ Smul $y$}]
+ Compute $x*y$ and return a numeric string.
+\item[{\tt $x$ Sneq $y$}]
+ Return the boolean result of the comparison $x\neq y$.
+\item[{\tt $x$ Ssub $y$}]
+ Compute $x-y$ and return a numeric string.
+\end{description}
+
+\subsection{Internal Variables and Constants}
+
+\begin{description}
+\item[{\tt Autoform}]
+ Format string used by {\tt autogrid}. Default: \verb|"%g"|.
+\item[{\tt Fe\_base}]
+ What precedes the exponent when typesetting a power of ten.
+\item[{\tt Fe\_plus}]
+ Picture of the leading plus sign for positive exponents.
+\item[{\tt Gmarks}]
+ Minimum number of tick marks per axis for {\tt auto} and {\tt autogrid}.
+ Default: 4.
+\item[{\tt Gminlog}]
+ Minimum largest/smallest ratio for logarithmic spacing with {\tt auto}
+ and {\tt autogrid}. Default: 3.0.
+\item[{\tt Gpaths}]
+ Code for coordinates used in {\tt gdraw} and {\tt gfill} paths:
+ {\tt linear} for standard form, {log} for ``{\tt Mlog} form''.
+\item[{\tt Mten}]
+ The ``{\tt Mlog} form'' for 10.0
+\end{description}
+
+
+\bibliographystyle{plain}
+\bibliography{mpgraph}
+
+\end{document}
+
+
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: t
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mplibapi.tex b/systems/doc/metapost/source-manual/mplibapi.tex
new file mode 100644
index 0000000000..b4638fcda0
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mplibapi.tex
@@ -0,0 +1,1572 @@
+
+\def\MPLIB{MPlib}
+\def\MP{MetaPost}
+\def\POSTSCRIPT{PostScript}
+\def\PS{PostScript}
+\def\SVG{SVG}
+\def\PNG{PNG}
+\def\MNG{MNG}
+\def\TFM{{\sc tfm}}
+\def\LUA{Lua}
+
+\def\luatex#1{#1}
+
+\setupinteraction[state=start] % don't forget this line!
+\placebookmarks[section,subsection,subsubsection][section]
+% \setupinteractionscreen[option=bookmark]
+
+\definefontsynonym[TitleFont][Sans]
+\definefontsynonym[SubTitleFont][Sans]
+
+\def\StartTitlePage%
+ {\bgroup%\startstandardmakeup
+ \setupalign[middle]
+ \hbox{}\vfil
+ \let\\=\crlf}
+
+\def\StopTitlePage%
+ {\vfil
+ \page\egroup%\stopstandardmakeup
+ }
+
+\usetypescript[palatino]
+\switchtobodyfont[palatino,10pt]
+
+\nonknuthmode
+
+\defineselector[title][max=2,n=2]
+
+\def\ctypedef#1#2#3{\subsubsection[#2]{\select{title}{\type{#2}}{\type{#1#2#3}}}\bookmark{#2}}
+\def\cenumeration#1{\subsubsection{\type{#1}}\bookmark{#1}}
+\def\cfunction#1#2#3{\subsubsection[#2]{\select{title}{\type{#2}}{\type{#1 #2#3}}}\bookmark{#2}}
+
+
+\starttext
+
+\StartTitlePage
+\centerline{\definedfont[TitleFont at 50pt]{\MPLIB}}
+\blank[3*line]
+\centerline{\definedfont[SubTitleFont at 24pt]{API documentation, version 2.00}}
+\blank[3*line]
+\centerline{Taco Hoekwater, September 2012 -- Luigi Scarso, February 2018}
+\StopTitlePage
+
+\section{Table of contents}
+
+\setupselector[title][n=1]
+
+\placecontent[criterium=all,level=subsection]
+
+\setupselector[title][n=2]
+
+\page
+
+\section{Introduction}
+
+This document describes the API to \MPLIB, allowing you to use
+\MPLIB\ in your own applications. One such application is writing
+bindings to interface with other programming languages. The
+bindings to the \LUA\ scripting language is part of the \MPLIB\
+distribution and also covered by this manual.
+
+This is a first draft of both this document as well as the API, so
+there may be errors or omissions in this document or strangenesses in
+the API. If you believe something can be improved, please do not
+hesitate to let us know. The contact email address is {\tt
+metapost@tug.org}.
+
+The C paragraphs in this document assume you understand C code, the
+Lua paragraphs assume you understand Lua code, and familiarity with
+\MP\ is assumed throughout.
+
+\subsection{Simple \MPLIB\ use}
+
+There are two different approaches possible when running \MPLIB. The first
+method is most suitable for programs that function as a command-line
+frontend. It uses \quote{normal} \MP\ interface with I/O to and from files,
+and needs very little setup to run. On the other hand, it also gives
+almost no chance to control the \MPLIB\ behaviour.
+
+Here is a C language example of how to do this:
+
+
+\starttyping
+#include "mplib.h"
+int main (int argc, char **argv) {
+ MP mp;
+ MP_options *opt = mp_options();
+ opt->command_line = argv[1];
+ mp = mp_initialize(opt);
+ if (mp) {
+ int history = mp_run(mp);
+ mp_finish(mp);
+ exit (history);
+ } else {
+ exit (EXIT_FAILURE);
+ }
+}
+\stoptyping
+
+This example will run in \quote{inimpost} mode. See below for how to
+preload a macro package.
+
+\subsection{Embedded \MPLIB\ use}
+
+The second method does not run a file, but instead repeatedly executes
+chunks of \MP\ language input that are passed to the library as
+strings, with the output redirected to internal buffers instead of
+directly to files.
+
+Here is an example of how this second approach works, now using the
+\LUA\ bindings:
+
+\starttyping
+local mplib = require('mplib')
+local mp = mplib.new ({ ini_version = false,
+ mem_name = 'plain' })
+if mp then
+ local l = mp:execute([[beginfig(1);
+ fill fullcircle scaled 20;
+ endfig;
+ ]])
+ if l and l.fig and l.fig[1] then
+ print (l.fig[1]:postscript())
+ end
+ mp:finish();
+end
+\stoptyping
+
+This example preloads the \quote{plain} macro file.
+
+
+\section{C API for core \MPLIB}
+
+All of the types, structures, enumerations and functions that are
+described in this section are defined in the header file \type{mplib.h}.
+
+\subsection{Structures}
+
+\ctypedef{}{MP_options}{}
+
+This is a structure that contains the configurable parameters for a new \MPLIB\ instance. Because \MP\ differentiates
+between \type{-ini} and \type{non-ini} modes, there are three types of settings: Those that apply in both cases, and
+those that apply in only one of those cases.
+
+
+\starttabulate[|l|l|l|p|]
+\NC int \NC ini_version \NC 1 \NC set this to zero if you want to load a mem file.\NC \NR
+\NC int \NC error_line \NC 79 \NC maximal length of error message lines\NC \NR
+\NC int \NC half_error_line \NC 50 \NC halfway break point for error contexts\NC\NR
+\NC int \NC max_print_line \NC 100 \NC maximal length of file output\NC \NR
+\NC void * \NC userdata \NC NULL \NC for your personal use only, not used by the library\NC \NR
+\NC char * \NC banner \NC NULL \NC string to use instead of default banner\NC \NR
+\NC int \NC print_found_names\NC 0 \NC controls whether the asked name or the actual found
+ name of the file is used in messages\NC \NR
+\NC int \NC file_line_error_style\NC 0 \NC when this option is nonzero, the library will use \type{file:line:error}
+ style formatting for error messages that occur while reading
+ from input files\NC \NR
+\NC char * \NC command_line \NC NULL \NC input file name and rest of command line;
+ only used by \type{mp_run} interface\NC \NR
+\NC int \NC interaction \NC 0 \NC explicit \type{mp_interaction_mode} (see below)\NC \NR
+\NC int \NC noninteractive \NC 0 \NC set this nonzero to suppress user interaction,
+ only sensible if you want to use \type{mp_execute}\NC \NR
+\NC int \NC random_seed \NC 0 \NC set this nonzero to force a specific random seed\NC \NR
+\NC int \NC troff_mode \NC 0 \NC set this nonzero to initialize \quote{troffmode} \NC \NR
+\NC char * \NC mem_name \NC NULL \NC explicit mem name to use instead of \type{plain.mem}.
+ ignored in \type{-ini} mode.\NC \NR
+\NC char * \NC job_name \NC NULL \NC explicit job name to use instead of first input file\NC \NR
+\NC mp_file_finder \NC find_file \NC NULL \NC function called for finding files \NC \NR
+\NC mp_editor_cmd \NC run_editor \NC NULL \NC function called after \quote{E} error response\NC \NR
+\NC mp_makempx_cmd \NC run_make_mpx \NC NULL \NC function called for the creation of mpx files\NC \NR
+\NC int \NC math_mode \NC 0 \NC set this to \type{mp_math_double_mode} to use doubles
+ instead of scaled (\type{mp_math_scaled_mode}) values\NC \NR
+\stoptabulate
+
+To create an \type{MP_options} structure, you have to use the \type{mp_options()} function.
+
+\ctypedef{}{MP}{}
+
+This type is an opaque pointer to a \MPLIB\ instance, it is what you
+have pass along as the first argument to (almost) all the \MPLIB\
+functions. The actual C structure it points to has hundreds of fields,
+but you should not use any of those directly. All configuration is done
+via the \type{MP_options} structure, and there are accessor functions
+for the fields that can be read out.
+
+\ctypedef{}{mp_run_data}{}
+
+When the \MPLIB\ instance is not interactive, any output is redirected
+to this structure. There are a few string output streams, and a
+linked list of output images.
+
+\starttabulate[|l|l|p|]
+\NC mp_stream \NC term_out \NC holds the terminal output \NC \NR
+\NC mp_stream \NC error_out \NC holds error messages \NC \NR
+\NC mp_stream \NC log_out \NC holds the log output \NC \NR
+\NC mp_stream \NC ship_out \NC holds the exported EPS, SVG or PNG string \NC \NR
+\NC mp_edge_object *\NC edges \NC linked list of generated pictures \NC \NR
+\stoptabulate
+
+\type{term_out} is equivalent to \type{stdout} in interactive use, and
+\type{error_out} is equivalent to \type{stderr}. The \type{error_out}
+is currently only used for memory allocation errors, the \MP\ error
+messages are written to \type{term_out} (and are often duplicated to
+\type{log_out} as well).
+
+You need to include at least \type{mplibps.h} to be able to actually
+make use of this list of images, see the next section for the details
+on \type{mp_edge_object} lists.
+
+See next paragraph for \type{mp_stream}.
+
+\ctypedef{}{mp_stream}{}
+
+This contains the data for a stream as well as some internal
+bookkeeping variables. The fields that are of interest to you are:
+
+\starttabulate[|l|l|p|]
+\NC size_t \NC size \NC the internal buffer size\NC \NR
+\NC char * \NC data \NC the actual data. \NC \NR
+\stoptabulate
+
+There is nothing in the stream unless the \type{size} field is
+nonzero. There will not be embedded null characters (\type{\0})
+in \type{data} except when \type{ship_out} is used for PNG output.
+
+If \type{size} is nonzero, \type{strlen(data)} is guaranteed to be
+less than that, and may be as low as zero (if \MPLIB\ has written an
+empty string).
+
+\subsection{Function prototype typedefs}
+
+The following three function prototypes define functions that you can
+pass to \MPLIB\ inside the \type{MP_options} structure.
+
+\ctypedef{char * }{(*mp_file_finder)}{ (MP, const char*, const char*, int)}
+
+\MPLIB\ calls this function whenever it needs to find a file. If you
+do not set up the matching option field (\type{MP_options.find_file}),
+\MPLIB\ will only be able to find files in the current directory.
+
+The three function arguments are the requested file name, the file
+mode (either \type{"r"} or \type{"w"}), and the file type (an
+\type{mp_filetype}, see below).
+
+The return value is a new string indicating the disk file name to be
+used, or NULL if the named file can not be found. If the mode is
+\type{"w"}, it is usually best to simply return a copy of the first
+argument.
+
+
+\ctypedef{void }{(*mp_editor_cmd)}{(MP, char*, int)}
+
+This function is executed when a user has pressed \quote{E} as reply to an
+\MP\ error, so it will only ever be called when \MPLIB\ in interactive mode.
+The function arguments are the file name and the line number. When
+this function is called, any open files are already closed.
+
+\ctypedef{int }{(*mp_makempx_cmd)}{(MP, char*, char *)}
+
+This function is executed when there is a need to start generating an
+\type{mpx} file because (the first time a \type{btex} command was
+encountered in the current input file).
+
+The first argument is the input file name. This is the name that was given
+in the \MP\ language, so it may not be the same as the name of the actual
+file that is being used, depending on how your
+\type{mp_file_finder} function behaves. The second argument is the
+requested output name for mpx commands.
+
+A zero return value indicates success, everything else indicates
+failure to create a proper \type{mpx} file and will result in an \MP\ error.
+
+\subsection{Enumerations}
+
+\cenumeration{mp_filetype}
+
+The \type{mp_file_finder} receives an \type{int} argument that is one of the following types:
+
+\starttabulate[|l|p|]
+\NC mp_filetype_program \NC Metapost language code (r)\NC \NR
+\NC mp_filetype_log \NC Log output (w)\NC \NR
+\NC mp_filetype_postscript \NC PostScript or SVG output (w)\NC \NR
+\NC mp_filetype_bitmap \NC PNG output (w)\NC \NR
+\NC mp_filetype_metrics \NC \TeX\ font metric file (r+w)\NC \NR
+\NC mp_filetype_fontmap \NC Font map file (r)\NC \NR
+\NC mp_filetype_font \NC Font PFB file (r)\NC \NR
+\NC mp_filetype_encoding \NC Font encoding file (r)\NC \NR
+\NC mp_filetype_text \NC \type{readfrom} and \type{write} files (r+w)\NC \NR
+\stoptabulate
+
+\cenumeration{mp_interaction_mode}
+
+When \type{noninteractive} is zero, \MPLIB\ normally starts in a mode where it reports every error,
+stops and asks the user for input. This initial mode can be overruled by using one of the following:
+
+\starttabulate[|l|p|]
+\NC mp_batch_mode \NC as with \type{batchmode} \NC \NR
+\NC mp_nonstop_mode \NC as with \type{nonstopmode} \NC \NR
+\NC mp_scroll_mode \NC as with \type{scrollmode} \NC \NR
+\NC mp_error_stop_mode \NC as with \type{errorstopmode} \NC \NR
+\stoptabulate
+
+\cenumeration{mp_math_mode}
+
+\starttabulate[|l|p|]
+\NC mp_math_scaled_mode \NC uses scaled point data for numerical values \NC \NR
+\NC mp_math_double_mode \NC uses IEEE double floating point data for numerical values \NC \NR
+\NC mp_math_binary_mode \NC not used yet. \NC \NR
+\NC mp_math_decimal_mode \NC not used yet. \NC \NR
+\stoptabulate
+
+\cenumeration{mp_history_state}
+
+These are set depending on the current state of the interpreter.
+
+\starttabulate[|l|p|]
+\NC mp_spotless \NC still clean as a whistle \NC \NR
+\NC mp_warning_issued \NC a warning was issued or something was \type{show}-ed \NC \NR
+\NC mp_error_message_issued \NC an error has been reported \NC \NR
+\NC mp_fatal_eror_stop \NC termination was premature due to error(s) \NC \NR
+\NC mp_system_error_stop \NC termination was premature due to disaster
+ (out of system memory) \NC \NR
+\stoptabulate
+
+
+\cenumeration{mp_color_model}
+
+Graphical objects always have a color model attached to them.
+
+\starttabulate[|l|p|]
+\NC mp_no_model \NC as with \type{withoutcolor} \NC \NR
+\NC mp_grey_model \NC as with \type{withgreycolor} \NC \NR
+\NC mp_rgb_model \NC as with \type{withrgbcolor} \NC \NR
+\NC mp_cmyk_model \NC as with \type{withcmykcolor} \NC \NR
+\stoptabulate
+
+
+\cenumeration{mp_graphical_object_code}
+
+There are eight different graphical object types.
+
+\starttabulate[|l|p|]
+\NC mp_fill_code \NC \type{addto contour} \NC \NR
+\NC mp_stroked_code \NC \type{addto doublepath} \NC \NR
+\NC mp_text_code \NC \type{addto also} (via \type{infont})\NC \NR
+\NC mp_start_clip_code \NC \type{clip} \NC \NR
+\NC mp_start_bounds_code \NC \NC \NR
+\NC mp_stop_clip_code \NC \type{setbounds} \NC \NR
+\NC mp_stop_bounds_code \NC \NC \NR
+\NC mp_special_code \NC \type{special} \NC \NR
+\stoptabulate
+
+
+\subsection{Functions}
+
+\cfunction{char *}{mp_metapost_version}{(void)}
+
+Returns a copy of the \MPLIB\ version string.
+
+\cfunction{MP_options *}{mp_options}{(void)}
+
+Returns a properly initialized option structure, or \type{NULL} in case of allocation errors.
+
+\cfunction{MP }{mp_initialize}{(MP_options *opt)}
+
+Returns a pointer to a new \MPLIB\ instance, or \type{NULL} if initialisation failed.
+
+String options are copied, so you can free any of those (and the \type{opt} structure)
+immediately after the call to this function.
+
+\cfunction{int }{mp_status}{(MP mp)}
+
+Returns the current value of the interpreter error state, as a \type{mp_history_state}.
+This function is useful after \type{mp_initialize}.
+
+\cfunction{boolean }{mp_finished}{(MP mp)}
+
+Returns the current value of \type{mp->finished}.
+This function is useful to check if \type{mp_execute} will execute the string, because
+if \type{mp->finished} is \type{true} it will return after resetting the streams.
+
+
+
+\cfunction{int }{mp_run}{(MP mp)}
+
+Runs the \MPLIB\ instance using the \type{command_line} and other items from the
+\type{MP_options}. After the call to \type{mp_run}, the \MPLIB\ instance should be
+closed off by calling \type{mp_finish}.
+
+The return value is the current \type{mp_history_state}
+
+\cfunction{void *}{mp_userdata}{(MP mp)}
+
+Simply returns the pointer that was passed along as \type{userdata} in
+the \type{MP_options} struct.
+
+\cfunction{int }{mp_troff_mode}{(MP mp)}
+
+Returns the value of \type{troff_mode} as copied from the
+\type{MP_options} struct.
+
+\cfunction{mp_run_data *}{mp_rundata}{(MP mp)}
+
+Returns the information collected during the previous call to \type{mp_execute}.
+
+\cfunction{int }{mp_execute}{(MP mp, char *s, size_t l)}
+
+Executes string \type{s} with length \type{l} in the \MPLIB\
+instance. This call can be repeated as often as is needed. The return
+value is the current \type{mp_history_state}. To get at the produced
+results, call \type {mp_rundata}.
+
+\cfunction{void }{mp_finish}{(MP mp)}
+
+This finishes off the use of the \MPLIB\ instance: it closes all files
+and frees all the memory allocated by this instance.
+
+\cfunction{double }{mp_get_char_dimension}{(MP mp,char*fname,int n,int t)}
+
+This is a helper function that returns one of the dimensions of glyph
+\type{n} in font \type{fname} as a double in PostScript (AFM)
+units. The requested item \type{t} can be \type{'w'} (width),
+\type{'h'} (height), or \type{'d'} (depth).
+
+\cfunction{int }{mp_memory_usage}{(MP mp)}
+
+Returns the current memory usage of this instance.
+
+\cfunction{int }{mp_hash_usage}{(MP mp)}
+
+Returns the current hash usage of this instance.
+
+\cfunction{int }{mp_param_usage}{(MP mp)}
+
+Returns the current simultaneous macro parameter usage of this instance.
+
+\cfunction{int }{mp_open_usage}{(MP mp)}
+
+Returns the current \type{input} levels of this instance.
+
+\section{C API for path and knot manipulation}
+
+\subsection{Enumerations}
+
+\cenumeration{mp_knot_type}
+
+Knots can have left and right types depending on their current
+status. By the time you see them in the output, they are usually
+either \type{mp_explicit} or \type{mp_endpoint}, but here is the full
+list:
+
+\starttabulate[|l|p|]
+\NC mp_endpoint \NC \NC \NR
+\NC mp_explicit \NC \NC \NR
+\NC mp_given \NC \NC \NR
+\NC mp_curl \NC \NC \NR
+\NC mp_open \NC \NC \NR
+\NC mp_end_cycle \NC \NC \NR
+\stoptabulate
+
+\cenumeration{mp_knot_originator}
+
+Knots can originate from two sources: they can be explicitly given by
+the user, or they can be created by the \MPLIB\ program code (for
+example as result of the \type{makepath} operator).
+
+\starttabulate[|l|p|]
+\NC mp_program_code \NC \NC \NR
+\NC mp_metapost_user \NC \NC \NR
+\stoptabulate
+
+
+\subsection{Structures}
+
+\ctypedef {}{mp_number}{}
+
+Numerical values are represented by opaque structure pointers named \type{mp_number}.
+
+\ctypedef {}{mp_knot}{}
+
+Each \MPLIB\ path (a sequence of \MP\ points) is represented as a linked list
+of structure pointers of the type \type{mp_knot}.
+
+\starttabulate[|l|l|p|]
+\NC mp_knot \NC next \NC the next knot, or NULL\NC \NR
+\NC mp_knot_type \NC data.types.left_type \NC the \type{mp_knot_type} for the left side \NC \NR
+\NC mp_knot_type \NC data.types.right_type \NC the \type{mp_knot_type} for the right side \NC \NR
+\NC mp_number \NC x_coord \NC $x$\NC \NR
+\NC mp_number \NC y_coord \NC $y$\NC \NR
+\NC mp_number \NC left_x \NC $x$ of the left (incoming) control point\NC \NR
+\NC mp_number \NC left_y \NC $y$ of the left (incoming) control point\NC \NR
+\NC mp_number \NC right_x \NC $x$ of the right (outgoing) control point\NC \NR
+\NC mp_number \NC right_y \NC $y$ of the right (outgoing) control point\NC \NR
+\NC mp_knot_originator \NC originator \NC the \type{mp_knot_originator} \NC \NR
+\stoptabulate
+
+Paths are always represented as a circular list. The difference between cyclic and
+non-cyclic paths is indicated by their \type{mp_knot_type}.
+
+While the fields of the knot structure are in fact accessible, it is better to use
+the access functions below as the internal structure tends to change.
+
+\subsection{Functions for accessing knot data}
+
+\cfunction{mp_number}{mp_knot_x_coord}{(MP mp,mp_knot p)}
+Access the $x$ coordinate of the knot.
+\cfunction{mp_number}{mp_knot_y_coord}{(MP mp,mp_knot p)}
+Access the $y$ coordinate of the knot.
+\cfunction{mp_number}{mp_knot_left_x}{(MP mp,mp_knot p)}
+Access the $x$ coordinate of the left control point of the knot.
+\cfunction{mp_number}{mp_knot_left_y}{(MP mp,mp_knot p)}
+Access the $y$ coordinate of the left control point of the knot.
+\cfunction{mp_number}{mp_knot_right_x}{(MP mp,mp_knot p)}
+Access the $x$ coordinate of the right control point of the knot.
+\cfunction{mp_number}{mp_knot_right_y}{(MP mp,mp_knot p)}
+Access the $y$ coordinate of the right control point of the knot.
+\cfunction{int}{mp_knot_left_type}{(MP mp,mp_knot p)}
+Access the type of the knot on the left side.
+\cfunction{int}{mp_knot_right_type}{(MP mp,mp_knot p)}
+Access the type of the knot on the right side.
+\cfunction{mp_knot}{mp_knot_next}{(MP mp,mp_knot p)}
+Access the pointer to the next knot.
+\cfunction{mp_number}{mp_knot_left_curl}{(MP mp,mp_knot p)}
+Access the left curl of the knot (applies to unresolved knots, see below).
+\cfunction{mp_number}{mp_knot_left_given}{(MP mp,mp_knot p)}
+Access the left given value of the knot (applies to unresolved knots, see below).
+\cfunction{mp_number}{mp_knot_left_tension}{(MP mp,mp_knot p)}
+Access the left tension of the knot (applies to unresolved knots, see below).
+\cfunction{mp_number}{mp_knot_right_curl}{(MP mp,mp_knot p)}
+Access the right curl value of the knot (applies to unresolved knots, see below).
+\cfunction{mp_number}{mp_knot_right_given}{(MP mp,mp_knot p)}
+Access the right given value of the knot (applies to unresolved knots, see below).
+\cfunction{mp_number}{mp_knot_right_tension}{(MP mp,mp_knot p)}
+Access the right tension value of the knot (applies to unresolved knots, see below).
+
+\cfunction{double}{mp_number_as_double}{(MP mp,mp_number n)}
+
+Converts an \type{mp_number} to \type{double}.
+
+\subsection{Functions for creating and modifying knot data}
+
+\cfunction{mp_knot}{mp_create_knot}{(MP mp)}
+
+Allocates and returns a new knot. Returns \type{NULL} on (malloc) failure.
+
+\cfunction{int}{mp_set_knot}{(MP mp,mp_knot p,double x,double y)}
+
+Fills in the coordinate of knot \type{p}. \type{x1} and \type{y1} values should be
+within the proper range for the current numerical mode.
+Return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_close_path}{(MP mp,mp_knot p,mp_knot q)}
+
+Connects \type{p} and \type{q} using an \quote{endpoint join}, where \type{p} is the last knot
+of the path, and \type{q} is the first knot. The right tension of \type{p} and the
+left tension of \type{q} are (re)set to the default of 1.0.
+
+Because all knot list data structures are always circular, this is needed to end the path
+properly even if the path is not intended cyclic (or use \type{mp_close_path_cycle()},
+if it is indeed a cycle).
+Return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_close_path_cycle}{(MP mp,mp_knot p,mp_knot q)}
+
+Connects \type{p} and \type{q} using an \quote{open join}, where \type{p} is the last knot
+of the path, and \type{q} is the first knot. The right tension of \type{p} and the
+left tension of \type{q} are (re)set to the default of 1.0.
+
+This is needed to mimic metapost's \type{cycle}.
+return 1 on success, 0 on failure.
+
+\cfunction{mp_knot}{mp_append_knot}{(MP mp,mp_knot p,double x,double y)}
+
+Appends a knot to previous knot \type{q}, and returns the new knot.
+This is a convenience method combining \type{mp_create_knot()}, \type{mp_set_knot()}, and
+(if \type{q} is not NULL) \type{mp_close_path_cycle()}.
+Returns NULL on failure.
+
+\cfunction{int}{mp_set_knot_left_curl}{(MP mp,mp_knot q,double value)}
+
+Sets the left curl value for a knot.
+\type{fabs(value)} should be less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knot_right_curl}{(MP mp,mp_knot q,double value)}
+
+Sets the right curl value for a knot.
+\type{fabs(value)} should be less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knot_curl}{(MP mp,mp_knot q,double value)}
+
+Sets the curl value for a knot.
+\type{fabs(value)} should be less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knotpair_curls}{(MP mp,mp_knot p,mp_knot q,double t1,double t2)}
+
+A convenience method that calls \type{mp_set_knot_curl(mp,p,t1)} and \type{mp_set_knot_curl(mp,q,t2)}
+return 1 if both succeed, 0 otherwise.
+
+\cfunction{int}{mp_set_knot_direction}{(MP mp,mp_knot q,double x,double y)}
+
+Sets the direction \type{{x,y}} value for a knot.
+\type{fabs(x)} and \type{fabs(y)} should be less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knotpair_directions}{(MP mp,mp_knot p,mp_knot q,double x1,double y1,double x2,double y2)}
+
+A convenience method that calls
+\type{mp_set_knot_direction(mp,p,x1,y1)} and \type{mp_set_knot_direction(mp,p,x2,y2)}
+return 1 if both succeed, 0 otherwise.
+
+\cfunction{int}{mp_set_knotpair_tensions}{(MP mp,mp_knot p,mp_knot q,double t1,double t2)}
+
+Sets the tension specifiers for a pair of connected knots.
+\type{fabs(t1)} and \type{fabs(t2)} should be more than 0.75 and less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knot_left_tension}{(MP mp, mp_knot p, double t1)}
+
+Set the left tension of a knot. \type{fabs(t1)} should be more than 0.75 and less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knot_right_tension}{(MP mp, mp_knot p, double t1)}
+
+Set the right tension of a knot. \type{fabs(t1)} should be more than 0.75 and less than 4096.0
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knot_left_control}{(MP mp, mp_knot p, double x1, double y1)}
+\cfunction{int}{mp_set_knot_right_control}{(MP mp, mp_knot p, double x1, double y1)}
+
+Sets explicit left or right control for a knot. \type{x1} and \type{y1} values should be
+within the proper range for the current numerical mode.
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_set_knotpair_controls}{(MP mp,mp_knot p,mp_knot q,double x1,double y1,double x2,double y2)}
+
+Sets explicit controls for a knot pair. All four \type{x} and \type{y} values should be
+within the proper range for the current numerical mode.
+return 1 on success, 0 on failure.
+
+\cfunction{int}{mp_solve_path}{(MP mp,mp_knot first)}
+
+Finds explicit controls for the knot list at \type{first}, which
+is changed in-situ. Returns 0 if there was any kind of error, in which
+case \type{first} is unmodified. There can be quite a set of potential errors,
+mostly harmless processing errors.
+However, be aware that it is also possible that there are internal mplib
+memory allocation errors. A distinction between those can not be made
+at the moment.
+Return 1 on success, 0 on failure.
+
+\cfunction{void}{mp_free_path}{(MP mp,mp_knot p)}
+
+Frees the memory of a path.
+
+\subsection{Example usage}
+
+Since the above function list is quite dry and not that easy to grasp,
+here are two examples of how to use it. First a simple example
+(\type{mp_dump_path()} code is given below).
+
+
+\starttyping
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mplib.h"
+
+int main (int argc, char ** argv) {
+ MP mp ;
+ mp_knot p, first, q;
+ MP_options * opt = mp_options () ;
+ opt -> command_line = NULL;
+ opt -> noninteractive = 1 ;
+ mp = mp_initialize ( opt ) ;
+ if ( ! mp ) exit ( EXIT_FAILURE ) ;
+
+ /* Equivalent Metapost code:
+
+ path p;
+ p := (0,0)..(10,10)..(10,-5)..cycle;
+
+ */
+ first = p = mp_append_knot(mp,NULL,0,0);
+ if ( ! p ) exit ( EXIT_FAILURE ) ;
+ q = mp_append_knot(mp,p,10,10);
+ if ( ! q ) exit ( EXIT_FAILURE ) ;
+ p = mp_append_knot(mp,q,10,-5);
+ if ( ! p ) exit ( EXIT_FAILURE ) ;
+ mp_close_path_cycle(mp, p, first);
+ /* mp_dump_path(mp, first); */
+ if (mp_solve_path(mp, first)) {
+ /* mp_dump_path(mp, first); */
+ }
+ mp_free_path(mp, first);
+ mp_finish ( mp ) ;
+ free(opt);
+ return 0;
+}
+\stoptyping
+
+For some more challenging path input, here is a more elaborate
+example of the path processing code:
+
+\starttyping
+ /* Equivalent Metapost code:
+
+ path p;
+ p := (0,0)..
+ (2,20)--
+ (10, 5)..controls (2,2) and (9,4.5)..
+ (3,10)..tension 3 and atleast 4 ..
+ (1,14){2,0} .. {0,1}(5,-4);
+ */
+ first = p = mp_append_knot(mp,NULL,0,0);
+ q = mp_append_knot(mp,p,2,20);
+ p = mp_append_knot(mp,q,10,5);
+ if (!mp_set_knotpair_curls(mp, q,p, 1.0, 1.0))
+ exit ( EXIT_FAILURE ) ;
+ q = mp_append_knot(mp,p,3,10);
+ if (!mp_set_knotpair_controls(mp, p,q, 2.0, 2.0, 9.0, 4.5))
+ exit ( EXIT_FAILURE ) ;
+ p = mp_append_knot(mp,q,1,14);
+ if (!mp_set_knotpair_tensions(mp,q,p, 3.0, -4.0))
+ exit ( EXIT_FAILURE ) ;
+ q = mp_append_knot(mp,p,5,-4);
+ if (!mp_set_knotpair_directions(mp, p,q, 2.0, 0.0, 0.0, 1.0))
+ exit ( EXIT_FAILURE ) ;
+
+ mp_close_path(mp, q, first);
+
+ /* mp_dump_path(mp, first); */
+ if (mp_solve_path(mp, first)) {
+ /* mp_dump_path(mp, first); */
+ }
+ mp_free_path(mp, first);
+\stoptyping
+
+And here is the source code for the \type{mp_dump_path} function,
+which produces path output that is similar to Metapost's
+\type{tracingchoices} report.
+
+\starttyping
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mplib.h"
+
+#define ROUNDED_ZERO(v) (fabs((v))<0.00001 ? 0 : (v))
+#define PI 3.1415926535897932384626433832795028841971
+#define RADIANS(a) (mp_number_as_double(mp,(a)) / 16.0) * PI/180.0
+
+void mp_dump_path (MP mp, mp_knot h) {
+ mp_knot p, q;
+ if (h == NULL) return;
+ p = h;
+ do {
+ q=mp_knot_next(mp,p);
+ if ( (p==NULL)||(q==NULL) ) {
+ printf("\n???");
+ return; /* this won't happen */
+ }
+ printf ("(%g,%g)", mp_number_as_double(mp,mp_knot_x_coord(mp,p)),
+ mp_number_as_double(mp,mp_knot_y_coord(mp,p)));
+ switch (mp_knot_right_type(mp,p)) {
+ case mp_endpoint:
+ if ( mp_knot_left_type(mp,p)==mp_open ) printf("{open?}");
+ if ( (mp_knot_left_type(mp,q)!=mp_endpoint)||(q!=h) )
+ q=NULL; /* force an error */
+ goto DONE;
+ break;
+ case mp_explicit:
+ printf ("..controls (%g,%g)",
+ mp_number_as_double(mp,mp_knot_right_x(mp,p)),
+ mp_number_as_double(mp,mp_knot_right_y(mp,p)));
+ printf(" and ");
+ if ( mp_knot_left_type(mp,q)!=mp_explicit ) {
+ printf("??");
+ } else {
+ printf ("(%g,%g)",mp_number_as_double(mp,mp_knot_left_x(mp,q)),
+ mp_number_as_double(mp,mp_knot_left_y(mp,q)));
+ }
+ goto DONE;
+ break;
+ case mp_open:
+ if ( (mp_knot_left_type(mp,p)!=mp_explicit)
+ &&
+ (mp_knot_left_type(mp,p)!=mp_open) ) {
+ printf("{open?}");
+ }
+ break;
+ case mp_curl:
+ case mp_given:
+ if ( mp_knot_left_type(mp,p)==mp_open )
+ printf("??");
+ if ( mp_knot_right_type(mp,p)==mp_curl ) {
+ printf("{curl %g}", mp_number_as_double(mp,mp_knot_right_curl(mp,p)));
+ } else {
+ double rad = RADIANS(mp_knot_right_curl(mp,p));
+ double n_cos = ROUNDED_ZERO(cos(rad)*4096);
+ double n_sin = ROUNDED_ZERO(sin(rad)*4096);
+ printf("{%g,%g}", n_cos, n_sin);
+ }
+ break;
+ }
+ if ( mp_knot_left_type(mp,q)<=mp_explicit ) {
+ printf("..control?"); /* can't happen */
+ } else if ((mp_number_as_double(mp,mp_knot_right_tension(mp,p))!=(1.0))||
+ (mp_number_as_double(mp,mp_knot_left_tension(mp,q)) !=(1.0))) {
+ printf("..tension ");
+ if ( mp_number_as_double(mp,mp_knot_right_tension(mp,p))<0.0 )
+ printf("atleast ");
+ printf("%g", fabs(mp_number_as_double(mp,mp_knot_right_tension(mp,p))));
+ if (mp_number_as_double(mp,mp_knot_right_tension(mp,p)) !=
+ mp_number_as_double(mp,mp_knot_left_tension(mp,q))) {
+ printf(" and ");
+ if (mp_number_as_double(mp,mp_knot_left_tension(mp,q))< 0.0)
+ printf("atleast ");
+ printf("%g", fabs(mp_number_as_double(mp,mp_knot_left_tension(mp,q))));
+ }
+ }
+ DONE:
+ p=q;
+ if ( p!=h || mp_knot_left_type(mp,h)!=mp_endpoint) {
+ printf ("\n ..");
+ if ( mp_knot_left_type(mp,p) == mp_given ) {
+ double rad = RADIANS(mp_knot_left_curl(mp,p));
+ double n_cos = ROUNDED_ZERO(cos(rad)*4096);
+ double n_sin = ROUNDED_ZERO(sin(rad)*4096);
+ printf("{%g,%g}", n_cos, n_sin);
+ } else if ( mp_knot_left_type(mp,p) ==mp_curl ){
+ printf("{curl %g}", mp_number_as_double(mp,mp_knot_left_curl(mp,p)));
+ }
+ }
+ } while (p!=h);
+ if ( mp_knot_left_type(mp,h)!=mp_endpoint )
+ printf("cycle");
+ printf (";\n");
+}
+\stoptyping
+
+The above function is much complicated because of all the knot type
+cases that can only happen {\it before} \type{mp_solve_path()} is
+called. A version that only prints processed paths and is less
+scared of using direct field access would be much shorter:
+
+\starttyping
+void mp_dump_solved_path (MP mp, mp_knot h) {
+ mp_knot p, q;
+ if (h == NULL) return;
+ p = h;
+ do {
+ q=mp_knot_next(mp,p);
+ printf ("(%g,%g)..controls (%g,%g) and (%g,%g)",
+ mp_number_as_double(mp,p->x_coord),
+ mp_number_as_double(mp,p->y_coord),
+ mp_number_as_double(mp,p->right_x),
+ mp_number_as_double(mp,p->right_y),
+ mp_number_as_double(mp,q->left_x),
+ mp_number_as_double(mp,q->left_y));
+ p=q;
+ if ( p!=h || h->data.types.left_type!=mp_endpoint) {
+ printf ("\n ..");
+ }
+ } while (p!=h);
+ if ( h->data.types.left_type!=mp_endpoint )
+ printf("cycle");
+ printf (";\n");
+}
+\stoptyping
+
+\page
+\section{C API for graphical backend functions}
+\bookmark{C API for graphical backend functions}
+
+These are all defined in \type{mplibps.h}
+
+\subsection{Structures}
+
+The structures in this section are used by the items in the body of
+the \type{edges} field of an \type{mp_rundata} structure. They are
+presented here in a bottom-up manner.
+
+\ctypedef {}{mp_gr_knot}{}
+
+These are like \type{mp_knot}, except that all \type{mp_number} values
+have been simplified to \type{double}.
+
+\ctypedef {}{mp_color}{}
+
+The graphical object that can be colored, have two fields to define
+the color: one for the color model and one for the color values. The
+structure for the color values is defined as follows:
+
+\starttabulate[|l|l|p|]
+\NC double \NC a_val \NC see below\NC \NR
+\NC double \NC b_val \NC --\NC \NR
+\NC double \NC c_val \NC --\NC \NR
+\NC double \NC d_val \NC --\NC \NR
+\stoptabulate
+
+All graphical objects that have \type{mp_color} fields also have
+\type{mp_color_model} fields. The color model decides the meaning of
+the four data fields:
+
+\starttabulate[|l|c|c|c|c|]
+\NC color model value \NC a_val \NC b_val \NC c_val \NC d_val \NC \FR
+\NC mp_no_model \NC -- \NC -- \NC -- \NC -- \NC \NR
+\NC mp_grey_model \NC grey \NC -- \NC -- \NC -- \NC \NR
+\NC mp_rgb_model \NC red \NC green \NC blue \NC \NC \NR
+\NC mp_cmyk_model \NC cyan \NC magenta \NC yellow\NC black \NC \NR
+\stoptabulate
+
+\ctypedef {}{mp_dash_object}{}
+
+Dash lists are represented like this:
+
+\starttabulate[|l|l|p|]
+\NC double * \NC array \NC an array of dash lengths, terminated by $-1$.\NC \NR
+\NC double \NC offset\NC the dash array offset (as in PostScript) \NC \NR
+\stoptabulate
+
+\ctypedef {}{mp_graphic_object}{}
+
+Now follow the structure definitions of the objects that can appear
+inside a figure (this is called an \quote{edge structure} in the
+internal WEB documentation).
+
+There are eight different graphical object types, but there are seven
+different C structures. Type \type{mp_graphic_object} represents the
+base line of graphical object types. It has only two fields:
+
+\starttabulate[|l|l|p|]
+\NC mp_graphical_object_code \NC type \NC \NC \NR
+\NC struct mp_graphic_object * \NC next \NC next object or NULL \NC \NR
+\stoptabulate
+
+Because every graphical object has at least these two fields, the body
+of a picture is represented as a linked list of
+\type{mp_graphic_object} items. Each object in turn can then be
+typecast to the proper type depending on its \type{type}.
+
+The two \quote{missing} objects in the explanations below are the ones
+that match \type{mp_stop_clip_code} and \type{mp_stop_bounds_code}:
+these have no extra fields besides \type{type} and \type{next}.
+
+\ctypedef {}{mp_fill_object}{}
+
+Contains the following fields on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC char * \NC pre_script \NC this is the result of \type{withprescript} \NC \NR
+\NC char * \NC post_script \NC this is the result of \type{withpostscript}\NC \NR
+\NC mp_color \NC color \NC the color value of this object\NC \NR
+\NC mp_color_model \NC color_model \NC the color model\NC \NR
+\NC unsigned char \NC ljoin \NC the line join style; values have the same meaning
+ as in \PS: 0 for mitered, 1 for round, 2 for beveled.\NC \NR
+\NC mp_gr_knot \NC path_p \NC the (always cyclic) path\NC \NR
+\NC mp_gr_knot \NC htap_p \NC a possible reversed path (see below)\NC \NR
+\NC mp_gr_knot \NC pen_p \NC a possible pen (see below)\NC \NR
+\NC double \NC miterlim \NC the miter limit\NC \NR
+\stoptabulate
+
+Even though this object is called an \type{mp_fill_object}, it can be the result of both
+\type{fill} and \type{filldraw} in the \MP\ input. This means that there can be a pen
+involved as well. The final output should behave as follows:
+
+\startitemize
+\item If there is no \type{pen_p}; simply fill \type{path_p}.
+\item If there is a one-knot pen (\type{pen_p->next} = \type{pen_p}) then fill \type{path_p}
+and also draw \type{path_p} with the \type{pen_p}. Do not forget to take \type{ljoin} and
+\type{miterlim} into account when drawing with the pen.
+\item If there is a more complex pen (\type{pen_p->next} != \type{pen_p}) then its path
+has already been preprocessed for you: \type{path_p} and \type{htap_p} already incorporate
+its shape.
+\stopitemize
+
+\ctypedef {}{mp_stroked_object}{}
+
+Contains the following fields on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC char * \NC pre_script \NC this is the result of \type{withprescript} \NC \NR
+\NC char * \NC post_script \NC this is the result of \type{withpostscript} \NC \NR
+\NC mp_color \NC color \NC color value \NC \NR
+\NC mp_color_model \NC color_model \NC color model \NC \NR
+\NC unsigned char \NC ljoin \NC the line join style \NC \NR
+\NC unsigned char \NC lcap \NC the line cap style; values have the same meaning
+ as in \PS: 0 for butt ends, 1 for round ends, 2 for projecting ends.\NC \NR
+\NC mp_gr_knot \NC path_p \NC the path \NC \NR
+\NC mp_gr_knot \NC pen_p \NC the pen \NC \NR
+\NC double \NC miterlim \NC miter limit \NC \NR
+\NC mp_dash_object * \NC dash_p \NC a possible dash list\NC \NR
+\stoptabulate
+
+\ctypedef {}{mp_text_object}{}
+
+Contains the following fields on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC char * \NC pre_script \NC this is the result of \type{withprescript}\NC \NR
+\NC char * \NC post_script\NC this is the result of \type{withpostscript}\NC \NR
+\NC mp_color \NC color \NC color value \NC \NR
+\NC mp_color_model \NC color_model\NC color model \NC \NR
+\NC char * \NC text_p \NC string to be placed \NC \NR
+\NC char * \NC font_name \NC the \MP\ font name\NC \NR
+\NC double \NC font_dsize \NC size of the font\NC \NR
+\NC double \NC width \NC width of the picture resulting from the string\NC \NR
+\NC double \NC height \NC height\NC \NR
+\NC double \NC depth \NC depth\NC \NR
+\NC double \NC tx \NC transformation component\NC \NR
+\NC double \NC ty \NC transformation component\NC \NR
+\NC double \NC txx \NC transformation component\NC \NR
+\NC double \NC tyx \NC transformation component\NC \NR
+\NC double \NC txy \NC transformation component\NC \NR
+\NC double \NC tyy \NC transformation component\NC \NR
+\stoptabulate
+
+All fonts are loaded by \MPLIB\ at the design size (but not all fonts have the same design
+size). If text is to be scaled, this happens via the transformation components.
+
+\ctypedef {}{mp_clip_object}{}
+
+Contains the following field on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC mp_gr_knot \NC path_p \NC defines the clipping path that is in effect until
+ the object with the matching \type{mp_stop_clip_code} is encountered\NC \NR
+\stoptabulate
+
+\ctypedef {}{mp_bounds_object}{}
+
+Contains the following field on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC mp_gr_knot \NC path_p \NC the path that was used for boundary calculation \NC \NR
+\stoptabulate
+
+This object can be ignored when output is generated, it only has effect on the boudingbox
+of the following objects and that has been taken into account already.
+
+\ctypedef {}{mp_special_object}{}
+
+This represents the output generated by a \MP\ \type{special} command. It
+contains the following field on top of the ones defined by \type{mp_graphic_object}:
+
+\starttabulate[|l|l|p|]
+\NC char *\NC pre_script \NC the special string\NC \NR
+\stoptabulate
+
+Each \type{special} command generates one object. All of the relevant
+\type{mp_special_object}s for a figure are linked together at the start
+of that figure.
+
+\ctypedef {}{mp_edge_object}{}
+
+\starttabulate[|l|l|p|]
+\NC mp_edge_object * \NC next \NC points to the next figure (or NULL)\NC \NR
+\NC mp_graphic_object * \NC body \NC a linked list of objects in this figure \NC \NR
+\NC char * \NC filename \NC this would have been the used filename if a \PS\ file
+ would have been generated\NC \NR
+\NC MP \NC parent \NC a pointer to the instance that created
+ this figure\NC \NR
+\NC double \NC minx \NC lower-left $x$ of the bounding box\NC \NR
+\NC double \NC miny \NC lower-left $y$ of the bounding box\NC \NR
+\NC double \NC maxx \NC upper right $x$ of the bounding box\NC \NR
+\NC double \NC maxy \NC upper right $y$ of the bounding box\NC \NR
+\NC double \NC width \NC value of \type{charwd};
+this would become the \TFM\ width (but without the potential rounding correction for \TFM\ file format)\NC \NR
+\NC double \NC height \NC similar for height (\type{charht})\NC \NR
+\NC double \NC depth \NC similar for depth (\type{chardp})\NC \NR
+\NC double \NC ital_corr \NC similar for italic correction (\type{charic})\NC \NR
+\NC int \NC charcode \NC Value of \type{charcode} (rounded, but not
+ modulated for \TFM's 256 values yet)\NC \NR
+\stoptabulate
+
+\subsection{Functions}
+
+\cfunction{int }{mp_ps_ship_out}{(mp_edge_object*hh,int prologues,int procset)}
+
+If you have an \type{mp_edge_object}, you can call this function. It will
+generate the \PS\ output for the figure and save it internally. A subsequent call to
+\type{mp_rundata} will find the generated text in the \type{ship_out} field.
+
+Returns zero for success.
+
+\cfunction{int }{mp_svg_ship_out}{(mp_edge_object*hh,int prologues)}
+
+If you have an \type{mp_edge_object}, you can call this function. It will
+generate the \SVG\ output for the figure and save it internally. A subsequent call to
+\type{mp_rundata} will find the generated text in the \type{ship_out} field.
+
+Returns zero for success.
+
+
+\cfunction{int }{mp_png_ship_out}{(mp_edge_object*hh, char *options)}
+
+If you have an \type{mp_edge_object}, you can call this function. It will
+generate the \PNG\ bitmap for the figure and save it internally. A subsequent call to
+\type{mp_rundata} will find the generated data in the \type{ship_out} field.
+
+Note: the \type{options} structure follows the same syntax as in the Metapost language,
+and can be NULL.
+
+Returns zero for success.
+
+
+\cfunction{void }{mp_gr_toss_objects}{(mp_edge_object*hh)}
+
+This frees a single \type{mp_edge_object} and its \type{mp_graphic_object} contents.
+
+\cfunction{void }{mp_gr_toss_object}{(mp_graphic_object*p)}
+
+This frees a single \type{mp_graphic_object} object.
+
+\cfunction{mp_graphic_object *}{mp_gr_copy_object}{(MP mp,mp_graphic_object*p)}
+
+This creates a deep copy of a \type{mp_graphic_object} object.
+
+\section{C API for label generation (a.k.a. makempx)}
+
+The following are all defined in \type{mpxout.h}.
+
+\subsection {Structures}
+
+\ctypedef {}{MPX}{}
+
+An opaque pointer that is passed on to the file_finder.
+
+\ctypedef {}{mpx_options}{}
+
+This structure holds the option fields for \type{mpx} generation.
+You have to fill in all fields except \type{mptexpre}, that
+one defaults to \type{mptexpre.tex}
+
+
+\starttabulate[|l|l|p|]
+\NC mpx_modes \NC mode \NC \NC \NR
+\NC char * \NC cmd \NC the command (or sequence of commands) to run\NC \NR
+\NC char * \NC mptexpre \NC prepended to the generated \TeX\ file\NC \NR
+\NC char * \NC mpname \NC input file name \NC \NR
+\NC char * \NC mpxname \NC output file name\NC \NR
+\NC char * \NC banner \NC string to be printed to the generated to-be-typeset file\NC \NR
+\NC int \NC debug \NC When nonzero, \type{mp_makempx} outputs some debug information and do not delete temp files\NC \NR
+\NC mpx_file_finder \NC find_file \NC \NC \NR
+\stoptabulate
+
+\subsection{Function prototype typedefs}
+
+\ctypedef{char * }{(*mpx_file_finder)}{ (MPX, const char*, const char*, int)}
+
+The return value is a new string indicating the disk file to be used.
+The arguments are the file name, the file mode (either \type{"r"} or \type{"w"}),
+and the file type (an \type{mpx_filetype}, see below). If the mode is \type{"w"},
+it is usually best to simply return a copy of the first argument.
+
+\subsection{Enumerations}
+
+\cenumeration{mpx_modes}
+
+\starttabulate[|l|p|]
+\NC mpx_tex_mode \NC \NC \NR
+\NC mpx_troff_mode \NC \NC \NR
+\stoptabulate
+
+\cenumeration{mpx_filetype}
+
+\starttabulate[|l|p|]
+\NC mpx_tfm_format \NC \TeX\ or Troff ffont metric file \NC \NR
+\NC mpx_vf_format \NC \TeX\ virtual font file \NC \NR
+\NC mpx_trfontmap_format \NC Troff font map \NC \NR
+\NC mpx_trcharadj_format \NC Troff character shift information \NC \NR
+\NC mpx_desc_format \NC Troff DESC file \NC \NR
+\NC mpx_fontdesc_format \NC Troff FONTDESC file \NC \NR
+\NC mpx_specchar_format \NC Troff special character definition\NC \NR
+\stoptabulate
+
+\subsection{Functions}
+
+\cfunction{int }{mpx_makempx}{(mpx_options *mpxopt)}
+
+A return value of zero is success, non-zero values indicate errors.
+
+\page
+
+\section{Lua API}
+
+The \MP\ library interface registers itself in the table \type{mplib}.
+
+\subsection{\luatex{mplib.version}}
+
+Returns the \MPLIB\ version.
+
+\starttyping
+<string> s = mplib.version()
+\stoptyping
+
+\subsection{\luatex{mplib.new}}
+
+To create a new metapost instance, call
+
+\starttyping
+<mpinstance> mp = mplib.new({...})
+\stoptyping
+
+This creates the \type{mp} instance object. The \type{mp} instance object
+always starts out in so|-|called \quote{inimp} mode, there is no
+support for preload files.
+
+The argument hash can have a number of different fields, as follows:
+
+\starttabulate[|lT|l|p|p|]
+\NC \ssbf name \NC \bf type \NC \bf description \NC \bf default \NC\NR
+\NC error_line \NC number \NC error line width \NC 79 \NC\NR
+\NC print_line \NC number \NC line length in ps output \NC 100\NC\NR
+\NC random_seed \NC number \NC the initial random seed \NC variable\NC\NR
+\NC interaction \NC string \NC the interaction mode, one of \type {batch}, \type {nonstop},
+ \type {scroll}, \type {errorstop} \NC \type {errorstop}\NC\NR
+\NC job_name \NC string \NC \type {--jobname} \NC \type {mpout} \NC\NR
+\NC math_mode \NC string \NC the number system mode, one of \type{scaled} or
+ \type{double} \NC \type {scaled} \NC\NR
+\NC find_file \NC function \NC a function to find files \NC only local files\NC\NR
+\stoptabulate
+
+The \type{find_file} function should be of this form:
+
+\starttyping
+<string> found = finder (<string> name, <string> mode, <string> type)
+\stoptyping
+
+with:
+
+\starttabulate[|lT|l|p|]
+\NC name \NC the requested file \NC \NR
+\NC mode \NC the file mode: \type {r} or \type {w} \NC \NR
+\NC type \NC the kind of file, one of: \type {mp}, \type {tfm}, \type {map}, \type {pfb}, \type {enc} \NC \NR
+\stoptabulate
+
+Return either the full pathname of the found file, or \type{nil} if
+the file cannot be found.
+
+\subsection{\luatex{mp:statistics}}
+
+You can request statistics with:
+
+\starttyping
+<table> stats = mp:statistics()
+\stoptyping
+
+This function returns the allocation statistics for an \MPLIB\
+instance. There are four fields, giving the maximum number of used
+items in each of four object classes:
+
+\starttabulate[|lT|l|p|]
+\NC memory \NC number \NC allocated memory (in bytes)\NC\NR
+\NC hash \NC number \NC hash size (in entries)\NC\NR
+\NC params \NC number \NC simultaneous macro parameters\NC\NR
+\NC open \NC number \NC input file nesting levels\NC\NR
+\stoptabulate
+
+\subsection{\luatex{mp:execute}}
+
+You can ask the \METAPOST\ interpreter to run a chunk of code by calling
+
+\starttyping
+local rettable = mp:execute('metapost language chunk')
+\stoptyping
+
+for various bits of Metapost language input. Be sure to check the
+\type{rettable.status} (see below) because when a fatal \METAPOST\
+error occurs the \MPLIB\ instance will become unusable thereafter.
+
+Generally speaking, it is best to keep your chunks small, but beware
+that all chunks have to obey proper syntax, like each of them is a
+small file. For instance, you cannot split a single statement over
+multiple chunks.
+
+In contrast with the normal standalone \type{mpost} command, there is
+{\em no\/} implied \quote{input} at the start of the first chunk.
+
+\subsection{\luatex{mp:finish}}
+
+\starttyping
+local rettable = mp:finish()
+\stoptyping
+
+If for some reason you want to stop using an \MPLIB\ instance while
+processing is not yet actually done, you can call \type{mp:finish}.
+Eventually, used memory will be freed and open files will be closed by
+the \LUA\ garbage collector, but an explicit \type{mp:finish} is the
+only way to capture the final part of the output streams.
+
+\subsection{Result table}
+
+The return value of \type{mp:execute} and \type{mp:finish} is a table
+with a few possible keys (only \type {status} is always guaranteed to be present).
+
+\starttabulate[|l|l|p|]
+\NC log \NC string \NC output to the \quote {log} stream \NC \NR
+\NC term \NC string \NC output to the \quote {term} stream \NC \NR
+\NC error \NC string \NC output to the \quote {error} stream (only used for \quote {out of memory})\NC \NR
+\NC status \NC number \NC the return value: 0=good, 1=warning, 2=errors, 3=fatal error \NC \NR
+\NC fig \NC table \NC an array of generated figures (if any)\NC \NR
+\stoptabulate
+
+When \type{status} equals~3, you should stop using this \MPLIB\ instance
+immediately, it is no longer capable of processing input.
+
+If it is present, each of the entries in the \type{fig} array is a
+userdata representing a figure object, and each of those has a number of
+object methods you can call:
+
+\starttabulate[|l|l|p|]
+\NC boundingbox \NC function \NC returns the bounding box, as an array of 4 values\NC \NR
+\NC postscript \NC function \NC return a string that is the ps output of the \type{fig} \NC \NR
+\NC svg \NC function \NC return a string that is the svg output of the \type{fig} \NC \NR
+\NC png \NC function \NC return a string that is the png output of the \type{fig} \NC \NR
+\NC objects \NC function \NC returns the actual array of graphic objects in this \type{fig} \NC \NR
+\NC copy_objects \NC function \NC returns a deep copy of the array of graphic objects in this \type{fig} \NC \NR
+\NC filename \NC function \NC the filename this \type{fig}'s \POSTSCRIPT\ output
+ would have written to in standalone mode\NC \NR
+\NC width \NC function \NC the \type{charwd} value \NC \NR
+\NC height \NC function \NC the \type{charht} value \NC \NR
+\NC depth \NC function \NC the \type{chardp} value \NC \NR
+\NC italcorr \NC function \NC the \type{charic} value \NC \NR
+\NC charcode \NC function \NC the (rounded) \type{charcode} value \NC \NR
+\stoptabulate
+
+{\bf NOTE:} you can call \type{fig:objects()} only once for any one \type{fig} object!
+
+When the boundingbox represents a \quote {negated rectangle}, i.e.\ when the first set
+of coordinates is larger than the second set, the picture is empty.
+
+Graphical objects come in various types that each have a different list of
+accessible values. The types are: \type{fill}, \type{outline}, \type{text},
+\type{start_clip}, \type{stop_clip}, \type{start_bounds}, \type{stop_bounds}, \type{special}.
+
+There is helper function (\type{mplib.fields(obj)}) to get the list of
+accessible values for a particular object, but you can just as easily
+use the tables given below).
+
+All graphical objects have a field \type{type} that gives the object
+type as a string value, that not explicit mentioned in the tables. In
+the following, \type{number}s are \POSTSCRIPT\ points represented as
+a floating point number, unless stated otherwise. Field values that
+are of \type{table} are explained in the next section.
+
+\subsubsection{fill}
+
+\starttabulate[|l|l|p|]
+\NC path \NC table \NC the list of knots \NC \NR
+\NC htap \NC table \NC the list of knots for the reversed trajectory \NC \NR
+\NC pen \NC table \NC knots of the pen \NC \NR
+\NC color \NC table \NC the object's color \NC \NR
+\NC linejoin \NC number \NC line join style (bare number)\NC \NR
+\NC miterlimit \NC number \NC miter limit\NC \NR
+\NC prescript \NC string \NC the prescript text \NC \NR
+\NC postscript \NC string \NC the postscript text \NC \NR
+\stoptabulate
+
+The entries \type{htap} and \type{pen} are optional.
+
+There is helper function (\type{mplib.pen_info(obj)}) that returns
+a table containing a bunch of vital characteristics of the used pen
+(all values are floats):
+
+\starttabulate[|l|l|p|]
+\NC width \NC number \NC width of the pen\NC \NR
+\NC rx \NC number \NC $x$ scale \NC \NR
+\NC sx \NC number \NC $xy$ multiplier \NC \NR
+\NC sy \NC number \NC $yx$ multiplier \NC \NR
+\NC ry \NC number \NC $y$ scale \NC \NR
+\NC tx \NC number \NC $x$ offset \NC \NR
+\NC ty \NC number \NC $y$ offset \NC \NR
+\stoptabulate
+
+\subsubsection{outline}
+
+\starttabulate[|l|l|p|]
+\NC path \NC table \NC the list of knots \NC \NR
+\NC pen \NC table \NC knots of the pen \NC \NR
+\NC color \NC table \NC the object's color \NC \NR
+\NC linejoin \NC number \NC line join style (bare number)\NC \NR
+\NC miterlimit \NC number \NC miter limit \NC \NR
+\NC linecap \NC number \NC line cap style (bare number)\NC \NR
+\NC dash \NC table \NC representation of a dash list\NC \NR
+\NC prescript \NC string \NC the prescript text \NC \NR
+\NC postscript \NC string \NC the postscript text \NC \NR
+\stoptabulate
+
+The entry \type{dash} is optional.
+
+\subsubsection{text}
+
+\starttabulate[|l|l|p|]
+\NC text \NC string \NC the text \NC \NR
+\NC font \NC string \NC font tfm name \NC \NR
+\NC dsize \NC number \NC font size\NC \NR
+\NC color \NC table \NC the object's color \NC \NR
+\NC width \NC number \NC \NC \NR
+\NC height \NC number \NC \NC \NR
+\NC depth \NC number \NC \NC \NR
+\NC transform \NC table \NC a text transformation \NC \NR
+\NC prescript \NC string \NC the prescript text \NC \NR
+\NC postscript \NC string \NC the postscript text \NC \NR
+\stoptabulate
+
+\subsubsection{special}
+
+\starttabulate[|l|l|p|]
+\NC prescript \NC string \NC special text \NC \NR
+\stoptabulate
+
+\subsubsection{start_bounds, start_clip}
+
+\starttabulate[|l|l|p|]
+\NC path \NC table \NC the list of knots \NC \NR
+\stoptabulate
+
+\subsubsection{stop_bounds, stop_clip}
+
+Here are no fields available.
+
+\subsection{Subsidiary table formats}
+
+\subsubsection{Paths and pens}
+
+Paths and pens (that are really just a special type of paths as far as
+\MPLIB\ is concerned) are represented by an array where each entry
+is a table that represents a knot.
+
+\starttabulate[|lT|l|p|]
+\NC left_type \NC string \NC when present: 'endpoint', but ususally absent \NC \NR
+\NC right_type \NC string \NC like \type{left_type}\NC \NR
+\NC x_coord \NC number \NC $x$ coordinate of this knot\NC \NR
+\NC y_coord \NC number \NC $y$ coordinate of this knot\NC \NR
+\NC left_x \NC number \NC $x$ coordinate of the precontrol point of this knot\NC \NR
+\NC left_y \NC number \NC $y$ coordinate of the precontrol point of this knot\NC \NR
+\NC right_x \NC number \NC $x$ coordinate of the postcontrol point of this knot\NC \NR
+\NC right_y \NC number \NC $y$ coordinate of the postcontrol point of this knot\NC \NR
+\stoptabulate
+
+There is one special case: pens that are (possibly transformed)
+ellipses have an extra string-valued key \type{type} with value
+\type{elliptical} besides the array part containing the knot list.
+
+\subsubsection{Colors}
+
+A color is an integer array with 0, 1, 3 or 4 values:
+
+\starttabulate[|l|l|p|]
+\NC 0 \NC marking only \NC no values \NC\NR
+\NC 1 \NC greyscale \NC one value in the range (0,1), \quote {black} is 0 \NC\NR
+\NC 3 \NC RGB \NC three values in the range (0,1), \quote {black} is 0,0,0 \NC\NR
+\NC 4 \NC CMYK \NC four values in the range (0,1), \quote {black} is 0,0,0,1 \NC\NR
+\stoptabulate
+
+If the color model of the internal object was \type{unitialized}, then
+it was initialized to the values representing \quote {black} in the colorspace
+\type{defaultcolormodel} that was in effect at the time of the \type{shipout}.
+
+\subsubsection{Transforms}
+
+Each transform is a six-item array.
+
+\starttabulate[|l|l|p|]
+\NC 1 \NC number \NC represents x \NC\NR
+\NC 2 \NC number \NC represents y \NC\NR
+\NC 3 \NC number \NC represents xx \NC\NR
+\NC 4 \NC number \NC represents yx \NC\NR
+\NC 5 \NC number \NC represents xy \NC\NR
+\NC 6 \NC number \NC represents yy \NC\NR
+\stoptabulate
+
+Note that the translation (index 1 and 2) comes first. This differs
+from the ordering in \POSTSCRIPT, where the translation comes last.
+
+\subsubsection{Dashes}
+
+Each \type{dash} is two-item hash, using the same model as \POSTSCRIPT\
+for the representation of the dashlist. \type{dashes} is an array of
+\quote {on} and \quote {off}, values, and \type{offset} is the phase of the pattern.
+
+\starttabulate[|l|l|p|]
+\NC dashes \NC hash \NC an array of on-off numbers \NC\NR
+\NC offset \NC number \NC the starting offset value \NC\NR
+\stoptabulate
+
+\subsection{Character size information}
+
+These functions find the size of a glyph in a defined font. The
+\type{fontname} is the same name as the argument to \type{infont};
+the \type{char} is a glyph id in the range 0 to 255; the returned
+\type{w} is in AFM units.
+
+\subsubsection{\luatex{mp.char_width}}
+
+\starttyping
+<number> w = mp.char_width(<string> fontname, <number> char)
+\stoptyping
+
+\subsubsection{\luatex{mp.char_height}}
+
+\starttyping
+<number> w = mp.char_height(<string> fontname, <number> char)
+\stoptyping
+
+\subsubsection{\luatex{mp.char_depth}}
+
+\starttyping
+<number> w = mp.char_depth(<string> fontname, <number> char)
+\stoptyping
+
+\subsection{Solving path control points}
+
+\starttyping
+<boolean> success = mp.solve_path(<table> knots, <boolean> cyclic)
+\stoptyping
+
+This modifies the \type{knots} table (which should contain an
+array of points in a path, with the substructure explained below)
+by filling in the control points. The boolean \type{cyclic} is
+used to determine whether the path should be the equivalent of
+\type{--cycle}. If the return value is \type{false}, there
+is an extra return argument containing the error string.
+
+On entry, the individual knot tables can contain the values
+mentioned above (but typically the \type{left_{x,y}} and
+\type{right_{x,y}} will be missing). \type{{x,y}_coord} are
+both required. Also, some extra values are allowed:
+\starttabulate[|lT|l|p|]
+\NC left_tension \NC number \NC A tension specifier \NC \NR
+\NC right_tension \NC number \NC like \type{left_tension}\NC \NR
+\NC left_curl \NC number \NC A curl specifier\NC \NR
+\NC right_curl \NC number \NC like \type{left_curl}\NC \NR
+\NC direction_x \NC number \NC $x$ displacement of a direction specifier\NC \NR
+\NC direction_y \NC number \NC $y$ displacement of a direction specifier\NC \NR
+\stoptabulate
+
+Note the following:
+\startitemize
+\item A knot has either a direction specifier, or a curl specifier, or a tension specification,
+ or explicit control points, with the note that tensions, curls and control points are split
+ in a left and a right side (directions apply to both sides equally).
+\item The absolute value of a tension specifier should be more than 0.75 and less than 4096.0,
+ with negative values indicating \quote{\type{atleast}}.
+\item The absolute value of a direction or curl should be less than 4096.0.
+\item If a tension, curl, or direction is specified, then existing control points will be
+ replaced by the newly computed value.
+\item Calling \type{solve_path} does not alter the used mplib instance.
+\stopitemize
+
+\stoptext
+
+
+
+
+
+
diff --git a/systems/doc/metapost/source-manual/mpman-app-legacy.tex b/systems/doc/metapost/source-manual/mpman-app-legacy.tex
new file mode 100644
index 0000000000..597ce8a5b1
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman-app-legacy.tex
@@ -0,0 +1,347 @@
+\svnInfo $Id: mpman-app-legacy.tex 2023 2014-05-21 08:47:19Z stephanhennig $
+\section{Legacy Information}
+\label{legacy}
+
+\subsection{MetaPost Versus \MF}
+\label{MPvsMF}
+
+Since the \MF\index{metafont?\MF} and MetaPost languages have so much in
+common, expert users of \MF\ will want to skip most of the explanations
+in this document and concentrate on concepts that are unique to
+MetaPost. The comparisons in this appendix are intended to help experts
+that are familiar with {\sl The\ \MF book} as well as other users that
+want to benefit from Knuth's more detailed explanations \cite{kn:c}.
+
+Since \MF\ is intended for making \TeX\ fonts, it has a number of
+primitives for generating the {\tt tfm}\index{tfm file?{\tt tfm}
+file}\index{files!tfm?{\tt tfm}} files that \TeX\ needs for character
+dimensions, spacing information, ligatures\index{ligatures} and
+kerning\index{kerning}. MetaPost can also be used for generating fonts,
+and it also has \MF's primitives for making {\tt tfm} files. These are
+listed in Table~\ref{tfmprim}. Explanations can be found in the \MF\
+documentation \cite{kn:c,kn:mf3}.
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+commands& {\tt charlist}, {\tt extensible},
+ {\tt fontdimen}, {\tt headerbyte} \\
+ & {\tt kern}, {\tt ligtable} \\ \hline
+ligtable operators& \verb!::!, \verb!=:!, \verb!=:|!, \verb!=:|>!,
+ \verb!|=:!, \verb!|=:>!, \\
+ & \verb!|=:|!, \verb!|=:|>!, \verb!|=:|>>!,
+ \verb!||:! \\ \hline
+internal variables\index{internal variables}\index{variables!internal}&
+ {\tt boundarychar}, {\tt chardp},
+ {\tt charext}, {\tt charht}, \\
+ & {\tt charic}, {\tt charwd},
+ {\tt designsize}, {\tt fontmaking} \\ \hline
+other operators& {\tt charexists} \\ \hline
+\end{tabular}
+$$
+\caption{MetaPost primitives for making {\tt tfm} files.}
+\label{tfmprim}
+\end{table}
+
+Even though MetaPost has the primitives for generating fonts, many of
+the font-making primitives and internal variables that are part of Plain
+\MF\index{metafont?\MF} are not defined in Plain MetaPost\index{Plain
+macros}. Instead, there is a separate macro package called {\tt
+mfplain}\index{mfplain?\texttt{mfplain}} that defines the macros
+required to allow MetaPost to process Knuth's Computer Modern fonts as
+shown in Table~\ref{mfponly} \cite{kn:e}. To load these macros, put
+``\verb|&mfplain|'' before the name of the input file. This can be done
+at the {\tt **} prompt after invoking the MetaPost interpreter with no
+arguments, or on a command line that looks something like
+this:\footnote{Command line syntax is system dependent. Quotes are
+needed on most Unix systems to protect special characters like
+{\tt\&}.}
+$$ \hbox{\verb|mpost '&mfplain' cmr10|} $$
+The analog of a \MF\ command line like
+$$ \hbox{\verb|mf '\mode=lowres; mag=1.2; input cmr10'|} $$
+is
+$$ \hbox{\verb|mpost '&mfplain \mode=lowres; mag=1.2; input cmr10'|} $$
+The result is a set of PostScript\index{PostScript} files, one for each
+character in the font. Some editing would be required in order to
+merge them into a downloadable Type~3 PostScript font~\cite{ad:red2}.
+
+\begin{table}[htp]
+$$
+\renewcommand{\FancyVerbFormatLine}[1]{\hbox{#1}\strut}
+\begin{tabular}{|l|} \hline
+\multicolumn 1{|c|}
+{Defined in the {\tt mfplain} package} \\ \hline
+\begin{verbatim}
+beginchar font_identifier
+blacker font_normal_shrink
+capsule_def font_normal_space
+change_width font_normal_stretch
+define_blacker_pixels font_quad
+define_corrected_pixels font_size
+define_good_x_pixels font_slant
+define_good_y_pixels font_x_height
+define_horizontal_corrected_pixels italcorr
+define_pixels labelfont
+define_whole_blacker_pixels makebox
+define_whole_pixels makegrid
+define_whole_vertical_blacker_pixels maketicks
+define_whole_vertical_pixels mode_def
+endchar mode_setup
+extra_beginchar o_correction
+extra_endchar proofrule
+extra_setup proofrulethickness
+font_coding_scheme rulepen
+font_extra_space smode
+\end{verbatim}
+ \\ \hline
+\multicolumn 1{|c|}
+{Defined as no-ops in the {\tt mfplain} package}\\ \hline
+\begin{verbatim}
+cullit proofoffset
+currenttransform screenchars
+gfcorners screenrule
+grayfont screenstrokes
+hround showit
+imagerules slantfont
+lowres_fix titlefont
+nodisplays unitpixel
+notransforms vround
+openit
+\end{verbatim}
+ \\ \hline
+\end{tabular}
+\renewcommand{\FancyVerbFormatLine}[1]{#1}
+$$
+\caption{Macros and internal variables defined only in the {\tt mfplain}
+package.}
+\label{mfponly}
+\end{table}
+
+
+\begin{table}
+\centering
+\begin{tabular}{|c|}\hline
+MetaPost primitives not found in \MF\\\hline
+\begin{minipage}[b]{.75\linewidth}\ttfamily
+\begin{multicols}{3}
+blackpart\\
+bluepart\\
+bounded\\
+btex\\
+clip\\
+clipped\\
+closefrom\\
+cmykcolor\\
+color\\
+colormodel\\
+cyanpart\\
+dashed\\
+dashpart\\
+defaultcolormodel\\
+etex\\
+filenametemplate\\
+filled\\
+fontmapfile\\
+fontmapline\\
+fontpart\\
+fontsize\\
+for within\\
+glyph of\\
+greenpart\\
+greypart\\
+hour\\
+infont\\
+jobname\\
+linecap\\
+linejoin\\
+llcorner\\
+lrcorner\\
+magentapart\\
+minute\\
+miterlimit\\
+mpprocset\\
+mpxbreak\\
+numberprecision\\
+numbersystem\\
+outputfilename\\
+outputformat\\
+outputformatoptions\\
+outputtemplate\\
+pathpart\\
+penpart\\
+prologues\\
+readfrom\\
+redpart\\
+restoreclipcolor\\
+rgbcolor\\
+setbounds\\
+stroked\\
+textpart\\
+textual\\
+tracinglostchars\\
+troffmode\\
+truecorners\\
+ulcorner\\
+urcorner\\
+verbatimtex\\
+withcmykcolor\\
+withcolor\\
+withgreyscale\\
+withoutcolor\\
+withpostscript\\
+withprescript\\
+withrgbcolor\\
+write to\\
+yellowpart
+\end{multicols}
+\end{minipage}\\\hline
+
+Variables and Macros defined only in Plain MetaPost\\\hline
+\begin{minipage}[b]{.75\linewidth}\ttfamily
+\begin{multicols}{3}
+ahangle\\
+ahlength\\
+background\\
+bbox\\
+bboxmargin\\
+beginfig\\
+beveled\\
+black\\
+blue\\
+buildcycle\\
+butt\\
+center\\
+colorpart\\
+cutafter\\
+cutbefore\\
+cuttings\\
+dashpattern\\
+defaultfont\\
+defaultpen\\
+defaultscale\\
+dotlabel\\
+dotlabels\\
+drawarrow\\
+drawdblarrow\\
+drawoptions\\
+endfig\\
+EOF\\
+evenly\\
+extra\_beginfig\\
+extra\_endfig\\
+green\\
+image\\
+label\\
+labeloffset\\
+mitered\\
+red\\
+rounded\\
+squared\\
+thelabel\\
+white
+\end{multicols}
+\end{minipage}\\\hline
+\end{tabular}
+\caption{Macros and internal variables defined in MetaPost but not \MF.}
+\label{mponly}
+\end{table}
+
+Another limitation of the {\tt mfplain} package is that certain internal
+variables from Plain \MF\index{metafont?\MF} cannot be given reasonable
+MetaPost definitions. These include {\tt displaying}, {\tt
+currentwindow}, \verb|screen_rows|, and \verb|screen_cols| which depend
+on \MF's ability to display images on the computer screen. In addition,
+\verb|pixels_per_inch| is irrelevant since MetaPost uses fixed units of
+PostScript\index{PostScript!point}\index{point!PostScript} points.
+
+The reason why some macros and internal variables\index{internal
+variables}\index{variables!internal} are not meaningful in MetaPost is
+that \MF\ primitive commands {\tt cull}, {\tt display}, {\tt
+openwindow}, {\tt numspecial} and {\tt totalweight} are not implemented
+in MetaPost. Also not implemented are a number of internal variables as
+well as the \tdescr{drawing option} {\tt withweight}. Here is a
+complete listing of the internal variables whose primitive meanings in
+\MF\ do not make sense in MetaPost:
+$$\begin{verbatim}
+autorounding fillin smoothing turningcheck
+chardx granularity tracingedges xoffset
+chardy proofing tracingpens yoffset
+\end{verbatim}
+$$
+
+There is also one \MF\ primitive that has a slightly different meaning in
+MetaPost. Both languages allow statements of the
+form\index{special?\texttt{special}}\label{Dspecl}
+$$ {\tt special}\, \descr{string expression} \hbox{\tt;} $$
+but \MF\ copies the string into its ``generic font'' output file, while
+MetaPost interprets the string as a sequence of PostScript\index{PostScript}
+commands that are to be placed at the beginning of the next output file.
+
+In this regard, it is worth mentioning that rules in \TeX\ material
+included via {\tt btex..etex} in MetaPost are rounded to the correct
+number of pixels according to PostScript\index{PostScript!conversion rules}
+conversion rules~\cite{ad:red2}. In \MF, rules are not generated
+directly, but simply included in specials and interpreted later by
+other programs, such as {\tt gftodvi}\index{gftodvi?\ttt{gftodvi}},
+so there is no special conversion.
+
+All the other differences between \MF\ and MetaPost are features found
+only in MetaPost. These are listed in Table~\ref{mponly}. The only
+commands listed in this table that the preceding sections do not discuss
+are
+\verb|extra_beginfig|\index{extra_beginfig?\texttt{extra\_beginfig}}\label{Dxbfig},
+\verb|extra_endfig|\index{extra_endfig?\texttt{extra\_endfig}}\label{Dxefig},
+and {\tt mpxbreak}. The first two are strings that contain extra
+commands to be processed by {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} and {\tt
+endfig}\index{endfig?\texttt{endfig}} just as \verb|extra_beginchar| and
+\verb|extra_endchar| are processed by {\tt beginchar} and {\tt endchar}.
+(The file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} uses these
+features).
+
+The other new feature listed in Table~\ref{mponly} not listed in the
+index is {\tt mpxbreak}\index{mpxbreak?\texttt{mpxbreak}}. This is used
+to separate blocks of translated \TeX\index{TeX?\TeX} or
+troff\index{troff} commands in {\tt mpx}\index{mpx file?{\tt mpx}
+ file}\index{files!mpx?{\tt mpx}} files. It should be of no concern to
+users since {\tt mpx} files are generated automatically.
+
+\subsection{File Name Templates}
+\label{Dfilenametemplate}
+
+The output file naming template mechanism introduced in MetaPost
+version~1.000 originally used a primitive called
+\ttindex{filenametemplate}, as opposed to the internal string variable
+\ttt{outputtemplate}\index{outputtemplate?\texttt{outputtemplate}}
+described in section~\ref{Doutputtemplate}. This primitive took a
+string argument with the same syntax as \ttt{outputtemplate}, except
+that it didn't know about the \verb|%{...}| escape sequence for
+evaluating internal variables, e.g.,:
+
+$$\begin{verbatim}
+filenametemplate "%j-%c.mps";
+\end{verbatim}
+$$
+
+The \verb|filenametemplate| primitive has been deprecated since the
+introduction of \verb|outputtemplate| (version~1.200), but is still
+supported. If you happen to need writing future-proof source files,
+that at the same time are backwards compatible to MetaPost versions
+between 1.000 and~1.200, this output filename template declaration might
+help:
+
+$$\begin{verbatim}
+if scantokens(mpversion) < 1.200:
+ filenametemplate
+else:
+ outputtemplate :=
+fi
+"%j-%c.mps";
+\end{verbatim}
+$$
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: "mpman"
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mpman-app-numbersystems.tex b/systems/doc/metapost/source-manual/mpman-app-numbersystems.tex
new file mode 100644
index 0000000000..23d3dce7cf
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman-app-numbersystems.tex
@@ -0,0 +1,98 @@
+\svnInfo $Id: mpman-app-numbersystems.tex 2023 2014-05-21 08:47:19Z stephanhennig $
+\section{High-precision arithmetic with MetaPost}
+\label{hparith}
+
+In addition to the fixed-point arithmetics inherited from \MF, MetaPost
+can also do higher-precision arithmetics. In total, MetaPost can handle
+numeric quantities in four internal representation formats or number
+systems. Number systems differ in rounding errors\index{rounding error}
+introduced by and the speed of arithmetic operations. Simply storing a
+numeric value in a variable may already introduce a rounding error, so
+that can already be considered an arithmetic operation.
+
+The internal representation format used for numeric quantities can be
+determined by a command-line switch
+\texttt{-numbersystem}\index{command-line!mpost?\texttt{mpost}!-numbersystem?\texttt{-numbersystem}}
+when invoking the MetaPost executable. Argument is a string and can be
+one of \texttt{scaled}, \texttt{double}, \texttt{binary}, or
+\texttt{decimal}. The argument is stored in an internal string variable
+\texttt{numbersystem}\index{numbersystem?\texttt{numbersystem}}\label{Dnumbersystem}.
+Assigning a value to this variable at run-time triggers an error.
+
+The \texttt{scaled}\index{scaled?\texttt{scaled}} number system refers
+to 32~bit fixed-point arithmetics described in Section~\ref{datatypes}.
+This is the default number system. Precision is ca. 10~decimal digits,
+5 digits before and after the comma. All arithmetic operations are done
+in software.
+
+The \texttt{double}\index{double?\texttt{double}} number system does
+IEEE standard floating-point arithmetics with 64~bits (or double)
+precision. In the internal representation, double floating-point
+numbers use $52+1$~bits for the mantissa, which determines precision,
+11~bits for the exponent, which determines the valid range of numbers,
+and one bit for the sign. The smallest absolute value that can be
+represented is ca. $2.2\cdot10^{-308}$, the largest value is
+ca. $1.8\cdot10^{308}$. The 53~bit mantissa makes for a precision of
+ca. 15 decimal digits. The smallest possible difference between two
+distinct numbers in double floating-point number representation is
+$2^{-53} \approx 1.1\cdot10^{-16}$. The largest integer value that can
+be represented exactly is $2^{53}-1 \approx 9,0\cdot10^{15}$. Variable
+\texttt{warningcheck}\index{warningcheck?\texttt{warningcheck}} is set
+to $2^{52}$ in \texttt{double} mode. Arithmetic operations make use of
+a hardware floating-point unit (FPU), if available.
+
+While the IEEE double precision floating-point format provides plenty
+room for storing numeric values, still, precision and range are finite
+and fix. For users that need higher precision or range, MetaPost
+provides support for (almost) arbitrary precision floating-point
+arithmetics. The \texttt{binary}\index{binary?\texttt{binary}} number
+system is similar to the \texttt{double} number system, except that the
+number of bits used for the mantissa is not fixed, but variable.
+Precision is determined by an internal variable
+\texttt{numberprecision}\index{numberprecision?\texttt{numberprecision}}\label{Dnumberprecision}
+in decimal digits. Valid numbers are in the range 1 to 1000. Higher
+values make for better precision at the expense of performance of
+arithmetic operations. Default precision is 34~decimal digits
+(ca. 113~bits in the mantissa). Exponent in the internal representation
+is an integer in the range $[-9,999,999; +9,999,999]$. All arithmetic
+operations are done in software using the MPFR library~\cite{lib:mpfr}
+and are usually orders of magnitude slower than in \texttt{double} mode.
+
+Number system \texttt{decimal}\index{decimal?\texttt{decimal}} provides
+arbitrary precision floating-point arithmetics similar to the
+\texttt{binary} number system. Except that it uses a base of~10 for the
+internal representation instead of a base of~2. The point is that with
+base~2 floating-point numbers some decimal numbers cannot be represented
+exactly, among them such strange numbers like $0.1$. In a base~2
+floating-point number format, this value has an infinit repeating
+representation, which cannot be stored in a mantissa of finite precision
+without introducing a rounding error. While such initial errors may be
+small, they use to accummulate when doing calculations. Sometimes
+increasing precision by switching from \texttt{double} to
+\texttt{binary} mode is sufficient to get satisfying results again. On
+the other hand, there's a demand for doing calculations exactly like
+humans do with pencil and paper, e.g., for certain financial
+calculations. The only way to ensure exact result is switching base of
+the internal representation to~10. Again, precision can be determined
+by assigning a value to variable
+\texttt{numberprecision}\index{numberprecision?\texttt{numberprecision}}.
+Valid numbers are in the range 1 to 1000. Default precision is
+34~decimal digits. Exponent in the internal representation is an
+integer in the range $[-9,999,999; +9,999,999]$. All arithmetic
+operations are done in software using the decNumber
+library~\cite{lib:decnumber} and are usually slower than in
+\texttt{binary} mode.
+
+In all number systems except the traditional fixed-point
+(\texttt{scaled}) number system, numbers can be given in scientific
+notation, i.e., input like \texttt{1.23e4} is interpreted as the value
+$12,300$ instead of the product of the numeric value $1.23$ and (array)
+variable \verb|e[4]|.
+
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: "mpman"
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mpman-app-optab.tex b/systems/doc/metapost/source-manual/mpman-app-optab.tex
new file mode 100644
index 0000000000..dd779479d4
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman-app-optab.tex
@@ -0,0 +1,156 @@
+\svnInfo $Id: mpman-app-optab.tex 1438 2010-10-26 20:08:17Z stephanhennig $
+%%% Two notes on column specification:
+%%% (i) Column widths are manually chosen as small as possible to allow
+%%% for a wider last X column.
+%%% (ii) In the first column \linepenalty=100 prefers shorter paragraphs
+%%% (less lines), where plain \raggedright were indifferent and
+%%% sometimes caused a dangling line, e.g., for 'directionpoint of'
+%%% or 'directiontime of'.
+\begin{longtable}{|>{\raggedright\linepenalty=100\ttfamily}p{.793in}*{3}{|>{\raggedright}p{.715in}}|>{\raggedleft}p{1.5em}|>{\raggedright\arraybackslash}X|}
+\caption{\strut Operators}\label{optab}\\
+\hline
+Name& \multicolumn3{c|}{Argument/result types}& \makebox[.2in][c]{Page}& Explanation\\\cline{2-4}
+& \multicolumn1{c|}{Left}& \multicolumn1{c|}{Right}& \multicolumn1{c|}{Result}& & \\
+\hline
+\hline
+\endfirsthead
+\caption[]{\strut Operators \emph{(continued)}}\\
+\hline
+Name& \multicolumn3{c|}{Argument/result types}& \makebox[.2in][c]{Page}& Explanation\\\cline{2-4}
+& \multicolumn1{c|}{Left}& \multicolumn1{c|}{Right}& \multicolumn1{c|}{Result}& & \\
+\hline
+\hline
+\endhead
+\&\index{&?\texttt{\&}}& string\par path& string\par path & string\par path& \pageref{Damp}& Concatenation---works for paths $l\hbox{\tt\&}r$ if $r$ starts exactly where the $l$ ends\\\hline
+*\index{*?\texttt{*}}& numeric& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Multiplication\\\hline
+*\index{*?\texttt{*}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Multiplication\\\hline
+**\index{**?\texttt{**}}& numeric& numeric& numeric& \pageref{Dpow}& Exponentiation\\\hline
++\index{+?\texttt{+}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Addition\\\hline
+++\index{++?\texttt{++}}& numeric& numeric& numeric& \pageref{Dpyadd}& Pythagorean addition $\sqrt{l^2+r^2}$\\\hline
++-+\index{+-+?\texttt{+-+}}& numeric& numeric& numeric& \pageref{Dpysub}& Pythagorean subtraction $\sqrt{l^2-r^2}$\\\hline
+-\index{-?\texttt{-}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Subtraction\\\hline
+-\index{-?\texttt{-}}& --& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dneg}& Negation\\\hline
+/\index{/?\texttt{/}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Division\\\hline
+<\index{<?\texttt{<}} =\index{=?\texttt{=}} >\index{>?\texttt{>}}\par <=\index{<=?\texttt{<=}} >=\index{>=?\texttt{>=}}\par <>\index{<>?\texttt{<>}}& string\par numeric\par pair\par (cmyk)color\par transform& string\par numeric\par pair\par (cmyk)color\par transform& boolean& \pageref{Dcmpar}& Comparison operators\\\hline
+\pl abs\index{abs?\texttt{abs}}& --& numeric\par pair& numeric& \pageref{Dabs}& Absolute value\par Euclidean length $\sqrt{(\mbox{\ttfamily xpart\ } r)^2+(\mbox{\ttfamily ypart\ } r)^2}$\\\hline
+and\index{and?\texttt{and}}& boolean& boolean& boolean& \pageref{Dand}& Logical and\\\hline
+angle\index{angle?\texttt{angle}}& --& pair& numeric& \pageref{Dangle}& 2$-$argument arctangent (in degrees)\\\hline
+arclength\index{arclength?\texttt{arclength}}& --& path& numeric& \pageref{Darclng}& Arc length of a path\\\hline
+arctime of\index{arctime of?\texttt{arctime of}}& numeric& path& numeric& \pageref{Darctim}& Time on a path where arc length from the start reaches a given value\\\hline
+ASCII\index{ASCII?\texttt{ASCII}}& --& string& numeric& --& ASCII value of first character in string\\\hline
+\pl bbox\index{bbox?\texttt{bbox}}& --& picture\par path\par pen& path& \pageref{Dbbox}& A rectangular path for the bounding box\\\hline
+blackpart\index{blackpart?\texttt{blackpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the fourth component\\\hline
+bluepart\index{bluepart?\texttt{bluepart}}& --& color& numeric& \pageref{Drgbprt}& Extract the third component\\\hline
+boolean\index{boolean?\texttt{boolean}}& --& any& boolean& \pageref{Dboolop}& Is the expression of type boolean?\\\hline
+\pl bot\index{bot?\texttt{bot}}& --& numeric\par pair& numeric\par pair& \pageref{Dbot}& Bottom of current pen when centered at the given coordinate(s)\\\hline
+bounded\index{bounded?\texttt{bounded}}& --& any& boolean& \pageref{Dbounded}& Is argument a picture with a bounding box?\\\hline
+\pl ceiling\index{ceiling?\texttt{ceiling}}& --& numeric& numeric& \pageref{Dceil}& Least integer greater than or equal to\\\hline
+\pl center\index{center?\texttt{center}}& --& picture\par path\par pen& pair& \pageref{Dcenter}& Center of the bounding box\\\hline
+char\index{char?\texttt{char}}& --& numeric& string& \pageref{Dchar}& Character with a given ASCII code\\\hline
+clipped\index{clipped?\texttt{clipped}}& --& any& boolean& \pageref{Dclipped}& Is argument a clipped picture?\\\hline
+cmykcolor\index{cmykcolor?\texttt{cmykcolor}}& --& any& boolean& \pageref{Dccolrop}& Is the expression of type cmykcolor?\\\hline
+color\index{color?\texttt{color}}& --& any& boolean& \pageref{Dcolrop}& Is the expression of type color?\\\hline
+colormodel\index{colormodel?\texttt{colormodel}}& --& image object& numeric& \pageref{Dcolormodel}& What is the color model of the image object?\\\hline
+\pl colorpart\index{colorpart?\texttt{colorpart}}& --& image object&
+(cmyk)color\par numeric\par boolean& \pageref{Dcolorpart}& What is the
+color of the image object?\\\hline
+cosd\index{cosd?\texttt{cosd}}& --& numeric& numeric& \pageref{Dcosd}& Cosine of angle in degrees\\\hline
+\pl cutafter\index{cutafter?\texttt{cutafter}}& path& path& path& \pageref{Dcuta}& Left argument with part after the intersection dropped\\\hline
+\pl cutbefore\index{cutbefore?\texttt{cutbefore}}& path& path& path& \pageref{Dcutb}& Left argument with part before the intersection dropped\\\hline
+cyanpart\index{cyanpart?\texttt{cyanpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the first component\\\hline
+cycle\index{cycle?\texttt{cycle}}& --& path& boolean& \pageref{Dcycop}& Determines whether a path is cyclic\\\hline
+dashpart\index{dashpart?\texttt{dashpart}}& --& picture& picture& \pageref{Ddashpart}& Dash pattern of a path in a stroked picture\\\hline
+decimal\index{decimal?\texttt{decimal}}& --& numeric& string& \pageref{Ddecop}& The decimal representation\\\hline
+\pl dir\index{dir?\texttt{dir}}& --& numeric& pair& \pageref{Ddirop}& $(\cos\theta,\sin\theta)$ given $\theta$ in degrees\\\hline
+\pl direction of\index{direction of?\texttt{direction of}}& numeric& path& pair& \pageref{Ddirof}& The direction of a path at a given `time'\\\hline
+\pl direction\-point of\index{directionpoint of?\texttt{directionpoint of}}& pair& path& numeric& \pageref{Ddpntof}& Point where a path has a given direction\\\hline
+direction\-time of\index{directiontime of?\texttt{directiontime of}}& pair& path& numeric& \pageref{Ddtimof}& `Time' when a path has a given direction\\\hline
+\pl div\index{div?\texttt{div}}& numeric& numeric& numeric& --& Integer division $\lfloor l/r\rfloor$\\\hline
+\pl dotprod\index{dotprod?\texttt{dotprod}}& pair& pair& numeric& \pageref{Ddprod}& Vector dot product\\\hline
+filled\index{filled?\texttt{filled}}& --& any& boolean& \pageref{Dfilled}& Is argument a filled outline?\\\hline
+floor\index{floor?\texttt{floor}}& --& numeric& numeric& \pageref{Dfloor}& Greatest integer less than or equal to\\\hline
+fontpart\index{fontpart?\texttt{fontpart}}& --& picture& string& \pageref{Dfontpart}& Font of a textual picture component\\\hline
+fontsize\index{fontsize?\texttt{fontsize}}& --& string& numeric& \pageref{Dfntsiz}& The point size of a font\\\hline
+glyph of\index{glyph?\texttt{glyph}}& numeric\par string& string& picture&
+\pageref{Dglyph}& Convert a glyph of a font to contours\\\hline
+greenpart\index{greenpart?\texttt{greenpart}}& --& color& numeric& \pageref{Drgbprt}& Extract the second component\\\hline
+greypart\index{greypart?\texttt{greypart}}& --& numeric& numeric& \pageref{Dgreyprt}& Extract the first (only) component\\\hline
+hex\index{hex?\texttt{hex}}& --& string& numeric& --& Interpret as a hexadecimal number\\\hline
+infont\index{infont?\texttt{infont}}& string& string& picture& \pageref{Sinfont}& Typeset string in given font\\\hline
+\pl intersec\-tionpoint\index{intersectionpoint?\texttt{intersectionpoint}}& path& path& pair& \pageref{Disecpt}& An intersection point\\\hline
+intersec\-tiontimes\index{intersectiontimes?\texttt{intersectiontimes}}& path& path& pair& \pageref{Disectt}& Times ($t_l,t_r)$ on paths $l$ and $r$ when the paths intersect\\\hline
+\pl inverse\index{inverse?\texttt{inverse}}& --& transform& transform& \pageref{Dinv}& Invert a transformation\\\hline
+known\index{known?\texttt{known}}& --& any& boolean& \pageref{Dknown}& Does argument have a known value?\\\hline
+length\index{length?\texttt{length}}& --& path\par string\par picture& numeric& \pageref{Dlength}\par \pageref{DlengthString}\par \pageref{DlengthPicture}& Number of components (arcs, characters, strokes, \ldots) in the argument\\\hline
+\pl lft\index{lft?\texttt{lft}}& --& numeric\par pair& numeric\par pair& \pageref{Dlft}& Left side of current pen when its center is at the given coordinate(s)\\\hline
+llcorner\index{llcorner?\texttt{llcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Lower-left corner of bounding box\\\hline
+lrcorner\index{lrcorner?\texttt{lrcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Lower-right corner of bounding box\\\hline
+magentapart\index{magentapart?\texttt{magentapart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the second component\\\hline
+makepath\index{makepath?\texttt{makepath}}& --& pen& path& \pageref{Dmkpath}& Cyclic path bounding the pen shape\\\hline
+makepen\index{makepen?\texttt{makepen}}& --& path& pen& \pageref{Dmkpen}& A polygonal pen made from the convex hull of the path knots\\\hline
+mexp\index{mexp?\texttt{mexp}}& --& numeric& numeric& --& The function $\exp(x/256)$\\\hline
+mlog\index{mlog?\texttt{mlog}}& --& numeric& numeric& --& The function $256\ln(x)$\\\hline
+\pl mod\index{mod?\texttt{mod}}& --& numeric& numeric& --& The remainder function $l-r\lfloor l/r\rfloor$\\\hline
+normal\-deviate\index{normaldeviate?\texttt{normaldeviate}}& --& --& numeric& --& Choose a random number with mean~0 and standard deviation~1\\\hline
+not\index{not?\texttt{not}}& --& boolean& boolean& \pageref{Dnot}& Logical negation\\\hline
+numeric\index{numeric?\texttt{numeric}}& --& any& boolean& \pageref{Dnumop}& Is the expression of type numeric?\\\hline
+oct\index{oct?\texttt{oct}}& --& string& numeric& --& Interpret string as octal number\\\hline
+odd\index{odd?\texttt{odd}}& --& numeric& boolean& --& Is the closest integer odd or even?\\\hline
+or\index{or?\texttt{or}}& boolean& boolean& boolean& \pageref{Dor}& Logical inclusive or\\\hline
+pair\index{pair?\texttt{pair}}& --& any& boolean& \pageref{Dpairop}& Is the expression of type pair?\\\hline
+path\index{path?\texttt{path}}& --& any& boolean& \pageref{Dpathop}& Is the expression of type path?\\\hline
+pathpart\index{pathpart?\texttt{pathpart}}& --& picture& path& \pageref{Dpathpart}& Path of a stroked picture component\\\hline
+pen\index{pen?\texttt{pen}}& --& any& boolean& \pageref{Dpenop}& Is the expression of type pen?\\\hline
+penoffset of\index{penoffset of?\texttt{penoffset of}}& pair& pen& pair& --& Point on the pen furthest to the right of the given direction\\\hline
+penpart\index{penpart?\texttt{penpart}}& --& picture& pen& \pageref{Dpenpart}& Pen of a stroked picture component\\\hline
+picture\index{picture?\texttt{picture}}& --& any& boolean& \pageref{Dpictop}& Is the expression of type picture?\\\hline
+point of\index{point of?\texttt{point of}}& numeric& path& pair& \pageref{Dpntof}& Point on a path given a time value\\\hline
+postcontrol of\index{postcontrol of?\texttt{postcontrol of}}& numeric& path& pair& \pageref{Dprepostctrl}& First B\'ezier control point on path segment starting at the given time\\\hline
+precontrol of\index{precontrol of?\texttt{precontrol of}}& numeric& path& pair& \pageref{Dprepostctrl}& Last B\'ezier control point on path segment ending at the given time\\\hline
+readfrom\index{readfrom?\texttt{readfrom}}& --& string& string& \pageref{Dreadfrom}& Read a line from file\\\hline
+redpart\index{redpart?\texttt{redpart}}& --& color& numeric& \pageref{Drgbprt}& Extract the first component\\\hline
+reverse\index{reverse?\texttt{reverse}}& --& path& path& \pageref{Drevrse}& `time'-reversed path, beginning swapped with ending\\\hline
+rgbcolor\index{rgbcolor?\texttt{rgbcolor}}& --& any& boolean& \pageref{Drcolrop}& Is the expression of type color?\\\hline
+rotated\index{rotated?\texttt{rotated}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Rotate counterclockwise a given number of degrees\\\hline
+\pl round\index{round?\texttt{round}}& --& numeric\par pair& numeric\par pair& \pageref{Dround}& Round each component to the nearest integer\\\hline
+\pl rt\index{rt?\texttt{rt}}& --& numeric\par pair& numeric\par pair& \pageref{Drt}& Right side of current pen when centered at given coordinate(s)\\\hline
+scaled\index{scaled?\texttt{scaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all coordinates by the given amount\\\hline
+scantokens\index{scantokens?\texttt{scantokens}}& --& string& token sequence& \pageref{Dscantokens}& Converts a string to a token or token sequence. Provides string to numeric conversion, etc.\\\hline
+shifted\index{shifted?\texttt{shifted}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Add the given shift amount to each pair of coordinates\\\hline
+sind\index{sind?\texttt{sind}}& --& numeric& numeric& \pageref{Dsind}& Sine of an angle in degrees\\\hline
+slanted\index{slanted?\texttt{slanted}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Apply the slanting transformation that maps $(x,y)$ into $(x+sy,y)$, where~$s$ is the numeric argument\\\hline
+sqrt\index{sqrt?\texttt{sqrt}}& --& numeric& numeric& \pageref{Dsqrt}& Square root\\\hline
+str\index{str?\texttt{str}}& --& suffix& string& \pageref{Dstr}& String representation for a suffix\\\hline
+string\index{string?\texttt{string}}& --& any& boolean& \pageref{Dstrgop}& Is the expression of type string?\\\hline
+stroked\index{stroked?\texttt{stroked}}& --& any& boolean& \pageref{Dstroked}& Is argument a stroked line?\\\hline
+subpath of\index{subpath?\texttt{subpath}}& pair& path& path& \pageref{Dsubpth}& Portion of a path for given range of time values\\\hline
+substring of\index{substring
+of?\texttt{substring of}}& pair& string& string& \pageref{Dsubstr}& Substring bounded by given indices\\\hline
+textpart\index{textpart?\texttt{textpart}}& --& picture& string& \pageref{Dtextpart}& Text of a textual picture component\\\hline
+textual\index{textual?\texttt{textual}}& --& any& boolean& \pageref{Dtextual}& Is argument typeset text?\\\hline
+\pl top\index{top?\texttt{top}}& --& numeric\par pair& numeric\par pair& \pageref{Dtop}& Top of current pen when centered at the given coordinate(s)\\\hline
+transform\index{transform?\texttt{transform}}& --& any& boolean& \pageref{Dtrnfop}& Is the argument of type transform?\\\hline
+transformed\index{transformed?\texttt{transformed}}& picture\par path\par pair\par pen\par transform& transform& picture\par path\par pair\par pen\par transform& \pageref{Dtrfrmd}& Apply the given transform to all coordinates\\\hline
+ulcorner\index{ulcorner?\texttt{ulcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Upper-left corner of bounding box\\\hline
+uniform\-deviate\index{uniformdeviate?\texttt{uniformdeviate}}& --& numeric& numeric& --& Random number between zero and the value of the argument\\\hline
+\pl unitvector\index{unitvector?\texttt{unitvector}}& --& pair& pair& \pageref{Duvec}& Rescale a vector so its length is~1\\\hline
+unknown\index{unknown?\texttt{unknown}}& --& any& boolean& \pageref{Dunknwn}& Is the value unknown?\\\hline
+urcorner\index{urcorner?\texttt{urcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Upper-right corner of bounding box\\\hline
+\pl whatever\index{whatever?\texttt{whatever}}& --& --& numeric& \pageref{Dwhatev}& Create a new anonymous unknown\\\hline
+xpart\index{xpart?\texttt{xpart}}& --& pair\par transform& number& \pageref{Dxprt}& $x$ or $t_x$ component\\\hline
+xscaled\index{xscaled?\texttt{xscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all $x$ coordinates by the given amount\\\hline
+xxpart\index{xxpart?\texttt{xxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{xx}$ entry in transformation matrix\\\hline
+xypart\index{xypart?\texttt{xypart}}& --& transform& number& \pageref{Dtrprt}& $t_{xy}$ entry in transformation matrix\\\hline
+yellowpart\index{yellowpart?\texttt{yellowpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the third component\\\hline
+ypart\index{ypart?\texttt{ypart}}& --& pair\par transform& number& \pageref{Dyprt}& $y$ or $t_y$ component\\\hline
+yscaled\index{yscaled?\texttt{yscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all $y$ coordinates by the given amount\\\hline
+yxpart\index{yxpart?\texttt{yxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{yx}$ entry in transformation matrix\\\hline
+yypart\index{yypart?\texttt{yypart}}& --& transform& number& \pageref{Dtrprt}& $t_{yy}$ entry in transformation matrix\\\hline
+zscaled\index{zscaled?\texttt{zscaled}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Rotate and scale all coordinates so that $(1,0)$ is mapped into the given pair; i.e., do complex multiplication.\\\hline
+\end{longtable}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: "mpman"
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mpman-app-refman.tex b/systems/doc/metapost/source-manual/mpman-app-refman.tex
new file mode 100644
index 0000000000..7d301c3ce0
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman-app-refman.tex
@@ -0,0 +1,1068 @@
+\svnInfo $Id: mpman-app-refman.tex 2022 2014-05-20 21:50:47Z stephanhennig $
+\section{Reference Manual}
+\label{refman}
+
+\begingroup
+\renewcommand\topfraction{1.0}% Allow *lots* of figures and tables.
+\renewcommand\textfraction{0.0}
+\setcounter{topnumber}{10}
+\setcounter{totalnumber}{10}
+
+\subsection{The MetaPost Language}
+\label{refman:lang}
+
+Tables \ref{ivartab}--\ref{pseudotab} summarize the built-in features of
+Plain MetaPost. Features from the Plain\index{Plain macros} macro
+package are marked by \pl\ symbols. The distinction between primitives
+and plain macros can be ignored by the casual user.
+
+The tables in this appendix give the name of each feature, the page
+number where it is explained, and a short description. A few features
+are not explained elsewhere and have no page number listed. These
+features exist primarily for compatibility with \MF\index{metafont?\MF}
+and are intended to be self-explanatory. Certain other features from
+\MF\ are omitted entirely because they are of limited interest to the
+MetaPost users and/or would require long explanations. All of these are
+documented in {\sl The \MF book} \cite{kn:c} as explained in
+Appendix~\ref{MPvsMF}.
+
+Tables~\ref{ivartab} and~\ref{isvartab} list internal variables that
+take on numeric and string values. Table~\ref{pvartab} lists predefined
+variables of other types. Table~\ref{consttab} lists predefined
+constants. Some of these are implemented as variables whose values are
+intended to be left unchanged.
+
+Table~\ref{optab} summarizes MetaPost operators and lists
+the possible argument and result types for each one. A ``--'' entry for
+the left argument indicates a unary operator; ``--'' entries for both
+arguments indicate a nullary operator. Operators that take suffix
+parameters are not listed in this table because they are treated as
+``function-like macros''.
+
+The last two tables are Table~\ref{cmdtab} for commands and
+Table~\ref{pseudotab} macros that behave like functions or procedures.
+Such macros take parenthesized argument lists and/or suffix parameters,
+returning either a value whose type is listed in the table, or nothing.
+The latter case is for macros that behave like procedures. Their return
+values are listed as ``--''.
+
+The figures in this appendix present the syntax of the MetaPost language
+starting with expressions in Figures \ref{syexpr1}--\ref{sypseudo}.
+Although the productions sometimes specify types for expressions, primaries,
+secondaries, and tertiaries, no attempt is made to give separate syntaxes
+for \tdescr{numeric expression}, \tdescr{pair expression}, etc.
+The simplicity of the productions in Figure~\ref{sytypexpr} is due to this
+lack of type information. Type information
+can be found in Tables \ref{ivartab}--\ref{pseudotab}.
+
+Figures \ref{syprog}, \ref{sycmds1} and~\ref{sycmds2} give the syntax
+for MetaPost programs, including statements and commands. They do not
+mention loops\index{loops} and {\tt if}\index{if?\texttt{if}} tests
+because these constructions do not behave like statements. The syntax
+given in Figures \ref{syexpr1}--\ref{sycondloop} applies to the result
+of expanding all conditionals and loops. Conditionals and loops do have
+a syntax, but they deal with almost arbitrary sequences of tokens.
+Figure~\ref{sycondloop} specifies conditionals in terms of
+\tdescr{balanced tokens} and loops in terms of \tdescr{loop text}, where
+\tdescr{balanced tokens} is any sequence of tokens balanced with respect
+to {\tt if} and {\tt fi}, and \tdescr{loop text} is a sequence of tokens
+balanced with respect to {\tt for}, {\tt forsuffixes}, {\tt forever},
+and {\tt endfor}.
+
+\begin{table}[htp]
+\caption{Internal variables with numeric values}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt ahangle& \pageref{Dahangle}&
+ Angle for arrowheads in degrees (default: 45)\\\hline
+\pl\tt ahlength& \pageref{Dahlength}&
+ Size of arrowheads (default: 4{\tt bp})\\\hline
+\pl\tt bboxmargin& \pageref{Dbbmargin}&
+ Extra space allowed by {\tt bbox} (default 2{\tt bp})\\\hline
+\tt charcode& \pageref{Dcharcode}&
+ The number of the current figure\\\hline
+\tt day& \pageref{Dday}&
+ The current day of the month\\\hline
+\tt defaultcolormodel& \pageref{Ddefaultcolormodel}&
+ The initial color model (default: 5, rgb)\\\hline
+\pl\tt defaultpen& \pageref{Ddefaultpen}&
+ Numeric index used by {\tt pickup} to select default pen\\\hline
+\pl\tt defaultscale& \pageref{Ddfscale}&
+ Font scale factor for label strings (default 1)\\\hline
+\pl\tt dotlabeldiam& \pageref{Ddotlabdiam}&
+ Diameter of the dot drawn by \verb|dotlabel| (default 3{\tt bp})\\\hline
+\tt hour& \pageref{Dhour}&
+ The hour of the day this job started\\\hline
+\tt hppp& \pageref{Dhppp}&
+ The number of horizontal points per pixel for bitmap output\\\hline
+\pl\tt labeloffset& \pageref{Dlaboff}&
+ Offset distance for labels (default 3{\tt bp})\\\hline
+\tt linecap& \pageref{Dlinecap}&
+ 0 for butt, 1 for round, 2 for square\\\hline
+\tt linejoin& \pageref{Dlinejoin}&
+ 0 for mitered, 1 for round, 2 for beveled\\\hline
+\tt minute& \pageref{Dminute}&
+ The minute of the hour this job started\\\hline
+\tt miterlimit& \pageref{Dmiterlim}&
+ Controls miter length as in PostScript\\\hline
+\tt month& \pageref{Dmonth}&
+ The current month (e.g, 3 $\equiv$ March)\\\hline
+\tt mpprocset& \pageref{Dmpprocset}&
+ Create a PostScript dictionary of command abbreviations\\\hline
+\tt numberprecision&\pageref{Dnumberprecision}&
+ Arithmetic precision in \texttt{binary} and \texttt{decimal} mode\\\hline
+\tt pausing& --&
+ ${}>0$ to display lines on the terminal before they are read\\\hline
+\tt prologues& \pageref{Dprologues}&
+ ${}>0$ to output conforming PostScript using built-in fonts\\\hline
+\tt restoreclipcolor& --&
+ Restore the graphics state after clip operations (default: 1)\\\hline
+\tt showstopping& --&
+ ${}>0$ to stop after each {\tt show} command\\\hline
+\tt time& \pageref{Dtime}&
+ The number of minutes past midnight when this job started\\\hline
+\tt tracingcapsules& \pageref{Dtcapsules}&
+ ${}>0$ to show capsules too\\\hline
+\tt tracingchoices& \pageref{Dtchoices}&
+ ${}>0$ to show the control points chosen for paths\\\hline
+\tt tracingcommands& \pageref{Dtcommands}&
+ ${}>0$ to show commands and operations as they are performed\\\hline
+\tt tracingequations& \pageref{Dtequations}&
+ ${}>0$ to show each variable when it becomes known\\\hline
+\tt tracinglostchars& \pageref{Dtlostchars}&
+ ${}>0$ to show characters that aren't {\tt infont}\\\hline
+\tt tracingmacros& \pageref{Dtmacros}&
+ ${}>0$ to show macros before they are expanded\\\hline
+\tt tracingonline& \pageref{Dtonline}&
+ ${}>0$ to show long diagnostics on the terminal\\\hline
+\tt tracingoutput& \pageref{Dtoutput}&
+ ${}>0$ to show digitized edges as they are output\\\hline
+\tt tracingrestores& \pageref{Dtrestores}&
+ ${}>0$ to show when a variable or internal is restored\\\hline
+\tt tracingspecs& \pageref{Dtspecs}&
+ ${}>0$ to show path subdivision when using a polygonal a pen\\\hline
+\tt tracingstats& \pageref{Dtstats}&
+ ${}>0$ to show memory usage at end of job\\\hline
+\tt tracingtitles& --&
+ ${}>0$ to show titles online when they appear\\\hline
+\tt troffmode& \pageref{Dtroffmode}&
+ Set to~1 if a {\tt -troff} or {\tt -T} option was given\\\hline
+\tt truecorners& \pageref{Dtruecorn}&
+ ${}>0$ to make {\tt llcorner} etc. ignore {\tt setbounds}\\\hline
+\tt vppp& \pageref{Dvppp}&
+ The number of vertical points per pixel for bitmap output\\\hline
+\tt warningcheck& \pageref{Dwarncheck}&
+ Controls error message when variable value is large\\\hline
+\tt year& \pageref{Dyear}&
+ The current year (e.g., 1992)\\\hline
+\end{tabular}
+$$
+\label{ivartab}%
+\index{pausing?\texttt{pausing}}\index{showstopping?\texttt{showstopping}}%
+\index{tracingtitles?\texttt{tracingtitles}}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Internal string variables}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\tt jobname& --&
+ The name of this job\\\hline
+\tt numbersystem& \pageref{Dnumbersystem}&
+ Arithmetic mode as given on the command-line\\\hline
+\tt outputfilename& \pageref{Doutputfilename}&
+ Name of the output file last written\\\hline
+\tt outputformat& \pageref{Doutputformat}&
+ Output backend to be used (default: ``eps'')\\\hline
+\tt outputformatoptions& \pageref{Doutputformatoptions}&
+ Configure PNG output backend (default: ``'')\\\hline
+\tt outputtemplate& \pageref{Doutputtemplate}&
+ Output filename template (default: ``\%j.\%c'')\\\hline
+\end{tabular}
+$$
+\label{isvartab}
+\index{jobname?\texttt{jobname}}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Other Predefined Variables}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt background& color& \pageref{Dbground}&
+ Color for {\tt unfill} and {\tt undraw} (usually white)\\\hline
+\pl\tt currentpen& pen& \pageref{Dcurpen}&
+ Last pen picked up (for use by the {\tt draw} command)\\\hline
+\pl\tt currentpicture& picture& \pageref{Dcurpic}&
+ Accumulate results of {\tt draw} and {\tt fill} commands\\\hline
+\pl\tt cuttings& path& \pageref{Dcuttings}&
+ Subpath cut off by last {\tt cutbefore} or {\tt cutafter}\\\hline
+\pl\tt defaultfont& string& \pageref{Ddffont}&
+ Font used by label commands for typesetting strings\\\hline
+\pl\tt extra\_beginfig& string& \pageref{Dxbfig}&
+ Commands for {\tt beginfig} to scan\\\hline
+\pl\tt extra\_endfig& string& \pageref{Dxefig}&
+ Commands for {\tt endfig} to scan\\\hline
+\end{tabular}
+$$
+\label{pvartab}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Predefined Constants}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt beveled& numeric& \pageref{Dbvled}&
+ {\tt linejoin} value for beveled joins [2]\\\hline
+\pl\tt black& color& \pageref{Dblack}&
+ Equivalent to {\tt (0,0,0)}\\\hline
+\pl\tt blue& color& \pageref{Dblue}&
+ Equivalent to {\tt (0,0,1)}\\\hline
+\pl\tt bp& numeric& \pageref{Dbp}&
+ One PostScript point in {\tt bp} units [1]\\\hline
+\pl\tt butt& numeric& \pageref{Dbutt}&
+ {\tt linecap} value for butt end caps [0]\\\hline
+\pl\tt cc& numeric& \pageref{Dcc}&
+ One cicero in {\tt bp} units [12.79213]\\\hline
+\pl\tt cm& numeric& \pageref{Dcm}&
+ One centimeter in {\tt bp} units [28.34645]\\\hline
+\pl\tt dd& numeric& \pageref{Ddd}&
+ One didot point in {\tt bp} units [1.06601]\\\hline
+\pl\tt ditto& string& --&
+ The {\tt "} character as a string of length 1\\\hline
+\pl\tt down& pair& \pageref{Ddown}&
+ Downward direction vector $(0,-1)$\\\hline
+\pl\tt epsilon& numeric& \pageref{Depsilon}&
+ Smallest positive MetaPost number [$1\over65536$]\\\hline
+\pl\tt evenly& picture& \pageref{Devenly}&
+ Dash pattern for equal length dashes\\\hline
+\pl\tt EOF& string& \pageref{Deof}&
+ Single null character\\\hline
+\tt false& boolean& \pageref{Dfalse}&
+ The boolean value {\it false\/}\\\hline
+\pl\tt fullcircle& path& \pageref{Dfcirc}&
+ Circle of diameter 1 centered on $(0,0)$\\\hline
+\pl\tt green& color& \pageref{Dgreen}&
+ Equivalent to {\tt (0,1,0)}\\\hline
+\pl\tt halfcircle& path& \pageref{Dhcirc}&
+ Upper half of a circle of diameter 1\\\hline
+\pl\tt identity& transform& \pageref{Dident}&
+ Identity transformation\\\hline
+\pl\tt in& numeric& \pageref{Din}&
+ One inch in {\tt bp} units [72]\\\hline
+\pl\tt infinity& numeric& \pageref{Dinf}&
+ Large positive value [4095.99998]\\\hline
+\pl\tt left& pair& \pageref{Dleft}&
+ Leftward direction $(-1,0)$\\\hline
+\pl\tt mitered& numeric& \pageref{Dmitred}&
+ {\tt linejoin} value for mitered joins [0]\\\hline
+\pl\tt mm& numeric& \pageref{Dmm}&
+ One millimeter in {\tt bp} units [2.83464]\\\hline
+\tt mpversion& string& \pageref{Dmpversion}&
+ MetaPost version number\\\hline
+\tt nullpen& pen& \pageref{Dnlpen}&
+ Empty pen\\\hline
+\tt nullpicture& picture& \pageref{Dnlpic}&
+ Empty picture\\\hline
+\pl\tt origin& pair& \pageref{Dorigin}&
+ The pair $(0,0)$\\\hline
+\pl\tt pc& numeric& \pageref{Dpc}&
+ One pica in {\tt bp} units [11.95517]\\\hline
+\tt pencircle& pen& \pageref{Dpncirc}&
+ Circular pen of diameter 1\\\hline
+\pl\tt pensquare& pen& \pageref{Dpnsqr}&
+ Square pen of height 1 and width 1\\\hline
+\pl\tt pt& numeric& \pageref{Dpt}&
+ One printer's point in {\tt bp} units [0.99626]\\\hline
+\pl\tt quartercircle& path& \pageref{Dqcirc}&
+ First quadrant of a circle of diameter 1\\\hline
+\pl\tt red& color& \pageref{Dred}&
+ Equivalent to {\tt (1,0,0)}\\\hline
+\pl\tt right& pair& \pageref{Dright}&
+ Rightward direction $(1,0)$\\\hline
+\pl\tt rounded& numeric& \pageref{Drnded}&
+ {\tt linecap} and {\tt linejoin} value for round joins\\
+\tt & & &
+ and end caps [1]\\\hline
+\pl\tt squared& numeric& \pageref{Dsqred}&
+ {\tt linecap} value for square end caps [2]\\\hline
+\tt true& boolean& \pageref{Dtrue}&
+ The boolean value {\tt true}\\\hline
+\pl\tt unitsquare& path& \pageref{Dunitsqr}&
+ The path \verb|(0,0)--(1,0)--(1,1)--(0,1)--cycle|\\\hline
+\pl\tt up& pair& \pageref{Dup}&
+ Upward direction $(0,1)$\\\hline
+\pl\tt white& color& \pageref{Dwhite}&
+ Equivalent to {\tt (1,1,1)}\\\hline
+\pl\tt withdots& picture& \pageref{Dwdots}&
+ Dash pattern that produces dotted lines\\\hline
+\end{tabular}
+$$
+\label{consttab}%
+\index{ditto?\texttt{ditto}}%
+\end{table}
+
+
+\clearpage
+\LTXtable{\textwidth}{mpman-app-optab}
+
+\begin{table}[htp]
+\caption{Commands}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\tt \verb|addto|& \pageref{sydraw}&
+ Low-level command for drawing and filling\\\hline
+\tt \verb|clip|& \pageref{Dclip}&
+ Applies a clipping path to a picture\\\hline
+\tt \verb|closefrom|& \pageref{Dclosefrom}&
+ Close a file opened by {\tt readfrom}\\\hline
+\pl\tt \verb|cutdraw|& \pageref{Dctdraw}&
+ Draw with butt end caps\\\hline
+\tt \verb|dashed|& \pageref{Ddashed}&
+ Apply dash pattern to drawing command\\\hline
+\pl\tt \verb|draw|& \pageref{curves}&
+ Draw a line or a picture\\\hline
+\pl\tt \verb|drawarrow|& \pageref{Ddrwarr}&
+ Draw a line with an arrowhead at the end\\\hline
+\pl\tt \verb|drawdblarrow|& \pageref{Ddrwdar}&
+ Draw a line with arrowheads at both ends\\\hline
+\tt \verb|errhelp|& \pageref{Derrhelp}&
+ Declare help message for interactive mode\\\hline
+\tt \verb|errmessage|& \pageref{Derrmessage}&
+ Show error message on the terminal and enter interactive
+ mode\\\hline
+\tt \verb|filenametemplate|& \pageref{Dfilenametemplate}&
+ Set output file name pattern (deprecated, see
+ \verb|outputtemplate|)\\\hline
+\pl\tt \verb|fill|& \pageref{Dfill}&
+ Fill inside a cyclic path\\\hline
+\pl\tt \verb|filldraw|& \pageref{Dfildrw}&
+ Draw a cyclic path and fill inside it\\\hline
+\tt \verb|fontmapfile|& \pageref{Dfontmapfile}&
+ Read font map entries from file\\\hline
+\tt \verb|fontmapline|& \pageref{Dfontmapline}&
+ Declare a font map entry\\\hline
+\tt \verb|interim|& \pageref{Dinterm}&
+ Make a local change to an internal variable\\\hline
+\tt \verb|let|& --&
+ Assign one symbolic token the meaning of another\\\hline
+\pl\tt \verb|loggingall|& \pageref{Dlogall}&
+ Turn on all tracing (log file only)\\\hline
+\tt \verb|message|& \pageref{Dmessage}&
+ Show message string on the terminal\\\hline
+\tt \verb|newinternal|& \pageref{Dnewint}&
+ Declare new internal variables\\\hline
+\pl\tt \verb|pickup|& \pageref{Dpickup}&
+ Specify new pen for line drawing\\\hline
+\tt \verb|save|& \pageref{Dsave}&
+ Make variables local\\\hline
+\tt \verb|setbounds|& \pageref{Dsetbnd}&
+ Make a picture lie about its bounding box\\\hline
+\tt \verb|shipout|& \pageref{Dship}&
+ Low-level command to output a figure\\\hline
+\tt \verb|show|& \pageref{Dshow}&
+ Print out expressions symbolically\\\hline
+\tt \verb|showdependencies|& \pageref{Dshdep}&
+ Print out all unsolved equations\\\hline
+\tt \verb|showtoken|& \pageref{Dshtok}&
+ Print an explanation of what a token is\\\hline
+\tt \verb|showvariable|& \pageref{Dshvar}&
+ Print variables symbolically\\\hline
+\tt \verb|special|& \pageref{Dspecl}&
+ Print a string directly in the PostScript output file\\\hline
+\pl\tt \verb|tracingall|& \pageref{Dtall}&
+ Turn on all tracing\\\hline
+\pl\tt \verb|tracingnone|& \pageref{Dtnone}&
+ Turn off all tracing\\\hline
+\pl\tt \verb|undraw|& \pageref{Dundraw}&
+ Erase a line or a picture\\\hline
+\pl\tt \verb|unfill|& \pageref{Dunfill}&
+ Erase inside a cyclic path\\\hline
+\pl\tt \verb|unfilldraw|& \pageref{Dunfdrw}&
+ Erase a cyclic path and its inside\\\hline
+\tt \verb|withcmykcolor|& \pageref{Dwithcmykcolor}&
+ Apply CMYK color to drawing command\\\hline
+\tt \verb|withcolor|& \pageref{Dwithcolor}&
+ Apply generic color specification to drawing command\\\hline
+\tt \verb|withgreyscale|& \pageref{Dwithgreyscale}&
+ Apply greyscale color to drawing command\\\hline
+\tt \verb|withoutcolor|& \pageref{Dwithoutcolor}&
+ Don't apply any color specification to drawing command\\\hline
+\tt \verb|withpen|& \pageref{sec.pens}&
+ Apply pen to drawing operation\\\hline
+\tt \verb|withpostscript|& \pageref{Dwithpost}&
+ End raw PostScript code\\\hline
+\tt \verb|withprescript|& \pageref{Dwithpre}&
+ Begin raw PostScript code\\\hline
+\tt \verb|withrgbcolor|& \pageref{Dwithrgbcolor}&
+ Apply RGB color to drawing command\\\hline
+\tt \verb|write to|& \pageref{Dwrite}&
+ Write string to file\\\hline
+\end{tabular}
+$$
+\index{let?\texttt{let}}%
+\label{cmdtab}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Function-Like Macros}
+$$\begin{tabular}{|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Name}& \multicolumn1{|c}{Arguments}&
+ \multicolumn1{|c}{Result}& \multicolumn1{|c}{Page}&
+ \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt \verb|buildcycle|& list of paths& path& \pageref{buildcy}&
+ Build a cyclic path\\\hline
+\pl\tt \verb|dashpattern|& on/off distances& picture& \pageref{Ddshpat}&
+ Create a pattern for dashed lines\\\hline
+\pl\tt \verb|decr|& numeric variable& numeric& \pageref{Dincr}&
+ Decrement and return new value\\\hline
+\pl\tt \verb|dotlabel|& suffix, picture, pair& --& \pageref{Ddotlab}&
+ Mark point and draw picture nearby\\\hline
+\pl\tt \verb|dotlabel|& suffix, string, pair& --& \pageref{Ddotlab}&
+ Mark point and place text nearby\\\hline
+\pl\tt \verb|dotlabels|& suffix, point numbers& --& \pageref{Ddotlbs}&
+ Mark {\tt z} points with their numbers\\\hline
+\pl\tt \verb|drawdot|& pair& --& \pageref{Ddrawdot}&
+ Draw a dot at the given point\\\hline
+\pl\tt \verb|drawoptions|& drawing options& --& \pageref{Ddropts}&
+ Set options for drawing commands\\\hline
+\pl\tt \verb|image|& string& picture& \pageref{Dimage}&
+ Return picture from text\\\hline
+\pl\tt \verb|incr|& numeric variable& numeric& \pageref{Dincr}&
+ Increment and return new value\\\hline
+\pl\tt \verb|label|& suffix, picture, pair& --& \pageref{Dlabel}&
+ Draw picture near given point\\\hline
+\pl\tt \verb|label|& suffix, string, pair& --& \pageref{Dlabel}&
+ Place text near given point\\\hline
+\pl\tt \verb|labels|& suffix, point numbers& --& \pageref{Dlabels}&
+ Draw {\tt z} point numbers; no dots\\\hline
+\pl\tt \verb|max|& list of numerics& numeric& --&
+ Find the maximum\\\hline
+\pl\tt \verb|max|& list of strings& string& --&
+ Find the lexicographically last string\\\hline
+\pl\tt \verb|min|& list of numerics& numeric& --&
+ Find the minimum\\\hline
+\pl\tt \verb|min|& list of strings& string& --&
+ Find the lexicographically first string\\\hline
+\pl\tt \verb|thelabel|& suffix, picture, pair& picture& \pageref{Dthelab}&
+ Picture shifted as if to label a point\\\hline
+\pl\tt \verb|thelabel|& suffix, string, pair& picture& \pageref{Dthelab}&
+ Text positioned as if to label a point\\\hline
+\pl\tt \verb|z|& suffix& pair& \pageref{Dzconv}&
+ The pair ${\tt x}\descr{suffix},{\tt y}\descr{suffix})$\\\hline
+\end{tabular}
+$$
+\index{min?\texttt{min}}\index{max?\texttt{max}}%
+\label{pseudotab}
+\end{table}
+
+\clearpage
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{atom} \rightarrow \descr{variable} \;|\; \descr{argument}$\\
+$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \descr{internal variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; begingroup \descr{statement list} \descr{expression} endgroup$\\
+$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; btex \descr{typesetting commands} etex$\\
+$\tt \qquad \;|\; \descr{pseudo function}$\\
+$\tt \descr{primary} \rightarrow \descr{atom}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \qquad \;|\; str \descr{suffix}$\\
+$\tt \qquad \;|\; z \descr{suffix}$\\
+$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}\descr{expression}\hbox{\tt ,}\descr{expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{scalar multiplication op} \descr{primary}$\\
+$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{transformer}$\\
+$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop} \descr{secondary}$\\
+$\tt \descr{subexpression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{path expression} \descr{path join} \descr{path knot}$\\
+$\tt \descr{expression} \rightarrow \descr{subexpression}$\\
+$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop} \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{path subexpression} \descr{direction specifier}$\\
+$\tt \qquad \;|\; \descr{path subexpression} \descr{path join} cycle$\\
+$\tt $\\
+$\tt \descr{path knot} \rightarrow \descr{tertiary}$\\
+$\tt \descr{path join} \rightarrow \verb|--|$\\
+$\tt \qquad \;|\; \descr{direction specifier} \descr{basic path join} \descr{direction specifier}$\\
+$\tt \descr{direction specifier} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \verb|{|curl \descr{numeric expression}\verb|}|$\\
+$\tt \qquad \;|\; \verb|{|\descr{pair expression}\verb|}|$\\
+$\tt \qquad \;|\; \verb|{|\descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\verb|}|$\\
+$\tt \descr{basic path join} \rightarrow \hbox{\tt ..} \;|\; \hbox{\tt ...} \;|\; \hbox{\tt ..}\descr{tension}\hbox{\tt ..} \;|\; \hbox{\tt ..}\descr{controls}\hbox{\tt ..}$\\
+$\tt \descr{tension} \rightarrow tension \descr{numeric primary}$\\
+$\tt \qquad \;|\; tension \descr{numeric primary} and \descr{numeric primary}$\\
+$\tt \descr{controls} \rightarrow controls \descr{pair primary}$\\
+$\tt \qquad \;|\; controls \descr{pair primary} and \descr{pair primary}$\\
+$\tt $\\
+$\tt \descr{argument} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{number or fraction} \rightarrow \descr{number}\hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{number not followed by `\hbox{\tt /}\tdescr{number}'}$\\
+$\tt \descr{scalar multiplication op} \rightarrow + \;|\; -$\\
+$\tt \qquad \;|\; \descr{`\tdescr{number or fraction}' not followed by `\tdescr{add op}\tdescr{number}'}$
+\end{ctabbing}
+\caption{Part 1 of the syntax for expressions}
+\index{expression?\tdescr{expression}}\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}%
+\index{path knot?\tdescr{path knot}}\index{primary?\tdescr{primary}}\index{primary binop?\tdescr{primary binop}}%
+\index{secondary?\tdescr{secondary}}\index{secondary binop?\tdescr{secondary binop}}\index{suffix?\tdescr{suffix}}%
+\index{tertiary?\tdescr{tertiary}}\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr1}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt $\\
+$\tt \descr{nullary op} \rightarrow false \;|\; normaldeviate \;|\; nullpen \;|\; nullpicture \;|\; pencircle$\\
+$\tt \qquad \;|\; true \;|\; whatever$\\
+$\tt \descr{unary op} \rightarrow \descr{type}$\\
+$\tt \qquad \;|\; abs \;|\; angle \;|\; arclength \;|\; ASCII \;|\; bbox \;|\; blackpart \;|\; bluepart \;|\; bot \;|\; bounded$\\
+$\tt \qquad \;|\; ceiling \;|\; center \;|\; char \;|\; clipped \;|\; colormodel \;|\; cosd \;|\; cyanpart \;|\; cycle$\\
+$\tt \qquad \;|\; dashpart \;|\; decimal \;|\; dir \;|\; floor \;|\; filled \;|\; fontpart \;|\; fontsize$\\
+$\tt \qquad \;|\; greenpart \;|\; greypart \;|\; hex \;|\; inverse \;|\; known \;|\; length \;|\; lft \;|\; llcorner$\\
+$\tt \qquad \;|\; lrcorner\;|\; magentapart \;|\; makepath \;|\; makepen \;|\; mexp \;|\; mlog \;|\; not \;|\; oct \;|\; odd$\\
+$\tt \qquad \;|\; pathpart \;|\; penpart \;|\; readfrom \;|\; redpart \;|\; reverse \;|\; round \;|\; rt \;|\; sind \;|\; sqrt$\\
+$\tt \qquad \;|\; stroked \;|\; textpart \;|\; textual \;|\; top \;|\; ulcorner$\\
+$\tt \qquad \;|\; uniformdeviate \;|\; unitvector \;|\; unknown \;|\; urcorner \;|\; xpart \;|\; xxpart$\\
+$\tt \qquad \;|\; xypart \;|\; yellowpart \;|\; ypart \;|\; yxpart \;|\; yypart$\\
+$\tt \descr{type} \rightarrow boolean \;|\; cmykcolor \;|\; color \;|\; numeric \;|\; pair$\\
+$\tt \qquad \;|\; path \;|\; pen \;|\; picture \;|\; rgbcolor \;|\; string \;|\; transform$\\
+$\tt \descr{internal type} \rightarrow numeric \;|\; string$\\
+$\tt \descr{primary binop} \rightarrow \hbox{\tt *} \;|\; \hbox{\tt /} \;|\; \hbox{\tt **} \;|\; and$\\
+$\tt \qquad \;|\; dotprod \;|\; div \;|\; infont \;|\; mod$\\
+$\tt \descr{secondary binop} \rightarrow + \;|\; - \;|\; ++ \;|\; +-+ \;|\; or$\\
+$\tt \qquad \;|\; intersectionpoint \;|\; intersectiontimes$\\
+$\tt \descr{tertiary binop} \rightarrow \hbox{\tt \&} \;|\; \hbox{\verb|<|} \;|\; \hbox{\verb|<=|} \;|\; \hbox{\verb|<>|} \;|\; \hbox{\tt =} \;|\; \hbox{\verb|>|} \;|\; \hbox{\verb|>=|}$\\
+$\tt \qquad \;|\; cutafter \;|\; cutbefore$\\
+$\tt \descr{of operator} \rightarrow arctime \;|\; direction \;|\; directiontime \;|\; directionpoint$\\
+$\tt \qquad \;|\; glyph \;|\; penoffset \;|\; point \;|\; postcontrol \;|\; precontrol$\\
+$\tt \qquad \;|\; subpath \;|\; substring$\\
+$\tt $\\
+$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{suffix} \rightarrow \descr{empty} \;|\; \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \qquad \;|\; \descr{suffix parameter}$\\
+$\tt \descr{subscript} \rightarrow \descr{number} \;|\; \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt $\\
+$\tt \descr{internal variable} \rightarrow ahangle \;|\; ahlength \;|\; bboxmargin$\\
+$\tt \qquad \;|\; charcode \;|\; day \;|\; defaultcolormodel \;|\; defaultpen \;|\; defaultscale$\\
+$\tt \qquad \;|\; hour \;|\; hppp \;|\; jobname \;|\; labeloffset \;|\; linecap \;|\; linejoin
+\;|\; minute \;|\; miterlimit \;|\; month$\\
+$\tt \qquad \;|\; numberprecision \;|\; numbersystem$\\
+$\tt \qquad \;|\; outputfilename \;|\; outputformat \;|\; outputformatoptions \;|\; outputtemplate$\\
+$\tt \qquad \;|\; pausing \;|\; prologues \;|\; showstopping$\\
+$\tt \qquad \;|\; time \;|\; tracingoutput \;|\; tracingcapsules \;|\; tracingchoices \;|\; tracingcommands$\\
+$\tt \qquad \;|\; tracingequations \;|\; tracinglostchars \;|\; tracingmacros$\\
+$\tt \qquad \;|\; tracingonline \;|\; tracingrestores \;|\; tracingspecs$\\
+$\tt \qquad \;|\; tracingstats \;|\; tracingtitles \;|\; truecorners$\\
+$\tt \qquad \;|\; warningcheck \;|\; vppp \;|\; year$\\
+$\tt \qquad \;|\; \descr{symbolic token defined by {\tt newinternal}}$
+\end{ctabbing}
+\caption{Part 2 of the syntax for expressions}
+\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}\index{primary binop?\tdescr{primary binop}}%
+\index{secondary binop?\tdescr{secondary binop}}\index{subscript?\tdescr{subscript}}\index{suffix?\tdescr{suffix}}%
+\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr2}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{pseudo function} \rightarrow min\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; max\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; incr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; decr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dashpattern\hbox{\tt (}\descr{on\hbox{\tt /}off list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; interpath\hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; buildcycle\hbox{\tt (}\descr{path expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; thelabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \descr{path expression list} \rightarrow \descr{path expression}$\\
+$\tt \qquad \;|\; \descr{path expression list}\hbox{\tt ,} \descr{path expression}$\\
+$\tt \descr{on\hbox{\tt /}off list} \rightarrow \descr{on\hbox{\tt /}off list}\descr{on\hbox{\tt /}off clause} \;|\; \descr{on\hbox{\tt /}off clause}$\\
+$\tt \descr{on\hbox{\tt /}off clause} \rightarrow on \descr{numeric tertiary} \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{The syntax for function-like macros}
+\index{label suffix?\tdescr{label suffix}}%
+\label{sypseudo}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{boolean expression} \rightarrow \descr{expression}$\\
+$\tt \descr{cmykcolor expression} \rightarrow \descr{expression}$\\
+$\tt \descr{color expression} \rightarrow \descr{expression}$\\
+$\tt \descr{numeric atom} \rightarrow \descr{atom}$\\
+$\tt \descr{numeric expression} \rightarrow \descr{expression}$\\
+$\tt \descr{numeric primary} \rightarrow \descr{primary}$\\
+$\tt \descr{numeric tertiary} \rightarrow \descr{tertiary}$\\
+$\tt \descr{numeric variable} \rightarrow \descr{variable} \;|\; \descr{internal variable}$\\
+$\tt \descr{pair expression} \rightarrow \descr{expression}$\\
+$\tt \descr{pair primary} \rightarrow \descr{primary}$\\
+$\tt \descr{path expression} \rightarrow \descr{expression}$\\
+$\tt \descr{path subexpression} \rightarrow \descr{subexpression}$\\
+$\tt \descr{pen expression} \rightarrow \descr{expression}$\\
+$\tt \descr{picture expression} \rightarrow \descr{expression}$\\
+$\tt \descr{picture variable} \rightarrow \descr{variable}$\\
+$\tt \descr{rgbcolor expression} \rightarrow \descr{expression}$\\
+$\tt \descr{string expression} \rightarrow \descr{expression}$\\
+$\tt \descr{suffix parameter} \rightarrow \descr{parameter}$\\
+$\tt \descr{transform primary} \rightarrow \descr{primary}$
+\end{ctabbing}
+\caption{Miscellaneous productions needed to complete the BNF}
+\label{sytypexpr}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{program} \rightarrow \descr{statement list} end$\\
+$\tt \descr{statement list} \rightarrow \descr{empty} \;|\; \descr{statement list} \hbox{\tt ;} \descr{statement}$\\
+$\tt \descr{statement} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt \qquad \;|\; \descr{declaration} \;|\; \descr{macro definition}$\\
+$\tt \qquad \;|\; \descr{compound} \;|\; \descr{pseudo procedure}$\\
+$\tt \qquad \;|\; \descr{command}$\\
+$\tt \descr{compound} \rightarrow begingroup \descr{statement list} endgroup$\\
+$\tt \qquad \;|\; beginfig\hbox{\tt (}\descr{numeric expression}\hbox{\tt );} \descr{statement list}\hbox{\tt ;} endfig$\\
+$\tt $\\
+$\tt \descr{equation} \rightarrow \descr{expression} \hbox{\tt =} \descr{right-hand side}$\\
+$\tt \descr{assignment} \rightarrow \descr{variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \descr{right-hand side} \rightarrow \descr{expression} \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt $\\
+$\tt \descr{declaration} \rightarrow \descr{type} \descr{declaration list}$\\
+$\tt \descr{declaration list} \rightarrow \descr{generic variable}$\\
+$\tt \qquad \;|\; \descr{declaration list}\hbox{\tt ,} \descr{generic variable}$\\
+$\tt \descr{generic variable} \rightarrow \descr{symbolic token} \descr{generic suffix}$\\
+$\tt \descr{generic suffix} \rightarrow \descr{empty} \;|\; \descr{generic suffix} \descr{tag}$\\
+$\tt \qquad \;|\; \descr{generic suffix} \hbox{\tt []}$\\
+$\tt $\\
+$\tt \descr{macro definition} \rightarrow \descr{macro heading} \hbox{\tt =} \descr{replacement text} enddef$\\
+$\tt \descr{macro heading} \rightarrow def \descr{symbolic token} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{generic variable} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{generic variable} \hbox{\verb|@#|} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{binary def} \descr{parameter} \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{delimited part}\hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\; \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr \descr{parameter} of \descr{parameter}$\\
+$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\; tertiary$\\
+$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\; tertiarydef$\\
+$\tt $\\
+$\tt \descr{pseudo procedure} \rightarrow drawoptions\hbox{\tt (}\descr{option list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; label\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; labels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \descr{point number list} \rightarrow \descr{suffix} \;|\; \descr{point number list}\hbox{\tt ,} \descr{suffix}$\\
+$\tt \descr{label suffix} \rightarrow \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\; ulft \;|\; urt \;|\; llft \;|\; lrt$
+\end{ctabbing}
+\caption{Overall syntax for MetaPost programs}
+\index{generic variable?\tdescr{generic variable}}\index{label suffix?\tdescr{label suffix}}\index{replacement text?\tdescr{replacement text}}%
+\index{suffix?\tdescr{suffix}}%
+\label{syprog}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{command} \rightarrow clip \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; interim \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; let \descr{symbolic token} \hbox{\tt =} \descr{symbolic token}$\\
+$\tt \qquad \;|\; pickup \descr{expression}$\\
+$\tt \qquad \;|\; randomseed \hbox{\tt :=} \descr{numeric expression}$\\
+$\tt \qquad \;|\; save \descr{symbolic token list}$\\
+$\tt \qquad \;|\; setbounds \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; shipout \descr{picture expression}$\\
+$\tt \qquad \;|\; write \descr{string expression} to \descr{string expression}$\\
+$\tt \qquad \;|\; \descr{addto command}$\\
+$\tt \qquad \;|\; \descr{drawing command}$\\
+$\tt \qquad \;|\; \descr{font metric command}$\\
+$\tt \qquad \;|\; \descr{newinternal command}$\\
+$\tt \qquad \;|\; \descr{message command}$\\
+$\tt \qquad \;|\; \descr{mode command}$\\
+$\tt \qquad \;|\; \descr{show command}$\\
+$\tt \qquad \;|\; \descr{special command}$\\
+$\tt \qquad \;|\; \descr{tracing command}$\\
+$\tt $\\
+$\tt \descr{show command} \rightarrow show \descr{expression list}$\\
+$\tt \qquad \;|\; showvariable \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showtoken \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showdependencies$\\
+$\tt $\\
+$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+$\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,} \descr{symbolic token list}$\\
+$\tt \descr{expression list} \rightarrow \descr{expression} \;|\; \descr{expression list}\hbox{\tt ,} \descr{expression}$\\
+$\tt $\\
+$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{picture variable} also \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable} contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable} doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{option list} \rightarrow \descr{empty} \;|\; \descr{drawing option} \descr{option list}$\\
+$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withrgbcolor \descr{rgbcolor expression} \;|\; withcmykcolor \descr{cmykcolor expression}$\\
+$\tt \qquad \;|\; withgreyscale \descr{numeric expression} \;|\; withoutcolor$\\
+$\tt \qquad \;|\; withprescript \descr{string expression} \;|\; withpostscript \descr{string expression}$\\
+$\tt \qquad \;|\; withpen \descr{pen expression} \;|\; dashed \descr{picture expression}$\\
+$\tt $\\
+$\tt \descr{drawing command} \rightarrow draw \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; \descr{fill type} \descr{path expression} \descr{option list}$\\
+$\tt \descr{fill type} \rightarrow fill \;|\; draw \;|\; filldraw \;|\; unfill \;|\; undraw \;|\; unfilldraw$\\
+$\tt \qquad \;|\; drawarrow \;|\; drawdblarrow \;|\; cutdraw$\\
+$\tt $\\
+$\tt \descr{newinternal command} \rightarrow newinternal \descr{internal type} \descr{symbolic token list}$\\
+$\tt \qquad \;|\; newinternal \descr{symbolic token list}$\\
+$\tt $\\
+$\tt \descr{message command} \rightarrow errhelp \descr{string expression}$\\
+$\tt \qquad \;|\; errmessage \descr{string expression}$\\
+$\tt \qquad \;|\; filenametemplate \descr{string expression}$\\
+$\tt \qquad \;|\; message \descr{string expression}$
+\end{ctabbing}
+\caption{Part 1 of the syntax for commands}
+\index{option list?\tdescr{option list}}\index{picture variable?\tdescr{picture variable}}%
+\label{sycmds1}
+
+% is this really true? in practice, in real implementations?
+%\bigskip
+%By the way, the default for \ttindex{randomseed} is, in effect,
+%$\textsl{day} + \textsl{time}*\epsilon$. Unfortunately, \textsl{time}
+%is in minutes.
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{mode command} \rightarrow batchmode \;|\; nonstopmode$\\
+$\tt \qquad \;|\; scrollmode \;|\; errorstopmode$\\
+$\tt $\\
+$\tt \descr{special command} \rightarrow fontmapfile \descr{string expression}$\\
+$\tt \qquad \;|\; fontmapline \descr{string expression}$\\
+$\tt \qquad \;|\; special \descr{string expression}$\\
+$\tt $\\
+$\tt \descr{tracing command} \rightarrow tracingall \;|\; loggingall \;|\; tracingnone$
+\end{ctabbing}
+\caption{Part 2 of the syntax for commands}
+\index{batchmode?\texttt{batchmode}}\index{nonstopmode?\texttt{nonstopmode}}\index{scrollmode?\texttt{scrollmode}}\index{errorstopmode?\texttt{errorstopmode}}%
+\label{sycmds2}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives}$\\
+$\tt $\\
+$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :} \descr{loop text} endfor$\\
+$\tt \descr{loop header} \rightarrow for \descr{symbolic token} \hbox{\tt =} \descr{progression}$\\
+$\tt \qquad \;|\; for \descr{symbolic token} \hbox{\tt =} \descr{for list}$\\
+$\tt \qquad \;|\; for \descr{symbolic token} \hbox{\tt within} \descr{picture expression}$\\
+$\tt \qquad \;|\; forsuffixes \descr{symbolic token} \hbox{\tt =} \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+$\tt \descr{progression} \rightarrow \descr{numeric expression} upto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression} downto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression} step \descr{numeric expression} until \descr{numeric expression} $\\
+$\tt \descr{for list} \rightarrow \descr{expression} \;|\; \descr{for list}\hbox{\tt ,} \descr{expression}$\\
+$\tt \descr{suffix list} \rightarrow \descr{suffix} \;|\; \descr{suffix list}\hbox{\tt ,} \descr{suffix}$
+\end{ctabbing}
+\caption{The syntax for conditionals and loops}
+\index{balanced tokens?\tdescr{balanced tokens}}\index{suffix?\tdescr{suffix}}%
+\label{sycondloop}
+\end{figure}
+
+\endgroup
+
+
+\subsection{Command-Line Syntax}
+\label{refman:commandline}
+
+\begingroup
+\renewcommand*{\arraystretch}{1.25}% Give command-line switch tables air.
+
+\subsubsection{The MetaPost Program}
+\label{refman:mpost}
+
+\newcommand*{\opt}[1]{\ensuremath{\big[}#1\ensuremath{\big]}}
+\newcommand*{\cmdsw}{\tdescr{switches}}
+\newcommand*{\cmdmem}{\tdescr{preloadfile}}
+\newcommand*{\cmdin}{\tdescr{infile}}
+\newcommand*{\cmdcode}{\tdescr{commands}}
+\newcommand*{\cmdindex}[1]{\index{command-line!mpost?\texttt{mpost}!#1?\texttt{#1}}\texttt{#1}}
+
+The MetaPost program processes commands in the MetaPost language, either
+read from a file or typed-in interactively, and compiles them into
+PostScript or SVG graphics. The run-time behavior of the executable can
+be controlled by command-line parameters, environment variables, and
+configuration files. The MetaPost executable is named
+mpost\label{Dmpost}\index{mpost} (or occasionally just mp). The
+command-line syntax of the executable is
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+mpost \opt{\cmdsw} \opt{\&\cmdmem} \opt{\cmdin} \opt{\cmdcode}
+\end{verbatim}
+\index{mpost?\texttt{mpost}}\index{command-line!mpost?\texttt{mpost}}
+$$
+Any of the parameters is optional. If no argument is given to the
+\verb|mpost| command, MetaPost enters interactive mode\index{interactive
+ mode}, indicated by a \verb|**| prompt\index{**?\texttt{**}!prompt},
+waiting for a file name to be typed-in by keyboard. The file is then
+read-in and processed as if it were given as parameter \cmdin\ on the
+command-line.
+
+\begin{description}
+\item[\cmdin] A MetaPost input file is a text file containing statements
+ in the MetaPost language. Typically, input files have file extension
+ \texttt{mp}\index{mp file?{\tt mp} file}\index{files!mp?{\tt mp}},
+ e.g., \texttt{fig.mp}. Here is how MetaPost searches for input files.
+ If \cmdin\ doesn't end with \texttt{.mp}\index{mp file?{\tt mp}
+ file}\index{files!mp?{\tt mp}}, MetaPost first looks for a file
+ \texttt{\cmdin.mp}. Only if that file doesn't exist, it looks for
+ file \cmdin\ literally. That way, the \texttt{mp}\index{mp file?{\tt
+ mp} file}\index{files!mp?{\tt mp}} file extension can be omitted
+ when calling MetaPost. If \cmdin\ already ends with
+ \texttt{.mp}\index{mp file?{\tt mp} file}\index{files!mp?{\tt mp}}, no
+ special file name handling takes place and MetaPost looks for that
+ file only.
+
+ As an example, if there are two files \texttt{fig} and \texttt{fig.mp}
+ in the current directory and MetaPost is invoked with
+ \verb|'mpost fig'|, the file that gets processed is \texttt{fig.mp}.
+ To process file \texttt{fig} in this situation, MetaPost can be called
+ as \verb|'mpost fig.'|. Note, the trailing dot is only needed as long
+ as there exists a file \texttt{fig.mp} alongside file \texttt{fig}.
+
+ If MetaPost cannot find any input file by the rules specified above,
+ it complaints with an error message and interactively asks for a new
+ input file name.
+
+\item[\cmdcode] All text on the command-line after \cmdin\ is
+ interpreted as MetaPost code and is processed after \cmdin\ is read.
+ If \cmdin\ already contains an \verb|end| statement, \cmdcode\ gets
+ effectively ignored. If MetaPost doesn't encounter an \verb|end|
+ statement neither in \cmdin\ nor in \cmdcode, it enters interactive
+ mode after processing all input.
+
+\item[\texttt{\&\cmdmem}] The MetaPost program code in the \cmdmem\
+ MetaPost source file (and any other files that it inputs) is executed
+ before all other processing starts. The \cmdmem\ file should end with
+ an \texttt{end}\index{end?\texttt{end}} or
+ \texttt{dump}\index{dump?\texttt{dump}} command.
+
+ If neither \texttt{\&\cmdmem} nor \cmdindex{-mem} is specified on the
+ command line, MetaPost will default to loading the macro file
+ \texttt{mpost.mp}\index{mpost.mp?\texttt{mpost.mp}}, or to whatever
+ the actual name of the MetaPost executable is. The \cmdindex{-ini}
+ switch can be used to suppress this behavior.
+
+\item[\cmdsw] MetaPost provides a number of command-line switches that
+ control the run-time behavior. Switches can be prefixed by one or two
+ dashes. Both forms have the same meaning. An exemplary call to
+ MetaPost that compiles a file \texttt{fig.mp}, using \LaTeX\ to
+ typeset \verb|btex|\slash\verb|etex| labels, would look like:
+$$
+\begin{verbatim}
+mpost -tex=latex fig
+\end{verbatim}
+\index{mpost?\texttt{mpost}}
+$$
+
+Here's a summary of the command-line switches provided by mpost:
+
+\setlength{\LTleft}{\leftmargin}
+\begin{longtable}{>{\ttfamily}p{.35\linewidth}>{\raggedright\arraybackslash}p{.6\linewidth}}
+ \cmdindex{-debug}
+ & Don't delete intermediate files.\\
+ \cmdindex{-dvitomp}
+ & Act as the \texttt{dvitomp} executable (see below).\\
+ \cmdindex{-file-line-error}
+ & Start error messages with \verb|`filename:lineno:'| instead of
+ \verb|`!'|.\\
+ \cmdindex{-halt-on-error}
+ & Immediately exit after the first error occurred.\\
+ \cmdindex{-help}
+ & Show help on command-line switches.\\
+ \cmdindex{-ini}
+ & Do not load any preload file.\\
+ \cmdindex{-interaction}=\tdescr{string}
+ & Set interaction mode to one of \texttt{batchmode},
+ \texttt{nonstopmode}, \texttt{scrollmode}, \texttt{errorstopmode}.\\
+ \cmdindex{-jobname}=\tdescr{jobname}
+ & Set the name of the job (affects output file names).\\
+ \cmdindex{-kpathsea-debug}=\tdescr{number}
+ & Set debugging flags for path searching.\\
+ \cmdindex{-mem}=\tdescr{string}
+ & Use \tdescr{string} for the name of the file that contains macros to be preloaded
+ (same as \texttt{\&\cmdmem})\\
+ \cmdindex{-no-file-line-error}
+ & Enable normal MetaPost and \TeX\ style error messages.\\
+ \cmdindex{-no-kpathsea}
+ & Do not use the kpathsea program to find files. All files have to be
+ in the current directory or specified via a full path.\\
+ \cmdindex{-numbersystem}=\tdescr{string}
+ & Set arithmetic mode to one of \texttt{scaled}, \texttt{double},
+ \texttt{binary}, \texttt{decimal}\\
+ \cmdindex{-progname}=\tdescr{string}
+ & Pretend to be the \tdescr{string} executable.\\
+ \cmdindex{-recorder}
+ & Write a list of all opened disk files to
+ \texttt{\tdescr{jobname}.fls}\index{fls file?{\tt fls}
+ file}\index{files!fls?{\tt fls}}. (This functionality is provided
+ by kpathsea.)\\
+ \cmdindex{-s} \tdescr{key}=\tdescr{value}
+ & Set internal variable \tdescr{key} to \tdescr{value}. This switch
+ can be given multiple times on the command-line. The assignments are
+ applied just before the input file is read-in. \tdescr{value} can be
+ an integer between -16383 and 16383 or a string in double quotes. For
+ strings, double quotes are stripped, but no other processing takes
+ place. To avoid double quotes being already stripped by the shell,
+ the whole assignment can be enclosed in another pair of single quotes.
+ Example: \verb|-s 'outputformat="svg"' -s prologues=3|\newline
+ Use SVG backend converting font shapes to paths.\\
+ \cmdindex{-tex}=\tdescr{texprogram}
+ & Load format \tdescr{texprogram} for rendering \TeX\ material.\\
+ \cmdindex{-troff}, \cmdindex{-T}
+ & Output troff compatible PostScript files.\\
+ \cmdindex{-version}
+ & Print version information and exit.\\
+\end{longtable}
+
+The following command-line switches are silently ignored in
+\emph{mplib}-based MetaPost (v1.100 or later), because they are always
+`on':
+
+\begin{longtable}{>{\ttfamily}p{.35\linewidth}>{\raggedright\arraybackslash}p{.6\linewidth}}
+ \cmdindex{-8bit}
+ & \\
+ \cmdindex{-parse-first-line}
+ & \\
+\end{longtable}
+
+The following command-line switches are ignored, but trigger a warning:
+
+\begin{longtable}{>{\ttfamily}p{.35\linewidth}>{\raggedright\arraybackslash}p{.6\linewidth}}
+ \cmdindex{-no-parse-first-line}
+ & \\
+ \cmdindex{-output-directory}=\tdescr{string}
+ & \\
+ \cmdindex{-translate-file}=\tdescr{string}
+ & \\
+\end{longtable}
+
+\end{description}
+
+\subsubsection{The dvitomp Program}
+\label{refman:dvitomp}
+
+\renewcommand*{\cmdindex}[1]{\index{command-line!dvitomp?\texttt{dvitomp}!#1?\texttt{#1}}\texttt{#1}}
+\renewcommand*{\cmdin}{\tdescr{infile}}
+\newcommand*{\cmdout}{\tdescr{outfile}}
+
+The dvitomp\label{Ddvitomp}\index{dvitomp} program converts
+DVI\index{dvi file?{\tt dvi} file}\index{files!dvi?{\tt dvi}} files into
+low-level MetaPost code. MetaPost uses the dvitomp program when
+typesetting \verb|btex|\slash\verb|etex| labels by \TeX\ for the final
+conversion back into MetaPost code. The command-line syntax of the
+executable is
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+dvitomp \opt{\cmdsw} \cmdin \opt{\cmdout}
+\end{verbatim}
+\index{dvitomp?\texttt{dvitomp}}\index{command-line!dvitomp?\texttt{dvitomp}}
+$$
+Parameters \cmdsw\ and \cmdout\ are optional.
+
+\begin{description}
+\item[\cmdin] This is the name of the DVI file to convert. If the name
+ doesn't end with \texttt{.dvi}\index{dvi file?{\tt dvi}
+ file}\index{files!dvi?{\tt dvi}}, that extension is appended. Note,
+ dvitomp never opens files not ending \texttt{.dvi}. This file is in
+ general automatically generated by \TeX\ or troff, driven by MetaPost.
+
+\item[\cmdout] This is the name of the output file containing the
+ MetaPost code equivalent to \cmdin. If \cmdout\ is not given,
+ \cmdout\ is \cmdin\ with the extension \texttt{.dvi} replaced by
+ \texttt{.mpx}\index{mpx file?{\tt mpx} file}\index{files!mpx?{\tt
+ mpx}}. If \cmdout\ is given and doesn't end with
+ \texttt{.mpx}\index{mpx file?{\tt mpx} file}\index{files!mpx?{\tt
+ mpx}}, that extension is appended.
+
+\item[\cmdsw] Command-line switches can be prefixed by one or two
+ dashes. Both forms have the same meaning. The following command-line
+ switches are provided by dvitomp:
+
+\setlength{\LTleft}{\leftmargin}
+\begin{longtable}{>{\ttfamily}p{.35\linewidth}>{\raggedright\arraybackslash}p{.6\linewidth}}
+ \cmdindex{-help}
+ & Show help on command-line switches.\\
+ \cmdindex{-kpathsea-debug}=\tdescr{number}
+ & Set debugging flags for path searching.\\
+ \cmdindex{-progname}=\tdescr{string}
+ & Pretend to be the \tdescr{string} executable.\\
+ \cmdindex{-version}
+ & Print version information and exit.\\
+\end{longtable}
+
+\end{description}
+
+The dvitomp program used to be part of a set of external tools, called
+\emph{mpware}\index{mpware tools}\footnote{makempx, mpto, dvitomp, and
+ dmp.}, which were used by MetaPost for processing
+\verb|btex|\slash\verb|etex| labels. Since MetaPost version~1.100, the
+label conversion is handled internally by the mpost\index{mpost}
+program. The \emph{mpware} tools are therefore obsolete and no longer
+part of the MetaPost distribution. Nowadays, dvitomp is either a copy
+of the mpost executable with the name dvitomp or a wrapper, calling
+mpost\index{mpost} as
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+mpost -dvitomp \cmdin \cmdout
+\end{verbatim}
+\index{mpost?\texttt{mpost}}
+$$
+
+\endgroup
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: "mpman"
+%%% End:
diff --git a/systems/doc/metapost/source-manual/mpman-charts.mp b/systems/doc/metapost/source-manual/mpman-charts.mp
new file mode 100644
index 0000000000..6dc550965a
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman-charts.mp
@@ -0,0 +1,210 @@
+verbatimtex
+ \def\appl#1{\applfontx#1\strut}
+ \def\ext#1{\extfontx#1\strut}
+ \font\applfontx=ec-lmri10
+ \font\extfontx=ec-lmtt10
+ \font\extfontvii=ec-lmtt8 at 7pt
+etex
+
+% Use the boxes package for drawing charts.
+input boxes
+input charts
+%prologues:=3;
+
+if scantokens(mpversion) < 1.200:
+ filenametemplate
+else:
+ outputtemplate :=
+fi
+"%j-%c.mps";
+
+
+beginfig(1);
+ interim applwidth := 72bp;
+ interim applheight := 28bp;
+ interim extwidth := 48bp;
+ interim extheight := 28bp;
+ interim rowscale := 56bp;
+ interim colscale := 100bp;
+ interim ahangle := 30;
+
+% Build and draw boxes.
+ ext_rc(fig.mp, (0,0), btex \ext{fig.mp} etex);
+ appl_rc(mpost, (1,0), btex \appl{MetaPost} etex);
+ ext_rc(fig.1, (2,0), btex \ext{fig.1} etex);
+ ext_rc(doc.tex, (0,2), btex \ext{doc.tex} etex);
+ appl_rc(tex, (1,2), btex \appl{\TeX} etex);
+ ext_rc(doc.dvi, (2,2), btex \ext{doc.dvi} etex);
+ appl_rc(dvips, (3,1), btex \appl{dvips} etex);
+ ext_rc(doc.ps, (4,1), btex \ext{doc.ps} etex);
+
+% Draw connections.
+ line(fig.mp, mpost);
+ line(mpost, fig.1);
+ line(doc.tex, tex);
+ line(tex, doc.dvi);
+ curve(fig.1, dvips, -90, 0);
+ curve(doc.dvi, dvips, -90, 180);
+ line(dvips, doc.ps);
+
+% Draw bounding box link.
+ boxit.bb(btex
+ \vbox{
+ \hbox to 50bp {\hfil\strut bounding\hfil}
+ \hbox to 50bp {\hfil\strut box\hfil}
+ }
+ etex scaled .8);
+ path p;
+ p := fig.1.e{right}..{right}tex.w;
+ bb.c = point 0.5 of p;
+ drawunboxed(bb);
+ draw p cutafter bpath bb dashed evenly;
+ drawarrow p cutbefore subpath (1,3) of bpath bb dashed evenly;
+endfig;
+
+
+verbatimtex
+ \font\applfontx=ec-lmbxi10
+etex
+
+beginfig(2);
+% Pre-define workflow segment parameters.
+ wfsegments := 6;% counter
+ wfsegangle = 360/wfsegments;% angle
+ wfstart := 90;% angle
+ wfdiam := 200bp;% dimension
+ wfthick := 48bp;% dimension
+ wfgap := 8;% angle
+ wfinset := 8;% angle
+
+% Pre-define colors of some graphic elements.
+ color wf_col, appl_col, ext_col;
+ wf_col = .9white;
+ appl_col = (.1, .1, .7);
+ ext_col = 0white;
+
+% The size of the user icon.
+ usersize := 20bp;
+
+% Construct a workflow segment.
+%
+% * The anchor point of a workflow segment is at its center.
+%
+% * Array wfang[] stores the angle on a circle corresponding
+% to a vertex of a workflow segment. The mapping of indices
+% to vertices is:
+%
+% 2---------0
+% / /
+% 3 1
+% \ \
+% 2---------0
+%
+% * For array wfscale[] the mapping is:
+%
+% 3---------0
+% / /
+% < <
+% \ \
+% 2---------1
+%
+ numeric wfang[], wfscale[];
+ path wfseg;
+ wfang0 = .5(-wfsegangle + wfgap - wfinset);
+ wfang1 = .5(-wfsegangle + wfgap + wfinset);
+ wfang2 = .5( wfsegangle - wfgap - wfinset);
+ wfang3 = .5( wfsegangle - wfgap + wfinset);
+ wfscale[0] = 1 + wfthick/wfdiam;
+ wfscale[1] = 1 - wfthick/wfdiam;
+ wfscale[2] = 1 - 1.0*wfthick/wfdiam;
+ wfscale[3] = 1 + 1.0*wfthick/wfdiam;
+ wfseg := 0.5dir(wfang0)*wfscale0 {dir(wfang0-180)}
+ ..{dir(wfang1+135)} 0.5dir(wfang1) {dir(wfang1-135)}
+ ..{dir(wfang0+180)} 0.5dir(wfang0)*wfscale1 {dir(wfang0+90)}
+ ..{dir(wfang2+90)} 0.5dir(wfang2)*wfscale2 {dir(wfang2)}
+ ..{dir(wfang3+45)} 0.5dir(wfang3) {dir(wfang3-45)}
+ ..{dir(wfang2)} 0.5dir(wfang2)*wfscale3 {dir(wfang2-90)}
+ ..{dir(wfang0-90)} cycle;
+
+% Store user icon in picture variable.
+ picture unituserLeft, unituserRight;
+ unituserRight := image(
+% This clip-art has been taken from the Open Clip-Art Library at
+% <URL:http://www.openclipart.org/about>. The original SVG file by
+% 'yyycatch' is licensed as Public Domain and can be found at
+% <URL:http://www.openclipart.org/detail/18601>. It has been
+% converted to MetaPost by exporting the SVG file to EPS in Inkscape
+% and then coordinates, colours and pens have been manually translated
+% to the corresponding MetaPost commands.
+ path p[];
+ p1 =
+ (39.387, 60.034) .. controls (17.117, 59.401) and (-0.352, 22.932)
+ .. (7.887, 10.565) .. controls (16.125, -1.802) and (64.465, -1.802)
+ .. (72.34, 10.565) .. controls (80.215, 22.932) and (62.383, 60.686)
+ .. cycle;
+ p2 =
+ (22.809, 52.588)
+ -- (59.93, 52.588) .. controls (59.93, 52.588) and (60.523, 15.705)
+ .. (47.293, 15.705) .. controls (34.852, 15.705) and (22.809, 52.588)
+ .. cycle;
+ p3 =
+ (69.125, 67.963) .. controls (69.125, 50.881) and (56.723, 37.037)
+ .. (41.422, 37.037) .. controls (26.125, 37.037) and (13.723, 50.881)
+ .. (13.723, 67.963) .. controls (13.723, 85.045) and (26.125, 98.893)
+ .. (41.422, 98.893) .. controls (56.633, 98.893) and (69, 85.198)
+ .. cycle;
+ p4 =
+ (31.047, 76.764) .. controls (31.047, 76.764) and (43.93, 63.147)
+ .. (57.152, 64.209) .. controls (70.398, 65.276) and (79.316, 71.444)
+ .. (79.316, 71.444) .. controls (79.316, 71.444) and (72.488, 108.674)
+ .. (41.977, 109.291) .. controls (18.086, 109.791) and (6.324, 86.862)
+ .. (2.84, 71.444) .. controls (-0.691, 55.83) and (4.152, 55.889)
+ .. (9.313, 57.221) .. controls (14.477, 58.549) and (31.047, 76.764)
+ .. cycle;
+ p5 =
+ (84.211, 30.416) .. controls (87.586, 25.877) and (85.977, 18.955)
+ .. (80.617, 14.967) .. controls (75.258, 10.979) and (68.164, 11.428)
+ .. (64.785, 15.971)
+ -- (64.734, 16.037) .. controls (62.766, 18.741) and (62.41, 30.342)
+ .. (65.918, 32.764) .. controls (69.781, 35.428) and (80.832, 34.955)
+ .. cycle;
+ interim linecap := butt;
+ interim linejoin := mitered;
+ fill p1 withcolor (1, 0.501961, 0.501961);
+ draw p1 withcolor 0.219608 withpen pencircle scaled 2.577288;
+ fill p2 withcolor 1;
+ draw p2 withcolor 0.219608 withpen pencircle scaled 2.782928;
+ fill p3 withcolor (1, 0.8, 0.666667);
+ draw p3 withcolor 0.219608 withpen pencircle scaled 3.31912;
+ fill p4 withcolor (0.827451, 0.552941, 0.372549);
+ draw p4 withcolor 0.219608 withpen pencircle scaled 3.262816;
+ fill p5 withcolor (1, 0.8, 0.666667);
+ draw p5 withcolor 0.219608 withpen pencircle scaled 2.4;
+ );
+% Normalize user icon.
+ unituserRight := unituserRight shifted (-llcorner unituserRight -.5urcorner unituserRight);
+ unituserRight := unituserRight scaled (.5/ypart urcorner unituserRight);
+ unituserLeft := unituserRight reflectedabout ((0,0), (0,1));
+
+% Helper function: transform location on workflow circle in
+% degrees into cartesian coordinates.
+ def degtoxy(expr deg) =
+ (point deg/45 of fullcircle scaled wfdiam)
+ enddef;
+
+% Draw workflow segments.
+ for i=0 upto wfsegments-1:
+ fill wfseg scaled wfdiam rotated (wfstart+i*wfsegangle) withcolor wf_col;
+ endfor
+
+% Fill-in workflow segment descriptions.
+ label(unituserLeft scaled usersize, degtoxy(wfstart+wfsegangle*0));
+ label(btex \appl{Editor} etex, degtoxy(wfstart+wfsegangle*1)) withcolor appl_col;
+ label(btex \ext{fig.mp} etex, degtoxy(wfstart+wfsegangle*2)) withcolor ext_col;
+ label(btex \appl{MetaPost} etex, degtoxy(wfstart+wfsegangle*3)) withcolor appl_col;
+ label(btex \ext{fig.1} etex, degtoxy(wfstart+wfsegangle*4+wfsegangle/7)) withcolor ext_col;
+ label(btex \ext{fig.log} etex, degtoxy(wfstart+wfsegangle*4-wfsegangle/7)) withcolor .7[ext_col, wf_col];
+ label(btex \appl{Previewer} etex, degtoxy(wfstart+wfsegangle*5)) withcolor appl_col;
+endfig;
+
+end
diff --git a/systems/doc/metapost/source-manual/mpman.bib b/systems/doc/metapost/source-manual/mpman.bib
new file mode 100644
index 0000000000..7f089f8ba7
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman.bib
@@ -0,0 +1,135 @@
+% BibTeX entries for MetaPost doc, by John Hobby. Public domain.
+
+@string{dcg = "Discrete and Computational Geometry"}
+
+@book{kn:a,
+ author = "D. E. Knuth",
+ note = "Volume A of {\it Computers and Typesetting}",
+ title = "The {\TeX}book",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{kn:c,
+ author = "D. E. Knuth",
+ note = "Volume C of {\it Computers and Typesetting}",
+ title = "The {\MF}book",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@article{kn:mf3,
+ author = "D. E. Knuth",
+ title = "The New Versions of {\TeX} and {\MF}",
+ journal = "{TUG}boat, the\/ {\TeX} User's Group Newsletter",
+ volume = 10,
+ number = 3,
+ pages = "325--328",
+ month = nov,
+ year = 1989
+}
+@book{kn:e,
+ author = "D. E. Knuth",
+ note = "Volume E of {\it Computers and Typesetting}",
+ title = "Computer Modern Typefaces",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{ad:red,
+ author = "{Adobe Systems Inc.}",
+ title = "{P}ost{S}cript Language Reference Manual",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ year = 1986
+}
+@book{ad:red2,
+ author = "{Adobe Systems Inc.}",
+ title = "{P}ost{S}cript Language Reference Manual",
+ publisher = "Addison Wesley",
+ address = "Reading, Massachusetts",
+ edition = "second",
+ year = 1990
+}
+@article{ho:mp1,
+ author = "J. D. Hobby",
+ title = "A {\MF}-like System with {P}ost{S}cript Output",
+ journal = "{TUG}boat, the\/ {\TeX} User's Group Newsletter",
+ volume = 10,
+ number = 4,
+ pages = "505--512",
+ month = dec,
+ year = 1989
+}
+@article{ho:splin,
+ key = "Hobby",
+ author = "J. D. Hobby",
+ title = "Smooth, Easy to Compute Interpolating Splines",
+ journal = dcg,
+ volume = 1,
+ number = 2,
+ pagest = "123--140",
+ year = 1986
+}
+@manual{w3c:svg1.1,
+ organization = "World Wide Web Consortium (W3C)",
+ title = "Scalable Vector Graphics (SVG)~1.1 Specification",
+ month = jan,
+ year = 2003,
+ note = "\url{http://www.w3.org/TR/SVG11/}"
+}
+@manual{reckdahl:epslatex,
+ author = "Keith Reckdahl",
+ title = "Using Imported Graphics in {\LaTeX} and {pdf\LaTeX}",
+ month = jan,
+ year = 2006,
+ edition = "3.0.1",
+ note = "\texttt{CTAN://info/epslatex}"
+}
+@manual{hagen:metafun,
+ author = "Hans Hagen",
+ title = "Metafun",
+ month = jan,
+ year = 2002,
+ note = "\url{http://www.pragma-ade.com/general/manuals/metafun-s.pdf}"
+}
+@manual{luatex:manual,
+ organization = "Lua\TeX\ development team",
+ title = "Lua\TeX: Reference Manual",
+ note = "\url{http://www.luatex.org/svn/trunk/manual/luatexref-t.pdf}"
+}
+@manual{hagen:luamplib,
+ author = "Hans Hagen and Taco Hoekwater and Elie Roux",
+ title = "The luamplib package",
+ note = "\texttt{CTAN://macros/luatex/generic/luamplib/luamplib.pdf}"
+}
+@misc{lib:cairo,
+ key = "Cairo",
+ title = "Cairo graphics library",
+ note = "\texttt{http://cairographics.org/}"
+}
+% taken from http://www.mpfr.org/faq.html#cite
+@Article{lib:mpfr,
+ author = "Laurent Fousse and Guillaume Hanrot and Vincent Lef\`evre and Patrick
+ P\'elissier and Paul Zimmermann",
+ title = "{MPFR}: A Multiple-Precision Binary Floating-Point Library with Correct Rounding",
+ journal = "{ACM} Transactions on Mathematical Software",
+ volume = "33",
+ number = "2",
+ month = jun,
+ year = "2007",
+ pages = "13:1--13:15",
+ URL = "http://doi.acm.org/10.1145/1236463.1236468",
+ abstract = "This paper presents a multiple-precision binary floating-point library,
+ written in the ISO C language, and based on the GNU MP library. Its
+ particularity is to extend to arbitrary-precision ideas from the IEEE 754
+ standard, by providing \emph{correct rounding} and \emph{exceptions}.
+ We demonstrate how these strong semantics are achieved --- with no
+ significant slowdown with respect to other arbitrary-precision tools
+ --- and discuss a few applications where such a library can be useful.",
+}
+@misc{lib:decnumber,
+ key = "decnumber",
+ title = "dec{N}umber {ANSI} {C} implementation of General Decimal Arithmetic",
+ note = "\texttt{http://speleotrove.com/decimal/decnumber.html}"
+}
diff --git a/systems/doc/metapost/source-manual/mpman.ist b/systems/doc/metapost/source-manual/mpman.ist
new file mode 100644
index 0000000000..9238679ce0
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman.ist
@@ -0,0 +1,4 @@
+% MakeIndex style file for MetaPost doc, by John Hobby. Public domain.
+
+% @ is a valid character in some entries
+actual '?' % ? instead of @
diff --git a/systems/doc/metapost/source-manual/mpman.mp b/systems/doc/metapost/source-manual/mpman.mp
new file mode 100644
index 0000000000..342389e6aa
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman.mp
@@ -0,0 +1,851 @@
+% Figures for MetaPost manual, by John Hobby. Public domain.
+
+if scantokens(mpversion) < 1.200:
+ filenametemplate
+else:
+ outputtemplate :=
+fi
+"%j-%c.mps";
+
+%%% This redefinition of dotlabel draws dots as a closed path
+%%% which are rendered more smoothly in Adobe Reader.
+vardef dotlabel@#(expr s,z) text t_ =
+ label@#(s,z) t_;
+ addto currentpicture
+ contour (makepath pencircle scaled dotlabeldiam) shifted z t_;
+enddef;
+
+
+beginfig(1);
+draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0);
+endfig;
+
+
+beginfig(2); numeric u;
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2:
+ drawdot (i*u,j*u);
+ endfor
+endfor
+endfig;
+
+
+beginfig(3);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(104);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4..cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(204);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3--z4--cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(5);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+path p; p = z0..z1..z2..z3..z4;
+draw p;
+for t=0 upto 3:
+ draw point t of p--postcontrol t of p
+ --precontrol t+1 of p--point t+1 of p
+ dashed (evenly scaled .5);
+endfor
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(6);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1{up}..z2{left}..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+
+
+beginfig(109);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}..z1{right}..z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(209);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}...z1{right}...z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(110);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(210);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.3..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(310);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.5 and 1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(111);
+numeric u, c; 10u=1.4in; c=0;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(211);
+numeric u, c; 10u=1.4in; c=1;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(311);
+numeric u, c; 10u=1.4in; c=2;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(411);
+numeric u, c; 10u=1.4in; c=infinity;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+%
+dotlabels.bot(1,2);
+dotlabels.rt(3);
+dotlabels.lft(6);
+dotlabels.top(20,30,40);
+endfig;
+
+
+vardef llet(expr c) =
+ c infont defaultfont scaled magstep3
+enddef;
+
+primarydef p centered h =
+ (p shifted (h - xpart .5[llcorner p,lrcorner p], 0))
+enddef;
+
+beginfig(14);
+string s; s = "abcde";
+numeric u,n, ytop, ybot;
+n = 5;
+ytop = 3bp + ypart urcorner llet(s);
+ybot = -3bp + ypart llcorner llet(s);
+ytop - ybot = u;
+draw (n*u,ybot)--(0,ybot)--(0,ytop)--(n*u,ytop);
+for i=1 upto n:
+ draw (i*u,ybot)..(i*u,ytop);
+ draw llet(substring (i-1,i) of s) centered ((i-.5)*u);
+ label.bot(decimal i, (i*u,ybot));
+endfor
+picture llab; llab = btex \llap{$x={}$}0 etex;
+z0 = urcorner llab;
+draw llab shifted (-.5*x0, ybot-labeloffset-y0);
+endfig;
+
+
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+
+
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+
+
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+
+
+beginfig(20);
+picture p;
+p = "testing" infont "ptmr8r" scaled 7;
+draw p;
+draw llcorner p--lrcorner p--urcorner p--ulcorner p--cycle;
+dotlabel.lft(btex \tt llcorner etex, llcorner p);
+dotlabel.rt(btex \tt lrcorner etex, lrcorner p);
+dotlabel.lft(btex \tt ulcorner etex, ulcorner p);
+dotlabel.rt(btex \tt urcorner etex, urcorner p);
+endfig;
+
+
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+
+
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+
+
+beginfig(123);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+draw aa;
+draw b dashed evenly;
+z1 = aa intersectionpoint reverse b;
+z2 = reverse aa intersectionpoint b;
+dotlabel.rt(btex 1 etex, z1);
+dotlabel.lft(btex 2 etex, z2);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+beginfig(223);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+numeric t[], tt[];
+(t1,8-tt1) = aa intersectiontimes reverse b;
+(4-t2,tt2) = reverse aa intersectiontimes b;
+pickup(pencircle scaled .3);
+draw aa;
+draw b;
+pickup(pencircle scaled .8);
+draw subpath (t1,t2) of aa;
+draw subpath (tt2,tt1) of b;
+dotlabel.rt(btex 1 etex, point t1 of aa);
+dotlabel.lft(btex 2 etex, point t2 of aa);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+
+
+beginfig(25);
+numeric u;
+u = .2in;
+path a, b;
+a = (0,0){up}..(4u,0)..(8u,0)..(8u,4u);
+b = (10u,3u)..(5u,u)..(-u,u);
+numeric t; t=0;
+forsuffixes $=bot, llft, lrt, lft:
+ dotlabel$(decimal t, point t of a);
+ t:=t+1;
+endfor
+for i=0 upto 2:
+ dotlabel.top(decimal i, point i of b);
+endfor
+pickup(pencircle scaled .3);
+draw a;
+pickup(pencircle scaled .8);
+draw b;
+% intersections (atime, btime):
+% (0.2501,1.77225)
+% (2.58316,0.23619)
+% (0.75288,1.40094)
+endfig;
+
+
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+
+beginfig(261);
+path p[] ;
+pen mypen ;
+pen mypenC;
+numeric L ;
+numeric S ;
+L:=10;
+Sa:=1;
+Sb:=2;
+Rot=32;
+p[-1] := ( (Sa*cosd(0),Sb*sind(0)) for i=1 upto L-1: -- (Sa*cosd(i/L*360), Sb*sind(i/L*360)) endfor -- cycle ) rotated Rot;
+mypen := makepen(p[-1]) ;
+mypenC:= (pencircle xscaled 2Sa yscaled 2Sb) rotated Rot;
+p0 := (0,0){down} .. {up} (100,0) ;
+p1 := envelope mypen of p0 ;
+draw p1 withcolor black withpen pencircle scaled 0.2pt ;
+draw p0 withcolor 0.8white withpen mypenC;
+for t=1 upto length(p1):
+ draw (point t of p1) withpen pencircle scaled 0.8pt;
+endfor;
+%currentpicture := currentpicture scaled 30 ;
+endfig;
+
+
+
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+
+
+beginfig(29);
+if unknown withdots: % So this works w/o MetaPost version 0.5
+ picture withdots; withdots=dashpattern(off 2.5 on 0 off 2.5);
+fi
+z0 = (0,0);
+z1 = (2in-2bp,0);
+for i=1 upto 4:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+draw z0..z1 dashed evenly;
+label.rt(btex \tt dashed evenly etex, z1);
+draw z2..z3 dashed evenly scaled 2;
+label.rt(btex \tt dashed evenly scaled 2 etex, z3);
+draw z4..z5 dashed evenly scaled 4;
+label.rt(btex \tt dashed evenly scaled 4 etex, z5);
+draw z6..z7 dashed withdots;
+label.rt(btex \tt dashed withdots etex, z7);
+draw z8..z9 dashed withdots scaled 2;
+label.rt(btex \tt dashed withdots scaled 2 etex, z9);
+endfig;
+
+
+beginfig(30);
+picture e[]; e4=evenly scaled 4;
+z0 = (0,0);
+z1 = (2in,0);
+for i=1 upto 3:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+dotlabels.lft(0,2,4,6);
+draw z0..z1 dashed e4;
+dotlabel.rt(btex 1 \tt\ draw z0..z1 dashed e4 etex, z1);
+draw z2..z3 dashed e4 shifted (6bp,0);
+dotlabel.rt(btex 3 \tt\ draw z2..z3 dashed e4 shifted (6bp,0) etex, z3);
+draw z4..z5 dashed e4 shifted (12bp,0);
+dotlabel.rt(btex 5 \tt\ draw z4..z5 dashed e4 shifted (12bp,0) etex, z5);
+draw z6..z7 dashed e4 shifted (18bp,0);
+dotlabel.rt(btex 7 \tt\ draw z6..z7 dashed e4 shifted (18bp,0) etex, z7);
+endfig;
+
+
+beginfig(31);
+picture d; d = dashpattern(on 6bp off 12bp on 6bp);
+draw d;
+endfig;
+
+
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+
+
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,-40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+
+
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,-50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+
+
+beginfig(35);
+z2a=(0,0);
+(-x1a,y1a) = -z3a = .5in*unitvector(6,1);
+z1b - z1a = .75*z1a rotated -90;
+z2b - z1b = whatever*(z2a-z1a);
+z3b - z2b = whatever*(z3a-z2a);
+y2b = 0;
+z3b - z3a = whatever*(z3a rotated 90);
+z0b-z1b = z0a-z1a = z1a;
+x4a=x2a; x4b=x2b;
+y4a = y4b = 1.3*y3b;
+fill z1a--z2a--z3a--z3b--z2b--z1b--cycle withcolor .8 white;
+for p= z2a--z4a, z2b--z4b, z0a--z1a, z0b--z1b:
+ draw p dashed evenly;
+endfor
+drawdblarrow z4a--z4b;
+drawdblarrow z0a--z0b;
+label.bot(btex miter length etex, .5[z4a,z4b]);
+label.ulft(btex line width etex, .5[z0a,z0b]);
+endfig;
+
+
+beginfig(36);
+z[-1]=(0,0); z0=(1in,0);
+for i=1 upto 6:
+ z[i]-z[i-2] = (0,-15pt);
+ if x[i]=0: label.lft(decimal i, z[i]);
+ fi
+endfor
+drawarrow z1..z2;
+drawarrow reverse(z3..z4);
+drawdblarrow z5..z6;
+label.rt(btex 2 \tt\ drawarrow z1..z2 etex, z2);
+label.rt(btex 4 \tt\ drawarrow reverse(z3..z4) etex, z4);
+label.rt(btex 6 \tt\ drawdblarrow z5..z6 etex, z6);
+endfig;
+
+
+beginfig(37);
+path p, q, r;
+ahlength := 1.5cm;
+pickup pencircle scaled .2cm;
+p = (0,0)..{right}(2.5cm,2cm);
+q = counterclockwise arrowhead p;
+z0 = directionpoint up of q;
+z.a = directionpoint right of q;
+z.b = directionpoint (-1,-1) of q;
+drawarrow p withcolor .4white;
+pickup defaultpen;
+undraw p;
+undraw q;
+ahlength:=4bp;
+z.a1-z0 = .3cm*unitvector(z.a-z0) rotated 90;
+z.a1-z.a2 = z0-z.a;
+z.b1-z0 = .3cm*unitvector(z.b-z0) rotated -90;
+z.b1-z.b2 = z0-z.b;
+z.ab = whatever[z.a1,z.a2] = whatever[z.b1,z.b2];
+z.a0-z.ab = .4cm*unitvector(z.a1-z.a2);
+z.b0-z.ab = .4cm*unitvector(z.b1-z.b2);
+drawdblarrow z.a1..z.a2;
+label.lrt(btex \tt ahlength etex, .9[z.a1,z.a2]);
+draw z.a1..z.a0 dashed evenly;
+drawdblarrow z.b1..z.b2;
+label.urt(btex \tt ahlength etex, .9[z.b1,z.b2]);
+draw z.b1..z.b0 dashed evenly;
+r = z.a0{(z.a2-z.a0) rotated 90}..{(z.b2-z.b0)rotated 90}z.b0;
+draw r;
+label.rt(btex \tt ahangle etex, point .5 of r);
+endfig;
+
+
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+
+
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+
+
+marksize=4pt;
+angle_radius=8pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+
+
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+
+
+beginfig(55)
+picture wheel, car;
+path body;
+ u := 5bp;
+ % Use a calligraphic pen.
+ pickup pencircle scaled .1u yscaled .6 rotated 30;
+ % Define a wheel object.
+ wheel := image(
+ draw fullcircle scaled 2u xscaled .8 rotated 30;
+ draw fullcircle scaled .1u xscaled .8 rotated 30
+ withpen currentpen scaled .5;
+ );
+ % Construct path for car body.
+ body := (3.2u,0){right}..(4.5u,1.5u){up}..(1.5u,2.5u){dir(-170)}
+ ..(1.5u,4.25u){up}...(0,5u){left};
+ body := body .. reverse body reflectedabout (origin, (0,u));
+ % Define a car object.
+ car := image(
+ draw wheel shifted (2u, 0);% Draw two wheels.
+ draw wheel shifted (-2u, 0);
+ draw (-.8u,0){dir(5)}..(.8u,0);% Draw connection betweeen wheels.
+ draw body;% Draw body.
+ % Draw speed indicators.
+ for i=1.5, 2, 2.5:
+ draw (5u, u*i){right}..{dir(-10)}(6.5u,u*i*.95);
+ endfor
+ ) shifted (0, u) slanted -.2 rotated 1;% Introduce asymmetries.
+ % Draw two cars and a faster one.
+ draw car shifted (5u,0);
+ draw car shifted (20u,0);
+ draw car slanted -.25 shifted (45u,0);
+ % Draw motorway.
+ draw (-5u,-u)...(25u,-.5u)...(60u,-u)
+ withpen currentpen scaled 4 withcolor .7white;
+endfig;
+
+
+fontmapfile "=lm-ec.map";
+beginfig(56);
+ picture q;
+ path p;
+ interim ahlength := 12bp;
+ interim ahangle := 25;
+ q := glyph "Dcaron" of "ec-lmr10" scaled .2;
+ for item within q:
+ p := pathpart item;
+ drawarrow p withcolor (.6,.9,.6)
+ withpen pencircle scaled 1.5;
+ for j=0 upto length p:
+ pickup pencircle scaled .7;
+ draw (point j of p -- precontrol j of p)
+ dashed evenly withcolor blue;
+ draw (point j of p -- postcontrol j of p)
+ dashed evenly withcolor blue;
+ pickup pencircle scaled 3;
+ draw precontrol j of p withcolor red;
+ draw postcontrol j of p withcolor red;
+ pickup pencircle scaled 2;
+ draw point j of p withcolor black;
+ endfor
+ endfor
+endfig;
+
+
+%%% Title page rule.
+beginfig(60);
+ pickup pencircle scaled 1.1bp;
+ linecap := rounded;
+ draw origin--(4.38in,0);
+endfig;
+
+
+beginfig(61);
+ def shape_with_cardinal_points(expr shape) =
+ image(
+ interim ahangle := 30;
+ interim ahlength := 6bp;
+ drawarrow shape withpen pencircle scaled .5;
+ for k = 0 upto length shape:
+ drawdot point k of shape withpen pencircle scaled dotlabeldiam;
+ endfor
+ )
+ enddef;
+
+ draw shape_with_cardinal_points(fullcircle scaled 1in);
+ draw shape_with_cardinal_points(unitsquare scaled 1in) withcolor .5white;
+endfig;
+
+end
diff --git a/systems/doc/metapost/source-manual/mpman.tex b/systems/doc/metapost/source-manual/mpman.tex
new file mode 100644
index 0000000000..ec77468753
--- /dev/null
+++ b/systems/doc/metapost/source-manual/mpman.tex
@@ -0,0 +1,6008 @@
+% $Id: mpman.tex 2139 2018-02-19 14:38:47Z luigi.scarso@gmail.com $
+% MetaPost manual, by John Hobby. License at end.
+\listfiles
+\RequirePackage{ifpdf}
+\ifpdf
+\ifnum\pdftexversion<140
+\else
+\pdfminorversion=5
+\pdfobjcompresslevel=1% Use compressed object streams.
+\fi
+\RequirePackage{cmap}
+\fi
+\documentclass{article} % article is NOT the original style
+\usepackage[nofancy]{svninfo}% Access VCS information.
+\svnInfo $Id: mpman.tex 2140 2019-06-01 14:38:47Z luigi.scarso@gmail.com $
+%\svnInfo $Id: mpman.tex 2139 2018-02-19 14:38:47Z luigi.scarso@gmail.com $
+\newcommand*{\mpversion}{2.00}
+
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{textcomp}
+\usepackage{mflogo}
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment
+ {verbatim}{BVerbatim}{baseline=c}
+\usepackage{graphicx}
+\usepackage[latin1]{inputenc}
+\usepackage[textwidth=6in,textheight=8.65in]{geometry}
+\usepackage{tocloft}
+ \setlength\cftbeforesecskip{1.3ex plus 0.3ex minus 0.3ex}
+ \setcounter{tocdepth}{2}
+\usepackage{ltxtable}
+
+
+\def\ttindex#1{{\tt #1}\index{#1?\texttt{#1}}}
+\def\ttt{\texttt} % I get tired of typing this out
+
+\def\ConTeXt{Con\TeX t}
+
+\newcommand\descr[1]{{\langle\hbox{#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{{\normalfont$\langle$\invisgap#1\invisgap$\rangle$}}
+
+\newcommand\pl{\dag}
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+
+\renewcommand{\topfraction}{.85}
+\renewcommand{\bottomfraction}{.7}
+\renewcommand{\textfraction}{.15}
+\renewcommand{\floatpagefraction}{.5}
+\renewcommand{\dbltopfraction}{.66}
+\renewcommand{\dblfloatpagefraction}{.66}
+\setcounter{topnumber}{9}
+\setcounter{bottomnumber}{9}
+\setcounter{totalnumber}{20}
+\setcounter{dbltopnumber}{9}
+
+\makeindex
+
+\usepackage{multicol}
+\usepackage[rgb,x11names]{xcolor}% Optimize for screen reading.
+\usepackage{hyperxmp}
+\usepackage{hyperref}
+\hypersetup{
+ pdftitle={MetaPost: A User's Manual},
+ pdfauthor={John D. Hobby and the MetaPost development team},
+ pdfkeywords={MetaPost, PostScript, SVG, PNG, vector graphics language,
+ MetaFont, TeX}
+}
+\hypersetup{
+ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer.
+ colorlinks,
+ linkcolor=RoyalBlue3,
+ urlcolor=Chocolate4,
+ citecolor=SpringGreen3
+}
+\usepackage[all]{hypcap}
+\ifpdf
+\pdfmapfile{=cm2lm.map}% replace CM by LM in figures
+\else
+\DeclareGraphicsExtensions{.mps}
+\DeclareGraphicsRule{mps}{eps}{*}{}
+\usepackage{breakurl}
+\fi
+\begin{document}
+\VerbatimFootnotes
+%%% Title page layout documentation is missing.
+\begin{titlepage}
+ \vbox to \textheight {%
+ \vskip0pt
+ \vfil
+ \vfil
+ \vfil
+ \centerline{\resizebox{3.5in}{!}{\fontseries{b}\selectfont\MP}}
+ \vskip10bp% actually 21bp (-11bp)
+ \centerline{\includegraphics{mpman-60.mps}}
+ \vskip15bp% actually 21bp (-6bp)
+ \centerline{%
+ \resizebox{3.5in}{!}{%
+ \scshape%
+ \fontsize{28bp}{28bp}\selectfont
+ \strut\lowercase{A USER\kern-2bp\lower3bp\hbox{'}S MANUAL}%
+ }%
+ }
+ \vskip-11bp
+ \vfil
+ \vfil
+ \centerline{\large John D. Hobby}
+ \vskip3bp
+ \centerline{and the MetaPost development team}
+ \vskip20.8bp% actually 31.8bp (-11bp)
+ \centerline{\large documented version: \mpversion}
+ \vskip3bp
+\tracingall \centerline{\svnInfoMaxToday} \tracingnone
+ \vskip\baselineskip
+ \centerline{Web page: {\tt https://tug.org/metapost}}
+ \centerline{Mailing list: {\tt https://lists.tug.org/metapost}}
+ \vfil
+ \vfil
+ }
+\end{titlepage}
+
+\setlength{\columnsep}{2.5em}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+\section{Introduction}
+\label{intro}
+
+MetaPost is a programming language much like Knuth's \MF\footnote{\MF\
+is a trademark of Addison Wesley Publishing
+company.}\index{metafont?\MF}~\cite{kn:c} except that it outputs
+either vector graphics in the Postscript or SVG formats or bitmap
+graphics in the PNG format. Borrowed from \MF\ are the basic tools for
+creating and manipulating pictures. These include numbers, coordinate
+pairs, cubic splines, affine transformations, text strings, and boolean
+quantities. Additional features facilitate integrating text and
+graphics and accessing special features of
+PostScript\footnote{PostScript is a trademark of Adobe Systems
+Inc.}\index{PostScript} such as clipping, shading, and dashed lines.
+Another feature borrowed from \MF\ is the ability to solve linear
+equations that are given implicitly, thus allowing many programs to be
+written in a largely declarative style. By building complex operations
+from simpler ones, MetaPost achieves both power and flexibility.
+
+MetaPost is particularly well-suited to generating figures for technical
+documents where some aspects of a picture may be controlled by
+mathematical or geometrical constraints that are best expressed
+symbolically. In other words, MetaPost is not meant to take the place
+of a freehand drawing tool or even an interactive graphics editor. It
+is really a programming language for generating graphics, especially
+figures for \TeX\footnote{\TeX\ is a trademark of the American
+Mathematical Society.}\index{TeX?\TeX} and troff\index{troff} documents.
+
+This document introduces the MetaPost language, beginning with the
+features that are easiest to use and most important for simple
+applications. The first few sections describe the language as it
+appears to the novice user with key parameters at their default values.
+Some features described in these sections are part of a predefined macro
+package called Plain. Later sections summarize the complete language
+and distinguish between primitives and preloaded macros from the Plain
+macro package\index{Plain macros}. Reading the manual and creating
+moderately complex graphics with MetaPost does not require knowledge of
+\MF\ or access to {\sl The \MF book} \cite{kn:c}. However, to really
+master MetaPost, both are beneficial, since the MetaPost language is
+based on Knuth's \MF\ to a large extent. Appendix~\ref{MPvsMF} gives a
+detailed comparison of MetaPost and \MF.
+
+The basic MetaPost documentation is completed with ``Drawing Boxes with
+MetaPost'' and ``Drawing Graphs with MetaPost''---the manuals of the
+\texttt{boxes} and \texttt{graph} packages originally developed by
+John~D. Hobby.
+
+The MetaPost home page is \url{https://tug.org/metapost}. It has links
+to much additional information, including many articles that have been
+written about MetaPost. For general help and discussion, try the
+\url{metapost@tug.org} mailing list; you can subscribe to this list at
+\url{https://lists.tug.org/metapost}.
+
+The development repository is currently hosted at
+\url{https://serveur-svn.lri.fr/svn/modhel/metapost}; web browsing and
+anonymous svn checkout are allowed with username \texttt{anonsvn} and
+password \texttt{anonsvn}.
+
+If bug reports get no reply from \url{metapost@tug.org}, feel free to
+resend to \url{mp-implementors@tug.org}. (Please do not send reports
+directly to Dr.~Hobby in any event.)
+
+
+\section{Basic Drawing Statements}
+\label{basic}
+
+The simplest drawing statement is the one that draws a single dot with
+the current pen at a given coordinate:
+$$
+\begin{verbatim}
+drawdot (30,0)
+\end{verbatim}
+\index{drawdot?\texttt{drawdot}}
+\label{Ddrawdot}
+$$
+
+MetaPost can also draw straight lines.
+Thus\index{draw?\texttt{draw}}\index{-{}-?\texttt{-{}-}}
+$$ \hbox{\verb|draw (20,20)--(0,0)|} $$
+draws\index{draw?\texttt{draw}} a diagonal line and
+$$ \hbox{\verb|draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0)|} $$
+draws a polygonal line like this:
+$$ \includegraphics{mpman-1.mps} $$
+
+What is meant by coordinates like \verb|(30,0)|? MetaPost uses the same
+default coordinate system that PostScript\index{PostScript!coordinate
+system} does. This
+means that \verb|(30,0)| is 30 units to the right of the origin, where a
+unit is $1\over72$ of an inch. We shall refer to this default unit as a
+{\sl PostScript point\/}\index{PostScript!point}\index{point!PostScript}
+to distinguish it from the standard printer's
+point\index{point!printer's} which is $1\over72.27$ inches.
+
+MetaPost uses the same names for units of measure that \TeX\ and \MF\
+do. Thus
+\verb|bp|\index{bp?\texttt{bp}}\index{units!bp?\texttt{bp}}\label{Dbp}
+refers to PostScript points (``big points'') and
+\verb|pt|\index{pt?\texttt{pt}}\index{units!pt?\texttt{pt}}\label{Dpt}
+refers to printer's points. Other units of measure include
+\verb|in|\index{in?\texttt{in}}\index{units!in?\texttt{in}}\label{Din}
+for inches,
+\verb|pc|\index{pc?\texttt{pc}}\index{units!pc?\texttt{pc}}\label{Dpc}
+for picas,
+\verb|cm|\index{cm?\texttt{cm}}\index{units!cm?\texttt{cm}}\label{Dcm}
+for centimeters,
+\verb|mm|\index{mm?\texttt{mm}}\index{units!mm?\texttt{mm}}\label{Dmm}
+for millimeters,
+\verb|cc|\index{cc?\texttt{cc}}\index{units!cc?\texttt{cc}}\label{Dcc}
+for ciceros, and
+\verb|dd|\index{dd?\texttt{dd}}\index{units!dd?\texttt{dd}}\label{Ddd}
+for Didot points. For example,
+$$ \hbox{\verb|(2cm,2cm)--(0,0)--(0,3cm)--(3cm,0)--(0,0)|} $$
+generates a larger version of the above diagram. It is OK to say
+\verb|0| instead \verb|0cm| because {\tt cm} is really just a conversion
+factor and {\tt 0cm} just multiplies the conversion factor by zero.
+(MetaPost understands constructions like {\tt 2cm}\index{multiplication,
+ implicit} as shorthand for \verb|2*cm|). The coordinate \verb|(0,0)|
+can also be referred to as
+\texttt{origin}\index{origin?\texttt{origin}}\label{Dorigin}, as in
+$$ \hbox{\verb|drawdot origin|} $$
+
+It is convenient to introduce your own scale factor, say $u$. Then you
+can define coordinates in terms of $u$ and decide later whether you want
+to begin with \verb|u=1cm| or \verb|u=0.5cm|. This gives you control
+over what gets scaled and what does not so that changing $u$ will not
+affect features such as line widths.
+
+There are many ways to affect the appearance of a line besides just
+changing its width, so the width-control mechanisms allow a lot of
+generality that we do not need yet. This leads to the strange looking
+statement\index{pickup?\texttt{pickup}}\index{pencircle?\texttt{pencircle}}%
+\index{scaled?\texttt{scaled}}
+$$ \hbox{\verb|pickup pencircle scaled 4pt|} $$
+for setting the line width (actually the pen size) for subsequent
+\verb|draw| or \verb|drawdot| statements to 4 points. (This is about
+eight times the default pen size).
+
+With such a large pen size, the \verb|drawdot| statement draws rather
+bold dots. We can use this to make a grid of dots by nesting
+\verb|drawdot| in a pair of loops:\index{loops}%
+$$
+\begin{verbatim}
+for i=0 upto 2:
+ for j=0 upto 2: drawdot (i*u,j*u); endfor
+endfor
+\end{verbatim}
+\index{for?\texttt{for}}
+\index{endfor?\texttt{endfor}}
+$$
+The outer loop runs for $i=0,1,2$ and the inner loop runs for $j=0,1,2$.
+The result is a three-by-three grid of bold dots as shown in Figure~\ref{fig1}.
+The figure also includes a larger version of the polygonal line diagram that we
+saw before.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(2);
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2: drawdot (i*u,j*u); endfor
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-2.mps}}
+$$
+\caption{MetaPost commands and the resulting output}
+\label{fig1}
+\end{figure}
+
+
+\section{The MetaPost Workflow}
+\label{workflow}
+
+Before describing the MetaPost language in detail, let's have a look at
+MetaPost's graphic design workflow. This section also contains a few
+technical details about MetaPost's compilation process, just enough to
+get you started. Section~\ref{workflow2} is more elaborate on this
+topic.
+
+In this manual, we'll assume a stand-alone command-line executable of
+the MetaPost compiler is used, which is usually called
+\texttt{mpost}\index{mpost?\texttt{mpost}}. The syntax and program name
+itself are system-dependent; sometimes it is named \texttt{mp}. The
+executable is actually a small wrapper program around
+\emph{mplib}\index{mplib?\emph{mplib}}, a library containing the
+MetaPost compiler. The library can as well be embedded into third-party
+applications.\footnote{C~API\index{mplib?\emph{mplib}!C~API} and Lua
+ bindings\index{mplib?\emph{mplib}!Lua bindings} are described in file
+ \verb|manual/mplibapi.pdf|\index{mplib?\emph{mplib}!mplibapi.pdf?\texttt{mplibapi.pdf}}
+ as part of the MetaPost distribution.} Section~\ref{mpimport} has
+some brief information on how to use the MetaPost compiler built-into
+Lua\TeX. For more information, please refer to the documentation of the
+embedding application.
+
+The basic MetaPost workflow\index{workflow} is depicted in
+figure~\ref{fig:mpworkflow}. Being a graphics description language,
+creating graphics with MetaPost follows the
+\emph{edit-compile-debug}\index{edit}\index{compile}\index{debug}
+paradigm known from other programming languages.
+
+\begin{figure}[tbp]
+$$ \includegraphics{mpman-charts-2.mps} $$
+\caption{The basic MetaPost workflow}
+\label{fig:mpworkflow}
+\end{figure}
+
+To create graphics with MetaPost, you prepare\index{edit} a text file
+containing code in the MetaPost language and then invoke the
+compiler\index{compile}, usually by giving a command of the form
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+mpost \tdescr{input file}
+\end{verbatim}
+\index{mpost?\texttt{mpost}}
+$$
+on the command-line. MetaPost input files\index{files!input} normally
+have names ending \texttt{.mp}\index{mp file?{\tt mp}
+ file}\index{files!mp?{\tt mp}} but this part of the name can be
+omitted when invoking MetaPost. A complete description of the
+command-line syntax can be found in Section~\ref{refman:commandline}.
+
+Any terminal I/O during the compilation process is summarized in a
+transcript\index{files!transcript}\index{transcript file|see{files,
+ transcript}} file called \texttt{\tdescr{jobname}.log}\index{log
+ file?{\tt log} file}\index{files!log?{\tt log}}, where
+\tdescr{jobname} is the base name of the input file. This includes
+error messages and any MetaPost commands entered in interactive mode.
+
+If all goes well during compilation, MetaPost outputs one or more
+graphic files in a variant of the PostScript format, by default.
+PostScript output can be previewed\index{preview} with any decent
+PostScript viewer, e.g., GSview\index{GSview} or
+PS\_View\index{PSView?PS\_View}. Section~\ref{preview} has some tips
+and discusses several more elaborate ways for previewing PostScript
+output. Particularly, if graphics contain text labels, some more work
+might be required to get robust results in a PostScript viewer.
+MetaPost is also capable of generating graphics in the SVG\index{SVG}
+and PNG\index{PNG} formats. These file types can be previewed with
+certain web browsers, for example Firefox~3\index{Firefox} or
+Konqueror~4.2\index{Konqueror}, or general purpose image viewers.
+
+What does one do with all the graphic files? PostScript files are
+perfectly suitable for inclusion into documents created by
+\TeX\index{TeX?\TeX} or troff\index{troff}. The SVG format, as an XML
+descendant (Extensible Meta Language), is more aiming at automated data
+processing/interchanging. The PNG format is a losslessly compressing
+bitmap format. Both, SVG and PNG graphics, are widely used for web
+applications. Section~\ref{mpimport} deals with the import of MetaPost
+graphics into external applications.
+
+A MetaPost input file\index{files!input}\index{edit}\index{edit}
+normally contains a sequence of
+\verb|beginfig()|\index{beginfig?\texttt{beginfig}},
+\verb|endfig|\index{endfig?\texttt{endfig}} pairs with an
+\verb|end|\index{end?\texttt{end}} statement after the last
+one.\footnote{Omitting the final \verb|end| statement causes MetaPost to
+ enter interactive mode\index{interactive mode} after processing the
+ input file.} These are macros that perform various administrative
+functions and ensure that the results of all drawing operations get
+packaged up and translated into PostScript (or the SVG or PNG format).
+The numeric argument to the \verb|beginfig| macro determines the name of
+the corresponding output file, whose name, by default, is of the form
+\texttt{\tdescr{jobname}.\tdescr{n}}, where \tdescr{n} is the current
+argument to \verb|beginfig| rounded to the nearest integer. As an
+example, if a file is named \texttt{fig.mp} and contains the lines
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+beginfig(1);
+ \tdescr{drawing statements}
+endfig;
+end
+\end{verbatim}
+$$
+the output from statements between \verb|beginfig(1)| and the next
+\verb|endfig| is written in a file \texttt{fig.1}\index{files!output}.
+
+Statements can also appear outside \verb|beginfig| \ldots\
+\verb|endfig|. Such statements are processed, but drawing operations
+generate no visible output. Typically, global configurations are put
+outside \verb|beginfig| \ldots\ \verb|endfig|, e.g., assignments to
+internal variables, such as \texttt{outputtemplate}, or a \LaTeX\
+preamble declaration for enhanced text rendering.
+Comments\index{comments} in MetaPost code are introduced by the percent
+sign~\verb|%|\index{\%?\texttt{\%}!comment}, which causes the remainder
+of the current line to be ignored.
+
+The remainder of this section briefly introduces three assignments to
+internal variables, each one useful by itself, that can often be found
+in MetaPost input files:
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+prologues := 3; \smallskip
+outputtemplate := "%j-%c.mps"; \smallskip
+outputformat := "svg";
+\end{verbatim}
+$$
+
+If your graphics contain text labels, you might want to set variable
+\texttt{prologues} to~3 to make sure the correct fonts are used under
+all possible circumstances. The second assignment changes the output
+file naming scheme to the form \texttt{\tdescr{jobname}-\tdescr{n}.mps}.
+That way, instead of a numeric index, all output files get a uniform
+file extension \texttt{mps}\index{mps file?{\tt mps}
+ file}\index{files!mps?{\tt mps}}, which is typically used for
+MetaPost's PostScript output. The last assignment lets MetaPost write
+output files in the SVG format rather than in the PostScript format.
+More information can be found in Sections~\ref{Dprologues}
+and~\ref{workflow2}.
+
+
+\section{Curves}
+\label{curves}
+
+MetaPost is perfectly happy to draw curved lines as well as straight ones.
+A \verb|draw| statement with the points separated by
+\verb|..|\index{..?\texttt{..}} draws a smooth curve through the points.
+For example consider the result of
+$$ \hbox{\verb|draw z0..z1..z2..z3..z4|} $$
+after defining five points as follows:
+$$\begin{verbatim}
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+\end{verbatim}
+$$
+Figure~\ref{fig2} shows the curve with points \verb|z0| through \verb|z4|
+labeled.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-3.mps}
+$$
+\caption[A curve through points 0, 1, 2, 3, and 4]
+ {The result of {\tt draw z0..z1..z2..z3..z4}}
+\label{fig2}
+\end{figure}
+
+There are many other ways to draw a curved path through the same five
+points. To make a smooth closed curve, connect \verb|z4| back to the
+beginning by appending \verb|..cycle|\index{cycle?\texttt{cycle}} to the
+\verb|draw| statement as shown in Figure~\ref{fig3}a. It is also
+possible in a single \verb|draw| statement to mix curves and straight
+lines as shown in Figure~\ref{fig3}b. Just use \verb|--| where you want
+straight lines and \verb|..| where you want curves. Thus
+$$ \hbox{\verb|draw z0..z1..z2..z3--z4--cycle|} $$
+produces a curve through points 0,~1, 2, and~3, then a polygonal line from
+point~3 to point~4 and back to point~0. The result is essentially the same
+as having two draw statements
+\begin{eqnarray*}
+ \hbox{\verb|draw z0..z1..z2..z3|}\\
+\noalign{\hbox{and}}
+ \hbox{\verb|draw z3--z4--z0|}
+\end{eqnarray*}
+
+\begin{figure}[htp]
+$$ {\includegraphics{mpman-104.mps} \atop (a)}
+ \qquad {\includegraphics{mpman-204.mps} \atop (b)}
+$$
+\caption[Closed curves through five points]
+ {(a)~The result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3..\linebreak[0]z4..\linebreak[0]cycle};
+ (b)~the result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3--\linebreak[0]z4--\linebreak[0]cycle}.}
+\label{fig3}
+\end{figure}
+
+MetaPost already provides a small selection of basic path shapes that
+can be used to derive custom paths from. The predefined variable
+\texttt{fullcircle}\index{fullcircle?\texttt{fullcircle}}\label{Dfcirc}
+refers to a closed path describing a circle of unit diameter centered on
+the origin. There are also
+\texttt{halfcircle}\index{halfcircle?\texttt{halfcircle}}\label{Dhcirc}
+and
+\texttt{quartercircle}\index{quartercircle?\texttt{quartercircle}}\label{Dqcirc},
+the former being the part of a full circle covering the first and second
+quadrant and the latter covering just the first quadrant. Because of
+the mathematical model that is used to describe paths in MetaPost, all
+these are not exactly circular paths, but very good approximations (see
+Figure~\ref{fig3a}).
+
+\begin{figure}
+$$ \includegraphics{mpman-61.mps} $$
+\caption{A circle and a square with cardinal points. Arrows are
+ pointing to the start and end points of the closed paths.}
+\label{fig3a}
+\end{figure}
+
+Rectangularly shaped paths can be derived from
+\texttt{unitsquare}\index{unitsquare?\texttt{unitsquare}}\label{Dunitsqr},
+a closed path describing a square of unit side length whose lower left
+corner is located at the origin.
+
+\subsection{B\'ezier Cubic Curves}
+
+When MetaPost is asked to draw a smooth curve through a sequence of
+points, it constructs a piecewise cubic curve with continuous slope and
+approximately continuous curvature\index{curvature}. This means that a
+path specification such as
+$$ \hbox{\verb|z0..z1..z2..z3..z4..z5|} $$
+results in a curve that can be defined parametrically\index{parameterization}
+as $(X(t),Y(t))$ for
+$0\le t\le5$, where $X(t)$ and $Y(t)$ are piecewise cubic functions. That is,
+there is a different pair of cubic functions for each integer-bounded
+$t$-interval. If ${\tt z0}=(x_0,y_0)$, ${\tt z1}=(x_1,y_1)$,
+${\tt z2}=(x_2,y_2)$, \ldots, MetaPost selects
+B\'ezier control\index{control points} points
+$(x_0^+,y_0^+)$, $(x_1^-,y_1^-)$, $(x_1^+,y_1^+)$, \ldots, where
+\begin{eqnarray*}
+ X(t+i) &=& (1-t)^3x_i + 3t(1-t)^2x_i^+ + 3t^2(1-t)x_{i+1}^- + t^3x_{i+1},\\
+ Y(t+i) &=& (1-t)^3y_i + 3t(1-t)^2y_i^+ + 3t^2(1-t)y_{i+1}^- + t^3y_{i+1}
+\end{eqnarray*}
+for $0\le t\le1$. The precise rules for choosing the B\'ezier control points
+are described in \cite{ho:splin} and in {\sl The \MF book\/}~\cite{kn:c}.
+
+In order for the path to have a continuous slope at $(x_i,y_i)$, the incoming
+and outgoing directions at $(X(i),Y(i))$ must match. Thus the vectors
+$$ (x_i-x_i^-,\,y_i-y_i^-) \qquad \hbox{and}
+ \qquad (x_i^+-x_i,\,y_i^+-y_i)
+$$
+must have the same direction; i.e., $(x_i,y_i)$ must be on the line segment
+between $(x_i^-,y_i^-)$ and $(x_i^+,y_i^+)$. This situation is illustrated
+in Figure~\ref{fig4} where the B\'ezier control points selected by MetaPost
+are connected by dashed lines. For those who are familiar with the interesting
+properties of this construction, MetaPost allows the control points to be
+specified directly in the following format:\index{controls?\texttt{controls}}
+$$ \begin{verbatim}
+draw (0,0)..controls (26.8,-1.8) and (51.4,14.6)
+ ..(60,40)..controls (67.1,61.0) and (59.8,84.6)
+ ..(40,90)..controls (25.4,94.0) and (10.5,84.5)
+ ..(10,70)..controls ( 9.6,58.8) and (18.8,49.6)
+ ..(30,50);
+\end{verbatim}
+$$
+
+For a way to extract the control points of a path, given by the user or
+calculated by MetaPost, see section~\ref{Dprepostctrl}.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-5.mps}
+$$
+\caption[A curve and the control polygon]
+ {The result of {\tt draw z0..z1..z2..z3..z4} with the
+ automatically-selected B\'ezier control polygon illustrated by dashed
+ lines.}
+\label{fig4}
+\end{figure}
+
+\subsection{Specifying Direction, Tension, and Curl}
+\label{tenscurl}
+
+MetaPost provides many ways of controlling the behavior of a curved path
+without actually specifying the control points. For instance, some
+points on the path may be selected as vertical or horizontal extrema.
+If \verb|z1| is to be a horizontal extreme and \verb|z2| is to be a
+vertical extreme, you can specify that $(X(t),Y(t))$ should go upward at
+\verb|z1| and to the left at \verb|z2|:
+$$ \hbox{\verb|draw z0..z1{up}..z2{left}..z3..z4;|} $$
+The resulting shown in Figure~\ref{fig5} has the desired vertical and
+horizontal directions at \verb|z1| and \verb|z2|, but it does not look
+as smooth as the curve in Figure~\ref{fig2}. The reason is the large
+discontinuity in curvature\index{curvature} at \verb|z1|. If it were
+not for the specified direction at \verb|z1|, the MetaPost interpreter
+would have chosen a direction designed to make the curvature above
+\verb|z1| almost the same as the curvature below that point.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-6.mps}
+$$
+\caption[A curve and the control polygon]
+ {The result of {\tt draw z0..z1\char`\{up\char`\}..z2\char`\{left\char`\}%
+ ..z3..z4}.}
+\label{fig5}
+\end{figure}
+
+How can the choice of directions at given points on a curve determine whether
+the curvature will be continuous? The reason is that curves used in MetaPost
+come from a family where a path is determined by its endpoints and the
+directions there. Figures \ref{fig6} and~\ref{fig7} give a good idea of what
+this family of curves is like.
+
+\begin{figure}[htp]
+$$ \mathcenter{\includegraphics{mpman-7.mps}} \quad
+\begin{verbatim}
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{A curve family and the MetaPost instructions for generating it}
+\label{fig6}
+\end{figure}
+
+\begin{figure}[htp]
+$$ \mathcenter{\includegraphics{mpman-8.mps}} \quad
+\begin{verbatim}
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{Another curve family with the corresponding MetaPost instructions}
+\label{fig7}
+\end{figure}
+
+Figures \ref{fig6} and~\ref{fig7} illustrate a few new MetaPost
+features. The first is the {\tt
+dir}\index{dir?\texttt{dir}}\label{Ddirop} operator that takes an angle
+in degrees and generates a unit vector in that direction. Thus
+\verb|dir 0| is equivalent to {\tt
+right}\index{right?\texttt{right}}\label{Dright} and \verb|dir 90| is
+equivalent to {\tt up}\index{up?\texttt{up}}\label{Dup}. There are also
+predefined direction vectors {\tt
+left}\index{left?\texttt{left}}\label{Dleft} and {\tt
+down}\index{down?\texttt{down}}\label{Ddown} for {\tt dir 180} and {\tt
+dir 270}.
+
+The direction
+vectors given in \verb|{}| can be of any length, and they can come before a
+point as well as after one. It is even possible for a path specification
+to have directions given before and after a point. For example a path
+specification containing
+$$ \hbox{\verb|..{dir 60}(10,0){up}..|} $$
+produces a curve with a corner at $(10,0)$.
+
+Note that some of the curves in Figure~\ref{fig6} have points of
+inflection\index{inflections}. This is necessary in order to produce
+smooth curves in situations like Figure~\ref{fig3}a, but it is probably
+not desirable when dealing with vertical and horizontal extreme points
+as in Figure~\ref{fig8}a. If \verb|z1| is supposed to be the topmost
+point on the curve, this can be achieved by using
+\verb|...|\index{...?\texttt{...}} instead of \verb|..| in the path
+specification as shown in Figure~\ref{fig8}b. The meaning of \verb|...|
+is ``choose an inflection-free path between these points unless the
+endpoint directions make this impossible.'' (It would be possible to
+avoid inflections in Figure~\ref{fig6}, but not in Figure~\ref{fig7}).
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{mpman-109.mps}} \atop
+ \hbox{\verb|draw z0{up}..z1{right}..z2{down}|}}
+ \quad
+ {\mathcenter{\includegraphics{mpman-209.mps}} \atop
+ \hbox{\verb|draw z0{up}...z1{right}...z2{down}|}}
+$$
+\caption{Two {\tt draw} statements and the resulting curves.}
+\label{fig8}
+\end{figure}
+
+Another way to control a misbehaving path is to increase the
+``tension''\index{tension} parameter. Using \verb|..| in a path
+specification sets the tension parameter to the default value~1. If
+this makes some part of a path a little too wild, we can selectively
+increase the tension. If Figure~\ref{fig9}a is considered ``too wild,''
+a {\tt draw} statement of the following form increases the tension
+between {\tt z1} and {\tt z2}:
+$$ \hbox{\verb|draw z0..z1..tension 1.3..z2..z3|} $$
+This produces Figure~\ref{fig9}b. For an asymmetrical effect like
+Figure~\ref{fig9}c, the \verb|draw| statement becomes
+$$ \hbox{\verb|draw z0..z1..tension 1.5 and 1..z2..z3|} $$
+The tension parameter can be less than one, but it must be at least $3\over4$.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{mpman-110.mps}} \atop (a)}
+ \quad
+ {\mathcenter{\includegraphics{mpman-210.mps}} \atop (b)}
+ \quad
+ {\mathcenter{\includegraphics{mpman-310.mps}} \atop (c)}
+$$
+\caption[Effects of changing the tension parameter]
+ {Results of {\tt draw z0..z1..tension} $\alpha$ {\tt and} $\beta$
+ {\tt ..z2..z3} for various $\alpha$ and $\beta$:
+ (a)~$\alpha=\beta=1$; (b)~$\alpha=\beta=1.3$;
+ (c)~$\alpha=1.5$, $\beta=1$.}
+\label{fig9}
+\end{figure}
+
+MetaPost paths also have a parameter called
+``curl''\index{curl?\texttt{curl}} that affects the ends of a path. In
+the absence of any direction specifications, the first and last segments
+of a non-cyclic path are approximately circular arcs as in the $c=1$
+case of Figure~\ref{fig10}. To use a different value for the curl
+parameter, specify \verb|{curl c}| for some other value of $c$. Thus
+$$ \hbox{\verb|draw z0{curl c}..z1..{curl c}z2|} $$
+sets the curl parameter for \verb|z0| and \verb|z2|. Small values of
+the curl parameter reduce the curvature\index{curvature} at the
+indicated path endpoints, while large values increase the curvature as
+shown in Figure~\ref{fig10}. In particular, a curl value of zero makes
+the curvature approach zero.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{mpman-111.mps}} \atop c=0}
+ \qquad
+ {\mathcenter{\includegraphics{mpman-211.mps}} \atop c=1}
+ \qquad
+ {\mathcenter{\includegraphics{mpman-311.mps}} \atop c=2}
+ \qquad
+ {\mathcenter{\includegraphics{mpman-411.mps}} \atop c=\infty}
+$$
+\caption[Effects of changing the curl parameter]
+ {Results of {\tt draw z0\char`\{curl c\char`\}..z1..%
+ \char`\{curl c\char`\}z2} for various values
+ of the curl parameter~$c$.}
+\label{fig10}
+\end{figure}
+
+\subsection{Summary of Path Syntax}
+
+There are a few other features of MetaPost path syntax, but they are
+relatively unimportant. Since \MF\ uses the same path syntax,
+interested readers can refer to \cite[chapter 14]{kn:c}. The summary of
+path syntax in Figure~\ref{sypath} includes everything discussed so far
+including the \verb|--| and \verb|...| constructions which \cite{kn:c}
+shows to be macros rather than primitives. A few comments on the
+semantics are in order here: If there is a non-empty $\descr{direction
+specifier}$ before a $\descr{path knot}$ but not after it, or vice
+versa, the specified direction (or curl amount) applies to both the
+incoming and outgoing path segments. A similar arrangement applies when
+a $\descr{controls}$ specification gives only one $\descr{pair
+primary}$. Thus
+$$ \hbox{\verb|..controls (30,20)..|} $$
+is equivalent to
+$$ \hbox{\verb|...controls (30,20) and (30,20)..|} $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\descr{path expression} \rightarrow
+ \descr{path subexpression}$\\
+\qquad \= ${}\mid \descr{path subexpression} \descr{direction specifier}$\\
+\> ${}\mid \descr{path subexpression} \descr{path join}$ \verb|cycle|\\
+$\descr{path subexpression} \rightarrow
+ \descr{path knot}$\\
+\> ${}\mid \descr{path expression} \descr{path join} \descr{path knot}$\\
+$\descr{path join} \rightarrow
+ \hbox{\verb|--|}$\\
+\> ${}\mid \descr{direction specifier} \descr{basic path join}
+ \descr{direction specifier}$\\
+$\descr{direction specifier} \rightarrow
+ \descr{empty}$\\
+\> ${}\mid {}$\verb|{curl| $\descr{numeric expression}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{pair expression}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{numeric expression}$\verb|,|%
+ $\descr{numeric expression}$\verb|}|\\
+$\descr{basic path join} \rightarrow
+ \hbox{\verb|..|}
+ \mid \hbox{\verb|...|}
+ \mid \hbox{\verb|..|}\descr{tension}\hbox{\verb|..|}
+ \mid \hbox{\verb|..|}\descr{controls}\hbox{\verb|..|}$\\
+$\descr{tension} \rightarrow
+ \hbox{\verb|tension|}\descr{numeric primary}$\\
+\> ${}\mid \hbox{\verb|tension|}\descr{numeric primary}
+ \hbox{\verb|and|}\descr{numeric primary}$\\
+$\descr{controls} \rightarrow
+ \hbox{\verb|controls|}\descr{pair primary}$\\
+\> ${}\mid \hbox{\verb|controls|}\descr{pair primary}
+ \hbox{\verb|and|}\descr{pair primary}$
+\end{ctabbing}
+\caption{The syntax for path construction}
+\label{sypath}
+\end{figure}
+
+A pair of coordinates like \verb|(30,20)| or a \verb|z| variable that
+represents a coordinate pair is what Figure~\ref{sypath} calls a
+$\descr{pair primary}$. A $\descr{path knot}$ is similar except that it
+can take on other forms such as a path expression in parentheses.
+Primaries and expressions of various types will be discussed in full
+generality in Section~\ref{exprs}.
+
+
+\section{Linear Equations}
+\label{lin.eq}
+
+An important feature taken from \MF\ is the ability to solve linear
+equations so that programs can be written in a partially declarative fashion.
+For example, the MetaPost interpreter can read
+$$ \hbox{\verb|a+b=3; 2a=b+3;|} $$
+and deduce that $a=2$ and $b=1$. The same equations can be written
+slightly more compactly by stringing them together with multiple equal
+signs:
+$$ \hbox{\verb|a+b = 2a-b = 3;|} $$
+Whichever way you give the equations, you can then give the
+command\index{show?\texttt{show}}
+$$ \hbox{\tt show a,b;} $$
+to see the values of {\tt a} and {\tt b}. MetaPost responds by typing
+$$\begin{verbatim}
+>> 2
+>> 1
+\end{verbatim}
+$$
+
+Note that {\tt =}\index{=?\texttt{=}} is not an assignment operator; it
+simply declares that the left-hand side equals the right-hand side.
+Thus {\tt a=a+1} produces an error message complaining about an
+``inconsistent equation\index{Inconsistent equation?\texttt{Inconsistent
+equation}}.'' The way to increase the value of {\tt a} is to use the
+assignment\index{assignment} operator {\tt :=}\index{:=?\texttt{:=}} as
+follows:
+$$ \hbox{\tt a:=a+1;} $$
+In other words, {\tt :=} is for changing existing values while {\tt =} is for
+giving linear equations to solve.
+
+There is no restriction against mixing equations and assignment
+operations as in the following example:
+$$ \hbox{\tt a = 2; b = a; a := 3; c = a;} $$
+After the first two equations set {\tt a} and~{\tt b} equal to 2, the
+assignment operation changes {\tt a} to~3 without affecting {\tt b}.
+The final value of {\tt c} is 3 since it is equated to the new value of
+{\tt a}. In general, an assignment operation is interpreted by first
+computing the new value, then eliminating the old value from all
+existing equations before actually assigning the new value.
+
+\subsection{Equations and Coordinate Pairs}
+
+MetaPost can also solve linear equations involving coordinate pairs. We have
+already seen many trivial examples of this in the form of equations like
+$$ \hbox{\verb|z1=(0,.2in)|} $$
+Each side of the equation must be formed by adding or subtracting
+coordinate pairs and multiplying or dividing them by known numeric
+quantities. Other ways of naming pair-valued variables will be
+discussed later, but the ${\tt z}\descr{number}$\index{z convention?{\tt
+z} convention} is convenient because it is an abbreviation for
+$$ \hbox{\tt (x}\descr{number} \hbox{\tt, y}\descr{number}\hbox{\tt)} $$
+This makes it possible to give values to \verb|z| variables by giving
+equations involving their coordinates. For instance, points {\tt z1},
+{\tt z2}, {\tt z3}, and~{\tt z6} in Figure~\ref{fig12} were initialized
+via the following equations:
+\begin{eqnarray*}
+ &&\hbox{\verb|z1=-z2=(.2in,0);|} \\
+ &&\hbox{\verb|x3=-x6=.3in;|} \\
+ &&\hbox{\verb|x3+y3=x6+y6=1.1in;|}
+\end{eqnarray*}
+Exactly the same points could be obtained by setting their values directly:
+$$ \begin{verbatim}
+z1=(.2in,0); z2=(-.2in,0);
+z3=(.3in,.8in); z6=(-.3in,1.4in);
+\end{verbatim}
+$$
+
+After reading the equations, the MetaPost interpreter knows the values
+of {\tt z1}, {\tt z2}, {\tt z3}, and~{\tt z6}. The next step in the
+construction of Figure~\ref{fig12} is to define points {\tt z4} and {\tt
+z5} equally spaced along the line from {\tt z3} to {\tt z6}. Since this
+operation comes up often, MetaPost has a special syntax for it. This
+mediation construction\index{mediation}\index{[]?\texttt{[]}!mediation}
+$$ \hbox{\verb|z4=1/3[z3,z6]|} $$
+means that {\tt z4} is $1\over3$ of the way from $z3$ to $z6$; i.e.,
+$$ {\tt z4}={\tt z3}+{1\over3}({\tt z6}-{\tt z3}). $$
+Similarly
+$$ \hbox{\verb|z5=2/3[z3,z6]|} $$
+makes {\tt z5} $2\over3$ of the way from $z3$ to $z6$.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-13.mps}}
+$$
+\caption[MetaPost code and figure using linear equations]
+ {MetaPost commands and the resulting figure. Point labels have been
+ added to the figure for clarity.}
+\label{fig12}
+\end{figure}
+
+Mediation can also be used to say that some point is at an unknown
+position along the line between two known points. For instance, we
+could a introduce new variable {\tt aa} and write something like
+$$ \hbox{\verb|z20=aa[z1,z3];|} $$
+This says that {\tt z20} is some unknown fraction {\tt aa} of the way
+along the line between {\tt z1} and {\tt z3}. Another such equation
+involving a different line is sufficient to fix the value of {\tt z20}.
+To say that {\tt z20} is at the intersection of the {\tt z1}-{\tt z3}
+line and the {\tt z2}-{\tt z4} line, introduce another variable {\tt ab}
+and set
+$$ \hbox{\verb|z20=ab[z2,z4];|} $$
+This allows MetaPost to solve for {\tt x20}, {\tt y20}, {\tt aa}, and {\tt ab}.
+
+It is a little painful to keep thinking up new names like {\tt aa} and
+{\tt ab}. This can be avoided by using a special feature called {\tt
+whatever}\index{whatever?\texttt{whatever}}\label{Dwhatev}. This macro
+generates a new anonymous variable each time it appears. Thus the
+statement
+$$ \hbox{\verb|z20=whatever[z1,z3]=whatever[z2,z4]|} $$
+sets {\tt z20} as before, except it uses {\tt whatever} to generate two
+{\em different\/} anonymous variables instead of {\tt aa} and {\tt ab}.
+This is how Figure~\ref{fig12} sets {\tt z20}, {\tt z30}, and
+{\tt z40}.
+
+\subsection{Dealing with Unknowns}
+
+A system of equations such as those used in Figure~\ref{fig12} can be given in
+any order as long as all the equations are linear and all the variables can
+be determined before they are needed. This means that the equations
+\begin{eqnarray*}
+ && \hbox{\verb|z1=-z2=(.2in,0);|}\\
+ && \hbox{\verb|x3=-x6=.3in;|}\\
+ && \hbox{\verb|x3+y3=x6+y6=1.1in;|}\\
+ && \hbox{\verb|z4=1/3[z3,z6];|}\\
+ && \hbox{\verb|z5=2/3[z3,z6];|}
+\end{eqnarray*}
+suffice to determine {\tt z1} through {\tt z6}, no matter what order the
+equations are given in. On the other hand
+$$ \hbox{\verb|z20=whatever[z1,z3]|} $$
+is legal only when a known value has previously been specified for the difference
+${\tt z3}-{\tt z1}$, because the equation is equivalent
+to\index{mediation}
+$$ \hbox{\verb|z20 = z1 + whatever*(z3-z1)|} $$
+and the linearity requirement disallows multiplying unknown components
+of ${\tt z3}-{\tt z1}$ by the anonymous unknown result of {\tt
+whatever}. The general rule is that you cannot multiply two unknown
+quantities or divide by an unknown quantity, nor can an unknown quantity
+be used in a {\tt draw} statement. Since only linear equations are
+allowed, the MetaPost interpreter can easily solve the equations and
+keep track of what values are known.
+
+The most natural way to ensure that MetaPost can handle an expression like
+$$ \hbox{\verb|whatever[z1,z3]|} $$
+is to ensure that {\tt z1} and {\tt z3} are both known. However this is not
+actually required since MetaPost may be able to deduce a known value for
+${\tt z3}-{\tt z1}$ before either of {\tt z1} and {\tt z3} are known.
+For instance, MetaPost will accept the equations
+$$ \hbox{\verb|z3=z1+(.1in,.6in); z20=whatever[z1,z3];|} $$
+but it will not be able to determine any of the components of {\tt z1},
+{\tt z3}, or {\tt z20}.
+
+These equations do give partial information about {\tt z1}, {\tt z3},
+and {\tt z20}. A good way to see this is to give another equation such as
+$$ \hbox{\verb|x20-x1=(y20-y1)/6;|} $$
+This produces the error message ``{\tt ! Redundant
+equation}\index{Redundant equation?\texttt{Redundant equation}}.''
+MetaPost assumes that you are trying to tell it something new, so it
+will usually warn you when you give a redundant equation. If the new
+equation had been
+$$ \hbox{\verb|(x20-x1)-(y20-y1)/6=1in;|} $$
+the error message would have been\index{Inconsistent
+equation?\texttt{Inconsistent equation}}
+$$ \hbox{\verb|! Inconsistent equation (off by 71.99979).|} $$
+This error message illustrates
+roundoff\index{roundoff error} error in MetaPost's linear equation solving
+mechanism. Roundoff error
+is normally not a serious problem, but it is likely to cause trouble if you are
+trying to do something like find the intersection of two lines that are almost
+parallel.
+
+
+\section{Expressions}
+\label{exprs}
+
+It is now time for a more systematic view of the MetaPost language. We
+have seen that there are numeric quantities and coordinate pairs, and
+that these can be combined to specify paths for {\tt draw} statements.
+We have also seen how variables can be used in linear equations, but we
+have not discussed all the operations and data types that can be used in
+equations.
+
+It is possible to experiment with expressions involving any of the data types
+mentioned below by using the statement\index{show?\texttt{show}}\label{Dshow}
+$$ {\tt show}\, \descr{expression} $$
+to ask MetaPost to print a symbolic representation of the value of each
+expression. For known numeric values, each is printed on a new line
+preceded by ``\verb|>> |''. Other types of result are printed similarly,
+except that complicated values are sometimes not printed on standard
+output. This produces a reference to the transcript
+file\index{files!transcript} that looks like this:
+$$ \hbox{\verb|>> picture (see the transcript file)|} $$
+If you want to the full results of {\tt show} statements to be printed
+on your terminal, assign a positive value to the internal\index{internal
+variables} variable\index{variables!internal} {\tt
+tracingonline}\index{tracingonline?\texttt{tracingonline}}\label{Dtonline}.
+
+\subsection{Data Types}
+\label{datatypes}
+
+MetaPost actually has ten basic data types\index{types}: numeric, pair,
+path, transform, (rgb)color, cmykcolor, string, boolean, picture, and
+pen. Let us consider these one at a time beginning with the numeric
+type.
+
+Numeric\index{numeric type} quantities in MetaPost are represented in
+fixed point arithmetic\index{arithmetic} as integer multiples of
+$1\over65536$, the smallest positive value, which is also available as
+the predefined constant
+\texttt{epsilon}\index{epsilon?\texttt{epsilon}}\label{Depsilon}.\footnote{MetaPost
+ can also do arithmetic with higher and (almost) arbitrary precision.
+ See Appendix~\ref{hparith} for more information.} Numeric quantities
+must normally have absolute values less than 4096 but intermediate
+results can be eight times larger. This should not be a problem for
+distances or coordinate values since 4096 PostScript points is more than
+1.4~meters. If you need to work with numbers of magnitude 4096 or more,
+setting the internal variable
+\texttt{warningcheck}\index{warningcheck?\texttt{warningcheck}}\label{Dwarncheck}
+to zero suppresses the warning messages about large numeric quantities.
+
+The pair\index{pair type} type is represented as a pair of numeric
+quantities. We have seen that pairs are used to give coordinates in
+{\tt draw} statements. Pairs can be added, subtracted, used in
+mediation expressions, or multiplied or divided by numerics.
+
+Paths\index{path type} have already been discussed in the context of {\tt draw}
+statements, but
+that discussion did not mention that paths are first-class objects that can be
+stored and manipulated. A path represents a straight or curved line that is
+defined parametrically.
+
+Another data type represents an arbitrary affine
+transformation\index{transform type}. A {\em transform\/} can be any
+combination of rotating, scaling, slanting, and shifting. If ${\tt
+p}=(p_x,p_y)$ is a pair and {\tt T} is a
+transform,\index{transformed?\texttt{transformed}}
+$$ \hbox{\tt p transformed T} $$
+is a pair of the form
+$$ (t_x+t_{xx}p_x+t_{xy}p_y, t_y+t_{yx}p_x+t_{yy}p_y), $$
+where the six numeric quantities $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$
+determine {\tt T}. Transforms can also be applied to paths, pictures, pens,
+and transforms.
+
+The color\index{color type} type is like the pair type, except
+that it has three components instead of two and each component is
+normally between 0 and 1. Like pairs, colors can be added,
+subtracted, used in mediation expressions, or multiplied or divided
+by numerics. Colors can be specified in terms of the predefined
+constants \ttindex{black}\label{Dblack}, \ttindex{white}\label{Dwhite},
+\ttindex{red}\label{Dred}, \ttindex{green}\label{Dgreen},
+\ttindex{blue}\label{Dblue}, or the red, green, and
+blue components can be given explicitly. Black is {\tt (0,0,0)} and
+white is {\tt (1,1,1)}. A level of gray such as {\tt (.4,.4,.4)} can also be
+specified as {\tt 0.4white}. Although color typed variables may be
+any ordered triplet, when adding an object to a picture, MetaPost will
+convert its color by clipping each component between 0 and 1. For
+example, MetaPost will output the color (1,2,3) as (1,1,1).
+MetaPost solves linear equations involving
+colors the same way it does for pairs. The type `rgbcolor' is an alias of
+type `color'.
+
+The cmykcolor\index{cmykcolor type} type is similar
+to the color type except that it has four components instead of
+three. This type is used to specify colors by their cyan, magenta,
+yellow, and black components explicitly. Because CMYK colors deal with
+pigments instead of light rays, the color white would be expressed as
+{\tt (0,0,0,0)} and black as {\tt (0,0,0,1)}. In theory, the colors
+{\tt ($c$,$m$,$y$,1)} and {\tt (1,1,1,$k$)} should result in black for
+any values of $c$, $m$, $y$ and~$k$, too. But in practice, this is
+avoided since it is a waste of colored ink and can lead to
+unsatisfactory results.
+
+A string\index{string type} represents a sequence of characters.
+String constants\index{string constants} are given
+in double quotes \hbox{\verb|"like this"|}. String constants cannot contain
+double quotes or newlines, but there is a way to construct a string containing
+any sequence of eight-bit characters.
+
+\label{Dscantokens}
+Conversion from strings to other types, notably numeric, can be accomplished by
+the {\tt scantokens}\index{scantokens?\texttt{scantokens}} primitive:
+\begin{center}\texttt{n := scantokens(}\textit{str}\texttt{);}\end{center}
+More generally, \texttt{scantokens} parses a string into a token
+sequence, as if MetaPost had read it as input.
+
+The boolean\index{boolean type} type has the constants {\tt
+true}\index{true?\texttt{true}}\label{Dtrue} and {\tt
+false}\index{false}\label{Dfalse} and the operators {\tt
+and}\index{and?\texttt{and}}\label{Dand}, {\tt
+or}\index{or?\texttt{or}}\label{Dor}, {\tt
+not}\index{not?\texttt{not}}\label{Dnot}. The relations \verb|=| and
+\verb|<>|\index{<>?\texttt{<>}}\label{Dcmpar} test objects of any type
+for equality and inequality\index{inequality}.
+Comparison\index{comparison} relations \verb|<|\index{<?\texttt{<}},
+\verb|<=|\index{<=?\texttt{<=}}, \verb|>|\index{>?\texttt{>}}, and
+\verb|>=|\index{>=?\texttt{>=}} are defined lexicographically for
+strings and in the obvious way for numerics. Ordering relations are
+also defined for booleans, pairs, colors, and transforms, but the
+comparison rules are not worth discussing here.
+
+The picture\index{picture type} data type is just what the name implies.
+Anything that can be drawn in MetaPost can be stored in a picture
+variable. In fact, the {\tt draw}\index{draw?\texttt{draw}} statement
+actually stores its results in a special picture variable called {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}. Pictures
+can be added to other pictures and operated on by transforms.
+
+Finally, there is a data type called a pen\index{pen type}. The main
+function of pens in MetaPost is to determine line thickness, but they
+can also be used to achieve calligraphic effects. The
+statement\index{pickup?\texttt{pickup}}\label{Dpickup}
+$$ {\tt pickup\ }\descr{pen expression} $$
+causes the given pen to be used in subsequent
+\verb|draw|\index{draw?\texttt{draw}} or
+\verb|drawdot|\index{drawdot?\texttt{drawdot}} statements. Normally,
+the pen expression is of the form
+$$ {\tt pencircle\ scaled\ }\descr{numeric primary}. $$
+This defines a circular pen that produces lines of constant thickness.
+If calligraphic effects are desired, the pen expression can be adjusted to give
+an elliptical pen or a polygonal pen.
+
+\subsection{Operators}
+
+There are many different ways to make expressions of the ten basic
+types, but most of the operations fit into a fairly simple syntax with
+four levels of precedence as shown in Figure~\ref{syexpr}. There are
+primaries\index{primary?\tdescr{primary}},
+secondaries\index{secondary?\tdescr{secondary}},
+tertiaries\index{tertiary?\tdescr{tertiary}}, and
+expressions\index{expression?\tdescr{expression}} of each of the basic
+types, so the syntax rules could be specialized to deal with items such
+as \tdescr{numeric primary}, \tdescr{boolean tertiary}, etc. This
+allows the result type for an operation to depend on the choice of
+operator and the types of its operands. For example, the {\tt <}
+relation is a \tdescr{tertiary binary} that can be applied to a
+\tdescr{numeric expression} and a \tdescr{numeric tertiary} to give a
+\tdescr{boolean expression}. The same operator can accept other operand
+types such as \tdescr{string expression} and \tdescr{string tertiary},
+but an error message results if the operand types do not match.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{primary} \rightarrow \descr{variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression}
+ of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop}
+ \descr{secondary}$\\
+$\tt \descr{expression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop}
+ \descr{tertiary}$
+\end{ctabbing}
+\caption{The overall syntax rules for expressions}
+\index{unary op?\tdescr{unary op}} \index{nullary op?\tdescr{nullary op}}
+\index{primary binop?\tdescr{primary binop}}
+\index{secondary binop?\tdescr{secondary binop}}
+\index{tertiary binop?\tdescr{tertiary binop}}
+\label{syexpr}
+\end{figure}
+
+The multiplication and division operators {\tt *}\label{Dmldiv} and~{\tt
+/} are examples of what Figure~\ref{syexpr} calls a \tdescr{primary
+binop}. Each can accept two numeric operands or one numeric operand and
+one operand of type pair or color. The exponentiation operator
+\verb|**|\index{**?\texttt{**}}\index{exponentiation}\label{Dpow} is a
+\tdescr{primary binop} that requires two numeric operands. Placing this
+at the same level of precedence as multiplication and division has the
+unfortunate consequence that \verb|3*a**2| means $(3a)^2$, not
+$3(a^2)$\index{parsing irregularities}. Since unary
+negation\label{Dneg} applies at the primary level, it also turns out
+that \verb|-a**2| means $(-a)^2$. Fortunately, subtraction has lower
+precedence so that \verb|a-b**2| does mean $a-(b^2)$ instead of
+$(a-b)^2$.
+
+Another \tdescr{primary binop} is the {\tt
+dotprod}\index{dotprod?\texttt{dotprod}}\label{Ddprod} operator that
+computes the vector dot product of two pairs. For example, {\tt z1
+dotprod z2} is equivalent to {\tt x1*x2 + y1*y2}.
+
+The additive operators {\tt +} and {\tt -}\label{Dadd} are
+\tdescr{secondary binops} that operate on numerics, pairs, or colors and
+produce results of the same type. Other operators that fall in this
+category are ``Pythagorean addition''
+\verb|++|\index{++?\texttt{++}}\label{Dpyadd} and ``Pythagorean
+subtraction'' \verb|+-+|\index{+-+?\texttt{+-+}}\label{Dpysub}:
+\verb|a++b| means $\sqrt{a^2+b^2}$ and \verb|a+-+b| means
+$\sqrt{a^2-b^2}$. There are too many other operators to list here, but
+some of the most important are the boolean operators {\tt
+and}\index{and?\texttt{and}} and {\tt or}\index{or?\texttt{or}}. The
+{\tt and} operator is a \tdescr{primary binop} and the {\tt or} operator
+is a \tdescr{secondary binop}.
+
+The basic operations on strings are concatenation\index{concatenation},
+substring construction and calculating the length of a string.
+The \tdescr{tertiary binop} \verb|&|\index{&?\texttt{\&}}\label{Damp}
+implements concatenation; e.g.,
+$$ \hbox{\verb|"abc" & "de"|} $$
+produces the string \verb|"abcde"|. The {\tt
+length}\index{length?\texttt{length}}\label{DlengthString} operator
+returns the number of characters in a string if the argument is a
+\tdescr{string primary}; e.g.,
+$$ \hbox{\verb|length "abcde"|} $$
+returns \verb|5|. Another application of the {\tt length} operator is
+discussed on p.\ \pageref{Dlength}. For substring construction, the
+\tdescr{of operator} {\tt substring}\index{substring
+of?\texttt{substring of}}\label{Dsubstr} is used like this:
+$$ {\tt substring}\, \descr{pair expression} \,{\tt of}\, \descr{string primary} $$
+The \tdescr{pair expression} determines what part of the string to
+select. For this purpose, the string is indexed\index{indexing} so that
+integer positions fall {\em between\/} characters. Pretend the string
+is written on a piece of graph paper so that the first character
+occupies $x$~coordinates between zero and one and the next character
+covers the range $1\le x\le2$, etc. Thus the string \verb|"abcde"|
+should be thought of like this
+$$ \includegraphics{mpman-14.mps} $$
+and {\tt substring (2,4) of "abcde"} is {\tt "cd"}. This takes a little
+getting used to but it tends to avoid annoying ``off by one'' errors.
+
+Some operators take no arguments at all. An example of what
+Figure~\ref{syexpr} calls a \tdescr{nullary op} is {\tt
+nullpicture}\index{nullpicture?\texttt{nullpicture}}\label{Dnlpic} which
+returns a completely blank picture.
+
+The basic syntax in Figure~\ref{syexpr} only covers aspects of the
+expression syntax that are relatively type-independent. For instance,
+the complicated path syntax given in Figure~\ref{sypath} gives
+alternative rules for constructing a \tdescr{path expression}. An
+additional rule\index{path knot?\tdescr{path knot}}
+$$ \descr{path knot} \rightarrow \descr{pair tertiary} \;|\; \descr{path tertiary}
+$$
+explains the meaning of \tdescr{path knot} in Figure~\ref{sypath}. This means
+that the path expression
+$$ \hbox{\verb|z1+(1,1){right}..z2|} $$
+does not need parentheses around {\tt z1+(1,1)}.
+
+\subsection{Fractions, Mediation, and Unary Operators}
+
+Mediation\index{mediation} expressions do not appear in the basic expression
+syntax of Figure~\ref{syexpr}. Mediation expressions are parsed at the
+\tdescr{primary} level, so the general rule for constructing them is
+$$ \descr{primary} \rightarrow
+ \descr{numeric atom} \hbox{\tt [} \descr{expression}
+ \hbox{\tt ,} \descr{expression} \hbox{\tt ]}
+$$
+where each \tdescr{expression} can be of type numeric, pair, or color.
+The \tdescr{numeric atom}\index{numeric atom?\tdescr{numeric atom}} in a
+mediation expression is an extra simple type of \tdescr{numeric primary}
+as shown in Figure~\ref{synprim}. The meaning of all this is that the
+initial parameter in a mediation expression needs to be parenthesized
+when it is not just a variable, a positive number, or a positive
+fraction. For example,\index{parsing irregularities}
+$$ \hbox{\tt -1[a,b]} \quad {\rm and}\quad \hbox{\tt (-1)[a,b]} $$
+are very different: the former is $-b$ since it is equivalent to
+{\tt -(1[a,b])}; the latter is $a-(b-a)$ or $2a-b$.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{numeric primary} \rightarrow \descr{numeric atom}$\\
+$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}
+ \descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{numeric atom} \rightarrow \descr{numeric variable}$\\
+$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{numeric nullary op}$\\
+$\tt \descr{number or fraction} \rightarrow \descr{number}
+ \hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{number not followed by
+ `$\hbox{\tt /}\descr{number}$'}$
+\end{ctabbing}
+\caption{Syntax rules for numeric primaries}
+\label{synprim}
+\end{figure}
+
+A noteworthy feature of the syntax rules in Figure~\ref{synprim} is that
+the {\tt /}\index{fractions} operator binds most tightly when its
+operands are numbers. Thus {\tt 2/3} is a \tdescr{numeric
+atom}\index{numeric atom?\tdescr{numeric atom}}\index{parsing
+irregularities} while {\tt (1+1)/3} is only a \tdescr{numeric
+secondary}. Applying a \tdescr{unary op} such as {\tt
+sqrt}\index{sqrt?\texttt{sqrt}}\label{Dsqrt} makes the difference clear:
+$$ \hbox{\tt sqrt 2/3} $$
+means $\sqrt{2\over3}$ while
+$$ \hbox{\tt sqrt(1+1)/3} $$
+means $\sqrt 2/3$. Operators such as {\tt sqrt} can be written in
+standard functional notation, but it is often unnecessary to
+parenthesize the argument. This applies to any function that is parsed
+as a \tdescr{unary op}. For instance {\tt
+abs(x)}\index{abs?\texttt{abs}}\label{Dabs} and {\tt abs x} both compute
+the absolute value of {\tt x}. The same holds for the {\tt
+round}\index{round?\texttt{round}}\label{Dround}, {\tt
+floor}\index{floor?\texttt{floor}}\label{Dfloor}, {\tt
+ceiling}\index{ceiling?\texttt{ceiling}}\label{Dceil}, {\tt
+sind}\index{sind?\texttt{sind}}\label{Dsind}, and {\tt
+cosd}\index{cosd?\texttt{cosd}}\label{Dcosd} functions. The last two of
+these compute trigonometric functions of angles in degrees.
+
+Not all unary operators take numeric arguments and return numeric
+results. For instance, the {\tt abs}\index{abs?\texttt{abs}} operator
+can be applied to a pair to compute the Euclidean length of a vector.
+Applying the {\tt
+unitvector}\index{unitvector?\texttt{unitvector}}\label{Duvec} operator
+to a pair produces the same pair rescaled so that its Euclidean length
+is~1. The {\tt decimal}\index{decimal?\texttt{decimal}}\label{Ddecop}
+operator takes a number and returns the string representation. The {\tt
+angle}\index{angle?\texttt{angle}}\label{Dangle} operator takes a pair
+and computes the two-argument arctangent; i.e., {\tt angle} is the
+inverse of the {\tt dir} operator that was discussed in
+Section~\ref{tenscurl}. There is also an operator {\tt
+cycle}\index{cycle?\texttt{cycle}}\label{Dcycop} that takes a
+\tdescr{path primary} and returns a boolean result indicating whether
+the path is a closed curve.
+
+There is a whole class of other operators that classify expressions and
+return boolean results. A type name such as {\tt
+pair}\index{pair?\texttt{pair}} can operate on any type of
+\tdescr{primary} and return a boolean result indicating whether the
+argument is a {\tt pair}\label{Dpairop}. Similarly, each of the
+following can be used as a unary operator:
+{\tt numeric}\index{numeric?\texttt{numeric}}\label{Dnumop},
+{\tt boolean}\index{boolean?\texttt{boolean}}\label{Dboolop},
+{\tt cmykcolor}\index{cmykcolor?\texttt{cmykcolor}}\label{Dccolrop},
+{\tt color}\index{color?\texttt{color}}\label{Dcolrop},
+{\tt string}\index{string?\texttt{string}}\label{Dstrgop},
+{\tt transform}\index{transform?\texttt{transform}}\label{Dtrnfop},
+{\tt path}\index{path?\texttt{path}}\label{Dpathop},
+{\tt pen}\index{pen?\texttt{pen}}\label{Dpenop},
+{\tt picture}\index{picture?\texttt{picture}}\label{Dpictop}, and
+{\tt rgbcolor}\index{rgbcolor?\texttt{rgbcolor}}\label{Drcolrop}.
+Besides just
+testing the type of a \tdescr{primary}, you can use the {\tt
+known}\index{known?\texttt{known}}\label{Dknown} and {\tt
+unknown}\index{unknown?\texttt{unknown}}\label{Dunknwn} operators to
+test if it has a completely known value.
+
+Even a number can behave like an operator in some contexts. This refers
+to the trick that allows {\tt 3x}\index{multiplication, implicit} and
+{\tt 3cm} as alternatives to {\tt 3*x} and {\tt 3*cm}. The rule is that
+a \tdescr{number or fraction} that is not followed by {\tt +}, {\tt -},
+or another \tdescr{number or fraction} can serve as a \tdescr{primary
+binop}. Thus {\tt 2/3x}\index{parsing irregularities} is two thirds of
+{\tt x} but {\tt (2)/3x} is $2\over3x$ and {\tt 3 3} is illegal.
+
+There are also operators for extracting numeric subfields from pairs,
+colors, cmykcolors, and even transforms. If {\tt p} is a \tdescr{pair
+primary}, {\tt xpart p}\index{xpart?\texttt{xpart}}\label{Dxprt} and
+{\tt ypart p}\index{ypart?\texttt{ypart}}\label{Dyprt} extract its components so that
+$$ \hbox{\tt (xpart p, ypart p)} $$ is equivalent to~{\tt p} even if
+{\tt p} is an unknown pair that is being used in a linear equation.
+Similarly, a color {\tt c} is equivalent
+to\index{redpart?\texttt{redpart}}%
+\index{greenpart?\texttt{greenpart}}%
+\index{bluepart?\texttt{bluepart}}\label{Drgbprt}
+$$ \hbox{\tt (redpart c, greenpart c, bluepart c)}. $$
+For a cmykcolor {\tt c}, the components are%
+\index{cyanpart?\texttt{cyanpart}}%
+\index{magentapart?\texttt{magentapart}}%
+\index{yellowpart?\texttt{yellowpart}}%
+\index{blackpart?\texttt{blackpart}}\label{Dcmykprt}
+$$ \hbox{\tt (cyanpart c, magentapart c, yellowpart c, blackpart c)} $$
+and for a greyscale color {\tt c}, there is only one component%
+\index{greypart?\texttt{greypart}}\label{Dgreyprt}%
+$$ \hbox{\tt greypart c}. $$
+All color component operators are discussed in more detail in
+section~\ref{piccomp}. Part specifiers for transforms are discussed
+in section~\ref{transsec}.
+
+
+\section{Variables}
+\label{vars}
+
+MetaPost allows compound variable names such as {z.a}, {\tt x2r}, {\tt y2r},
+and {\tt z2r}, where {\tt z2r} means {\tt (x2r,y2r)} and {\tt z.a} means
+{\tt (x.a,y.a)}. In fact there is a broad class of suffixes such that
+{\tt z}\tdescr{suffix}\index{suffix?\tdescr{suffix}} means
+$$ (x\descr{suffix},\, y\descr{suffix}). $$
+Since a \tdescr{suffix} is composed of tokens, it is best to begin with a few
+comments about tokens.
+
+\subsection{Tokens}
+
+A MetaPost input file is treated as a sequence of numbers, string
+constants, and symbolic tokens\index{tokens}\index{tokens!symbolic}. A
+number consists of a sequence of digits possibly containing a decimal
+point. Technically, the minus sign in front of a negative number is a
+separate token. Since MetaPost uses fixed point
+arithmetic\index{arithmetic}, it does not understand exponential
+notation such as {\tt 6.02E23}. MetaPost would interpret this as the
+number 6.02, followed by the symbolic token {\tt E}, followed by the
+number~23.
+
+Anything between a pair of double quotes {\tt "} is a
+string constant\index{string constants}. It is
+illegal for a string constant to start on one line and end on a later line.
+Nor can a string constant contain double quotes {\tt "} or anything other than
+printable ASCII characters.
+
+Everything in a line of input other than numbers and string constants is broken
+into symbolic tokens\index{tokens!symbolic}. A symbolic token is a sequence of
+one or more similar characters, where characters are ``similar'' if they occur
+on the same row of Table~\ref{classes}.
+
+\begin{table}
+$$\begin{tabular}{c}
+\verb|ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|\\
+{\tt :<=>|}\\
+\verb|#&@$|\\
+\verb|/*\|\\
+{\tt +-}\\
+{\tt !?}\\
+{\tt '`}\\
+\verb|^~|\\
+\verb|{}|\\
+{\tt [}\\
+{\tt ]}\\
+\end{tabular}
+$$
+\caption{Character classes for tokenization}
+\label{classes}
+\end{table}
+
+Thus \verb|A_alpha| and {\tt +-+} are symbolic tokens but {\tt !=} is
+interpreted as two tokens and {\tt x34} is a symbolic token followed by
+a number. Since the brackets {\tt [} and {\tt ]} are listed on lines by
+themselves, the only symbolic tokens involving them are {\tt [}, {\tt
+[[}, {\tt [[[}, etc.\ and {\tt ]}, {\tt ]]}, etc.
+
+Some characters are not listed in Table~\ref{classes} because they need
+special treatment. The four characters {\tt ,;()} are ``loners'': each
+comma, semicolon, or parenthesis is a separate token even when they
+occur consecutively. Thus {\tt (())} is four tokens, not one or two.
+The percent sign is very special because it introduces
+comments\index{\%?\texttt{\%}!comment}\index{comments}. The percent
+sign and everything after it up to the end of the line are ignored.
+
+Another special character is the period. Two or more periods
+together form a symbolic token, but a single period is ignored, and a period
+preceded or followed by digits is part of a number Thus {\tt ..}
+and {\tt ...} are symbolic tokens while {\tt a.b} is just two tokens {\tt a}
+and {\tt b}. It conventional to use periods to separate tokens in this fashion
+when naming a variable that is more than one token long.
+
+\subsection{Variable Declarations}
+\label{vardecl}
+
+A variable name is a symbolic token or a sequence of symbolic tokens.
+Most symbolic tokens are legitimate variable names, but anything with a
+predefined meaning like {\tt draw}, {\tt +}, or {\tt ..} is disallowed;
+i.e., variable names cannot be macros or MetaPost primitives. This
+minor restriction allows an amazingly broad class of variable names:
+{\tt alpha}, \verb|==>|, \verb|@&#$&|, and \verb|~~| are all legitimate
+variable names. Such symbolic tokens without special meanings are
+called {\em tags}\index{tags}.
+
+A variable name can be a sequence of tags like {\tt f.bot} or {\tt
+f.top}. The idea is to provide some of the functionality of Pascal
+records or C structures. It is also possible to simulate arrays by
+using variable names that contain numbers as well as symbolic tokens.
+For example, the variable name {\tt x2r} consists of the tag {\tt x},
+the number 2, and the tag~{\tt r}. There can also be variables named
+{\tt x3r} and even {\tt x3.14r}. These variables can be treated as an
+array\index{arrays} via constructions like {\tt x[i]r}, where {\tt i}
+has an appropriate numeric value. The overall syntax for variable names
+is shown in Figure~\ref{syvar}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{suffix} \rightarrow \descr{empty} \;|\;
+ \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \descr{subscript} \rightarrow \descr{number} \;|\;
+ \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$
+\end{ctabbing}
+\caption{The syntax for variable names.}
+\index{suffix?\tdescr{suffix}}\index{subscript?\tdescr{subscript}}
+\label{syvar}
+\end{figure}
+
+Variables like {\tt x2} and {\tt y2} take on numeric values by default, so we
+can use the fact that {\tt z}\tdescr{suffix} is an abbreviation for\index{z convention?{\tt z} convention}\label{Dzconv}
+$$ (x\descr{suffix},\, y\descr{suffix}) $$
+to generate pair-valued variables when needed. It turns out that the
+{\tt beginfig}\index{beginfig?\texttt{beginfig}} macro wipes out
+pre-existing values variables that begin with the tags {\tt x} or {\tt
+y} so that {\tt beginfig} \ldots\ {\tt endfig} blocks do not interfere
+with each other when this naming scheme is used. In other words,
+variables that start with {\tt x}, {\tt y}, {\tt z} are
+local\index{variables!local}\index{locality} to the figure they are used
+in. General mechanisms for making variables local will be discussed in
+Section~\ref{grsec}.
+
+Type declarations\index{declarations}\index{type declarations}
+make it possible to use almost any naming scheme while still
+wiping out any previous value that might cause interference. For example, the
+declaration
+$$ \hbox{\tt pair pp, a.b;} $$
+makes {\tt pp} and {\tt a.b} unknown pairs. Such a declaration is not
+strictly local since {\tt pp} and {\tt a.b} are not automatically
+restored to their previous values at the end of the current figure. Of
+course, they are restored to unknown pairs if the declaration is
+repeated.
+
+Declarations work the same way for any of the other nine types: numeric,
+path, transform, color, cmykcolor, string, boolean, picture, and pen. The
+only restriction is that you cannot give explicit numeric subscripts in
+a variable declaration. Do not give the illegal declaration
+$$ \hbox{\tt numeric q1, q2, q3;} $$
+use the generic subscript\index{subscript!generic} symbol
+{\tt []}\index{arrays}\index{[]?\texttt{[]}!array}
+instead, to declare the whole array:
+$$ \hbox{\tt numeric q[];} $$
+You can also declare ``multidimensional'' arrays\index{arrays!multidimensional}.
+After the declaration
+$$ \hbox{\tt path p[]q[], pq[][];} $$
+{\tt p2q3} and {\tt pq1.4 5} are both paths.
+
+Internal\index{internal variables}\index{variables!internal} variables
+like {\tt tracingonline} cannot be declared in the normal fashion. All
+the internal variables discussed in this manual are predefined and do
+not have to be declared at all, but there is a way to declare that a
+variable should behave like a newly-created internal variable. The
+declaration is {\tt
+ newinternal}\index{newinternal?\texttt{newinternal}}\label{Dnewint}
+followed by an optional type specifier \texttt{numeric}\index{internal
+ variables!\texttt{numeric}}\index{variables!internal!\texttt{numeric}}
+or \texttt{string}\index{internal
+ variables!\texttt{string}}\index{variables!internal!\texttt{string}}
+and a list of symbolic tokens. For example,
+$$\begin{verbatim}
+newinternal numeric n, m;
+newinternal string s, t;
+newinternal num;
+\end{verbatim}
+$$
+are valid declarations that declare three internal numeric variables
+\texttt{n}, \texttt{m}, and~\texttt{num} and two internal string
+variables \texttt{s} and~\texttt{t}.
+
+Internal variables always have known values, and these values can only
+be changed by using the assignment\index{assignment} operator
+{\tt:=}\index{:=?\texttt{:=}}. Internal numeric variables are initially
+zero and internal string variables are initially the empty
+string~\verb|""|, except that the Plain\index{Plain macros} macro
+package gives some of the variables different initial values. (The
+Plain macros are normally preloaded automatically as explained in
+Section~\ref{intro}.)
+
+Internal string variables have been introduced in MetaPost
+version~1.200. For backwards compatibility, if the type specifier is
+missing, internal variables default to a \texttt{numeric}\index{internal
+ variables!\texttt{numeric}}\index{variables!internal!\texttt{numeric}}
+type, as in the last example. The declarations \texttt{newinternal
+ numeric;} and \texttt{newinternal string;} are invalid and throw an
+error.
+
+
+\section{Integrating Text and Graphics}
+\label{text}
+
+MetaPost has a number of features for including labels and other
+text\index{text and graphics} in the figures it generates. The simplest
+way to do this is to use the {\tt
+label}\index{label?\texttt{label}}\label{Dlabel} statement\index{label
+suffix?\tdescr{label suffix}}
+$$ {\tt label}\descr{label suffix} \hbox{\tt (}
+ \descr{string or picture expression} \hbox{\tt,}\, \descr{pair expression}
+ \hbox{\tt );}
+$$
+The \tdescr{string or picture expression} gives the label and the
+\tdescr{pair expression} says where to put it. The \tdescr{label
+suffix} can be \tdescr{empty} in which case the label is just centered
+on the given coordinates. If you are labeling some feature of a diagram
+you probably want to offset the label slightly to avoid overlapping.
+This is illustrated in Figure~\ref{fig16} where the {\tt "a"} label is
+placed above the midpoint of the line it refers to and the {\tt "b"}
+label is to the left of the midpoint of its line. This is achieved by
+using {\tt label.top}\index{top?\texttt{top}} for the {\tt "a"} label
+and {\tt label.lft}\index{lft?\texttt{lft}} for the {\tt "b"} label as
+shown in the figure. The \tdescr{label suffix} specifies the position
+of the label relative to the specified coordinates. The complete set of
+possibilities is\index{rt?\texttt{rt}}\index{bot?\texttt{bot}}%
+\index{ulft?\texttt{ulft}}\index{urt?\texttt{urt}}\index{llft?\texttt{llft}}\index{lrt?\texttt{lrt}}
+$$ \tt \descr{label suffix} \rightarrow
+ \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\;
+ ulft \;|\;urt \;|\; llft \;|\; lrt
+$$
+where {\tt lft} and {\tt rt} mean left and right and {\tt llft}, {\tt
+ulft}, etc.\ mean lower left, upper left, etc. The actual amount by
+which the label is offset in whatever direction is determined by the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt
+labeloffset}\index{labeloffset?\texttt{labeloffset}}\label{Dlaboff}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpman-17.mps}}
+$$
+\caption{MetaPost code and the resulting output}
+\label{fig16}
+\end{figure}
+
+Figure~\ref{fig16} also illustrates the
+{\tt dotlabel}\index{dotlabel?\texttt{dotlabel}}\label{Ddotlab}
+statement. This is effectively
+like a {\tt label} statement followed by a statement drawing a dot at
+the indicated coordinates. For example
+$$ \hbox{\tt dotlabel.bot("(0,0)", z0)} $$
+places a dot at {\tt z0} and then puts the label ``(0,0)'' just below
+the dot. The diameter of the dot drawn by the {\tt dotlabel} statement
+is determined by the value of the internal variable {\tt
+ dotlabeldiam}\index{dotlabeldiam?\texttt{dotlabeldiam}}\label{Ddotlabdiam}.
+Default value is 3bp.
+
+Another alternative is the macro
+{\tt thelabel}\index{thelabel?\texttt{thelabel}}\label{Dthelab}. This has
+the same syntax as the {\tt label} and {\tt dotlabel} statements except that it
+returns the label as a \tdescr{picture primary} instead of actually drawing it.
+Thus
+$$ \hbox{\tt label.bot("(0,0)", z0)} $$
+is equivalent to
+$$ \hbox{\tt draw thelabel.bot("(0,0)", z0)} $$
+
+For simple applications of labeled figures, you can normally get by with
+just {\tt label} and {\tt dotlabel}. In fact, you may be able to use a
+short form of the {\tt dotlabel} statement that saves a lot of typing
+when you have many points {\tt z0}, {\tt z1}, {\tt z.a}, {\tt z.b},
+etc.\ and you want to use the {\tt z} suffixes as labels. The
+statement\index{dotlabels?\texttt{dotlabels}}\label{Ddotlbs}
+$$ \hbox{\tt dotlabels.rt(0, 1, a);} $$
+is equivalent to
+$$ \hbox{\tt dotlabel.rt("0",z0); dotlabel.rt("1",z1); dotlabel.rt("a",z.a);} $$
+Thus the argument to {\tt dotlabels} is a list of suffixes for which {\tt z}
+variables are known, and the \tdescr{label suffix} given with {\tt dotlabels}
+is used to position all the labels.
+
+There is also a {\tt
+labels}\index{labels?\texttt{labels}}\label{Dlabels} statement that is
+analogous to {\tt dotlabels} but its use is discouraged because it
+presents compatibility problems with \MF\index{metafont?\MF}. Some
+versions of the preloaded Plain\index{Plain macros} macro package define
+{\tt labels} to be synonymous with {\tt dotlabels}.
+
+For labeling statements such as {\tt label} and {\tt dotlabel} that use
+a string expression for the label text, the string gets typeset in a
+default font as determined by the string variable {\tt
+defaultfont}\index{defaultfont?\texttt{defaultfont}}\label{Ddffont}.
+The initial value of {\tt defaultfont} is likely to be {\tt "cmr10"},
+but it can be changed to a different font name by giving an assignment
+such as
+$$ \hbox{\tt defaultfont:="ptmr8r"} $$
+\ttt{ptmr8r} is a typical way to refer to the Times-Roman font in \TeX.
+The discussion of font names on p.\ \pageref{fontname} explains further.
+
+There is also a numeric quantity called
+{\tt defaultscale}\index{defaultscale?\texttt{defaultscale}}\label{Ddfscale}
+that determines the type size.
+When {\tt default\-scale} is 1, you get the ``normal size'' which is
+usually 10 point, but this can also be changed. For instance
+$$ \hbox{\tt defaultscale := 1.2} $$
+makes labels come out twenty percent larger. If you do not know the
+normal size and you want to be sure the text comes out at some specific
+size, say 12 points, you can use the {\tt
+fontsize}\index{fontsize?\texttt{fontsize}}\label{Dfntsiz} operator to
+determine the normal size: e.g.,
+$$ \hbox{\tt defaultscale := 12pt/fontsize defaultfont;} $$
+
+\label{fontname}
+When you change {\tt defaultfont}, the new font name should be something
+that \TeX\ would understand since MetaPost gets height and width
+information by reading a {\tt tfm}\index{tfm file?{\tt tfm}
+file}\index{files!tfm?{\tt tfm}} file. (This is explained in {\sl The
+\TeX book\/} \cite{kn:a}.) It should be possible to use built-in
+PostScript\index{PostScript!fonts} fonts, but the names for
+them are system-dependent. Some typical ones are {\tt ptmr8r} for
+Times-Roman\index{Times-Roman}, \ttt{pplr8r} for Palatino\index{Palatino},
+and \ttt{phvr} for Helvetica\index{Helvetica}. The Fontname document,
+available at \url{http://tug.org/fontname}, has much more information
+about font names and \TeX. A \TeX\index{TeX?\TeX!fonts} font such
+as {\tt cmr10} is a little dangerous because it does not have a space
+character or certain ASCII symbols.
+
+MetaPost does not use the ligatures\index{ligatures} and
+kerning\index{kerning} information that comes with a \TeX\ font.
+Further, MetaPost itself does not interpret virtual fonts.
+
+
+\subsection{Typesetting Your Labels}
+
+\label{Dbtex}
+\index{labels, typesetting}
+
+\TeX\index{TeX?\TeX} may be used to format complex labels.
+If you say\index{btex?\texttt{btex}}\index{etex?\texttt{etex}}
+$$ {\tt btex}\, \descr{typesetting commands}\, {\tt etex} $$
+in a MetaPost input file, the \tdescr{typesetting commands} get processed by
+\TeX\ and translated into a picture expression
+(actually a \tdescr{picture primary}) that can be used in a {\tt label}
+or {\tt dotlabel} statement. Any spaces after {\tt btex} or before {\tt etex}
+are ignored. For instance, the statement
+$$ \hbox{\verb|label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u)|} $$
+in Figure~\ref{fig17} places the label $\sqrt x$ at the lower right of the
+point {\tt (3,sqrt 3)*u}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpman-18.mps}}
+$$
+\caption{Arbitrary \TeX\ as labels}
+\label{fig17}
+\end{figure}
+
+Figure~\ref{fig18} illustrates some of the more complicated things that can
+be done with labels. Since the result of {\tt btex} \ldots {\tt etex} is
+a picture, it can be operated on like a picture. In particular, it is possible
+to apply transformations to pictures. We have not discussed the syntax for
+this yet, but a \tdescr{picture secondary}
+can be\index{rotated text}\index{rotated?\texttt{rotated}}
+$$ \descr{picture secondary}\, {\tt rotated}\, \descr{numeric primary} $$
+This is used in Figure~\ref{fig18} to rotate the label ``$y$ axis'' so that
+it runs vertically.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpman-19.mps}}
+$$
+\caption{\TeX\ labels with display math, and rotated by MetaPost}
+\label{fig18}
+\end{figure}
+
+Another complication in Figure~\ref{fig18} is the use of the displayed equation
+$$y={2\over 1+\cos x}$$
+as a label. It would be more natural to code this as
+$$ \hbox{\verb|$$y={2\over 1+\cos x}$$|} $$
+but this would not work because
+\TeX\ typesets the labels in ``horizontal mode.''
+
+For a way to typeset \emph{variable} text as labels, see the
+\texttt{TEX} utility routine described on p.\ \pageref{dTEX}.
+
+Here is how \TeX\ material gets translated into a form MetaPost
+understands: MetaPost stores all {\tt btex}\index{btex?\texttt{btex}}
+\ldots\ {\tt etex}\index{etex?\texttt{etex}} blocks in a temporary
+file and then runs \TeX\ on that file. If the environment variable
+\ttindex{MPTEXPRE} is set to the name of an existing file, its content
+will be prepended to the output file for processing by \TeX. You can
+use this to include \LaTeX\ preambles, for instance. The \ttt{TEX}
+macro described on p.\ \pageref{dTEX} provides another way to handle
+this.
+
+Once the \TeX\ run is finished, MetaPost translates the resulting
+DVI\index{dvi file?{\tt dvi} file}\index{files!dvi?{\tt dvi}} file into
+low level MetaPost commands that are then read instead of the {\tt btex}
+\ldots\ {\tt etex} blocks. If the main file is {\tt fig.mp}, the
+translated \TeX\ material is placed in a file named {\tt
+ fig.mpx}\index{mpx file?{\tt mpx} file}\index{files!mpx?{\tt mpx}}.
+
+The conversion normally runs silently without any user intervention but
+it could fail, for instance if one of the {\tt btex} \ldots {\tt etex}
+blocks contains an erroneous \TeX\index{TeX?\TeX!errors} command. In
+that case, the \TeX\ input is saved in the file {\tt
+ mpxerr.tex}\index{mpxerr.tex?\texttt{mpxerr.tex}} and the \TeX\ error
+messages appear in {\tt
+ mpxerr.log}\index{mpxerr.log?\texttt{mpxerr.log}}\index{log file?{\tt
+ log} file}\index{files!log?{\tt log}}.
+
+The DVI to MetaPost conversion route {\it does\/} understand virtual
+fonts, so you can use your normal \TeX\ font switching commands inside
+the label.
+
+
+\label{Dmakempx}
+In MetaPost versions before 1.100, the \TeX\ label preprocessing was
+handled by an external program that was called upon automatically by
+MetaPost. On Web2C-based systems, the preprocessor was normally named
+\ttindex{makempx}, which called the utility \ttindex{mpto} for the
+creation of the \TeX\ input file and the utility \texttt{dvitomp}\index{dvitomp?\texttt{dvitomp}} for
+the conversion to low level MetaPost. In the current MetaPost version,
+the work of this program is now done internally. However, if the
+environment variable \ttindex{MPXCOMMAND} is set, the whole label
+conversion mechanism will be delegated to the command given in that
+variable.
+
+
+\label{Dverbatimtex}
+\TeX\ macro definitions or any other auxiliary \TeX\ commands can be
+enclosed in a {\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}}
+\ldots\ {\tt etex}\index{etex?\texttt{etex}} block. The difference
+between {\tt btex} and {\tt verbatimtex} is that the former generates a
+picture expression while the latter only adds material for \TeX\ to
+process. For instance, if you want \TeX\ to typeset labels using macros
+defined in {\tt mymac.tex}, your MetaPost input file would look
+something like this:
+\begin{eqnarray*}
+&& \verb|verbatimtex \input mymac etex|\\
+&& \verb|beginfig(1);|\\
+&& \qquad \dots\\
+&& \verb|label(btex|\, \descr{\TeX\ material using \hbox{\tt mymac.tex}}\,
+ \verb|etex, | \descr{some coordinates} \hbox{\tt );}\\
+&& \qquad \dots
+\end{eqnarray*}
+
+\label{Dtroffmode}
+On Unix\footnote{Unix is a registered trademark of Unix Systems
+Laboratories.}\index{Unix} and other Web2C-based systems, the
+option {\tt -troff} to MetaPost tells the preprocessor that {\tt btex}
+$\ldots$ {\tt etex} and {\tt verbatimtex} $\ldots$ {\tt etex} blocks
+are in troff\index{troff} instead of \TeX. When using this option,
+MetaPost sets the internal variable
+\ttindex{troffmode} to~1\index{prologues?\texttt{prologues}}.
+
+\label{Dprologues}
+Setting \ttt{prologues} can be useful with \TeX, too, not just troff.
+Here is some explanation:
+
+\begin{itemize}
+\item In PostScript output mode, when \ttt{prologues} is 0, which is the default, the MetaPost
+output files do not have embedded fonts. Fonts in the resulting
+output will probably render as Courier\index{Courier} or
+Times-Roman\index{Times-Roman}.
+
+In SVG mode, the text will probably render in a generic sans serif font.
+There may very well be problems with the encoding of non-ASCII characters:
+the font model of SVG is totally different from the model used by MetaPost.
+
+\item In PostScript output mode, when \ttt{prologues} is 1, the MetaPost output claims to be
+``structured PostScript''\index{PostScript!structured} (EPSF\index{EPSF}),
+but it is not completely conformant. This variant is kept for backward
+compatibility with old (troff) documents, but its use is deprecated.
+MetaPost sets \ttt{prologues} to~1 when the {\tt -troff} option is given
+on the command line.
+
+A \ttt{prologues:=1} setting is currently ignored in SVG output
+mode. The value is reserved for future use (possibly for mapping to
+\ttt{font-family}, \ttt{font-weight}, etc. properties).
+
+\item In PostScript output mode, when \ttt{prologues} is 2, the
+MetaPost output is EPSF and assumes
+that the text comes from PostScript\index{PostScript!fonts} fonts
+provided by the ``environment'', such as the document viewer or
+embedded application using the output. MetaPost will attempt to
+set up the font encodings correctly, based on \ttt{fontmapfile} and
+\ttt{fontmapline} commands.
+
+A \ttt{prologues:=2} setting is currently ignored in SVG output mode.
+The value is reserved for future use (possibly for external
+\ttt{font-face} definitions).
+
+\item In PostScript output mode, when \ttt{prologues} is 3, the MetaPost output will be EPSF but
+will contain the PostScript font(s) (or a subset) used based on the
+\ttt{fontmapfile} and \ttt{fontmapline} commands. This value is useful
+for generating stand-alone PostScript graphics.
+
+In SVG mode, the font glyphs are converted to path definitions that
+are included at the top of the output file.
+
+\end{itemize}
+
+The correct setting for variable \texttt{prologues} depends on how
+MetaPost graphics are post-processed. Here are recommendations for some
+popular use-cases:
+
+\begin{description}
+
+\item[\normalfont\itshape Previewing:] Section~\ref{preview} discusses
+ previewing PostScript output.
+
+\item[\normalfont\itshape \TeX\ and dvips:] When including PostScript
+ figures into a \TeX\ document that is processed by \TeX\ and a DVI
+ output processer, e.g., dvips\index{dvips}, variable
+ \texttt{prologues} should \emph{not} be set to the value~1, unless the
+ used fonts are known to be resident in the PostScript interpreter.
+ Make sure that variable \texttt{prologues} is set to either~0 (font
+ inclusion handled by dvips, but without re-encoding support), 2 (font
+ inclusion by dvips, with font re-encoding if necessary), or~3 (font
+ inclusion and re-encoding by MetaPost). Value~3 is safest, but may
+ result in slightly larger output.
+
+\item[\normalfont\itshape pdf\TeX:] When generating PDF files with
+ pdf\TeX\ (and the mptopdf\index{mptopdf} bundle), variable
+ \texttt{prologues} is not relevant.
+
+\item[\normalfont\itshape PostScript in external applications:] Some
+ text\index{text processor} processors or graphics applications can
+ directly import EPSF files, while for others MetaPost's PostScript
+ output has to be converted to a different vector or even a bitmap
+ format first. In any case, as soon as PostScript graphics generated
+ by MetaPost are leaving the \TeX\ ecosystem, variable
+ \texttt{prologues} should be set to~3, so that all needed fonts are
+ embedded (as a subset).
+
+\item[\normalfont\itshape SVG output:] Converting font glyphs to paths
+ by setting variable \texttt{prologues} to~3 is currently the only
+ reliable way to export text objects to SVG.
+
+\item[\normalfont\itshape PNG output:] Variable \texttt{prologues} has
+ no effect in PNG output mode.
+
+\end{description}
+
+It is worth noting that the value of \ttt{prologues} has no effect on
+\MF\ fonts in your MetaPost files, i.\,e., MetaPost never embeds such
+fonts. Only output drivers, e.\,g., \ttt{dvips} or pdf\LaTeX\ will
+handle those.
+
+The details on how to include PostScript figures in a paper
+done in \TeX\ or troff are system-dependent. They can generally be found
+in manual pages and other on-line documentation, but have a look at
+section~\ref{mpimport} of this manual for some brief instructions that
+in many cases should work. The manual for the
+widely-used Dvips processor is in a file \ttt{dvips.texi}, included in
+most distributions, and is available online at
+\url{http://tug.org/texinfohtml/dvips.html}, among many other places and
+formats.
+
+\subsection{Font Map Files}
+\label{fontmap}
+
+If \ttt{prologues} is set to~2, any used fonts in the output file are
+automatically re-encoded, and the encoding vector file specified in
+the fontmap entry will be embedded in the output file. If
+\ttt{prologues} is set to~3, MetaPost will also attempt to include
+(a subset of) the used PostScript\index{PostScript!fonts} fonts. For
+this to work, it needs to acquire font map information.
+
+The code is based on the font library used by pdf\TeX. Following in the
+footsteps of pdf\TeX, there are two new associated primitives:
+\ttindex{fontmapfile}\label{Dfontmapfile} and
+\ttindex{fontmapline}\label{Dfontmapline}. Here is a simple example,
+specifying the map file for Latin Modern fonts in YandY (\LaTeX\ LY1)
+encoding:
+\begin{center}\begin{tabular}{l}
+\verb|prologues:=2;|\\
+\verb|fontmapfile "texnansi-lm.map";|\\
+\verb|beginfig(1);|\\
+\verb| draw "Hell, vilg" infont "texnansi-lmr10";|\\
+\verb|endfig;|
+\end{tabular}\end{center}
+
+Using \ttt{fontmapline}, you can specify font mapping information
+inside the figure:
+\begin{center}\begin{tabular}{l}
+\verb|prologues:=2;|\\
+\verb|fontmapline "pplbo8r URWPalladioL-Bold "&ditto&|\\
+\verb| ".167 SlantFont"&ditto&" <8r.enc <uplb8a.pfb";|\\
+\verb|beginfig(1);|\\
+\verb| draw "Hello, world" infont "pplbo8r";|\\
+\verb|endfig;|
+\end{tabular}\end{center}
+This will attempt to reencode the PostScript font
+URWPalladioL-Bold\index{URWPalladioL-Bold}\index{Palatino}
+whose tfm file is pplbo8r.tfm. The encoding is found in the file
+8r.enc, and will be included into the output file.
+
+If the same example was run with \ttt{prologues:=3}, MetaPost would
+include a subset of the font that resides in uplb8a.pfb into the
+output. In this case, the subset of the font is reorganized so that it
+has the correct encoding internally, 8r.enc will not be embedded also.
+
+The argument to both commands has an optional flag character at the very
+beginning. This optional flag has the same meaning as in pdf\TeX:
+$$\begin{tabular}{|c|l|} \hline
+\multicolumn1{|c|}{Option}& \multicolumn1{c|}{Meaning}\\ \hline
+ + & extend the font list, but ignore duplicates \\
+ = & extend the font list, replacing duplicates \\
+ $-$ & remove all matching fonts from the font list \\
+\hline
+\end{tabular}
+$$
+Without any option, the current list will be completely replaced.
+
+If \ttt{prologues} is set to two or three, yet there are no
+\ttt{fontmapfile} statements, MetaPost will attempt to locate a
+default map file, with a preference to read {\tt mpost.map}. If that
+fails, it will also attempt either {\tt troff.map} or {\tt
+pdftex.map}, depending on whether or not troff mode is enabled. If
+\ttt{prologues} is set to~1, MetaPost attempts to read a file called
+{\tt psfonts.map}, regardless of any {\tt fontmapfile}
+statement. Again, this is for backward compatibility only.
+
+
+\subsection{The \texttt{infont} Operator}
+\label{Sinfont}
+
+Regardless of whether you use \TeX\ or troff, all the real work of
+adding text to pictures is done by a MetaPost primitive operator called
+{\tt infont}\index{infont?\texttt{infont}}. It is a \tdescr{primary
+ binop}\index{primary binop?\tdescr{primary binop}} that takes a
+\tdescr{string secondary} as its left argument and a \tdescr{string
+ primary} as its right argument. The left argument is text, and the
+right argument is a font name. The result of the operation is a
+\tdescr{picture secondary}, which can then be transformed in various
+ways. One possibility is enlargement by a given factor via the
+syntax\index{scaled?\texttt{scaled}}
+$$ \descr{picture secondary}\, \hbox{\tt scaled}\, \descr{numeric primary} $$
+Thus {\tt label("text",z0)} is equivalent to
+$$ \hbox{\tt label("text" infont defaultfont scaled defaultscale, z0)} $$
+
+If it is not convenient to use a string constant for the left argument of
+{\tt infont}, you can use\index{char?\texttt{char}}\label{Dchar}
+$$ {\tt char}\, \descr{numeric primary} $$
+to select a character based on its numeric position in the font.
+Thus
+$$ \hbox{\tt char(n+64) infont "ptmr8r"} $$
+is a picture containing character {\tt n+64} of the font \ttt{ptmr8r},
+which is a typical \TeX\ way to refer to Times-Roman. See p.\
+\pageref{fontname} for further discussion.
+
+Bare MetaPost does not do any kind of input reencoding, so when
+you use {\tt infont} string for labels (instead of {\tt btex} \ldots\
+{\tt etex}), the string has to be specified in the font encoding.
+
+
+\subsection{Measuring Text}
+\label{meas}
+
+MetaPost makes readily available the physical dimensions\index{size} of
+pictures generated by the {\tt infont} operator. There are unary
+operators {\tt
+llcorner}\index{llcorner?\texttt{llcorner}}\label{Dcornop}, {\tt
+lrcorner}\index{lrcorner?\texttt{lrcorner}}, {\tt
+urcorner}\index{urcorner?\texttt{urcorner}}, {\tt
+ulcorner}\index{ulcorner?\texttt{ulcorner}}, and {\tt
+center}\index{center?\texttt{center}}\label{Dcenter} that take a \tdescr{picture
+primary} and return the corners of its ``bounding box'' as illustrated
+in Figure~\ref{bbox}. The {\tt center} operator also accepts
+\tdescr{path primary} and \tdescr{pen primary} operands. In MetaPost
+Version 0.30 and higher, {\tt llcorner}, {\tt lrcorner}, etc. accept
+all three argument types as well.
+
+The argument type restrictions on the corner operators are not very
+important because their main purpose is to allow {\tt label} and {\tt
+dotlabel} statements to center their text properly. The predefined
+macro\index{bbox?\texttt{bbox}}\label{Dbbox}
+$$ {\tt bbox}\, \descr{picture primary} $$
+finds a rectangular path that represents the bounding box of a given picture.
+If {\tt p} is a picture, {\tt bbox p} is equivalent to
+$$\begin{verbatim}
+(llcorner p--lrcorner p--urcorner p--ulcorner p--cycle)
+\end{verbatim}
+$$
+except that it allows for a small amount of extra space around {\tt p}
+as specified by the internal variable\index{internal
+variables}\index{variables!internal} {\tt
+bboxmargin}\index{bboxmargin?\texttt{bboxmargin}}\label{Dbbmargin}.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-20.mps} $$
+\caption{A bounding box and its corner points.}
+\label{bbox}
+\end{figure}
+
+Note that MetaPost computes the bounding box of a {\tt
+btex}\index{btex?\texttt{btex}} \ldots\ {\tt
+etex}\index{etex?\texttt{etex}} picture just the way
+\TeX\index{TeX?\TeX} does. This is quite natural, but it has certain
+implications in view of the fact that \TeX\ has features like
+{\tt\string\strut}\index{strut?{\tt\string\strut}} and
+{\tt\string\rlap}\index{rlap?{\tt\string\rlap}} that allow \TeX\ users
+to lie about the dimensions of a box.
+
+When \TeX\ commands that lie about the dimensions of a box are
+translated in to low-level MetaPost code, a {\tt
+setbounds}\index{setbounds?\texttt{setbounds}}\label{Dsetbnd} statement
+does the lying:\index{picture variable?\tdescr{picture variable}}
+$$ {\tt setbounds}\, \descr{picture variable}\, {\tt to}\, \descr{path expression}
+$$
+makes the \tdescr{picture variable} behave as if its bounding box were
+the same as the given path. The path has to be a cycle, i.e., it must
+be a closed path. To get the true bounding box of such a
+picture, assign a positive value to the internal variable\index{internal
+variables}\index{variables!internal} {\tt
+truecorners}\index{truecorners?\texttt{truecorners}}\label{Dtruecorn}:\footnote{The
+{\tt setbounds} and {\tt truecorners} features are only found in
+MetaPost version 0.30 and higher.} i.e.,
+$$ \hbox{\verb|show urcorner btex $\bullet$\rlap{ A} etex|} $$
+produces ``\verb|>> (4.9813,6.8078)|'' while
+$$ \hbox{\verb|truecorners:=1; show urcorner btex $\bullet$\rlap{ A} etex|} $$
+produces ``\verb|>> (15.7742,6.8078)|.''
+
+
+\section{Advanced Graphics}
+\label{adv.gr}
+
+All the examples in the previous sections have been simple line drawings
+with labels added. This section describes shading and tools for
+generating not-so-simple line drawings. Shading is done with the {\tt
+fill}\index{fill?\texttt{fill}}\label{Dfill} statement. In its simplest
+form, the {\tt fill} statement requires a \tdescr{path expression} that
+gives the boundary of the region to be filled. In the syntax
+$$ {\tt fill}\, \descr{path expression} $$
+the argument should be a cyclic path, i.e., a path that describes a
+closed curve via the \verb|..cycle| or \verb|--cycle| notation. For
+example, the {\tt fill} statement in Figure~\ref{fig20} builds a closed
+path by extending the roughly semicircular path~{\tt p}. This path has
+a counter-clockwise orientation, but that does not matter because the
+{\tt fill} statement uses PostScript's\index{PostScript} non-zero
+winding\index{winding number} number rule\index{non-zero fill
+ rule}\index{fill rule!non-zero}\index{PostScript!fill
+ rule}~\cite{ad:red2}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpman-21.mps}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\label{fig20}
+\end{figure}
+
+The general {\tt fill} statement\index{withcolor?\texttt{withcolor}}\label{Dwithcolor}
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withcolor}\, \descr{color expression}
+$$
+specifies a shade of gray or (if you have a color printer) some
+rainbow color. The $\descr{color expression}$ can have five possible
+values, mapping to four possible color models:
+
+$$
+\begin{tabular}{ll}
+Actual input & Remapped meaning\\\hline
+{\tt withcolor} $\descr{rgbcolor} c$ & withrgbcolor\index{withrgbcolor?\texttt{withrgbcolor}}\label{Dwithrgbcolor} $c$\\
+{\tt withcolor} $\descr{cmykcolor} c$ & withcmykcolor\index{withcmykcolor?\texttt{withcmykcolor}}\label{Dwithcmykcolor} $c$\\
+{\tt withcolor} $\descr{numeric} c$ & withgreyscale\index{withgreyscale?\texttt{withgreyscale}}\label{Dwithgreyscale} $c$\\
+{\tt withcolor} $\descr{false}$ & withoutcolor\index{withoutcolor?\texttt{withoutcolor}}\label{Dwithoutcolor} \\
+{\tt withcolor} $\descr{true}$ & $\descr{current default color model}$\\
+\end{tabular}
+$$
+
+For the specific color models, there are also:
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withrgbcolor}\, \descr{rgbcolor expression}
+$$
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withcmykcolor}\, \descr{cmykcolor expression}
+$$
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withgreyscale}\, \descr{numeric}
+$$
+$$ {\tt fill}\, \descr{path expression}\,
+ {\tt withoutcolor}
+$$
+
+An image object cannot have more then one color model, the last
+\ttt{withcolor}, \ttt{withrgbcolor}, \ttt{withcmykcolor},
+\ttt{withgreyscale} or \ttt{withoutcolor} specification sets the color
+model for any particular object.
+
+The model \ttt{withoutcolor} needs a bit more explanation: selecting
+this model means that MetaPost will not write a color selection
+statement to the PostScript output file for this object.
+
+The `current default' color model can be set up using the internal
+variable \ttindex{defaultcolormodel}\label{Ddefaultcolormodel}.
+Table~\ref{dfltcmod} lists the valid values.
+\begin{table}
+\centering
+\begin{tabular}{|c|l|}
+\hline
+Value & Color model\\\hline
+1 & no model\\
+3 & greyscale\\
+5 & rgb (default)\\
+7 & cmyk\\
+\hline
+\end{tabular}
+\caption{Supported color models.}
+\label{dfltcmod}
+\end{table}
+
+
+Figure~\ref{fig21} illustrates several applications of the fill command
+to fill areas with shades of gray. The paths involved are intersecting
+circles {\tt a} and {\tt b} and a path {\tt ab} that bounds the region
+inside both circles. Circles {\tt a} and {\tt b} are derived from {\tt
+ fullcircle}. Path~{\tt ab} is then initialized using a predefined
+macro {\tt buildcycle} that will be discussed shortly.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{mpman-22.mps}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\index{fullcircle?\texttt{fullcircle}}\index{halfcircle?\texttt{halfcircle}}\index{buildcycle?\texttt{buildcycle}}
+\label{fig21}
+\end{figure}
+
+Filling circle {\tt a} with the light gray color {\tt .7white} and then
+doing the same with circle {\tt b} doubly fills the region where the
+disks overlap. The rule is that each {\tt fill} statement assigns the
+given color to all points in the region covered, wiping out whatever was
+there previously including lines and text as well as filled regions.
+Thus it is important to give {\tt fill} commands in the right order. In
+the above example, the overlap region gets the same color twice, leaving
+it light gray after the first two {\tt fill} statements. The third fill
+statement assigns the darker color {\tt .4white} to the overlap region.
+
+At this point the circles and the overlap region have their final colors
+but there are no cutouts for the labels. The cutouts are achieved by
+the {\tt unfill}\index{unfill?\texttt{unfill}}\label{Dunfill} statements
+that effectively erase\index{erasing} the regions bounded by {\tt bbox
+pa}\index{bbox?\texttt{bbox}} and {\tt bbox pb}. More precisely, {\tt
+unfill} is shorthand for filling {\tt withcolor background}, where {\tt
+background} is normally equal to {\tt white} as is appropriate for
+printing on white paper. If necessary, you can assign a new color value
+to {\tt
+background}\index{background?\texttt{background}}\label{Dbground}.
+
+The labels need to be stored in pictures {\tt pa} and {\tt pb} to allow
+for measuring their bounding box before actually drawing them. The
+macro {\tt thelabel}\index{thelabel?\texttt{thelabel}} creates such
+pictures and shifts them into position so that they are ready to draw.
+Using the resulting pictures in {\tt draw} statements of the
+form\index{draw?\texttt{draw}}
+$$ {\tt draw}\, \descr{picture expression} $$
+adds them to {\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}
+so that they overwrite a portion of what has
+already been drawn. In Figure~\ref{fig21} just the white rectangles produced by
+{\tt unfill} get overwritten.
+
+\subsection{Building Cycles}
+\label{buildcy}
+
+The {\tt buildcycle}\index{buildcycle?\texttt{buildcycle}} command
+constructs paths for use with the {\tt fill} or {\tt unfill} macros.
+When given two or more paths such as {\tt aa} and {\tt b}, the {\tt
+buildcycle} macro tries to piece them together so as to form a cyclic
+path. In this case path {\tt aa} is a semicircle that starts just to
+the right of the intersection with path {\tt b}, then passes through
+{\tt b} and ends just outside the circle on the left as shown in
+Figure~\ref{fig22}a.
+
+Figure~\ref{fig22}b shows how {\tt buildcycle} forms a closed cycle from
+the pieces of paths {\tt aa} and {\tt b}. The {\tt buildcycle} macro
+detects the two intersections\index{intersections} labeled 1 and 2 in
+Figure~\ref{fig22}b. Then it constructs the cyclic path shown in bold
+in the figure by going forward along path {\tt aa} from intersection~1
+to intersection~2 and then forward around the counter-clockwise path
+{\tt b} back to intersection~1. It turns out that {\tt buildcycle(a,b)}
+would have produced the same result, but the reasoning behind this is a
+little confusing.
+
+
+\begin{figure}[htp]
+$$ {\includegraphics{mpman-123.mps} \atop (a)}
+ \qquad {\includegraphics{mpman-223.mps} \atop (b)}
+$$
+\caption[A demonstration of cycle building]
+ {(a)~The semicircular path~{\tt aa}
+ with a dashed line marking path {\tt b}; (b)~paths~{\tt aa} and {\tt b}
+ with the portions selected by {\tt buildcycle} shown by heavy lines.}
+\label{fig22}
+\end{figure}
+
+It is a easier to use the {\tt buildcycle} macro in situations like
+Figure~\ref{fig23} where there are more than two path arguments and each
+pair of consecutive paths has a unique intersection. For instance, the
+line~{\tt q0.5} and the curve~{\tt p2} intersect only at point~$P$; and
+the curve {\tt p2} and the line~{\tt q1.5} intersect only at point~$Q$.
+In fact, each of the points $P$, $Q$, $R$, $S$ is a unique intersection,
+and the result of\index{buildcycle?\texttt{buildcycle}}
+$$ \hbox{\tt buildcycle(q0.5, p2, q1.5, p4)} $$
+takes {\tt q0.5} from $S$ to~$P$, then {\tt p2} from $P$ to~$Q$, then
+{\tt q1.5} from $Q$ to~$R$, and finally {\tt p4} from $R$ back to~$S$.
+An examination of the MetaPost code for Figure~\ref{fig23} reveals that
+you have to go backwards along {\tt p2} in order to get from $P$ to~$Q$.
+This works perfectly well as long as the
+intersection\index{intersection} points are uniquely defined but it can
+cause unexpected results when pairs of paths intersect more than once.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+\end{verbatim}
+\atop \mathcenter{\includegraphics{mpman-24.mps}}
+$$
+\caption{MetaPost code and the corresponding output.}
+\label{fig23}
+\end{figure}
+
+The general rule for the {\tt buildcycle} macro is that
+$$ \hbox{\tt buildcycle(}p_1\hbox{\tt,}\, p_2\hbox{\tt,}\,
+ p_3\hbox{\tt,}\, \ldots \hbox{\tt,} p_k \hbox{\tt )}
+$$
+chooses the intersection between each $p_i$ and $p_{i+1}$ to be as late
+as possible on $p_i$ and as early as possible on $p_{i+1}$. There is no
+simple rule for resolving conflicts between these two goals, so you
+should avoid cases where one intersection point occurs later on $p_i$
+and another intersection\index{intersection} point occurs earlier on
+$p_{i+1}$.
+
+The preference for intersections as late as possible on $p_i$ and as
+early as possible on $p_{i+1}$ leads to ambiguity resolution in favor of
+forward-going subpaths. For cyclic paths such as path~{\tt b} in
+Figure~\ref{fig22} ``early'' and ``late'' are relative to a start/finish
+point which is where you get back to when you say ``{\tt ..cycle}''.
+For the path~{\tt b}, this turns out to be the rightmost point on the
+circle.
+
+A more direct way to deal with path intersections is via the
+\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}}
+{\tt
+intersection\-point}\index{intersectionpoint?\texttt{intersectionpoint}}\label{Disecpt}
+that finds the points $P$, $Q$, $R$, and~$S$ in Figure~\ref{fig23}.
+This macro finds a point where two given paths intersect. If there is
+more than one intersection point, it just chooses one; if there is no
+intersection, the macro generates an error message.
+
+\subsection{Dealing with Paths Parametrically}
+
+The {\tt
+intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}
+macro is based on a primitive operation called {\tt
+intersectiontimes}\index{intersectiontimes?\texttt{intersectiontimes}}\label{Disectt}.
+This \tdescr{secondary binop} is one of several operations that deal
+with paths parametrically. It locates an intersection between two paths
+by giving the ``time'' parameter on each path. This refers to the
+parameterization scheme from Section~\ref{curves} that described paths
+as piecewise cubic curves $\bigl(X(t),Y(t)\bigr)$ where $t$ ranges from
+zero to the number of curve segments. In other words, when a path is
+specified as passing through a sequence of points, where $t=0$ at the
+first point, then $t=1$ at the next, and $t=2$ at the next, etc. The
+result of
+$$ \hbox{\tt a intersectiontimes b} $$
+is $(-1,-1)$ if there is no intersection; otherwise you get
+a pair $(t_a,t_b)$, where $t_a$ is a time on path {\tt a} when it intersects
+path~{\tt b}, and $t_b$ is the corresponding time on path~{\tt b}.
+
+For example, suppose path~{\tt a} is denoted by the thin line in
+Figure~\ref{fig24} and path~{\tt b} is denoted by the thicker line. If
+the labels indicate time values on the paths, the pair of time values
+computed by
+$$ \hbox{\tt a intersectiontimes b} $$
+must be one of
+$$ (0.25,1.77),\ (0.75,1.40), {\rm or}\ (2.58,0.24), $$
+depending on which of the three intersection points is chosen by the
+MetaPost interpreter. The exact rules for choosing among multiple
+intersection points are a little complicated, but it turns out that you
+get the time values $(0.25,1.77)$ in this example. Smaller time values
+are preferred over larger ones so that $(t_a,t_b)$ is preferred to
+$(t'_a,t'_b)$ whenever $t_a<t'_a$ and $t_b<t'_b$. When no single
+alternative minimizes both the $t_a$ and $t_b$ components the $t_a$
+component tends to get priority, but the rules get more complicated when
+there are no integers between $t_a$ and $t'_a$\index{intersection}.
+(For more details, see {\sl The \MF book} \cite[Chapter 14]{kn:c}).
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-25.mps} $$
+\caption{Two intersecting paths with time values marked on each path.}
+\label{fig24}
+\end{figure}
+
+The {\tt intersectiontimes} operator is more flexible than {\tt
+intersectionpoint} because there are a number of things that can be done
+with time values on a path. One of the most important is just to ask
+``where is path {\tt p} at time {\tt t}?'' The construction\index{point
+of?\texttt{point of}}\label{Dpntof}
+$$ {\tt point}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary} $$
+answers this question. If the \tdescr{numeric expression} is less than
+zero or greater than the time value assigned to the last point on the
+path, the {\tt point of} construction normally yields an endpoint of the
+path. Hence, it is common to use the predefined constant {\tt
+infinity}\index{infinity?\texttt{infinity}}\label{Dinf} (equal to
+4095.99998) as the \tdescr{numeric expression} in a {\tt point of}
+construction when dealing with the end of a path.
+
+Such ``infinite'' time values do not work for a cyclic path, since time
+values outside of the normal range can be handled by modular arithmetic
+in that case; i.e., a cyclic path~{\tt p} through points $z_0$, $z_1$,
+$z_2$, \ldots, $z_{n-1}$ has the normal parameter range $0\le t<n$, but
+$$ \hbox{\tt point t of p} $$
+can be computed for any~$t$ by first reducing $t$ modulo~$n$. If the
+modulus~$n$ is not readily
+available,\index{length?\texttt{length}}\label{Dlength}
+$$ {\tt length}\, \descr{path primary} $$
+gives the integer value of the upper limit of the normal time parameter
+range for the specified path.
+
+MetaPost uses the same correspondence between time values and points on
+a path to evaluate the {\tt
+subpath}\index{subpath?\texttt{subpath}}\label{Dsubpth} operator. The
+syntax for this operator is
+$$ {\tt subpath}\, \descr{pair expression}\, {\tt of}\, \descr{path primary} $$
+If the value of the \tdescr{pair expression} is $(t_1,t_2)$ and the
+\tdescr{path primary} is $p$, the result is a path that follows $p$ from
+{\tt point $t_1$ of $p$} to {\tt point $t_2$ of $p$}. If $t_2<t_1$, the
+subpath runs backwards along~$p$.
+
+An important operation based on the {\tt subpath} operator is the
+\tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary binop}}
+{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}}\label{Dcutb}. For
+intersecting paths $p_1$ and $p_2$,
+$$ p_1\ {\tt cutbefore}\ p_2 $$
+is equivalent to
+$$ \hbox{\tt subpath (xpart($p_1$ intersectiontimes $p_2$), length $p_1$) of $p_1$}
+$$
+except that it also sets the path variable {\tt
+cuttings}\index{cuttings?\texttt{cuttings}}\label{Dcuttings} to the
+portion of $p_1$ that gets cut off. In other words, {\tt cutbefore}
+returns its first argument with the part before the intersection cut
+off. With multiple intersections, it tries to cut off as little as
+possible. If the paths do not intersect, {\tt cutbefore} returns its
+first argument.
+
+There is also an analogous \tdescr{tertiary binop}\index{tertiary
+binop?\tdescr{tertiary binop}} called {\tt
+cutafter}\index{cutafter?\texttt{cutafter}}\label{Dcuta} that works by
+applying {\tt cutbefore} with time reversed along its first argument.
+Thus
+$$ p_1\ {\tt cutafter}\ p_2 $$
+tries to cut off the part of $p_1$ after its last intersection with $p_2$.
+
+The control points of a path can be requested by the two operators
+\index{precontrol of?\texttt{precontrol of}}
+\index{postcontrol of?\texttt{postcontrol of}}
+\label{Dprepostctrl}
+\begin{eqnarray*}
+ {\tt precontrol}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary},\\
+ {\tt postcontrol}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary}.
+\end{eqnarray*}
+
+For integer time values~$t$, these operators return the control points
+before and after a cardinal point of a path. A segment
+$z_{t-1}\verb|..|z_t$ of a path~$p$ has therefore control points
+$$ {\tt postcontrol}\ t-1\ {\tt of}\ p
+$$
+and
+$$ {\tt precontrol}\ t\ {\tt of}\ p.
+$$
+
+For decimal time values, {\tt precontrol of} returns the last control
+point of sub-path $(0, t)$ and {\tt postcontrol of} returns the first
+control point of sub-path $(t, \infty)$ of a path. In other words, the
+control points at fractional time values correspond to a virtual
+cardinal point inserted at the given time value without modifying path
+shape.
+
+Another operator\index{direction of?\texttt{direction of}}\label{Ddirof}
+$$ {\tt direction}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary}
+$$
+finds a vector in the direction of the \tdescr{path primary}. This is
+defined for any time value analogously to the {\tt point of}
+construction. The resulting direction vector has the correct
+orientation and a somewhat arbitrary magnitude. Combining {\tt point
+of} and {\tt direction of} constructions yields the equation for a
+tangent line as illustrated in Figure~\ref{fig25}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+\end{verbatim}
+\atop \includegraphics{mpman-26.mps}
+$$
+\caption{MetaPost code and the resulting figure}
+\label{fig25}
+\end{figure}
+
+If you know a slope and you want to find a point on a curve where the
+tangent line has that slope, the {\tt directiontime}\index{directiontime
+of?\texttt{directiontime of}}\label{Ddtimof} operator inverts the {\tt
+direction of} operation. Given a direction vector and a path,
+$$ {\tt directiontime}\, \descr{pair expression}\, {\tt of}\,
+ \descr{path primary}
+$$
+returns a numeric value that gives the first time~$t$ when the path has
+the indicated direction. (If there is no such time, the result is
+$-1$). For example, if {\tt a} is the path drawn as a thin curve in
+Figure~\ref{fig24}, {\tt directiontime (1,1) of a} returns 0.2084.
+
+There is also an predefined macro \index{directionpoint
+of?\texttt{directionpoint of}}\label{Ddpntof}
+$$ {\tt directionpoint}\, \descr{pair expression}\, {\tt of}\,
+ \descr{path primary}
+$$
+that finds the first point on a path where a given direction is achieved. The
+{\tt directionpoint} macro produces an error message if the direction does not
+occur on the path.
+
+Operators {\tt
+arclength}\index{arclength?\texttt{arclength}}\label{Darclng} and {\tt
+arctime of}\index{arctime of?\texttt{arctime of}}\label{Darctim} relate
+the ``time'' on a path to the more familiar concept of arc
+length.\index{arc length}\footnote{The {\tt arclength} and {\tt arctime}
+operators are only found in MetaPost version 0.50 and higher.} The
+expression
+$$ \hbox{{\tt arclength} \tdescr{path primary}} $$
+gives the arc length of a path. If {\tt p} is a path and {\tt a} is a number
+between 0 and {\tt arclength p},
+$$ \hbox{\tt arctime a of p} $$
+gives the time~{\tt t} such that
+$$ \hbox{\tt arclength subpath (0,t) of p} = {\tt a}. $$
+
+The operator {\tt
+ envelope}\index{envelope?\texttt{envelope}}\label{Denvelop} %
+returns the envelope of a path {\tt p} drawn with a polygonal pen,
+and returns an error if the pen is not polygonal.
+Figure~\ref{fig261} shows the envelope of an approximation of an elliptical pen.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(261);
+path p[] ;
+pen mypen ;
+pen mypenC;
+numeric L ;
+numeric S ;
+L:=10;
+Sa:=1;
+Sb:=2;
+Rot=32;
+p[-1] := ( (Sa*cosd(0),Sb*sind(0)) for i=1 upto L-1:
+ -- (Sa*cosd(i/L*360), Sb*sind(i/L*360)) endfor -- cycle ) rotated Rot;
+mypen := makepen(p[-1]) ;
+mypenC:= (pencircle xscaled 2Sa yscaled 2Sb) rotated Rot;
+p0 := (0,0){down} .. {up} (100,0) ;
+p1 := envelope mypen of p0 ;
+draw p1 withcolor black withpen pencircle scaled 0.2pt ;
+draw p0 withcolor 0.8white withpen mypenC;
+for t=1 upto length(p1):
+ draw (point t of p1) withpen pencircle scaled 0.8pt;
+endfor;
+endfig;
+\end{verbatim}
+\atop \includegraphics[width=0.9\textwidth]{mpman-261.mps}
+$$
+\caption{Example of envelope}
+\label{fig261}
+\end{figure}
+
+
+
+\subsection{Affine Transformations}
+\label{transsec}
+\index{transform type}
+
+Note how path {\tt fun} in Figure~\ref{fig25} is first constructed as
+$$ \hbox{\verb|(0,-.1)..(1,.05){right}..(1.9,.02){right}..{curl .1}(3.2,.2)|} $$
+and then the {\tt yscaled}\index{yscaled?\texttt{yscaled}} and {\tt
+scaled}\index{scaled?\texttt{scaled}} operators are used to adjust the
+shape and size of the path. As the name suggests, an expression
+involving ``{\tt yscaled 10}'' multiplies $y$ coordinates by ten so that
+every point $(x,y)$ on the original path corresponds to a point
+$(x,10y)$ on the transformed path.
+
+Including {\tt scaled} and {\tt yscaled}, there are seven transformation
+operators that take a numeric or pair
+argument:\index{shifted?\texttt{shifted}}%
+\index{rotated?\texttt{rotated}}\index{slanted?\texttt{slanted}}\index{scaled?\texttt{scaled}}\index{xscaled?\texttt{xscaled}}%
+\index{yscaled?\texttt{yscaled}}\index{zscaled?\texttt{zscaled}}\label{Dtranop}
+\begin{eqnarray*}
+ (x,y){\tt\ shifted\ }(a,b) &=& (x+a,\, y+b); \\
+ (x,y){\tt\ rotated\ }\theta &=& (x\cos\theta-y\sin\theta,\,
+ x\sin\theta+y\cos\theta); \\
+ (x,y){\tt\ slanted\ }a &=& (x+ay,\, y); \\
+ (x,y){\tt\ scaled\ }a &=& (ax,\, ay); \\
+ (x,y){\tt\ xscaled\ }a &=& (ax,\, y); \\
+ (x,y){\tt\ yscaled\ }a &=& (x,\, ay); \\
+ (x,y){\tt\ zscaled\ }(a,b) &=& (ax-by,\, bx+ay).
+\end{eqnarray*}
+Most of these operations are self-explanatory except for {\tt zscaled}
+which can be thought of as multiplication of complex numbers. The
+effect of {\tt zscaled} $(a,b)$ is to rotate and scale so as to map
+$(1,0)$ into $(a,b)$. The effect of {\tt rotated}~$\theta$ is rotate
+$\theta$ degrees counter-clockwise.
+
+Any combination of shifting, rotating, slanting, etc.\ is an affine
+transformation, the net effect of which is to transform any pair $(x,y)$
+into
+$$ (t_x+t_{xx}x+t_{xy}y,\, t_y+t_{yx}x+t_{yy}y), $$
+for some sextuple $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$. This
+information can be stored in a variable of type transform so that {\tt
+transformed T}\index{transformed?\texttt{transformed}}\label{Dtrfrmd}
+might be equivalent to
+$$ \hbox{\tt xscaled -1 rotated 90 shifted (1,1)} $$
+if {\tt T} is an appropriate transform variable. The
+transform~{\tt T} could then be initialized with an
+expression of type transform as follows:
+$$ \begin{verbatim}
+transform T;
+T = identity xscaled -1 rotated 90 shifted (1,1);
+\end{verbatim}
+$$
+As this example indicates, transform expressions can be built up by
+applying transformation operators to other transforms. The predefined
+transformation {\tt
+identity}\index{identity?\texttt{identity}}\label{Dident} is a useful
+starting point for this process. This can be illustrated by
+paraphrasing the above equation for {\tt T} into English: ``{\tt T}
+should be the transform obtained by doing whatever {\tt identity}
+does. Then scaling $x$~coordinates by $-1$, rotating $90^\circ$, and
+shifting by $(1,1)$.'' This works because {\tt identity} is the
+identity transformation which does nothing; i.e., {\tt transformed
+identity} is a no-op.
+
+The syntax for transform expressions and transformation operators is given in
+Figure~\ref{sytrans}. It includes two more options for
+\tdescr{transformer}:\index{reflectedabout?\texttt{reflectedabout}}
+$$ \hbox{\tt reflectedabout(}p, q\hbox{\tt )} $$
+reflects about the line defined by points $p$ and $q$;
+and\index{rotatedaround?\texttt{rotatedaround}}
+$$ \hbox{\tt rotatedaround(}p,\theta\hbox{\tt )} $$
+rotates $\theta$ degrees counter-clockwise around point $p$. For example,
+the equation for initializing transform~{\tt T} could have been
+$$ \hbox{\tt T = identity reflectedabout((2,0), (0,2))}. $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{pair secondary} \rightarrow
+ \descr{pair secondary} \descr{transformer}$\\
+$\tt \descr{path secondary} \rightarrow
+ \descr{path secondary} \descr{transformer}$\\
+$\tt \descr{picture secondary} \rightarrow
+ \descr{picture secondary} \descr{transformer}$\\
+$\tt \descr{pen secondary} \rightarrow
+ \descr{pen secondary} \descr{transformer}$\\
+$\tt \descr{transform secondary} \rightarrow
+ \descr{transform secondary} \descr{transformer}$\\[6pt]
+$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}
+ \hbox{\tt ,}\descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}
+ \hbox{\tt ,}\descr{numeric expression}\hbox{\tt )}$
+\end{ctabbing}
+\caption{The syntax for transforms and related operators}
+\label{sytrans}
+\end{figure}
+
+There is also a unary operator {\tt
+inverse}\index{inverse?\texttt{inverse}}\label{Dinv} that takes a
+transform and finds another transform that undoes the effect of the
+first transform. Thus if
+$$ p = q{\tt\ transformed\ }T $$
+then
+$$ q = p{\tt\ transformed\ inverse\ }T. $$
+
+It is not legal to take the {\tt inverse} of an
+unknown transform\index{transformation!unknown} but we
+have already seen that you can say
+$$ \hbox{\tt T = } \descr{transform expression} $$
+when {\tt T} has not been given a value yet. It is also possible to
+apply an unknown transform to a known pair or transform and use the
+result in a linear equation. Three such equations are sufficient to
+determine a transform. Thus the equations
+$$ \begin{verbatim}
+(0,1) transformed T' = (3,4);
+(1,1) transformed T' = (7,1);
+(1,0) transformed T' = (4,-3);
+\end{verbatim}
+$$
+allow MetaPost to determine that the transform {\tt T'} is a combination of
+rotation and scaling with
+$$\openup\jot
+ \tabskip=0pt plus 1fil
+ \halign to\displaywidth{\tabskip=0pt
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil \qquad&
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil
+ \tabskip=0pt plus 1fil\cr
+\noalign{\vskip-\jot}
+ t_{xx}&=4,& t_{yx}&=-3,\cr
+ t_{yx}&=3,& t_{yy}&=4,\cr
+ t_x&=0,& t_y&=0.\cr}
+$$
+
+Equations involving an unknown transform are treated as linear equations
+in the six parameters that define the transform. These six parameters
+can also be referred to directly
+as\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart}}%
+\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypart}}\label{Dtrprt}
+$$ {\tt xpart\ T},\ {\tt ypart\ T},\ {\tt xxpart\ T},\ {\tt xypart\ T},\
+ {\tt yxpart\ T},\ {\tt yypart\ T},
+$$
+where {\tt T} is a transform. For instance, Figure~\ref{fig27} uses the
+equations
+$$ \hbox{\tt xxpart T=yypart T; yxpart T=-xypart T} $$
+to specify that {\tt T} is shape preserving; i.e., it is a combination of
+rotating, shifting, and uniform scaling.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-28.mps}}
+$$
+\caption{MetaPost code and the resulting ``fractal'' figure}
+\label{fig27}
+\end{figure}
+
+
+\subsection{Dashed Lines}
+
+The MetaPost language provides many ways of changing the appearance of a
+line besides just changing its width. One way is to use dashed lines as
+was done in Figures \ref{fig4} and~\ref{fig22}. The syntax for this
+is\index{dashed?\texttt{dashed}}\label{Ddashed}
+$$ {\tt draw}\, \descr{path expression}\, {\tt dashed}\, \descr{dash pattern} $$
+where a \tdescr{dash pattern}\index{dash pattern?\tdescr{dash pattern}}
+is really a special type of \tdescr{picture expression}. There is a
+predefined \tdescr{dash pattern} called {\tt
+evenly}\index{evenly?\texttt{evenly}}\label{Devenly} that makes dashes 3
+PostScript points long separated by gaps of the same size. Another
+predefined dash pattern {\tt
+withdots}\index{withdots?\texttt{withdots}}\label{Dwdots} produces
+dotted lines with dots 5 PostScript points apart.\footnote{{\tt
+withdots} is only found in MetaPost version 0.50 and higher.} For dots
+further apart or longer dashes further apart, the \tdescr{dash pattern}
+can be scaled\index{scaled?\texttt{scaled}} as shown in
+Figure~\ref{fig28}.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-29.mps} $$
+\caption[Dashed lines and the corresponding dash patters]
+ {Dashed lines each labeled with the \tdescr{dash pattern} used to create
+ it.}
+\label{fig28}
+\end{figure}
+
+Another way to change a dash pattern is to alter its phase by shifting
+it horizontally. Shifting to the right makes the dashes move forward
+along the path and shifting to the left moves them backward.
+Figure~\ref{fig29} illustrates this effect. The dash pattern can be
+thought of as an infinitely repeating pattern strung out along a
+horizontal line where the portion of the line to the right of the
+$y$~axis is laid out along the path to be dashed\index{dash
+pattern?\tdescr{dash pattern}}.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-30.mps} $$
+\caption[Dashed lines and the corresponding dash patters]
+ {Dashed lines and the MetaPost statements for drawing them where {\tt e4}
+ refers to the dash pattern {\tt evenly scaled 4}.}
+\label{fig29}
+\end{figure}
+
+When you shift a dash pattern so that the $y$~axis crosses the middle of
+a dash, the first dash gets truncated. Thus the line with dash pattern
+{\tt e4} starts with a dash of length 12bp followed by a 12bp gap and
+another 12bp dash, etc., while {\tt e4 shifted (-6bp,0)} produces a 6bp
+dash, a 12 bp gap, then a 12bp dash, etc. This dash pattern could be
+specified more directly via the {\tt dashpattern}\index{dash
+pattern?\texttt{dash pattern}}\label{Ddshpat} function:
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)} $$
+This means ``draw the first 6bp of the line, then skip the next 12bp, then draw
+another 6bp and repeat.'' If the line to be dashed is more than 30bp long, the
+last 6bp of the first copy of the dash pattern will merge with the first 6bp of
+the next copy to form a dash 12bp long. The general syntax for the
+{\tt dashpattern} function is shown in Figure~\ref{sydash}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{dash pattern} \rightarrow dashpattern
+ \hbox{\tt (}\descr{on/off list}\hbox{\tt )}$\\
+$\tt \descr{on/off list} \rightarrow
+ \descr{on/off list}\descr{on/off clause} \;|\; \descr{on/off clause}$\\
+$\tt \descr{on/off clause} \rightarrow on \descr{numeric tertiary}
+ \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{The syntax for the {\tt dashpattern} function}
+\label{sydash}
+\end{figure}
+
+Since a dash pattern is really just a special kind of picture, the {\tt
+dashpattern} function returns a picture. It is not really necessary to
+know the structure of such a picture, so the casual reader will probably
+want to skip on to Section~\ref{oopt}. For those who want to know, a
+little experimentation shows that if {\tt d} is
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)}, $$
+then {\tt llcorner d} is $(0,24)$ and {\tt urcorner d} is $(24,24)$.
+Drawing {\tt d} directly without using it as a dash pattern produces two
+thin horizontal line segments like this:
+$$ \includegraphics{mpman-31.mps} $$
+The lines in this example are specified as having width zero, but this
+does not matter because the line width is ignored when a picture is used
+as a dash pattern.
+
+The general rule for interpreting a picture {\tt d} as a dash pattern is
+that the line segments in {\tt d} are projected onto the $x$-axis and
+the resulting pattern is replicated to infinity in both directions by
+placing copies of the pattern end-to-end. The actual dash lengths are
+obtained by starting at $x=0$ and scanning in the positive $x$
+direction.
+
+To make the idea of ``replicating to infinity'' more precise, let $P({\tt d})$
+be the projection of {\tt d} onto the $x$~axis, and let
+${\rm shift}(P({\tt d}),x)$ be the result of shifting {\tt d} by~$x$.
+The pattern resulting from infinite replication is
+$$ \bigcup_{{\rm integers}\ n} {\rm shift}(P(d),\, n\cdot\ell(d)), $$
+where $\ell(d)$ measures the length of $P(d)$. The most restrictive possible
+definition of this length is $d_{\rm max}-d_{\rm min}$,
+where $[d_{\rm min},d_{\rm max}]$
+is the range of $x$~coordinates in $P(d)$. In fact, MetaPost uses
+$$ \max(\left|y_0({\tt d})\right|,\, d_{\rm max}-d_{\rm min}), $$
+where $y_0({\tt d})$ is the $y$ coordinate of the contents of {\tt d}.
+The contents of {\tt d} should lie on a horizontal line, but if they do
+not, the MetaPost interpreter just picks a $y$~coordinate that occurs in
+{\tt d}\index{dash pattern?\tdescr{dash pattern}}.
+
+A picture used as a dashed pattern must contain no text or filled
+regions, but it can contain lines that are themselves dashed. This can
+give small dashes inside of larger dashes as shown in
+Figure~\ref{fig32}.\index{dash pattern?\tdescr{dash pattern}!recursive}
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-32.mps}}
+$$
+\caption{MetaPost code for dashed patterns and the corresponding output}
+\label{fig32}
+\end{figure}
+
+\label{dashed-pens}
+Also, dashed patterns are intended to be used either with {\tt
+pencircle} or no pen at all; {\tt pensquare} and other complex pens
+should be avoided. This is because the output uses the PostScript
+primitive {\tt setdash}, which does not interact well with the filled
+paths created by polygonal pens. See Section~\ref{sec.pens}, p.\
+\pageref{sec.pens}.
+
+%\newpage
+
+\subsection{Local specials}
+
+If you want to attach a special bit of PostScript code, you can use
+$$
+{\tt withprescript} \descr{string expression}%
+\index{withprescript?\texttt{withprescript}}\label{Dwithpre}
+$$
+and
+$$
+{\tt withpostscript} \descr{string expression}%
+\index{withpostscript?\texttt{withpostscript}}\label{Dwithpost}
+$$
+The strings will be written to the output file before and after the
+current object, each beginning on their own line. You can specify
+multiple {\tt withprescript} or {\tt withpostscript} options if you
+like.
+
+When you specify more than one {\tt withprescript} or more than one {\tt
+ withpostscript} option, be wary of the fact that the scripts use a
+form of nesting: the {\tt withprescript} items are written to the
+PostScript file in last in, first out order; whereas the {\tt
+ withpostscript} items are written in first in, first out order.
+
+\subsection{Other Options}
+\label{oopt}
+
+You might have noticed that the dashed lines produced by {\tt dashed
+evenly}\index{evenly?\texttt{evenly}} appear to have more black than
+white. This is an effect of the {\tt
+linecap}\index{linecap?\texttt{linecap}}\label{Dlinecap} parameter that
+controls the appearance of the ends of lines as well as the ends of
+dashes. There are also a number of other ways to affect the appearance
+of things drawn with MetaPost.
+
+The {\tt linecap} parameter has three different settings just as in
+PostScript. Plain MetaPost gives this internal variable\index{internal
+variables}\index{variables!internal} the default value {\tt
+rounded}\index{rounded?\texttt{rounded}} which causes line segments to
+be drawn with rounded ends like the segment from {\tt z0} to {\tt z3} in
+Figure~\ref{fig33}. Setting ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+butt}$\index{butt?\texttt{butt}}\label{Dbutt} cuts the ends off flush so
+that dashes produced by {\tt dashed
+evenly}\index{evenly?\texttt{evenly}} have length 3bp, not 3bp plus the
+line width. You can also get squared-off ends that extend past the
+specified endpoints by setting ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+squared}$\index{squared?\texttt{squared}}\label{Dsqred} as was done in
+the line from {\tt z2} to {\tt z5} in Figure~\ref{fig33}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{mpman-33.mps}}
+$$
+\caption{MetaPost code and the corresponding output}
+\label{fig33}
+\end{figure}
+
+Another parameter borrowed from PostScript affects the way a {\tt draw}
+statement treats sharp corners\index{corners} in the path to be drawn.
+The {\tt linejoin}\index{linejoin?\texttt{linejoin}}\label{Dlinejoin}
+parameter can be {\tt
+rounded}\index{rounded?\texttt{rounded}}\label{Drnded}, {\tt
+beveled}\index{beveled?\texttt{beveled}}\label{Dbvled}, or {\tt
+mitered}\index{mitered?\texttt{mitered}}\label{Dmitred} as shown in
+Figure~\ref{fig34}. The default value for plain MetaPost is {\tt
+rounded} which gives the effect of drawing with a circular brush.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{mpman-34.mps}}
+$$
+\caption{MetaPost code and the corresponding output}
+\label{fig34}
+\end{figure}
+
+When {\tt linejoin} is {\tt mitered}, sharp corners generate long
+pointed features as shown in Figure~\ref{fig35}. Since this might be
+undesirable, there is an internal variable\index{internal
+variables}\index{variables!internal} called {\tt
+miterlimit}\index{miterlimit?\texttt{miterlimit}}\label{Dmiterlim} that
+controls how extreme the situation can get before the mitered join is
+replaced by a beveled join. For Plain MetaPost, {\tt miterlimit} has a
+default value of 10.0 and line joins revert to beveled when the ratio of
+miter length to line width reaches this value.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-35.mps} $$
+\caption{The miter length and line width whose ratio is limited by
+ {\tt miterlimit}.}
+\label{fig35}
+\end{figure}
+
+The {\tt linecap}, {\tt linejoin}, and {\tt miterlimit} parameters are
+especially important because they also affect things that get drawn
+behind the scenes. For instance, Plain MetaPost has statements for
+drawing arrows\index{arrows}, and the arrowheads are slightly rounded
+when {\tt linejoin} is {\tt rounded}. The effect depends on the line
+width and is quite subtle at the default line width of 0.5bp as shown in
+Figure~\ref{fig36}.
+
+\begin{figure}[htp]
+$$\includegraphics{mpman-36.mps}$$
+\caption{Three ways of drawing arrows.}
+\label{fig36}
+\end{figure}
+
+Drawing arrows like the ones in Figure~\ref{fig36} is simply a matter of
+saying\index{drawarrow?\texttt{drawarrow}}\label{Ddrwarr}
+$$ {\tt drawarrow}\, \descr{path expression} $$
+instead of {\tt draw} \tdescr{path expression}. This draws the given
+path with an arrowhead at the last point on the path. If you want the
+arrowhead at the beginning of the path, just use the unary operator {\tt
+reverse}\index{reverse?\texttt{reverse}}\label{Drevrse} to take the
+original path and make a new one with its time sense reversed; i.e., for
+a path~{\tt p} with {\tt length p}${}=n$,
+$$ {\tt point\ } t {\tt\ of\ reverse\ p}
+ \quad {\rm and} \quad
+ {\tt point\ } n-t {\tt\ of\ p}
+$$ are synonymous.
+
+As shown in Figure~\ref{fig36}, a statement
+beginning\index{drawdblarrow?\texttt{drawdblarrow}}%
+\index{arrows!double-headed}\label{Ddrwdar}
+$$ {\tt drawdblarrow}\, \descr{path expression} $$
+draws a double-headed arrow. The size of the arrowhead is guaranteed to
+be larger than the line width, but it might need adjusting if the line
+width is very great. This is done by assigning a new value to the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt ahlength}\index{ahlength?\texttt{ahlength}}\label{Dahlength} that
+determines arrowhead length as shown in Figure~\ref{fig37}. Increasing
+{\tt ahlength} from the default value of 4 PostScript points to 1.5
+centimeters produces the large arrowhead in Figure~\ref{fig37}. There
+is also an {\tt ahangle}\index{ahangle?\texttt{ahangle}}\label{Dahangle}
+parameter that controls the angle at the tip of the arrowhead. The
+default value of this angle is 45 degrees as shown in the figure.
+
+\begin{figure}[htp]
+$$ \includegraphics{mpman-37.mps} $$
+\caption[A large arrowhead with key parameters labeled.]
+ {A large arrowhead with key parameters labeled and paths used to
+ draw it marked with white lines.}
+\label{fig37}
+\end{figure}
+
+The arrowhead is created by filling the triangular region that is
+outlined in white in Figure~\ref{fig37} and then drawing around it with
+the currently picked up pen. This combination of filling and drawing
+can be combined into a single {\tt filldraw}
+statement\index{filldraw?\texttt{filldraw}}\label{Dfildrw}:
+$$ {\tt filldraw}\, \descr{path expression}\,
+ \descr{optional {\tt dashed} and {\tt withcolor} and {\tt withpen} clauses};
+$$
+The \tdescr{path expression} should be a closed cycle like the
+triangular path in Figure~\ref{fig37}. This path should not be confused
+with the path argument to {\tt drawarrow} which is indicated by a white
+line in the figure.
+
+White lines like the ones in the figure can be created by an {\tt
+undraw}\index{undraw?\texttt{undraw}}\label{Dundraw} statement. This is
+an erasing\index{erasing} version of {\tt draw} that draws {\tt
+withcolor background}\index{background?\texttt{background}} just as the
+{\tt unfill} statement does. There is also an {\tt
+unfilldraw}\index{unfilldraw?\texttt{unfilldraw}}\label{Dunfdrw}
+statement just in case someone finds a use for it.
+
+The {\tt filldraw}, {\tt undraw} and {\tt unfilldraw} statements and all
+the arrow drawing statements are like the {\tt fill} and {\tt draw}
+statements in that they take {\tt dashed}\index{dashed?\texttt{dashed}},
+{\tt withpen}\index{withpen?\texttt{withpen}}, and {\tt
+withcolor}\index{withcolor?\texttt{withcolor}} options. When you have a
+lot of drawing statements it is nice to be able to apply an option such
+as {\tt withcolor 0.8white} to all of them without having to type this
+repeatedly as was done in Figures \ref{fig33} and~\ref{fig34}. The
+statement for this purpose
+is\index{drawoptions?\texttt{drawoptions}}\label{Ddropts}
+$$ \hbox{\tt drawoptions(} \descr{text} \hbox{\tt )} $$
+where the \tdescr{text} argument gives a sequence of {\tt dashed}, {\tt
+withcolor}, and {\tt withpen} options to be applied automatically to all
+drawing statements. If you specify
+$$ \hbox{\tt drawoptions(withcolor .5[black,white])} $$
+and then want to draw a black line, you can override the {\tt drawoptions}
+by specifying
+$$ {\tt draw}\, \descr{path expression}\, {\tt withcolor\ black} $$
+To turn off {\tt drawoptions} all together, just give an empty list:
+$$ \hbox{\tt drawoptions()} $$
+(This is done automatically by the {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} macro).
+
+Since irrelevant options are ignored, there is no harm in giving a statement
+like
+$$ \hbox{\tt drawoptions(dashed evenly)} $$
+followed by a sequence of {\tt draw} and {\tt fill} commands. It does
+not make sense to use a dash pattern when filling so the {\tt dashed
+evenly} gets ignored for {\tt fill} statements. It turns out that
+$$ \hbox{\tt drawoptions(withpen } \descr{pen expression} \hbox{\tt )} $$
+does affect {\tt fill} statements as well as {\tt draw} statements.
+In fact there is a special pen variable called
+{\tt currentpen}\index{currentpen?\texttt{currentpen}} such that
+{\tt fill} \ldots\ {\tt withpen currentpen} is equivalent to a {\tt filldraw}
+statement.
+
+Precisely what does it mean to say that drawing options affect those
+statements where they make sense? The {\tt dashed} \tdescr{dash
+pattern} option only affects
+$$ {\tt draw}\, \descr{path expression} $$
+statements, and text appearing in the \tdescr{picture expression} argument to
+$$ {\tt draw}\, \descr{picture expression} $$
+statement is only affected by the {\tt withcolor} \tdescr{color
+expression} option. For all other combinations of drawing statements
+and options, there is some effect. An option applied to a {\tt draw}
+\tdescr{picture expression} statement will in general affect some parts
+of the picture but not others. For instance, a {\tt dashed} or {\tt
+withpen} option will affect all the lines in the picture but none of the
+labels.
+
+
+\subsection{Pens}
+\label{sec.pens}
+
+Previous sections have given numerous examples of {\tt pickup}
+\tdescr{pen expression} and {\tt withpen} \tdescr{pen expression}, but
+there have not been any examples of pen expressions other than
+$$ {\tt pencircle\ scaled}\, \descr{numeric primary} $$
+which produces lines of a specified width. For calligraphic effects
+such in Figure~\ref{fig38}, you can apply any of the transformation
+operators discussed in Section~\ref{transsec}. The starting point for
+such transformations is {\tt
+pencircle}\index{pencircle?\texttt{pencircle}}\label{Dpncirc}, a circle
+one PostScript point in diameter. Thus affine transformations produce a
+circular or elliptical\index{pens!elliptical} pen shape. The width of
+lines drawn with the pen depends on how nearly perpendicular the line is
+to the long axis of the ellipse.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-38.mps}}
+$$
+\caption{MetaPost code and the resulting ``calligraphic'' figure.}
+\label{fig38}\index{lft?\texttt{lft}}\index{bot?\texttt{bot}}\index{top?\texttt{top}}
+\end{figure}
+
+Figure~\ref{fig38} demonstrates operators {\tt
+lft}\index{lft?\texttt{lft}}\label{Dlft}, {\tt
+rt}\index{rt?\texttt{rt}}\label{Drt}, {\tt
+top}\index{top?\texttt{top}}\label{Dtop}, and {\tt
+bot}\index{bot?\texttt{bot}}\label{Dbot} that answer the question, ``If
+the current pen is placed at the position given by the argument, where
+will its left, right, top, or bottom edge be?'' In this case the
+current pen is the ellipse given in the {\tt pickup} statement and its
+bounding box is 0.1734 inches wide and 0.1010 inches high, so {\tt rt
+x3} is ${\tt x3}+{\tt 0.0867in}$ and {\tt bot y5} is ${\tt y5}-{\tt
+0.0505in}$. The {\tt lft}, {\tt rt}, {\tt top}, and {\tt bot} operators
+also accept arguments of type pair in which case they compute the $x$
+and~$y$ coordinates of the leftmost, rightmost, topmost, or bottommost
+point on the pen shape. For example,
+$$ {\tt rt}(x,y) = (x,y)+({\tt 0.0867in}, {\tt 0.0496in}) $$
+for the pen in Figure~\ref{fig38}. Note that {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} resets the current pen to a
+default value of
+$$ \hbox{\tt pencircle scaled 0.5bp} $$
+at the beginning of each figure. This value can be reselected at any
+time by giving the command {\tt pickup
+defaultpen}\index{defaultpen?\texttt{defaultpen}}\label{Ddefaultpen}.
+
+This would be the end of the story on pens, except that for
+compatibility with \MF\index{metafont?\MF}, MetaPost also allows pen
+shapes to be polygonal\index{pens!polygonal}. There is a predefined pen
+called {\tt pensquare}\index{pensquare?\texttt{pensquare}}\label{Dpnsqr}
+that can be transformed to yield pens shaped like parallelograms.
+
+In fact, there is even an operator called {\tt
+makepen}\index{makepen?\texttt{makepen}}\label{Dmkpen} that takes a
+convex-polygon-shaped path and makes a pen that shape and size. If the
+path is not exactly convex or polygonal, the {\tt makepen} operator will
+straighten the edges and/or drop some of the vertices. In particular,
+{\tt pensquare} is equivalent to
+$$ \hbox{\verb|makepen((-.5,-.5)--(.5,-.5)--(.5,.5)--(-.5,.5)--cycle)|} $$
+
+{\tt pensquare} and {\tt makepen} should not be used with dash
+patterns. See the end of Section~\ref{dashed-pens}, p.\
+\pageref{dashed-pens}.
+
+The inverse of {\tt makepen} is the {\tt
+makepath}\index{makepath?\texttt{makepath}}\label{Dmkpath} operator that
+takes a \tdescr{pen primary} and returns the corresponding path. Thus
+{\tt makepath pencircle} produces a circular path identical to {\tt
+fullcircle}\index{fullcircle?\texttt{fullcircle}}. This also works for
+a polygonal pen so that
+$$ {\tt makepath\ makepen}\, \descr{path expression} $$
+will take any cyclic path and turn it into a convex polygon\index{convex polygons}.
+
+
+\subsection{Clipping and Low-Level Drawing Commands}
+
+Drawing statements such as {\tt draw}, {\tt fill}, {\tt filldraw}, and
+{\tt unfill} are part of the Plain macro\index{Plain macros} package and
+are defined in terms of more primitive statements. The main difference
+between the drawing statements discussed in previous sections and the
+more primitive versions is that the primitive drawing statements all
+require you to specify a picture variable to hold the results. For {\tt
+fill}, {\tt draw}, and related statements, the results always go to a
+picture variable called {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}\label{Dcurpic}.
+The syntax for the primitive drawing statements that allow you to
+specify a picture variable is shown in Figure~\ref{sydraw}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{picture variable} also
+ \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable}
+ contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{picture variable}
+ doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{option list} \rightarrow \descr{empty} \;|\;
+ \descr{drawing option} \descr{option list}$\\
+$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withrgbcolor \descr{rgbcolor expression} \;|\;
+ withcmykcolor \descr{cmykcolor expression}$\\
+$\tt \qquad \;|\; withgreyscale \descr{numeric expression} \;|\;
+ withoutcolor$\\
+$\tt \qquad \;|\; withprescript \descr{string expression} \;|\;
+ withpostscript \descr{string expression}$\\
+$\tt \qquad \;|\; withpen \descr{pen expression} \;|\;
+ dashed \descr{picture expression}$
+\end{ctabbing}
+\caption{The syntax for primitive drawing statements}
+\label{sydraw}
+\index{option list?\tdescr{option list}}\index{addto also?\texttt{addto also}}\index{addto contour?\texttt{addto contour}}%
+\index{addto doublepath?\texttt{addto doublepath}}\index{withcolor?\texttt{withcolor}}\index{withpen?\texttt{withpen}}%
+\index{dashed?\texttt{dashed}}\index{drawing option?\tdescr{drawing option}}
+\end{figure}
+
+The syntax for primitive drawing commands is compatible with
+\MF\index{metafont?\MF}. Table~\ref{draweqv} shows how the primitive
+drawing statements relate to the familiar {\tt draw} and {\tt fill}
+statements. Each of the statements in the first column of the table
+could be ended with an \tdescr{option list} of its own, which is
+equivalent to appending the \tdescr{option list} to the corresponding
+entry in the second column of the table. For example,
+$$ {\tt draw}\ p\ {\tt withpen\ pencircle} $$
+is equivalent to
+$$ {\tt addto\ currentpicture\ doublepath}\ p\
+ {\tt withpen\ currentpen\ withpen\ pencircle}
+$$
+where {\tt
+currentpen}\index{currentpen?\texttt{currentpen}}\label{Dcurpen} is a
+special pen variable that always holds the last pen picked up. The
+second {\tt withpen} option silently overrides the {\tt withpen
+currentpen} from the expansion of {\tt draw}.
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+\multicolumn1{|c|}{statement}& \multicolumn1{c|}{equivalent primitives}\\ \hline
+{\tt draw} {\it pic}& {\tt addto currentpicture also} {\it pic}\\
+{\tt draw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$\\
+{\tt fill} $c$& {\tt addto currentpicture contour} $c$\\
+{\tt filldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$\\
+{\tt undraw} {\it pic}& {\tt addto currentpicture also} {\it pic}
+ {\tt withcolor} $b$\\
+{\tt undraw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$
+ {\tt withcolor} $b$\\
+{\tt unfill} $c$& {\tt addto currentpicture contour} $c$
+ {\tt withcolor} $b$\\
+{\tt unfilldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$
+ {\tt withcolor} $b$\\ \hline
+\end{tabular}
+$$
+\caption[Drawing statements and equivalent primitive commands] {Common
+ drawing statements and equivalent primitive versions, where $q$
+ stands for {\tt currentpen}, $b$ stands for {\tt background},
+ $p$ stands for any path, $c$ stands for a cyclic path, and {\it
+ pic} stands for a \tdescr{picture expression}. Note that
+ nonempty {\tt drawoptions} would complicate the entries in the
+ second column.}
+\label{draweqv}
+\index{drawoptions?\texttt{drawoptions}}
+\end{table}
+
+
+There are two more primitive drawing commands that do not accept any
+drawing options. One is the {\tt setbounds} command that was discussed
+in Section~\ref{meas}; the other is the {\tt clip}
+command\index{clip?\texttt{clip}}\label{Dclip}:
+$$ {\tt clip}\, \descr{picture variable}\, {\tt to}\, \descr{path expression} $$
+Given a cyclic path, this statement trims the contents of the
+\tdescr{picture variable} to eliminate everything outside of the cyclic path.
+There is no ``high level'' version of this statement, so you have to use
+$$ {\tt clip\ currentpicture\ to}\, \descr{path expression} $$
+if you want to clip {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+Figure~\ref{fig40} illustrates clipping.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{mpman-40.mps}}
+$$
+\caption{MetaPost code and the resulting ``clipped'' figure.}
+\label{fig40}
+\end{figure}
+
+All the primitive drawing operations would be useless without one last
+operation called {\tt shipout}. The
+statement\index{shipout?\texttt{shipout}}\label{Dship}
+$$ {\tt shipout}\, \descr{picture expression} $$
+writes out a picture as a PostScript\index{PostScript} file whose
+file name is determined by
+{\tt outputtemplate}\index{outputtemplate?\texttt{outputtemplate}}
+(see Section~\ref{Doutputtemplate}). By default, the file name ends
+{\tt.}{\it nnn}, where {\tt nnn} is the decimal representation
+of the value of the internal variable\index{internal
+variables}\index{variables!internal} {\tt
+charcode}\index{charcode?\texttt{charcode}}\label{Dcharcode}. (The name
+``{\tt charcode}'' is for compatibility with \MF\index{metafont?\MF}.)
+Normally, {\tt beginfig}\index{beginfig?\texttt{beginfig}} sets {\tt
+charcode}, and {\tt endfig}\index{endfig?\texttt{endfig}} invokes {\tt
+shipout}.
+
+\subsection{Directing Output to a Picture Variable}
+Sometimes, it might be desirable to save the output of a drawing
+operation and re-use them later. This can easily be done with
+MetaPost primitives like \ttt{addto}. On the other hand, since the
+higher-level drawing commands defined in the Plain macro package
+always write to the
+\ttt{currentpicture}\index{currentpicture?\texttt{currentpicture}},
+saving their output required to temporarily save \ttt{currentpicture},
+reset it to \ttt{nullpicture}\index{nullpicture?\texttt{nullpicture}},
+execute the drawing operations, save the \ttt{currentpicture} to a
+new \ttt{picture} variable and finally restore \ttt{currentpicture} to
+the saved state. In MetaPost version~0.60 a new macro
+$$ \hbox{\tt image( $\descr{drawing commands}$ )} $$%
+\index{image?\texttt{image}}\label{Dimage}%
+was introduced that eases this task. It takes as input a sequence of arbitrary
+drawing operations and returns a \ttt{picture} variable containing the
+corresponding output, without affecting {\tt currentpicture}.
+
+As an example, in the code of figure~\ref{fig55} an object \ttt{wheel} has
+been defined that saves the output of two \ttt{draw} operations as follows:
+\begin{figure}[b]
+$$ \includegraphics{mpman-55.mps} $$
+\caption{Copying objects with the \ttt{image} operator.}
+\label{fig55}
+\end{figure}
+$$\begin{verbatim}
+picture wheel;
+wheel := image(
+ draw fullcircle scaled 2u xscaled .8 rotated 30;
+ draw fullcircle scaled .15u xscaled .8 rotated 30;
+);
+\end{verbatim}
+$$
+This \ttt{wheel} object is re-used in the definition of another object \ttt{car}.
+Figure~\ref{fig55} shows three \ttt{car} objects drawn with two different slant
+values.
+
+
+\subsection{Inspecting the Components of a Picture}
+\label{piccomp}
+
+\mbox{}% Start paragraph here.
+\index{setbounds?\texttt{setbounds}|(}%
+\index{for within?\texttt{for within}|(}%
+%
+MetaPost pictures are composed of stroked lines, filled outlines, pieces
+of typeset text, clipping paths\index{clip?\texttt{clip}}, and
+{\tt setbounds}\index{setbounds?\texttt{setbounds}} paths. (A {\tt setbounds}
+path gives an artificial bounding box as is needed for \TeX\ output.)
+A picture can have many components of each type. They can be accessed via
+an iteration of the form
+$$ {\tt for}\ \descr{symbolic token}\ {\tt within}\
+ \descr{picture expression}\hbox{\tt:}\ \descr{loop text}\ {\tt endfor}
+$$\index{for within?\texttt{for within}}\label{Dforwithin}%
+The \tdescr{loop text} can be anything that is balanced with respect to
+{\tt for} and {\tt endfor}. The \tdescr{symbolic token} is a loop variable that
+scans the components of the picture in the order in which they were drawn. The
+component for a clipping or {\tt setbounds} path includes everything the path
+applies to. Thus if a single clipping or {\tt setbounds} path applies to
+everything in the \tdescr{picture expression}, the whole picture could be
+thought of as one big component. In order to make the contents of such a picture
+accessible, the {\tt for}\ldots{\tt within} iteration ignores the enclosing
+clipping or {\tt setbounds} path in this case. The number of components
+that a {\tt for}\ldots {\tt within} iteration would find is returned by
+$$ {\tt length}\ \descr{picture primary}\index{length?\texttt{length}}\label{DlengthPicture}$$
+
+\index{for within?\texttt{for within}|)}
+
+\mbox{}% Start paragraph here.
+\index{stroked?\texttt{stroked}|(}%
+\index{filled?\texttt{filled}|(}%
+\index{textual?\texttt{textual}|(}%
+\index{clipped?\texttt{clipped}|(}%
+\index{bounded?\texttt{bounded}|(}%
+%
+Once the {\tt for}\ldots{\tt within} iteration has found a picture component,
+there are numerous operators for identifying it and extracting relevant
+information. The operator
+$$ {\tt stroked}\ \descr{primary expression} $$\index{stroked?\texttt{stroked}}\label{Dstroked}%
+tests whether the expression is a known picture whose first component is a
+stroked line. Similarly, the {\tt filled}\index{filled?\texttt{filled}}\label{Dfilled}
+and {\tt textual}\index{textual?\texttt{textual}}\label{Dtextual} operators
+return {\tt true} if the first component is a filled outline or a piece of
+typeset text. The {\tt clipped}\index{clipped?\texttt{clipped}}\label{Dclipped}
+and {\tt bounded}\index{bounded?\texttt{bounded}}\label{Dbounded} operators
+test whether the argument is a known picture that starts with a clipping
+path or a {\tt setbounds} path. This is true if the first component is
+clipped or bounded or if the entire picture is enclosed in a clipping or
+{\tt setbounds} path.
+
+\mbox{}% Start paragraph here.
+\index{pathpart?\texttt{pathpart}|(}%
+\index{penpart?\texttt{penpart}|(}%
+\index{dashpart?\texttt{dashpart}|(}%
+%
+There are also numerous part extraction operators that test the first component
+of a picture. If {\tt p} is a picture and {\tt stroked p} is true,
+{\tt pathpart p}\index{pathpart?\texttt{pathpart}}\label{Dpathpart} is the
+path describing the line that got stroked,
+{\tt penpart p}\index{penpart?\texttt{penpart}}\label{Dpenpart} is the pen
+that was used, {\tt dashpart p}\index{dashpart?\texttt{dashpart}}\label{Ddashpart}
+is the dash pattern. If the line is not dashed, {\tt dashpart p}
+returns an empty picture.
+
+The same part extraction operators work when {\tt filled p} is true, except
+that {\tt dashpart p} is not meaningful in that case.
+
+For text components, {\tt textual p} is true,
+{\tt textpart p}\index{textpart?\texttt{textpart}}\label{Dtextpart}
+gives the text that got typeset,
+{\tt fontpart p}\index{fontpart?\texttt{fontpart}}\label{Dfontpart}
+gives the font that was used, and {\tt xpart~p}\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart}}%
+\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypart}},
+{\tt ypart~p}, {\tt xxpart~p}, {\tt xypart~p}, {\tt yxpart~p}, {\tt yypart~p}
+tell how the text has been shifted, rotated, and scaled.
+
+\mbox{}% Start paragraph here.
+\index{colorpart?\texttt{colorpart}|(}%
+\index{colormodel?\texttt{colormodel}|(}%
+\index{redpart?\texttt{redpart}|(}%
+\index{greenpart?\texttt{greenpart}|(}%
+\index{bluepart?\texttt{bluepart}|(}%
+\index{cyanpart?\texttt{cyanpart}|(}%
+\index{magentapart?\texttt{magentapart}|(}%
+\index{yellowpart?\texttt{yellowpart}|(}%
+\index{blackpart?\texttt{blackpart}|(}%
+\index{greypart?\texttt{greypart}|(}%
+%
+Finally, for \ttt{stroked}, \ttt{filled} and \ttt{textual} components
+the color can be examined by saying
+$$ {\tt colorpart}\
+\descr{item}\index{colorpart?\texttt{colorpart}}\label{Dcolorpart}
+$$
+This returns the color of a component in its respective color model.
+The color model of a component can be identified by the
+\ttt{colormodel}\index{colormodel?\texttt{colormodel}}\label{Dcolormodel}
+operator (cf. Table~\ref{dfltcmod} on p.~\pageref{dfltcmod}).
+
+For more fine grained color operations there are operators to extract
+single color components of an item. Depending on the color model the
+color of a picture component \ttt{p} is
+$$ \hbox{\tt (cyanpart p, magentapart p, yellowpart p, blackpart p)} $$%
+\index{cyanpart?\texttt{cyanpart}}\index{magentapart?\texttt{magentapart}}\index{yellowpart?\texttt{yellowpart}}\index{blackpart?\texttt{blackpart}}
+or
+$$ \hbox{\tt (redpart p, greenpart p, bluepart p)} $$%
+\index{redpart?\texttt{redpart}}\index{greenpart?\texttt{greenpart}}\index{bluepart?\texttt{bluepart}}
+or
+$$ \hbox{\tt greypart p} $$%
+\index{greypart?\texttt{greypart}}
+or
+$$ \hbox{\tt false}. $$
+
+Note, color part operators {\tt redpart}, {\tt cyanpart} etc. have to
+match the color model of the picture component in question. Applying a
+non-matching color part operator to a picture component triggers an
+error and returns a \ttindex{black} color part in the requested color
+model. That is, for the code
+$$\begin{verbatim}
+picture pic;
+pic := image(fill unitsquare scaled 1cm withcolor (0.3, 0.6, 0.9););
+for item within pic:
+ show greypart item;
+ show cyanpart item;
+ show blackpart item;
+ show redpart item;
+endfor
+\end{verbatim}
+$$
+the output is (omitting the error messages)
+$$\begin{verbatim}
+>> 0
+>> 0
+>> 1
+>> 0.3
+\end{verbatim}
+$$
+since in grey scale color model black is {\tt 0} and in CMYK color model
+black is {\tt (0,0,0,1)}. For the matching RGB color model the true
+color component is returned.
+
+When {\tt clipped p} or {\tt bounded p} is true, {\tt pathpart p} gives the
+clipping or {\tt setbounds} path and the other part extraction operators are
+not meaningful. Such non-meaningful part extractions do not generate
+errors. Instead, they return null values or black color (components):
+the trivial path {\tt (0,0)} for {\tt pathpart},
+{\tt nullpen}\index{nullpen?\texttt{nullpen}}\label{Dnlpen} for {\tt penpart},
+an empty picture for {\tt dashpart},
+the null string for {\tt textpart} or {\tt fontpart},
+zero for {\tt colormodel},
+{\tt greypart},
+{\tt redpart}, {\tt greenpart}, {\tt bluepart},
+{\tt cyanpart}, {\tt magentapart}, {\tt yellowpart},
+one for {\tt blackpart}, and
+black in the current default color model for {\tt colorpart}.
+
+To summarize the discussion of mismatching part operators:
+\begin{enumerate}
+\item Asking for non-meaningful parts of an item---such as the {\tt
+ redpart} of a clipping path, the {\tt textpart} of a stroked item,
+ or the {\tt pathpart} of a textual item---is silently accepted and
+ returns a null value or a black color (component).
+\item Explicitly asking for a color part of a colored item in the wrong
+ color model returns a black color component. This operation triggers
+ an error.
+\end{enumerate}
+
+\index{setbounds?\texttt{setbounds}|)}
+\index{stroked?\texttt{stroked}|)}
+\index{filled?\texttt{filled}|)}
+\index{textual?\texttt{textual}|)}
+\index{clipped?\texttt{clipped}|)}
+\index{bounded?\texttt{bounded}|)}
+\index{pathpart?\texttt{pathpart}|)}
+\index{penpart?\texttt{penpart}|)}
+\index{dashpart?\texttt{dashpart}|)}
+\index{colormodel?\texttt{colormodel}|)}
+\index{colorpart?\texttt{colorpart}|)}
+\index{redpart?\texttt{redpart}|)}
+\index{greenpart?\texttt{greenpart}|)}
+\index{bluepart?\texttt{bluepart}|)}
+\index{cyanpart?\texttt{cyanpart}|)}
+\index{magentapart?\texttt{magentapart}|)}
+\index{yellowpart?\texttt{yellowpart}|)}
+\index{blackpart?\texttt{blackpart}|)}
+\index{greypart?\texttt{greypart}|)}
+
+
+\subsection{Decomposing the Glyphs of a Font}
+\label{glyphs}
+
+MetaPost provides a primitive to convert a
+glyph\index{glyph}\index{font!glyph} of a font in the Adobe Type~1
+Font\index{PostScript!fonts}\index{font!PostScript}\index{Adobe Type~1
+ Font}\index{font!Adobe Type~1} format into its constituent filled
+paths---the strokes---and store them in a picture variable. A glyph is
+the visual representation of a character in a font. A
+character\index{character}\index{font!character} is a certain
+slot\index{slot}\index{font!slot} (index) in a font with an associated
+meaning, e.g., the capital letter~``M'' or the exclamation mark. The
+meaning of a slot is defined by the font
+encoding\index{encoding}\index{font!encoding}. In general, the same
+character is represented by different glyphs in different fonts.
+Figure~\ref{glyphsample} shows some glyphs for the character at slot~103
+in the T1 encoding, i.e., the lower-case letter~``g''. All glyphs are
+at the same nominal size. Note, how glyphs may extend beyond their
+bounding box.
+\begin{figure}[htp]
+ \centering
+ \setlength{\fboxsep}{0pt}
+ \setlength{\fboxrule}{.125pt}
+ \fontsize{56pt}{56pt}\selectfont
+ \newcommand*{\showglyph}[4]{% a glyph with its bounding box
+ \fbox{\usefont{#1}{#2}{#3}{#4}g}%
+ }
+ \makebox[0pt][c]{% base line
+ \rule{.7\textwidth}{.125pt}%
+ }%
+ \makebox[0pt][c]{% glyphs
+ \showglyph{T1}{lmr}{m}{n}\hspace{.3em}
+ \showglyph{T1}{qag}{m}{n}\hspace{.3em}
+ \showglyph{T1}{qpl}{m}{it}\hspace{.3em}
+ \showglyph{T1}{qzc}{m}{it}%
+ }
+ \caption{Different glyphs representing the same character.}
+ \label{glyphsample}
+\end{figure}
+
+The glyphs of an Adobe Type~1
+font\index{PostScript!fonts}\index{font!PostScript}\index{Adobe Type~1
+ Font}\index{font!Adobe Type~1} are composed of two types of contours:
+Clockwise oriented contours add to the shape of a glyph and are filled
+with black ink. Counter-clockwise oriented contours
+erase\index{erasing} parts of other contours, i.e., make them
+transparent again. To save the contours of a glyph in a picture, the
+\verb|glyph|\index{glyph?\texttt{glyph}}\label{Dglyph} operator can be
+used. There are two ways to identify a glyph in a font:
+\begin{eqnarray*}
+ & \verb|glyph|\, \descr{numeric expression}\, \verb|of|\,
+ \descr{string expression}\\
+ \noalign{\hbox{and}}
+ & \verb|glyph|\, \descr{string expression}\, \verb|of|\,
+ \descr{string expression}\rlap{\quad\mbox{.}}
+\end{eqnarray*}
+
+If the first argument is a numeric expression, it has to be a slot
+number between 0 and~255. Fractional slot numbers are rounded to the
+nearest integer value. Slot numbers outside the allowed range trigger
+an error. If the first argument is string, it has to be a CharString
+name\index{CharString name} in the PostScript font's source file. A
+CharString name is a unique text label for a glyph in a PostScript font
+(a font encoding actually maps CharStrings to slots). This second
+syntax can be used to address glyphs without having to think about font
+encodings. The second argument to the \verb|glyph| operator is a string
+containing a font name (section~\ref{text} has more on font names).
+
+The \verb|glyph| operator looks-up the font name in the font map to
+determine the encoding and to find the font's PostScript source file.
+It returns a picture consisting of the glyph's contour lines, explicitly
+filled black and white in the greyscale color model according to the
+rules laid out above. Additionally, the contours are sorted, such that
+all black contours are drawn before white contours. The filling and
+sorting is necessary for the picture to resembles the corresponding
+glyph visually\footnote{Plain contours already carry enough information
+ to completely reconstruct a glyph, the orientation of a contour can be
+ computed from its cardinal and control points. MetaPost has a
+ \texttt{turningnumber}\index{turningnumber?\texttt{turningnumber}}\label{Dturningnumber}
+ primitive to do that.}, since Adobe Type~1
+fonts\index{PostScript!fonts}\index{font!PostScript}\index{Adobe Type~1
+ Font}\index{font!Adobe Type~1} use a generalized variant of the
+non-zero winding number fill rule\index{non-zero fill rule}\index{fill
+ rule!non-zero}\index{PostScript!fill rule}, which MetaPost doesn't
+implement (MetaPost cannot handle non-contiguous paths). As a side
+effect, the interiors of the erasing\index{erasing} contours are an
+opaque white in the returned picture, while they were transparent in the
+original glyph. One can think of erasing contours to be unfilled (see
+p.~\pageref{Dunfill}). For instance, the following code saves the
+contours of the lower case letter~``g'', bound to slot~103 in the OT1
+encoding\index{OT1 encoding}\index{encoding!OT1}, in the
+Computer\index{Computer Modern Roman} Modern Roman font in a picture
+variable:
+
+$$
+\begin{verbatim}
+fontmapline "cmr10 CMR10 <cmr10.pfb";
+picture g;
+g := glyph 103 of "cmr10";
+\end{verbatim}
+$$
+
+The \verb|glyph| operator returns an empty picture, if the
+\texttt{.tfm}\index{tfm file?{\tt tfm} file}\index{files!tfm?{\tt tfm}}
+or \texttt{.pfb}\index{pfb file?{\tt pfb} file}\index{files!pfb?{\tt
+ pfb}} file cannot be found, if the encoding given in the font map
+cannot be found or the slot number is not covered by the encoding or if
+the CharString name cannot be found. Note, while MetaPost delegates the
+actual font handling to a rendering application for \verb|infont| and
+\verb|btex| \ldots\ \verb|etex| blocks, the \verb|glyph| operator
+directly operates on font ressources. For that reason, a font map entry
+is mandatory for the font in question, given either by
+\verb|fontmapline| or \verb|fontmapfile| (see
+section~\ref{Dfontmapline}).
+
+In Figure~\ref{fig56}, the contours of the upper case letter~``\v{D}''
+in the Latin\index{Latin Modern Roman} Modern Roman font are saved in a
+picture variable. The glyph is identified by its CharString name
+``Dcaron''\index{Dcaron}. The code then iterates over all contours and
+draws them together with their cardinal (black) and control points
+(red). As it turns out, many of the control points coincide with
+cardinal points in this glyph.
+
+\begin{figure}[htb]
+$$
+\begin{verbatim}
+fontmapfile "=lm-ec.map";
+beginfig(56);
+ picture q;
+ path p;
+ interim ahlength := 12bp;
+ interim ahangle := 25;
+ q := glyph "Dcaron" of "ec-lmr10" scaled .2;
+ for item within q:
+ p := pathpart item;
+ drawarrow p withcolor (.6,.9,.6)
+ withpen pencircle scaled 1.5;
+ for j=0 upto length p:
+ pickup pencircle scaled .7;
+ draw (point j of p -- precontrol j of p)
+ dashed evenly withcolor blue;
+ draw (point j of p -- postcontrol j of p)
+ dashed evenly withcolor blue;
+ pickup pencircle scaled 3;
+ draw precontrol j of p withcolor red;
+ draw postcontrol j of p withcolor red;
+ pickup pencircle scaled 2;
+ draw point j of p withcolor black;
+ endfor
+ endfor
+endfig;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{mpman-56.mps}}
+$$
+\caption{Iterating over the contours of a glyph}
+\label{fig56}
+\end{figure}
+
+The contours in a picture returned by the \verb|glyph| operator are no
+raw copies of the contours found in the font sources, but the
+\verb|glyph| operator applies a number of transformations to them.
+First, the direction of all contours is reversed, so that contours
+filled black become counter-clockwise oriented (mathematically positive)
+and contours filled white become clockwise oriented (mathematically
+negative). Second, in an Adobe Type~1
+font\index{PostScript!fonts}\index{font!PostScript}\index{Adobe Type~1
+ Font}\index{font!Adobe Type~1}, contours are in general closed by
+repeating the starting point before applying the \verb|closepath|
+operator\index{PostScript!closepath operator?\texttt{closepath}
+ operator}. The MetaPost representation of such a path would be:
+$$
+z_0\verb|..|\mbox{\itshape controls}\verb|..|z_1\verb|..| \cdots
+\verb|..|z_n\verb|..|\mbox{\itshape controls}\verb|..|z_0\verb|--cycle|
+$$
+However, a more natural MetaPost representation of that path would be:
+$$
+z_0\verb|..|\mbox{\itshape controls}\verb|..|z_1\verb|..| \cdots
+\verb|..|z_n\verb|..|\mbox{\itshape controls}\verb|..cycle|
+$$
+The \verb|glyph| operator transforms all paths into the latter
+representation, i.e., the last point is removed, whenever it matches the
+starting point. Finally, the picture returned by the \verb|glyph|
+operator is scaled, such that one font design unit\index{font!design
+ unit} equals one PostScript
+point\index{point!PostScript}\index{PostScript!point} (bp). A usual
+font design unit is a thousandth part of the font design
+size\index{font!design size}. Therefore, the returned picture will
+typically have a height of around 1000bp.
+
+Converting a text into plain curves is part of a process oftentimes
+called ``flattening\index{flattening}'' a document. During flattening,
+all hinting information in fonts are lost. Hinting information aid a
+rendering application in aligning certain parts of a glyph on a
+low-resolution output device. A flattened text may therefore look
+distorted on screen. In SVG output, all text is automatically
+flattened, if the internal variable
+\verb|prologues|\index{prologues?\texttt{prologues}} is set to~3 (see
+section~\ref{Dprologues}).
+
+
+\section{Macros}
+\label{macros}
+
+As alluded to earlier, MetaPost has a set of automatically included
+macros called the Plain macro package\index{Plain macros}, and some of
+the commands discussed in previous sections are defined as macros
+instead of being built into MetaPost. The purpose of this section is to
+explain how to write such macros.
+
+Macros with no arguments are very simple.
+A macro definition\index{replacement text?\tdescr{replacement text}}%
+\index{def?\texttt{def}}\index{enddef?\texttt{enddef}}
+$$ {\tt def}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{replacement text}\, {\tt enddef}
+$$
+makes the \tdescr{symbolic token} an abbreviation for the
+\tdescr{replacement text}, where the \tdescr{replacement text} can be
+virtually any sequence of tokens. For example, the Plain macro package
+could almost define the {\tt fill} statement like
+this\index{fill?\texttt{fill}}:
+$$ \hbox{\tt def fill = addto currentpicture contour enddef} $$
+
+Macros with arguments are similar, except they have formal parameters
+that tell how to use the arguments in the \tdescr{replacement text}.
+For example, the {\tt
+rotatedaround}\index{rotatedaround?\texttt{rotatedaround}} macro is
+defined like this:
+$$\begin{verbatim}
+def rotatedaround(expr z, d) =
+ shifted -z rotated d shifted z enddef;
+\end{verbatim}
+$$
+The {\tt expr}\index{expr?\texttt{expr}} in this definition means that
+formal parameters {\tt z} and {\tt d} can be arbitrary expressions.
+(They should be pair expressions but the MetaPost interpreter does not
+immediately check for that.)
+
+Since MetaPost is an interpreted language, macros with arguments are a
+lot like subroutines\index{subroutines}. MetaPost macros are often used
+like subroutines, so the language includes programming concepts to
+support this. These concepts include local variables, loops, and
+conditional statements.
+
+\subsection{Grouping}
+\label{grsec}
+
+Grouping in MetaPost is essential for functions\index{functions} and
+local\index{variables!local}\index{locality} variables. The basic idea
+is that a group is a sequence of statements possibly followed by an
+expression with the provision that certain symbolic
+tokens\index{tokens!symbolic} can have their old meanings restored at
+the end of the group. If the group ends with an expression, the group
+behaves like a function call that returns that expression. Otherwise,
+the group is just a compound statement\index{compound statement}. The
+syntax for a group
+is\index{begingroup?\texttt{begingroup}}\index{endgroup?\texttt{endgroup}}
+$$ {\tt begingroup}\, \descr{statement list}\, {\tt endgroup} $$
+or
+$$ {\tt begingroup}\, \descr{statement list}\, \descr{expression}\, {\tt endgroup}
+$$
+where a \tdescr{statement list} is a sequence of statements each
+followed by a semicolon. A group with an \tdescr{expression} after the
+\tdescr{statement list} behaves like a \tdescr{primary} in
+Figure~\ref{syexpr} or like a \tdescr{numeric atom} in
+Figure~\ref{synprim}.
+
+Since the \tdescr{replacement text} for the {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} macro starts with {\tt
+begingroup} and the \tdescr{replacement text} for {\tt
+endfig}\index{endfig?\texttt{endfig}} ends with {\tt endgroup}, each
+figure in a MetaPost input file behaves like a group. This is what
+allows figures can have local variables. We have already seen in
+Section~\ref{vardecl} that variable names beginning with {\tt x} or {\tt
+y} are local in the sense that they have unknown values at the beginning
+of each figure and these values are forgotten at the end of each figure.
+The following example illustrates how locality works:
+\begin{eqnarray*}
+&& \hbox{\tt x23 = 3.1;}\\
+&& \hbox{\tt beginfig(17);}\\
+&& \qquad \vdots\\
+&& \hbox{\tt y3a=1; x23=2;}\\
+&& \qquad \vdots\\
+&& \hbox{\tt endfig;}\\
+&& \hbox{\tt show x23, y3a;}
+\end{eqnarray*}
+The result of the {\tt show}\index{show?\texttt{show}} command is
+$$\begin{verbatim}
+>> 3.1
+>> y3a
+\end{verbatim}
+$$
+indicating that {\tt x23} has returned to its former value of {\tt 3.1} and
+{\tt y3a} is completely unknown as it was at {\tt beginfig(17)}.
+
+The locality of {\tt x} and {\tt y} variables is achieved by the
+statement\index{save?\texttt{save}}\label{Dsave}
+$$ \hbox{\tt save x,y} $$
+in the \tdescr{replacement text} for {\tt
+beginfig}\index{beginfig?\texttt{beginfig}}. In general, variables are
+made local by the statement
+$$ {\tt save}\, \descr{symbolic token list} $$
+where \tdescr{symbolic token list} is a comma-separated list of
+tokens:\index{tokens!symbolic}
+\begin{ctabbing}
+$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+ $\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,}
+ \descr{symbolic token list}$
+\end{ctabbing}
+All variables whose names begin with one of the specified symbolic
+tokens become unknown numerics and their present values are saved for
+restoration at the end of the current group. If the {\tt save}
+statement is used outside of a group, the original values are simply
+discarded.
+
+The main purpose of the {\tt save} statement is to allow macros to use
+variables without interfering with existing variables or variables in
+other calls to the same macro. For example, the predefined macro {\tt
+whatever}\index{whatever?\texttt{whatever}} has the \tdescr{replacement text}
+$$ \hbox{\tt begingroup save ?; ? endgroup} $$
+This returns an unknown numeric quantity, but it is no longer called
+question mark since that name was local to the group. Asking the name
+via {\tt show\index{show?\texttt{show}} whatever}
+yields\index{CAPSULE?\texttt{CAPSULE}}
+$$ \hbox{\verb|>> %CAPSULE|}{\it nnnn} $$
+where {\it nnnn} is an identification number that is chosen when {\tt save}
+makes the name question mark disappear.
+
+In spite of the versatility of {\tt save}, it cannot be used to make
+local changes to any of MetaPost's internal variables\index{internal
+variables}\index{variables!internal}. A statement such
+as\index{linecap?\texttt{linecap}}
+$$ \hbox{\tt save linecap} $$
+would cause MetaPost to temporarily forget the special meaning of this
+variable and just make it an unknown numeric. If you want to draw one
+dashed line with {\tt linecap:=butt} and then go back to the previous
+value, you can use the {\tt
+interim}\index{interim?\texttt{interim}}\label{Dinterm} statement as
+follows:
+\begin{eqnarray*}
+&& \hbox{\tt begingroup interim linecap:=butt;}\\
+&& {\tt draw}\, \descr{path expression}\, \hbox{\tt dashed evenly; endgroup}
+\end{eqnarray*}
+This saves the value of the
+internal variable\index{internal variables}\index{variables!internal}
+{\tt linecap} and temporarily
+gives it a new value without forgetting that {\tt linecap} is an internal
+variable. The general syntax is
+$$ {\tt interim}\, \descr{internal variable} \mathrel{\hbox{\tt:=}}
+ \descr{numeric expression} \;|\; \descr{string expression}
+$$
+
+
+\subsection{Parameterized Macros}
+
+The basic idea behind parameterized macros is to achieve greater flexibility by
+allowing auxiliary information to be passed to a macro. We have already seen
+that macro definitions can have formal parameters that represent expressions
+to be given when the macro is called. For instance a definition such as
+$$ \hbox{\tt def rotatedaround(expr z, d) = } \descr{replacement text}\,
+ {\tt enddef}
+$$
+allows the MetaPost interpreter to understand macro calls of the form
+$$\tt rotatedaround\hbox{\tt (}
+ \descr{expression}\hbox{\tt ,} \descr{expression}\hbox{\tt )}
+$$
+
+The keyword {\tt expr}\index{expr?\texttt{expr}}\index{parameter!expr}
+in the macro definition means that the parameters can be expressions of
+any type. When the definition specifies {\tt (expr z, d)}, the formal
+parameters {\tt z} and {\tt d} behave like variables of the appropriate
+types. Within the \tdescr{replacement text}, they can be used in
+expressions just like variables, but they cannot be redeclared or
+assigned to. There is no restriction against unknown or partially known
+arguments. Thus the definition\index{midpoint?\texttt{midpoint}}
+$$ \hbox{\tt def midpoint(expr a, b) = (.5[a,b]) enddef} $$
+works perfectly well when {\tt a} and {\tt b} are unknown. An
+equation such as
+$$ \hbox{\tt midpoint(z1,z2) = (1,1)} $$
+could be used to help determine {\tt z1} and {\tt z2}.
+
+Notice that the above definition for {\tt midpoint} works for numerics,
+pairs, or colors as long as both parameters have the same type. If for
+some reason we want a {\tt
+middlepoint}\index{middlepoint?\texttt{middlepoint}} macro that works
+for a single path or picture, it would be necessary to do an {\tt
+if}\index{if?\texttt{if}} test on the argument type. This uses the fact
+there is a unary operator\index{path?\texttt{path}}
+$$ {\tt path}\, \descr{primary} $$
+that returns a boolean result indicating whether its argument is a path.
+Since the basic {\tt if} test has the
+syntax\index{else?\texttt{else}}\index{fi?\texttt{fi}}
+$$ {\tt if}\, \descr{boolean expression}\hbox{\tt:}\, \descr{balanced tokens}\,
+ \hbox{\tt else:}\, \descr{balanced tokens}\, {\tt fi}
+$$
+where the \tdescr{balanced tokens}\index{balanced
+tokens?\tdescr{balanced tokens}} can be anything that is balanced with
+respect to {\tt if} and {\tt fi}, the complete {\tt
+middlepoint}\index{middlepoint?\texttt{middlepoint}} macro with type test
+looks like this:
+$$\begin{verbatim}
+def middlepoint(expr a) = if path a: (point .5*length a of a)
+ else: .5(llcorner a + urcorner a) fi enddef;
+\end{verbatim}
+$$
+The complete syntax for {\tt if} tests is shown in Figure~\ref{syif}.
+It allows multiple {\tt if} tests like
+$$ \hbox{\tt if $e_1$: \ldots\ else: if $e_2$: \ldots\ else: \ldots\ fi fi} $$
+to be shortened to\index{elseif?\texttt{elseif}}
+$$ \hbox{\tt if $e_1$: \ldots\ elseif $e_2$: \ldots\ else: \ldots\ fi} $$
+where $e_1$ and $e_2$ represent boolean expressions.
+
+Note that {\tt if} tests are not statements and the \tdescr{balanced
+tokens} in the syntax rules can be any sequence of balanced tokens even
+if they do not form a complete expression or statement. Thus we could
+have saved two tokens at the expense of clarity by defining {\tt
+middlepoint} like this:
+$$\begin{verbatim}
+def middlepoint(expr a) = if path a: (point .5*length a of
+ else: .5(llcorner a + urcorner fi a) enddef;
+\end{verbatim}
+$$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :}
+ \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :}
+ \descr{balanced tokens} \descr{alternatives}$
+\end{ctabbing}
+\caption{The syntax for {\tt if} tests.}
+\label{syif}
+\end{figure}
+
+The real purpose of macros and {\tt if} tests is to automate repetitive
+tasks and allow important subtasks to be solved separately. For
+example, Figure~\ref{fig42} uses macros \verb|draw_marked|,
+\verb|mark_angle|, and \verb|mark_rt_angle| to mark lines and angles
+that appear in the figure.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-42.mps}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig42}
+\end{figure}
+
+The task of the
+\verb|draw_marked|\index{draw_marked?\texttt{draw\_marked}} macro is to
+draw a path with a given number of cross marks near its midpoint. A
+convenient starting place is the subproblem of drawing a single cross
+mark perpendicular to a path {\tt p} at some time {\tt t}. The
+\verb|draw_mark|\index{draw_mark?\texttt{draw\_mark}} macro in
+Figure~\ref{drawmarked} does this by first finding a vector {\tt dm}
+perpendicular to~{\tt p} at~{\tt t}. To simplify positioning the cross
+mark, the \verb|draw_marked| macro is defined to take an arc
+length\index{arc length} {\tt a} along {\tt p} and use the {\tt
+arctime}\index{arctime} operator to compute~{\tt t}
+
+With the subproblem of drawing a single mark out of the way, the
+\verb|draw_marked| macro only needs to draw the path and call
+\verb|draw_mark| with the appropriate arc length values. The
+\verb|draw_marked| macro in Figure~\ref{drawmarked} uses {\tt n}
+equally-spaced {\tt a} values centered on {\tt
+.5*arclength~p}\index{arclength?\texttt{arclength}}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+marksize=4pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+\end{verbatim}
+$$
+\caption{Macros for drawing a path {\tt p} with {\tt n} cross marks.}
+\label{drawmarked}
+\end{figure}
+
+Since \verb|draw_marked| works for curved lines, it can be used to draw
+the arcs that the
+\verb|mark_angle|\index{mark_angle?\texttt{mark\_angle}} macro
+generates. Given points {\tt a}, {\tt b}, and {\tt c} that define a
+counter-clockwise angle at {\tt b}, the \verb|mark_angle| needs to
+generate a small arc from segment {\tt ba} to segment {\tt bc}. The
+macro definition in Figure~\ref{markangle} does this by creating an arc
+{\tt p} of radius one and then computing a scale factor {\tt s} that
+makes it big enough to see clearly.
+
+The \verb|mark_rt_angle|\index{mark_rt_angle?\texttt{mark\_rt\_angle}}
+macro is much simpler. It takes a generic right-angle corner and uses
+the {\tt zscaled}\index{zscaled?\texttt{zscaled}} operator to rotate it
+and scale it as necessary.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+angle_radius=8pt;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+\end{verbatim}
+$$
+\caption{Macros for marking angles.}
+\label{markangle}
+\end{figure}
+
+
+\subsection{Suffix and Text Parameters}
+
+Macro parameters need not always be expressions as in the previous
+examples. Replacing the keyword {\tt expr} with {\tt
+suffix}\index{suffix?\texttt{suffix}} or {\tt
+text}\index{text?\texttt{text}} in a macro definition declares the
+parameters to be variable names or arbitrary sequences of tokens. For
+example, there is a predefined macro called {\tt
+hide}\index{hide?\texttt{hide}} that takes a text
+parameter\index{parameter!text} and interprets it as a sequence of
+statements while ultimately producing an empty \tdescr{replacement
+text}. In other words, {\tt hide} executes its argument and then gets
+the next token as if nothing happened. Thus
+$$ \hbox{\tt show hide(numeric a,b; a+b=3; a-b=1) a;} $$
+prints ``\verb|>> 2|.''
+
+If the {\tt hide} macro were not predefined, it could be defined like this:
+$$\begin{verbatim}
+def ignore(expr a) = enddef;
+def hide(text t) = ignore(begingroup t; 0 endgroup) enddef;
+\end{verbatim}
+$$
+The statements represented by the text parameter {\tt t} would be
+evaluated as part of the group that forms the argument to {\tt ignore}.
+Since {\tt ignore} has an empty \tdescr{replacement text}, expansion of
+the {\tt hide} macro ultimately produces nothing.
+
+Another example of a predefined macro with a text parameter is {\tt
+dashpattern}\index{dashpattern?\texttt{dashpattern}}. The definition of
+{\tt dashpattern} starts
+$$\begin{verbatim}
+def dashpattern(text t) =
+ begingroup save on, off;
+\end{verbatim}
+$$
+then it defines {\tt on} and {\tt off} to be macros that create the desired
+picture when the text parameter~{\tt t} appears in the replacement text.
+
+Text parameters are very general, but their generality sometimes gets in
+the way. If you just want to pass a variable name to a macro, it is
+better to declare it as a suffix parameter\index{parameter!suffix}. For
+example,\index{incr?\texttt{incr}}
+$$ \hbox{\verb|def incr(suffix $) = begingroup $:=$+1; $ endgroup enddef;|} $$
+defines a macro that will take any numeric variable, add one to it, and return
+the new value. Since variable names can be more than one token long,
+$$ \hbox{\tt incr(a3b)} $$
+is perfectly acceptable if {\tt a3b} is a numeric variable. Suffix
+parameters are slightly more general than variable names because the
+definition in Figure~\ref{syvar} allows a
+\tdescr{suffix}\index{suffix?\tdescr{suffix}} to start with a
+\tdescr{subscript}\index{subscript?\tdescr{subscript}}.
+
+Figure~\ref{fig45} shows how suffix and expr parameters can be used
+together. The {\tt getmid}\index{getmid?\texttt{getmid}} macro takes a
+path variable and creates arrays of points and directions whose names
+are obtained by appending {\tt mid}, {\tt off}, and {\tt dir} to the
+path variable. The {\tt joinup}\index{joinup?\texttt{joinup}} macro
+takes arrays of points and directions and creates a path of length {\tt
+n} that passes through each {\tt pt[i]} with direction {\tt d[i]} or
+$-\hbox{\tt d[i]}$.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{mpman-45.mps}}
+$$
+\caption{MetaPost code and the corresponding figure}
+\label{fig45}
+\end{figure}
+
+A definition that starts
+$$ \hbox{\tt def joinup(suffix pt, d)(expr n) =} $$
+might suggest that calls to the {\tt joinup} macro should have two sets of
+parentheses as in
+$$ \hbox{\tt joinup(p.mid, p.dir)(36)} $$
+instead of
+$$ \hbox{\tt joinup(p.mid, p.dir, 36)} $$
+In fact, both forms are acceptable. Parameters in a macro call can be
+separated by commas or by {\tt )(} pairs. The only restriction is that
+a text parameter\index{parameter!text} must be followed by a right
+parenthesis. For instance, a macro {\tt foo} with one text parameter
+and one expr parameter can be called
+$$ \hbox{\tt foo(a,b)(c)} $$
+in which case the text parameter is ``{\tt a,b}'' and the expr parameter is
+{\tt c}, but
+$$ \hbox{\tt foo(a,b,c)} $$
+sets the text parameter to ``{\tt a,b,c}'' and leaves the MetaPost interpreter
+still looking for the expr parameter.
+
+
+\subsection{Vardef Macros}
+
+A macro definition can begin with {\tt
+vardef}\index{vardef?\texttt{vardef}} instead of {\tt def}. Macros
+defined in this way are called vardef macros. They are particularly
+well-suited to applications where macros are being used like functions
+or subroutines. The main idea is that a vardef macro is like a variable
+of type ``macro.''
+
+Instead of {\tt def} \tdescr{symbolic token}, a vardef macro begins
+$$ {\tt vardef}\, \descr{generic variable} $$
+where a \tdescr{generic variable}\index{generic variable?\tdescr{generic
+variable}} is a variable name with numeric subscripts replaced by the
+generic subscript\index{subscript!generic} symbol {\tt
+[]}\index{[]?\texttt{[]}!vardef macro?\texttt{vardef} macro}. In other
+words, the name following {\tt
+vardef} obeys exactly the same syntax as the name given in a variable
+declaration. It is a sequence of tags and generic subscript symbols
+starting with a tag, where a tag\index{tags} is a symbolic token that is
+not a macro or a primitive operator as explained in
+Section~\ref{vardecl}.
+
+The simplest case is when the name of a vardef macro consists of a
+single tag. Under such circumstances, {\tt def} and {\tt vardef}
+provide roughly the same functionality. The most obvious difference is
+that {\tt begingroup}\index{begingroup?\texttt{begingroup}} and {\tt
+endgroup}\index{endgroup?\texttt{endgroup}} are automatically inserted
+at the beginning and end of the \tdescr{replacement text} of every
+vardef macro. This makes the \tdescr{replacement text} a group so that
+a vardef macro behaves like a subroutine or a function call.
+
+Another property of vardef macros is that they allow multi-token macro
+names and macro names involving generic subscripts. When a vardef macro
+name has generic subscripts, numeric values have to be given when the
+macro is called. After a macro definition
+$$ \hbox{\tt vardef a[]b(expr p) =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+{\tt a2b((1,2))} and {\tt a3b((1,2)..(3,4))} are macro calls. But how
+can the \tdescr{replacement text} tell the difference between {\tt a2b}
+and {\tt a3b}? Two implicit suffix parameters\index{parameter!suffix}
+are automatically provided for this purpose. Every vardef macro has
+suffix parameters \verb|#@|\index{#@?\texttt{\#@}} and
+\verb|@|\index{@?\texttt{@}}, where \verb|@| is the last token in the
+name from the macro call and \verb|#@| is everything preceding the last
+token. Thus \verb|#@| is {\tt a2} when the name is given as {\tt a2b}
+and {\tt a3} when the name is given as {\tt a3b}.
+
+Suppose, for example, that the {\tt a[]b} macro is to take its argument
+and shift it by an amount that depends on the macro name. The macro
+could be defined like this:
+$$ \hbox{\verb|vardef a[]b(expr p) = p shifted (#@,b) enddef;|} $$
+Then {\tt a2b((1,2))} means {\tt (1,2) shifted (a2,b)}
+and {\tt a3b((1,2)..(3,4))} means
+$$ \hbox{\tt ((1,2)..(3,4)) shifted (a3,b)}. $$
+
+If the macro had been {\tt a.b[]}, \verb|#@| would always be {\tt a.b}
+and the \verb|@| parameter would give the numeric subscript. Then {\tt
+a@} would refer to an element of the array {\tt a[]}. Note that
+\verb|@| is a suffix parameter, not an expr parameter, so an expression
+like {\tt @+1} would be illegal. The only way to get at the numeric
+values of subscripts in a suffix parameter\index{parameter!suffix} is by
+extracting them from the string returned by the {\tt
+str}\index{str?\texttt{str}}\label{Dstr} operator. This operator takes
+a suffix and returns a string representation of a suffix. Thus {\tt str
+@} would be \verb|"3"| in {\tt a.b3} and \verb|"3.14"| in {\tt a.b3.14}
+or {\tt a.b[3.14]}. Since the syntax for a
+\tdescr{suffix}\index{suffix?\tdescr{suffix}} in Figure~\ref{syvar}
+requires negative subscripts to be in brackets, {\tt str @} returns {\tt
+"[-3]"} in {\tt a.b[-3]}.
+
+The {\tt str} operator is generally for emergency use only. It is
+better to use suffix parameters only as variable names or suffixes. The
+best example of a vardef macro involving suffixes is the {\tt z} macro
+that defines the {\tt z} convention\index{z convention?{\tt z}
+convention}. The definition involves a special token
+\verb|@#|\index{@#?\texttt{@\#}} that refers to the suffix following the
+macro name:
+$$ \hbox{\verb|vardef z@#=(x@#,y@#) enddef;|} $$
+This means that any variable name whose first token is {\tt z} is
+equivalent to a pair of variables whose names are obtained by replacing
+{\tt z} with {\tt x} and~{\tt y}. For instance, {\tt z.a1} calls the
+{\tt z} macro with the suffix parameter \verb|@#| set to {\tt a1}.
+
+In general,
+$$ {\tt vardef}\, \descr{generic variable} \hbox{\verb|@#|} $$
+is an alternative to {\tt vardef} \tdescr{generic variable} that causes the
+MetaPost interpreter
+to look for a suffix following the name given in the macro call and makes this
+available as the \verb|@#| suffix parameter.
+
+To summarize the special features of vardef macros, they allow a broad
+class of macro names as well as macro names followed by a special suffix
+parameter. Furthermore, {\tt begingroup} and {\tt endgroup} are
+automatically added to the \tdescr{replacement text} of a vardef macro.
+Thus using {\tt vardef} instead of {\tt def} to define the {\tt
+joinup}\index{joinup?\texttt{joinup}} macro in Figure~\ref{fig45} would
+have avoided the need to include {\tt begingroup} and {\tt endgroup}
+explicitly in the macro definition.
+
+In fact, most of the macro definitions given in previous examples could
+equally well use {\tt vardef} instead of {\tt def}. It usually does not
+matter very much which you use, but a good general rule is to use {\tt
+vardef} if you intend the macro to be used like a function or a
+subroutine. The following comparison should help in deciding when to
+use {\tt vardef}.
+
+\begin{itemize}
+\item Vardef macros are automatically surrounded by {\tt begingroup}
+and {\tt endgroup}.
+\item The name of a vardef macro can be more than one token long and it can
+contain subscripts.
+\item A vardef macro can have access to the suffix that follows the macro name
+when the macro is called.
+\item When a symbolic token is used in the name of a vardef macro it remains
+a tag\index{tags} and can still be used in other variable names. Thus
+{\tt p5dir} is a legal variable name even though {\tt dir} is a vardef
+macro, but an ordinary macro such as {\tt ...}\index{...?\texttt{...}}
+cannot be used in a variable name. (This is fortunate since {\tt
+z5...z6} is supposed to be a path expression, not an elaborate variable
+name).
+\end{itemize}
+
+
+\subsection{Defining Unary and Binary Macros}
+
+It has been mentioned several times that some of the operators and
+commands discussed so far are actually predefined macros. These include
+unary operators such as {\tt round}\index{round?\texttt{round}} and {\tt
+unitvector}\index{unitvector?\texttt{unitvector}}, statements such as
+{\tt fill}\index{fill?\texttt{fill}} and {\tt
+draw}\index{draw?\texttt{draw}}, and binary operators such as {\tt
+dotprod}\index{dotprod?\texttt{dotprod}} and {\tt
+intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}.
+The main difference between these macros and the ones we already know
+how to define is their argument syntax.
+
+The {\tt round} and {\tt unitvector} macros are examples of what
+Figure~\ref{syexpr} calls \tdescr{unary op}. That is, they are followed
+by a primary expression. To specify a macro argument of this type, the
+macro definition should look like this:
+$$ \hbox{\tt vardef round primary u =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+The {\tt u} parameter is an expr parameter\index{parameter!expr} and it can be
+used exactly like the expr parameter defined using the ordinary
+$$ \hbox{\tt (expr u)} $$
+syntax.
+
+As the {\tt round} example suggests, a macro can be defined to take a
+\tdescr{secondary}\index{secondary?\tdescr{secondary}},
+\tdescr{tertiary}\index{tertiary?\tdescr{tertiary}}, or an
+\tdescr{expression}\index{expression?\tdescr{expression}} parameter.
+For example, the predefined definition of the {\tt fill} macro is
+roughly\index{fill?\texttt{fill}}
+$$ \hbox{\tt def fill expr c = addto currentpicture contour c enddef;} $$
+
+It is even possible to define a macro to play the role of \tdescr{of
+operator}\index{of operator?\tdescr{of operator}} in
+Figure~\ref{syexpr}. For example, the {\tt direction
+of}\index{direction of?\texttt{direction of}} macro has a definition of
+this form:
+$$ \hbox{\tt vardef direction expr t of p =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+
+Macros can also be defined to behave like binary operators. For instance, the
+definition of the {\tt dotprod} macro has the
+form\index{dotprod?\texttt{dotprod}}\index{primarydef?\texttt{primarydef}}
+$$ \hbox{\tt primarydef w dotprod z =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+This makes {\tt dotprod} a \tdescr{primary binop}\index{primary
+binop?\tdescr{primary binop}}. Similarly, {\tt
+secondarydef}\index{secondarydef?\texttt{secondarydef}} and {\tt
+tertiarydef}\index{tertiarydef?\texttt{tertiarydef}} introduce
+\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}}
+and \tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary
+binop}} definitions. These all define ordinary macros, not vardef
+macros; e.g., there is no ``{\tt primaryvardef}.''
+
+Thus macro definitions can be introduced by {\tt def}, {\tt vardef},
+{\tt primarydef}, {\tt secondarydef}, or {\tt tertiarydef}. A
+\tdescr{replacement text}\index{replacement text?\tdescr{replacement
+text}} is any list of tokens that is balanced with respect to {\tt
+def}-{\tt enddef} pairs where all five macro definition tokens are
+treated like {\tt def} for the purpose of {\tt def}-{\tt enddef}
+matching.
+
+The rest of the syntax for macro definitions is summarized in
+Figure~\ref{symacro}. The syntax contains a few surprises. The macro
+parameters can have a \tdescr{delimited part} and an \tdescr{undelimited
+part}. Normally, one of these is \tdescr{empty}, but it is possible to
+have both parts nonempty:
+$$ \hbox{\tt def foo(text a) expr b =}\, \descr{replacement text}\,
+ \hbox{\tt enddef;}
+$$
+This defines a macro {\tt foo} to take a text parameter in parentheses followed
+by an expression.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{macro definition} \rightarrow
+ \descr{macro heading} \hbox{\tt =} \descr{replacement text}\, enddef$\\
+$\tt \descr{macro heading} \rightarrow def\, \descr{symbolic token}
+ \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{generic variable} \descr{delimited part}
+ \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{generic variable} \hbox{\tt @\#}
+ \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{binary def} \descr{parameter}
+ \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{delimited part}
+ \hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\;
+ \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr\, \descr{parameter}\, of\, \descr{parameter}$\\
+$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\;
+ tertiary$\\
+$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\;
+ tertiatydef$
+\end{ctabbing}
+\caption{The syntax for macro definitions}
+\label{symacro}
+\end{figure}
+
+The syntax also allows the \tdescr{undelimited part} to specify an
+argument type of {\tt suffix}\index{suffix?\texttt{suffix}} or {\tt
+text}\index{text?\texttt{text}}. An example of a macro with an
+undelimited suffix parameter\index{parameter!suffix} is the predefined
+macro {\tt incr}\index{incr?\texttt{incr}}\label{Dincr} that is actually
+defined like this:
+$$ \hbox{\verb|vardef incr suffix $ = $:=$+1; $ enddef;|} $$
+This makes {\tt incr} a function that takes a variable, increments it,
+and returns the new value. Undelimited suffix parameters may be
+parenthesized, so {\tt incr a} and {\tt incr(a)} are both legal if {\tt
+a} is a numeric variable. There is also a similar predefined macro {\tt
+decr}\index{decr?\texttt{decr}} that subtracts~1.
+
+Undelimited text parameters\index{parameter!text} run to the end of a
+statement. More precisely, an undelimited text parameter is the list of
+tokens following the macro call up to the first ``{\tt
+;}\index{semicolon}'' or ``{\tt
+endgroup}\index{endgroup?\texttt{endgroup}}'' or ``{\tt
+end}\index{end?\texttt{end}}'' except that an argument containing ``{\tt
+begingroup}'' will always include the matching ``{\tt endgroup}.'' An
+example of an undelimited text parameter comes from the predefined macro
+{\tt cutdraw}\index{cutdraw?\texttt{cutdraw}}\label{Dctdraw} whose
+definition is
+roughly\index{linecap?\texttt{linecap}}\index{butt?\texttt{butt}}\index{interim?\texttt{interim}}
+$$\begin{verbatim}
+def cutdraw text t =
+ begingroup interim linecap:=butt; draw t; endgroup enddef;
+\end{verbatim}
+$$
+This makes {\tt cutdraw} synonymous with {\tt draw} except for the {\tt
+linecap} value. (This macro is provided mainly for compatibility with
+\MF\index{metafont?\MF}.)
+
+
+\section{Loops}
+
+Numerous examples in previous sections have used simple {\tt for} loops of the
+form\index{loops}\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+$$ {\tt for}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{expression}\, {\tt upto}\, \descr{expression}:\
+ \descr{loop text}\, {\tt endfor}
+$$
+It is equally simple to construct a loop that counts downward: just
+replace {\tt upto} by {\tt
+downto}\index{downto?\texttt{downto}}\label{Ddwnto} make the second
+\tdescr{expression} smaller than the first. This section covers more
+complicated types of progressions, loops where the loop counter behaves
+like a suffix parameter, and ways of exiting from a loop.
+
+The first generalization is suggested by the fact that {\tt
+upto}\index{upto?\texttt{upto}} is a predefined macro
+for\index{step?\texttt{step}}\index{until?\texttt{until}}
+$$ \hbox{\tt step 1 until} $$
+and {\tt downto}\index{downto?\texttt{downto}} is a macro for {\tt step
+-1 until}. A loop begining
+$$ \hbox{\tt for i=a step b until c} $$
+scans a sequence of {\tt i} values {\tt a}, ${\tt a}+{\tt b}$, ${\tt
+a}+2{\tt b}$, \ldots, stopping before {\tt i} passes {\tt c}; i.e., the
+loop scans {\tt i} values where ${\tt i}\le {\tt c}$ if ${\tt b}>0$ and
+${\tt i}\ge {\tt c}$ if ${\tt b}<0$. For ${\tt b}=0$ the loop never
+terminates, even if ${\tt a}={\tt c}$.
+
+It is best to use this feature only when the step size is an integer or
+some number that can be represented exactly in fixed point
+arithmetic\index{arithmetic} as a multiple of $1\over65536$. Otherwise,
+error will accumulate and the loop index might not reach the expected
+termination value. For instance,
+$$ \hbox{\tt for i=0 step .1 until 1: show i; endfor} $$
+shows ten {\tt i} values the last of which is 0.90005.
+
+The standard way of avoid the problems associated with non-integer step
+sizes is to iterate over integer values and then multiply by a scale
+factor when using the loop index as was done in Figures \ref{fig1}
+and~\ref{fig40}.
+
+Alternatively, the values to iterate over can be given explicitly. Any
+sequence of zero or more expressions separated by commas can be used in
+place of {\tt a step b upto c}. In fact, the expressions need not all
+be the same type and they need not have known values. Thus
+$$ \hbox{\tt for t=3.14, 2.78, (a,2a), "hello": show t; endfor} $$
+shows the four values listed.
+
+Note that the loop body in the above example is a statement followed by a
+semicolon. It is common for the body of a loop to be one or more statements,
+but this need not be the case. A loop is like a macro definition followed by
+calls to the macro. The loop body can be virtually any sequence of tokens as
+long as they make sense together. Thus, the (ridiculous) statement
+$$ \hbox{\verb|draw for p=(3,1),(6,2),(7,5),(4,6),(1,3): p-- endfor cycle;|} $$
+is equivalent to
+$$ \hbox{\verb|draw (3,1)--(6,2)--(7,5)--(4,6)--(1,3)--cycle;|} $$
+(See Figure~\ref{fig17} for a more realistic example of this.)
+
+If a loop is like a macro definition, the loop index is like an expr
+parameter\index{parameter!expr}. It can represent any value, but it is
+not a variable and it cannot be changed by an assignment
+statement\index{assignment}. In order to do that, you need a {\tt
+forsuffixes}\index{forsuffixes?\texttt{forsuffixes}} loop. A {\tt
+forsuffixes} loop is a lot like a {\tt for} loop, except the loop index
+behaves like a suffix parameter\index{parameter!suffix}. The syntax is
+$$ {\tt forsuffixes}\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{suffix list}:\ \descr{loop text}\, {\tt endfor}
+$$
+where a \tdescr{suffix list} is a comma-separated list of suffixes. If
+some of the suffixes are \tdescr{empty}, the \tdescr{loop text} gets
+executed with the loop index parameter set to the empty suffix.
+
+A good example of a {\tt forsuffixes} loop is the definition of the {\tt
+dotlabels}\index{dotlabels?\texttt{dotlabels}}
+macro\index{str?\texttt{str}}:
+$$\begin{verbatim}
+vardef dotlabels@#(text t) =
+ forsuffixes $=t: dotlabel@#(str$,z$); endfor enddef;
+\end{verbatim}
+$$
+This should make it clear why the parameter to {\tt dotlabels} has to be a
+comma-separated list of suffixes. Most macros that accept variable-length
+comma-separated lists
+use them in {\tt for} or {\tt forsuffixes} loops in this fashion as values to
+iterate over.
+
+When there are no values to iterate over, you can use a
+{\tt forever}\index{forever?\texttt{forever}} loop:
+$$ {\tt forever}\hbox{\tt :}\, \descr{loop text}\, {\tt endfor} $$
+To terminate such a loop when a boolean condition becomes true, use an exit
+clause\index{exitif?\texttt{exitif}}:
+$$ {\tt exitif}\, \descr{boolean expression} \hbox{\tt ;} $$
+When the MetaPost interpreter encounters an exit clause, it evaluates
+the \tdescr{boolean expression} and exits the current loop if the
+expression is true. If it is more convenient to exit the loop when an
+expression becomes false, use the predefined macro {\tt
+exitunless}\index{exitunless?\texttt{exitunless}}.
+
+Thus MetaPost's version of a {\bf while} loop is
+$$ \hbox{\tt forever: exitunless}\, \descr{boolean expression} \hbox{\tt ;}\,
+ \descr{loop text}\, {\tt endfor}
+$$
+The exit clause could equally well come just before {\tt endfor} or anywhere
+in the \tdescr{loop text}. In fact any {\tt for}, {\tt forever}, or
+{\tt forsuffixes} loop can contain any number of exit clauses.
+
+The summary of loop syntax shown in Figure~\ref{syloop} does not mention
+exit clauses explicitly because a \tdescr{loop text} can be virtually
+any sequence of tokens. The only restriction is that a \tdescr{loop
+text} must be balanced with respect to {\tt for} and {\tt endfor}. Of
+course this balancing process treats {\tt forsuffixes} and {\tt forever}
+just like {\tt for}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :}\,
+ \descr{loop text} endfor$\\
+$\tt \descr{loop header} \rightarrow for\, \descr{symbolic token}\,
+ \hbox{\tt =}\, \descr{progression}$\\
+$\tt \qquad \;|\; for\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{for list}$\\
+$\tt \qquad \;|\; forsuffixes\, \descr{symbolic token}\, \hbox{\tt =}\,
+ \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+$\tt \descr{progression} \rightarrow \descr{numeric expression}\, upto\,
+ \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression}\, downto\,
+ \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{numeric expression}\, step\,
+ \descr{numeric expression}\, until\, \descr{numeric expression} $\\
+$\tt \descr{for list} \rightarrow \descr{expression}
+ \;|\; \descr{for list}\hbox{\tt ,}\, \descr{expression}$\\
+$\tt \descr{suffix list} \rightarrow \descr{suffix}
+ \;|\; \descr{suffix list}\hbox{\tt ,}\, \descr{suffix}$
+\end{ctabbing}
+\caption{The syntax for loops}
+\label{syloop}
+\end{figure}
+
+
+\section{Reading and Writing Files}
+File access was one of the new language features introduced in version~0.60
+of the MetaPost language. A new operator
+$$ {\tt readfrom}\ \descr{file name} $$\index{readfrom?\texttt{readfrom}}\label{Dreadfrom}%
+returns a string giving the next line of input from the named
+file\index{files!reading}. The \tdescr{file name} can be any primary
+expression of type string. If the file has ended or cannot be read, the
+result is a string consisting of a single null character. The preloaded
+{\tt plain} macro package introduces the name
+{\tt EOF}\index{EOF?\texttt{EOF}}\label{Deof} for this string. After
+{\tt readfrom} has returned {\tt EOF}, additional reads from the same file
+cause the file to be reread from the start.
+
+All files opened by \ttt{readfrom} that have not completely been read
+yet are closed\index{files!closing} automatically when the program
+terminates, but there exists a command
+$${\tt closefrom}\ \descr{file name}$$%
+\index{closefrom?\texttt{closefrom}}\label{Dclosefrom}%
+to close files opened by {\tt readfrom} explicitly. It is wise to
+manually close files you do not need to read completely (i.e. until {\tt
+ EOF} is returned) because otherwise such files will continue to use
+internal resources and perhaps cause a \ttt{capacity exceeded!} error.
+
+The opposite of {\tt readfrom} is the command
+$$ {\tt write}\ \descr{string expression}\ {\tt to}\ \descr{file name} $$%
+\index{write to?\texttt{write to}}\label{Dwrite}%
+This writes\index{files!writing} a line of text to the specified output file,
+opening the file first if necessary. All such files are
+closed\index{files!closing} automatically when the program terminates. They
+can also be closed explicitly by using {\tt EOF}\index{EOF?\texttt{EOF}}
+as the \tdescr{string expression}. The only way to tell if a {\tt write}
+command has succeeded is to close the file and use {\tt readfrom} to look
+at it.
+
+
+\section{Utility Routines}
+
+\index{utility routines}
+\index{mplib?\texttt{mplib}}
+\index{metapost/base?\texttt{metapost/base}}
+
+This section describes some of the utility routines included in the
+\texttt{mplib} directory of the development source hierarchy. Future
+versions of this documentation may include more; meanwhile, please read
+the source files, most have explanatory comments at the top. They are
+also included in the MetaPost and larger \TeX\ distributions, typically
+in a \texttt{texmf/metapost/base} directory.
+
+
+\subsection{\texttt{TEX.mp}}
+
+\label{dTEX}
+\index{TEX.mp?\texttt{TEX.mp}}
+\index{labels, with variable text}
+\index{string expressions, as labels}
+
+\texttt{TEX.mp} provides a way to typeset the text of a MetaPost string
+expression. Suppose, for example, you need labels of the form $n_0$,
+$n_1$, \ldots, $n_{10}$ across the $x$ axis. You can do this (relatively)
+conveniently with \texttt{TEX.mp}, as follows:
+$$\begin{verbatim}
+input TEX;
+beginfig(100)
+ last := 10;
+ for i := 0 upto last:
+ label(TEX("$n_{" & decimal(i) & "}$"), (5mm*i,0));
+ endfor
+ ...
+endfig;
+\end{verbatim}
+$$
+In contrast, the basic \texttt{btex} command (see p.\ \pageref{Dbtex})
+typesets verbatim text. That is, \texttt{btex~s~etex} typesets the
+literal character `s'; \texttt{TEX(s)} typesets the value of the
+MetaPost text variable~$s$.
+
+\index{LaTeX?\LaTeX!typesetting labels with} In version 0.9,
+\texttt{TEX.mp} acquired two additional routines to facilitate using
+\LaTeX\ to typeset labels: \texttt{TEXPRE} and \texttt{TEXPOST}. Their
+values are remembered, and included before and after (respectively) each
+call to \texttt{TEX}. Otherwise, each \texttt{TEX} call is effectively
+typeset independently. \texttt{TEX} calls also do not interfere with
+uses of {\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}} (p.\
+\pageref{Dverbatimtex}).
+
+Here's the same example as above, using the \LaTeX\ commands \verb|\(|
+and \verb|\)|:
+
+$$\begin{verbatim}
+input TEX;
+TEXPRE("%&latex" & char(10) & "\documentclass{article}\begin{document}");
+TEXPOST("\end{document}");
+beginfig(100)
+ last := 10;
+ for i := 0 upto last:
+ label(TEX("\( n_{" & decimal(i) & "} \)"), (5mm*i,0));
+ endfor
+ ...
+endfig;
+\end{verbatim}
+$$
+Explanation:
+\begin{itemize}
+
+\item
+The \texttt{\%\&latex}\index{\%?\texttt{\%}!magic comment!\%\&?\texttt{\%\&}} causes \LaTeX\ to be invoked instead of \TeX.
+(See below, also.) Web2C- and MiKTeX-based \TeX\ implementations, at
+least, understand this \texttt{\%\&} specification; see, e.g., the Web2C
+documentation for details, \url{http://tug.org/web2c}. (Information on
+how to do the same with other systems would be most welcome.)
+
+\item
+The \texttt{char(10)} puts a newline (ASCII character code 10, decimal)
+in the output.
+
+\item
+The \verb|\documentclass...| is the usual way to start a \LaTeX\
+document.
+
+\item
+The \verb|TEXPOST("\end{document}")| is not strictly necessary, due to
+the behavior of \texttt{mpto}, but it is safer to include it.
+
+\end{itemize}
+
+Unfortunately, \TeX\ \verb|\special| instructions vanish in this
+process. So it is not possible to use packages such as \texttt{xcolor}
+and \texttt{hyperref}.
+
+In case you're curious, these routines are implemented very simply: they
+write \texttt{btex} commands to a temporary file and then use
+\texttt{scantokens} (p.\ \pageref{Dscantokens}) to process it. The
+\texttt{makempx} mechanism (p.\ \pageref{Dmakempx}) does all the work of
+running \TeX.
+
+The \verb|%&| magic on the first line is not the only way to specify
+invoking a different program than (plain) \TeX. It has the advantage of
+maximum flexibility: different \texttt{TEX} constructs can use different
+\TeX\ processors. But at least two other methods are possible:
+
+\begin{itemize}
+\item Set the environment variable \texttt{TEX} to \texttt{latex}---or
+whatever processor you want to invoke. (To handle \ConTeXt\ fragments,
+\ttt{texexec} could be used.) This might be convenient when writing a
+script, or working on a project that always requires \texttt{latex}.
+
+\item Invoke MetaPost with the command-line option \ttt{-tex=latex} (or
+whatever processor, of course). This might be useful from a Makefile,
+or just a one-off run.
+\end{itemize}
+
+
+\section{Another Look at the MetaPost Workflow}
+\label{workflow2}
+
+\index{workflow}
+
+In Section~\ref{workflow} we already had a brief look at how MetaPost
+compiles input files and generates output files. This section contains
+some more information and discusses internal variables that can be used
+to control MetaPost's run-time behavior, previewing PostScript output,
+debugging MetaPost code, and importing MetaPost graphics into
+third-party applications.
+
+\subsection{Customizing Run-Time Behavior}
+
+\index{runtime behavior!customize}
+
+MetaPost knows and obeys a number of internal\index{internal
+ variables}\index{variables!internal} variables that have no direct
+impact on drawing commands, but can be used to customize the way the
+MetaPost compiler processes input files. The following paragraphs
+describe those variables (in no particular order).
+
+\paragraph{Date and Time}
+
+MetaPost provides a number of internal numeric variables that store the
+date and time a job was started, i.e., the MetaPost executable was
+called on the command-line. Variables
+\texttt{year}\index{year?\texttt{year}}\label{Dyear},
+\texttt{month}\index{month?\texttt{month}}\label{Dmonth},
+\texttt{day}\index{day?\texttt{day}}\label{Dday},
+\texttt{hour}\index{hour?\texttt{hour}}\label{Dhour}, and
+\texttt{minute}\index{minute?\texttt{minute}}\label{Dminute} should be
+self-explanatory. Variable
+\texttt{time}\index{time?\texttt{time}}\label{Dtime} returns the number
+of minutes past midnight, since the job was started, i.e.,
+$\texttt{time} = 60*\texttt{hour} + \texttt{minute}$.
+
+\paragraph{Output File Names}
+
+As discussed in Section~\ref{workflow}, by default, every
+\verb|beginfig| \ldots\ \verb|endfig| group in an input file corresponds
+to an output file that follows the naming scheme
+\texttt{\tdescr{jobname}.\tdescr{n}}. That is, all files have varying
+numeric file extensions. MetaPost provides a template mechanism that
+allows for more flexible output file names. The template mechanism uses
+\texttt{printf}-style escape sequences that are re-evaluated at ship-out
+time, i.e., before each figure is written to disk.
+
+To configure the output file naming scheme a string containing the
+corresponding escape sequences has to be assigned to the internal string
+variable
+\verb|outputtemplate|\index{outputtemplate?\texttt{outputtemplate}}\label{Doutputtemplate}.
+The escape sequences provided are listed in
+table~\ref{tab:outputtemplate}. As an example, if this code is saved in
+a file \texttt{fig.mp},
+$$
+\begin{verbatim}
+outputtemplate := "%j-%c.mps";
+beginfig(1);
+ drawdot origin;
+endfig;
+end
+\end{verbatim}
+$$
+it will create the output file \texttt{fig-1.mps} instead of
+\texttt{fig.1}. The file extension \texttt{mps}\index{mps file?{\tt
+ mps} file}\index{files!mps?{\tt mps}} is conventionally chosen for
+MetaPost's PostScript output (see Section~\ref{mpimport}). For SVG and
+PNG output one would want to use file extensions \texttt{svg}\index{svg
+ file?{\tt svg} file}\index{files!svg?{\tt svg}} and
+\texttt{png}\index{png file?{\tt png} file}\index{files!png?{\tt png}}
+instead.
+
+\begin{table}
+ \centering
+ \begin{tabular}{|>{\ttfamily}l|l|>{\ttfamily}l|}
+ \hline
+ \multicolumn1{|c|}{Escape sequence} & \multicolumn1{c|}{Meaning} & \multicolumn1{c|}{Alternative}\\\hline
+ \%\%\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%\%?\texttt{\%\%}} & percent sign &\\
+ \%\{\tdescr{internal variable}\}\index{\%?\texttt{\%}!outputtemplate
+ escape sequence?\texttt{outputtemplate} escape sequence!\%\{...\}?\texttt{\%\{\tdescr{internal variable}\}}} & evaluate internal variable &\\
+ \%j\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%j?\texttt{\%j}} & current jobname & \%\{jobname\}\\
+ \%c\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%c?\texttt{\%c}} & charcode value (\texttt{beginfig} argument) & \%\{charcode\}\\
+ \%y\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%y?\texttt{\%y}} & current year & \%\{year\}\\
+ \%m\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%m?\texttt{\%m}} & month (numeric) & \%\{month\}\\
+ \%d\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%d?\texttt{\%d}} & day of the month & \%\{day\}\\
+ \%H\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%H?\texttt{\%H}} & hour & \%\{hour\}\\
+ \%M\index{\%?\texttt{\%}!outputtemplate escape sequence?\texttt{outputtemplate} escape sequence!\%M?\texttt{\%M}} & minute & \%\{minute\}\\
+ \hline
+ \end{tabular}
+ \caption{Allowed escape sequences for \ttt{outputtemplate}}
+ \label{tab:outputtemplate}
+\end{table}
+
+In single-letter escape sequences referring to internal numerics, the
+corresponding value is rounded to the nearest integer before it is
+converted to a string expression. In such escape sequences, a number
+from the range 0 to~99 can optionally be placed directly after \verb|%|
+that determines the minimum number of digits in the resulting string
+expression, like \verb|%2m|. If the decimal representation of the
+internal variable requires more digits, actual string length will exceed
+the requested length. If less digits are required, the string is padded
+to the requested length with zeros from left.
+
+In single-letter escape sequences referring to internal string
+variables, like \verb|%j|, and in the \verb|%{...}| escape sequence,
+neither rounding nor zero-padding take place.
+
+For backwards compatibility, the
+\verb|%c|\index{\%?\texttt{\%}!outputtemplate escape
+ sequence?\texttt{outputtemplate} escape sequence!\%c?\texttt{\%c}}
+escape sequence is handled special. If the result of rounding the
+charcode value is negative, \verb|%c| evaluates to the string \verb|ps|.
+This transformation can be bypassed by using \verb|%{charcode}| instead
+of \verb|%c|. But note, that this bypasses rounding and zero-padding as
+well.
+
+The template mechanism can also be used for naming graphic files
+individually, yet keeping all sources in one file. Collecting, e.g.,
+different diagram sources in a single file \texttt{fig.mp}, it might be
+easier to recall the correct diagram names in a \TeX\ document than with
+numbered file names. Note, the argument to \verb|beginfig| is not
+relevant as long as there's no \verb|%c| pattern in the file name
+template string.
+$$
+\begin{verbatim}
+outputtemplate := "fig-quality.mps";
+beginfig(1);
+ ...
+endfig;
+
+outputtemplate := "fig-cost-vs-productivity.mps";
+beginfig(2);
+ ...
+endfig;
+\end{verbatim}
+$$
+
+To ensure compatibility with older files, the default value of
+\verb|outputtemplate| is \verb|%j.%c|. If you assign an empty string,
+it will revert to that default. MetaPost versions~1.000 to~1.102 used a
+different template mechanism, see Section~\ref{Dfilenametemplate} for
+more information.
+
+During \texttt{shipout}\index{shipout?\texttt{shipout}}, the name of the
+output file to be written is stored in an internal string variable
+\texttt{outputfilename}\index{outputfilename?\texttt{outputfilename}}\label{Doutputfilename}.
+It remains available until the next \texttt{shipout} command. The
+variable is initially empty.
+
+\paragraph{Output Format}
+
+MetaPost can generate graphics in three output formats:
+
+\begin{itemize}
+\item Encapsulated PostScript\index{PostScript!structured}
+ (EPSF\index{EPSF}),
+\item Scalable Vector Graphics (SVG\index{SVG}) following version~1.1 of
+ the SVG specification~\cite{w3c:svg1.1} (since MetaPost version
+ 1.200),
+\item Portable Network Graphics (PNG), a losslessly compressing bitmap
+ format (since MetaPost version 1.800).
+\end{itemize}
+By default, MetaPost outputs PostScript files---hence the name MetaPost.
+The output format can be changed by assigning values \verb|"svg"| or
+\verb|"png"| to the internal string variable\index{internal
+ variables}\index{variables!internal}
+\verb|outputformat|\index{outputformat?\texttt{outputformat}}\label{Doutputformat}:
+$$
+\begin{verbatim}
+outputformat := "svg";
+\end{verbatim}
+$$
+Other values make MetaPost fall back to PostScript output. Variable
+\verb|outputformat| is case-sensitive, so assigning it the string
+\verb|"SVG"| enables PostScript output, too. Default value of variable
+\verb|outputformat| is \verb|"eps"|.
+
+\paragraph{Bitmap output} To create bitmap output in the PNG format,
+MetaPost utilizes the Cairo\index{Cairo} \cite{lib:cairo} graphics
+library.\footnote{The Cairo library version is printed when MetaPost is
+ run with the \texttt{-version} command-line switch.} Bitmap
+conversion can be controlled from within MetaPost using three internal
+variables: \texttt{outputformatoptions}, \texttt{hppp}, and
+\texttt{vppp}.
+
+\begin{table}
+ \centering
+ \begin{tabular}{|>{\ttfamily}l|>{\ttfamily}l|l|}
+ \hline
+ \multicolumn1{|c|}{Key} & \multicolumn1{c|}{Values} & \multicolumn1{c|}{Meaning}\\\hline
+ format &
+ rgba\index{rgba?\texttt{rgba}|see{\texttt{outputformatoptions},
+ \texttt{format}}} & RGB color space\index{PNG!color space!RGBA}
+ with alpha channel\index{PNG!alpha channel}\\
+ & rgb\index{rgb?\texttt{rgb}|see{\texttt{outputformatoptions},
+ \texttt{format}}} & RGB color space\index{PNG!color space!RGB}\\
+ & graya\index{graya?\texttt{graya}|see{\texttt{outputformatoptions},
+ \texttt{format}}} & gray scale color space\index{PNG!color
+ space!gray scale with alpha} with alpha channel\index{PNG!alpha
+ channel}\\
+ & gray\index{gray?\texttt{gray}|see{\texttt{outputformatoptions},
+ \texttt{format}}} & gray scale color space\index{PNG!color
+ space!gray scale}\\
+ \hline
+ antialias &
+ none\index{none?\texttt{none}|see{\texttt{outputformatoptions},
+ \texttt{antialias}}} & no anti aliasing\index{PNG!anti
+ aliasing}\\
+ & fast\index{fast?\texttt{fast}|see{\texttt{outputformatoptions},
+ \texttt{antialias}}} & fastest anti aliasing algorithm\\
+ & good\index{good?\texttt{good}|see{\texttt{outputformatoptions},
+ \texttt{antialias}}} & better quality, but slower\\
+ & best\index{best?\texttt{best}|see{\texttt{outputformatoptions},
+ \texttt{antialias}}} & best quality, slowest\\
+ \hline
+ \end{tabular}
+ \caption{Valid keys and values in variable \texttt{outputformatoptions}.}
+ \label{tab:outputformatoptions}
+\end{table}
+
+Variable
+\texttt{outputformatoptions}\index{outputformatoptions?\texttt{outputformatoptions}}\label{Doutputformatoptions}
+is a string containing a list of \tdescr{key}\verb|=|\tdescr{value}
+pairs separated by spaces (no other spaces are allowed). Key
+\texttt{format}\index{format?\texttt{format}|see{outputformatoptions,
+ \texttt{format}}}\index{outputformatoptions?\texttt{outputformatoptions}!format?\texttt{format}}
+determines color space of the written PNG file. Key
+\texttt{antialias}\index{antialias?\texttt{antialias}|see{outputformatoptions,
+ \texttt{antialias}}}\index{outputformatoptions?\texttt{outputformatoptions}!antialias?\texttt{antialias}}
+determines what level of anti aliasing\index{anti aliasing|see{PNG, anti
+ aliasing}}\index{PNG!anti aliasing} is applied during vector graphic
+to bitmap conversion. The set of accepted values and their meanings can
+be found in table~\ref{tab:outputformatoptions}. An assignment that
+would match the compiled-in default setup would look like
+
+$$
+\begin{verbatim}
+outputformatoptions := "format=rgba antialias=fast";
+\end{verbatim}
+$$
+Keys not given in an assignment to \texttt{outputformatoptions} are
+reset to their default value. By default, this variable is empty.
+
+PNG files have a transparent background\index{background in PNG output}
+if output color space provides an alpha channel\index{alpha
+ channel|see{PNG, alpha channel}}\index{PNG!alpha channel}
+(\texttt{format}\index{outputformatoptions?\texttt{outputformatoptions}!format?\texttt{format}}
+is \texttt{rgba} or \texttt{graya}). Otherwise background becomes
+white. Color channels have a bit-depth of~8 in output. Colors not
+supported by the output format, e.g., CMYK colors, are transformed to a
+color with a similar visual impression. Here's how colors are
+transformed during bitmap conversion. Let's recall that color
+components in a MetaPost picture are in the range $[0;1]$ (see the
+discussion of color types in Section~\ref{datatypes}). Whatever input
+and output color spaces are used, all colors found in a picture are
+initially converted to RGB color space. A gray scale color with
+intensity $i$ is converted to an RGB color with all components set
+to~$i$. RGB colors are left unchanged. A CMYK color with components
+$(c,m,y,k)$ is converted to an RGB color with components $(r,g,b)$ using
+equations
+\begin{eqnarray}
+ r &=& 1 - k - c\\
+ g &=& 1 - k - m\\
+ b &=& 1 - k - y
+\end{eqnarray}
+with results clipped to the range $[0;1]$. If requested by the output
+format (\texttt{gray} or \texttt{graya}), such a color is further
+converted to a gray color with intensity
+\begin{eqnarray}
+j = 0.2126 \cdot r + 0.7152 \cdot g + 0.0722 \cdot b
+\end{eqnarray}
+
+Note, colors are exact in PNG output if input and output color spaces
+are compatible, i.e., both are RGB or gray scale or output in RGB color
+space contains only gray scale colors. Users that care about color
+conversion can apply the necessary transformations explicitly in a
+\texttt{for within~\tdescr{\mbox{picture}}}\index{for within?\texttt{for
+ within}} loop inside
+\texttt{extra\_endfig}\index{extra_endfig?\texttt{extra\_endfig}} (see
+Section~\ref{Dforwithin} and Appendix~\ref{Dxefig}). MetaPost has no
+built-in color management support. The built-in conversions are
+provided just as a convenience.
+
+Resolution of PNG output is always 72~dpi\index{dpi}\index{units!dpi}
+(dots per inch). Two internal variables
+\texttt{hppp}\index{hppp?\texttt{hppp}}\label{Dhppp} and
+\texttt{vppp}\index{vppp?\texttt{vppp}}\label{Dvppp} are used by the PNG
+backend to decide on the scale of the generated bitmap. These two
+variables have already been present in \MF\ and have been revived when
+MetaPost acquired the bitmap backend in version 1.800. But there's a
+catch: In \MF, variables \texttt{hppp} and \texttt{vppp} refer to
+horizontal and vertical scale in \emph{pixels per
+ point}\index{units!pixels per point} and values larger than~1 result
+in output of larger dimensions. In MetaPost, the meaning of both
+variables is the other way around. They refer to horizontal and
+vertical scale in \emph{points per pixel}\index{units!points per pixel}
+and values larger than~1 result in output of smaller dimensions.
+Default value for both variables is $1.0$, i.e., one MetaPost point per
+pixel.
+
+\paragraph{PostScript Dictionary}
+
+For PostScript output, MetaPost can define a dictionary of abbreviations
+of the PostScript commands, e.g., \verb|l| instead of \verb|lineto|, to
+reduce the size of output files. Setting the internal variable
+\texttt{mpprocset}\index{mpprocset?\texttt{mpprocset}}\label{Dmpprocset}
+to~1 makes MetaPost create an extended preamble setting-up the
+dictionary. Default value of variable \texttt{mpprocset} is~0, that is,
+no dictionary is used. For SVG and PNG output, variable
+\texttt{mpprocset} is not relevant.
+
+\paragraph{Version Number}
+
+The version number of the MetaPost compiler can be determined from
+within a MetaPost program via the predefined constant string
+\texttt{mpversion}\index{mpversion?\texttt{mpversion}}\label{Dmpversion}
+(since version~0.9). For instance the following code
+$$
+\begin{verbatim}
+message "mp = " & mpversion;
+\end{verbatim}
+$$
+writes
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+mp = \mpversion
+\end{verbatim}
+$$
+to the console and the transcript file. Variable \texttt{mpversion} can
+be used to execute code depending on the MetaPost version like this:
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+if unknown mpversion: string mpversion; mpversion := "0.000"; fi
+if scantokens(mpversion) < 1.200:
+ errmessage "MetaPost v1.200 or later required (found v" & mpversion & ")";
+else:
+ \tdescr{code}
+fi
+\end{verbatim}
+$$
+The first line is optional and only added to handle ancient MetaPost
+versions gracefully that don't even know about variable
+\textrm{mpversion} (prior to v0.9). The second test does the actual
+work.
+
+The version number is also written to output files and the transcript
+file. For PostScript output, the version number can be found in the
+\texttt{Creator}\index{Creator comment in PostScript
+ output?\texttt{Creator} comment in PostScript output|see{PostScript,
+ \texttt{Creator} comment}}\index{PostScript!Creator
+ comment?\texttt{Creator} comment} comment. SVG files contain a simple
+comment line near the beginning of the file. For PNG output, the
+version number can be found in a text chunk with keyword
+\texttt{Software}\index{Software keyword in PNG text
+ chunk?\texttt{Software} keyword in PNG text chunk|see{PNG, text
+ chunk}}\index{text chunk|see{PNG, text chunk}}\index{PNG!text
+ chunk}. The transcript\index{files!transcript} file starts with a
+banner line that identifies the version\index{version number} of the
+MetaPost compiler.
+
+\subsection{Previewing PostScript Output}
+\label{preview}
+\index{preview!PostScript}
+
+Previewing MetaPost's PostScript output is not difficult, but there are
+some catches that one should know about. This section deals with the
+following questions: How can graphics be clipped to their true bounding
+box in the PostScript viewer application? Why are my text labels
+rendered with an ugly font (or not at all) and how to avoid that? How
+can several graphics be combined into a multi-page document that can be
+previewed within one instance of the viewer application?
+
+\subsubsection{Bounding Box}
+\index{bounding box}
+\index{PostScript!bounding box}
+
+With default settings, MetaPost writes very much stripped-down
+PostScript code, containing only the bare graphics code, but no other
+ressources, like fonts etc. The PostScript code is somewhat deficient,
+because it fails to correctly identify as Encapsulated PostScript
+(EPSF\index{EPSF}) in the header. Note, Encapsulated PostScript files
+don't have an associated page size, but provide bounding box
+information, because they are meant for inclusion into other documents.
+Instead MetaPost output wrongly pretends to be full PostScript
+(PS\index{PS}), which it is not.
+
+This is just fine for including MetaPost graphics in, say, \TeX\
+documents (see Section~\ref{mpimport}), but some PostScript viewers have
+difficulties rendering those PostScript files correctly. As an example,
+because of the wrong ``PS'' header, GSview\index{GSview}---not knowing
+better---ignores bounding box information and then clips all contents to
+a (configurable) page size. Graphic elements laying outside those fixed
+page boundaries are therefore not visible, e.g., when they have negative
+coordinates.
+
+To avoid such situations, the first rule when previewing MetaPost's
+PostScript output is to put the line
+$$
+\begin{verbatim}
+prologues := 2;
+\end{verbatim}
+\index{prologues?\texttt{prologues}}
+$$
+before the first \verb|beginfig| in MetaPost input files (see the
+discussion about \texttt{prologues} in Section~\ref{Dprologues}). That
+way, MetaPost's PostScript output correctly identifies as Encapsulated
+PostScript and viewer applications should always obey the file's
+bounding box for on-screen rendering.
+
+A workaround for MetaPost's deficient default PostScript code that can
+sometimes be seen is to move the lower left corner of a figure to the
+origin as a last operation by saying
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+\color{gray}currentpicture := currentpicture shifted -llcorner currentpicture;
+\end{verbatim}
+\index{currentpicture?\texttt{currentpicture}}
+\index{llcorner?\texttt{llcorner}}
+$$
+before \verb|endfig|. But this doesn't prevent from clipping on the
+right and upper page boundaries. Additionally, the line is required for
+all figures, cluttering source code, and it alters all coordinates in
+PostScript output, which might complicate debugging. Applying such a
+manual transformation is therefore not recommended (which is why the
+line is grayed out). Instead, users are advised to adjust
+\texttt{prologues} once in the preamble of the input file and enable
+clipping to the bounding box in the PostScript viewer. For
+GSview\index{GSview}, that can be done by activating \texttt{Options}
+$\rightarrow$ \texttt{EPS Clip} and optionally \texttt{Options}
+$\rightarrow$ \texttt{Show Bounding Box} for verification.
+
+\subsubsection{Text Labels}
+
+Another popular previewing issue concerns graphics that contain text
+labels. An observation MetaPost users can often make is that text
+labels in graphics are rendered with wrong fonts, wrong glyphs, and
+sometimes even not at all. The reason is that with default settings,
+again, MetaPost's PostScript output is deficient, in that it uses a
+simple, non-standard way to declare what fonts are used in a graphic.
+Setting variable \texttt{prologues} to~2, as shown in the previous
+section, makes MetaPost generate more complex PostScript code to declare
+all needed PostScript\index{PostScript!fonts} fonts and embed the
+necessary encoding information. If the PostScript viewer can provide
+the requested fonts, this might be sufficient to get text labels
+rendered correctly. If you still observe wrong or missing glyphs you
+should put the line
+$$
+\begin{verbatim}
+prologues := 3;
+\end{verbatim}
+\index{prologues?\texttt{prologues}}
+$$
+into the preamble of the input file. That way, MetaPost embeds the used
+PostScript\index{PostScript!fonts} fonts into the output file so that
+they are always available (see the discussion about \texttt{prologues}
+in Section~\ref{Dprologues}). Note, this might enlarge the size of
+output files considerably. Additionally, fonts might be embedded
+multiple times when several graphics using the same fonts are included
+into a document. For that reason, it is recommended to reset variable
+\texttt{prologues} to~0 before finally including MetaPost graphics into
+external documents.
+
+\subsubsection{Proof Sheets}
+\index{proof sheets}
+
+If you have lots of figures in a source file and need to preview many of
+them at the same time, opening every graphic in a new instance of the
+viewer application and switching between them back and forth can get
+cumbersom. An alternative is to collect all graphics generated from a
+MetaPost input file in a proof sheet, a multi-page document, that can be
+previewed and navigated in a single instance of the viewer application.
+The MetaPost distribution contains two (plain) \TeX\ scripts,
+\texttt{mproof.tex} and \texttt{mpsproof.tex}, that help with the latter
+approach.
+
+\paragraph{\texttt{mproof.tex}}
+\index{mproof.tex?\texttt{mproof.tex}}
+
+To write a proof sheet for MetaPost output, call \texttt{mproof.tex} as
+$$
+\begin{verbatim}[commandchars=\\\{\}]
+tex mproof \tdescr{MetaPost output files}
+\end{verbatim}
+$$
+Then process the resulting \texttt{.dvi}\index{dvi file?{\tt dvi}
+ file}\index{files!dvi?{\tt dvi}} file as usual. That way, there's no
+need to care about different settings of variable
+\texttt{prologues}\index{prologues?\texttt{prologues}}, since in proof
+sheets MetaPost graphics are already embedded.
+
+Note, the parameters after \texttt{mproof} are an explicit list of
+MetaPost output files, possibly generated from different input files.
+On shells that support POSIX\index{shell patterns}\index{POSIX!shell
+ patterns} shell patterns, these can be used to avoid typing a long
+list of files. As an example, for a file \texttt{fig.mp} containing
+three figures with charcodes 1, 2, and~3, the proof sheet can be
+generated by calling
+$$
+\begin{verbatim}
+tex mproof fig.?
+\end{verbatim}
+$$
+The pattern \texttt{fig.?} is automatically expanded to \texttt{fig.1
+ fig.2 fig.3} by the shell (but not necessarily in numerically
+increasing order) before \TeX\ is run. If there were an output file
+\texttt{fig.10}, using patterns \texttt{fig.??} or \texttt{fig.*} to
+cover two-digit indices would fail, since those covered the source file
+\texttt{fig.mp} as well. To avoid that, output file names have to be
+made more significant, e.g., by setting variable \texttt{outputtemplate}
+to \verb|%j-%c.mps| (see Section~\ref{Doutputtemplate}). The proof sheet
+can then be generated with
+$$
+\begin{verbatim}
+tex mproof *.mps
+\end{verbatim}
+$$
+
+\paragraph{\texttt{mpsproof.tex}}
+\index{mpsproof.tex?\texttt{mpsproof.tex}}
+
+An alternative to \texttt{mproof.tex} is the script
+\texttt{mpsproof.tex}, which is similar, but more powerful. While the
+former script only runs with \TeX\ and requires a DVI output driver to
+generate PostScript files, \texttt{mpsproof.tex} can as well be run
+through pdf\TeX\ to directly generate PDF files. Additionally, it
+provides some command-line options.
+
+With the
+\verb|\noheaders|\index{mpsproof.tex?\texttt{mpsproof.tex}!noheaders?\texttt{\textbackslash
+ noheaders}} option, file names, date stamps, and page numbers are
+omitted from the proof sheet. Use it like
+$$
+\begin{verbatim}[commandchars=\|\{\}]
+tex mpsproof \noheaders |tdescr{MetaPost output files}
+\end{verbatim}
+$$
+
+The
+\verb|\bbox|\index{mpsproof.tex?\texttt{mpsproof.tex}!bbox?\texttt{\textbackslash
+ bbox}} option can be used to generate an output file that has
+exactly the same page size as a figure's bounding box (\verb|\bbox| is
+actually an alias for the longer
+\verb|\encapsulate|\index{mpsproof.tex?\texttt{mpsproof.tex}!encapsulate?\texttt{\textbackslash
+ encapsulate}}). With this option only one figure can be processed
+at a time, e.g.,
+$$
+\begin{verbatim}
+pdftex mpsproof \bbox fig.1
+\end{verbatim}
+$$
+
+\paragraph{Alternatives} Other alternatives for previewing MetaPost
+figures, which are not part of the MetaPost distribution, are the
+mptopdf\index{mptopdf} bundle or the Perl script \ttindex{mpstoeps.pl}.
+There is also an online compiler and viewer for MetaPost code at
+\url{http://tlhiv.org/mppreview/}.
+
+\subsection{Debugging}
+\label{debug}
+
+\index{debug}
+
+MetaPost inherits from \MF\index{metafont?\MF} numerous facilities for
+interactive debugging, most of which can only be mentioned briefly here.
+Further information on error messages, debugging, and generating tracing
+information can be found in {\sl The\ \MF book} \cite{kn:c}.
+
+Suppose your input file says
+$$ \hbox{\verb|draw z1--z2;|} $$
+on line 17 without first giving known values to {\tt z1} and {\tt z2}.
+Figure~\ref{errmsg} shows what the MetaPost interpreter prints on your
+terminal when it finds the error. The actual error message is the line
+beginning with ``{\tt !}''; the next six lines give the context that
+shows exactly what input was being read when the error was found; and
+the ``{\tt ?}'' on last line is a prompt for your response. Since the
+error message talks about an undefined $x$~coordinate, this value is
+printed on the first line after the ``\verb|>>|''. In this case the
+$x$~coordinate of {\tt z1} is just the unknown variable {\tt x1}, so the
+interpreter prints the variable name {\tt x1} just as it would if it
+were told to\index{show?\texttt{show}} ``{\tt show x1}'' at this point.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+>> x1
+! Undefined x coordinate has been replaced by 0.
+<to be read again>
+ {
+--->{
+ curl1}..{curl1}
+l.17 draw z1--
+ z2;
+?
+\end{verbatim}
+$$
+\caption{An example of an error message.}
+\label{errmsg}
+\end{figure}
+
+The context listing may seem a little confusing at first, but it really just
+gives a few lines of text showing how much of each line has been read so far.
+Each line of input is printed on two lines like this:
+\begin{eqnarray*}
+ \descr{descriptor}\ \hbox{Text read so far} \\
+ && \hbox{Text yet to be read}
+\end{eqnarray*}
+The \tdescr{descriptor} identifies the input source. It is either a
+line number like ``{\tt l.17}'' for line 17 of the current file; or it
+can be a macro name followed by ``{\tt ->}''; or it is a descriptive
+phrase in angle brackets. Thus, the meaning of the context listing in
+Figure~\ref{errmsg} is that the interpreter has just read line 17 of the
+input file up to ``\verb|--|,'' the expansion of the \verb|--| macro has
+just started, and the initial ``\verb|{|'' has been reinserted to allow
+for user input before scanning this token.
+
+Among the possible responses to a {\tt ?} prompt are the following:
+\begin{description}
+\item[x] terminates the run so that you can fix your input file and start over.
+\item[h] prints a help message followed by another {\tt ?} prompt.
+\item[\tdescr{return}] causes the interpreter to proceed as best it can.
+\item[?] prints a listing of the options available, followed by another
+ {\tt ?} prompt.
+\end{description}
+
+This interactive mode is not only entered when MetaPost finds an error
+in the code. It can be explicitly entered by the \ttindex{errmessage}
+command. The \ttindex{message}\label{Dmessage} command writes a string
+argument to a new line on the terminal. The
+\ttindex{errmessage}\label{Derrmessage} command is similar, but the
+string argument is preceded by \verb|"! "| and followed by~\verb|"."|.
+Additionally, some lines of context are appended as in MetaPost's normal
+error messages. If the user now types ``h'', the most recent
+\ttindex{errhelp}\label{Derrhelp} string will be shown (unless it was
+empty).
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{message command} \rightarrow errhelp \descr{string expression}$\\
+$\tt \qquad \;|\; errmessage \descr{string expression}$\\
+$\tt \qquad \;|\; message \descr{string expression}$
+\end{ctabbing}
+\caption{The syntax for message commands}
+\label{symsg}
+\end{figure}
+
+Error messages and responses to {\tt show} commands are also written
+into the transcript\index{files!transcript} file whose name is obtained
+from the name of the main input file by changing ``{\tt .mp}''\index{mp
+ file?{\tt mp} file}\index{files!mp?{\tt mp}} to ``{\tt
+ .log}''\index{log file?{\tt log} file}\index{files!log?{\tt
+ log}}. When the internal variable\index{internal
+ variables}\index{variables!internal} {\tt
+ tracingonline}\index{tracingonline?\texttt{tracingonline}} is at its
+default value of zero, some {\tt show} commands print their results in
+full detail only in the transcript file.
+
+Only one type of {\tt show}\index{show?\texttt{show}} command has been
+discussed so far: {\tt show} followed by a comma-separated list of
+expressions prints symbolic representations of the expressions.
+
+The {\tt showtoken}\index{showtoken?\texttt{showtoken}}\label{Dshtok}
+command can be used to show the
+parameters and replacement text of a macro. It takes a comma-separated list of
+tokens and identifies each one. If the token is a primitive as in
+``\verb|showtoken +|'' it is just identified as being itself:
+$$ \hbox{\verb|> +=+|} $$
+Applying {\tt showtoken} to a variable or a {\tt vardef} macro yields
+$$ \hbox{\tt > } \descr{token}\hbox{\tt =variable} $$
+
+To get more information about a variable, use
+{\tt showvariable}\index{showvariable?\texttt{showvariable}}\label{Dshvar}
+instead of {\tt showtoken}. The
+argument to {\tt showvariable} is a comma-separated list of symbolic tokens
+and the result is a description of all the variables whose names begin with
+one of the listed tokens. This even works for {\tt vardef} macros. For
+example, {\tt showvariable z} yields
+$$ \hbox{\verb|z@#=macro:->begingroup(x(SUFFIX2),y(SUFFIX2))endgroup|} $$
+
+There is also a {\tt
+showdependencies}\index{showdependencies?\texttt{showdependencies}}\label{Dshdep}
+command that takes no arguments and prints a list of all {\em dependent}
+variables and how the linear equations given so far make them depend on
+other variables. Thus after
+$$ \hbox{\tt z2-z1=(5,10); z1+z2=(a,b);} $$
+{\tt showdependencies} prints what is shown in Figure~\ref{shdep}. This could
+be useful in answering a question like ``What does it mean
+`{\tt !\ Undefined x coordinate}?' I thought the equations given so far would
+determine {\tt x1}.''
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+x2=0.5a+2.5
+y2=0.5b+5
+x1=0.5a-2.5
+y1=0.5b-5
+\end{verbatim}
+$$
+\caption{The result of {\tt z2-z1=(5,10); z1+z2=(a,b); showdependencies;}}
+\label{shdep}
+\end{figure}
+
+When all else fails, the predefined macro {\tt
+tracingall}\index{tracingall?\texttt{tracingall}}\label{Dtall} causes
+the interpreter to print a detailed listing of everything it is doing.
+Since the tracing information is often quite voluminous, it may be
+better to use the {\tt
+loggingall}\index{loggingall?\texttt{loggingall}}\label{Dlogall} macro
+that produces the same information but only writes it in the
+transcript\index{files!transcript} file. There is also a {\tt
+tracingnone}\index{tracingnone?\texttt{tracingnone}}\label{Dtnone} macro
+that turns off all the tracing output.
+
+Tracing output is controlled by the set of internal
+variables\index{internal variables}\index{variables!internal} summarized
+below. When any one of these variables is given a positive value, the
+corresponding form of tracing is turned on. Here is the set of tracing
+variables and what happens when each of them is positive:
+\begin{description}
+\item[{\tt tracingcapsules}]\index{tracingcapsules?\texttt{tracingcapsules}}\label{Dtcapsules}%
+shows the values of temporary quantities (capsules) when they become known.
+%
+\item[{\tt tracingchoices}]\index{tracingchoices?\texttt{tracingchoices}}\label{Dtchoices}%
+shows the B\'ezier control\index{control points} points of each new path
+when they are chosen. %
+\item[{\tt tracingcommands}]\index{tracingcommands?\texttt{tracingcommands}}\label{Dtcommands}%
+shows the commands before they are performed. A setting ${}>1$ also shows
+{\tt if}\index{if?\texttt{if}} tests and loops before they are expanded;
+a setting ${}>2$ shows algebraic operations before they are performed.
+%
+\item[{\tt tracingequations}]\index{tracingequations?\texttt{tracingequations}}\label{Dtequations}%
+shows each variable when it becomes known.
+%
+\item[{\tt tracinglostchars}]\index{tracinglostchars?\texttt{tracinglostchars}}\label{Dtlostchars}%
+warns about characters omitted from a picture because they are not in the font
+being used to typeset labels.
+%
+\item[{\tt tracingmacros}]\index{tracingmacros?\texttt{tracingmacros}}\label{Dtmacros}%
+shows macros before they are expanded.
+%
+\item[{\tt tracingoutput}]\index{tracingoutput?\texttt{tracingoutput}}\label{Dtoutput}%
+shows pictures as they are being shipped out as PostScript files.
+%
+\item[{\tt tracingrestores}]\index{tracingrestores?\texttt{tracingrestores}}\label{Dtrestores}%
+shows symbols and internal variables as they are being restored at the end
+of a group.
+%
+\item[{\tt tracingspecs}]\index{tracingspecs?\texttt{tracingspecs}}\label{Dtspecs}%
+shows the outlines generated when drawing with a
+polygonal pen\index{pens!polygonal}.
+%
+\item[{\tt tracingstats}]\index{tracingstats?\texttt{tracingstats}}\label{Dtstats}
+shows in the transcript file at the end of the job how many of the
+MetaPost interpreter's limited resources were used.
+\end{description}
+
+\subsection{Importing MetaPost Graphics into External Applications}
+\label{mpimport}
+
+MetaPost is very well suited for creating graphics that are to be
+included into third-party applications, such as text documents,
+presentations or web pages, because MetaPost outputs graphics in vector
+formats, which can be scaled without quality degradation. However,
+practice shows, that vector graphics, too, are best created with a rough
+target size already in mind. Scaling a vector graphic calls for
+non-proportional scaling of certain technical parameters, such as line
+width, arrow size or fonts. Otherwise, with growing scale factors
+scalable graphics tend to change their visual character. Additionally,
+during import into a main document, they'll likely fail to match, e.g.,
+stroke width of the document. To circumvent this, it is advisable to
+apply only small post-processing scale factors to vector graphics. The
+following sections briefly discuss how to import MetaPost graphics into
+documents with selected applications.
+
+\subsubsection{\TeX\ and Friends}
+\label{teximport}
+\index{TeX?\TeX!and friends}
+
+MetaPost graphics in the PostScript\index{PostScript} format can be
+easily integrated into documents prepared with \TeX\ and friends.
+MetaPost's PostScript output is a low-featured dialect of the Postscript
+language, called \emph{purified EPS}\index{EPS!purified}, which can be
+converted into the Portable Document Format (PDF\index{PDF}) language
+on-the-fly. For that reason, external MetaPost graphics can be used on
+both routes: a) using the traditional \TeX\ engine together with an
+external PostScript output driver and b) using newer \TeX\ engines, like
+pdf\TeX\ or its successor Lua\TeX, which contain a built-in PDF output
+driver. Lua\TeX\ can additionally process embedded MetaPost code
+natively, falling back to the built-in \emph{mplib} library.
+
+Figure~\ref{fig:teximport} shows the process of including an external
+MetaPost graphic into a \TeX\ document using the PostScript route. In
+the \TeX\ source a ``magic macro'' provided by the format or an external
+package is used for including a graphic file. During the typesetting
+stage, the macro only reads bounding box information off the PostScript
+file and reserves the required space on the page via an empty box. The
+file reference is passed-on to the output driver and only then, finally,
+the file is embedded into the document. The freely available program
+\ttindex{dvips} is used as an output driver in this
+example.\footnote{The C source for \ttt{dvips} comes with the web2c
+ \TeX\ distribution. Similar programs are available from other
+ sources.} The next paragraphs give more detailed information on some
+popular combinations of \TeX\ formats and engines.
+
+\begin{figure}
+$$ \includegraphics{mpman-charts-1.mps} $$
+\caption{A diagram of the processing for a \TeX\ document embedding
+ MetaPost figures}
+\label{fig:teximport}
+\end{figure}
+
+\paragraph{Plain \TeX\ Format}
+\label{plaintexformat}
+\index{TeX?\TeX!format, plain!importing MetaPost files}
+
+For users of the Plain \TeX\ format and the traditional \TeX\
+engine\index{TeX?\TeX!engine} with Device Independend output
+(DVI\index{dvi file?{\tt dvi} file}) the
+\ttt{epsf}\index{epsf.tex?\texttt{epsf.tex}} package provides the
+``magic macro''
+$$ \verb|\epsfbox{|\descr{filename}\verb|}|%
+\index{epsfbox?\texttt{\string\epsfbox}} $$
+for embedding graphics, e.g., \verb|\epsfbox{fig.1}|.
+
+Users of the pdf\TeX\ engine\index{pdfTeX?pdf\TeX!engine} should refer
+to the standalone macros of the mptopdf\index{mptopdf} bundle, which can
+be found at \url{http://context.aanhet.net/mptopdf.htm}.
+
+With the Lua\TeX\ engine\index{LuaTeX?Lua\TeX!engine}, embedding
+external graphics works the same as with pdf\TeX. Additionally,
+Lua\TeX\ users can inline MetaPost code directly into Plain \TeX\
+documents. Lua\TeX\ is able to process such MetaPost code snippets,
+falling back to the built-in \emph{mplib}\index{mplib?\emph{mplib}}
+library. Note, \emph{mplib} doesn't support
+\verb|verbatimtex|\slash\verb|btex| \ldots\ \verb|etex| constructs,
+currently. Here is an example of a MetaPost graphic inlined into a
+Plain \TeX\ document. For more information, please refer to the
+Lua\TeX~\cite[chap.~4.8]{luatex:manual} and
+\ttindex{luamplib}~\cite{hagen:luamplib} documentation.
+
+$$\begin{verbatim}
+\input luamplib.sty
+\mplibcode
+beginfig(1);
+ ...
+endfig;
+\endmplibcode
+\bye
+\end{verbatim}
+$$
+
+\paragraph{\LaTeX\ Format}
+\label{latexformat}
+\index{LaTeX?\LaTeX!format!importing MetaPost files}
+\index{TeX?\TeX!engine}
+\index{pdfTeX?pdf\TeX!engine}
+
+For users of the \LaTeX\ format and the traditional \TeX\ engine with
+Device Independent output (DVI\index{dvi file?{\tt dvi} file}) the
+well-known \ttindex{graphics} (or \ttindex{graphicx}) package aids in
+external graphics inclusion. The package supports different engines,
+guessing the correct output driver automatically, and can handle several
+graphic formats. The ``magic macro'' is
+$$ \verb|\includegraphics{|\descr{filename}\verb|}|%
+\index{includegraphics?\texttt{\string\includegraphics}} $$
+
+In DVI output driver mode the \ttt{graphics} package assumes all files
+with an unknown file extension, such as \texttt{.1} etc., to be in the
+EPS\index{EPS} format. It therefore handles MetaPost files with a
+numeric default file extension correctly (see~\cite{reckdahl:epslatex}
+for more information).
+
+When using the pdf\TeX\ engine with a built-in PDF output driver, the
+situation is a bit different. Only files with file extension
+\texttt{.mps}\index{mps file?{\tt mps} file}\index{files!mps?{\tt mps}}
+are recognized as purified EPS\index{EPS!purified} and can be converted
+to PDF\index{PDF} on-the-fly. The recommended procedure for embedding
+MetaPost graphics into \LaTeX\ documents compiled with pdf\TeX\ is
+therefore to change MetaPost's output file name extension via
+\verb|outputtemplate|\index{outputtemplate?\texttt{outputtemplate}} (see
+p.~\pageref{Doutputtemplate}). In the \LaTeX\ document include the
+graphic files with full name, e.g.,
+$$\begin{verbatim}
+\includegraphics{fig-1.mps}
+\end{verbatim}
+$$
+
+Note, the latter approach works with the \ttindex{dvips} driver, too.
+Even though, again, this time \ttt{.mps} is an unknown file extension,
+triggering EPS file handling in a fall-back procedure. This property of
+the \ttt{graphics} package, which comes in handy for MetaPost files, is
+the reason many MetaPost source files start with the line
+$$\begin{verbatim}
+outputtemplate := "%j-%c.mps";
+\end{verbatim}
+$$
+
+With the Lua\TeX\ engine\index{LuaTeX?Lua\TeX!engine}, embedding
+external graphics works the same as with pdf\TeX. Additionally,
+Lua\TeX\ users can inline MetaPost code directly into La\TeX\ documents.
+Lua\TeX\ is able to process such MetaPost code snippets, falling back to
+the built-in \emph{mplib}\index{mplib?\emph{mplib}} library. Note,
+\emph{mplib} doesn't support \verb|verbatimtex|\slash\verb|btex| \ldots\
+\verb|etex| constructs, currently. Here is an example of a MetaPost
+graphic inlined into a \LaTeX\ document. For more information, please
+refer to the Lua\TeX~\cite[chap.~4.8]{luatex:manual} and
+\ttindex{luamplib}~\cite{hagen:luamplib} documentation.
+$$\begin{verbatim}
+\documentclass{article}
+\usepackage{luamplib}
+\begin{document}
+\begin{mplibcode}
+beginfig(1);
+ ...
+endfig;
+\end{mplibcode}
+\end{document}
+\end{verbatim}
+$$
+
+\paragraph{Con\TeX t Format}
+\label{contextformat}
+\index{ConTeXt?Con\TeX t!format!importing MetaPost files}
+
+In Con\TeX t\index{ConTeXt?Con\TeX t} graphics support is integrated in
+the kernel, covering advanced features like shading, transparency, color
+spaces or image inclusion. The ``magic macro'' for embedding external
+graphics is
+$$ \verb|\externalfigure[|\descr{filename}\verb|]|%
+\index{externalfigure?\texttt{\string\externalfigure}} $$
+%
+The macro can handle numbered files as well as files with the \ttt{mps}
+suffix.
+
+Alternatively, Con\TeX t users can inline MetaPost code in the document
+source, which allows for more natural interfacing with document
+properties, font support, and automatic processing~\cite{hagen:metafun}.
+Here is an example of a MetaPost graphic inlined into a Con\TeX t
+document.
+$$\begin{verbatim}[commandchars=|\[\]]
+\starttext
+\startuseMPgraphic{|tdescr[name]}
+ ...
+\stopuseMPgraphic
+\useMPgraphic{|tdescr[name]}
+\stoptext
+\end{verbatim}
+$$
+
+Con\TeX t MkIV, being based on the Lua\TeX\ engine, provides a much
+tighter integration of MetaPost than older versions, since it can
+fall-back to the built-in \emph{mplib}\index{mplib?\emph{mplib}}
+library.
+
+\subsubsection{Troff}
+\label{troffimport}
+\index{troff!importing MetaPost files}
+
+It is also possible to include MetaPost output in a GNU
+troff\index{troff} document. The procedure is similar to
+Figure~\ref{fig:teximport}: the \ttindex{grops} output processor
+includes PostScript files when they are requested via troff's
+\ttt{\string\X}\index{X?\texttt{\string\X}} command. The
+\ttt{-mpspic}\index{mpspic?\texttt{-mpspic}} macro package provides a
+command \verb|.PSPIC|\index{PSPIC?\texttt{.PSPIC}}, which does just that
+when including an encapsulated PostScript file in the source code. For
+instance, the troff command
+$$ \hbox{\verb|.PSPIC fig.1|} $$
+includes \ttt{fig.1}, using the natural height and width of the
+image as given in the file's bounding box.
+
+\subsubsection{Web Applications}
+\label{webimport}
+
+An SVG\index{svg file?{\tt svg} file}\index{files!svg?{\tt svg}} file
+\texttt{fig.svg} can be easily embedded into
+HTML\index{HTML}\index{files!HTML} documents with the following code
+snippet:
+$$\begin{verbatim}
+<p>
+ <object data="fig.svg" type="image/svg+xml" width="300" height="200">
+ </object>
+</p>
+\end{verbatim}
+\index{object tag?\texttt{object} tag|see{HTML, tags, \texttt{object}}}
+\index{HTML!tags!object?\texttt{object}}
+$$
+The code is similar for PNG\index{png file?{\tt png}
+ file}\index{files!png?{\tt png}} files:
+$$\begin{verbatim}
+<p>
+ <img src="fig.png" alt="A picture.">
+</p>
+\end{verbatim}
+\index{img tag?\texttt{img} tag|see{HTML, tags, \texttt{img}}}
+\index{HTML!tags!img?\texttt{img}}
+$$
+The \texttt{width} and \texttt{height} attributes used above allow for
+scaling a graphic to an arbitrary size. More information about HTML
+tags and attributes can be found in an HTML reference.
+
+SVG and PNG files can also be imported by various interactive graphics
+editing programs, for example GIMP\index{GIMP} or
+Inkscape\index{Inkscape}. See Section~\ref{Dprologues} for information
+on font handling in SVG graphics.
+
+
+\section*{Acknowledgement}
+
+I would like to thank Don Knuth for making this work possible by
+developing \MF\ and placing it in the public domain. I am also indebted
+to him for helpful suggestions, particularly with regard to the
+treatment of included \TeX\ material.
+
+
+\appendix
+\include{mpman-app-numbersystems}
+\include{mpman-app-refman}
+\include{mpman-app-legacy}
+
+
+\bibliographystyle{plain}
+\bibliography{mpman}
+
+
+\printindex
+
+
+\end{document}
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+% Updated 2006 by Taco Hoekwater, Karl Berry, and others.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-mode: t
+%%% TeX-master: t
+%%% End:
diff --git a/systems/doc/metapost/source-manual/timepop.d b/systems/doc/metapost/source-manual/timepop.d
new file mode 100644
index 0000000000..c8b2bae7a0
--- /dev/null
+++ b/systems/doc/metapost/source-manual/timepop.d
@@ -0,0 +1,21 @@
+1790 3.93
+1800 5.31
+1810 7.24
+1820 9.64
+1830 12.87
+1840 17.07
+1850 23.19
+1860 31.44
+1870 39.82
+1880 50.16
+1890 62.95
+1900 75.99
+1910 91.97
+1920 105.71
+1930 122.78
+1940 131.67
+1950 150.70
+1960 179.32
+1970 203.30
+1980 226.55
+1990 248.71
diff --git a/systems/doc/metapost/source-tutorial/Makefile b/systems/doc/metapost/source-tutorial/Makefile
new file mode 100644
index 0000000000..cc493784aa
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/Makefile
@@ -0,0 +1,66 @@
+MAKE=make
+MPOST=mpost
+LTX=latex
+DVIPS=dvips
+PDFLTX=pdflatex
+BIB=bibtex
+
+SRC=mpintro.ltx
+INCL=$(wildcard *.tex)
+MYBIB=mpintro.bib
+MPMPS=annulus-1.mps annulus-2.mps annulus-3.mps circles.mps data.mps draw-1.mps draw-2.mps fill.mps label-1.mps label-2.mps paperclip.mps parabola.mps
+MP=$(patsubst %,%.mp,$(patsubst %.mps,%,$(filter-out -%,$(subst -, -,$(MPMPS)))))
+MPLOG=$(patsubst %.mp,%.log,$(MP))
+MPMPX=$(patsubst %.mp,%.mpx,$(MP))
+RASTEPS=previewer.eps
+RASTPDF=previewer.pdf
+
+BASE=$(patsubst %.ltx,%,$(SRC))
+DVI=$(BASE).dvi
+PDF=$(BASE).pdf
+PS=$(BASE).ps
+
+.PHONY: clean distclean
+
+pdf:
+ $(MAKE) $(PDF)
+
+ps:
+ $(MAKE) $(PS)
+
+all: pdf ps
+
+$(DVI): $(SRC) $(MYBIB) $(INCL) $(MPMPS) $(RASTEPS)
+ $(LTX) $<
+ $(BIB) $(BASE)
+ $(LTX) $<
+ $(LTX) $<
+
+$(PDF): $(SRC) $(MYBIB) $(INCL) $(MPMPS) $(RASTPDF)
+ $(PDFLTX) $<
+ $(BIB) $(BASE)
+ $(PDFLTX) $<
+ $(PDFLTX) $<
+
+$(PS): $(DVI)
+ $(DVIPS) -o $@ $<
+
+$(RASTEPS): $(patsubst %.eps,%.png,$(RASTEPS))
+ sam2p $< EPS: $@
+
+$(RASTPDF): $(patsubst %.pdf,%.png,$(RASTPDF))
+ sam2p $< PDF: $@
+
+%.mps: %.mp
+ $(MPOST) $<
+
+%.mps:: $(patsubst %,%.mp,$(patsubst %.pdf,%,$(filter-out -%,$(subst -, -,$(MPPDF)))))
+ $(MPOST) $(patsubst %,%.mp,$(patsubst %.pdf,%,$(filter-out -%,$(subst -, -,$@))))
+
+clean:
+ rm -f $(MPLOG) $(MPMPX) $(MPPDF) texnum.mpx
+ rm -f $(BASE).aux $(BASE).bbl $(BASE).blg $(BASE).log $(BASE).out
+
+distclean:
+ $(MAKE) clean
+ rm -f $(DVI) $(PS) $(PDF) $(MPMPS) $(RASTPDF) $(RASTEPS)
diff --git a/systems/doc/metapost/source-tutorial/abstract.tex b/systems/doc/metapost/source-tutorial/abstract.tex
new file mode 100644
index 0000000000..6f1631dc26
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/abstract.tex
@@ -0,0 +1,17 @@
+\begin{abstract}
+ Individuals that use \TeX{} (or any of its derivatives) to typeset
+ their documents generally take extra measures to ensure paramount
+ visual quality. Such documents often contain mathematical expressions
+ and graphics to accompany the text. Since \TeX{} was designed ``for
+ the creation of beautiful books\Dash and especially for books that
+ contain a lot of mathematics''~\cite{knuth:texbook}, it is clear that
+ it is sufficient (and in fact \textit{exceptional}) at dealing with
+ mathematics and text. \TeX{} was not designed for creating graphics;
+ however, certain add-on packages can be used to create modest figures.
+ \TeX{}, however, is capable of including graphics created with other
+ utilities in a variety of formats. Because of their scalability,
+ Encapsulated PostScript (\EPS) graphics are the most common types
+ used. This paper introduces \MP{} and demonstrates the fundamentals
+ needed to generate high-quality \EPS{} graphics for inclusion into
+ \TeX-based documents.
+\end{abstract}
diff --git a/systems/doc/metapost/source-tutorial/annulus.mp b/systems/doc/metapost/source-tutorial/annulus.mp
new file mode 100644
index 0000000000..63cea69cfa
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/annulus.mp
@@ -0,0 +1,92 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j-%c.mps";
+
+verbatimtex
+%&latex
+\documentclass[11pt]{article}
+\usepackage[charter]{mathdesign}
+\usepackage[T1]{fontenc}
+\renewcommand*{\ttdefault}{lmtt}
+\begin{document}
+etex
+
+% Set unit size to 54bp = 3/4in
+u:=54;
+
+path p,q;
+% Define circle of radius 3/4in
+p:=fullcircle scaled (2*u);
+% Define circle of radius 3/8in
+q:=fullcircle scaled u;
+
+beginfig(1);
+ % Fill annulus
+ fill p withcolor (3/5,4/5,1);
+ unfill q;
+
+ % Draw big circle
+ draw p;
+ % Draw small circle
+ draw q;
+endfig;
+
+beginfig(2);
+ % Fill annulus
+ fill p--reverse q--cycle withcolor (3/5,4/5,1);
+
+ % This loop draws arrows around the big circle
+ N:=12;
+ for n=1 upto N:
+ drawarrow subpath ((n-1)/N*length(p),n/N*length(p)) of p;
+ endfor;
+
+ % These 3 commands draw the "cut"
+ drawarrow (u,0)--(5*u/6,0);
+ draw (5*u/6,0)--(2*u/3,0);
+ drawarrow (u/2,0)--(2*u/3,0);
+
+ % This loop draws arrows around the small circle
+ for n=1 upto N:
+ drawarrow subpath ((n-1)/N*length(p),n/N*length(p)) of reverse q;
+ endfor;
+
+ % Label p and q
+ label.urt(btex \texttt{p} etex,(u/sqrt(2),u/sqrt(2)));
+ label.llft(btex \texttt{q} etex,(u/2/sqrt(2),u/2/sqrt(2)));
+endfig;
+
+beginfig(3);
+ % Fill annulus
+ fill p--reverse q--cycle withcolor (3/5,4/5,1);
+
+ % Draw big circle
+ draw p;
+ % Draw small circle
+ draw q;
+
+ % Above is used to determine the bbox of the annulus
+ picture h;
+ h:=currentpicture; % Store the currentpicture
+ currentpicture:=nullpicture; % Clear the currentpicture
+
+ % Create magenta background
+ fill bbox h withcolor (1,0,1);
+
+ % Fill the big circle
+ fill p withcolor (3/5,4/5,1);
+
+ % Unfill the small circle
+ unfill q;
+
+ % Draw the big circle
+ draw p;
+ % Draw the small circle
+ draw q;
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/arrows.tex b/systems/doc/metapost/source-tutorial/arrows.tex
new file mode 100644
index 0000000000..2fcf6a8e8d
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/arrows.tex
@@ -0,0 +1,34 @@
+\subsection{Arrow commands}
+
+When drawing simple graphs and other illustrations, the use of arrows is
+often essential. There are two arrow commands in \MP{} for
+accommodating this need\Dash |drawarrow| and |drawdblarrow|. Both of
+these commands require a path argument. For example,
+
+\begin{lstlisting}[style=MP]
+drawarrow (0,0)--(72,72);
+\end{lstlisting}
+draws an arrow beginning at |(0,0)| and ending at |(72,72)| along the
+line segment connecting these points.
+
+The path argument of both |drawarrow| and |drawdblarrow| need not be
+line segmented paths\Dash they may be any \MP{} path. The only
+difference between |drawarrow| and |drawdblarrow| is that |drawarrow|
+places an arrow head at the end of the path and |drawdblarrow| places an
+arrow head at the beginning and the end of the path. As an example, to
+draw the curved path in \autoref{fig:draw1} with an arrow head at the
+end of the path (i.e., at |z3|), the following command can be used
+
+\begin{lstlisting}[style=MP]
+drawarrow z1{right}..z2{dir 45}..{up}z3;
+\end{lstlisting}
+and is illustrated in \autoref{fig:draw2}.
+
+\begin{figure}
+ \begin{withattachment}{draw.mp}
+ \centering
+ \includegraphics{draw-2.mps}
+ \end{withattachment}
+ \caption{Using \texttt{drawarrow} along a path}
+ \label{fig:draw2}
+\end{figure}
diff --git a/systems/doc/metapost/source-tutorial/biblio.tex b/systems/doc/metapost/source-tutorial/biblio.tex
new file mode 100644
index 0000000000..f158bfccaf
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/biblio.tex
@@ -0,0 +1,3 @@
+% \newpage
+\bibliographystyle{plain}
+\bibliography{mpintro}
diff --git a/systems/doc/metapost/source-tutorial/circles.mp b/systems/doc/metapost/source-tutorial/circles.mp
new file mode 100644
index 0000000000..ef7eadc765
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/circles.mp
@@ -0,0 +1,22 @@
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j.mps";
+
+beginfig(0);
+ % Use 8 circles
+ N:=8;
+
+ % Compute the "correct" radius
+ r:=54*sind(180/N)/(1+sind(180/N));
+
+ % Define one of the cirlces
+ path p;
+ p:=fullcircle scaled (2*r);
+
+ % Draw all 8 circles
+ for n=0 upto N-1: draw p shifted (r/sind(180/N),0) rotated (360/N*n); endfor;
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/commands.tex b/systems/doc/metapost/source-tutorial/commands.tex
new file mode 100644
index 0000000000..b3d4d16af3
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/commands.tex
@@ -0,0 +1,13 @@
+\section{Common commands}
+\label{sec:commoncmds}
+
+The \MP{} manual~\cite{hobby:user} lists 26 built-in commands along with
+23 function-like macros for which pictures can be drawn and manipulated
+using \MP. We will not discuss each of these commands here; however, we
+will focus on several of the most common commands and provide examples
+of their usage.
+
+\input{draw}
+\input{fill}
+\input{arrows}
+\input{label}
diff --git a/systems/doc/metapost/source-tutorial/compilation.tex b/systems/doc/metapost/source-tutorial/compilation.tex
new file mode 100644
index 0000000000..df6a389c1a
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/compilation.tex
@@ -0,0 +1,56 @@
+\begin{figure*}[tp]
+ \centering
+ \includegraphics[width=\textwidth]{previewer}
+ \caption{\MP{} Previewer}
+ \label{fig:previewer}
+\end{figure*}
+
+\section{\MP{} compilation}
+\label{sec:mpcompilation}
+
+A typical \MP{} source file consists of one or more figures.
+Compilation of the source file generates an \EPS{} graphic for each
+figure. These \EPS{} graphics are self-contained (i.e., the fonts used
+in labels are embedded into the graphic) provided that |prologues:=3| is
+declared.
+
+If \File{foo.mp} is a typical \MP{} source file, then its contents are
+likely of the following form:
+
+\begin{lstlisting}[style=MP]
+prologues:=3;
+outputtemplate:="%j-%c.mps";
+beginfig(1);
+ |\normalfont\textit{draw commands}|
+endfig;
+beginfig(2);
+ |\normalfont\textit{draw commands}|
+endfig;
+|\dots|
+beginfig(|\normalfont$n$|);
+ |\normalfont\textit{draw commands}|
+endfig;
+end
+\end{lstlisting}
+
+Executing
+
+\begin{lstlisting}[style=text]
+mpost foo.mp
+\end{lstlisting}
+yields the following output:
+
+\begin{lstlisting}[style=text]
+This is MetaPost, Version |\normalfont$\langle$\textit{version}$\rangle$|
+(foo.mp [1] [2] |\normalfont\ldots| [|\normalfont$n$|] )
+|\normalfont$n$| output files written: foo-1.mps .. foo-|\normalfont$n$|.mps
+Transcript written on foo.log.
+\end{lstlisting}
+
+For users who just want to ``get started'' using \MP{}, a \MP{}
+previewer is available at \url{http://www.tlhiv.org/mppreview}. This
+previewer (illustrated in \autoref{fig:previewer}) is simply a graphical
+interface to \MP{} itself. It generates a single graphic with the
+option to save the output in \EPS{}, \PDF{}, and \SVG{} formats. Users
+may also choose to save the source code and can view the compilation log
+to assist in debugging.
diff --git a/systems/doc/metapost/source-tutorial/conclusion.tex b/systems/doc/metapost/source-tutorial/conclusion.tex
new file mode 100644
index 0000000000..4caa87bcc7
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/conclusion.tex
@@ -0,0 +1,13 @@
+\section{Conclusion}
+\label{sec:conclusion}
+
+\MP{} is an elegant programming language, and it produces beautiful
+graphics. The graphics are vectorial and thus can be scaled to any
+resolution without degradation. There are many advanced topics that are
+not discussed in this article (e.g., loops, flow control, subpaths,
+intersections, etc.), and the \MP{} manual~\cite{hobby:user} is an
+excellent resource for these advanced topics. However, the \MP{} manual
+may seem daunting for beginners. There are many websites containing
+\MP{} examples, and several of these are referenced at
+\url{http://www.tug.org/metapost}. Finally, we mention that Knuth uses
+nothing but \MP{} for his diagrams.
diff --git a/systems/doc/metapost/source-tutorial/data.d b/systems/doc/metapost/source-tutorial/data.d
new file mode 100644
index 0000000000..f7313d919f
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/data.d
@@ -0,0 +1,6 @@
+0.0 0.0
+0.2 0.447214
+0.4 0.632456
+0.6 0.774597
+0.8 0.894427
+1.0 1.0
diff --git a/systems/doc/metapost/source-tutorial/data.mp b/systems/doc/metapost/source-tutorial/data.mp
new file mode 100644
index 0000000000..f6f0a1feb9
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/data.mp
@@ -0,0 +1,26 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j.mps";
+
+verbatimtex
+%&latex
+\documentclass[11pt]{article}
+\usepackage[charter]{mathdesign}
+\usepackage[T1]{fontenc}
+\renewcommand*{\ttdefault}{lmtt}
+\begin{document}
+etex
+
+input graph;
+Fmfont_:="bchr8r";
+beginfig(0);
+ draw begingraph(144bp,89bp);
+ gdraw "data.d";
+ endgraph;
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/data.tex b/systems/doc/metapost/source-tutorial/data.tex
new file mode 100644
index 0000000000..421b92bdc3
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/data.tex
@@ -0,0 +1,159 @@
+\section{Data types}
+\label{sec:datatypes}
+
+\subsection{Standard data types}
+There are ten data types in \MP{}: \textit{numeric}, \textit{pair},
+\textit{path}, \textit{transform}, \textit{rgbcolor},
+\textit{cmykcolor}, \textit{string}, \textit{boolean}, \textit{picture},
+and \textit{pen}. These data types allow users to store fragments of
+the graphics for later use. We will briefly discuss each of these data
+types and elaborate on how they are used in a typical \MP{} program.
+
+\renewcommand{\labelitemi}{$\diamond$}
+\begin{itemize}
+\item \textit{numeric}\Dash numbers
+\item \textit{pair}\Dash ordered pairs of numerics
+\item \textit{path}\Dash B\'{e}zier curves (and lines)
+\item \textit{picture}\Dash pictures
+\item \textit{transform}\Dash transformations such as shifts, rotations,
+ and slants
+\item \textit{rgbcolor} or \textit{color}\Dash triplets with each
+ component between $0$ and $1$ (red, green, and blue)
+\item \textit{cmykcolor}\Dash quadruplets with each component between
+ $0$ and $1$ (cyan, magenta, yellow, and black)
+\item \textit{string}\Dash strings of characters
+\item \textit{boolean}\Dash ``true'' or ``false'' values
+\item \textit{pen}\Dash stroke properties
+\end{itemize}
+
+Virtually all programming languages provide a way of storing and
+retrieving numerical values. This is precisely the purpose of the
+\textit{numeric} data type in \MP. Since graphics drawn with \MP{} are
+simply two dimensional pictures, it is clear that an ordered pair is
+needed to identify each point in the picture. The \textit{pair} data
+type provides this functionality. Each point in the plane consists of
+an $x$ (i.e., abscissa) part and a $y$ (i.e., ordinate) part. \MP{}
+uses the standard syntax for defining points in the plane, e.g., $(x,y)$
+where both $x$ and~$y$ are numeric data typed variables.
+
+In order to store paths between points, the \textit{path} data type is
+used. All paths in \MP{} are represented as cubic B\'{e}zier curves.
+Cubic B\'{e}zier curves are simply parametric splines of the form
+$(x(t),y(t))$ where both $x(t)$ and $y(t)$ are piecewise cubic
+polynomials of a common parameter $t$. Since B\'{e}zier curves are
+splines, they pairwise interpolate the points. Furthermore, cubic
+B\'{e}zier curves are diverse enough to provide a ``smooth'' path
+between all of the points for which it interpolates. \MP{} provides
+several methods for affecting the B\'{e}zier curve between a list of
+points. For example, piecewise linear paths (i.e., linear splines) can
+be drawn between a list of points since all linear polynomials are also
+cubic polynomials. Furthermore, if a specific direction for the path is
+desired at a given point, this constraint can be forced on the
+B\'{e}zier curve.
+
+The \textit{picture} data type is used to store an entire picture for
+later use. For example, in order to create animations, usually there
+are objects that remain the same throughout each frame of the animation.
+So that these objects do not have to be manually drawn for each frame, a
+convenient method for redrawing them is to store them into a picture
+variable for later use.
+
+When constructing pairs, paths, or pictures in \MP{}, it is often
+convenient to apply affine transformations to these objects. As
+mentioned above, \autoref{fig:circles} can be constructed by rotating
+the same circle several times before drawing it. \MP{} provides
+built-in affine transformations as ``building blocks'' from which other
+transformations can be constructed. These include shifts, rotations,
+horizontal and vertical scalings, and slantings.
+
+For creating colored graphics, \MP{} provides two data types:
+\textit{rgbcolor} and \textit{cmykcolor}. These data types correspond
+to the two supported color models \RGB{} and \CMYK. While using the
+\RGB{} color model, fractions of the primary colors
+\textit{red}~\showcol{red}, \textit{green}~\showcol{green}, and
+\textit{blue}~\showcol{blue} are ``additively mixed''. Similarly, in
+the \CMYK{} color model, the primary colors
+\textit{cyan}~\showcol{cyan}, \textit{magenta}~\showcol{magenta},
+\textit{yellow}~\showcol{yellow}, and \textit{black}~\showcol{black} are
+``subtractively mixed.'' The former model is suitable for on-screen
+viewing whereas the latter model is preferred in high-quality print.
+Both color types are ordered tuples, $(c_1,c_2,c_3)$ and
+$(c_1,c_2,c_3,c_4)$, with components~$c_i$ being \textit{numeric}s
+between $0$ and $1$. For example, in the \RGB{} color model, a light
+orange tone can be referred to as |(1,.6,0)|~\showcol[rgb]{1,.6,0},
+whereas in the \CMYK{} color model |(0,.6,1,0)|~\showcol[cmyk]{0,.6,1,0}
+corresponds to a clearly different orange tone. If a particular color
+is to be used several times throughout a figure, it is natural to store
+this color into a variable of type \textit{rgbcolor} or
+\textit{cmykcolor}.
+
+The data type \textit{color} is a convenient synonym for
+\textit{rgbcolor}. Additionally, there are five built-in \RGB{} colors
+in \MP{}: |black|, |white|, |red|, |green|, and |blue|. So, the
+expression |.4(red+blue)| refers to a dark violet~\showcol[rgb]{.4,0,.4}
+in the \RGB{} color model and in the example above |(1,.6,0)| could be
+replaced by |red+.6green|.
+
+The most common application of \textit{string} data types is reusing a
+particular string that is typeset (or labeled). The \textit{boolean}
+data type is the same as in other programming languages and is primarily
+used in conditional statements for testing. Finally, the \textit{pen}
+data type is used to affect the actual stroke paths. The default unit
+of measurement in \MP{} is $1\,\mathrm{bp}=1/72\mathrm{\ in}$, and the
+default thickness of all stroked paths is $0.5\,\mathrm{bp}$. An
+example for using the \textit{pen} data type may include changing the
+thickness of several stroked paths. This new pen can be stored and then
+referenced for drawing each of the paths.
+
+The following code declares a variable of type \textit{numeric}, one of
+type \textit{pair}, and two \textit{string} variables:
+
+\begin{lstlisting}[style=MP]
+numeric idx;
+pair v;
+string s, name;
+\end{lstlisting}
+
+Note, variables of type \textit{numeric} need not necessarily be
+declared. A formerly undeclared variable is automatically assumed to be
+\textit{numeric} at first use.
+
+
+\subsection{Arrays}
+Just like many other programming languages MetaPost provides a way to
+access variables by index. After the following variable declaration
+
+\begin{lstlisting}[style=MP]
+pair a[];
+\end{lstlisting}
+it is possible to store points in the ``array''~|a| with numeric values
+as index. The console output of
+
+\begin{lstlisting}[style=MP]
+a[1] := (0,1);
+a[2] := (0,5);
+a[3] := (10,20);
+show a[1];
+show a1;
+j := 2;
+show a[j] + a[j+1];
+\end{lstlisting}
+is
+
+\begin{lstlisting}[style=text]
+>> (0,1)
+>> (0,1)
+>> (10,25)
+\end{lstlisting}
+
+Notice, the point stored at array index~1 can be referred to as~|a[1]|
+as well as just~|a1|, omitting the brackets. The latter
+convenient---and often practised---notation works as long as the index
+is a plain numeric value. If the index is a numeric \emph{variable} or
+an expression, however, the brackets have to be present, since, e.g.,
+|aj| would clearly refer to an unrelated variable of that name instead
+of index~|j| of variable~|a|.
+
+Aside, MetaPost, as a macro language, doesn't really provide true arrays.
+However, from a user's perspective, the MetaPost way of indexing
+variables perfectly looks like an array.
diff --git a/systems/doc/metapost/source-tutorial/draw.mp b/systems/doc/metapost/source-tutorial/draw.mp
new file mode 100644
index 0000000000..8b3affb5d9
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/draw.mp
@@ -0,0 +1,44 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j-%c.mps";
+
+verbatimtex
+%&latex
+\documentclass[11pt]{article}
+\usepackage[charter]{mathdesign}
+\usepackage[T1]{fontenc}
+\renewcommand*{\ttdefault}{lmtt}
+\begin{document}
+etex
+
+% Set unit size to 72bp = 1in
+u:=72;
+
+beginfig(1);
+ % Draw line segmented path
+ draw (0,0)--(3*u/4,u/4)--(u,u) dashed evenly scaled 0.6;
+
+ % Draw curved path
+ draw (0,0){right}..{dir 45}(3*u/4,u/4){dir 45}..{up}(u,u);
+
+ % Label the 3 points
+ label.bot(btex \texttt{z1} etex,(0,0));
+ label.lrt(btex \texttt{z2} etex,(3*u/4,u/4));
+ label.rt(btex \texttt{z3} etex,(u,u));
+endfig;
+
+beginfig(2);
+ % Draw arrow around curved path
+ drawarrow (0,0){right}..{dir 45}(3*u/4,u/4){dir 45}..{up}(u,u);
+
+ % Label the 3 points
+ label.bot(btex \texttt{z1} etex,(0,0));
+ label.lrt(btex \texttt{z2} etex,(3*u/4,u/4));
+ label.rt(btex \texttt{z3} etex,(u,u));
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/draw.tex b/systems/doc/metapost/source-tutorial/draw.tex
new file mode 100644
index 0000000000..9ed9b3c1ed
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/draw.tex
@@ -0,0 +1,46 @@
+\subsection{The \texttt{draw} command}
+
+The most common command in \MP{} is the |draw| command. This command is
+used to draw paths or pictures. In order to draw a path from
+|z1:=(0,0)| to |z2:=(54,18)| to |z3:=(72,72)|, we should first decide
+how we want the path to look. For example, if we want these points to
+simply be connected by line segments, then we use
+
+\begin{lstlisting}[style=MP]
+draw z1--z2--z3;
+\end{lstlisting}
+
+However, if we want a smooth path between these points, we use
+
+\begin{lstlisting}[style=MP]
+draw z1..z2..z3;
+\end{lstlisting}
+
+In order to specify the direction of the path at the points, we use the
+|dir| operator. In \autoref{fig:draw1} we see that the smooth path is
+horizontal at |z1|, a 45\textdegree\ angle at |z2|, and vertical at
+|z3|. These constraints on the B\'{e}zier curve are imposed by
+
+\begin{lstlisting}[style=MP]
+draw z1{right}..z2{dir 45}..{up}z3;
+\end{lstlisting}
+
+\begin{figure}
+ \begin{withattachment}{draw.mp}
+ \centering
+ \includegraphics{draw-1.mps}
+ \end{withattachment}
+ \caption{\texttt{draw} examples}
+ \label{fig:draw1}
+\end{figure}
+
+Notice that |z2{dir 45}| forces the \textit{outgoing} direction at |z2|
+to be 45\textdegree. This implies an \textit{incoming} direction at
+|z2| of 45\textdegree. In order to require different incoming and
+outgoing directions, we would use
+
+\begin{lstlisting}[style=MP]
+draw z1{right}..{dir |$\theta_i$|}z2{dir |$\theta_o$|}..{up}z3;
+\end{lstlisting}
+where $\theta_i$ and $\theta_o$ are the incoming and outgoing
+directions, respectively.
diff --git a/systems/doc/metapost/source-tutorial/fill.mp b/systems/doc/metapost/source-tutorial/fill.mp
new file mode 100644
index 0000000000..d4c52c4e9e
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/fill.mp
@@ -0,0 +1,22 @@
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j.mps";
+
+beginfig(0);
+ % Set unit size to 72bp = 1in
+ u:=72;
+
+ % Define path
+ path p;
+ p:=(0,0){right}..{dir 45}(3*u/4,u/4){dir 45}..{up}(u,u)--cycle;
+
+ % Fill the path
+ fill p withcolor red;
+
+ % Draw the path
+ draw p;
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/fill.tex b/systems/doc/metapost/source-tutorial/fill.tex
new file mode 100644
index 0000000000..13fd41557a
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/fill.tex
@@ -0,0 +1,108 @@
+\subsection{The \texttt{fill} command}
+
+Another common command in \MP{} is the |fill| command. This is used to
+fill closed paths (or cycles). In order to construct a cycle, |cycle|
+may be appended to the path declaration. For example,
+
+\begin{lstlisting}[style=MP]
+path p;
+p := z1{right}..z2{dir 45}..{up}z3--cycle;
+fill p withcolor red;
+draw p;
+\end{lstlisting}
+produces \autoref{fig:fill}. Notice that |p| is essentially the same
+curved path as in \autoref{fig:draw1} with the additional piece that
+connects |z3| back to |z1| with a line segment using |--cycle|.
+
+\begin{figure}
+ \begin{withattachment}{fill.mp}
+ \centering
+ \includegraphics{fill.mps}
+ \end{withattachment}
+ \caption{\texttt{fill} example}
+ \label{fig:fill}
+\end{figure}
+
+Just as it is necessary to fill closed paths, it may also be necessary
+to \textit{unfill} closed paths. For example, the annulus in
+\autoref{fig:annulus1} can be constructed by
+
+\begin{lstlisting}[style=MP]
+color bbblue;
+bbblue := (3/5,4/5,1);
+path p,q;
+p := fullcircle scaled (2*54);
+q := fullcircle scaled (2*27);
+fill p withcolor bbblue;
+unfill q;
+draw p;
+draw q;
+\end{lstlisting}
+
+The |fullcircle| path is a built-in path that closely
+approximates a circle in \MP{} with diameter 1\,bp traversed
+counter-clockwise. This path is not exactly a circle since it is
+parameterized by a B\'{e}zier curve and not by trigonometric functions;
+however, visually it is essentially indistinguishable from an exact
+circle.
+
+\begin{figure}
+ \begin{withattachment}{annulus.mp}
+ \centering
+ \includegraphics{annulus-1.mps}
+ \end{withattachment}
+ \caption{\texttt{unfill} example}
+ \label{fig:annulus1}
+\end{figure}
+
+Notice that |p| is a |fullcircle| of radius 54\,bp (3/4\,in) and |q| is
+a |fullcircle| of radius 27\,bp (3/8\,in). The annulus is constructed
+by filling |p| with the baby blue color |bbblue| and then unfilling |q|.
+The |unfill| command above is equivalent to
+
+\begin{lstlisting}[style=MP]
+fill q withcolor background;
+\end{lstlisting}
+where |background| is a built-in color which is |white| by default.
+
+Often the |unfill| command appears to be the natural method for
+constructing figures like \autoref{fig:annulus1}. However, the |fill|
+and |unfill| commands in \autoref{fig:annulus1} can be replaced by
+
+\begin{lstlisting}[style=MP]
+fill p--reverse q--cycle withcolor bbblue;
+\end{lstlisting}
+
+\begin{figure}
+ \begin{withattachment}{annulus.mp}
+ \centering
+ \includegraphics{annulus-2.mps}
+ \end{withattachment}
+ \caption{Avoiding an \texttt{unfill}}
+ \label{fig:annulus2}
+\end{figure}
+
+The path |p--reverse q--cycle| travels around |p| in a counter-clockwise
+directions (since this is the direction that |p| traverses) followed by
+a line segment to connect to |q|. It then traverses clockwise around
+|q| (using the |reverse| operator) and finally returns to the starting
+point along a line segment using |--cycle|. This path is illustrated in
+\autoref{fig:annulus2}. One reason for using this method to construct
+the annulus as opposed to the |unfill| command is to ensure
+\textit{proper transparency} when placing the figure in an external
+document with a non-white background. If the former method is used and
+the annulus is placed on a non-white background, say magenta, then the
+result is \autoref{fig:annulus3}.
+
+\begin{figure}
+ \begin{withattachment}{annulus.mp}
+ \centering
+ \includegraphics{annulus-3.mps}
+ \end{withattachment}
+ \caption{Improper transparency using \texttt{unfill}}
+ \label{fig:annulus3}
+\end{figure}
+
+It may be desired to have the interior of |q| be magenta instead of
+|white|. This could be accomplished by redefining |background|;
+however, the latter method described above is a much simpler solution.
diff --git a/systems/doc/metapost/source-tutorial/graph.tex b/systems/doc/metapost/source-tutorial/graph.tex
new file mode 100644
index 0000000000..b9d2e0503d
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/graph.tex
@@ -0,0 +1,52 @@
+\section{Graphing functions}
+\label{sec:graphing}
+
+Among the most common types of figures for \TeX{} users are those which
+are the graphs of functions of a single variable. Hobby recognized this
+and constructed a package to accomplish this task. It is invoked by
+
+\begin{lstlisting}[style=MP]
+input graph;
+\end{lstlisting}
+
+\MP{} has the ability to construct data (i.e., ordered pairs) for
+graphing simple functions. However, for more complicated functions, the
+data should probably be constructed using external programs such as
+\acro{MATLAB} (or Octave), Maple, Mathematica, Gnuplot, et. al.
+
+A typical data file, say \File{data.d}, to be used with the \File{graph}
+package may have contents
+
+\vspace{8pt}
+\noindent%
+\begin{tabular}[b]{@{\hspace{48pt}}l@{}}
+ \lstinputlisting[style=text, boxpos=b]{data.d}
+\end{tabular}%
+\qquad%
+\attach[subject={Graph data}]{data.d}
+\vspace{8pt}
+
+This data represents the graph of $f(x)=\sqrt{x}$ for six equally spaced
+points in $[0,1]$. To graph this data, the size of the graph must first
+be decided. Choosing a width of $144\mathrm{\ bp}$ and a height of
+$89\mathrm{\ bp}$, a minimally controlled plot (as in
+\autoref{fig:data}) of this data can be generated by
+
+\begin{lstlisting}[style=MP]
+draw begingraph(144bp,89bp);
+ gdraw "data.d";
+endgraph;
+\end{lstlisting}
+
+The \File{graph} package provides many commands used to customize
+generated graphs, and these commands are fully documented in the
+manual~\cite{hobby:graph} for the \File{graph} package.
+
+\begin{figure}
+ \begin{withattachment}{data.mp}
+ \centering
+ \includegraphics{data.mps}
+ \end{withattachment}
+ \caption{$f(x)=\sqrt{x}$ using the \texttt{graph} package}
+ \label{fig:data}
+\end{figure}
diff --git a/systems/doc/metapost/source-tutorial/inclusion.tex b/systems/doc/metapost/source-tutorial/inclusion.tex
new file mode 100644
index 0000000000..9ba1f3051b
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/inclusion.tex
@@ -0,0 +1,23 @@
+\section{Including \MP{} figures in \LaTeX}
+\label{sec:latexincl}
+
+In order to include a \MP{} figure in \LaTeX{}, the \File{graphicx}
+package is suggested. Below is an example of including a \MP{} figure
+(with name \File{foo-1.mps}) in a \LaTeX{} document.
+
+\begin{lstlisting}[style=LaTeX]
+\documentclass{article}
+\usepackage{graphicx}
+\begin{document}
+|\dots|
+\includegraphics{foo-1.mps}
+|\dots|
+\end{document}
+\end{lstlisting}
+
+Having a \File{.mps} file extension on the graphic allows the same
+graphic to be included in both \LaTeX{} and \PDF\LaTeX{} documents.
+When using \PDF\LaTeX, the EPS graphic (with file extension \File{.mps})
+is converted to \PDF{} ``on the fly'' using Hans Hagen's \File{mptopdf}.
+This conversion is necessary since \PDF\LaTeX{} performs no \PS{}
+processing.
diff --git a/systems/doc/metapost/source-tutorial/intro.tex b/systems/doc/metapost/source-tutorial/intro.tex
new file mode 100644
index 0000000000..d7e8964dd9
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/intro.tex
@@ -0,0 +1,56 @@
+\section{Introduction}
+\label{sec:introduction}
+
+To accompany \TeX{}, Knuth developed \MF{} as a method of ``creating
+entire families of fonts from a set of dimensional parameters and
+outline descriptions''~\cite{beebe:mf}. Approximately ten years later,
+John Hobby began work on \MP{}\Dash ``a powerful graphics language based
+on Knuth's \MF, but with PostScript output and facilities for including
+typeset text''~\cite{hobby:user}. Although several packages (e.g.,
+\PiC\TeX, \Xy-pic, and the native \LaTeX{} picture environment to name a
+few) are available for creating graphics within \TeX-based documents,
+they all rely on \TeX{}. Since \TeX{} was designed to typeset text, it
+seems natural that an external utility should be used to generate
+graphics instead. Furthermore, in the event that the graphics require
+typeset text, then the utility should use \TeX{} for this requirement.
+This premise is exactly the philosophy of \MP.
+
+Since \MP{} is a programming language, it accommodates data structures
+and flow control, and compilation of the \MP{} source code yields \EPS{}
+graphics. These features provide an elegant method for generating
+graphics. \autoref{fig:circles} illustrates how \MP{} can be used
+programatically. The figure is generated by rotating one of the circles
+multiple times to obtain the desired \textit{circular chain}.%
+\footnote{All graphics in this tutorial (except \autoref{fig:previewer})
+ are created with \MP{}, and the source code and any required external
+ data files for each of these graphics are embedded as file attachments
+ in the electronic \PDF{} version of the article. Attachments are
+ indicated by a paper clip icon.
+
+ \vspace{-\baselineskip}
+ \noindent%
+ \raisebox{0pt}[0pt][0pt]{%
+ \makebox[0pt][r]{%
+ \notextattachfile{\paperclip}%
+ \hspace*{\marginparsep}%
+ }%
+ }%
+}
+
+\begin{figure}
+ \begin{withattachment}{circles.mp}
+ \centering
+ \includegraphics{circles.mps}
+ \end{withattachment}
+ \caption{Rotated circles}
+ \label{fig:circles}
+\end{figure}
+
+The programming language constructs of \MP{} also deliver a graceful
+mechanism for creating animations without having to manually create each
+frame of the animation. The primary advantage of \EPS{} is that it can
+be scaled to any resolution without a loss in quality. It can also be
+easily converted to raster formats, e.g.\ Portable Network Graphics
+(\PNG) and Joint Photographic Experts Group (\JPEG), et al., or other
+vector formats including Portable Document Format (\PDF) and Scalable
+Vector Graphics (\SVG), et al.
diff --git a/systems/doc/metapost/source-tutorial/label.mp b/systems/doc/metapost/source-tutorial/label.mp
new file mode 100644
index 0000000000..da0afcbf89
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/label.mp
@@ -0,0 +1,63 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j-%c.mps";
+
+verbatimtex
+%&latex
+\documentclass[11pt]{article}
+\usepackage[charter]{mathdesign}
+\usepackage[T1]{fontenc}
+\renewcommand*{\ttdefault}{lmtt}
+\begin{document}
+etex
+
+% Determine the size of the default font
+w:=fontsize defaultfont;
+
+beginfig(1);
+ % Place a "point" at (0,0)
+ fill fullcircle scaled 3;
+
+ % Draw a square around the point
+ draw (-7*w/16,-7*w/16)--(7*w/16,-7*w/16)--(7*w/16,7*w/16)--(-7*w/16,7*w/16)--cycle;
+
+ % Draw vertical and horizontal lines through the point
+ draw (0,-7*w/16)--(0,7*w/16);
+ draw (-7*w/16,0)--(7*w/16,0);
+
+ % Label the 4 positions
+ label.lft(btex \texttt{lft} etex,(-w/4,0));
+ label.rt(btex \texttt{rt} etex,(w/4,0));
+ label.bot(btex \texttt{bot} etex,(0,-w/4));
+ label.top(btex \texttt{top} etex,(0,w/4));
+
+ % Manually set the bbox
+ setbounds currentpicture to (-2*w,-2*w)--(2*w,-2*w)--(2*w,2*w)--(-2*w,2*w)--cycle;
+endfig;
+
+beginfig(2);
+ % Place a "point" at (0,0)
+ fill fullcircle scaled 3;
+
+ % Draw a square around the point
+ draw (-7*w/16,-7*w/16)--(7*w/16,-7*w/16)--(7*w/16,7*w/16)--(-7*w/16,7*w/16)--cycle;
+
+ % Draw diagonals of the square through the point
+ draw (-7*w/16,-7*w/16)--(7*w/16,7*w/16);
+ draw (-7*w/16,7*w/16)--(7*w/16,-7*w/16);
+
+ % Label the 4 positions
+ label.llft(btex \texttt{llft} etex,(-w/4,-w/4));
+ label.ulft(btex \texttt{ulft} etex,(-w/4,w/4));
+ label.lrt(btex \texttt{lrt} etex,(w/4,-w/4));
+ label.urt(btex \texttt{urt} etex,(w/4,w/4));
+
+ % Manually set the bbox
+ setbounds currentpicture to (-11/4*w,-2*w)--(11/4*w,-2*w)--(11/4*w,2*w)--(-11/4*w,2*w)--cycle;
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/label.tex b/systems/doc/metapost/source-tutorial/label.tex
new file mode 100644
index 0000000000..6377deb6cb
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/label.tex
@@ -0,0 +1,99 @@
+\subsection{The \texttt{label} command}
+
+One of the nicest features of \MP{} is that it relies on \TeX{} (or
+\LaTeX) to typeset labels within figures. Almost all figures in
+technical documents are accompanied by labels which help clarify the
+situation for which the figure is assisting to illustrate. Such labels
+may include anything from simple typesetting as in
+Figures~\ref{fig:draw1}, \ref{fig:annulus2}, and~\ref{fig:draw2} to
+typesetting function declarations and even axes labeling.
+
+The |label| command requires two arguments\Dash a string to typeset and
+the point for which label is placed. For example, the command
+
+\begin{lstlisting}[style=MP]
+label("A", (0,0));
+\end{lstlisting}
+will place the letter ``A'' at the coordinate |(0,0)| and the box around
+this label is centered vertically and horizontally at this point.
+Simple strings like \lstinline[style=text]{"A"} require no real
+typesetting to ensure that they appear properly in the figure. However,
+many typeset strings in technical figures require the assistance of
+\TeX{} to properly display them.
+
+\begin{figure}
+ \begin{withattachment}{parabola.mp}
+ \centering
+ \includegraphics{parabola.mps}
+ \end{withattachment}
+ \caption{Labeling text}
+ \label{fig:parabola}
+\end{figure}
+
+For example, \autoref{fig:parabola} is an example where typesetting is
+preferred. That is, the axes labels and the function declaration look
+less than perfect if \TeX{} is not used. For reasons such as this,
+\MP{} provides a way to \textit{escape} to \TeX{} in order to assist in
+typesetting the labels. Therefore, instead of labeling the ``A'' as
+above,
+
+\begin{lstlisting}[style=MP]
+label(btex A etex, (0,0));
+\end{lstlisting}
+provides a much nicer technique for typesetting the label. The
+|btex ... etex| block instructs \MP{} to process everything in between
+|btex| and |etex| using \TeX. Therefore, the function declaration in
+\autoref{fig:parabola} is labeled using
+
+\begin{lstlisting}[style=MP]
+label(btex $f(x)=x^2$ etex, (a,b));
+\end{lstlisting}
+where $(a,b)$ is the point for which the label is to be centered.
+
+Since many \MP{} users prefer to typeset their labels using \LaTeX{}
+instead of plain \TeX, \MP{} provides a convenient method for
+accommodating this, done in the preamble of the \MP{} source file. The
+following code ensures that the |btex ... etex| block escapes to
+\LaTeX{} (instead of plain \TeX) for text processing.
+
+\begin{lstlisting}[style=MP]
+verbatimtex
+%&latex
+\documentclass{minimal}
+\begin{document}
+etex
+beginfig(|$n$|);
+|\quad$\langle\mbox{\normalfont\textit{draw commands}}\rangle$|
+endfig;
+end
+\end{lstlisting}
+
+Often times it is desirable to typeset labels with a justification that
+are not necessarily centered. For example, one may wish to place an
+``A'' centered horizontally about |(0,0)|, but placed above
+|(0,0)|. \MP{} provides eight suffixes to accommodate such needs. The
+suffixes |.lft|, |.rt|, |.bot|, and |.top| align the label on the left,
+right, bottom, and top, respectively, of the designated point. A hybrid
+of these four justifications provide four additional ones, namely,
+|.llft|, |.ulft|, |.lrt|, and |.urt| to align the label on the lower
+left, upper left, lower right, and upper right, respectively, of the
+designated point. For example,
+
+\begin{lstlisting}[style=MP]
+label.top(btex A etex, (0,0));
+\end{lstlisting}
+places the ``A'' directly above |(0,0)|. \autoref{fig:label}
+demonstrates each of the suffixes and their corresponding placement of
+the labels.
+
+\begin{figure}
+ \begin{withattachment}{label.mp}
+ \hfill%
+ \includegraphics{label-1.mps}%
+ \hfill%
+ \includegraphics{label-2.mps}%
+ \hfill\mbox{}%
+ \end{withattachment}
+ \caption{Label suffixes}
+ \label{fig:label}
+\end{figure}
diff --git a/systems/doc/metapost/source-tutorial/mpintro.bib b/systems/doc/metapost/source-tutorial/mpintro.bib
new file mode 100644
index 0000000000..3915cdd225
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/mpintro.bib
@@ -0,0 +1,35 @@
+@book{knuth:texbook,
+ author = {Knuth, D. E.},
+ title = {The \TeX{}book},
+ series = {Computers and Typesetting},
+ volume = {A},
+ publisher = {Addison Wesley},
+ address = {Boston},
+ year = {1986}
+}
+@misc{beebe:mf,
+ author = {Beebe, N. H. F.},
+ title = {Metafont},
+ year = {2006},
+ howpublished = {\url{http://www.math.utah.edu/~beebe/fonts/metafont.html}}
+}
+@techreport{hobby:user,
+ author = {Hobby, J. D.},
+ title = {A User's Manual for {\MP{}}},
+ series={Computing Science Technical Report},
+ number={162},
+ institution={AT\&T Bell Laboratories},
+ address={Murray Hill, New Jersey},
+ year={1992},
+ note={Also available at \url{http://www.tug.org/docs/metapost/mpman.pdf}}
+}
+@techreport{hobby:graph,
+ author = {Hobby, J. D.},
+ title = {Drawing Graphs with {\MP{}}},
+ series={Computing Science Technical Report},
+ number={164},
+ institution={AT\&T Bell Laboratories},
+ address={Murray Hill, New Jersey},
+ year={1992},
+ note={Also available at \url{http://www.tug.org/docs/metapost/mpgraph.pdf}}
+}
diff --git a/systems/doc/metapost/source-tutorial/mpintro.ltx b/systems/doc/metapost/source-tutorial/mpintro.ltx
new file mode 100644
index 0000000000..f988b0ca9e
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/mpintro.ltx
@@ -0,0 +1,182 @@
+% This document is in the public domain.
+% Originally written 2007, 2008 Troy Henderson.
+\documentclass[11pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage[charter]{mathdesign}
+\renewcommand*{\ttdefault}{lmtt}
+\linespread{1.05}
+\usepackage{textcomp}
+\usepackage{mflogo}
+\usepackage{microtype}
+\usepackage{ifpdf}
+\ifpdf\microtypesetup{expansion=true}\fi
+\usepackage[margin=1.25in,letterpaper]{geometry}
+\usepackage[rgb,x11names]{xcolor}
+\usepackage{graphicx}
+\usepackage{listings}
+\lstloadlanguages{MetaPost, [LaTeX]TeX}
+\lstdefinelanguage[ext]{MetaPost}[]{MetaPost}{
+ morekeywords={verbatimtex},
+ morekeywords=[2]{blackpart, cmykcolor, colormodel, colorpart,
+ cyanpart, greypart, magentapart, rgbcolor, yellowpart},
+ morekeywords=[3]{filenametemplate, withcmykcolor, withgreyscale,
+ withoutcolor, withpostscript, withprescript, withrgbcolor},
+ morekeywords=[5]{defaultcolormodel, mpprocset, outputformat,
+ outputtemplate},
+ morekeywords=[6]{mpversion},
+ morecomment=[s][basicstyle]{\%}{&},
+ deletekeywords=[4]{z}
+}
+\lstset{
+ basicstyle=\normalfont\ttfamily,
+ columns=flexible, breaklines=true, breakatwhitespace=true,
+ escapechar=|,
+ aboveskip=8pt, belowskip=8pt,
+ frame=leftline, framerule=32pt, framesep=16pt, xleftmargin=48pt
+}
+\colorlet{mpcolor}{Chartreuse3!50!white!95!black}
+% \colorlet{testcolor}{mpcolor!90!black}
+% \extractcolorspec{testcolor}{\testcol}
+% \show\testcol
+\lstdefinestyle{MP}{
+ language=[ext]MetaPost,
+ keywordstyle=\bfseries\color{mpcolor!75!black},
+ commentstyle=\itshape,
+ rulecolor=\color{mpcolor}
+}
+\lstdefinestyle{LaTeX}{
+ language=[LaTeX]TeX, keywordstyle={}, commentstyle=\itshape,
+ rulecolor=\color{PeachPuff2}
+}
+\lstdefinestyle{text}{
+ keywordstyle={}, commentstyle={},
+ rulecolor=\color{Snow2!95!black}
+}
+\lstMakeShortInline[style=MP, keywordstyle={}, commentstyle={}]|
+\newcommand*{\File}[1]{\texttt{#1}}
+\usepackage{float}
+\floatplacement{figure}{htp}
+\floatplacement{table}{tp}
+\usepackage{hyperxmp}
+\usepackage{hyperref}
+\hypersetup{
+ pdfencoding=unicode,
+ pdfstartview=FitH,
+ pdfpagemode=UseNone,
+ colorlinks=true,
+ linkcolor=RoyalBlue3,
+ urlcolor=Chocolate4,
+ citecolor=DeepPink2
+}
+\usepackage{attachfile2}
+\attachfilesetup{
+ mimetype={text/plain}
+}
+\newcommand*{\paperclip}[1][]{\includegraphics[#1]{paperclip.mps}}
+\newcommand*{\attach}[2][]{%
+ \textattachfile[description={#2},#1]{#2}{\paperclip}%
+}
+\newlength{\attachmentraise}
+\newenvironment{withattachment}[2][0pt]
+{%
+ \setlength{\attachmentraise}{#1}%
+ \addtolength{\attachmentraise}{6pt}%
+ \makebox[0pt][l]{%
+ \raisebox{\attachmentraise}[0pt][0pt]{%
+ \makebox[32pt][c]{%
+ \attach[subject={MetaPost source file}]{#2}%
+ }%
+ }%
+ }%
+ \begin{minipage}[b]{\linewidth}%
+ }{%
+ \end{minipage}%
+}
+
+%%% Definitions copied from ltugboat.cls.
+\makeatletter
+\DeclareRobustCommand\SMC{%
+ \ifx\@currsize\normalsize\small\else
+ \ifx\@currsize\small\footnotesize\else
+ \ifx\@currsize\footnotesize\scriptsize\else
+ \ifx\@currsize\large\normalsize\else
+ \ifx\@currsize\Large\large\else
+ \ifx\@currsize\LARGE\Large\else
+ \ifx\@currsize\scriptsize\tiny\else
+ \ifx\@currsize\tiny\tiny\else
+ \ifx\@currsize\huge\LARGE\else
+ \ifx\@currsize\Huge\huge\else
+ \small\SMC@unknown@warning
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+}
+\newcommand\SMC@unknown@warning{\TBWarning{\string\SMC: nonstandard
+ text font size command -- using \string\small}}
+\newcommand\textSMC[1]{{\SMC #1}}
+\newcommand\acro[1]{\textSMC{#1}\@}
+\def\endash{--}
+\def\emdash{\endash-}
+\def\thinskip{\hskip 0.16667em\relax}
+\def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces}
+\def\Dash{\d@sh\nobreak\emdash}
+\def\JPEG{\acro{JPEG}}
+\def\PiC{P\kern-.05em\lower.5ex\hbox{I}\kern-.07emC\@}
+\def\PNG{\acro{PNG}}
+\def\PS{\acro{PS}}
+\def\SVG{\acro{SVG}}
+\makeatother
+
+\def\EPS{\acro{EPS}}
+\def\PDF{\acro{PDF}}
+\def\SVG{\acro{SVG}}
+\def\Xy{\leavevmode
+ \hbox{\kern-.1em X\kern-.15em\lower.4ex\hbox{Y\kern-.05em}}}
+\def\textdegree{$^\circ$}% real \textdegree is too small
+\def\RGB{\acro{RGB}}
+\def\CMYK{\acro{CMYK}}
+
+\iffalse
+% workaround for acrobat 7+8 bugs in printing
+ \let\origtextattachfile=\textattachfile
+ \renewcommand{\textattachfile}[3][]{%
+ {\notextattachfile[#1]{#3}}%
+ \origtextattachfile[#1]{#2}{#3}%
+ }
+\fi
+
+\newcommand*{\showcol}[2][named]{%
+ \begingroup%
+ \setlength{\fboxsep}{0pt}%
+ \setlength{\fboxrule}{0.2pt}%
+% \raisebox{1pt}{%
+ \fcolorbox{gray}[#1]{#2}{%
+ \makebox[1.5em]{\rule{0pt}{1.25ex}}%
+ }%
+% }%
+ \endgroup%
+}
+
+\begin{document}
+
+\hypersetup{
+ pdftitle={A Beginner's Guide to MetaPost for Creating High-Quality Graphics},
+ pdfauthor={Troy Henderson, Stephan Hennig},
+ pdfsubject={MetaPost},
+ pdfkeywords={graphics, MetaPost, TeX, LaTeX, PostScript},
+ pdfcopyright={Public Domain}
+}
+
+\title{A Beginner's Guide to \MP{}\\for Creating High-Quality Graphics}
+\author{Troy Henderson \and Stephan Hennig}
+\maketitle
+
+\input{abstract}
+\input{intro}
+\input{compilation}
+\input{data}
+\input{commands}
+\input{graph}
+\input{inclusion}
+\input{conclusion}
+\input{biblio}
+
+\end{document}
diff --git a/systems/doc/metapost/source-tutorial/paperclip.mp b/systems/doc/metapost/source-tutorial/paperclip.mp
new file mode 100644
index 0000000000..6d20f9ce3e
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/paperclip.mp
@@ -0,0 +1,25 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j.mps";
+
+beginfig(0);
+ path p;
+ p := (0,3/16)
+ --(halfcircle rotated 180 scaled (1/4) shifted (1/8,-1/4))
+ --(halfcircle scaled (3/8) shifted (1/16,3/8))
+ --(halfcircle rotated 180 scaled (1/2) shifted (1/8,-1/2))
+ --(3/8,3/16);
+ draw p scaled 18 withpen pencircle scaled 1.25bp
+ withcolor (0.5985,0.7712,0.4275);
+% For the color specification cf. mpintro.ltx:
+% (0.5985, 0.7712, 0.4275) = mpcolor!90!black
+% with mpcolor being defined as
+% \colorlet{mpcolor}{Chartreuse3!50!white!95!black}
+% and Chartreuse3 = (0.4, 0.804, 0)
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/parabola.mp b/systems/doc/metapost/source-tutorial/parabola.mp
new file mode 100644
index 0000000000..f508df4fd7
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/parabola.mp
@@ -0,0 +1,45 @@
+prologues:=3;
+
+if scantokens(mpversion) > 1.005:
+ outputtemplate :=
+else:
+ filenametemplate
+fi
+"%j.mps";
+
+verbatimtex
+%&latex
+\documentclass[11pt]{article}
+\usepackage[charter]{mathdesign}
+\usepackage[T1]{fontenc}
+\renewcommand*{\ttdefault}{lmtt}
+\begin{document}
+etex
+
+beginfig(0);
+ % Set unit size to 108pt = 3/2in
+ u:=72;
+ v:=2*u/(1+sqrt(5));
+
+ % Determine the size of the default font
+ w:=fontsize defaultfont;
+
+ % Draw the parabola
+ draw (-u,2*v){dir -angle(1*u,4*v)}..(-u/2,v/2){dir -angle(1*u,2*v)}..(0,0){right}..(u/2,v/2){dir angle(1*u,2*v)}..(u,2*v){dir angle(1*u,4*v)} withcolor red withpen pencircle scaled 1bp;
+
+ % Label f(x)
+ label.lft(btex $f(x)=x^2$ etex,(sqrt(3)/2*u,3/2*v));
+
+ % Draw x and y axes arrows
+ drawarrow (-u,0)--(u+w/2,0);
+ drawarrow (0,0)--(0,2*v+w/2);
+
+ % Label the x and y axes
+ label.rt(btex $x$ etex,(u+w/2,0));
+ label.top(btex $y$ etex,(0,2*v+w/2));
+
+ % Pad left size to horizontally center figure
+ label.lft(btex $\phantom{x}$ etex,(-u-w/2,0));
+
+endfig;
+end
diff --git a/systems/doc/metapost/source-tutorial/previewer.eps b/systems/doc/metapost/source-tutorial/previewer.eps
new file mode 100644
index 0000000000..13407ae150
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/previewer.eps
@@ -0,0 +1,378 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Pages: 1
+%%BoundingBox: 0 0 974 583
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%Page: 1 1
+save 9 dict begin
+{/T currentfile/ASCII85Decode filter def[/Indexed/DeviceRGB 255 T 768 string readstring pop]setcolorspace
+/F T/LZWDecode filter def
+<</ImageType 1/Width 974/Height 583/BitsPerComponent
+8/ImageMatrix[1 0 0 -1 0 583]/Decode
+[0 255]/DataSource F>> image
+ F closefile T closefile}
+%%BeginData:;
+exec
+!!*)Um/I1h#I!.df\smX!W["XI/jKZ$5"1'1-SNHI#4oM-?756EA&4c:n#Jt"q`uFlMfH%oILFU!X9
+<O[-(5nkJac7"qNE%k5,T0IUjE-gZ%_Cai8R582l.HLXu+Je"a%AQs<s%3&3'%%grXM"remD1ItkhO
+L)@(["O-b2`Wc;*utgs#!bmgH]=c"I6$!DjI;6_:/=P1*#.&Zf7eTk84Z1<YK,eqr(K4+ABX\gVFGk
+U&-b(qMD5l:'acO*ad#[G$l)^UYF79k'6pG1a085A%3T/Gb1GC_Vj`Db#m:>;-)H?('a=aL.^*/J/0
+.[%\WKE@O476jd<o+]05RuB`-c/[)PpXah:7J5e?0-1Pak2`#omg6k1RG65/*FoeC'^\'+7o_O/^.T
+cdL-mG\79n7F/haa3WD8Vk_o*d3Vb?APFGFZFma$o2d%E'K`2&L,>p7n<qr)Ld;om[&7_WCHE%37:U
+re7\nhmauiXAc,4IKEaq.q`K$";-m'&8k33C7P/=JRSABVST3.DGPI$sj$Qoih&e8MdACB?23J4mS,
+Z27i]Qm9q-;T[\+UlN)Rp:*2\Z;>d5<R`XgFX]i!!`"<JG0Zt/s0c<&JFY1Fo&eJp,PY9Q)FMlQLfr
+Xoee;mF)Ue#+nKZ=rKWK?6YH4#-1Q7.nRAm*E(BFd\,'E37Q*="a0YJ!<qom!ofn'*Y'fl_cM3-h7o
+(TI0/GLd<`@;^Xt2.T+',I]?;DXp5sI(N/U"N@+XX,7^YRGUF"eBYgYIpJb)j*Z+;kD0,pWEhr:0CJ
+kN_65YH4=fS9o[1(DmnZp@C!p0_kM=FEV`cjl5Rch;[2<ahY6EKQ@+jqUa-N][ba](D(MucEP.._P)
+At:F,Mul\!@2IriaT<h76tETben,q;cg4;Uj@,&!.>>I)QGmFpUD?fJh]T!l8TM)FkhbamSYmc1Z'H
+=)*2OnS;5C0cc`*uXY6il^Q`J,g]g3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'n
+b-^757;Rkop>q_R=AlC^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/m<k<ioGu5cYX2j`
+\=EYZP^B4!g3;B=(iZ<k:G/fl+B*DHAorf'R[o?>ioU`Obkp^gM+`4=1jRLW!S=fUQP4*KS9PE`kN$
+P8BM.Aoh+fk'&t\[,pou4XQLi7>#=I>.[gn=g,J(^d'oQ&.8`=!Ol:E<%&4^"G22J%GpZ*^>Nt5HC]
+gMSQOKbqGt*k12%,M;E:;HE&\qGmE]5>l]6h!kO_e?*hR#<&.f,kJjDTF[L9d(K`\[>2!uLb/e@:&!
+PjPmUB87=U(Rh\5e7Tr+HOA\$j/!?"Iu2?U_=3TMl[F!`!T*L%44?q*rA8Y'CM1hJET,MTRcql'rT@
+4>8Ns;PX?J3M]=r&a:YE`",$u26A6b:i'\01JLF1oK],0opnfH].KG&d:f\0^JS8=:JH7`:(eX%VqA
+>m1,%;Do@A%?O!)eKj.OJT.DB)C/.t.VTi%T45!&Cj&1X.A$;B5sMfLjnq;H0&38eRBh!5Z`!GaX>c
+/;fc\oQ6QMatfDr+!?.2@NZeXg0=\%[(9aC;ABWfQdGA!(A5a+b(Cef<U:-GLaX*nQj@@BM#dmV1(k
+!$nu<WZM$RLP,pmQoQ@arBLmTN_,'BiP$0$OP.+$On#9"o^\d<3(LaZd_>lY=tA_F&0k(3qSSOm<rY
+tAMOTb_*Hll]]Q@eq3edTpOZ?kgbM?jJq"1L8UdrEj%@]m5RsLbPcYM))SPE?ITKqBs8g8-CGMW*Q'
+O@97>!QNB]+"IKP[BX!k^3D's*Am'9&REHJV>(I&W%T%l@Bn3XD$.PG\JdT(PE0t?Q<goA5PgWkjTV
+D!b0;*q!A$"cpAXn?d2i]o-h7JF'MBIN]8-!Ct#fM:GJBQ.kTth?9:0bRE(kr*OVQ?1k=TVsG+kon#
+IGB.S&Vm77[B[n:I"E6P-0$:TR.#Ca+2@;-*3m,+&7u_p:4k.fQugto<Pfo+T66.f;@?F/+@78XfcX
+A>_AQRFBZr8a,='_M%9/iM22)']E\i>u#WO^O\?Z>)EG:BYJk\UV=9&fj3$\uo(<"DII3=TZ3/(e6T
+qH79)M(5&S?O[S6]s#1,e;tI5QpZ7CX4,a7$iZa#TX5/-6R7nnA%PW5bL3_H-\c;3C!SDM0$I4,e,P
+7j]hdn/'<K@."T1RK#(gt!dCcghEs,EC0_DR"9E*HSek!af(gt/j:U!1p9%0,P(eLdh4FZMF<*n#6r
+&8)#;nhSc]sr$%a.k]1cP&b&Tg`Z,T$jnEb>p('L=%m%"Z?!d,/%(UOoW3K#XGc)[I-HM@d.]X:P@8
+#TJ$uE#CFNJ,p[c_l[\$Q5_p<CEl[Wb^r([3X:6@fouj-K>9a?7$UCD;##;H5`m]N\NiLnciJdI.$u
+u7"IaiHHQ[n/1S<mBL'WI3G7+\F8\$lJ@/p=]Yn3891'DtN3A?fAY$a:'$>flb!tV?I&2`q_/1"-rP
+ERat`+=]L)k;tZ#]/WP=T6HJ)<#!,4lJmd?lu!39U+Te!#"PI5b(a:+L>kac!gq^',#bP1@B-MC$=s
+FbTeHUgkO,&>cJ&K@X)Dqn4,56'*(;UOB==JL]N24M6Kg\"H`fp#2ipG<)NugKgMG/Gk;U^)hWqkE`
+k5j;(7c&jc\;=^0raa9]hOA[,,d_Qb_c_g%>8p6(q-=PZ_fD(EJ*^!\gWBC^V>a"XMUn0Z`udO&]sl
+:iJTk;1d8-TdVT%2K#VGcfZ`G>%M!C==]J0bbi@"JlO%/#Ug&JA:fBXnp?)QoDlTlLX8qd"LeL7K4'
+93Q6:H]`89RZHbC@aU![QGRU%d1!N4I_opX]Z(9NgR"!g]Zenb<k]"o[3-m1bkA,tCEFW`Xd&defan
+Gj%50$bg]+@NW1^^gm_RT?rrSmB+=.-B<o;6eZS##tZlJ,uhV(N5f6_Mh;i!!Y.a28Ki2]A#N'4DO3
+Eik>kL%g50P<#3tLOE;QM67KLI-*[F`YgbqZj)CSGY6mlWTZJB90Y!,e<i$pX_DW^5^k,;f"[j4"*"
+[ocqWu*mN'<RrkhK(SUsEF*o:VbWhVLclj&1l@80A%%X?lU_bFi;AL6G.9e3+g=;Y7^X9CV;c1/,#1
+::LQ8.1In$/7\%7a2)d)kJ,I3I$Cn7E_M:^YB!`4`R2oc*QtHFG`pBD)t'+%X2kE3+JMO12U#P<'ED
+!eJf'*%.$>;VJ-/e*g/0YX@m!HX<EE3K['a+?<]-%>\-j]81>9cEWX9uI6'2ls^aM&h@3Dfl!XT?V2
+%Z#_W%c$G=XZ)UKb83K2AnP)1Rhi$G%+NPf4ZIVPh5U;hLZ>uE`0DP80,d9>fehPJe=q+$HO?K7?73
+ef7HeD=#;49Jmc)7?\;cH<5fB'6dZlD!DVB$)'Q;1p`,FS#WO^OTic:phgc*]JW^eYJqF[\3$_''9&
+2!E-,X\pK+6j#+qBV=0IZu,_FRuM@l?V!SKOYI:Qb\q1uiN*RVjUiiu$?-O(84p6i_i(QE^kFRYEJh
+C7+ueP6\&W/;6m1h64#T?l#Suj1?A9Qsk?MmkA/h`qR2A)K$piTgKc=O^<k5U4k?PO9K4Ba^57jMUa
+KS3[FVY&&_]-Fhti`$r4(9TW&?^=7aVd6kH-ARM5fJe+uef/m%.5^@o7H6+qI?f63\XS#T.0^e"/fX
+X!bb$&^%F[i9mpUmgpJ,h0]/HmHEZ%[_Ii+**A94ShktUXl>7^nG*/:6Wk.*_(d7ktfXYGQ$^fqBoV
+4lhl5sP$&k4Uo@W++=Ub%Vk3Sf:mOa>#YUgk#53m59R.m',_D@6>_'Y4,g[.`4dQ*C$#BNj&."LGir
+6Dh'7,<8C&kBf/jS%H?R00^'U:(Irnl3aLBV]<_mf:@TOYM;6=<:b5Y;?53!TTE]JBYTY"$3g1D;-8
+K"7$Y-A2Yo"jnGWQUdGAeaP@!JCGA8=HEjjKI-[BTL"Cl=:IPN\N']gi0(%2'M(&[;!r1u8"rWf@N7
+gmnKoR#e3H<Oo:0lAqBA=@OV4Bs.;[-tkK+>B&nE0JLf,ijaQT*(U#_haOa9hr3CtZ21oHTOV1ZKb<
+@_X&YEfg@=\CQ[.j_"#QP/Fd9=]<'jV5Cq'*_l=3JfI_"M^>Q-=ol]R58EEaI1LHBh^Ue2-\#GRaYk
+c9t@en9m#$WdtVj;3QX9gjL1T-V$9'8H7((^lCJX&E).A8BP1a4S^Z_L:SUuT8Ncu/'EWU-3Cc3q,m
+Pghgm_*N)*?)C![DePU/<BP7:3/$U=<dYc@Tj[B_<F=1k(K]g)N[tTgGRIC6_C03D/OU2B[N@1kSU-
+-\T$@$ApBtX0jcVktM'iidac2&iM.l*C:GAN)C7m907h.-)mVZVimJt7"m=m'EWe`M:8(]Kg;UNJtu
+BZED9O=8>-)B>-(`(\Oi]I6)\<B<Rlu&.E,fI!&Y[j<2*)gX#4C`p'"MqgBD"qb:Xp@6i_rWB\`s)k
+p=jYG7*$p;#gloTq\cNe0-fV`H:OP"JVpE;'/mffV^tJk/pJn?:dS=q\4,Zda6076u8EZZLftUOh3>
+8/Ch0BQEGVhgC8."h8Zu8BE8A-$nR;K%fe<!!#Y2,)iBK&Z8@l]c]Mfe77C]%PN5o(d;<jD<Nd'fe:
+e2(o""(*S>9,9P1m0+-u/\J]gO>u?9:h18DW7>(Qs4YX6G&72>I5.lL*Kt"(qcXhPg/7!8n76J>[P.
+_)I0FhqO?M>im*G#j(dlTOL1I2uuUi0EA/d:.oDgkp4i-:())#/gkf@!$^QQPgMo]KfqVn\.9TTj=u
+!/EM']?#9sPl2iP#8$HCRW+c4F$5&s*e,h?s-)>p%bEP9/nfe3p!1`Mi;$'HNNZiE"7!j[=W%o67o(
+L=*!?8-7b,C,1K@;l=-Yf3?X1]jW:'leS<"e3gSY<ch63MC)/G/dN-<!l!HB+\Hr_`:X_k%m=Q2!"r
+bMab)e]N?"CN0Ydb]kcZ?hbeCeG8$-GrF\h\PVd!4eiI_Ce_2%.F=+?G,a;PkH1iX=-EPg',?j@04/
+]Mtp!!uNMQMIK!/8f&\sI%VBFVCAFLHIh(3!/HiC6Hl*o#%c`fDd1+[EL8MP8e&F`,H;6A<L]'`u[Y
+&?XiQW#"dW]0=$smKG]Y-6iLMPQ51Cnc0nZ!*:+SWbY;?XfDaS\$g@6nNFL]nsgP,@]s'R]_adrGQH
+FNg3iGk3QSW0-fc4"MXl_@bP<4`YZqj3:1Tu</o_!=5R#Z!5h&JIGpgIqNq2AX_1;(]*Tk-Ai<mdP:
+q7SJkr;lBc^q'b.R)[g[G$[[WZBZ:=Id8K"/p:P?-^&miujX1Jlna>7K<LdeN=&"gY)=>aY#?O4.BD
+X.nrAl^"U.9F2DH/Dl.1)-h!8b^N*+!gZ`'_o$_oPL`0u%U2/@rKWCl2MY0rLk=D4*gMTgbkuI";h1
+H`HP?(k`=t<[X'>DLj$F+CsI=7e4?C%D:]j'NEbnfmm*eC-PH>E'l;u'chg\d\?3^\^?(Nr(HLLEbh
+oDdA=%GU/s*oKRHOf"a;KCf(<fW.4Ym@0m[$4$I`CFX:urkHAL.^.b/s7?9+!=;!W!5Ki]^bNSh49W
+H!"d"B<^gm\cKF"g[#sb9n^p3bf,R_E8VEio9^iU'_M746[1(+[]SC$'(nsD\`T`s@\$1M8PWVaM_=
+2C>+"n3O`E!cV5R)&i=_#,7ME.S\;K`f2G%B483BO?XQ?pRV`(t*a6nb[h>.%`%>Q$=pLTG*"2!!5g
+k_?+>cr%Fm;JUf-L$n4[HTalX8@"B^,"qW((3@4kg&clqP!_>K`q([Kf/dU)RL)MUt&U4G_@DaJrS<
+=tj@Mgg[.ZDS/_e_8kX?Q\5g-coI`&UIXoKX4CJV#9p!"]Au:]QDnqo'HD`@-onJ7:5Wl,+2W6!RHf
+(kJ:c*(?6d!RpCcTO%\M!>7?lL#@NuC_m'W3e3l4L&!a3Uch*'!/*>1_U&9Oi.VNZ:I[D17JHjP#a:
+2:Sd9s+J;d]k<*_tLid`EjL%s@kS8,A]Ak$ko`uHi=.@LoYG!O0_'mQgA`'([_==07da5Tu&*&IjV1
+5!*.$hQ4T$pBj&=+`cD*GMlM!+%ug!(()k)Gl,:aZkZ=]7>uJ_Dmd2d")IJ2%4kb_`:DM6raSE!(c1
+3%Od<mTL_Vhp5MA[*CqHEF;#/+D2rT!$UfKAFFQma:Pn-VQVe_/iFa%`O,2FuJ_1Tn'VC=$'7i][8D
+&V3aM%jD`;iFb$ZpNJ5feSN)&]*18l1+ti.7,gXam4Mb5!d7\LJ"ae4AQd,nt\J.&`%HZUt(gVHfff
+nf3MI&k7D78k`nf$l4aE=-cZ._.aCMbdbg>X9#gL&[[7kBYaaAXU,;H!#3A*i22ca),.-Ta'?_ZS<q
+D#*@Ei9#rI#8<..FK^VtTRV83Yagj+b7rI>Hj#"W;s=\9$Wlia]:-Ua?DR77B_Kb5lMbD;CN5\<*fK
+h^Xc:'B)QguYVBBLc=g!",6\@55s1nqLgic"-F%<)gh@CsB7p9E9SC?r/g.((CM%6=E^#A2YG=LdY]
+L32BS,(Q:gn:f%,n"<9pb?r>8V8Tk(70,^E\N"!i/:G3NG.=!4g:6GTi0P!-W!%1L`!jXLHnX';#9;
+W@N5fPhb42@Z?M,^cN*eFA?[!GF2YQ:?AkTD>qH3ZN`0j(^8;\lP=[9G4Z.u48]!\T]g5QXId2h/VN
+E*,4L(Cc/<@Uk]$<];%[aCK<o4Jj_A3A@[*THHLmNrr$%kLG1M$jsiVc>=+j.h#Yf@;"Lb0rPd7%L;
+2S>.>GnHshP<F*ZT-YA(H#>Msh`I`B]@hH-]QY(ofPeq(#[HLXJf/)Ti@HsT#a-_oeqH@9,7B=H^cp
+j@Nt5H!*BkPK^X?bbdur;XPD$j?[F:W*PA_%99T"i6::*='Fe1^s`-OK:#A_[t$L%Df9=3=j%?$q1c
+HOXs2LZ&q.K'uc;O>o1Kk'Km;QOfWC=`t?Na)95V@I36NC%#"7COrTH+aV%:4-,NMQR4$,iN27uB;C
+ndtb7`%,/\Y,i\M)/49<BqmP:Xs7bnEe$29h>$h)EUmN9*(FPH=.5cP+Oq1V@c#_`uK*!M)O'PV!>3
+d1f:i7F@?:*CnNlN?q0EPcZN1dhL%a:",?o3@?SGo`7q5F;6r;eJ1eY<Rm@O?!#SlN@.OXFVRJPb*=
+hq?.YA/I:(VB%>@O-N0S6b=V?.*@G-r`S7``%H([kF6*NBh>)%a+BA8a>I:BK?4d0m-(1"Uph%Z9K1
+`@^'#&049Te]uDJMc-q)MRuB?BN6q#&+u#6(`8WQn9=t1)CQAl+OT<abR122@YMtVQJK:O$TIg7aH-
+A)J]P0d0G2jpngc(@17T!LZL/cTnm:s%SrMF+gIaVQ_nWe1m+YK=<%HRdBIEjH79T(NOh+bU4mn2*"
+dr,@@N9O+YfElKk?-XRVS2V>/oZ;G/!J4H&g+-i`bd#:Bnh$*,B2.-EJ1!_-#D_#0)Bj:7C<qcq+\?
+=WADo;_Um\&]U-G[IKMGb/?V[nt)qo9$;K-EdY>AST9V!d-Pha@QCdeN"4=Vob;tK'a8$cWA0+#Tr'
+`#VTjd1K;3.X)?mGr)B8okQ3Yq7Pa<H/ng_M"eL^]<6BV*!inh\#?E^#\F$21`_0#Z0]g8*\;"S,_.
+X;q+O$lf+iS=]_3^jQIcX*N&`VB'?)SZ7E6hp,a&G7*'!I@OJ!^-Zak2(1[/Bf\#R:iu2aP5O#DD3m
+Q0Q?hYkeD*i/ZuP0*&#bX-3jS\1dO(ms%Fr*F=q"L^_dR^i%ppTY'LdEp`U*fU_8@)S7dT'7Pt[_+r
+Xjgp,kiG1uPpq"e^f4`)q3:TrEZu:IZ*^p_<=.HjXF8JMJAsE>RTX:Mir#)F8qU1rPT)M;qi4%=tVm
+6)7569m.qua8U/<'Ej-ZXQ:4-Wtca.;)N@E0JaPg*7j?")Gua`NC]En,XR;*&GdM65\N!KFHKia&AU
+DpZO@i'?86@qah:dg%3_NI+`'1Y86K2#jO45MTsc52nX;;Mm'0E\FD6]_V[.ojq3OaG:)E]&_GQQ$R
+71^rXjB*MT:EBDZSb7-M0a9^BR6"$;.iR),9>!-=(Ti5E_(JcX2][BKEXJFNB*mse;VtLA9;Sm3?^L
+#"PtA%*QUjj_*4b@UR]fl</DcEgh+e!TScE"9aBkf`0C^3PQC,J8cqN.r<&cdBPN@&HrIksD2hM38e
+$&ZFN/!OQrK2K;.;*/BZ2\k'P`p_6*`?'GV').C7;,q1c4%Q*>,&@gJcX"98K](VH#2Gdn5RoJES4q
+,%MEfof<G5bn$:d=\VkOF'"Drr\;_K4?tC3oW(,K4I%t1."S-o8E_B'F=O_uT[?_rGaTI-eP"JV+]=
+s^'3#[VYL,ta=tC!BYr/K_f#mbDL5^$qUJP[NHQK(SKfCOA>.rU3,@?jM!04Jt.5iPIp$3osKsn#$0
+cN6Mm#8BL<kVI0g4B;/[8jYm1=d#TB(f]_TQ3g\)-eOSFI@D"\P?0@SG+fJmR3cn17?BWH^*[RrPp'
+^p=>gNG+u*q*<i31Okoa+,-APh]ZMGd?+@?F@^HVjOLWKk-`qF7V9P&tgAJC9:O\EoIXu^gm\+D:;1
+V`1!#L[dhR,I'mm0_QQKnbale7`("B`AtDK/iR3GK^jHbQnV<o$nCM"*b:YkS+^?rSY-l!S00"[!QV
+X;cjn4qP0\ijr@,08d!X0ts$)+lEW=MX_0GT?nYH&UU^'YuW!)onsV/]O=3_aGq_0;]B5#@>#o)-5"
+g5+",iqk:l<"Yjr#5ap^S)0B8A>[P&b6f12;$V=;bBk;QsO&XDOpeHKdU'+HrXQ^)71)Jnb0LcfT_1
+&_3=H0PRc)#jTkrb^+%^/N*82e#p:B[-AD).Y9'M/n?"5<8jeL>-T!C$(4QU1dlVCHH>(MG8YbP5j=
+\[4,Z._7A5D1hB@KP2-$aJ$P8;l'i9)o<qNH<ArH]C>]'mAR!_Xp^Vnuo*6gq\Uha68F@r$@(/>K5?
+b?u%=JJ+K5TFHR_$"\]cU+\2.bR#K`:>Oe%1UKm#sb.O+LfF9)"Lc)<5.rMu"Zo1GSX]S-K_=/OdH7
+%<WQaBT@\gHbrepBYd"s6do?4+*bgT9=;,bjrGJ`(?j?]D!YnT)S*u^Y:A^*]7E>ST<1ZJ1oS('D[E
+(M;oS2OU0Q]nF2"3U.X7,T4P-;]?<_ZaI6Hh[Jn">3SsXfhqAQ,:Vh7[beQ5#_ki?i%DgC<mpm$?Nh
+0tc8(VCY6==+VcTp#bb)oq-^E.p5H\bA]Nh4>uMj1BrX0OSb,J,go-FL/f#.uU9BIE[s3VGf_gT6)A
+hbNn"&(O1]R1bkVb)L]6;Y&UY>aQPVJ;`DkpC=.r^4p0:p-PZCQc0d?:Ula(s%b))[[_6H(ppZ0sHV
+Pf/odkX<?ME2j8O8en+2UI\RC*JNFq$U,a^Cl.[=Vh`6N+(83kg@tI_D<LFWSTV?YQip`b75Si$JVW
+M8nuQ!"mOZOUomYDg&o,Gdr`(MbEco%/0[T*ra/S'2'ShNjA\>eceOA"cZu\O9X-/Us7.:bqH$#%7'
+bbRfUHk!X:(U%Q`fm/9-4tnc9[2WJ:SXFHg_Oo5068/4B]$Ge0jN"Ro5Ycr=Dur$/EH"m:[[n+-D@W
+<U_)$7S$)Nl^cFSI%fDqnbB4E1ZmpV$lIrQsm#Y&8)@UoFaWl(Tn=40VJmdgl*[k)@mr.Y8IbhL^a]
+C"cglgE8(ikr+1^o#0K.@;!`dQj<LnmQ8&1HnJJlP1]su2%<2`%d)N"[OGWKD&[=/;M'<*mFrM#?N)
+6MWbUAEHqYf`1iitE+d#(ubU1\B<'I^m2C?!h70al>7!H5-Jd8nDp>$7NP?I-k38J)=q9]j`?7S(&=
+br5Zb%2Z%p(ZgDXi(Y!7Ll(YS$IMQa#t2BX.fN4)oM7m4;4rLQUf]?bnhEcUkf"4P3q?s.'^SpalpR
+@>FH6ue*2Kn\jaIAJis(XuN'S_%@5ArZ\GE7]"7P0sn/EHHb_4Bl&[<u3.!DE1'`Vho&T<%W:ib1WE
+7<5TLCs;_JJ>%YRj*X%VWfQkEFOUl%ZAYP\g[^]Y^4Uc6AG&#<^EPpdSV,Y(l0@t$Ko):lVQ7i)'71
+op@<*Pno@bC?LfiP-`;h>i<H(@6QORT-..tR%J4(j&I39(fPlH>16tBBRT7e@*HItdi>dIPX9;t&/L
+S:H1<U'rc;g#3nhI6uB,V]IV"+Z8RrY)'d\:T!kq9380'-%7Z%X&.pi2ua)\Q1G!N],&Z4XB;As3`[
+&5b/N:`Cm:-rV1(?q*l>73nrN"ihK:F#a/_4B'(fST6GAB,DNig_$e;+2@jmn%rVa=Z*C:2<?e9lJN
+9'BQZ+'9p%\<%QF\)!b-5#3"HHX75j1W1HG&e@)9$,,h3C$#<7g,FV9MYA)bXfp1:,@KaPd@1Sg:Sq
+L^SN4!lC<ACLhf(H*I!2JAd1nXg]=<:3CSX_fpYU[E,Pg:U?a5"=-fK[DGa$l^WG6,l\F;okU'!0a2
+#_pet(`mlf),9h4DD*b>g"NgnP"%0ju1F<JC-SX3ajNW[ApIg>X1gMH1T_(%kEfWDr0/Udar>[Pa/<
+O!pKe+,IHRgp>G_)mKjN0VT(Fe=44seTFNQ1^3ErbbE+YiFT&/cOi(E%5^`Jim+biH<TP=tO+S0lbY
+1n@2bf1Ba)DG^%(;fi5-pFBhkaG_u"Cln`lk0L/$.8@iYPdpIHL<gRTeMP_>#.[L9giYI3!!+hmo=4
+#g,u'3[5EZf3ELBYiUps;?:^o!H&9ulhUBFR0du\\Q1kcOKLf.V\&JV'=l"$pt14M+t.J!mD6(XFj8
+8FCQ"A#j%FSc2`;YRQ$c`h`leI<=2oh/;U5ID:7AnD]G3CPf=EKqbLjU#!3ISt^C?GRQ_F+$t[Uqa3
+uPtU99bjd+cMc`cM=S8(^'O\="j&&gRFN.o2X!KLNZMsN6%<NI6V'RL)EB=>r0^sQC1;n7\I#h&Yp[
+*5q_m)]$^JscaqJ^j-eaZuqN+Qre%orUG63,P0J,fnAX#^h!B/S%LW)Pr(&P#+t;&HZH0c>s?5QDYn
+IR,->8E>q:,SEfqNlkprflXr:0p>5l;d$JZBfDSXkEFTkrddA/;!/G%2'.krBYak3H;-Ss;5mO[Q!1
+S%YnhmV+Ouj+?*+5E=0.Nubn=M7QeCaAgN7bpDk#O"='N)hnThf?XLHhT6)XcQVQ\WW2BNNf`)bg#H
+n&hK!,=>F<K!^?")>7+1QsB@G"\ISB_7a!2;A4tX,S6Vh,_:!Z.WQjQ/"Gn#W15aEqd6_T7Oi;E;5r
+02#gLdUnXN?hH)q8dHPLffS/Z(V:(@lDd33*J&1+6Gl3dY:MML?'*&3;s$si_nZ6jg\,ZMrD=WL,00
+SbSrr>;<'F*JXn'Vse+G>si#!oJ6')FIRP*i.5YN#'O,O::@QG\W62WDV.,Y&J8X0`<6)JC;!#K<rh
+d0R/?dKgT(d.6K7/dYJQd'UulD\GYs'Sa$3UI3U>_QeKT-8k=PS6s"j6nHg-/Bi;H8$+=l,"o66^EU
+LU851PTZS]tEamFbA!!SO]I1*.?l3Np*PEJd'cABFohp1iC1so(Ge287B$!d^$ZW"760N#3"*>C[I?
+iXoc'X]QobtX&!Jg&K'J@E\L\oC*eYl+l,eJ1eK<DSlXBin"B*=XO$<OH=;cZFSZ?:<;$ctp!7CTC-
+2[PBd92C>Dl_&G6/Wt%n4eYQ;CG."A2=&k\V3M^hp%mnuneZ3]A[l)J$fC%*i!'tckhfp=\94Sbt[X
+@#">*YWpCYKXG@;OI0bX$eaFBu^`ZLns[L1.1FeEEl>!(V:n[uKP'KPM7o:bC=*ohjY7:&f*AQR07H
+A2lH[P@Z^s?^NYeK:Z_[/=nG`=Lc7\BJM5Vjc6IQ?!2\XoijYB?o:XnUL^rA\"[(%"j<:u]!QGP7UQ
+=(SEmLFG29V-"BbH_.n5;E:\4f*4_Zi+rG5:l<njQi3(<_P?b3uG^*l"2G4bh9`kB5\Rfen+KZk\"Z
+RD7_aI;<TCIcM8]XKN'4tU:7_Xk!]%cqX^G8Y'@)"+9G^`9O4enY*ZAI3kmY<CT(>m$_$?-c#ATQ0m
+]=ahuOj>#Wd^,@"`[OVY&pNF8m@"GSeG'X-,h'MUOq``W?\\7kP#Nu";O)F0CDStAkVnMi8p3jToP1
+=0;!LkB_?aF233[VP-C06LKkpMOopHU\DbTDD$76gid^N^TZSr'mEbXi_DVuTTN'Es+#AR3)m&i:,'
+K7U7[`PD6GMd/i<3`&eH6$Ie_Tl_qQ0Q=rZ^]9d2'K7SHjS+C^<s9Tn2MFuE+[e*I%#d"a@W:<Q($K
+ae%_*j>&,mZ72WjL-j(qO(&hQPY:iqr^S;D6=W^P=p%iZK;MI`8V/!Y#g@:WW'&]BpP@f6oVUgfAg6
+8BW"T+k%"6&5bc[kcKL*2GEHJ1!c'`X)/\<^\38Z'hm;q#KJd'NSc8@M[%A3@@BYcl4@8436YW7H<(
+tO0M:C-)Oep'I8s-d`(WE6H^S!bb^X/5#\)HD%C0QBdE&)V_o2p/>b80QA'WH9:;/6-/&T65agc(\R
+8T>Mg:3FOuB>NO#LT+aX\L8qoa8S.;!l2Q_4BK8,7]pVf_BZa!b_j(IpJs,j.IJYSOuP@l7OKrgjf.
+3)0OXfRW>^T(51;3u5>BkQ:RRoEpFC.L9%4$>uOM2LHY400:Ic';Q=qU741]7Us[^6.?ff:>/-0BFP
+\+PNmTpBQ$KSFRoJ:lA&9T3he'G5@Lq7WD8l59d3Rq61]m4:.&GX?3Gj-b=5m*[-JJW"]n)=c:,u=N
+<lON%iOQ58^uI=Y#Pl2?VM<;<jW3ML8g:IeTMp4oNFZ$D)3nH3]Y^m;$Eg9;QZ5fdSqE`)b;54Y#$m
+b,1&Ad9pL$^Oj7dO[c!`\7?`Vo$D05b6IMq;0!JB1Z^W(Vok[;FZ"UZr_@"CTf(<aID%WSEL@j=HbE
+0'YDUD[t*,J$kS[A)?Kg$<s!$#.FZ3H&t2%,gbmW:$qD;I0Pqg!=$)6cP.9&RI";N'O&'=ejDc`hb5
+0WoeVAQMdbh.t[39o(BX2f8'?e<Y6nD#M">q;9li#AnD."hdu8p>@qDCY,TR^/$rh,eOUhmgZF#9eh
+(NH_0L@Q"jhuZOL;93+n5)p;&CD"f0?#4\W!"NE,C_;sQ:a0XR6D'q3?V/5_18FbD19KE,<e6K)o&9
+Y30$`8a`q&826S6aF0?A?of_gD,ObX`kk_aN[(fc1rqH\E$tQ=b*ei?ZRQmedMDNO00H^=d84cjba!
+q%lKiGR27L<%-`cXhE"QFQRQNkEKEmq6sH)^3bU='SVYimcV3LNVL5G:o4E[($:?O44VH$s>%l/A3s
+\QX&#XOCT@=d7;//6cWHC+seJb>cC;!cNF`st>)TPur4^V/^Y'ABr=%fELrK[$/)V7%U@2*@"Tnp[B
+L:[n)9<kWDK@#7n"#r+=Yk/:lEgO&5D`-kY_m6`Ehq4f*edUBKV<-@V)T,Z?/B;?YK[?+i^sG4G0cD
+BZ&nY:6R)A,=.(?:(FPOM4kO&ur2:#Uri(5P6K0_7k[`UH0U,5A&cr>U4MO0HJi4e[(ijT2R`Zads3
+tSPbYmojrWP"n!^B+[-GqUd=*5$rF?<b9CIfqJ9a(t9W>;PV\AK'V@7YZI4G">(-dY_B6]<1gPQ2_u
+fKd3MIRAa#/&dCJ],h2DAZcfrS1Zf\I2rIeMIGlhgG1lA`!]sL?e"A%hCTrDiNH('VG9>^j9>"e!X5
+8Zk)!bK5]o;(se2ortk6<!XpiIN:pb`M>^]>^BVDN_t@V?m&>J"ai1X%j\>NWX5Of9E0_>GZXoc/Y`
+nr@;Gq,a<_4bJoDo$,ChHAhH&ce/,U!6k;[Vsf*3_>)/rqM[tu+I*c&*uXR$ieir9"=RpmJK7&-/P;
+)D(QM0l5No]YhY81JXn+`ahu-@0p0QqNT>!\gIo#Ft5Cg(i5N2H'7lC;eGJJR_4j8<^com<]^04Mu+
+N$$(!KVhlJQe!<6d!2QS2=ot51pN4F7bt!n\4PF\Vp'oZhM0J%RB@O^%dN$$kU0Q%m<;m_'BXZ)lL=
+^nj,A@..dS".?-!n)'4=24#j0l;_'MP8fSthV&7*8R,5WZnMpE759(+u4:T','0m5Z5MQ1R/,$aTg:
+a8_4ld>BUZ%6g.)Ci^/:1S05esnB0b/fbXndsFnVmaJc'$j,5st`<PS_3<(rG>F_ot50Hmbbd,JT06
+6ehLQ1d8eS5sl&;0ROcHlYNl674WGe$H]OQ"+-E9A2]7L_CHtJ"=q?*(dF6"]hAF;S.Ini4[g%Q_#+
+R-oKGF%r5:,=]!M?($kBp,83%)6$o(>>FBh4m*=OaHZQ[1Q=\h@/]>#U"6dsgZKNQ5f6pri^_K48H,
+\fL7Bfu:L6_iDIi/KlEf#G'I7\!CGn?P/I^G,k3T>X;.oH1S/Y/1kZ7RVAe42+*>H4%l;MsD"r^ril
+d25!gl[iBZUjBK1%K0uGfa69Qod'<k.jN(L:`W4bWU[4DkilJKJ8">COA*lB0NXGE5MXcNe[#cHTFp
+fR(*:n!>>[ti+P=^=_aUkPJqi+1'WA9uf*:R^D';im!S&tb*8XQRj85./49Z]Q*-VT&\oV0J"35jmQ
+b)n#C(ooVO1Wl5X8k?6OKT)>CR`TZM%1Fm.ncQE)s2)t2_n9XiPMO)TXN/Oj6u'b8J>]cePoZW18Lo
+eAgf(Hch8N<r]`_;)bX'EW]"4-:$Rr>1AAec&?-1LJ,;Z)&oM*LKH`l.(`r&Y$9X`.J0$J:58uSc5"
+OPA?Xc"`cLa8:VoW,#49h1^j5QiQ*Zt.%ccb4te7bE_p"4fW2gqX$Lc21s8r/\_EhaX^+]i7;=9S>k
+,d>F[H][YC9_d/";,R1WF)9^"5e7:u>:<X,.7:]4UbR1rJnO6.B_ZWiRjR9_QC-)!)912^noS#sQh+
+K$Y7eFY-,^@Y^X\D'q"OLhugbt+UYcJg)6mVXk"2RDW_Ed0a79ip59X[c'##MANbiAUs*;.MI0#;YR
+:\_7li2k1%j\Zq/:^Z-p`9tbF'gZs!4`oCQCd-&_AO?#S5nm,0>JS6gdmA`q7jSPio\N(@g<iIYd3u
+(VeKg61's7q@d<)WWm2/[L=2VCK:ji+-m0UK0O4*,2dMs^T'QMO^0[G,#c?+ccJ>k.P?IDO5+V\D6S
+HQmlB$s+!:F&f`bPbAY&5`98:K9,K$the@<BVnY;Cdr/]F\"H85j3#X0j;ZFZCVTotroE8c7LCqpSK
+_+B%"m;XA<qr>`<Mp<t$;5O<Af2%*:jcpn79dWJ*<J:YL`s4"=nM[Z@SXM1E.>L\!5ccm0STVoil'\
+1>FNk9=3m7j8gk"!O'(KFk\7:M-Bf2b<g1$m?<eLENK*(JF%<hkZ'"\LeG-&T)k<Q/f0lJes/NE11C
+=-[[$Lq_;RrDlN:(mE.dNHj'GJ%S3l$EO?S212,t#hPcm:f;s>21Q`jCC3,!7's&J1*o#'*S,(G$ff
+l+AE$9FgBt%m0g+P\eT&[tP12V@<IIbJ//Q@oL^Gst:8NiB>.@\Z4&!=Sg!u?f<M%,<Ef@Dkd@@Ye%
+(/Ap%+ZEE75^.D'po9_>?EJ#1p(':]nK(<$sF@jg.Xo`2,qg8Ti&V'b<6lr*>)!\;VO(+fFY&>bf<k
+\0Wcm7fL_K5>U[.Ygso]4;74&7"Bs'?gIjs1e5Z3(N,6)=^t^e5`N.tHr>\/Z/DJ)@eqI6l*N'1ms%
+BK'UCEVaj`ne9/C,WFd*7\Ih3?Y_ZG=Zn:TOBK<CL1uq:]@F73l]u76SMXj4WNb>?IlHmEF:J@&.).
+gSLsfKHo>2]g[$V`GO>S']N"2O4?\):i/ZtN#'nhg=%>ZhF&5dY`)\r*_M^B,8H&?m>X*u#i!#.<t2
+7]FMC/-leDZk5FbnAA8AlcECR(q;C1G]`"l66pW$;%LqRq'Sadp:8_8B>h_L>Am6=c;%,(#^hGs>W/
+Zcrkj&u'Sc].m(L&Knp%+EF@i"1f<AVsdj@E[3lfu*78K_&*lmGQP,^pH8`IDsK:,[[ZThkgBPoIX<
+ZqGP$)g"ejM"sLSo&VuDq?OdaX*IHCm"h"U,4WJ9I'L:$)s'h3*b>fEb*EH/,P$(4N=QL"I<K9gCeQ
+WLod&gF(gV`#9Lfbpq?nsjs7$,sh-J:8[@PdBe4j#rp2i)l@b!%h\bN($O'jA#8PdW]:G"+IIguJ@h
+MN.1:Q6nN_n)QprjAn_1E<]t@U>UaJjH-;_9o6qt66pGB>FM/<XbUJ0[cJ@(Tr(H'S6RB6-fJ?LjaL
+L[(0HGh=il\',pljV[=;cM@u08S$:'H!2IPUPJQ0W_j^mF`7V^<qisRG1aYmQR/Xp<SLZNDhB+pG?:
+nuh,Nb79Kgr<g_K5TinGLo#p8P&PH#'?[kpd-#*A^-4tL3R5/Kh"gmRaMI3`FJ#L7,_a,k8o,/:4UD
+g)<`E!J-13.[QE\RA*@G-kG42-b^*pABkIWbBYKF</XXmKOg,C=kLP;tes'c9N.uLmBl`V'p4MGWK^
+#(6l%Weab3e>ODiDUAC$q-sOKW7#TrXJgBjR:nDPUA=Qteg_.AiqTY%)438nj#XlFN0j<h!]m:$UT:
+Bdeu%VQcsNY30DFh`eAJ2OJ"j[O,lZ;+@SKCX27#Z"bg]X?O7nAif3`YNa'@:Y(nB<l$(/-YlJCBBI
+*J*jLON7r2X4@8<I)p2KAW`+ar-Cq^"--3WY3[:!Ukb]]@h7aWD\ZKt>`CgPR`L6r0fhX+bu?4N'3%
+a/^JT^?ofD7Tr75-JZ1Y\i0gD0<;T$4tsOiG8^qmOXjpF3O&U&DF#8Cp&n<I#r2ghX7B4l)ro\Y3Ko
+L2Jd>lD+<ubVUFf0hs:jDD[*l?dq%oEg?\J(mdB"OI!TXQ`,DWl=5N"V7ceR6!:L2Pm+23*m^MPUmd
+7Ib?.S]V`GBKjY?'fRDP$]DI;86WN9E2-R'gMSY/P0`%;!!VLrH<4!K1iUl#9,\E@t+-@'"(/'pjBA
+nNd*C:Dc8Bf*6F$ENr2V*n9UQea_N46t!+b`upR0_XKc.EE=AFk8[>`-5=-/n)jH7:FK[:&I?D4Ej6
+GK`sH`]$?FmPEPQ3^QS=U[mW+p+nuji/%l*R72CZAmELGg,?T9qc1!F8l&T#S97h9GI4`bNm#enB%!
+=%n_2"LZ(oIF>@*sZmirH!HAE`Xr:HURHBB+RdAoVhCSG<YCq&+nUbFMCB>#j9=jXDmW(oD_^qY=lt
+b<Y![no_0I##?We69CdR:%YTd5IaDPb?$*PA#fdAI!80mb?M!nup+%Q`\7\+:AW>S!FI,%1Ve@RKB#
+WqK%>Q"q:MOuQD(7JVmuMEQ2SJfS<H_Ga/O*j%F>J,;`H(E-NCOo]I>2nVN-9\sN'D$"T6^%3I3rTM
+@ul-IpMooqIs/#I--(1Oc\2`#.<e![F^KnO06RPD1jG[omW:F2p31c-MYFW>,5hT<pnU!QJnqMbq(>
+,3#`J7,Q&8?_Fe8U'#FK*FQADoKa+'Qc5oH`8?[5G=GRp;M[q#7GV"Q1(ntuG53\bl`B10e;MEaFPk
+@FA^WHrc_#`k2Ga,pnH;g:;9pSY0eDl8>6UO+,ADC;IY8#uMZ)uDRFqfmd?Vm^i:FShVAqU_j1><Mf
+(KXL9AGj`1js1!F.M#0]Wqd6s\Vcs!Iqti'[H^D,72cT[h[sWJkI#kFWT>:@@X*c;=TP)?#G)(F9O2
+PDAq,brepD/]HR<p=6Gt6D5B<qFpMg\++rAW("Dp\H^nGOJBI.seHqYY*;hjjH!p?/=)GN3u[jF#S6
+Lpo/:IuH59kPg*brfDs4O0X,9li!aJrn#a13,@s>W@P@CH<2tMBCSVJm>-Y%r[0^S:XFMspO772NJa
+HVk^X#U!!0De%0qPQ@8OIE24OXH`*uS'UfK&`N()ZEO9@U-+-9$(;E6"g9dc/tAQ$'L[TtPR9P(I7b
+gn-^R7N'_!Gc"_5G1hd<&u<@N=0O0!"7LC.VUf><+aOf`8[7fXB'+:]&e+K0rNNr<O@u!gL%<kD-"8
+Z3Mcfff'G:FV2D6^[bbq(]B/bb/@jSG<GK]Z!%bnEEEKk`3t7"V@'WcO]NY]%b[tp!]]=\IP0;DCi!
+YQh9rHK5CnM/"7jkL?kO<egVUo[oU[5.p)Jp`"1u*%p=ioIm\[pF(o!)K`&"V&1E-W77lj='Hlum1)
+BGqAme)]rm*8];6c0)N[16pF@QiJB'I"#!/kQ"<&n+_B0*aDXbq7mOM"ID8DKDqVV:U1?/_2rCG1a$
+DI]`Pr`S&Yb$&Bltc6A_cRU:maX2\Ec"W(^kkE3$kTVXYp;(VXkR33Se_<+-`Vd!u-'757_L(,g0NK
+d"$'e3=L-c\.-$[.,tM*llQ*0.';SX"bJAX$g^gb0oSh*Cl9GU;9A2jLm@o%nqqh6n2`r2m%+@d4@t
+-*2bbl'?Z4o1<WA"1f%'XYR\N#9_g`nTF?lI;3YiZ29h2%1Ik?#!AaODlMV5Jd55,Z:XYK_>-s`3)5
+C#.$!F!RKkj[W+&fRAAQ`%)1=Bg77V[?Sf80O2AuCBc>ro>+]mF8926@S#Zu5Q!B;$RhbdH,"h.(,&
+'2=`f.-rZ-9\VGhTLQ0W<J^07G7E(PgM:;"4^E3p*4T8*3pgE`2p>]RXbk\)"lE;Sd.^8cV<kcsp^S
+#NhhtTQpBMO@.nbQ6dbANXf>]+r^fY@'/[`+Lo[0+Cc7p'o=Vb!.j3(;k(4ZUc_3N7=)L20hpc\(fk
+*bPYQE=.l7A!94)?pp0=Z_h#kaH:XTIis<!(gnQW)S?+\^#<>ANI!,e7o@_ZZ6ql(;D"2[KXCYku%G
+lZgJ7I_R,Fr*_X#_'%mu5D688T]Pn9sk-Ti'[/n(\GSgHQn!`+DSoGa-s1tfW;1DmB:gpA2`nYJQ$Z
+[657BL9>oh-=tE#]Jj<NGQb.<I^KAMJ,HnZTgpI@K?!Yl)Moch%jrFlBk&K):>crZfR!.9Nc$i'Z7K
+Q0G4eU=HiSI\X-<J-M2Nf@[ct[IL,#ZISAih]mg%\/t[CNd>&6jHP&8:RD+o\@:VSP>?@4@\3^4IP:
+*j&f9h:?/R8XckO`a;[`XE6i_Yt`UQ47/4\VYBjP0I7mV2V#1nEaJ1I>P60M!4TZLjcn3-E\Eu&HI;
+2g0E+p#RE0+(?;RTtB2_o#s]#@HuRE)95f6Wea;@DQU\8%<0;LlPerK.mGT7N"T]/J4_(o8+cdlS06
+^?9uH0DGaNu7>S\R,2$Xg0![:!Z`O%%]OX7SRPqiMdT=G7^]_fO3gJi]'26n3B5j/#_.`7<ge]=SZ4
+sCY#7P5*&Q3Q<1&]16^<hV16B[$Z)a)dK+CgNmNfn848RfDVL&=]1Ka;>%^]:^:KV;/f<`R1QN+V##
+R=TD.R#Q5A#7WMPEUj`K4ul;<`k6)>ZP8q:@t-,kN3Z;YNb18-NufTgXdZ&s<(a-"1o-YrG]R,nNL!
+rP)r0F!DdX@&WIm%)S@"h^NcI[HG0"<a,n6XY7`3p:3$tHsC\-&ZM'LgtkRf'Y1``S7R=p-i%1-au&
+?j$Ym1h%3%\h?Eg<fSG?7=!rU68i;;A'p7O0kOQe&$(PB*1]Iq4eP-/sd,W3k5].\"h8=GuIbi9FC[
+LT="B+#)[C]9sm'3'_\7Y>(B]*PPD#>At,@@Ma/b'9kh"!;ii\-6YO^mNKmgQ;VJM0Wo['Xe7*gQBj
+PcD<"t^bStF2IE&=LUpmj^ZK>Q?a-u1\^X**(M=2XE4VVQJ\e`bdi(lMF2'.^12VM3Q7`DgO0c`tl(
+aB99IABR\V9JZ*Q]"5UtCtrU.[X!kd!n1.Dqdu+'4ml6)Z"dd>X0mm=f+sHaYRETLOJ>+s%+YE#/]=
+Bm<pbFlfBk6-D#TKhU2u0\K[]0s&\3h"k8'2[e:_[HNhEDB!]crt.`HJ@Csqa;VbRQ"6s1*l\,\I2I
+s,^8lWn_A[90@fH/UI-K6P-'>a]5NYLT8LLL`tTJZSjEn="pg;Xn+@dmu/em(m=F9fmnF>9NV"+CML
+!1<]3>0Zt*DKs5@N3OK*P[Jr]UT+#2!'T16HrWa*^rJ_*6$*7_c_Wge6=Y)IVK13QZ[8$H'.F'_eOn
+$6-o'KsfH&Belcc>'A!'EQMQHfCkb#m+:AS*rg$eU*GK3I<K5]$V>2+V5fOQL.kDWsu2B[.L;j^0bJ
+Rh0aASiEK,?bDDHZM=S&!93=U4FNrY`a-f6%m&oZ<M@a1:*=%F+M!Tf;MjNN6(/.rl".2i$i&&9g+N
+^lOYn''IUYQgP:Gj//#j"KdF8/`60T_r2=jk<V+>6&?_)#528P+en8&(6Cm`nkm&g<hlWG@dMkN$ic
+e0WqB[uLKgdZO7^4QAtlqHVm[`\I$AghGH]BBWElTH.ilkSjR8%I.kl-S)A*!9o(@J;8r&l:en,V?3
+ZGLG."Ai+2V!gfrj&2nlc!+tRTpV%7N$!]SD`p=%O$&5&%?6_RK?U5X7;I9[Q]PE48KLdp&Fn?T(.s
+ih-4]d;[NT0e5FE5W%bE6aWec<1J09NC]V`p$].1_\X?@9+>iLC'Hi1>$jZdJV?/ArO+N%8e<[^lN!
+l?XtTF&a111fmjT*B0S_oo[`u5@Yga'%nasT@,es>@!eBAbPQLfMWP9i.<e"i`.Bb7`@>@rTPhUc1B
+hu^OSk*X+,_/8&/&R*<^T87JOg5j1*Es<dhd<#*1^;K[1E.j%%7D5*iXhinX/tkL(;hTJZRC/K0"&/
+r?:"dX3E'p)N\Eq`U)&P-EIK>WYB/hWg9DW,:)c!+1PcT!Ed*`q4a(0*s:-56KN)6st+"Gcr]tP\6Z
+The>o6;k>e`*sCSU:Y2:jcnt`0ee)/Fm!MSqrJb^lK\d.Kb0a#IrhKMrYOMV/)@oXU;6SL<YQ.Vjgc
+H[^%A7D+N[PhW`<*h9)\8;=^h=1[bl=]cf!$JlO=EAdT*#W]&YXLh:CK;cZ5Q#TnO)[HDtsHqZNW#a
+hhA<=TmHl;W#G_9qVuH3TMuj>UoV=X%Bt$Nn,3-'I/P`%;LtDX+WT_r]FuHc"]'e-+eT!)V@tY>"ec
+nS0VVU0HO?u#$KXMW_$1,ULuNt*)GJj>J8?,i*;PK)#6>&?/%H+nge^gJ6*QRm!Ncj*)A=7c&O8De@
+^[043Y=XL'/4C+_6"!iOBsUbp/)/gOUa`%Se=:h#)tnKcK5?4YSoeR#%F_S+X@slYQk`M!5YT<J6!:
+[,j4Zp!`;9[;+<s8p(>)C%]pEJ_3u#\*!L=e%0<.*V0j4)d2$+j&]$4?Z&l$%=Uss)cKbK7&V<E5L.
+:,Y)B`&sTmn#$<!:!?)Sg:p@2p3eYSpnM"^r,f+PRt]'cu>3*e>:ITPtgb>9/e6"MoO'TN2saG\E4(
+*,nSAk5lR[cl+&3)Zb7'd5)M83?tgm,NnP7_0R%$"r\W3)H";19hQZ?pBV!l);rjF6)5'#V][-<(Z8
+LBE^5*S=r6-Q(SMfe@0RW8<"0FcWR2"uO+tscj;O_`)<!Cc5\pOqD(7<5';q`Onrul]b:@06(\'dA`
+*Fn!`(k?:/@&J/P0k84cRj%EAJ02>1?C-/kq9:/0(SNc1A*;@q(K&P0Co2u1BfIQq(8o-l&"@R1DMW
+c))8H<1%QO7D@nSo&Mc-o1@m4V1Gpt0)H3sK1\3mh1IX-A8MmbJ2"OR%1-[RY=Z*Nk2=k67.[N%lBf
+<;72Y1oI1NbWtGrN'I;)<V[1PIf0M)_i$3:i7m.'5HBPrZ1A3V/q*1Sm-RW>G0,3qKU<1UT;c\N@-E
+3JK=P'>6MLaZQoS4S-r\Zc"e3DBi*/4nIVr1Z^fAkqSCQ@2%BZZh6P(q*24a5NrAQ'D"I'#sbj,5kG
+XLo9fTr#+B#='hkSn'Guj>+[P`66M*!"1c7X6aZ'@$6fO[aK'u%D/3h>h6^1G:1fZtd=HZ%L7$M+FA
+JIAX)b*e27eC[j1j)%t4[Kiq7^P]NP\EZfD+A]-8G&$91UBHu91Tb-2H5<"Pa+j_WCjP"2q/X8e:C"
+eUIk)F9=1lr1rW.1aY>Tf6?Ih,<.@M>9U%k&9GGZF2!%JSkX)WDF7eEd[.R4:q+n)jS.qSkeHJcl#u
+#I/>kEG6[0oiS),[bF;"Yi,2'l.C"]?'a;Y;bC1p'[+2,gnG;tO'gKKW9L8Q<)l4Z,VPPttD&=]Mf-
+<?eJDeR_d(BfK'.9iQgJ'I-WnCKIol=7T?[oXRciM*uK;=S7eZ1[RX&o0tSP=]M/!25FkaHVG6E8@>
+@"276Y%"]T!">4nLlQ,R!NaL=%?8+^4lFj"'5firRE<ts+Xp"Neqkuflh?FB<123D5<oj>-*<RpnPp
+'"iH4^^/S@.k10edZ%G).BoJ@<NZ#2C22E"_)X,@e:1?(,9<B3CT5kA%"[61bWA47:`i$5IO-op/P[
+Fhdn]KAbKOoQ<e)\BkF]HAp/$(2K_!fEG'HCBCg1W[Xi+8M)Ek<BXX%;1F$T,Q"d[t3nBp<2Pi;)R;
+-oIC?6%:[]sUk\>/c0C\GS<f!T<Pa_Q(#Cpq`.(=-hUfk^<5D78D<p>9aGl"TkSDRT(L(@Q0"q.KEq
+DmoaZeaG@o"\b6h0=@-co&XQ:'f5$HEOR):'-J5;Zl=3@Eq_;02`5Z#3HMYmF8%tB+gr=UZ3O;ME,q
+^r2cY!E=`q2ZFn]<f2cjg:a8d#fG5$!#2e@0!D0K'0GP>6`M'[B_M0QLWVg!K4f9LW*R<>ul+sAcU5
+m@cWWHu%UHM=[k2mn!V\U1g!Hf/cQ@CR7X:0Vq3I.r\@f?o"j?[%jiI2AJ?fAD%$EHrAbIeW=F=.TM
+E3ZFcU-c*KH3!FhW$%TMpJG9_-3#.!h'dA0G%2V_p\'9C]l$ag+"+e4>+he&BT6WCFH+2U^pORq74b
+Qp%Ib7AK2iDt?Zj(aR)Yd`q3+[hhBnj-7LA5bD3-C"$?k!XK1"T9U=?Uqs80U#I)B`Vri,/a-UP!X<
+H$G)o32:lr6\SV-B\5h4fWKH9Vi+W#Lf594@Cq;^ac*aSN.JJVfZG*5\f/)0Jp1H/D%m&%:`L:9"1Q
+m<\1e+qU`4Pd)e#NH@!.&F-3dm:!2'f)i*HoO!XJdr![9#s5bJU=,TD;F*'"Q2+Nt<o+cEg/$pXe*(
+Ya5f.mDQnN^<pMi"?oPWHS&o.^r^h_$tNp^'k$"Nu+.C=RCPR+-cQ`Njq<=%29dbDi>>J)dq-Rq3@@
+nQ]3uU%630q7#dPL`WMlk#U"tHEiY,MoeO@t#'eQ>+XN4:-jCe(%tJ[1+U/0ZGQ9_a!l?>jTE1UV!Z
+Z^t!Pi-7+g;9GUQ`/t"(BBB2dM;d4c1+OFnk'eT^iIU+dKN\M\fV'TIH491`Khk&6I2E=S%lj&-*TK
+Red2;3YDP+8/X@ORs/q!pr"*0X/3C5V>=Vt3b>17A,mN^VYXYsg1?7)@N-JsVI@`/\DNa$4-s?$!;]
+@h!QYP^$5k"q"2IM0!<8k1l_G[$$5n\E\t>u`V@u4WTqO?.)2Jg=$68fp1*AOp+@I*`WXhCo)M%H^5
+XY^b#QPtpP(G.b5ai(t-jRO1+s92PTdc-+,R-Q^T@[HR+9WOsTrcjD$K,.q+B*PI+gP0q(uV1n^^q$
+F9n-?4!'u=*HBnQ(&03]<MRQfb>.ahQGH6%dZb&`7ZD4h]]73Wd[/(qg\h0ZiU&t0=Ip6Qc)dfZ"_5
+op[XIC5Q4&pDb0sb(EZ25cOHZ=t3IAkk]'3gs4HTD--e/UKp]6@8!]=GQ.T65LIMHcd[gX1.*`O'r^
+\6EaAGf,Jd?laMkPs>`^>&h<'CVQ<VVcmT.RU-pVX;]fBVE!7t24(8/j0b&E#ojob!S@l*\/?EE_I9
+qeHV=gYbJE,-WA:6cr$fNL1^SOL*MF;eJM[gDS[rkaS)u745Xq0\i"K87,!ZJB@P/$r-j(Y=$"+)@J
+g(T\"9<L%TV41C\Rl6.JTW(R&g60>U"sq*T?99o.Nn9(!/^i*<I\7#&j[n2@5JL'h?0GA)-gH@gT.j
+C-`d>+`*>+*grIXOcbqq#`0kL"RRtadO*2CVFWc7Z=*r448]99K`>hmsQW^u[29S+WbEAXCT_$>&ca
+oR'_>G>$gpbJ"!R!`\PZr^PR&/9f6$6HNb+,0RHc<WWV8F9)cMZe<=c\M^T@UXANkj!JJT_+r$eE">
+fDU9Q4a[5ML"O(ifU[YS4ak+r>92\/fE&=W=enK6eec-bTKiO__2lLGYQGN4"(8A`+Fk!7dG')WgVG
+]P+lUXRF9>d2$f(P4J\D?JHlAMeds0E2+sme--j;Uj,(R`7!3.5.l2V\=!$LtD'04/Te.Y)"!uj90\
+VLnaZZj,0.R#Ap!"7dol4$jlZ,!pW185*o.GcPtQbZ8t^^:/Ea!s6sjk\>FQW</G]@:"+27a,&+9de
+]\(uC^k(/TL*Z>Q;gYMfE_:tC<Ehh[#UZ28%TX[k8\F&#'ZeKphj4Et`@'eT.=mJ7+UcXf)hG`5O/a
+H\Dk2!B*h7;`59U]-dfDFn=?"tE'Je,/Y*]kJF!6ltOj:,"ZSjCX>iSjjNH2n!.#f$QDh0Kt;Oma5H
+mrG!?6&2d3s6`dWZ2m&gI?E/&PpuV:"EL(:Hk"^+UVTkFLccX<+:8rg=asX;ikA@Q+9h"TZ`=!PG2H
+a%5@tQo^(6mJ$/Rud+FVbKSME@khQ_(X+g*"s\d6.W#p<OTi[,)J'I"ZPqOdli\bj^^?4/k[.NnKKg
+7'Q7rHH#s\GpR5!7h-RPI%qh#_/KO+5Q_,:RAo]&jW#gTGQW0`#o+i0F9S)+d,:S#"iR7!.dD.OAH&
+q.2@_j!&9kjDE/_u8)t:#'Qti>M\'!IUC^lMRYepjn2MkEqHYHb8M$"p6;2.p3$PT\!bg-dKn3g5kq
+&8L,H"K#FLl#Z"9i3hiKO$g()?nGKd'B=Q%"#ZH6fU.'\+B89!qj'crl#c,>=G'0,L#iD7\>3hs^!;
+!6YAgHBN4.oSKh('4NcS^]Z/Ng5O(bM:_5!Z,V5aTsIjk?8iqOFW=OEjot_KO`@Rq^^Mh1\B_lH"aE
+mK6Y>%i[;T:k'P%4]iRDbq].uq1@_$OH#q.6E$Ki[-/25gC7LD:&%nk$=$_3mQjPBV1S&9VcRV*\O]
+Mm9>1c$.B!_1Yf$jm4aUI1s[&-*pt!%Oa/.&)\008ke^60S`PP7-;0*WhGE.bIHIb?C'qX%FRpQT<"
+30L1esUX'03&RY\I,0BD1/V474[-5(l/56g/0&"a_`DLH'W(#pS)Boh[fmnrIna(5`4:`+Ho0s;oSt
+W3HlJ!LSEY=op\P##R.k>TPish_4P"RSAbGm!.U<+rD%S\I$D!j;<>e9S]Mt7:l0T6%n_4JrQ=>_bl
+.H"ip-."Kd$d@#d^Rkp#T%Qqq4Ug#L!5e^EdjBDF9s<rd7oL;mo79%k%P:fSc1?N8@t:J/Qlc\;"I-
+.AFfHu(J4%1u0:sA]>.[Qf>LX-$+VC5ZO%,hA4W:2:6k6rpq0XRrLsQD/JUe$7$3M^'p+R^ViPoku(
+.FDFbN@HGE<TF;%LOTd.E(DB\'=YMhaGiV2+R.uNj):qF,quQOTVRdf8`T79k"Dc2'?<dFr!dT+=Zs
+Ja`s@iP?7Ga2.>.<.Y`Q4kUm$f?jLX'N&_AB@9ET?#$dL,&ihcqW-ODH\S%kDCpdWMapXj!E?82D4S
+%WHiD56cX/aMBZ1gNg6K8<OJ4=hXG)rQ:SOsdahQ#7D['nJ4l_0WZYb(pc_A<Bk(9.G))QD]rCHBXS
+^i4Z);lM`VC`eApdJ/G%%Nsu&INjCU+=LV9D]Qo>8>%>kLS6CZW*R%sn.#Y5Oe($FA<:D=Ud>%aNJG
+DJ,RKKefY.@dB]-AJFK$7o*iCEbp-B?WBd,NmXbmMIq0m$74F'7D*J-Xd=!/mKGXm:^nT(RY0He$[,
+KZ#'a?/eeS:Ab?%qg,J%d%*j?)Rj9Ar4b1]]'=F*bRb%M^\4(J>dJ$-`H^06e$E4*Uc/r<(.jtbCN-
+"jbpEB-@u59&l15>%`g:-=t3N(:Hf:#=>pIkM,J`)p'3f[SmM]nJ85Tr_i4<IeOPg2+)*hj&$X3@Rr
+_VKj6aV!QF.5-5^X21TFSn:$J\/+IW0r,_)5/13LZo/2f9>e_[!pEbKLMC`COisi(=$d31"7?@'rIK
+di-<#5\0qK!!S-J(^nD)#=-LI%C*&n`n2I>@m+W?T]ASYcl3#hC^Yao&c_sk)e4Ir#a)TE*hN2L#KU
+;1Kt#&KK"*E>+Xj203D)k43)Tpq+?gFfkVg94Be&T"9bGIfF3c[^NDZua91#j0V;uY>USo)]<YlUL\
+mB+SVuRLN5qo'%]oI*`4-_W@!$<2]Q*S&[8q9g/@k8-jn<'!Ya^$G&:uMJ>GYJ@jpa:SqC7TFR@j^H
+b.HMi63ci;dU\TZa*ph&pd)m7ak5#WVkke2/M5lV5eC@()!Xn!RYq/A^&Xpp4DtGrCd1Q*e>,tqDYm
+%2H<sKJ\f\.7ZN,oJ:7Q#qM?<'r9P"_[,1MPB$Vj-nF;da\WSS0qdm\"@:E\mq%pb31$ZmbtT5"<AM
+9`P0&99HHM!C1TX#9h#OO3f=MM$"Zo[?e-2HGn&Y4_q.+rj9k+fj&<K=aQ7Ddah$9?4m-WY-lA2<q8
+.,h/rrB")Mh-_0-"c.oe;kN7'Rkp2sg0TnnqN+kYNk&-mG<K@E$8)[]F".9.l:^pFm+-O)J[SMdV],
+kY6=rG5);DQ!R#5h$E1%E-=6!!"-M"JRpn^]7:X_f/`g'D_bt1l8FOWnCYQD,%-dd'#AdSD?iB-A*E
+p"/-E7a,1)[m[KuT29,%>gV7oKU\1iY?A"bE%K\mP;PB84"9rTrfRT`E*tdAPhtW'lYI4.?UWaq_.H
+M.3oV`&hKtrZ1$8nqSWO6qQ(LFHnG&Z!<_Us%:?9C/BY&5B#1QN&TS4dZc+I`A=.XU/imrRlN,U/VZ
+(5MfpCp:gmYX@iFj8=IiEY_$`R27)YI#`&a'o'eqWn(5J>^CCe.AqFZ'BO=gPk(YoXZ:/2j_R/Io+k
+`V=c5(;m)[E;&ChlU[l7psiLFtTF3^3*4(hK-Sb%;G_V%A3Ap^MGElN`;q?&Q`4UlOU-#h6kCI'q>)
+l.(`O'UGB4_]=!VKC2acT5Q"?#9GNk0BaOR[6rfI8R"?Nf2GH@o[:B@B=T8,M$&M>>:Yl7^]tBf:'\
+aleR,rFr$jief8>e]ofUD7\/!$+"-1+.B[i[e(U9mCMeL)[W^-V)aK39%B[IVG8B5oS!S26IF5WM6+
+,NQL^o9$T83-#gYSFOHZ+?&^3A0*9;?#SD;hcW3#;\TS/6fsIM'GA<t!uW1OfHL2,Z2aoA?'>MfF2#
+`d$)SMu`'Y"(<ks3>Wq$S<oF[ISn75="EC&ZmH*0CbtSKU#VM^%LrDV2o+T6kFD:=F8g^aJ^Ds2SJS
+&CIZ`')=%heK2lCcsMo;`9'^-tNRuItl;$!'3k?V/mFoK50HP^1H*7M2S?>gp]"G.O^gSl8+%KZYr&
+(a>hNI]OMENVb#\UC*bGQ.^%HkrjNh@3JV_eSJm;m#HGoJhU<'HY&_G;t*Q#S6J`h?_cpX&X*uNI[I
+L]JlVXSsRoPF]m6X5oWsB2oRhcXi.@[)F0u%iW=W<<(P?(,;N<#OcX*74^Z,%T,6O4*t.V^dHj$Q^"
+"33AT8!s&c`u/!!FG6':0gBpOEG'43s2eIi%/CS7CXZ;FEI[\C^Q%W,%-S?;uB8!=QWd(Bbt]\3Am^
+>i2=V5PtLH$UMNi!=7HQ5@aE%Hhb"siW.mHK$XUqS,7^A+b69C53W3c/.Fl"%RB9;]i3oSA+ktVq^'
+&_V(5h7YQ=lV?pE<I4V.UT@o^>:)F:GD6+[N@_q#T6&\X',"6jq13a=hSmJme[^?bcSa`NkS&4+en6
+@:1AoE%;:e"'.`SSSJF@#r%3N.VB_KBqs>q;/u).)RSl6T]Y3S.27R[3Q)FUarphS0<^8(k</W&9H_
+S`%j\J5""[$1gDn'g7YGaU4e])M"CKM,U*3o)$$-SWlhHDlE@5s5K'Wr7([e6$k=`ogU`V$6psIo#V
+%Y%]e2sl`5GVD9N=I`4iLZ-7=83+MG6Lg=[fDr7D)kU]N3"q?:F3f7H@W@r*`&7@R]os`[kXi9P$W1
+A&_bd7XSl8`+I#JC.>:?5:gNg]PU-nDEStU`p@Y7$un<:DoWi=7m(lPe8iT'G"6@m29^3`I!J5PH8h
+(7a1Qdib7hpTI7NXR8,:(lgjhp8Jk,0V81]Eb9S5kMKh-$87gibHN/:)qMFah,8A'mPb`,0KN_&Mt8
+GnQ@%$=+$P"@3g8N`4C#Q~>
+%%EndData
+end restore showpage
+%%Trailer
+%%EOF
diff --git a/systems/doc/metapost/source-tutorial/previewer.pdf b/systems/doc/metapost/source-tutorial/previewer.pdf
new file mode 100644
index 0000000000..e2fea7a7a5
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/previewer.pdf
Binary files differ
diff --git a/systems/doc/metapost/source-tutorial/previewer.png b/systems/doc/metapost/source-tutorial/previewer.png
new file mode 100644
index 0000000000..4bf6fb95f6
--- /dev/null
+++ b/systems/doc/metapost/source-tutorial/previewer.png
Binary files differ
diff --git a/systems/doc/pdftex/NEWS b/systems/doc/pdftex/NEWS
new file mode 100644
index 0000000000..3a66ff8dd5
--- /dev/null
+++ b/systems/doc/pdftex/NEWS
@@ -0,0 +1,720 @@
+pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017)
+- changes:
+ - rename envvar SOURCE_DATE_EPOCH_TEX_PRIMITIVES to FORCE_SOURCE_DATE;
+ no changes in functionality.
+ - if the \pdfpageattr token list contains the string "/MediaBox",
+ omitting output of the default /MediaBox.
+
+- bugfixes:
+ - \pdflastmatch more reliable when there was no match
+
+---------------------------------------------------
+pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016) (May 20, 2016)
+- changes:
+ - if the environment variable SOURCE_DATE_EPOCH is set, use its value for
+ the PDF CreationDate and ModDate values, and to seed the trailer /ID.
+ This by itself should suffice to create reproducible PDFs. The
+ new primitives below support more granular output tweaks with the
+ same intent.
+ - if the environment variable SOURCE_DATE_EPOCH_TEX_PRIMITIVES is set
+ to 1, the \year, \day, and \time primitives are also initialized
+ from the SOURCE_DATE_EPOCH value, instead of the current time.
+
+ - new primitive \pdfinfoomitdate to omit CreationDate and ModDate keys.
+ - new primitive \pdftrailerid to set seed for the trailer /ID
+ computation; with an empty argument \pdftrailerid{}, the /ID is omitted.
+ - new primitive \pdfsuppressptexinfo to omit PTEX.* keys from output;
+ the value is a bitmask:
+ % 1 -> PTEX.Fullbanner
+ % 2 -> PTEX.FileName
+ % 4 -> PTEX.PageNumber
+ % 8 -> PTEX.InfoDict (/Producer /Creator /CreationDate /ModDate /Trapped)
+
+- bugfixes:
+ - do not crash if font size of a vf >= 2048pt.
+
+---------------------------------------------------
+pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015)
+- changes:
+ - support JPEG Exif as well as JFIF.
+ - do not even warn if \pdfinclusionerrorlevel is negative.
+ - sync with xpdf 3.04.
+
+- bugfixes:
+ - ensure line-ending after a group dict in the output.
+
+---------------------------------------------------
+pdfTeX 3.14159265-2.6-1.40.15 (TeX Live 2014)
+- changes:
+ - sync with Knuth TeX 3.14159265, e-TeX 2.6
+ - new warning-suppression parameter \pdfsuppresswarningpagegroup
+ - new primitives for fake interword spaces:
+ \pdfinterwordspaceon, \pdfinterwordspaceoff, \pdffakespace
+
+---------------------------------------------------
+pdfTeX 3.1415926-1.40.14 was released on 2013-05-30 (TeX Live 2013)
+- changes:
+ - sync with e-TeX 2.5
+ - better largefile support
+
+- bugfixes:
+ - inclusion of particular pdf's failed (http://bugs.debian.org/672951)
+
+---------------------------------------------------
+pdfTeX 3.1415926-1.40.13 was released on 2012-04-21 (TeX Live 2012)
+- changes:
+ - new warning-suppression parameters
+ \pdfsuppresswarningdupdest and \pdfsuppresswarningdupmap
+
+- bugfixes:
+ - better support for uniABCD and indexXYZ glyph names
+ - large-file support (from peb)
+
+---------------------------------------------------
+pdfTeX 3.1415926-1.40.12 was released on 2011-06-20 (TeX Live 2011)
+- bugfixes:
+ - for 16-bit images in PDF 1.4 mode
+
+---------------------------------------------------
+pdfTeX 3.1415926-1.40.11 was released on 2010-07-28
+- bugfixes:
+ - ttf2afm reported wrong ItalicAngle for some fonts
+ - detect/prevent wrong arguments of \pdfsetmatrix [#4301]
+ - check for pdf nodes in dvi mode
+ - whitespace should be inserted when concatenating contents stream [#4307]
+ - pdftex fails to include seemingly good PDF [#4309]
+ - wrong description of \pdfelapsedtime in manual [#4300]
+ - \pdfgentounicode conflicts with cmap+\pdffontattr [#4291]
+ - \rightmarginkern doesn't work for last lines [#4292]
+ - \pdfximagebbox wrong for PDF files with /Rotate != 0 [#939]
+ - \leftmarginkern & \rightmarginkern doesn't work with box registers > 255 [#4312]
+
+- changes:
+ - pdf inclusion: removed the requirement that named resources must be indirect (#4299)
+ - added debug messages for pdftex_fail()
+
+---------------------------------------------------
+pdfTeX 3.1415926-1.40.10 was released on 2009-11-30
+- sync with TL09
+- changes:
+ - increased sup_dest_names_size
+ - partial support for TTC
+ - enable mktexpk by default
+ - patch #2087: Support for CMap namespace
+ - \pdfshellescape is 2 if restricted shell escapes are enabled.
+- bugfixes:
+ - segfault when processing certain TTF fonts
+ - jpg image resolution not set in some cases
+ - \pdfobj file {foo} for files foo that don't end with '\n'
+ - bugfix #4289: \primitive\pdfoutput cannot be queried
+ - bugfix #4288: character width mismatch in font XY.vf ignored
+ - bugfix #993: "/Names array not sorted correctly"
+ - bugfix #606: "Forbidden ... while scanning ???"
+ - bugfix #3253: Bug in Type1 font subsetting
+ - \show\pdfstartlink is wrong
+ - pdf_set_rule() uses incorrect variables
+ - bugfix #2090: enabling LFS breaks PDF inclusion on some systems (warning: not heavily-tested yet)
+ - t1_log() macro caused problem with some compilers
+
+--------------------------------------------------
+pdfTeX 3.1415926-1.40.9 was released on 2008-08-16
+- bugfixes:
+ - pdf inclusion (inconsistent use of -DDISABLE_OUTLINE)
+ - bug #2068 (cross-platform format dumping/undumping)
+ - bug #2082 (font_dim[FONTNAME_CODE] not initialized)
+ - bug #2083 (unchecked assignment)
+
+--------------------------------------------------
+pdfTeX 3.1415926-1.40.8 was released on 2008-07-10
+- Incorporated synctex
+- Incorporated the new version of TeX: 3.1415926
+- The pool file is now compiled in
+- Bugfix:
+ - some large TrueType fonts caused pdftex to segfault (1866)
+ - fix for copying contents streams of included pdf (1751)
+ - Fonts from included PDFs for which maplines existed missed their /StemV
+ values
+ - \pdflastximagepages was broken for JBIG2 images
+ - included PDFs with a negative lly in the MediaBox with a depth != 0 with
+ \pdfximage were wrongly vertically diplaces (936)
+ - PDF inclusion was broken on ppc-darwin (941)
+- pdfTeX uses libpng 1.2.29
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.7 was released on 2008-02-17
+- Bugfix:
+ - PDFs > 2GiB (LFS) were still broken on 32-bit systems
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.6 was released on 2008-02-04
+- Bugfixes:
+ - inclusion of encrypted PDFs was broken (861)
+ - PDFs > 2GiB (LFS) would be broken, even on 64-bit systems. Now the basic
+ support for LFS is there, you only need to supply the right compiler flags
+ (this is not yet done automatically). See build.sh for hints on compiling.
+ - Page groups in pdfs (see the discussion in the notes vor v1.10a) are now
+ handled correctly (741)
+ - When including transparent PNGs pdftex now automatically adds a Page Group
+ (896)
+ - broken map files would lead to core dumps
+ - unusual TrueType fonts would lead to an assertion error (874)
+ - the null object in the object table was never initialized
+ - included PDFs with /PieceInfo lost their /LastModified date
+ - an empty colorstack crashed pdftex (897)
+- pdfTeX uses libpng 1.2.24
+- pdfTeX uses xpdf 3.02pl2
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.5 was released on 2007-07-31
+- Bugfixes:
+ - calling 'pdftex %' would crash (830)
+ - fflush the recorder file
+- pdfTeX uses xpdf 3.02pl1
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.4 was released on 2007-07-11
+- Bugfixes:
+ - It was impossible to set the font Flags to 4 in map entries (762)
+ - The font Flags of non-embedded fonts were wrong (794)
+ Now pdfTeX uses the Flags from map entries (if found) or guesses values for
+ the base14 fonts. It also warns when you not-embedd a font without Flags
+ - Subsetted fonts still had their private UniqueID copied (774)
+ - \pdfunescapehex returned a wrong result if the last character was not a
+ hexadecimal digit and the last hex pair was incomplete (777)
+ - Copying a box with \pdfstartlink inside produced the same /Link annotation
+ object multiply, with same object number and identical coordinates on the
+ page (799)
+ - When trying to use a font without TFM, without map entry, and no PK font
+ available, a broken PDF was produced. Now no PDF is generated and the error
+ messages have been improved (721)
+ - Problems with vf fonts (722)
+ - With pdf inclusion the font descriptor could get mixed up and miss some
+ required keys (810)
+ - Font expansion led to wrong log output of \kerns (736)
+ - \pdfprimitive was broken (see
+ http://www.ntg.nl/pipermail/ntg-pdftex/2007-April/002860.html)
+ - The -recorder option of web2c didn't record fonts, included images and some
+ other files (772)
+ - Using \pdfximage in IniTeX before \dump caused a crash when the format was
+ used (824)
+ - \letterspacefont had some problems (712)
+ - \letterspacefont and \pdffontexpand had some problems (747)
+- Improvements:
+ - pdf compression is now a bit faster (patch 726)
+ - the behaviour of TeX when it asks for a file name has been improved (756)
+- pdfTeX uses libpng 1.2.18
+- pdfTeX uses xpdf 3.02
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.3 was released on 2007-02-04
+- bugfix: documents which used type 1 and truetype or opentype fonts resulted in
+ broken pdfs (729)
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.2 was released on 2007-01-31
+- bugfix: maplines starting with = would not work as advertised
+- bugfix: xpdf would complain that PDF 1.7 is too new
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.1 was released on 2007-01-08
+- bugfix: the shell escape function was a bit broken
+- bugfix: \pdffontattr gave confusing warnings
+- allow JBIG2 images only with PDF >= 1.4
+- allow \pdfglyphtounicode in dvi mode for format generation
+- pdfTeX uses libpng 1.2.15
+
+-------------------------------------------------
+pdfTeX 3.141592-1.40.0 was released on 2007-01-01
+- pdfetex (as a separate binary/program) is gone; all extensions are now in
+ pdftex. The make files still know about the target pdfetex, but it's just a
+ copy of pdftex
+- The sources of TeX, eTeX and pdfTeX have been merged into one file pdftex.web
+ and one change file pdftex.ch. The sources of TeX and eTeX distributed are
+ just there for reference
+- New features:
+ - pdfTeX can now generate PDF 1.5 object streams, which leads to smaller
+ PDFs. This is controlled by setting \pdfobjcompresslevel to a value >0 (3
+ compress everything, 2 don't compress /Info, 1 also don't compress embedded
+ PDFs) and works only with PDF >=1.5
+ - pdfTeX now supports another image file format: JBIG2 files (.jbig2)
+ - the memory allocated for objects and destination names now grows
+ dynamically
+ - pdfTeX now generates smaller PDFs since for char positioning the width of
+ chars (/Widths) is stored with more precision and so the chars must rarely
+ be positioned separately
+ - the PK resolution is now taken from the "pk_dpi" parameter in texmf.cnf if
+ it has not been set in the format file or by the user
+ - pdfTeX now removes the generated pdf in case of a fatal error
+ - pdfTeX now sets /ModDate and /Trapped in the InfoDict by default (the
+ values can be overridden with \pdfinfo)
+ - the format of warnings and errors issued by pdfTeX has been changed and
+ unified
+ - the output of -version has been extended and now includes information about
+ the libraries actually used, which can be handy when using shared libraries
+ - rules and their positioning on the page are now inside a qQ group
+- New primitives:
+ - pdfTeX can now handle colourstacks.
+ - \pdfcolorstackinit
+ A stack is initialized by \pdfcolorstackinit. It expands to the number of
+ the new stack. The common case, the traditinal color stack is already
+ initialized as first stack: \pdfcolorstackinit page direct {0 g 0 G}
+ The keyword "page" means that this stack is page based. At the start of
+ the new page, the current stack value is automatically set.
+ - \pdfcolorstack
+ \pdfcolorstack <stack number> push {<new color>}
+ pushes the current value on the stack and sets the <new color>.
+ \pdfcolorstack <stack number> pop
+ pops and sets the current stack value.
+ \pdfcolorstack <stack number> current
+ sets the current stack value without changing the stack. This is useful
+ for stacks that are initialized without keyword "page". Thus the page
+ start setting can be set manually.
+ \pdfcolorstack <stack number> set {<new color>}
+ The current value is set to <new color>.
+ - Transformation matrices can now be manipulated more cleanly:
+ Currently matrix changes are done and hidden inside \pdfliteral nodes;
+ pdfTeX doesn't parse its contents and does not know the new settings of the
+ transform matrix. Thus the new primitives to save pdfTeX from parsing
+ \pdfliteral contents and to notify pdfTeX about matrix changes to use them
+ in calculating link and anchor positions.
+ - \pdfsetmatrix{<a> <b> <c> <d>}
+ is the equivalent to \pdfliteral{<a> <b> <c> <d> 0 0 cm}
+ - \pdfsave is the equivalent to \pdfliteral{q}
+ - \pdfrestore is the equivalent to \pdfliteral{Q}
+ - \pdfprimitive\TeX-primitive executes the original \TeX-primitive even if
+ the command has been redefined since. E.g.
+ \let\relax\undefined\pdfprimitive\relax
+ expands to \relax.
+ \ifpdfprimitive\TeX-primitive is true if \TeX-primitive has its original
+ meaning
+ - \ifpdfabsnum and \ifpdfabsdim are like \ifnum and \ifdim, but don't care
+ about negative numbers
+ - shell escape: if the first character of a filename for \openin, \openout
+ \input is a pipe symbol (|), the filename is assumed to be a request for a
+ pipe to a command line that is given in the rest of the filename
+ - draftmode: With \pdfdraftmode=1 or the commandline switch -draftmode pdfTeX
+ doesn't write the output pdf and doesn't actually read any images, thus
+ speeding up compilations when you know you need an extra run but don't care
+ about the output, e.g. just to get the BibTeX references right
+ - \pdfpxdimen (introduced in 1.30) is now a real dimension parameter. It
+ allows one base dimensions on pixels. 1px defaults to 1bp (or 72dpi), but
+ can be changed with the \pdfpxdimen primitive:
+ \pdfpxdimen=1in % 1 dpi
+ \divide\pdfpxdimen by 96 % 96 dpi
+ \hsize=1200px
+ Now \hsize is (1in/96)*1200
+ - \pdflastlink returns the object number of the last \pdfstartlink
+ - \pdfsavepos now works in DVI mode
+- Fonts:
+ - support for subfonts: This creates all needed map entries for subfonts
+ automatically and handles Unicode mappings
+ - ToUnicode entries for Type1 fonts (patch 580)
+- HZ:
+ - added patch 462: HZ font expansion in autoexpand mode now produces smaller
+ pdf files, as it works by modififying the text matrix for single fonts
+ instead of embedding many expanded font versions. Therefore HZ now can be
+ used also for TrueType fonts and even for non-embedded fonts (e.g.
+ Times-Roman)
+- Bugfixes:
+ - the PDF statistics in the log are now correct
+ - added JFIF detection patch to writejpg.c (bug 548)
+ - bugfix: invalid pdf created if font name contains space (509)
+ - bugfix: truetype OS/2 v3 fonts (594)
+ - bugfix: Type1C (CFF) fonts of embedded pdfs didn't get replaced
+- pdfTeX uses libpng 1.2.14
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.6 was released on 2006-02-16
+- bugfix: updated xpdf to 3.01pl2
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.5 was released on 2005-12-04
+- bugfix: \pdfximage prints the file name twice (bug 441)
+- bugfix: buffer overflow with \pdfmatch (bug 444)
+- bugfix: updated xpdf to 3.01pl1
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.4 was released on 2005-10-17
+- bugfix: whitespaces in filenames didn't work on Unix anymore (bug 377)
+- bugfix: two \immediates cancel themselves (bug 437)
+- bugfix: wrong file name in error messages of image inclusion (bug 435)
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.3 was released on 2005-09-04
+- bugfix: \write18
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.2 was released on 2005-08-25
+- fixed some build problems and minor bugs introduced in 1.30.1
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.1 was released on 2005-08-21
+- the eTeX extensions can now be enabled with the cmdline switch -etex
+- pdfTeX uses xpdf 3.01
+
+-------------------------------------------------
+pdfTeX 3.141592-1.30.0 was released on 2005-08-01
+- pdfxtex (introduced with 1.20a) is gone; all extensions are now in pdf(e)tex.
+- Some primitives have been renamed; the old names will still work, but are
+ deprecated and some give a warning that they are obsolete:
+ \pdfoptionpdfminorversion -> \pdfminorversion
+ \pdfoptionalwaysusepdfpagebox -> \pdfforcepagebox
+ \pdfoptionpdfinclusionerrorlevel -> \pdfinclusionerrorlevel
+- pdftex knows two new units:
+ - new Didot (1nd=0.375mm)
+ - new Cicero (1nc=12nd)
+- New primitives:
+ - Inclusion of pngs has been greatly improved: It now does
+ - alpha channel and transparency (only if %!PDF >=1.4)
+ - 16-bit colour (only if %!PDF >=1.5); this must be enabled by setting
+ \pdfimagehicolor to 1.
+ - gamma correction; this must be enabled by setting \pdfimageapplygamma to
+ 1. The device gamma is taken from \pdfgamma. If no embedded value can be
+ found in the png image, then the value of \pdfimagegamma is used instead.
+ - fast direct embedding of png streams, if their structure allows this; the
+ automatic fall-back is to decompress and re-compress as before.
+ - pdfTeX now has an interface to the precise system time (if available) as an
+ aid in benchmarking TeX macro code.
+ - \pdfelapsedtime is a read-only integer that (initially) returns the
+ amount of time passed since the start of this run. This amount is given
+ in `scaled seconds': the value 65536 counts as one second. If more time
+ has passed than 32767 seconds, (2^31)-1 will be returned.
+ - \pdfresettimer updates the internal timer, such that subsequent calls to
+ \pdfelapsedtime will restart from 0.
+ - pdfTeX can now generate random numbers:
+ - \pdfuniformdeviate <count> generates a uniformly distributed random
+ integer value between 0 (inclusive) and <count> (exclusive).
+ - \pdfnormaldeviate expands to a random integer value with a mean of 0 and
+ a unit of 65536.
+ - \pdfrandomseed allows access to the current seed value.
+ - \pdfsetrandomseed <count> sets the random seed to a specific value.
+ - \pdfnoligatures\f disables ligatures for the loaded font \f.
+ - Escaping strings:
+ - \pdfescapestring{<a>} escapes the string <a> so that it can be used as
+ PDF string.
+ - \pdfescapename{<a>} escapes the string <a> so that it can be used as PDF
+ name.
+ - \pdfescapehex{<a>} converts the string <a> to uppercase hexadecimal
+ representation.
+ - \pdfunescapehex{<b>} reverses the effect of \pdfescapehex
+ - \pdfcreationdate expands to the date string that pdfTeX uses in the info
+ dict as default.
+ - \pdffilemoddate{<file>} expands to the modification date of <file> in the
+ same format as \pdfcreationdate (PDF date format).
+ - \pdffilesize{<file>} expands to the size of <file> as string.
+ - \pdfmdfivesum{<abc>} or \pdfmdfivesum file {<file>} calculates the md5
+ sum (of a string or a file) and converts it to uppercase hexadecimal format
+ (same as \pdfescapehex).
+ - \pdffiledump [offset <int>] [length <int>] <general text>
+ Expands to a hex dump of the file given in <general text>, starting at
+ given offset or 0 with given length.
+ - \pdfshellescape is a read-only integer that is 1 if \write18 is enabled, 0
+ otherwise.
+ - \pdfxformname <object number>, which expands to the number in the
+ corresponding form XObject name.
+ - \leftmarginkern <box number> and \rightmarginkern <box number> tell the
+ margin kern at the left and right side of the horizontal list stored in box
+ <box number>.
+ - \pdfpkmode is a token register that sets the MF mode for pixel font
+ generation. The contents of this register is dumped into the format, so one
+ can (optionally) preset it e.g. in part of pdftexconfig.tex.
+ - \pdftracingfonts: An integer variable controlling the tracing of font
+ expansion. It is zero by default; then we get a log (with fontexpansion)
+ like this
+ ...\tenrm t
+ ...\tenrm (+20) e
+ Without font expansion, this default should be compatible with TeX's
+ original log output.
+ If \pdftracingfonts is set to 1 (or greater), we get a more verbose log:
+ ...\xivtt (cmtt10@14.0pt) t
+ ...\xivtt (cmtt10+20@14.0pt) e
+ See also bug 304.
+- New experimental primitives:
+ - \pdfmatch [icase] [subcount <number>}] {<pattern>}{<string>}
+ Implements pattern matching using the POSIX regex.
+ It returns the same values as \pdfstrcmp, but with the following semantics:
+ -1: error case (invalid pattern, ...)
+ 0: no match
+ 1: match found
+ Options:
+ * icase: case insensitive matching
+ * subcount: it sets the table size for found subpatterns.
+ A number "-1" resets the table size to the start default.
+ - \pdflastmatch <number>
+ The result of \pdfmatch is stored in an array. The entry "0" contains the
+ match, the following entries submatches. The positions of the matches are
+ also available. They are encoded:
+ <position> "->" <match string>
+ The position "-1" with an empty string indicates that this entry is not
+ set.
+ - \pdfstrcmp{<a>}{<b>} compares two strings and returns the strings "0" if
+ <a> equals <b>, "-1" if <a> is less than <b>, "1" if <a> is greater than
+ <b>
+- The primitive \pdfmovechars has been removed (bug 294)
+- Bugfixes:
+ - empty strings are not supressed anymore (bug 335)
+ - \unhboxing and character protusion didn't work well together (bug 292)
+ - --jobname didn't work if there was no filename at all (bug 302)
+ - Some problem with fonts on solaris (bug 315)
+ - Dangling font objects with non-replacable fonts (bug 311).
+ - \pdfxform didn't work with box>255 (bug 310)
+ - cmap: unicode ???? is mapped to multiple glyphs (bug 306).
+- pdfTeX uses zlib 1.2.3
+
+------------------------------------------------
+pdfTeX 3.141592-1.21a was released on 2005-02-04
+- ttf2afm 1.0:
+ - added support for refering to glyphs via unicode in encoding files (ie 'uniXXX')
+ - added some more info to the AFM output
+ - some minor bug fixes
+ - a short documentation available
+- pdftex now understand forms 'uniXXXX' in encoding files (only makes sense
+ with TrueType fonts)
+- added subset tag for TrueType fonts
+- PDF strings are now printed as following:
+ (This is a string) -> (This is a string)
+ This is a string -> (This is a string)
+ <a1b245c1a2...> -> <a1b245c1a2...>
+- check for double newline char to get rid of empty lines in PDF output
+- Fixed a bug in the scanning of map lines introduced in the fix of bug #242 in
+ 1.20b.
+- Fixed three problems in xpdf; xpdf is now 3.00pl3
+- \ifeof18 is a simple method to test if \write18 is enabled.
+- a few extensions in pdfxtex:
+ - \pdflastximagecolordepth returns the last color depth
+ - \pdfximage supports a keyword "colorspace" following an object number
+ representing a ColorSpace object
+ - \pdfstrcmp compares two strings
+ - \pdfescapestring/\pdflastescapedstring provide a way to escape string
+ - \pdffirstlineheight/\pdflastlinedepth/\pdfeachlineheight/\pdfeachlinedepth
+ allow fixing line dimen
+ - patches from Taco
+ - px dimen unit
+ - tagcode patch
+ - quitvmode patch
+
+------------------------------------------------
+pdfTeX 3.141592-1.20b was released on 2004-12-22
+- Fixed some minor bugs, mostly with hz
+- The info line "output format initialized to PDF/DVI" isn't shown anymore, as
+ this info wasn't reliable (bug 112).
+- Now the PDF-related statistics (PDF objects...) in the .log file is only
+ shown in PDF output mode. It start with a line "PDF statistics:".
+- \pdfimageresolution is not limited to 2400 [dpi] anymore, can now be between
+ 0 and 65535 [dpi].
+- pdfTeX uses xpdf 3.00pl2
+- pdfTeX uses libpng 1.2.8, which fixes some png-related bugs.
+
+------------------------------------------------
+pdfTeX 3.141592-1.20a was released on 2004-09-06
+- There is a new program pdfxtex, which contains experimental features which
+ might end up in pdftex in the future.
+- Most distributions now use eTeX as the default engine, so when you call
+ pdftex you will get pdfeTeX. Most distributions now also use pdfTeX as the
+ default engine, so when you call latex you will get pdfeTeX running LaTeX.:-)
+- We are setting up pdfTeX as a project at sarovar
+ (http://sarovar.org/projects/pdftex/). Please report bugs etc. through the
+ site.
+- Support for the file pdftex.cfg is gone completely. All parameters that had
+ previously been set by it can be set through primitives; their values are
+ dumped to the format file.
+- The searchpath for encoding and mapfiles has been changed.
+ See http://tug.org/pipermail/tex-live/2004-January/004734.html and
+ http://tug.org/pipermail/tex-live/2004-January/004791.html
+- eTeX is now version 2.2, incorporating the last changes to TeX (3.141592).
+- New options for \pdfmapfile:
+ General functionality: Map items (map files, new: also single map lines; see
+ \pdfmapline) are put in list of pending map items. During the next shipout,
+ pending map items are sequentially scanned for their map entries, and an
+ internal map entry database is updated, using the modes below. Then the list
+ of pending map items is cleared. Map entries of fonts already in use are left
+ untouched. New: All \pdfmapfile and \pdfmapline commands can also be given
+ after shipout of the first page.
+ - \pdfmapfile {foo.map} clears the list of pending map items and starts a new
+ list with the only pending file foo.map. When the map entry lines of
+ foo.map are scanned, duplicate map entries are ignored and a warning is
+ issued. This is the old behaviour.
+ - \pdfmapfile {+foo.map} puts foo.map in the list of pending map items. When
+ the map entry lines of foo.map are scanned, duplicate map entries are
+ ignored and a warning is issued.
+ - \pdfmapfile {=foo.map} puts foo.map in the list of pending map items. When
+ foo.map is scanned, matching map entries in database are replaced by new
+ entries from foo.map.
+ - \pdfmapfile {-foo.map} puts foo.map in the list of pending map items. When
+ foo.map is scanned, matching map entries are deleted from database.
+ - \pdfmapfile {} clears the list of pending map items. It does not affect map
+ entries already registered into the database. This is the old behaviour.
+- New command \pdfmapline {line}. It's like \pdfmapfile but here you can set
+ single map lines like in the map files directly. The modifiers (+-=) have the
+ same effect as with \pdfmapfile.
+- Simplified the handling of the 14 Type 1 "standard fonts" (Times,
+ Helvetica...): They are now more or less handled like any other Type 1 font.
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000648.html
+- hz: So far the font expansion feature required that the user must be able to
+ create expanded tfms (eg cmr10+10.tfm). Now font expansion can be used
+ without creating these tfms.
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2004-May/000504.html
+- hz: Changed \pdffontexpand primitive --> the expand factor is now fixed to
+ 1000 and the argument is ignored. This will lead to spurious texts of "1000"
+ in your output if you compile old documents.
+- New command \pdftexbanner which returns a string with the full banner of the
+ current binary (e.g. "This is pdfTeX, Version 3.141592-1.20a (Web2C 7.5.3)
+ kpathsea version 3.5.3")
+- The PTEX.FullBanner key is now inserted in the document info dict instead of
+ the catalog. Newer versions of Acrobat display it.
+- Now includes support for encTeX.
+- Extended \pdfannot to use reserveobjnum/useobjnum
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2004-March/000424.html
+- Bugfix: pdfTeX would read an .xpdfrc when including pdfs.
+ See http://tug.org/pipermail/pdftex/2004-March/004835.html
+- Bugfix: The strings in /ID would sometimes be empty.
+- Bugfix: Even when mapfiles or encodings or PostScript font files were
+ missing, pdfTeX still produced a (most often corrupt) pdf. Now it aborts with
+ an error in these cases.
+- numerous small bugfixes.
+- pdfTeX now uses the GNU libavl from Ben Pfaff for managing of fontmap
+ entries.
+- pdfTeX uses zlib 1.2.1
+- pdfTeX uses xpdf 3.00
+- pdfTeX uses libpng 1.2.7
+
+------------------------------------------------
+pdfTeX 3.141592-1.11b was released on 2003-10-06
+- Bugfix: The handling of /Rotate produced displaced images when /Rotate was 90
+ or 270.
+
+------------------------------------------------
+pdfTeX 3.141592-1.11a was released on 2003-08-02
+- New command \pdftrailer analogue to \pdfcatalog whose argument ends up in the
+ trailer dictionary.
+- The behaviour when an included pdf has a newer version than the one specified
+ with \pdfoptionpdfminorversion can be controlled by the new internal integer
+ \pdfoptionpdfinclusionerrorlevel: If it's 0, pdfTeX gives only a warning; if
+ it's 1, it raises an error.
+ This can also be set in pdftex.cfg with pdf_inclusion_errorlevel
+- The syntax for outlines has been extended to allow attributes:
+ <outline spec> --> <attr spec> <action spec> [count <number>] <general text>
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2003-June/000165.html
+- The syntax of \pdfobj has been extended:
+ \pdfobj <object type spec> (h, v, m)
+ <object type spec> --> reserveobjnum
+ | [useobjnum <number>] [<attr spec>] [stream [<attr spec>]] <object contents>
+ <object contents> --> <file spec>
+ | <general text>
+ When the optional keyword `reserveobjnum' and `useobjnum' is not given, the
+ behaviour is unchanged.
+ See also http://tug.org/mailman/htdig/pdftex/2003-March/003814.html
+- Bugfix: /CreationDate didn't care for the timezone and could be fooled.
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2003-July/000223.html
+- Bugfix: The translation of 8-bit characters in included pdfs that had their
+ eighth bit set sometimes got wrong because of a missing typecast.
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2003-July/000216.html
+- Bugfix: pdfTeX -ini would crash with a minimal file because it didn't read
+ it's config and so didn't know anything about fonts.
+ See http://tug.org/pipermail/pdftex/2003-July/004262.html
+- Bugfix: \pdfstartlink would produce spurious /NewWindow entries. Also the
+ syntax of <action spec> and <goto-action spec> has been cleaned up.
+ See http://www.ntg.nl/pipermail/ntg-pdftex/2003-June/000167.html
+- Bugfix: \pdffontattr was not used for T3 fonts.
+ See http://tug.org/pipermail/pdftex/2003-June/004127.html
+- Bugfix: The cropbox of an included pdf would sometimes not be used.
+ See http://tug.org/pipermail/pdftex/2003-May/004037.html
+- pdfTeX uses xpdf 2.02
+
+------------------------------------------------
+pdfTeX 3.141592-1.10b was released on 2003-02-26
+- The numbers in transformation matrices are allways written with maximum
+ precision (see http://tug.org/pipermail/pdftex/2003-February/003596.html).
+- Incorporated the new version of TeX: 3.141592
+- Bugfix: Numbers in pdfs would sometimes be just a wee bit of (changed
+ implementation of pdftoepdf.convertNumToPDF).
+- Bugfix: When setting the /Producer, /Creator or /CreationDate keys with
+ \pdfinfo pdfTeX would also insert default values which caused duplicate keys
+ in the info dict (see
+ http://tug.org/pipermail/pdftex/2003-February/003524.html).
+- The reading of mapfiles is much faster (see
+ http://tug.org/pipermail/pdftex/2002-July/002843.html).
+- Bugfix: AR5 had problems with the CTM when displaying in "fit visible" mode
+ (see http://tug.org/pipermail/pdftex/2002-May/002688.html).
+- Bugfix: str_in_str had wrong indices (see
+ http://tug.org/pipermail/pdftex/2002-March/002367.html).
+- Bugfix: decimal_digits defaulted to 0, which caused problems with included
+ images when including pdfs (see
+ http://tug.org/pipermail/pdftex/2003-February/003518.html).
+ It now defaults to 4.
+- Bugfix: the type of included images was decided based only on the extensions;
+ now pdfTeX looks for magic bytes at the start of files (see
+ http://tug.org/pipermail/pdftex/2003-February/003519.html)
+
+-----------------------------------------------
+pdfTeX 3.14159-1.10a was released on 2003-01-16
+- pdfTeX is now able to produce pdf1.4 (which is also the default) and has
+ almost complete support for including pdf1.4 files:
+ - Additional attributes like MetaData are copied from included pdfs.
+ - Currently the Page Group attribute (see sections 7.3.6 and 7.5.5 of the pdf
+ 1.4 reference) of included pdfs is NOT copied (as we don't know how to
+ handle this when imposing pdfs).
+ This means including pdfs with transparency features will work as long as
+ the included pdf doesn't use Page Groups; if it does, the result might not
+ be what is expected (One application known to use Page Groups is Adobe
+ Illustrator v9++). The distributed pdfTeX binaries will give a warning
+ about any occurance of a Page Group in an included pdf and ignore the Page
+ Group (thus producing syntactically correct pdfs but probably not the
+ intended output).
+ Acrobat 5++ and newer versions of Jaws display files without Page Groups
+ correctly, so this might not really be a problem.
+ See pdftoepdf.cc for preprocessor flags which allow this behaviour to be
+ changed (copying the Page Group (most likely producing incorrect pdf) or
+ treating Page Groups as errors).
+- The new primitive \pdfoptionpdfminorversion sets the pdf version of the
+ generated file and the latest allowed pdf version of included pdfs:
+ \pdfoptionpdfminorversion=3
+ tells pdfTeX to set the pdf version to 1.3 and allows only included pdfs with
+ versions <= 1.3 .
+ The default for \pdfoptionpdfminorversion is 4 for pdf 1.4
+ This must appear before any data is written to the generated pdf file, so
+ you should put it at the very start of your files.
+ This can also be set in pdftex.cfg with pdf_minorversion
+- It is now possible to specify the pdf page box to use when including pdfs.
+ The syntax has been extended:
+ \pdfximage [<image attr spec>] <general text> (h, v, m)
+ <image attr spec> --> [<rule spec>] [<attr spec>] [<page spec>] [<pdf box spec>]
+ <pdf box spec> --> mediabox|cropbox|bleedbox|trimbox|artbox
+ The default is cropbox (which defaults to mediabox), to be compatible with
+ previous versions of pdfTeX.
+ The page box specified at \pdfximage can be globally overridden with the
+ config parameter always_use_pdfpagebox and the command
+ \pdfoptionalwaysusepdfpagebox <integer>, where 0 is the default (use whatever
+ is specified with \pdfximage), 1 is media, 2 is crop, 3 is bleed, 4 is trim
+ and 5 is artbox. This can only be set once per object, i.e. the value used at
+ \pdfximage is remembered.
+ See the pdf reference for an explanation of the boxes.
+- The support for the inclusion of jpeg images has been extended to allow the
+ inclusion of JPEG/Exif files which are produced by digital photo cameras
+ (thanks to Hartmut Henkel).
+- The support for the inclusion of tif images has been removed as it was of
+ limited use (it worked only for gray-scale and rgb images) and produced wrong
+ results (all other images types where treated as rgb images).
+ Tif images can be converted on *nix on-the-fly to pngs with the help of
+ ImageMagick, epstopdf.sty or pdftex.def v0.4 or newer, and this rule:
+ \DeclareGraphicsRule{.tif}{png}{.png}{`convert #1 `basename #1 .tif`.png}
+- The extensions for pdf encryption have been removed, since they make the
+ pdfTeX code overly complex. Those needing pdf encryption are encouraged to
+ produce a standalone program for encrypting pdfs.
+- pdfTeX now writes a usage statistic about the pdfTeX specific memory to the
+ log.
+- numerous bugfixes, most of them in the inclusion of pdfs.
+- pdfTeX uses xpdf 2.01
+- pdfTeX uses libpng 1.2.5
+
+---------------------------------------------------------------------
+pdfTeX 3.14159-1.00a-pretest-20011127-ojmw was released on 2002-01-29
+
+----------------------------------------------------------------
+pdfTeX 3.14159-1.00a-pretest-20010806 was released on 2001-08-06
+
+----------------------------------------------------------------
+pdfTeX 3.14159-1.00a-pretest-20010804 was released on 2001-08-04
+
+(This file public domain.)
+// vim: tw=79:ts=2:expandtab:autoindent
diff --git a/systems/doc/pdftex/README b/systems/doc/pdftex/README
new file mode 100644
index 0000000000..785ab5b459
--- /dev/null
+++ b/systems/doc/pdftex/README
@@ -0,0 +1,60 @@
+pdfTeX is an extended version of eTeX that can create PDF directly from
+TeX source files and enhance the result of TeX typesetting with the help
+of PDF. When PDF output is not selected, pdfTeX produces normal DVI
+output, otherwise it produces PDF output that looks essentially
+identical to the DVI output
+
+An important aspect of this project was to investigate alternative
+justification algorithms, resulting in the "microtypography" features of
+margin kerning and font expansion. This was inspired by Peter Karow's
+and Hermann Zapf's work.
+
+pdfTeX is integrated with the original e-TeX sources and Web2c. It is
+actively maintained, but stability is paramount now; only bug fixes and
+small enhancements are expected. Releases are made through TeX Live.
+
+See the file NEWS for changes to the program.
+Documentation about pdfTeX can be found at http://www.pdftex.org.
+Mailing lists:
+http://lists.tug.org/pdftex - help requests, general user discussion
+http://www.ntg.nl/mailman/listinfo/ntg-pdftex - bug reports, development
+
+
+LEGAL ISSUES
+============
+
+pdfTeX is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+pdfTeX is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+details.
+
+You should have received a copy of the GNU General Public License along
+with this program. If not, see <http://www.gnu.org/licenses/>.
+
+pdfTeX uses code from TeX; for these parts the original copyright by Don
+Knuth applies. See the source files for details.
+
+pdfeTeX uses code from eTeX; for these parts the original copyright by
+Peter Breitenlohner applies. See the source files for details.
+
+CONTRIBUTORS
+============
+
+Karl Berry, Peter Breitenlohner, Ricardo Sanchez Carmenes, Otfried
+Cheong, Thomas Esser, Hans Hagen, Hartmut Henkel, Taco Hoekwater, Pawel
+Jackowski, Pavel Janik, Tom Kacvinsky, Akira Kakuto, Reinhard Kotucha,
+Derek B. Noonburg, Heiko Oberdiek, Jiri Osoba, Fabrice Popineau,
+Sebastian Rahtz, Bernd Raichle, Tomas Rokicki, Leonard Rosenthol, Martin
+Schrder, Petr Sojka, Ralf Utermann, Olaf Weber, Jiri Zlatuska.
+
+Some companies have supported the developement of pdfTeX: Adobe Systems
+Inc., ArtCom GmbH, Pragma ADE, QuinScape GmbH.
+
+pdfTeX is built on top of TeX, written by Donald Knuth cum suis (Frank
+Liang et al.), and e-TeX, written by Peter Breitenlohner cum suis;
+the advanced paragraph optimization is inspired by the work of Hermann Zapf.
diff --git a/systems/doc/pdftex/manual/ChangeLog b/systems/doc/pdftex/manual/ChangeLog
new file mode 100644
index 0000000000..3c90f87a7d
--- /dev/null
+++ b/systems/doc/pdftex/manual/ChangeLog
@@ -0,0 +1,254 @@
+2018-01-01 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (encodingfile): supported for Type 3 fonts.
+
+2017-12-14 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdfinfo): describe [+-]HH'mm' time zone
+ specification as well as Z.
+
+2017-11-28 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdfprimitive): clarify further.
+
+2017-11-14 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdftrailerid): absolute file name is no longer
+ used in the /ID seed, just the base name, for reproducibility.
+ (\pdfprimitive): clarify.
+
+2017-04-20 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\currentpdftex): 1.40.18 (for TeX Live 2017).
+
+ * pdftex-t.tex (Map files): omit description of tfm-only map
+ entries (and pgc), since the behavior might change. Use "psname"
+ instead of "basename" for possible clarity. Various other rewordings.
+
+ *pdftex-t.tex (--version, --pdf): do not erroneously output a tt
+ ligature.
+
+2017-03-18 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex: starting from -> starting with
+ * pdftex-t.tex: starting from -> starting with.
+
+2017-03-17 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\efcode, \rpcode, \lpcode, \knbscode, \knstcode,
+ \knshcode, \knbccode, \knaccode): state that changes to these
+ tables are global, not affected by TeX's grouping, and only to the
+ particular <font> specified. Report from Doug McKenna.
+
+2017-03-16 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex: behavior, not behaviour, for consistency with
+ seemingly all else (color, math, etc.).
+
+ * pdftex-t.tex: behavior, not behaviour. Nothing else here is UK.Eng.
+
+ * pdftex-t.tex (Map files) <encodingfile>: can be specified for
+ bitmap PK fonts now also.
+
+ * pdftex-t.tex (\tagcode): use <8-bit number> like everything else,
+ rather than <character code>. Report from Doug McKenna.
+
+2017-02-18 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdfpageattr): document new behavior of
+ omitting our /MediaBox if "/MediaBox" is present in this token list.
+
+2017-02-01 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (Map files): clarify that decimal 4 = bit position 3
+ = symbolic, for embedded fonts, and specify the 0x22 default for
+ non-embedded fonts.
+ Report from Gernot Hassenpflug to pdftex, 1 Dec 2016 14:01:30.
+
+2016-07-05 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdfcatalog): show "openaction <action spec>"
+ after the <general text>, instead of creating an <open-action spec>,
+ for (hopefully) more clarity.
+ (open-action spec): remove \Syntax item.
+ Report from Douglas McKenna to pdftex list, 3 Jul 2016 12:46:59.
+
+ (\pdftrailer, \pdftrailerid): give simple examples.
+
+2016-06-12 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (\pdfmatch): mention default subcount 10; wording.
+ (\pdflastmatch): clarify match position, wording;
+
+ * pdftex-t.tex (Invoking \PDFTEX): new name FORCE_SOURCE_DATE for
+ SOURCE_DATE_EPOCH_TEX_PRIMITIVES.
+
+2016-05-20 Karl Berry <karl@tug.org>
+
+ * TeX Live 2016 release.
+
+2016-05-05 Karl Berry <karl@tug.org>
+
+ * pdftex-t.tex: missed \
+
+2016-05-04 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex (Invoking \PDFTEX): describe
+ SOURCE_DATE_EPOCH_TEX_PRIMITIVES, with caveats.
+
+2016-04-25 Karl Berry <karl@freefriends.org>
+
+ * samplepdf: move subdir up a level for more visibility.
+ * pdftex-t.tex: adjust doc.
+
+ * pdftex-t.tex: reduce long lines, reduce spaces after markup.
+ (\pdftex-syntax.tex): \input this autogenerated file,
+ instead of having redundant (and out of date) text.
+ (\Modelist): new macro for the (h,v,m) listings,
+ so we can autogenerate complete primitive/syntax info.
+ (\pdfpageresources): document this, previously missing.
+
+ * syntaxform.pl: new script to generate pdftex-syntax.tex.
+ * syntaxform.awk: handle \Modelist, discard \unkern.
+ * Makefile (default): build only what we distribute in TL.
+ (all): build everything else.
+ (pdftex-syntax.tex): new rule using syntaxform.pl; related changes.
+ * README: bring up to date, avoid redundancies.
+
+2016-04-25 Karl Berry <karl@freefriends.org>
+
+ * pdftex-w.txt: rename from pdftex-t.txt.
+ * pdftex-t.tex: change \typefile call.
+ * Makefile: change calls and dependencies.
+
+ * pdftex-t.tex: use \type{-}\type{-help}, etc., to work
+ with both older and newer ConTeXt.
+
+ * Makefile (pdftex_binary): use "pdftex" if no binary
+ in the build path.
+
+2016-04-23 Karl Berry <karl@freefriends.org>
+
+ * pdftex-t.tex: Update for 1.40.17 (TeX Live 2016).
+ (Invoking \PDFTEX): new section, with description of
+ new support for envvar SOURCE_DATE_EPOCH.
+ New primitives: \pdfinfoomitdate \pdftrailerid \pdfsuppressptexinfo.
+
+2015-03-25 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\currentpdftex): 1.40.16. (TeX Live 2015.)
+
+2014-12-12 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfinclusionerrorlevel): if negative, no diagnostic.
+
+2014-10-18 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfminorversion): better explain the compiled
+ default (4) vs. the typical format default (5). Report from Heiko
+ on ntg-pdftex, 20 Sep 2014 23:51:01.
+
+2014-04-23 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\currentpdftex): 1.40.15. (Update TeX Live.)
+
+2014-04-04 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfinterwordspace...): mention dummy-space font.
+
+2014-03-23 Han The Thanh <hanthethanh@gmail.com>
+
+ * pdftex-t.tex (\pdfinterwordspace...): add new sections.
+
+2014-03-23 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfgentounicode, \pdfglyphtounicode): be a bit
+ less terse; mention failure of ligatures to be searchable by default.
+ (glyphtounicode.tex): \input this at the end, why not.
+
+2014-02-23 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex: small changes to the build process, copyright
+ year, no pool file any more, etc.
+
+ * pdftex-t.tex (\pdfnobuiltintounicode): belated doc.
+
+2014-02-14 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfsuppresswarningpagegroup): doc.
+
+2012-04-15 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex: update copyright and other years.
+ (\currentpdftex): bump to 1.40.13 (missed this last year).
+ (\PDFReference): italics looks nicer, I think.
+ (Setting up fonts): description is written better to start on same
+ line as item name. Also avoids bad page break after item name.
+ (\pdfsuppresswarningdupdest, \pdfsuppresswarningdupmap): doc.
+
+ * Makefile (pdftexversion): get from \currentpdftex (also missed).
+
+ * pdftex-w.tex: use flags (2=serif) to avoid warnings.
+
+2011-04-01 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex: Explain \pdfnormaldeviate a bit more fully.
+ Tweak wording of nearby entries.
+
+2010-11-22 Karl Berry <karl@gnu.org>
+
+ * Makefile (distall): use $(distnopdf) instead of duplicating file
+ list.
+
+ * pdftex-t.tex: Fix \pdfobj example, PDF reference url,
+ MacTeX much more current than CMacTeX, etc.
+ From Paul I.
+
+ * pdftex-t.tex: avoid text lines >=80 chars.
+ No need for ~ after a and an in English.
+ * pdftex-w.tex: make consistent with pdftex-t.tex.
+
+2010-11-22 Paul Isambert <zappathustra@free.fr>
+
+ * pdftex-t.tex: fixes for \Something instead of \type
+
+2010-11-19 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex: use \tex{foo} instead of \type{\foo} for bookmarks,
+ so we get the \'s.
+ Remove section about truetype details that became a TUB paper,
+ to avoid duplication.
+
+ * pdftex-w.tex (\pdfobjcompresslevel): must set to 0 explicitly.
+ Noticed by Paul I.
+ * pdftex-t.tex (titlepagelines): consequent update.
+
+ * pdftex-t.tex: alphabetize misc new primitives list; typos.
+
+2010-11-18 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex (\pdfretval): minimally document.
+
+2010-11-16 Karl Berry <karl@gnu.org>
+
+ * pdftex-t.tex: a couple more abbreviations, English, etc.
+
+2010-11-15 Paul Isambert <zappathustra@free.fr>
+
+ * pdftex-t.tex: more primitives.
+
+2010-11-14 Karl Berry <karl@gnu.org>
+
+ * All files: expand keywords again, so the manual appears
+ updated, among other things.
+
+ * Makefile (pdftexversion): 1.40.11 now.
+ (pdftex-t.txt): set GREP_OPTIONS=--text.
+
+ * pdftex-i.tex: add \pdfmapline for contnav, somehow omitted
+ from TL for years now.
+
+ * pdftex-t.tex: update intro information about distributions,
+ etc., to be somewhat more accurate.
+
+(This ChangeLog file is public domain.)
diff --git a/systems/doc/pdftex/manual/Makefile b/systems/doc/pdftex/manual/Makefile
new file mode 100644
index 0000000000..d6589ac1c0
--- /dev/null
+++ b/systems/doc/pdftex/manual/Makefile
@@ -0,0 +1,140 @@
+# $Id: Makefile 767 2017-02-18 23:49:54Z karl $
+# Makefile for pdfTeX documentation. Public domain.
+
+# Get version we're documenting from the \def in the manual.
+pdftexversion=`sed -n 's,^.def.currentpdftex{\(.*\)},\1,p' manual/pdftex-t.tex`
+
+context = texexec --batchmode
+# context does not have \setupoutput.
+# texmfstart exits immediately.
+
+# what we distribute in TeX Live.
+default: pdftex-a.pdf pdftex-syntax.txt
+
+# the other formats (everything that can be built).
+all: pdftex-l.pdf pdftex-s.pdf booklet
+
+common_deps = pdftex-t.tex pdftex-w.txt pdftex-help.txt pdftex-syntax.tex
+pdftex-a.pdf a: $(common_deps)
+ $(context) --mode=a4 --result=$@ $<
+
+pdftex-l.pdf l: $(common_deps)
+ $(context) --mode=letter --result=$@ $<
+
+pdftex-s.pdf s: $(common_deps) pdftex-i.tex
+ $(context) --mode=screen --result=$@ $<
+
+
+# booklet version is not made by default.
+booklet: pdftex-b.pdf pdftex-b-e.pdf pdftex-b-o.pdf
+
+pdftex-b.pdf b: pdftex-a.pdf
+ $(context) --pdfarrange --paper=a5a4 --print=up --addempty=1,2 \
+ --result=$@ $<
+
+pdftex-b-e.pdf: pdftex-a.pdf
+ $(context) --pdfarrange --paper=a5a4 --print=up --addempty=1,2 \
+ --pages=even --result=$@ $<
+
+pdftex-b-o.pdf: pdftex-a.pdf
+ $(context) --pdfarrange --paper=a5a4 --print=up --addempty=1,2 \
+ --pages=odd --result=$@ $<
+
+
+# Creating the subsidiary/dependent files.
+
+# TeXable text for the title page.
+pdftex-w.txt: pdftex-w.pdf
+ cat $< \
+ | expand \
+ | fmt -s -w36 \
+ | grep --text . \
+ | expand >$@ || rm -f $@
+ wc -l pdftex-w.txt # set titlepagelines=half of this
+
+# PDF for the title page.
+pdftex-w.pdf: pdftex-w.tex
+ pdftex $<
+
+
+# Too annoying to remake help text every time; check by hand when needed.
+pdftex-help.txt: force
+ $(pdftex_binary) --help >$@ || rm -f $@
+force:
+
+# if we don't have a build tree around, just try from the path.
+build_binary := ../../source/build-pdftex/texk/web2c/pdftex
+ifneq "$(realpath $(build_binary))" ""
+pdftex_binary := $(build_binary)
+else
+pdftex_binary := pdftex
+endif
+
+# Primitives and syntax, in TeX for the printed manual, and then in
+# plain text for human convenience.
+pdftex-syntax.tex: pdftex-t.tex syntaxform.pl
+ perl syntaxform.pl pdftex-t.tex >pdftex-syntax.tex || rm -f $@
+
+pdftex-syntax.txt: pdftex-t.tex pdftex-syntax.tex syntaxform.awk
+ gawk -f syntaxform.awk pdftex-syntax.tex $< >$@ || rm -f $@
+
+
+# Install from this source directory to TL.
+
+tltree = /home/texlive/karl/Master/texmf-dist
+dest = $(tltree)/doc/pdftex/manual
+
+INSTALL_DATA = cp -p
+
+install: default
+ $(INSTALL_DATA) ChangeLog Makefile README makefiles.cmd $(dest)
+ $(INSTALL_DATA) pdftex-a.pdf pdftex-syntax.txt $(dest)
+ $(INSTALL_DATA) pdftex-t.tex pdftex-w.tex pdftex-i.tex $(dest)
+ $(INSTALL_DATA) syntaxform.awk syntaxform.pl $(dest)
+
+
+# Dist and clean.
+# tar/zip including pdftex-a.pdf, pdftex-l.pdf, pdftex-s.pdf,
+# although we don't ever make such distributions any more.
+
+distall=$(distnopdf) pdftex-a.pdf pdftex-l.pdf pdftex-s.pdf
+
+mandir=manual
+distdate=`date +%y%m%d`
+distrev=`awk '/Id:/{print $$4; exit}' $(mandir)/pdftex-t.tex`
+
+distnopdf=pdftex-w.tex pdftex-w.txt pdftex-t.tex \
+ pdftex-i.tex syntaxform.awk Makefile makefiles.cmd \
+ pdftex-syntax.txt pdftex-help.txt README ChangeLog
+
+alltar: $(distall)
+ cd .. && tar cvjf $(mandir)/pdftex-$(pdftexversion)-userman-$(distrev).tar.bz2 \
+ $(patsubst %, $(mandir)/%, $(distall))
+
+allzip: $(distall)
+ cd .. && zip $(mandir)/pdftex-$(pdftexversion)-userman-$(distrev).zip \
+ $(patsubst %, $(mandir)/%, $(distall))
+
+
+# tar/zip without PDF files:
+
+tar: $(distnopdf)
+ cd .. && tar cvjf $(mandir)/pdftex-$(pdftexversion)-userman-$(distrev)-src.tar.bz2 \
+ $(patsubst %, $(mandir)/%, $(distnopdf))
+ ls -l *.tar.bz2
+
+zip: $(distnopdf)
+ cd .. && zip $(mandir)/pdftex-$(pdftexversion)-userman-$(distrev)-src.zip \
+ $(patsubst %, $(mandir)/%, $(distnopdf))
+
+
+clean:
+ rm -f *.log *.tuo *.tui *.top *.tmp *-mpgraph.mp
+
+maintainer-clean: clean
+ rm -f pdftex-a.pdf pdftex-l.pdf pdftex-s.pdf
+ rm -f pdftex-b.pdf pdftex-b-e.pdf pdftex-b-o.pdf
+ rm -f pdftex-help.txt pdftex-syntax.txt pdftex-syntax.tex
+ rm -f pdftex-w.pdf pdftex-w.txt
+
+clobber allclean realclean distclean: maintainer-clean
diff --git a/systems/doc/pdftex/manual/README b/systems/doc/pdftex/manual/README
new file mode 100644
index 0000000000..be29ce125f
--- /dev/null
+++ b/systems/doc/pdftex/manual/README
@@ -0,0 +1,29 @@
+$Id: README 742 2016-04-25 17:30:55Z karl $
+
+(This README file public domain.)
+
+Documentation files for pdfTeX:
+
+pdftex-a.pdf A4 paper size
+pdftex-l.pdf letter paper size
+pdftex-s.pdf screen format
+pdftex-b.pdf A5 booklet made from pdftex-a.pdf
+pdftex-b-e.pdf A5 booklet, even pages
+pdftex-b-o.pdf A5 booklet, odd pages
+
+pdftex-t.tex source for manual (ConTeXt)
+pdftex-w.tex source for title page (plain)
+pdftex-i.tex settings for screen output (ConTeXt)
+
+pdftex-help.txt output of --help
+pdftex-syntax.tex primitives and syntax rules, autogenerated from manual
+pdftex-syntax.txt autogenerated from .tex
+
+syntaxform.pl script for making pdftex-syntax.tex
+syntaxform.awk script for making pdftex-syntax.txt
+
+The Makefile has the rules for building everything.
+For Windows, see makefiles.cmd, though it has not been updated in years.
+
+If working on the manual, make clean removes all the temporary files.
+make maintainer-clean removes everything that can be generated.
diff --git a/systems/doc/pdftex/manual/makefiles.cmd b/systems/doc/pdftex/manual/makefiles.cmd
new file mode 100644
index 0000000000..5bda71136c
--- /dev/null
+++ b/systems/doc/pdftex/manual/makefiles.cmd
@@ -0,0 +1,13 @@
+rem texexec --format=plain pdftex-x
+rem copy pdf file to pdftex-y and edit that file
+rem texexec --format=plain pdftex-z
+
+texexec --pdf --result=pdftex-a pdftex-t
+texexec --pdf --result=pdftex-b pdftex-a --pdfarrange --print=up --paper=A4A3 --addempty=1,2
+
+texexec --pdf --result=pdftex-l pdftex-t --mode=letter
+texexec --pdf --result=pdftex-s pdftex-t --mode=screen
+
+del /q pdftex.zip
+
+zip pdftex pdftex-a.pdf pdftex-l.pdf pdftex-s.pdf pdftex-t.tex pdftex-i.tex pdftex-t.txt makefiles.cmd
diff --git a/systems/doc/pdftex/manual/pdftex-a.pdf b/systems/doc/pdftex/manual/pdftex-a.pdf
new file mode 100644
index 0000000000..f29ac5d9a4
--- /dev/null
+++ b/systems/doc/pdftex/manual/pdftex-a.pdf
Binary files differ
diff --git a/systems/doc/pdftex/manual/pdftex-i.tex b/systems/doc/pdftex/manual/pdftex-i.tex
new file mode 100644
index 0000000000..28036649bc
--- /dev/null
+++ b/systems/doc/pdftex/manual/pdftex-i.tex
@@ -0,0 +1,136 @@
+%$Id: pdftex-i.tex 635 2010-11-14 19:15:12Z karl $
+
+\pdfmapline{+contnav ContextNavigation <contnav.pfb}
+\startmode[screen]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=20pt,
+ backspace=40pt,
+ width=520pt,
+ height=390pt,
+ lines=29,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=10pt,
+ bottom=20pt,
+ leftmargin=30pt,
+ leftmargindistance=10pt,
+ rightmargin=0pt,
+ rightedge=27.5pt,
+ rightedgedistance=7.5pt]
+
+\setupcolors
+ [state=start]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=ColorP]
+
+\setupbackgrounds
+ [text][text]
+ [backgroundoffset=2.5pt,
+ background=color,
+ backgroundcolor=ColorT]
+
+\definecolor [ColorT] [s=.85]
+\definecolor [ColorP] [r=.3,g=.4,b=.5]
+\definecolor [ColorI] [r=.95,g=.95,b=0]
+
+\setupinteraction
+ [state=start,
+ menu=on,
+ color=ColorP,
+ contrastcolor=ColorP]
+
+\setupfootnotedefinition
+ [location=serried,
+ width=fit]
+
+\setuptabulate
+ [rulecolor=ColorP]
+
+\setupfootnotes
+ [rulecolor=ColorP]
+
+\setupinteractionmenu
+ [right,bottom]
+ [state=start,
+ color=ColorI,
+ contrastcolor=ColorI,
+ style=bold,
+ frame=off]
+
+\setuplist
+ [chapter,section]
+ [pagenumber=off]
+
+\startinteractionmenu[right]
+ \bodyfontsize=20pt
+ \but [firstpage] \rotate[rotation=270]{\symbol[firstpage]} \\
+ \but [lastpage] \rotate[rotation=270]{\symbol[lastpage]} \\ \vfill
+ \but [previouspage] \rotate[rotation=270]{\symbol[previouspage]} \\
+ \but [nextpage] \rotate[rotation=270]{\symbol[nextpage]} \\ \vfill
+ \but [PreviousJump] \rotate[rotation=270]{\symbol[PreviousJump]} \\
+ \but [NextJump] \rotate[rotation=270]{\symbol[NextJump]} \\
+\stopinteractionmenu
+
+\startinteractionmenu[bottom]
+ \but [contents] content \\ \hfill
+ \but [paperversion::] The pdf\TeX\ user manual \\ \hfill
+ \but [CloseDocument] exit \\
+\stopinteractionmenu
+
+\setuphead
+ [section,subsection,subsubsection,pdftexprimitive,subject]
+ [textcolor=ColorP,
+ numbercolor=ColorT]
+
+\def\SubSub#1{\mathematics{\color[ColorT]{\blacktriangleright}}}
+
+\useexternaldocument[paperversion][pdftex-a]
+
+\coupledocument
+ [paperversion]
+ [pdftex-a]
+ [section,subsection,subsubsection,pdftexprimitive]
+ [the paper version]
+
+\setuphead
+ [section,subsection,subsubsection,pdftexprimitive]
+ [file=paperversion]
+
+\stopmode
+
+\startbuffer[screen]
+
+\setupbackgrounds [page] [background={color,content}]
+\defineoverlay [content] [\overlaybutton{contents}]
+\setupinteraction [menu=off]
+
+\startstandardmakeup
+ \setupalign[middle]
+ \startcolor[ColorP]
+ \definefont[test][TitleFont at 130pt] \test \setupinterlinespace
+ \strut PDF\kern.1em\TeX
+ \definefont[test][TitleFont at 60pt] \test \setupinterlinespace
+ \vfill
+ users manual
+ \vfill
+ \definefont[test][TitleFont at 15pt] \test \setupinterlinespace
+ \leavevmode
+ \gotobox{\strut \underbar{H\`an Th\^e Th\`anh}}[url(thanh)]\quad
+ \gotobox{\strut Sebastian Rahtz}[url(sebastian)]\quad
+ \gotobox{\strut Hans Hagen}[url(hans)]\quad
+ \gotobox{\strut Hartmut Henkel}[url(hartmut)]
+ \vfill
+ \stopcolor
+\stopstandardmakeup
+
+\setupinteraction [menu=on]
+\setupbackgrounds [page] [background=color]
+
+\stopbuffer
diff --git a/systems/doc/pdftex/manual/pdftex-syntax.txt b/systems/doc/pdftex/manual/pdftex-syntax.txt
new file mode 100644
index 0000000000..70a1a454d8
--- /dev/null
+++ b/systems/doc/pdftex/manual/pdftex-syntax.txt
@@ -0,0 +1,220 @@
+%% $Id: syntaxform.pl 742 2016-04-25 17:30:55Z karl $
+%% This is the list of new or extended primitives provided by pdftex.
+%% Don't edit this file, as it is now auto-generated from the
+%% pdfTeX manual source pdftex-t.tex (and the generated
+%% pdftex-syntax.tex) by the script syntaxform.awk.
+%% Syntax rule conventions borrowed from `TeXbook naruby' by Petr Olsak.
+
+%% Integer registers:
+\efcode <font> <8-bit number> (integer)
+\knaccode <font> <8-bit number> (integer)
+\knbccode <font> <8-bit number> (integer)
+\knbscode <font> <8-bit number> (integer)
+\lpcode <font> <8-bit number> (integer)
+\pdfadjustinterwordglue (integer)
+\pdfadjustspacing (integer)
+\pdfappendkern (integer)
+\pdfcompresslevel (integer)
+\pdfdecimaldigits (integer)
+\pdfdraftmode (integer)
+\pdfforcepagebox (integer)
+\pdfgamma (integer)
+\pdfgentounicode (integer)
+\pdfimageapplygamma (integer)
+\pdfimagegamma (integer)
+\pdfimagehicolor (integer)
+\pdfimageresolution (integer)
+\pdfinclusioncopyfonts (integer)
+\pdfinclusionerrorlevel (integer)
+\pdfinfoomitdate (integer)
+\pdfminorversion (integer)
+\pdfobjcompresslevel (integer)
+\pdfoutput (integer)
+\pdfpagebox (integer)
+\pdfpkresolution (integer)
+\pdfprependkern (integer)
+\pdfprotrudechars (integer)
+\pdfsuppressptexinfo (integer)
+\pdfsuppresswarningdupdest (integer)
+\pdfsuppresswarningdupmap (integer)
+\pdfsuppresswarningpagegroup (integer)
+\pdftracingfonts (integer)
+\pdfuniqueresname (integer)
+\rpcode <font> <8-bit number> (integer)
+\shbscode <font> <8-bit number> (integer)
+\stbscode <font> <8-bit number> (integer)
+\tagcode <font> <8-bit number> (integer)
+
+%% Read-only integers:
+\pdfelapsedtime (read-only integer)
+\pdflastannot (read-only integer)
+\pdflastlink (read-only integer)
+\pdflastobj (read-only integer)
+\pdflastxform (read-only integer)
+\pdflastximage (read-only integer)
+\pdflastximagecolordepth (read-only integer)
+\pdflastximagepages (read-only integer)
+\pdflastxpos (read-only integer)
+\pdflastypos (read-only integer)
+\pdfrandomseed (read-only integer)
+\pdfretval (read-only integer)
+\pdfshellescape (read-only integer)
+\pdftexversion (read-only integer)
+
+%% Dimen registers:
+\pdfdestmargin (dimen)
+\pdfeachlinedepth (dimen)
+\pdfeachlineheight (dimen)
+\pdffirstlineheight (dimen)
+\pdfhorigin (dimen)
+\pdfignoreddimen (dimen)
+\pdflastlinedepth (dimen)
+\pdflinkmargin (dimen)
+\pdfpageheight (dimen)
+\pdfpagewidth (dimen)
+\pdfpxdimen (dimen)
+\pdfthreadmargin (dimen)
+\pdfvorigin (dimen)
+
+%% Token registers:
+\pdfpageattr (tokens)
+\pdfpageresources (tokens)
+\pdfpagesattr (tokens)
+\pdfpkmode (tokens)
+
+%% Expandable commands:
+\ifincsname (expandable)
+\ifpdfabsdim (expandable)
+\ifpdfabsnum (expandable)
+\ifpdfprimitive <control sequence> (expandable)
+\leftmarginkern <box number> (expandable)
+\pdfcolorstackinit [page] [direct] <general text> (expandable)
+\pdfcreationdate (expandable)
+\pdfescapehex <general text> (expandable)
+\pdfescapename <general text> (expandable)
+\pdfescapestring <general text> (expandable)
+\pdffiledump [offset <number>] [length <number>] <general text> (expandable)
+\pdffilemoddate <general text> (expandable)
+\pdffilesize <general text> (expandable)
+\pdffontname <font> (expandable)
+\pdffontobjnum <font> (expandable)
+\pdffontsize <font> (expandable)
+\pdfincludechars <font> <general text> (expandable)
+\pdfinsertht <integer> (expandable)
+\pdflastmatch <integer> (expandable)
+\pdfmatch [icase] [subcount <integer>] <general text> <general text> (expandable)
+\pdfmdfivesum file <general text> (expandable)
+\pdfnormaldeviate (expandable)
+\pdfpageref <page number> (expandable)
+\pdfstrcmp <general text> <general text> (expandable)
+\pdftexbanner (expandable)
+\pdftexrevision (expandable)
+\pdfunescapehex <general text> (expandable)
+\pdfuniformdeviate <number> (expandable)
+\pdfxformname <object number> (expandable)
+\pdfximagebbox <integer> <integer> (expandable)
+\rightmarginkern <box number> (expandable)
+
+%% General commands:
+\letterspacefont <control sequence> <font> <integer>
+\pdfannot <annot type spec> (h, v, m)
+\pdfcatalog <general text> [openaction <action spec>]
+\pdfcolorstack <stack number> <stack action> <general text>
+\pdfcopyfont <control sequence> <font>
+\pdfdest <dest spec> (h, v, m)
+\pdfendlink (h, m)
+\pdfendthread (v, m)
+\pdffakespace
+\pdffontattr <font> <general text>
+\pdffontexpand <font> <stretch> <shrink> <step> [autoexpand]
+\pdfglyphtounicode <general text> <general text>
+\pdfinfo <general text>
+\pdfinterwordspaceoff
+\pdfinterwordspaceon
+\pdfliteral [<pdfliteral spec>] <general text> (h, v, m)
+\pdfmapfile <map spec>
+\pdfmapline <map spec>
+\pdfnames <general text>
+\pdfnobuiltintounicode <font>
+\pdfnoligatures <font>
+\pdfobj <object type spec> (h, v, m)
+\pdfoutline [<attr spec>] <action spec> [count <integer>] <general text> (h, v, m)
+\pdfprimitive <control sequence>
+\pdfrefobj <object number> (h, v, m)
+\pdfrefxform <object number> (h, v, m)
+\pdfrefximage <object number>
+\pdfresettimer
+\pdfrestore
+\pdfsave
+\pdfsavepos (h, v, m)
+\pdfsetmatrix
+\pdfsetrandomseed <number>
+\pdfstartlink [<rule spec>] [<attr spec>] <action spec> (h, m)
+\pdfthread [<rule spec>] [<attr spec>] <id spec> (h, v, m)
+\pdftrailer <general text>
+\pdftrailerid <general text>
+\pdftstartthread [<rule spec>] [<attr spec>] <id spec> (v, m)
+\pdfxform [<attr spec>] [<resources spec>] <box number> (h, v, m)
+\pdfximage [<rule spec>] [<attr spec>] [<page spec>] [<colorspace spec>] [<pdf box spec>] <general text> (h, v, m)
+\quitvmode
+\special {pdf: <text> }
+\special {pdf:direct: <text> }
+\special {pdf:page: <text> }
+\vadjust [<pre spec>] <filler> { <vertical mode material> } (h, m)
+
+%% Syntax rules:
+<general text> --> { <balanced text> }
+<attr spec> --> attr <general text>
+<resources spec> --> resources <general text>
+<rule spec> --> (width | height | depth) <dimen> [<rule spec>]
+<object type spec> --> reserveobjnum
+ | [useobjnum <number>] [stream [<attr spec>]] <object contents>
+<annot type spec> --> reserveobjnum
+ | [useobjnum <number>] [<rule spec>] <general text>
+<object contents> --> <file spec>
+ | <general text>
+<xform attr spec> --> [<attr spec>] [<resources spec>]
+<image attr spec> --> [<rule spec>] [<attr spec>] [<page spec>] [<colorspace spec>] [<pdf box spec>]
+<outline spec> --> [<attr spec>] <action spec> [count <number>] <general text>
+<action spec> --> user <user-action spec>
+ | goto <goto-action spec>
+ | thread <thread-action spec>
+<user-action spec> --> <general text>
+<goto-action spec> --> <numid>
+ | [<file spec>] <nameid>
+ | [<file spec>] [<page spec>] <general text>
+ | <file spec> <nameid> <newwindow spec>
+ | <file spec> [<page spec>] <general text> <newwindow spec>
+<thread-action spec> --> [<file spec>] <numid>
+ | [<file spec>] <nameid>
+<colorspace spec> --> colorspace <number>
+<pdf box spec> --> mediabox | cropbox | bleedbox | trimbox | artbox
+<map spec> --> { [<map modifier>] <balanced text> }
+<map modifier> --> + | = | -
+<numid> --> num <number>
+<nameid> --> name <general text>
+<newwindow spec> --> newwindow | nonewwindow
+<dest spec> --> <numid> <dest type>
+ | <nameid> <dest type>
+<dest type> --> xyz [zoom <number>]
+ | fitr <rule spec>
+ | fitbh
+ | fitbv
+ | fitb
+ | fith
+ | fitv
+ | fit
+<thread spec> --> [<rule spec>] [<attr spec>] <id spec>
+<id spec> --> <numid> | <nameid>
+<file spec> --> file <general text>
+<page spec> --> page <number>
+<expand spec> --> <stretch> <shrink> <step> [autoexpand]
+<stretch> --> <number>
+<shrink> --> <number>
+<step> --> <number>
+<pre spec> --> pre
+<pdfliteral spec> --> direct | page
+<pdfspecial spec> --> { [<pdfspecial id> [<pdfspecial modifier>]] <balanced text> }
+<pdfspecial id> --> pdf: | PDF:
+<pdfspecial modifier> --> direct:
+<stack action> --> set | push | pop | current
diff --git a/systems/doc/pdftex/manual/pdftex-t.tex b/systems/doc/pdftex/manual/pdftex-t.tex
new file mode 100644
index 0000000000..da2703fe56
--- /dev/null
+++ b/systems/doc/pdftex/manual/pdftex-t.tex
@@ -0,0 +1,5151 @@
+% interface=english modes=letter,screen output=pdftex
+% vim: tw=79
+
+% $Id: pdftex-t.tex 790 2018-01-02 00:12:04Z karl $
+
+% The number of lines on the title page depends on exactly
+% what \PDF\ code is generated.
+\setvariables[pdftex][titlepagelines=64]
+
+\setupoutput
+ [pdftex]
+
+%D ConTeXt defaults to 1.5; we want to be maximally compatible (and we don't
+%D use any features from 1.4++ anyway, do we?)
+\pdfminorversion=3
+
+%D First we define ourselves some abbreviations, if only to force
+%D consistency and to save typing. We use real small capitals, not pseudo.
+
+\setupsynonyms
+ [abbreviation]
+ [textstyle=smallcaps,
+ style=smallcaps,
+ location=left,
+ width=broad,
+ sample=\POSTSCRIPT]
+
+\setupcapitals
+ [title=no]
+
+\def\svnscan $#1 #2 #3 #4-#5-#6 #7${
+ \def\rcsrevision{#3}
+ \def\rcsyear{#4}
+ \def\rcsmonth{#5}
+ \def\rcsday{{\count0=#6\relax\the\count0}}
+ \def\rcsmonthname{\ifcase\rcsmonth ERROR\or
+ January\or February\or March\or April\or May\or June\or July\or
+ August\or September\or October\or November\or December\else ERROR\fi}
+}
+
+\svnscan $Id: pdftex-t.tex 790 2018-01-02 00:12:04Z karl $
+
+\def\currentpdftex{1.40.18}
+
+%***********************************************************************
+
+\def\eTeX{{$\varepsilon$}-\kern-.125em\TeX}
+\def\eg{e.g.}
+\def\Eg{E.g.}
+\def\PDFReference{{\sl PDF Reference}} % PDF with capital letters
+
+\abbreviation [AFM] {afm} {Adobe Font Metrics}
+\abbreviation [BIBTEX] {Bib\TeX} {Handles bibliographies}
+\abbreviation [ASCII] {ascii} {American Standard Code for Information Interchange}
+\abbreviation [CONTEXT] {\ConTeXt} {general purpose macro package}
+\abbreviation [CTAN] {ctan} {global \TEX\ archive server}
+\abbreviation [DVI] {dvi} {native \TEX\ Device Independent file format}
+\abbreviation [ENCTEX] {enc\TeX} {enc\TeX\ extension to \TEX}
+\abbreviation [EPSTOPDF] {epstopdf} {\EPS\ to \PDF\ conversion tool}
+\abbreviation [EPS] {eps} {Encapsulated PostScript}
+\abbreviation [ETEX] {\eTeX} {an extension to \TEX}
+\abbreviation [EXIF] {exif} {Exchangeable Image File format (JPEG file variant)}
+\abbreviation [FPTEX] {fp\TeX} {\WIN\ \WEBC\ distribution}
+\abbreviation [GHOSTSCRIPT] {Ghostscript} {\PS\ and \PDF\ language interpreter}
+\abbreviation [GNU] {gnu} {GNU's Not Unix}
+\abbreviation [HZ] {hz} {Hermann Zapf optimization}
+\abbreviation [ISO] {iso} {International Organization for Standardization}
+\abbreviation [JBIG] {jbig} {Joint Bi-level Image Experts Group}
+\abbreviation [JBIGTWO] {jbig2} {Joint Bi-level Image Experts Group}
+\abbreviation [JFIF] {jfif} {JPEG File Interchange Format}
+\abbreviation [JPEG] {jpeg} {Joint Photographic Experts Group}
+\abbreviation [JPEG] {jpeg} {Joint Photographic Experts Group}
+\abbreviation [LATEX] {\LaTeX} {general purpose macro package}
+\abbreviation [MAC] {Macintosh} {Macintosh hardware platform}
+\abbreviation [MACOSX] {Mac\,OS\,X} {Macintosh operating system version 10}
+\abbreviation [MACTEX] {Mac\TeX} {\MAC\ \WEBC\ distribution}
+\abbreviation [MDFIVE] {md5} {MD5 message-digest algorithm}
+\abbreviation [METAFONT] {\MetaFont} {graphic programming environment, bitmap output}
+\abbreviation [METAPOST] {\MetaPost} {graphic programming environment, vector output}
+\abbreviation [MIKTEX] {MiK\TeX} {\WIN\ distribution}
+\abbreviation [MLTEX] {ml\TeX} {ML\TeX\ extension to \TEX}
+\abbreviation [MPTOPDF] {mptopdf} {\METAPOST\ to \PDF\ conversion tool}
+\abbreviation [MSDOS] {ms-dos} {Microsoft DOS platform (Intel)}
+\abbreviation [PDFETEX] {pdfe\TeX} {\ETEX\ extension producing \PDF\ output}
+\abbreviation [PDFLATEX] {pdf\LaTeX} {\TEX\ extension producing \PDF\ output (\LATEX\ format loaded)}
+\abbreviation [PDFTEX] {pdf\TeX} {\TEX\ extension producing \PDF\ output}
+\abbreviation [PDF] {pdf} {Portable Document Format}
+\abbreviation [PERL] {Perl} {Perl programming environment}
+\abbreviation [PFA] {PFA} {Adobe PostScript Font format (ASCII)}
+\abbreviation [PFB] {PFB} {Adobe PostScript Font format (Binary)}
+\abbreviation [PK] {pk} {Packed bitmap font}
+\abbreviation [PNG] {png} {Portable Network Graphics}
+\abbreviation [POSIX] {posix} {Portable Operating System Interface}
+\abbreviation [PROTEXT] {pro\TeX t} {\WIN\ \WEBC\ distribution based on \MIKTEX}
+\abbreviation [PS] {ps} {PostScript}
+\abbreviation [POSTSCRIPT] {PostScript} {PostScript}
+\abbreviation [PSTOPDF] {PStoPDF} {PostScript to \PDF\ converter (on top of \GHOSTSCRIPT)}
+\abbreviation [RGB] {rgb} {Red Green Blue color specification}
+\abbreviation [TCX] {tcx} {\TEX\ Character Translation}
+\abbreviation [TDS] {tds} {\TEX\ Directory Standard}
+\abbreviation [TETEX] {te\TeX} {\TEX\ distribution for \UNIX\ (based on \WEBC)}
+\abbreviation [TEXEXEC] {\TeX exec} {\CONTEXT\ command line interface}
+\abbreviation [TEXINFO] {Texinfo} {generate typeset documentation from info pages}
+\abbreviation [TEXUTIL] {\TeX util} {\CONTEXT\ utility tool}
+\abbreviation [TEX] {\TeX} {typographic language and program}
+\abbreviation [TEXLIVE] {\TeX\ Live} {\TeX\ Live distribution (multiple platform)}
+\abbreviation [TFM] {tfm} {\TEX\ Font Metrics}
+\abbreviation [TIF] {tiff} {Tagged Interchange File format}
+\abbreviation [TUG] {tug} {\TEX\ Users Group}
+\abbreviation [UNIX] {Unix} {Unix platform}
+\abbreviation [URL] {url} {Uniform Resource Locator}
+\abbreviation [WEBC] {Web2c} {official multi||platform \WEB\ environment}
+\abbreviation [WEB] {web} {literate programming environment}
+\abbreviation [WIN] {Windows} {Microsoft Windows platform}
+\abbreviation [XEMTEX] {XEm\TeX} {\WIN\ \WEBC\ distribution}
+\abbreviation [ZIP] {zip} {compressed file format}
+
+%D It makes sense to predefine the name of the author of \PDFTEX, doesn't it?
+
+\def\THANH{H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh}
+
+%D Because they are subjected to change and tend to spoil the visual
+%D appearance of the \TEX\ source, \URL's are defined here.
+
+\useURL [ptex_org] [http://www.pdftex.org] % links to ptex_examples
+\useURL [ptex_ctan] [http://ctan.org/pkg/pdftex]
+\useURL [ptex_devel] [http://foundry.supelec.fr/projects/pdftex]
+
+% where bug reports should go:
+\useURL [ptex_bugs] [mailto:pdftex@tug.org] [] [pdftex@tug.org]
+\useURL [ptex_listinfo] [http://lists.tug.org/pdftex]
+
+\useURL [kpathsea] [http://tug.org/kpathsea]
+\useURL [texlive] [http://tug.org/texlive]
+\useURL [web2c] [http://tug.org/web2c]
+\useURL [ctan_systems] [http://mirror.ctan.org/systems]
+\useURL [win32] [http://mirror.ctan.org/systems/win32]
+\useURL [context] [http://www.pragma-ade.com]
+\useURL [tex_showcase] [http://tug.org/texshowcase]
+
+\useURL [pdfreference] [http://www.adobe.com/devnet/pdf/pdf_reference.html]
+\useURL [thanh_truetype_tub] [http://tug.org/TUGboat/tb30-1/tb94thanh.pdf]
+\useURL [jbig2enc] [https://github.com/agl/jbig2enc]
+
+%D The primitive definitions are specified a bit fuzzy using the next set of
+%D commands. Some day I'll write some proper macros to deal with this.
+
+% keep next 2 lines as temporary kludge for a while to make \type{} of
+% older ConTeXt versions handle these two new primitives; the original
+% problem with \type{} is already solved in ConTeXt as of 2006-02-14.
+\let\ifpdfabsnum\relax
+\let\ifpdfabsdim\relax
+
+\def\Syntax #1{\strut\kern-.25em{#1}\kern-.25em}
+\def\Next {\crlf\hbox to 2em{}\nobreak}
+\def\Sugar #1{\unskip\unskip\unskip\kern.25em{#1}\kern.25em\ignorespaces}
+%
+\def\Lbrace {\Sugar{\tttf\leftargument}}
+\def\Literal #1{\Sugar{\type{#1}}}
+\def\Means {\Sugar{\mathematics{\rightarrow}}}
+\def\Modelist #1{\Sugar{\mathematics{(\hbox{#1})}}}
+\def\Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}}
+\def\Or {\Sugar{\mathematics{\vert}}}
+\def\Rbrace {\Sugar{\tttf\rightargument}}
+\def\Tex #1{\Sugar{\type{#1}}}
+\def\Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}}
+
+% hyphenates
+\def\Something#1{\Sugar{\mathematics{\langle}\prewordbreak
+ {#1}\prewordbreak\mathematics{\rangle}}}
+
+\hbadness=10000 % don't care
+
+% Break after these chars in urls, not before.
+\sethyphenatedurlafter /
+\sethyphenatedurlafter .
+\sethyphenatedurlafter _
+
+% introduced
+\def\introduced#1{The primitive was introduced in \PDFTEX\ #1.}
+
+% to get bookmarks for primitives like \ifpdfprimitive
+\appendtoks\def\tex#1{\string\\#1}\to\simplifiedcommands
+
+%D We typeset the \URL's in a monospaced font.
+
+\setupurl
+ [style=type]
+
+%D The basic layout is pretty simple. Because we want non european readers to
+%D read the whole text as well, a letter size based alternative is offered
+%D too. Mode switching is taken care of at the command line when running
+%D \TEXEXEC.
+
+\startmode[letter]
+
+ \setuppapersize
+ [letter][letter]
+
+\stopmode
+
+\setuplayout
+ [topspace=1.5cm,
+ backspace=2.5cm,
+ leftmargin=2.5cm,
+ width=middle,
+ footer=1.5cm,
+ header=1.5cm,
+ height=middle]
+
+%D For the moment we use the description mechanism to typeset keywords etc.
+%D Well, I should have used capitals.
+
+\definedescription
+ [description]
+ [location=serried,
+ width=broad]
+
+\definedescription
+ [PathDescription]
+ [location=left,
+ sample=TEXPSHEADERS,
+ width=broad,
+ headstyle=type]
+
+\definehead
+ [pdftexprimitive]
+ [subsubsection]
+
+\setuphead
+ [pdftexprimitive]
+ [style=,
+ before=\blank,
+ after=\blank,
+ numbercommand=\SubSub]
+
+%D This is typically a document where we want to save pages,
+%D so we don't start any matter (part) on a new page.
+
+\setupsectionblock [frontpart] [page=]
+\setupsectionblock [bodypart] [page=]
+\setupsectionblock [backpart] [page=]
+
+%D The \type{\SubSub} command is rather simple and generates a triangle.
+%D This makes the primitives stand out a bit more.
+
+\def\SubSub#1{\mathematics{\blacktriangleright}}
+
+%D But, for non Lucida users, the next one is more safe:
+
+\def\SubSub#1{\goforwardcharacter}
+
+%D I could have said:
+%D
+%D \starttyping
+%D \setupsection[section-5][previousnumber=no,bodypartconversion=empty]
+%D \setuplabeltext[subsubsection=\mathematics{\blacktriangleright}]
+%D \stoptyping
+%D
+%D but this is less clear.
+
+%D We use white space, but not too much.
+
+\setupwhitespace
+ [medium]
+
+\setupblank
+ [medium]
+
+%D Verbatim things get a small margin.
+
+\setuptyping
+ [margin=standard]
+
+\definetyping
+ [esctyping]
+\setuptyping
+ [esctyping]
+ [margin=standard,option=commands,escape=@]
+
+%D Due to the lots of verbatim we will be a bit more tolerant in breaking
+%D paragraphs into lines.
+
+\setuptolerance
+ [verytolerant,stretch]
+
+%D We put the chapter and section numbers in the margin and use bold fonts.
+
+\setupheads
+ [alternative=margin]
+
+\setuphead
+ [section]
+ [style=\bfb]
+
+\setuphead
+ [subsection]
+ [style=\bfa]
+
+%D The small table of contents is limited to section titles and is fully
+%D interactive.
+
+\setuplist
+ [section]
+ [criterium=all,
+ interaction=all,
+ width=2em,
+ aligntitle=yes,
+ alternative=a]
+
+%D Ah, this manual is in english!
+
+\mainlanguage
+ [en]
+
+%D We use Palatino fonts, because they look so well on the screen. The
+%D version generated at \PRAGMA\ uses Optima Nova instead. Both fonts are
+%D designed by Hermann Zapf.
+
+\setupfonthandling [hz] [min=25,max=25,step=5]
+
+\setupalign
+ [hz,hanging]
+
+\startnotmode[atpragma]
+
+ \setupfontsynonym [Serif] [handling=quality]
+ \setupfontsynonym [SerifBold] [handling=quality]
+ \setupfontsynonym [SerifSlanted] [handling=quality]
+ \setupfontsynonym [SerifItalic] [handling=quality]
+ \setupfontsynonym [SerifBoldSlanted] [handling=quality]
+ \setupfontsynonym [SerifBoldItalic] [handling=quality]
+
+ %setupfontsynonym [Mono] [handling=quality] % sloooow
+
+ % We use adobe metrics instead of urw metrics because tetex only
+ % ships the former. Beware, these metrics differ!
+
+ \loadmapfile[context-base.map]
+ \usetypescript [adobekb] [\defaultencoding]
+ \usetypescript [palatino][\defaultencoding]
+
+ \setupbodyfont
+ [palatino,10pt]
+
+ \definefontsynonym[TitleFont][SerifBold]
+
+\stopnotmode
+
+\startmode[atpragma]
+
+ \usetypescriptfile[type-ghz]
+
+ \setupfontsynonym [Sans] [handling=quality]
+ \setupfontsynonym [SansBold] [handling=quality]
+ \setupfontsynonym [SansSlanted] [handling=quality]
+ \setupfontsynonym [SansItalic] [handling=quality]
+ \setupfontsynonym [SansBoldSlanted] [handling=quality]
+ \setupfontsynonym [SansBoldItalic] [handling=quality]
+
+ %setupfontsynonym [Mono] [handling=quality] % sloooow
+
+ \definetypeface[optima][ss][sans][optima-nova] [default][encoding=\defaultencoding]
+ \definetypeface[optima][tt][mono][latin-modern][default][encoding=\defaultencoding,rscale=1.1]
+
+ \setupbodyfont[optima,10pt,ss]
+
+ \definefontsynonym[TitleFont][SansBold]
+
+\stopmode
+
+%D This document is mildly interactive. Yes, Thanh's name will end up ok in
+%D the document information data.
+
+\setupinteraction
+ [state=start,
+ style=normal,
+ color=,
+ page=yes,
+ openaction=firstpage,
+ title=pdfTeX users manual,
+ author={H\`an Th\^e Th\`anh, Sebastian Rahtz, Hans Hagen, Hartmut Henkel,
+ Pawe\l\ Jackowski, Martin Schr\"oder, Karl Berry}]
+
+\setupinteractionscreen % still needed?
+
+\startnotmode[screen]
+
+\setupinteractionscreen
+ [option=bookmark]
+
+\stopnotmode
+
+%D Some headers and footers will complete the layout.
+
+\setupheadertexts
+ [The pdf\TeX\ user manual]
+
+\setupfootertexts
+ [pagenumber]
+
+%D For Tobias Burnus, who loves bookmarks, I've enabled them.
+
+\placebookmarks
+ [section,subsection,pdftexprimitive]
+
+%D Let's also define a screen layout:
+
+\startmode[screen] \environment pdftex-i \stopmode
+
+%D We auto-cross link the paper and screen version:
+
+\startnotmode[screen]
+
+%\coupledocument
+% [screenversion]
+% [pdftex-s]
+% [section,subsection,subsubsection,pdftexprimitive]
+% [the screen version]
+
+\setuphead
+ [section,subsection,subsubsection,pdftexprimitive]
+ [file=screenversion]
+
+\setuplist
+ [section]
+ [alternative=c]
+
+\stopnotmode
+
+%D The text starts here!
+
+\starttext
+
+%D Being lazy, I don't split the file, so paper and screen get
+%D mixed in one document.
+
+\startmode[screen] \getbuffer[screen] \stopmode
+
+\startnotmode[screen]
+
+%D But first we typeset the title page. It has a background. This
+%D background, showing a piece of \PDF\ code, will be referred to
+%D later on.
+
+%D We can use more modern \CONTEXT\ features, but for the moment
+%D stick to the old style and methods.
+
+\NormalizeFontWidth
+ \TitleFont
+ {\hskip.5mm The pdf\TeX\ user manual} % \hskip is fake offset
+ \paperheight
+ {TitleFont}
+
+\setupbackgrounds
+ [page]
+ [background={title,joke,names,content}]
+
+\defineoverlay
+ [title]
+ [\hbox to \paperwidth
+ {\hfill
+ \TitleFont\setstrut
+ \rotate{The pdf\TeX\ user manual}%
+ \hskip.5cm}] % \dp\strutbox}]
+
+% \defineoverlay
+% [joke]
+% [\hbox to \paperwidth
+% {\TitleFont\setstrut
+% \dimen0=\overlaywidth
+% \advance\dimen0 by -\ht\strutbox
+% \advance\dimen0 by -\dp\strutbox
+% \advance\dimen0 by -1cm
+% \dimen2=\overlayheight
+% \advance\dimen2 by -1cm
+% \hskip.5cm\expanded{\externalfigure
+% [pdftex-z.pdf]
+% [width=\the\dimen0,height=\the\dimen2]}%
+% \hfill}]
+
+% \defineoverlay
+% [names]
+% [\vbox to \paperheight
+% {\dontcomplain
+% \TitleFont\setstrut
+% \setbox0=\hbox{\TeX}%
+% \hsize\paperwidth
+% \rightskip\ht0
+% \advance\rightskip\dp\strutbox
+% \advance\rightskip\dp\strutbox
+% \bfa \setupinterlinespace
+% \vfill
+% \hfill \THANH \endgraf
+% \hfill Sebastian Rahtz \endgraf
+% \hfill Hans Hagen
+% \hfill Hartmut Henkel
+% \hfill Pawe\l\ Jackowski
+% \vskip 1ex
+% \hfill \currentdate
+% \vskip 2ex}]
+
+\defineoverlay
+ [content]
+ [\overlaybutton{contents}]
+
+% title page
+
+\definelayout
+ [titlepage]
+ [backspace=.5cm,
+ cutspace=3.5cm,
+ topspace=.5cm,
+ bottomspace=.5cm,
+ header=0pt,
+ footer=0pt,
+ lines=\getvariable{pdftex}{titlepagelines},
+ grid=yes,
+ width=middle]
+
+\definecolumnset
+ [titlepage]
+ [n=2,distance=0.2cm]
+
+\start
+
+ \chardef\fontdigits=2
+ \switchtobodyfont[10pt,tt]
+ \setupinterlinespace
+ [line=\dimexpr((\paperheight-1cm)/\getvariable{pdftex}{titlepagelines})]
+ \setuptyping[margin=,color=]
+ \setuplayout[titlepage]
+
+ \startcolumnset[titlepage]
+ \typefile{pdftex-w.txt}
+ \stopcolumnset
+
+ \page
+ \setuplayout
+
+\stop
+
+% \startstandardmakeup
+%
+% %D The titlepage is generated using the background overlay mechanism. This
+% %D saves me the trouble of determining funny skips and alignments. So no text
+% %D goes here.
+%
+% \stopstandardmakeup
+
+\setupbackgrounds
+ [page]
+ [background=]
+
+%D The inside title page is as follows.
+
+\startstandardmakeup[footerstate=none]
+
+ \dontcomplain
+
+ \setupalign[left]
+
+ \start
+
+ \bfd The pdf\TeX\ user manual
+
+ \bfa \setupinterlinespace
+
+ \vskip4ex
+
+ \THANH\par
+ Sebastian Rahtz\par
+ Hans Hagen\par
+ Hartmut Henkel\par
+ Pawe\l\ Jackowski\par
+ Martin Schr\"oder\par
+
+ \vskip3ex
+
+ \rcsmonthname\ \rcsday, \rcsyear\par
+ \vskip1ex
+ Rev.\ \rcsrevision
+
+ \stop
+
+ \vfill
+
+ \startlines
+ The title page is the result of
+ this plain \TeX\ text:
+ \stoplines
+
+ \blank[2*big] \setuptyping[after=]
+
+ \starttyping
+ \pdfoutput=1
+ \pdfcompresslevel=0
+ \pdfobjcompresslevel=0
+ \pdfmapline{ptmr8r Times-Roman 2 <8r.enc}
+ \font\tenrm=ptmr8r
+ \tenrm
+ Welcome to pdf\TeX!
+ \bye
+ \stoptyping
+
+\stopstandardmakeup
+
+\setuppagenumber[number=1] % added in case of single sided usage
+
+%D So far for non screen mode.
+
+\stopnotmode
+
+%D We start with a small table of contents, typeset in double column format.
+
+\startfrontmatter
+
+\subject[contents]{Contents}
+
+\startcolumns[distance=3em]
+ \placelist[section]
+\stopcolumns
+
+\stopfrontmatter
+
+%D And here it is: the main piece of text.
+
+\startbodymatter
+
+%***********************************************************************
+
+\section{Introduction}
+
+The main purpose of the \PDFTEX\ project is to create and maintain
+an extension of \TEX\ that can produce \PDF\ directly from \TEX\
+source files and improve|/|enhance the result of \TEX\ typesetting
+with the help of \PDF. When \PDF\ output is not selected, \PDFTEX\
+produces standard \DVI\ output, otherwise it generates \PDF\ output
+that looks identical to the \DVI\ output. An important aspect of this
+project is to investigate alternative justification algorithms (\eg\
+a font expansion algorithm akin to the \HZ\ micro||typography algorithm by
+Prof.~Hermann Zapf).
+
+\PDFTEX\ is based on the original \TEX\ sources and \WEBC, and has been
+successfully compiled on \UNIX, \WIN\ and \MSDOS\ systems. It is
+actively maintained, with new features trickling in. Great care is taken
+to keep new \PDFTEX\ versions backward compatible with earlier ones.
+
+For some years there has been a \quote {conservative} successor to \TEX\
+available, called \ETEX. Because mainstream macro packages such as
+\LATEX\ have started supporting this welcome extension, the \ETEX\
+functionality has also been integrated into the \PDFTEX\ code. For a
+while (\TEXLIVE~2004 and~2005) \PDFTEX\ therefore came in two flavours:
+the \ETEX\ enabled \PDFETEX\ engine and the standard one, \PDFTEX. The
+ability to produce both \PDF\ and \DVI\ output made \PDFETEX\ the
+primary \TEX\ engine in these distributions. Since \PDFTEX\ version 1.40
+now the \ETEX\ extensions are part already of the \PDFTEX\ engine, so
+there is no longer any need to ship \PDFETEX. The \ETEX\ functionality
+of \PDFTEX\ can be disabled if not required. Other extensions are
+\MLTEX\ and \ENCTEX; these are also included in the current \PDFTEX\
+code.
+
+\PDFTEX\ is maintained by \THANH, Martin Schr\"oder, and others. The
+\PDFTEX\ homepage is \from [ptex_org]. Please send \PDFTEX\ comments and
+bug reports to the mailing list \from [ptex_bugs] (\from [ptex_listinfo]).
+
+%***********************************************************************
+
+\subsection{About this manual}
+
+This manual revision (\rcsrevision) is intended to cover
+\PDFTEX\ development up to version \currentpdftex. The primary
+repository for the manual and its sources is at \from[ptex_devel].
+Copies in \PDF\ format can also be found on \CTAN\ via \from[ptex_ctan].
+
+Thanks to the many people who have contributed to the manual.
+New errors might have slipped in afterwards by the editor.
+Please send questions or suggestions by email to \from[ptex_bugs].
+
+%***********************************************************************
+
+\subsection{Legal Notice}
+
+Copyright \copyright\ 1996||2017 \THANH.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled ``GNU
+Free Documentation License''.
+
+%***********************************************************************
+
+\section{About \PDF}
+
+The cover of this manual lists an almost minimal \PDF\ file generated by
+\PDFTEX, from the corresponding source on the next page. Since
+compression is not enabled, such a \PDF\ file is rather verbose and
+readable. The first line specifies the version used. \PDF\ viewers are
+supposed to silently skip over all elements they cannot handle.
+
+A \PDF\ file consists of objects. These objects can be recognized by their
+number and keywords:
+
+\starttyping
+9 0 obj << /Type /Catalog /Pages 5 0 R >> endobj
+\stoptyping
+
+Here \typ{9 0 obj ... endobj} is the object capsule. The first number
+is the object number. The sequence \type{5 0 R} is an object reference,
+a pointer to another object (no.~5). The second number (here a zero)
+is currently not used in \PDFTEX; it is the version number of the
+object. It is for instance used by \PDF\ editors, when they replace
+objects by new ones.
+
+When a viewer opens a \PDF\ file, it goes to the end of the file,
+looking for the keyword \type{startxref}. The number after
+\type{startxref} gives the absolute position (byte offset from the file
+start) of the so||called \quote {object cross-reference table} that
+begins with the keyword \type{xref}. This table in turn tells the byte
+offsets of all objects that make up the \PDF\ file, providing fast
+random access to the individual objects (here the \type{xref} table
+shows 11~objects, numbered from~0 to~10; the object no.~0 is always
+unused). The actual starting point of the file's object structure is
+defined after the \type{trailer}: the \type{/Root} entry points to the
+\type{/Catalog} object (no.~9). In this object the viewer can find the
+pointer \type{/Pages} to the page list object (no.~5). In our example we
+have only one page. The trailer also holds an \type{/Info} entry, which
+points to an object (no.~10) with a bit more about the document. Just
+follow the thread:
+
+\startnarrower
+\type{/Root} $\longrightarrow$ object~9 $\longrightarrow$
+\type{/Pages} $\longrightarrow$ object~5 $\longrightarrow$
+\type{/Kids} $\longrightarrow$ object~2 $\longrightarrow$
+\type{/Contents} $\longrightarrow$ object~3
+\stopnarrower
+
+As soon as we add annotations, a fancy word for hyperlinks and the like,
+some more entries will be present in the catalog. We invite users to
+take a look at the \PDF\ code of this file to get an impression of that.
+
+The page content is a stream of drawing operations. Such a stream
+can be compressed, where the level of compression can be set with
+\type{\pdfcompresslevel} (compression is switched off for the title
+page). Let's take a closer look at this stream in object~3. Often
+(but not in our example) there is a transformation matrix, six numbers
+followed by \type{cm}. As in \POSTSCRIPT, the operator comes after the
+operands. Between \type{BT} and \type{ET} comes the text. A font is
+selected by a \type{Tf} operator, which is given a font resource name
+\type{/F..} and the font size. The actual text goes into \type{()}
+bracket pairs so that it creates a \POSTSCRIPT\ string. The numbers
+in bracket pairs provide horizontal movements like spaces and
+fine glyph positioning (kerning). When one analyzes a file produced by
+a less sophisticated typesetting engine, whole sequences of words can
+be recognized. In \PDF\ files generated by \PDFTEX\ however, many words
+come out rather fragmented, mainly because a lot of kerning takes place;
+in our example the \type{80} moves the text \type{(elcome)} left towards
+the letter \type{(W)} by 80/1000 of the font size. \PDF\ viewers in search
+mode simply ignore the kerning information in these text streams. When
+a document is searched, the search engine reconstructs the text from these
+(string) snippets.
+
+Every \type{/Page} object points also to a \type{/Resources} object
+(no.~1) that gives all ingredients needed to assemble the page. In our
+example only a \type{/Font} object (no.~4) is referenced, which in turn
+tells that the text is typeset in \type{/Font} \type{/Times-Roman}. The
+\type{/Font} object points also to a \type{/Widths} array (object no.~7)
+that tells for each character by how much the viewer must move forward
+horizontally after typesetting a glyph. More details about the font
+can be found in the \type{/FontDescriptor} object (no.~8); if a font
+file is embedded, this object points to the font program stream. But as
+the Times-Roman font used for our example is one of the 14 so||called
+standard fonts that should always be present in any \PDF\ viewer and
+therefore need not be embedded in the \PDF\ file, it is left out here
+for brevity. However, when we use for instance a Computer Modern Roman
+font, we have to make sure that this font is later available to the \PDF\
+viewer, and the best way to do this is to embed the font.
+It's highly recommended nowadays to embed even the standard fonts;
+you can't know how it looks exactly at the viewer side unless you embed
+every font.
+
+In this simple file we don't specify in what way the file should be opened,
+for instance full screen or clipped. A closer look at the page object no.~2
+(\typ{/Type /Page}) shows that a mediabox (\typ{/MediaBox}) is part of the
+page description. A mediabox acts like the (high-resolution) bounding box
+in a \POSTSCRIPT\ file. \PDFTEX\ users can add dictionary entries to page
+objects with the \type{\pdfpageattr} primitive.
+
+Although in most cases macro packages will shield users from these
+internals, \PDFTEX\ provides access to many of the entries described
+here, either automatically by translating the \TEX\ data structures into
+\PDF\ ones, or manually by pushing entries to the catalog, page, info or
+self-created objects. One can for instance create an object by using
+\type{\pdfobj}, after which \type{\pdflastobj} returns its number. So
+
+\starttyping
+\pdfobj{<< /Type/ExtGState /LW 2 >>}
+\stoptyping
+
+inserts an object into the \PDF\ file (it creates a ``graphics state''
+object setting the line width to 2~units), and \type{\pdflastobj} now
+returns the number \PDFTEX\ assigned to this object. Unless objects are
+referenced by others, they will just end up as isolated entities, not
+doing any real harm but bloating the \PDF\ file.
+
+In general this rather direct way of pushing objects in the \PDF\ files
+by primitives like \type{\pdfobj} is not very useful, and only makes
+sense when implementing, say, fill||in field support or annotation
+content reuse. We will come to that later.
+
+Of course, this is just the barest introduction to \PDF\ format. For
+those who want to learn more about the gory \PDF\ details, the best bet
+is to read the \PDFReference. You can download this book as a big \PDF\
+file from Adobe's \PDF\ Technology Center, \from[pdfreference] --- or
+get the heavy paper version.
+
+We now turn to specifics of \PDFTEX.
+
+%***********************************************************************
+
+\section{Getting started}
+
+This section describes the steps needed to get \PDFTEX\ running on
+a system where \PDFTEX\ is not yet installed. Nowadays virtually all
+\TEX\ distributions have \PDFTEX\ as a component, such as \TEXLIVE,
+\MIKTEX, \TETEX, \XEMTEX, \PROTEXT, and \MACTEX. The ready to run
+\TEXLIVE\ distribution comes with \PDFTEX\ versions for many \UNIX,
+\WIN, and \MACOSX\ systems; more information can be found at
+\hbox{\from[texlive].} There are also \WIN-specific distributions which
+contain \PDFTEX, under \from[win32]: \MIKTEX\ by Christian Schenk, and
+\PROTEXT\ (based on \MIKTEX) by Thomas Feuerstack. When you use any
+of these distributions, you don't need to bother with the \PDFTEX\
+installation procedure in the next sections.
+
+If there is no precompiled \PDFTEX\ binary for your system, or the version
+coming with a distribution is not the current one and you would like to
+try out a fresh \PDFTEX\ immediately, you will need to build \PDFTEX\
+from sources; read on. You should already have a working \TEX\ system,
+\eg\ \TEXLIVE\ or \TETEX, into which the freshly compiled \PDFTEX\ will
+be integrated. Note that the installation description in this manual
+is \WEBC||specific.
+
+%***********************************************************************
+
+\subsection{Getting sources and binaries}
+
+The latest sources of \PDFTEX\ are distributed for compilation on \UNIX\
+systems (including \GNU/Linux), and \WIN\ systems. The primary home
+page is \from[ptex_org], where you also find bug tracking information.
+Development sources are at \from[ptex_devel]. Precompiled \PDFTEX\
+binaries for various systems might be available in subdirectories below
+\from[ctan_systems], or via \TEX\ distribution web pages.
+
+%***********************************************************************
+
+\subsection{Compiling}
+
+The compilation is expected to be easy on \UNIX||like systems and
+can be described best by example. Assuming that the file \filename
+{pdftex.zip} is downloaded to some working directory, \eg\
+\filename {\$HOME/pdftex}, on a \UNIX\ system the following steps are
+needed to compile \PDFTEX:
+
+\startesctyping
+cd pdftex.../source
+./build-pdftex.sh
+\stopesctyping
+
+The binary \filename{pdftex} is then built in the subdirectory
+\filename{build/texk/web2c}.
+
+The obsolescent binary \filename{pdfetex} is still generated for backward
+compatibility, but since version 1.40 it is just a file copy
+of the file \filename{pdftex}.
+
+As well as the main \filename{pdftex} binary, binaries for the utilities
+\filename{pdftosrc} and \filename{ttf2afm} are generated.
+
+Incidentally, for \PDFTEX\ maintains, a sibling script to
+\type{build-pdftex.sh} is included, namely \type{sync-pdftex.sh}, which
+syncs changes from a \TEXLIVE\ source repository to a \PDFTEX\ source
+repository. Read the script before using it. And don't use it unless
+you understand what you read.
+
+%***********************************************************************
+
+\subsection{Placing files}
+
+The next step is to put the freshly compiled \filename{pdftex},
+\filename{pdftosrc}, and \filename{ttf2afm} binaries into the binary
+directory (\eg\ for a typical \TEXLIVE\ system, and on the appropriate
+platform) \filename{/usr/local/texlive/\rcsyear/bin/x86_64-linux}.
+
+If you're doing this into a live hierarchy, don't forget to do a
+\type{texconfig-sys init} afterwards, so that all formats are
+regenerated system-wide with the fresh \filename{pdftex} binary.
+
+%***********************************************************************
+
+\subsection{Setting search paths}
+
+\WEBC||based programs, including \PDFTEX, use the \WEBC\ run||time
+configuration file called \filename {texmf.cnf}. The location
+of this file is the appropriate position within the \TDS\ tree
+relative to the place of the \PDFTEX\ binary; on a \TEXLIVE\ system,
+\filename{texmf.cnf} is typically located either in directory
+\filename{texmf/web2c} or \filename{texmf-local/web2c}. The path to
+file \filename{texmf.cnf} can also be set up by the environment variable
+\type{TEXMFCNF}.
+
+The \filename{texmf.cnf} files coming with the major \TEX\ distributions
+should already be set up for normal use, so you shouldn't need to edit
+it. You might still like to read it to see where the various bits and
+pieces are going.
+
+\PDFTEX\ uses the search path variables shown in
+\in{table}[tbl:spathvar], among others.
+
+\startbuffer
+\starttabulate[|l|l|]
+\HL
+\NC \bf used for \NC \bf texmf.cnf \NC\NR
+\HL
+\NC output files \NC \type{TEXMFOUTPUT} \NC\NR
+\NC input files, images \NC \type{TEXINPUTS} \NC\NR
+\NC format files \NC \type{TEXFORMATS} \NC\NR
+\NC \TeX\ pool files \NC \type{TEXPOOL} \NC\NR
+\NC encoding files \NC \type{ENCFONTS} \NC\NR
+\NC font map files \NC \type{TEXFONTMAPS} \NC\NR
+\NC \TFM\ files \NC \type{TFMFONTS} \NC\NR
+\NC virtual fonts \NC \type{VFFONTS} \NC\NR
+\NC Type~1 fonts \NC \type{T1FONTS} \NC\NR
+\NC TrueType fonts \NC \type{TTFONTS} \NC\NR
+\NC OpenType fonts \NC \type{OPENTYPEFONTS} \NC\NR
+\NC bitmap fonts \NC \type{PKFONTS} \NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable[here][tbl:spathvar]
+ {The principal \WEBC\ variables.}
+ {\getbuffer}
+
+\PathDescription {TEXMFOUTPUT} Normally, \PDFTEX\ puts its output files
+in the current directory, overridden by the \type{-output-directory}
+option. If any output file cannot be opened there, it tries to open it
+in the environment variable \type{TEXMFOUTPUT}, if that is set. There is
+no default value for that variable. For example, if \type{TEXMFOUTPUT}
+has the value \type{/tmp}, and you run \type{pdftex paper} when the
+current directory is not writable, \PDFTEX\ attempts to create
+\type{/tmp/paper.log} (and \type{/tmp/paper.pdf}, etc.)
+
+\PathDescription {TEXINPUTS} This variable specifies where \PDFTEX\ finds
+its input files. Image files are considered
+input files and searched for along this path.
+
+\PathDescription {TEXFORMATS} Search path for format (\type{.fmt}) files.
+
+\PathDescription {TEXPOOL} Search path for pool (\type{.pool}) files; no
+longer used, since the pool file (program strings) are compiled into
+the binary.
+
+\PathDescription {ENCFONTS} Search path for encoding (\type{.enc}) files.
+
+\PathDescription {TEXFONTMAPS} Search path for font map (\type{.map}) files.
+
+\PathDescription {TFMFONTS} Search path for font metric (\type{.tfm}) files.
+
+\PathDescription {VFFONTS} Search path for virtual font (\type{.vf})
+files. Virtual fonts are fonts made up of other fonts.
+Because \PDFTEX\ produces the
+final output code, it must consult those files.
+
+\PathDescription {T1FONTS} Search path for Type~1 font files (\type{.pfa}
+and \type{.pfb}). These outline (vector) fonts are to be preferred over
+bitmap \PK\ fonts. In most cases Type~1 fonts are used and this variable
+tells \PDFTEX\ where to find them.
+
+\PathDescription {TTFONTS,\hfil\break \hbox{OPENTYPEFONTS}} Search paths
+for TrueType (\type{.ttf}) and OpenType (\type{.otf}) font files. Like
+Type~1 fonts, TrueType and OpenType fonts are also outlines.
+
+\PathDescription {PKFONTS} Search path for packed (bitmap) font
+(\type{.pk}) files.
+Unfortunately bitmap fonts are still displayed poorly by some \PDF\
+viewers, so when possible one should use outline fonts. When no outline
+is available, \PDFTEX\ tries to locate a suitable \PK\ font (or invoke
+a process that generates it).
+
+\PathDescription{TEXFONTS} Fallback for all the font paths, so that if
+you want to look in a particular directory for fonts on a given run, you
+can set that one variable.
+
+Many more variables may be consulted, and there are many details to
+file name lookups. See the Kpathsea manual (\from [kpathsea]).
+
+%***********************************************************************
+
+\subsection[cfg]{The \PDFTEX\ configuration}
+
+We must keep in mind that, as opposed to \TEX\ with its \DVI\ output,
+the \PDFTEX\ program does not have a separate postprocessing stage to
+transform the \TEX\ input into final \PDF. As a consequence, all data
+needed for building a ready \PDF\ page must be available during the
+\PDFTEX\ run, in particular information on media dimensions and offsets,
+graphics files for embedding, and font information (font files,
+encodings).
+
+When \TEX\ builds a page, it places items relative to the top left page
+corner (the \DVI\ reference point). Separate \DVI\ postprocessors allow
+specifying the paper size (\eg\ \quote {A4} or \quote{letter}), so
+that this reference point is moved to the correct position on the paper,
+and the text ends up at the right place.
+
+In \PDF, the paper dimensions are part of the page definition, and
+\PDFTEX\ therefore requires that they be defined at the beginning of
+the \PDFTEX\ run. As with pages described by \POSTSCRIPT, the \PDF\
+reference point is in the lower||left corner.
+
+Formerly, these dimensions and other \PDFTEX\ parameters were read
+in from a configuration file named \filename{pdftex.cfg}, which had
+a special (non-\TEX) format, at the start of processing. Nowadays such
+a file is ignored by \PDFTEX. Instead, the page dimensions and offsets,
+as well as many other parameters, can be set by \PDFTEX\ primitives
+during the \PDFTEX\ format building process, so that the settings are
+dumped into the fresh format and consequently will be used when \PDFTEX\
+is later called with that format. All settings from the format can
+still be overridden during a \PDFTEX\ run by using the same primitives.
+This new configuration concept is a more unified approach, as it avoids
+the configuration file with a special format.
+
+A list of \PDFTEX\ primitives relevant to setting up the \PDFTEX\ engine
+is given in \in{table}[tbl:configparms]. All primitives are described in
+detail within later sections. \in{Figure}[in:pdftexconfig] shows a recent
+configuration file (\type{pdftexconfig.tex}) in \TEX\ format, using the
+primitives from \in{table}[tbl:configparms], which typically is read
+in during the format building process. It enables \PDF\ output, sets paper
+dimensions and the default pixel density for \PK\ font inclusion. The default
+values are chosen so that \PDFTEX\ often can be used (\eg\ in \type{-ini} mode)
+even without setting any parameters.
+
+\startbuffer
+\starttabulate[|l|l|l|l|l|]
+\HL
+\NC \bf internal name \NC \bf type \NC\bf default\NC\bf comment\NC\NR
+\HL
+\NC \type{\pdfoutput} \NC integer \NC 0 \NC \DVI \NC\NR
+\NC \type{\pdfadjustspacing} \NC integer \NC 0 \NC off \NC\NR
+\NC \type{\pdfcompresslevel} \NC integer \NC 9 \NC best \NC\NR
+\NC \type{\pdfobjcompresslevel} \NC integer \NC 0 \NC no object streams \NC\NR
+\NC \type{\pdfdecimaldigits} \NC integer \NC 4 \NC max. \NC\NR
+\NC \type{\pdfimageresolution} \NC integer \NC 72 \NC dpi \NC\NR
+\NC \type{\pdfpkresolution} \NC integer \NC 0 \NC 72\,dpi \NC\NR
+\NC \type{\pdfpkmode} \NC token reg.\NC empty \NC mode set in \type{mktex.cnf} \NC\NR
+\NC \type{\pdfuniqueresname} \NC integer \NC 0 \NC \NC\NR
+\NC \type{\pdfprotrudechars} \NC integer \NC 0 \NC \NC\NR
+\NC \type{\pdfgentounicode} \NC integer \NC 0 \NC \NC\NR
+\NC \type{\pdfminorversion} \NC integer \NC 4 \NC \PDF\ 1.4 \NC\NR
+\NC \type{\pdfpagebox} \NC integer \NC 0 \NC \NC\NR
+\NC \type{\pdfforcepagebox} \NC integer \NC 0 \NC \NC\NR
+\NC \type{\pdfinclusionerrorlevel} \NC integer \NC 0 \NC \NC\NR
+%-----------------------------------------------------------------------
+\NC \type{\pdfhorigin} \NC dimension \NC 1\,in \NC \NC\NR
+\NC \type{\pdfvorigin} \NC dimension \NC 1\,in \NC \NC\NR
+\NC \type{\pdfpagewidth} \NC dimension \NC 0\,pt \NC \NC\NR
+\NC \type{\pdfpageheight} \NC dimension \NC 0\,pt \NC \NC\NR
+%\NC \type{\pdffirstlineheight} \NC dimention \NC -1000\,pt \NC \NC\NR
+%\NC \type{\pdflastlinedepth} \NC dimention \NC -1000\,pt \NC \NC\NR
+%\NC \type{\pdfeachlineheight} \NC dimention \NC -1000\,pt \NC \NC\NR
+%\NC \type{\pdfeachlinedepth} \NC dimention \NC -1000\,pt \NC \NC\NR
+\NC \type{\pdflinkmargin} \NC dimension \NC 0\,pt \NC \NC\NR
+\NC \type{\pdfdestmargin} \NC dimension \NC 0\,pt \NC \NC\NR
+\NC \type{\pdfthreadmargin} \NC dimension \NC 0\,pt \NC \NC\NR
+\NC \type{\pdfmapfile} \NC text \NC \filename{pdftex.map} \NC not dumped\NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable[here][tbl:configparms]
+ {The set of \PDFTEX\ configuration parameters.}
+ {\getbuffer}
+
+\startbuffer
+\tx\setupinterlinespace
+\startframedtext
+\starttyping
+% tex-ini-files 2016-04-15: pdftexconfig.tex
+
+% Load shared (PDF) settings in pdfTeX
+
+% Enable PDF output
+\pdfoutput = 1
+
+% Paper size: dimensions given in absolute terms
+\pdfpageheight = 11 true in
+\pdfpagewidth = 8.5 true in
+
+% Enable PDF 1.5 output and thus more compression
+\pdfminorversion = 5
+\pdfobjcompresslevel = 2
+
+% Low-level settings unlikely ever to need to change
+\pdfcompresslevel = 9
+\pdfdecimaldigits = 3
+\pdfpkresolution = 600
+\pdfhorigin = 1 true in
+\pdfvorigin = 1 true in
+\stoptyping
+\stopframedtext
+\stopbuffer
+
+\placefigure[here][in:pdftexconfig]
+ {\PDFTEX\ configuration file for \TEXLIVE\ (\filename{pdftexconfig.tex}).}
+ {\getbuffer}
+
+Independent of whether such a configuration file is read or not, the
+first action in a \PDFTEX\ run is that the program reads the global \WEBC\
+configuration file (\filename{texmf.cnf}), which is common to all programs
+in the \WEBC\ system. This file mainly defines file search paths, the
+memory layout (\eg\ string pool and hash size), and other general parameters.
+
+%***********************************************************************
+
+\subsection{Creating format files}
+
+\startbuffer
+\tx\setupinterlinespace
+\startframedtext
+\starttyping
+% Thomas Esser, 1998. public domain.
+\input etex.src
+\dump
+\endinput
+\stoptyping
+\stopframedtext
+\stopbuffer
+
+\placefigure[here][in:etexini]
+ {File \type{etex.ini} for the plain \ETEX\ format with \DVI\ output.}
+ {\getbuffer}
+
+\startbuffer
+\tx\setupinterlinespace
+\startframedtext
+\starttyping
+% Thomas Esser, 1998. public domain.
+% This is used for pdftex and pdfetex, which are now identical: both
+% with e-TeX extensions, both with pdf output.
+\input pdftexconfig.tex
+\input etex.src
+\input pdftexmagfix.tex
+\dump
+\endinput
+\stoptyping
+\stopframedtext
+\stopbuffer
+
+\placefigure[here][in:pdfetexini]
+ {File \type{pdfetex.ini} for plain \ETEX\ with \PDF\ output.}
+ {\getbuffer}
+
+\startbuffer
+\tx\setupinterlinespace
+\startframedtext
+\starttyping
+% Thomas Esser, 1998. public domain.
+\input pdftexconfig.tex
+\scrollmode
+\input latex.ltx
+\endinput
+\stoptyping
+\stopframedtext
+\stopbuffer
+
+\placefigure[here][in:pdflatexini]
+ {File \type{pdflatex.ini} for the \LATEX\ format with \PDF\ output.}
+ {\getbuffer}
+
+The \PDFTEX\ engine supports building formats for \DVI\ and \PDF\ output
+in the same way as the classical \TEX\ engine does for \DVI. Format
+generation is enabled by the \type{-ini} option. The default mode (\DVI\
+or \PDF) can be chosen either on the command line by setting the option
+\type{-output-format} to \type{dvi} or \type{pdf}, or by setting the
+\type{\pdfoutput} parameter. The format file then inherits this setting,
+so that a later invocation of \PDFTEX\ with this format starts in the
+preselected mode (which still can be overridden). A format file can be
+read in only by the engine that has generated it; a format incompatible
+with an engine leads to a fatal error.
+
+It is customary to package the configuration and macro file input
+into a \type{.ini} file. \Eg, the file \type{etex.ini} in
+\in{figure}[in:etexini] is for generating an \ETEX\ format with \DVI\
+output. It has been traditional for many years to generate
+\type{etex.fmt} with \PDFTEX\ rather than the original \ETEX, because
+\PDFTEX\ contains a few additional programming and other
+non-\PDF-related features on which people have come to rely.
+
+The \type{pdfetex.ini} file \in{figure}[in:etexini] shows the
+corresponding format with \PDF\ output by default; this is what creates
+the format file read when \type{pdftex} is normally invoked.
+
+Finally, \type{pdflatex.ini} \in{figure}[in:pdflatexini] shows how the
+\LATEX\ format with \PDF\ output by default is generated.
+
+The corresponding \PDFTEX\ calls for format generation are:
+
+\starttyping
+pdftex -ini *etex.ini
+pdftex -ini *pdfetex.ini
+pdftex -ini *pdflatex.ini
+\stoptyping
+
+These calls produce format files \filename{etex.fmt},
+\filename{pdfetex.fmt}, and \filename{pdflatex.fmt}, as the default
+format file name is taken from the input file name. You can overrule
+this with the \type{-jobname} option. The asterisk \type{*} before the
+file name is a unusual feature, only in \type{-ini} mode, which causes
+the \PDFTEX\ engine to enable \ETEX\ features.
+
+\subsection{Testing the installation}
+
+When everything is set up, you can test the installation. A simple test
+of plain \PDFTEX\ is:
+
+\starttyping
+pdftex story \\end
+\stoptyping
+
+This should typeset the famous one-page short story by A.U. Thor.
+
+A more thorough and descriptive test is the plain \TEX\ test file
+\filename{samplepdf.tex}, available in the distribution in the
+\type{samplepdftex/} directory. Process this file by typing:
+
+\starttyping
+pdftex samplepdf
+\stoptyping
+
+If the installation is ok, this should produce a file called
+\filename{samplepdf.pdf}. The file \filename {samplepdf.tex} is a good
+place to look for examples of how to use \PDFTEX's primitives.
+
+%***********************************************************************
+
+\subsection{Common problems}
+
+The most common problem with installations is that \PDFTEX\ complains
+that something cannot be found. In such cases make sure that
+\type{TEXMFCNF} is set correctly, so \PDFTEX\ can find \filename
+{texmf.cnf}. The next best place to look|/|edit is the file
+\type{texmf.cnf}. When still in deep trouble, set
+\type{KPATHSEA_DEBUG=255} before running \PDFTEX\ or use the option
+\type{-kpathsea-debug 255}. This will cause \PDFTEX\ to write a lot of
+debugging information that can be useful to trace problems. More options
+can be found in the \WEBC\ documentation.
+
+Variables in \filename {texmf.cnf} can be overwritten by environment
+variables. Here are some of the most common problems you can encounter when
+getting started:
+
+\startitemize
+
+\head \type{I can't find the format file `pdftex.fmt'!} \crlf
+ \type{I can't find the format file `pdflatex.fmt'!}
+
+ The format file is not created (see above how to do that) or
+ is not properly placed. Make sure that \type{TEXFORMATS} in
+ \filename {texmf.cnf} contains the path to \filename {pdftex.fmt}
+ or \filename {pdflatex.fmt}.
+
+\head \type{Fatal format file error; I'm stymied}
+
+ This appears \eg\ if you forgot to regenerate the \type{.fmt}
+ files after installing a new version of the \PDFTEX\ binary.
+ The first line tells by which engine the offending format was generated.
+
+\head \PDFTEX\ cannot find one or more map files (\type{*.map}),
+ encoding vectors (\type{*.enc}), virtual fonts, Type~1 fonts,
+ TrueType or OpenType fonts, or some image file.
+
+ Make sure that the required file exists and the corresponding variable
+ in \filename {texmf.cnf} contains a path to the file. See above which
+ variables \PDFTEX\ needs apart from the ones \TEX\ uses.
+
+ When you have installed new fonts, and your \PDF\ viewer complains
+ about missing fonts, you should take a look at the log file produced
+ by \PDFTEX. Missing fonts, map files, encoding vectors as well as
+ missing characters (glyphs) are reported there.
+
+\stopitemize
+
+Normally the page content takes one object. This means that one seldom
+finds more than a few hundred objects in a simple file. This \PDFTEX\
+manual for instance uses approx.~750 objects. In more complex applications
+this number can grow quite rapidly, especially when one uses a lot of
+widget annotations, shared annotations or other shared things. In any
+case \PDFTEX's internal object table size will automatically grow to the
+required size (the parameter \type{obj_tab_size} for manual control of
+the object table size is now obsolete and ignored).
+
+%***********************************************************************
+
+\section{Invoking \PDFTEX}
+
+\PDFTEX\ has many command line options. With the exception of the
+simple and rarely-used \type{-draftmode} and \type{-output-format}
+options, they are all inherited from the common framework for \TeX\
+engines as implemented in \WEBC\ (\from [web2c] has the manual).
+
+The same commonality holds for environment variables; see the section
+``Setting search paths'' above for an overview. Two additional
+environment variables need more description here: first,
+\type{SOURCE_DATE_EPOCH} (introduced in version 1.40.17, 2016). If this
+is set, it must be a positive integer (with one trivial exception: if it
+is set but empty, that is equivalent to 0). Non-integer values cause a
+fatal error. The value is used as the current time in seconds since the
+usual Unix ``epoch'': the beginning of 1970-01-01, UTC. Thus, a value
+of \type{32} would result in a \type{/CreationDate} and \type{/ModDate}
+values of \type{19700101000032Z}. This is useful for reproducible
+builds of documents. (See also \type{\pdfinfoomitdate},
+\type{\pdfsuppressptexinfo}, et al.)
+
+The second, related, environment variable is \type{FORCE_SOURCE_DATE}.
+If this is set to~\type{1}, \TEX's time-related primitives are also
+initialized from the value of \type{SOURCE_DATE_EPOCH}. These
+primitives are \type{\year}, \type{\month}, \type{\day}, and
+\type{\time}. If \type{SOURCE_DATE_EPOCH} is not set, setting
+\type{FORCE_SOURCE_DATE} has no effect. If \type{FORCE_SOURCE_DATE} is
+unset, set to the empty string, or set to~\type{0}, the primitives
+reflect the current time as usual. Any other value elicits a warning,
+and the current time is used. (This is useful only if one wants to make
+reproducible \PDF{}s for a set of documents without changing them in any
+way, e.g., an operating system distribution with manuals that use
+\type{\today}. Except in such unusual circumstances, it is better not
+to set this, and let the \TEX\ primitives retain the meaning they have
+always had.)
+
+Finally, just to have the list of options and basic invocation at hand,
+here is a verbatim listing of the \type{-}\type{-help} output. All
+options can be specified with one or two dashes and unambiguously
+abbreviated.
+
+\startnotmode[screen]
+ \switchtobodyfont[9pt] % squeeze everything on one page
+\stopnotmode
+
+\typefile{pdftex-help.txt}
+
+\startnotmode[screen]
+ \switchtobodyfont[10pt] % squeeze everything on one page
+\stopnotmode
+
+%***********************************************************************
+
+\section{Macro packages supporting \PDFTEX}
+
+As \PDFTEX\ generates the final \PDF\ output without help of
+a postprocessor, macro packages that take care of these \PDF\ features
+have to be set up properly. Typical tasks are handling color,
+graphics, hyperlink support, threading, font||inclusion, as well as
+page imposition and manipulation. All these \PDF||specific tasks can be
+controlled by \PDFTEX's own primitives (a few also by a \PDFTEX||specific
+\type{\special{pdf: ...}} primitive). Any other \type{\special{}} commands,
+like the ones defined for various \DVI\ postprocessors, are simply
+ignored by \PDFTEX\ when in \PDF\ output mode; a warning is given only
+for non||empty \type{\special{}} commands.
+
+When a macro package already written for classical \TEX\ with \DVI\ output
+is to be modified for use with \PDFTEX, it is very helpful to get some
+insight to what extent \PDFTEX||specific support is needed. This info can
+be gathered \eg\ by outputting the various \type{\special} commands
+as \type{\message}. Simply type
+
+\starttyping
+\pdfoutput=1 \let\special\message
+\stoptyping
+
+or, if this leads to confusion,
+
+\starttyping
+\pdfoutput=1 \def\special#1{\write16{special: #1}}
+\stoptyping
+
+and see what happens. As soon as one \quote {special} message turns up, one
+knows for sure that some kind of \PDFTEX\ specific support is needed, and
+often the message itself gives a indication of what is needed.
+
+Currently all mainstream macro packages offer \PDFTEX\ support, with
+automatic detection of \PDFTEX\ as engine. So there is normally no need
+to turn on \PDFTEX\ support explicitly.
+
+\startitemize
+
+\item For \LATEX\ users, Sebastian Rahtz and Heiko Oberdiek's \type
+ {hyperref} package has substantial support for \PDFTEX\ and
+ provides access to most of its features. In the simplest and
+ most common case, the user merely needs to load \type{hyperref},
+ and all cross||references will be converted to \PDF\ hypertext
+ links. \PDF\ output is automatically selected, compression is
+ turned on, and the page size is set up correctly. Bookmarks are
+ created to match the table of contents.
+
+\item The standard \LATEX\ \type{graphics}, \type{graphicx}, and
+ \type{color} packages also have automatic \pdfTeX\ support, which
+ allow use of color, text rotation, and graphics inclusion commands.
+
+\item The \CONTEXT\ macro package by Hans Hagen has very full support
+ for \PDFTEX\ in its generalized hypertext features. Support for
+ \PDFTEX\ is implemented as a special driver, and is invoked by
+ typing \type{\setupoutput[pdftex]} or feeding \TEXEXEC\ with the
+ \hbox{\tt -{}-pdf} option.
+
+\item \PDF\ from \TEXINFO\ documents can be created by running \PDFTEX\ on
+ the \TEXINFO\ file, instead of \TEX. Alternatively, run the shell
+ command \type{texi2pdf} instead of \type{texi2dvi}.
+
+\item A small modification of \filename {webmac.tex}, called \filename
+ {pdfwebmac.tex}, allows production of hyperlinked \PDF\ versions
+ of the program code written in \WEB.
+
+\stopitemize
+
+Some nice samples of \PDFTEX\ output can be found at
+\from[ptex_org], \from[context], and \from[tex_showcase].
+
+%***********************************************************************
+
+\section{Setting up fonts}
+
+\PDFTEX\ can work with Type~1 and TrueType fonts (and to some extent
+also with OpenType fonts). Font files should be available and embedded
+for all fonts used in the generated PDF. It is possible to use
+\METAFONT||generated fonts in \PDFTEX\ --- but it is strongly
+recommended not to use these fonts if an equivalent is available in
+Type~1 or TrueType format, if only because bitmap Type~3 fonts render
+poorly under enlargement.
+
+%***********************************************************************
+
+\subsection[mapfile]{Map files}
+
+Font map files provide the connection between \TEX\ \TFM\ font files
+and outline font file names. They contain also information about
+re||encoding arrays, partial font embedding (``subsetting''), and
+character transformation parameters (like SlantFont and ExtendFont). Those
+map files were first created for \DVI\ postprocessors. But, as \PDFTEX\
+in \PDF\ output mode includes all \PDF\ processing steps, it also needs
+to know about font mapping, and therefore reads in one or more map files.
+Map files are not read in when \PDFTEX\ is in \DVI\ mode. Bitmap fonts
+can (and normally should) be used without being listed in the map file.
+
+By default, \PDFTEX\ reads the map file \filename{pdftex.map}. In \WEBC,
+map files are searched for using the \type{TEXFONTMAPS} config file value
+and environment variable. By default, the current directory and various
+system directories are searched.
+
+Within the map file, each font is listed on a single line. The syntax of
+each line is upward||compatible with \type{dvips} map files and can contain
+the following fields (some are optional; explanations follow):
+
+\startnarrower
+{\em tfmname psname fontflags special encodingfile fontfile}
+\stopnarrower
+
+It is mandatory that {\em tfmname} is the first field. If a {\em
+psname} is given, it must be the second field. Similarly if {\em
+fontflags} is given it must be the third field (if {\em psname} is
+present) or the second field (if {\em psname} is left out). The
+positions of {\em special}, {\em encodingfile}, and {\em fontfile} can
+be mixed.
+
+\startdescription {tfmname}
+sets the name of the \TFM\ file for a font --- the file name given in a
+\TEX\ \type{\font} command. This name must always be given.
+
+\stopdescription
+
+\startdescription {psname}
+sets the (\POSTSCRIPT) base font name, which has two uses:
+
+First, when a \PDF\ file is embedded by \type{\pdfximage}, the
+\type{/BaseFont} names in the font dictionaries of Type~1 and Type~1C
+(CFF) fonts from the embedded \PDF\ file are checked against this {\em
+psname} field. If names match, the glyphs of that font will not be
+copied from the embedded \PDF\ file, but instead a local font is opened,
+and all needed glyphs will be taken from the Type~1 font file that is
+mentioned in the map line (see {\em fontfile} below). By this collecting
+mechanism Type~1 glyphs can be shared between several embedded \PDF\
+files and with text that is typeset by \PDFTEX, which helps keeping the
+resulting \PDF\ file size small, if many files with similar Type~1(C)
+fonts are embedded. Replacing Type~1 fonts from embedded \PDF\ files
+requires that also a Type~1 font file name is in the {\em fontfile} field
+(see below).
+
+Second, if a font file is not to be embedded into the \PDF\ output
+({\em fontfile} field missing), then the {\em psname} field will be
+copied to the \type{/BaseFont} and \type{/FontName} dictionary entries
+in the \PDF\ file, so that the \POSTSCRIPT\ font name will be known to
+reading applications (\eg\ viewers).
+
+It is highly recommended to use the {\em psname} field, but
+strictly speaking it is optional.
+
+\stopdescription
+
+\startdescription {fontflags}
+optionally specify some characteristics of the font. The following description of
+these flags is taken, with slight modification, from the \PDFReference\
+(the section on font descriptor flags). Viewers can adapt their rendering
+to these flags, especially when they substitute a non-embedded font by
+some own approximation.
+
+\startnarrower
+
+The value of the flags key in a font descriptor is a 32||bit integer that
+contains a collection of boolean attributes. These attributes are true if the
+corresponding bit is set to~1. \in{Table}[flags] specifies the meanings of
+the bits, with bit~1 being the least significant. Reserved bits must be set
+to zero.
+
+\startbuffer
+\starttabulate[|c|l|]
+\HL
+\NC \bf bit position \NC \bf semantics \NC\NR
+\HL
+\NC 1 \NC Fixed||width font \NC\NR
+\NC 2 \NC Serif font \NC\NR
+\NC 3 \NC Symbolic font \NC\NR
+\NC 4 \NC Script font \NC\NR
+\NC 5 \NC Reserved \NC\NR
+\NC 6 \NC Uses the Adobe Standard Roman Character Set \NC\NR
+\NC 7 \NC Italic \NC\NR
+\NC 8--16 \NC Reserved \NC\NR
+\NC 17 \NC All||cap font \NC\NR
+\NC 18 \NC Small||cap font \NC\NR
+\NC 19 \NC Force bold at small text sizes \NC\NR
+\NC 20--32 \NC Reserved \NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable
+ [here][flags]
+ {The meaning of flags in the font descriptor.}
+ {\getbuffer}
+
+All characters in a {\em fixed||width} font have the same width, while
+characters in a proportional font have different widths. Characters in a {\em
+serif font} have short strokes drawn at an angle on the top and bottom of
+character stems, while sans serif fonts do not have such strokes. A {\em
+symbolic font} contains symbols rather than letters and numbers. Characters
+in a {\em script font} resemble cursive handwriting. An {\em all||cap} font,
+which is typically used for display purposes such as titles or headlines,
+contains no lowercase letters. It differs from a {\em small||cap} font in
+that characters in the latter, while also capital letters, have been sized
+and their proportions adjusted so that they have the same size and stroke
+weight as lowercase characters in the same typeface family.
+
+Bit~6 in the flags field indicates that the font's character set
+conforms to the
+Adobe Standard Roman Character Set, or a subset of that, and that it uses
+the standard names for those characters.
+
+Finally, bit~19 is used to determine whether or not bold characters are
+drawn with extra pixels even at very small text sizes. Typically, when
+characters are drawn at small sizes on very low resolution devices such
+as display screens, features of bold characters may appear only one pixel
+wide. Because this is the minimum feature width on a pixel||based device,
+ordinary non||bold characters also appear with one||pixel wide features,
+and thus cannot be distinguished from bold characters. If bit~19 is set,
+features of bold characters may be thickened at small text sizes.
+
+\stopnarrower
+
+If the {\em fontflags} field is not given, and the font is embedded,
+\PDFTEX\ treats it as the value~4 (decimal, that is, bit position 3 is set),
+a symbolic font. For non-embedded fonts, the default value is
+\type{0x22}, a non-symbolic serif font. If you do not know the correct
+value, it is best not to specify it at all, as specifying a bad value of
+font flags may cause trouble in viewers. On the other hand this option
+is not absolutely useless because it provides backward compatibility
+with older map files (see the {\em fontfile} description below).
+
+\stopdescription
+
+\startdescription {special}
+specifies font manipulations in the same way as
+\type{dvips}. Currently only the keywords \type{SlantFont}
+and \type{ExtendFont} are interpreted, other instructions (notably
+\type{ReEncodeFont} and its parameters, see {\em encoding} below) are
+just ignored. The permitted \type{SlantFont} range is $-$1..1;
+for \type{ExtendFont} it's $-$2..2. The block of {\em special}
+instruction must be enclosed by double quote characters: \type{"}.
+
+\stopdescription
+
+\startdescription {encodingfile} specifies the name of the file
+containing the external encoding vector to be used for the font. The
+encoding file name must have the extension \type{.enc}, and the file
+name including extension must be given with either a preceding~\type{<}
+character or a preceding~\type{<[}. The format of the encoding vector is
+identical to that used by \type{dvips}. If no encoding is specified, the
+font's built||in default encoding is used. The {\em encodingfile} field
+may be omitted if you are sure that the font resource has the correct
+built||in encoding. In general this option is highly recommended, and it
+is {\em required} when subsetting a TrueType font.
+
+Starting with version 1.40.19, an encoding file can also be specified
+for bitmap \PK\ fonts. In this case, it assigns the glyph names from the
+given encoding vector, which can be used with the
+\type{\pdfglyphtounicode} primitive (q.v.). For example:
+
+\starttyping
+\pdfglyphtounicode{ffi}{0066 0066 0069} % normally: \input glyphtounicode
+\pdfgentounicode=1
+\pdfmapline{cmb10 <7t.enc}
+\font\cmb=cmb10 \cmb ffi
+\stoptyping
+
+The result is a \PDF\ file with a correctly-labeled \type{/ffi}
+character instead of the numeric character position in the
+\type{cmb10.tfm} (decimal 14).
+
+\stopdescription
+
+\startdescription {fontfile}
+sets the name of the font file to be embedded into the \PDF\ output for a
+given \TeX\ font (the {\em tfmname}~$\leftrightarrow$~{\em fontfile}
+mapping is the most prominent use of the \filename{pdftex.map} file).
+The font file name must belong to a Type~1 or TrueType font file. If
+the {\em fontfile} field is missing, no font embedding can take place;
+in case the {\em psname} field does not contain one of the 14 standard
+font names also a warning will be given. Not embedding a font into a \PDF\
+file might be troublesome, as it requires that the font or some similar
+looking replacement font is available within the \PDF\ viewer, so that
+it can render the glyphs with its own font version.
+
+The font file name should be preceded by one or two special characters,
+specifying how to handle the font file:
+
+\startitemize
+
+\item If the font file name is preceded by a \type{<} character, the
+ font file will be only partially embedded in the \PDF\ output
+ (``subsetted''), meaning that only used glyphs are written to
+ the \PDF\ file. This is the most common use and is {\em strongly
+ recommended} for any font, as it ensures the portability and
+ reduces the size of the \PDF\ output. Subsetted fonts are included
+ in such a way that name and cache clashes are minimized.
+
+\item If the font file name is preceded by a double \type{<<}, the font
+ file will be included entirely --- all glyphs of the font are
+ embedded, including even those not used in the document. Apart
+ from causing large size \PDF\ output, this option may cause
+ troubles with TrueType fonts, so it is normally not recommended
+ for Type~1 or TrueType fonts. But this is currently the only mode
+ that allows the use of OpenType fonts. This mode might also be
+ useful in case the font is atypical and cannot be subsetted well
+ by \PDFTEX. {\em Beware: proprietary font vendors typically
+ forbid full font inclusion.}
+
+\item If no special character precedes the font file name, it is
+ ignored, with a warning (this case was deprecated in \PDFTEX\
+ version 1.40.0). You achieve exactly the same \PDF\ result if you
+ just remove the font file name from the map entry. Then the glyph
+ widths that go into the \PDF~file are extracted from the
+ \TFM~file, and a font descriptor object is created that contains
+ approximations of the font metrics for the selected font.
+
+\item Specifying the {\em psname} and no font file name is only useful
+ as a last-ditch fallback when you do not want to embed the font
+ (\eg\ due to font license restrictions), but wish to use the font
+ metrics and let the \PDF\ viewer generate instances that look
+ close to the used font in case the font resource is not installed
+ on the system where the \PDF\ output will be viewed or
+ printed. To use this feature, the font flags {\em must} be
+ specified, and it must have the bit~6 set on, which means that
+ only fonts with the Adobe Standard Roman Character Set can be
+ simulated. The only exception is the case of a symbolic font,
+ which is not very useful.
+
+\stopitemize
+
+If you encounter problematic lookups, for instance if \PDFTEX\ tries
+to open a \type{.pfa} file instead of a \type{.pfb}, you can add
+the suffix to the filename. In this respect, \PDFTEX\ completely relies
+on the \type{kpathsea} library.
+
+\stopdescription
+
+For Type~1 and TrueType fonts, the font file will be included only once
+in the \PDF\ output, regardless of how many \TeX\ \type{\font} instances
+are used in the document. For instance, given
+
+\starttyping
+\font\a = cmr12
+\font\b = cmr12 at 11pt
+\stoptyping
+
+the outline file \type{cmr12.pfb} will only be included once in the
+\PDF, and merely scaled down to create the instance for \type{\b}.
+
+If a used font is not present in the map files, \PDFTEX\ will try to use
+\PK~fonts as most \DVI\ drivers do, creating \PK~fonts on||the||fly if
+needed. This is the normal, and recommended, way to use bitmap fonts.
+
+To summarize this rather confusing story, we include some example map
+lines. The most common way is to embed only a subset of glyphs from a
+font for a particular desired encoding, like this:
+
+\starttyping
+ptmri8r Times-Italic <8r.enc <ptmri8a.pfb
+\stoptyping
+
+Without re||encoding it looks like this:
+
+\starttyping
+cmr10 CMR10 <cmr10.pfb
+\stoptyping
+
+\type{SlantFont} and \type{ExtendFont} fields are specified as with
+\type{dvips}. \type{SlantFont} and \type{ExtendFont} work only with
+embedded Type~1 fonts:
+
+\starttyping
+psyro StandardSymL ".167 SlantFont" <usyr.pfb
+pcrr8rn Courier ".85 ExtendFont" <8r.enc <pcrr8a.pfb
+\stoptyping
+
+Entirely embed a font into the \PDF\ file without and with re||encoding
+(not typically useful):
+
+\starttyping
+fmvr8x MarVoSym <<marvosym.pfb
+pgsr8r GillSans <8r.enc <<pgsr8a.pfb
+\stoptyping
+
+A TrueType font can be used in the same way as a Type~1 font:
+
+\starttyping
+verdana8r Verdana <8r.enc <verdana.ttf
+\stoptyping
+
+Finally, a few cases with non-embedded fonts. If the fontfile is
+missing, the viewer application will have to use its own approximation
+of the missing font (with and without re||encoding):
+
+\starttyping
+ptmr8r Times-Roman <8r.enc
+psyr Symbol
+\stoptyping
+
+In the next example the numerical font flags give some rough hint what
+general characteristics the GillSans font has, so \eg\ the Adobe Reader
+might try an approximation, if it doesn't have the font resource nor
+any clue how a font named GillSans should look like:
+
+\starttyping
+pgsr8r GillSans 32 <8r.enc
+\stoptyping
+
+Not embedding fonts is rather risky and should generally be avoided.
+The recommendation these days is to embed all fonts, even the 14 standard ones.
+
+%***********************************************************************
+
+\subsection{Helper tools for TrueType fonts}
+
+As mentioned above, \PDFTEX\ can work with TrueType fonts. Defining
+TrueType fonts is similar to Type~1. The only extra thing to do
+with TrueType is to create a \TFM\ file. There is a program called
+\type{ttf2afm} in the \PDFTEX\ distribution which can be used to
+extract \AFM\ from TrueType fonts (another conversion program is
+\type{ttf2pt1}). Usage of \type{ttf2afm} is simple:
+
+\starttyping
+ttf2afm -e <encoding vector> -o <afm outputfile> <ttf input file>
+\stoptyping
+
+A TrueType file can be recognized by its suffix \filename {ttf}. The optional
+{\em encoding} specifies the encoding, which is the same as the encoding
+vector used in map files for \PDFTEX\ and \type{dvips}. If the encoding is
+not given, all the glyphs of the \AFM\ output will be mapped to \type
+{/.notdef}. \type{ttf2afm} writes the output \AFM\ to standard output. If we
+need to know which glyphs are available in the font, we can run \type
+{ttf2afm} without encoding to get all glyph names. The resulting \AFM\ file
+can be used to generate a \TFM\ one by applying \filename {afm2tfm}.
+
+To use a new TrueType font the minimal steps may look like below. We suppose
+that \filename {test.map} is used.
+
+\starttyping
+ttf2afm -e 8r.enc -o times.afm times.ttf
+afm2tfm times.afm -T 8r.enc
+echo "times TimesNewRomanPSMT <8r.enc <times.ttf" >>test.map
+\stoptyping
+
+There are a few limitations with TrueType fonts in comparison with
+Type~1 fonts:
+
+\startitemize[a,packed]
+\item The special effects SlantFont|/|ExtendFont did not work
+ before version 1.40.0.
+\item To subset a TrueType font, the font must be specified as re||encoded,
+ therefore an encoding vector must be given.
+\item TrueType fonts coming with embedded \PDF\ files are kept
+ untouched; they are not replaced by local ones.
+\stopitemize
+
+For much more about \PDFTEX\ and TrueType fonts, including many details
+on handling glyph names, see ``A closer look at TrueType fonts and
+\PDFTEX'', {\em TUGboat} 30:1 (2009), pp.~32||34, \from[thanh_truetype_tub]
+
+%***********************************************************************
+
+\section{Formal syntax specification}
+
+This section formally specifies the \PDFTEX-specific extensions to the
+\TEX\ macro programming language. Most primitives are prefixed by
+\type{pdf}. The general definitions and syntax rules follow after the
+list of primitives.
+
+Two new units of measure were introduced in \PDFTEX\ 1.30.0: the
+new Didot (1\,nd~=~0.375\,mm) and the new Cicero (1\,nc~=~12\,nd)
+(the former was proposed by \ISO\ in 1975).
+
+% Generated list of primitives (see Makefile).
+\input pdftex-syntax.tex
+
+\subsubject{General definitions and syntax rules}
+
+\startpacked
+
+%%S NL
+%%S Syntax rules:
+
+\Syntax{
+\Something{general text} \Means %
+ \Lbrace \Something{balanced text} \Rbrace
+}
+
+\Syntax{
+\Something{attr spec} \Means %
+ \Literal{attr} \Something{general text}
+}
+
+\Syntax{
+\Something{resources spec} \Means %
+ \Literal{resources} \Something{general text}
+}
+
+\Syntax{
+\Something{rule spec} \Means %
+ (\Literal{width} \Or \Literal{height} \Or \Literal{depth}) %
+ \Something{dimen} \Optional{\Something{rule spec}}
+}
+
+%\Syntax{\Something{object type spec} \Means
+% \Optional{\Literal{stream}
+% \Optional{\Something{attr spec}}} \Something{object contents}}
+
+\Syntax{
+\Something{object type spec} \Means %
+ \Literal{reserveobjnum}
+ \Or \Next %
+ \Optional{\Literal{useobjnum} \Something{number}} \Next %
+ \Optional{\Literal{stream} \Optional{\Something{attr spec}}} %
+ \Something{object contents}
+}
+
+\Syntax{
+\Something{annot type spec} \Means %
+ \Literal{reserveobjnum}
+ \Or \Next %
+ \Optional{\Literal{useobjnum} \Something{number}} %
+ \Optional{\Something{rule spec}} %
+ \Something{general text}
+}
+
+\Syntax{
+\Something{object contents} \Means %
+ \Something{file spec}
+ \Or \Something{general text}
+}
+
+\Syntax{
+\Something{xform attr spec} \Means %
+ \Optional{\Something{attr spec}} \Optional{\Something{resources spec}}
+}
+
+\Syntax{
+\Something{image attr spec} \Means %
+ \Optional{\Something{rule spec}} %
+ \Optional{\Something{attr spec}} %
+ \Optional{\Something{page spec}} %
+ \Optional{\Something{colorspace spec}} %
+ \Optional{\Something{pdf box spec}}
+}
+
+\Syntax{
+\Something{outline spec} \Means %
+ \Optional{\Something{attr spec}} %
+ \Something{action spec} %
+ \Optional{\Literal{count} \Something{number}} %
+ \Something{general text}
+}
+
+\Syntax{
+\Something{action spec} \Means %
+ \Literal{user} \Something{user-action spec}
+ \Or \Literal{goto} \Something{goto-action spec}
+ \Or \Next \Literal{thread} \Something{thread-action spec}
+}
+
+\Syntax{
+\Something{user-action spec} \Means %
+ \Something{general text}
+}
+
+%HE Check:
+\Syntax{
+\Something{goto-action spec} \Means %
+ \Something{numid}
+ \Or \Next \Optional{\Something{file spec}} \Something{nameid}
+ \Or \Next \Optional{\Something{file spec}} \Optional{\Something{page spec}} \Something{general text}
+ \Or \Next \Something{file spec} \Something{nameid} \Something{newwindow spec}
+ \Or \Next \Something{file spec} \Optional{\Something{page spec}} \Something{general text} \Something{newwindow spec}
+}
+
+\Syntax{
+\Something{thread-action spec} \Means %
+ \Optional{\Something{file spec}} \Something{numid}
+ \Or \Optional{\Something{file spec}} \Something{nameid}
+}
+
+\Syntax{
+\Something{colorspace spec} \Means %
+ \Literal{colorspace} \Something{number}
+}
+
+\Syntax{
+\Something{pdf box spec} \Means %
+ \Literal{mediabox} %
+ \Or \Literal{cropbox} %
+ \Or \Literal{bleedbox} %
+ \Or \Literal{trimbox} %
+ \Or \Literal{artbox}
+}
+
+\Syntax{
+\Something{map spec} \Means %
+ \Lbrace \Optional{\Something{map modifier}} %
+ \Something{balanced text} \Rbrace
+}
+
+\Syntax{
+\Something{map modifier} \Means %
+ \Literal{+} \Or \Literal{=} \Or \Literal{-}
+}
+
+\Syntax{
+\Something{numid} \Means %
+ \Literal{num} \Something{number}
+}
+
+\Syntax{
+\Something{nameid} \Means %
+ \Literal{name} \Something{general text}
+}
+
+\Syntax{
+\Something{newwindow spec} \Means %
+ \Literal{newwindow} \Or \Literal{nonewwindow}
+}
+
+\Syntax{
+\Something{dest spec} \Means %
+ \Something{numid} \Something{dest type}
+ \Or \Something{nameid} \Something{dest type}
+}
+
+\Syntax{
+\Something{dest type} \Means %
+ \Literal{xyz} \Optional{\Literal{zoom} \Something{number}}
+ \Or \Literal{fitr} \Something{rule spec}
+ \Or \Next \Literal{fitbh}
+ \Or \Literal{fitbv}
+ \Or \Literal{fitb}
+ \Or \Literal{fith}
+ \Or \Literal{fitv}
+ \Or \Literal{fit}
+}
+
+\Syntax{
+\Something{thread spec} \Means %
+ \Optional{\Something{rule spec}} %
+ \Optional{\Something{attr spec}} %
+ \Something{id spec}
+}
+
+\Syntax{
+\Something{id spec} \Means %
+ \Something{numid} \Or \Something{nameid}
+}
+
+\Syntax{
+\Something{file spec} \Means %
+ \Literal{file} \Something{general text}
+}
+
+\Syntax{
+\Something{page spec} \Means %
+ \Literal{page} \Something{number}
+}
+
+\Syntax{
+\Something{expand spec} \Means %
+ \Something{stretch} %
+ \Something{shrink} %
+ \Something{step} %
+ \Optional{\Literal{autoexpand}}
+}
+
+\Syntax{
+\Something{stretch} \Means %
+ \Something{number}
+}
+
+\Syntax{
+\Something{shrink} \Means %
+ \Something{number}
+}
+
+\Syntax{
+\Something{step} \Means %
+ \Something{number}
+}
+
+\Syntax{
+\Something{pre spec} \Means %
+ \Literal{pre}
+}
+
+\Syntax{
+\Something{pdfliteral spec} \Means %
+ \Literal{direct} \Or \Literal{page}
+}
+
+\Syntax{
+\Something{pdfspecial spec} \Means %
+ \Lbrace \Optional{\Something{pdfspecial id} %
+ \Optional{\Something{pdfspecial modifier}}} %
+ \Something{balanced text} \Rbrace
+}
+
+\Syntax{
+\Something{pdfspecial id} \Means %
+ \Literal{pdf:} \Or \Literal{PDF:}
+}
+
+\Syntax{
+\Something{pdfspecial modifier} \Means %
+ \Literal{direct:}
+}
+
+\Syntax{
+\Something{stack action} \Means %
+ \Literal{set} \Or \Literal{push} \Or \Literal{pop} \Or \Literal{current}
+}
+
+\stoppacked
+
+A \Something{general text} is expanded immediately, like \type{\special}
+in traditional \TEX, unless explicitly mentioned otherwise.
+
+Some of the object and image related primitives can be prefixed by
+\type{\immediate}. More about that in the next sections.
+
+%***********************************************************************
+
+\section[primitives]{\PDFTEX\ primitives}
+
+Here follows a description of the primitives added by \PDFTEX\ to the
+original \TEX\ engine (other extensions by \ETEX, \MLTEX\ and \ENCTEX\
+are not listed). Many of these primitives are described further in the
+\filename {samplepdf.tex} file in the \PDFTEX\ distribution.
+
+If the output is \DVI, then the \PDFTEX-specific dimension parameters
+are not used at all. However, some \PDFTEX\ integer parameters can
+affect \DVI\ as well as \PDF\ output (specifically, \type{\pdfoutput} and
+\type{\pdfadjustspacing}).
+
+%A warning to macro writers: The \PDFTEX-team reserves the namespaces
+%\type{\pdf*} and \type{\ptex*} for use by \PDFTEX; if you define macros
+%whose names start with \type{\pdf} or \type{\ptex}, you risk nameclashes
+%with new primitives introduced in future versions of \PDFTEX.
+
+General warning: many of these new primitives, for example
+\type{\pdfdest} and \type{\pdfoutline}, write their arguments directly
+to the \PDF\ output file (when producing \PDF), as \PDF\ string
+constants. This means that {\em you} (or, more likely, the macros you
+write) must escape characters as necessary (namely \type{\}, \type{(},
+and \type{)}. Otherwise, an invalid \PDF\ file may result. The
+\type{hyperref} and \TEXINFO\ packages have code which may serve as
+a starting point for implementing
+this, although it will certainly need to be adapted to any particular
+situation.
+
+%***********************************************************************
+
+\subsection{Document setup}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfoutput} \Whatever{integer}}}
+\bookmark{\tex{pdfoutput}}
+
+This parameter specifies whether the output format should be \DVI\ or
+\PDF. A positive value means \PDF\ output, otherwise (default 0) one gets
+\DVI\ output. This primitive is the only one that must be set to produce
+\PDF\ output (unless the commandline option \type{-output-format=pdf}
+is used); all other primitives are optional. This parameter cannot be
+specified {\em after} shipping out the first page. In other words, if
+we want \PDF\ output, we have to set \type{\pdfoutput} before \PDFTEX\
+ships out the first page.
+
+When \PDFTEX\ starts complaining about specials, one can be rather sure
+that a macro package is not aware of the \PDF\ mode. A simple way of
+making macros aware of \PDFTEX\ in \PDF\ or \DVI\ mode is:
+
+\starttyping
+\ifx\pdfoutput\undefined \csname newcount\endcsname\pdfoutput \fi
+\ifcase\pdfoutput DVI CODE \else PDF CODE \fi
+\stoptyping
+
+Using the \type{ifpdf.sty} file, which works with both \LATEX\ and plain
+\TeX, is a cleaner way of doing this. Historically, the simple test
+\type{\ifx\pdfoutput\undefined} was defined; but nowadays, the \PDFTEX\
+engine is used in distributions also for non-\PDF\ formats (\eg\
+\LATEX), so \type{\pdfoutput} may be defined even when the output format
+is \DVI.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfminorversion} \Whatever{integer}}}
+\bookmark{\tex{pdfminorversion}}
+
+This primitive sets the \PDF\ version of the generated file and the
+highest \PDF\ version of included \PDF{}s allowed without warning, by
+default (see \type{\pdfinclusionerrorlevel}). The default compiled into
+the \PDFTEX\ program is \type{\pdfminorversion=4}, setting the \PDF\
+version to~1.4 and allowing included \PDF\ files with versions up
+to~1.4. If specified, this primitive must appear before any data is to
+be written to the generated \PDF\ file.
+
+Distributions typically alter the engine's compiled default of~4 when
+building formats; for example, as of 2010, \TEXLIVE\ sets
+\type{\pdfminorversion=5} when formats are built. This is so object
+compression can be enabled (described below).
+
+This was originally a shortened synonym of the
+\type{\pdfoptionpdfminorversion} command, which is now obsolete.
+\introduced{1.30.0}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcompresslevel} \Whatever{integer}}}
+\bookmark{\tex{pdfcompresslevel}}
+
+This integer parameter specifies the level of {\em stream} compression
+(text, inline graphics, and embedded \PNG\ images (only if they are un-
+and re-compressed during the embedding process); all done by the
+\type{zlib} library). Zero means no compression, 1~means fastest,
+9~means best, $2..8$ means something in between. A value outside this
+range will be adjusted to the nearest meaningful value. This parameter
+is read each time \PDFTEX\ starts a stream. Setting
+\type{\pdfcompresslevel=0} is useful for \PDF\ stream debugging.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfobjcompresslevel} \Whatever{integer}}}
+\bookmark{\tex{pdfobjcompresslevel}}
+
+This integer parameter controls the compression of {\em non-stream}
+objects. In the \PDF-1.4 specification these objects still had to go into
+the \PDF\ file as clear text, uncompressed. The \PDF-1.5 specification
+now allows to collect non-stream objects as ``compressed objects'' into
+``object stream'' objects (\type{/Type /ObjStm}, see \PDF\ Ref.\ 5th~ed.,
+sect.~3.4.6). At the \PDF\ file end instead of the object table then
+an \type{/XRef} cross-reference stream is written out. This results in
+considerably smaller \PDF\ files, particularly if lots of annotations
+and links are used.
+\introduced{1.40.0}
+
+The writing of compressed objects is enabled by setting
+\type{\pdfobjcompresslevel} to a value between~1 and~3; it's
+disabled by value~0 (default). Enabling requires that also
+\type{\pdfminorversion}~$>$~4. If \type{\pdfobjcompresslevel}~$>$~0,
+but \type{\pdfminorversion}~$<$~5, a warning is given and object stream
+writing is disabled. The \type{\pdfobjcompresslevel} value is clipped
+to the range $0..3$. Using values outside this range is not recommended
+(for future extension).
+
+The \type{\pdfobjcompresslevel} settings have the following effects:
+When set to~0, no object streams are generated at all. When set to~1,
+all non-stream objects are compressed with the exception of any objects
+coming with embedded \PDF\ files (``paranoid'' mode, to avoid yet unknown
+problems), and also the \type{/Info} dictionary is not compressed for
+clear-text legibility. When set to~2, also all non-stream objects coming
+with embedded \PDF\ files are compressed, but the \type{/Info} dictionary
+is still not compressed. Finally, when set to~3, all non-stream objects
+are compressed, including the \type{/Info} dictionary (this means that
+the \type{/Info} can't be read as clear text any more). If object streams
+are to be used, currently \type{\pdfobjcompresslevel=2} is recommended,
+and is so specified in some distributions, including \TEXLIVE~2010 and later.
+
+\description{Caveat:} \PDF\ files generated with object streams enabled
+can't be read with (sufficiently old) \PDF\ viewers that don't
+understand \PDF-1.5 files. For widest distribution and unknown audience,
+don't activate object stream writing. The \PDF-1.5 standard describes
+also a hybrid object compression mode that gives some backward
+compatibility, but this is currently not implemented, as \PDF-1.5 was
+rather quickly adopted by modern \PDF\ viewers. Also not implemented is
+the optional \type{/Extends} key.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfdecimaldigits} \Whatever{integer}}}
+\bookmark{\tex{pdfdecimaldigits}}
+
+This integer parameter specifies the numeric accuracy of real
+coordinates as written to the \PDF\ file. It gives the maximal number of
+decimal digits after the decimal point. Valid values are in range
+$0..4$. A higher value means more precise output, but also results in a
+larger file size and more time to display or print. In most cases the
+optimal value is~2. This parameter does not influence the precision of
+numbers used in raw \PDF\ code, like that used in \type{\pdfliteral} and
+annotation action specifications; also multiplication items (\eg\
+scaling factors) are not affected and are always output with best
+precision. This parameter is read when \PDFTEX\ writes a real number to
+the \PDF\ output.
+
+When including huge \METAPOST\ images using \filename {supp-pdf.tex}, one can
+limit the accuracy to two digits by typing: \type{\twodigitMPoutput}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfhorigin} \Whatever{dimen}}}
+\bookmark{\tex{pdfhorigin}}
+
+This parameter can be used to set the horizontal offset the output box
+from the top left corner of the page. A value of 1~inch corresponds to the
+normal \TEX\ offset. This parameter is read when \PDFTEX\ starts shipping
+out a page to the \PDF\ output.
+
+For standard purposes, this parameter should always be kept at
+1~true inch. If you want to shift text on the page, use \TEX's
+own \type{\hoffset} primitive. To avoid surprises, after global
+magnification has been changed by the \type{\mag} primitive, the
+\type{\pdfhorigin} parameter should still be 1~true inch, \eg\
+by typing \type{\pdfhorigin=1 true in} after issuing the \type{\mag}
+command. Or, you can preadjust the \type{\pdfhorigin} value before typing
+\type{\mag}, so that its value after the \type{\mag} command ends up at
+1~true inch again.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfvorigin} \Whatever{dimen}}}
+\bookmark{\tex{pdfvorigin}}
+
+This parameter is the vertical companion of \type{\pdfhorigin}, and the
+notes above regarding \type{\mag} and true dimensions apply. Also keep
+in mind that the \TEX\ coordinate system starts in the top left corner
+(downward), while \PDF\ coordinates start at the bottom left corner
+(upward).
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpagewidth} \Whatever{dimen}}}
+\bookmark{\tex{pdfpagewidth}}
+
+This dimension parameter specifies the page width of the \PDF\ output
+(the screen, the paper, etc.). \PDFTEX\ reads this parameter when it
+starts shipping out a page. After magnification has been changed by
+the \type{\mag} primitive, check that this parameter reflects the wished
+true page width.
+
+If the value is set to zero, the page width is calculated as
+$w_{\hbox{\txx box being shipped out}} + 2 \times (\hbox{horigin} +
+\hbox{\type{\hoffset}})$. When part of the page falls off the paper or
+screen, you can be rather sure that this parameter is set wrong.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpageheight} \Whatever{dimen}}}
+\bookmark{\tex{pdfpageheight}}
+
+Similar to the previous item, this dimension parameter specifies the
+page height of the \PDF\ output. If set to zero, the page height will
+be calculated analogously to the above. After magnification has been
+changed by the \type{\mag} primitive, check that this parameter reflects
+the wished true page height.
+
+%***********************************************************************
+
+\subsection[sec.docinfocatalog]{The document info and catalog}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinfo} \Something{general text}}}
+\bookmark{\tex{pdfinfo}}
+
+This primitive allows the user to specify information for the document
+info dictionary; if this information is provided, it can be extracted,
+\eg\ by the \type{pdfinfo} program. The \Something{general text} is a
+collection of key||value||pairs. The key names are preceded by a
+\type{/}, and the values, being strings, are given between
+parentheses. All keys, and the primitive itself, are optional. Possible
+keys are:\crlf
+\type{/Title},\crlf
+\type{/Author},\crlf
+\type{/Subject},\crlf
+\type{/Keywords},\crlf
+\type{/Producer} (defaults to \hbox{\tt pdfTeX-\currentpdftex}),\crlf
+\type{/Creator} (defaults to \type{TeX}),\crlf
+\type{/CreationDate} (defaults to current date and time, with time zone),\crlf
+\type{/ModDate} (same default),\crlf
+\type{/Trapped} (defaults to \type{/False},\crlf
+\type{/PTEX.Fullbanner} (defaults to the \type{\pdftexbanner} string, q.v.).
+
+\type{/CreationDate} and \type{/ModDate} are expressed in the form
+\type{D:YYYYMMDDhhmmssTZ}, where \type{YYYY} is the year, \type{MM} is
+the month, \type{DD} is the day, hh is the hour, \type{mm} is the
+minutes, \type{ss} is the seconds, and \type{TZ} is an optional string
+denoting the time zone, \type{Z} for universal time. For example, this
+is the Unix epoch, the beginning of 1970-01-01 UTC, in this format:
+\type{19700101000000Z}. If the time zone is not UTC, it is given as
+\type{+HH'mm'} or \type{-HH'mm'}, indicating an offset of the given
+hours and minutes from UTC, with the given either later (\type{+}) or
+earlier (\type{-}) than UTC. (This syntax is specified by the PDF
+definition.)
+
+Multiple appearances of \type{\pdfinfo} are concatenated. Usually if a
+key is given more than once, the first appearance will be used, but this
+is viewer||dependent. Except for standard \TeX\ expansion, \PDFTEX\ does
+not perform any further operations in the \Something{general text}
+provided by the user.
+
+Here is an example of using \type{\pdfinfo} to include the
+information not supplied by \PDFTEX:
+
+\starttyping
+\pdfinfo {
+ /Title (example.pdf)
+ /Author (Tom and Jerry)
+ /Subject (Example)
+ /Keywords (mouse, cat)
+}
+\stoptyping
+
+For more details on all this, see the \PDFReference.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinfoomitdate} \Whatever{integer}}}
+\bookmark{\tex{pdfinfoomitdate}}
+
+If nonzero, omit the \type{/CreationDate} and \type{/ModDate} keys from
+the document info dictionary described above. This can be useful in
+making reproducible \PDF{}s. \introduced{1.40.17}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsuppressptexinfo} \Whatever{integer}}}
+\bookmark{\tex{pdfsuppressptexinfo}}
+
+Treated as a bitmask, specifying which \type{PTEX.*} keys to omit from
+the output:
+
+\startbuffer
+\starttabulate[|l|l|]
+\HL
+\NC \bf value \NC \bf suppresses \NC\NR
+\HL
+\NC \tt 1 \NC \type{PTEX.Fullbanner} \NC\NR
+\NC \tt 2 \NC \type{PTEX.FileName} \NC\NR
+\NC \tt 4 \NC \type{PTEX.PageNumber} \NC\NR
+\NC \tt 8 \NC \type{PTEX.InfoDict} \NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable
+ [here][suppressptexinfo]
+ {\type{\pdfsuppressptexinfo} bit meanings.}
+ {\getbuffer}
+
+Thus, the value \type{-1}, or the sum of all defined bits, will suppress
+everything.
+
+\type{PTEX.Fullbanner} is included by default in the general document
+info dictionary, as mentioned under \type{\pdfinfo} above. The other
+\type{PTEX.*} keys are included when a \PDF\ is included in the document
+(and not otherwise), as described in \in{section}[sec.addpdfkeys].
+
+This conditional suppression can be useful in making reproducible
+\PDF{}s. \introduced{1.40.17}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcatalog} \Something{general text}
+ \Optional{\Literal{openaction} \Something{action spec}}}}
+\bookmark{\tex{pdfcatalog}}
+
+Similar to the document info section is the document catalog, where
+possible keys are \type{/URI}, which specifies the base \URL\ of the
+document, and \type {/PageMode}, which determines how the \PDF\ viewer
+displays the document on startup. The possibilities for the latter are
+explained in \in {table} [pagemode]:
+
+\startbuffer
+\starttabulate[|l|l|]
+\HL
+\NC \bf value \NC \bf meaning \NC\NR
+\HL
+\NC \tt /UseNone \NC neither outline nor thumbnails visible \NC\NR
+\NC \tt /UseOutlines \NC outline visible \NC\NR
+\NC \tt /UseThumbs \NC thumbnails visible \NC\NR
+\NC \tt /FullScreen \NC full||screen mode \NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable
+ [here][pagemode]
+ {Supported \type{/PageMode} values.}
+ {\getbuffer}
+
+The default \type{/PageMode} setting is \type{/UseNone}. In
+full||screen mode, there is no menu bar, window controls, nor any other
+window present.
+
+After the \Something{general text}, a construct \Literal{openaction}
+\Something{action spec} can be given, where \Literal{openaction} is a
+\PDFTEX\ keyword, and \Something{action spec} specifies the action to be
+taken when opening the document. This \Something{action spec} is the
+same as for internal links; see \in {section} [linking]. (Instead of
+using this method, one can also write the open action directly into the
+catalog.)
+
+Several settings can be made in one \type{\pdfcatalog} call, for
+example:
+
+\starttyping
+\pdfcatalog{
+ /PageMode /FullScreen
+} openaction goto page 2 {/Fit}
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\pdfnames} \Something{general text}}}
+\bookmark{\tex{pdfnames}}
+
+This primitive inserts the \Something{general text} to the \type
+{/Names} array. The text must
+conform to the specifications as laid down in the \PDFReference,
+otherwise the document can be invalid.
+
+\pdftexprimitive{\Syntax{\Tex{\pdftrailer} \Something{general text}}}
+\bookmark{\tex{pdftrailer}}
+
+This command puts its argument text verbatim into the file trailer
+dictionary. Example: \type{\pdftrailer {/mytrlrkey /mytrlrval}}.
+\introduced{1.11a}
+
+\pdftexprimitive{\Syntax{\Tex{\pdftrailerid} \Something{general text}}}
+\bookmark{\tex{pdftrailerid}}
+
+Use the \Something{general text} to seed the \type{/ID} value in the
+trailer, instead of the default combination of the input file
+name and starting time. If the argument is empty, the \type{/ID} is
+omitted entirely. Example: \type{\pdftrailerid{}}. This can be useful
+in making reproducible \PDF{}s. \introduced{1.40.17}
+
+%***********************************************************************
+
+\subsection{Fonts}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpkresolution} \Whatever{integer}}}
+\bookmark{\tex{pdfpkresolution}}
+
+This integer parameter specifies the default resolution of embedded \PK\
+fonts and is read when \PDFTEX\ embeds a \PK\ font during finishing the
+\PDF\ output. As bitmap fonts are still rendered poorly by some \PDF\
+viewers, it is best to use Type~1 fonts when available.
+
+\pdftexprimitive{\Syntax{\Tex{\pdffontexpand}
+ \Something{font} \Something{stretch} \Something{shrink}
+ \Something{step} \Optional{\Literal{autoexpand}}}}
+\bookmark{\tex{pdffontexpand}}
+
+This extension to \TEX's font definitions controls a major \PDFTEX\ feature
+called {\em font expansion}. We describe this by an example:
+
+\starttyping
+\font\somefont=sometfm at 10pt
+\pdffontexpand\somefont 30 20 10 autoexpand
+\pdfadjustspacing=2
+\stoptyping
+
+The \type{30 20 10} means this: \quotation {hey \TEX, when line breaking
+is going badly, you may stretch the glyphs from this font as much as
+3\,\% or shrink them as much as 2\,\%}. For practical reasons \PDFTEX\
+uses discrete expansion steps, in this example, 1\,\%. Roughly spoken, the
+trick is as follows. Consider a text typeset in triple column mode. When
+\TEX\ cannot break a line in the appropriate way, the unbreakable parts
+of the word will stick into the margin. When \PDFTEX\ notes this, it
+will try to scale (shrink) the glyphs in that line using fixed steps,
+until the line fits. When lines are too spacy, the opposite happens:
+\PDFTEX\ starts scaling (stretching) the glyphs until the white space
+gaps is acceptable. This glyph stretching and shrinking is called
+{\em font expansion}. To enable font expansion, don't forget to set
+\type{\pdfadjustspacing} to a value greater than zero.
+
+There are two different modes for font expansion:
+
+First, if the \type{autoexpand} option is given --- which is the
+recommended mode --- only a single map entry is needed for all expanded
+font versions, using the name of the unexpanded \TFM\ file ({\em
+tfmname}). No expanded {\em tfmname} versions need to mentioned (they are
+ignored), as \PDFTEX\ generates expanded copies of the unexpanded \TFM\
+data structures and keeps them in its memory. Since \PDFTEX~1.40.0 the
+\type{autoexpand} mode happens within the page stream by modification of
+the text matrix (\PDF\ operator ``\type{Tm}''), and not anymore on font
+file level, giving the advantage that it now works not only with Type~1
+but also with TrueType and OpenType fonts (and even without embedding
+a font file; but that's not recommended). In this mode \PDFTEX\ requires
+only unexpanded font files.
+
+Second, if the \type{autoexpand} option is missing, setting up font
+expansion gets more tedious, as there must be map entries for \TFM\ files
+in all required expansion values. The expanded {\em tfmname} variants
+are constructed by adding the font expansion value to the {\em tfmname}
+of the base font, \eg\ there must be a map entry with {\em tfmname}
+\type{sometfm+10} for 1\,\% stretch or \type{sometfm-15} for 1.5\,\%
+shrink. This also means, that for each expanded font variant a \TFM\
+file with properly expanded metrics must exist. Having several map
+entries for the various expansion values of a font requires to provide
+for each expansion value an individually crafted font file with expanded
+glyphs. Depending on how these glyphs are generated, this might give
+slightly better glyph forms than the rather simple glyph stretching
+used in \type{autoexpand mode}. The drawback is that several font
+files will be embedded in the \PDF\ output for each expanded font,
+leading to significantly larger \PDF\ files than in \type{autoexpand}
+mode. For moderate expansion values going without \type{autoexpand}
+mode is not worth the trouble.
+
+The font expansion mechanism is inspired by an optimization first
+introduced by Prof.~Hermann Zapf, which in itself goes back to
+optimizations used in the early days of typesetting: use different
+glyphs to optimize the grayness of a page. So, there are many, slightly
+different~a's, e's, etc. For practical reasons \PDFTEX\ does not use
+such huge glyph collections; it uses horizontal scaling instead. This is
+sub||optimal, and for many fonts, possibly offensive to the design. But,
+when using \PDF, it's not illogical: \PDF\ viewers use so||called
+Multiple Master fonts when no fonts are embedded and|/|or can be found
+on the target system. Such fonts are designed to adapt their design to
+the different scaling parameters. It is up to the user to determine
+to what extent mixing slightly remastered fonts can be used without
+violating the design. Think of an O: when geometrically stretched, the
+vertical part of the glyph becomes thicker, and looks incompatible with
+an unscaled original. With a Multiple Master situation, one can stretch
+while keeping this thickness compatible.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfadjustspacing} \Whatever{integer}}}
+\bookmark{\tex{pdfadjustspacing}}
+
+This primitive provides a switch for enabling font expansion. By default,
+\type{\pdfadjustspacing} is set to~0; then font expansion is disabled,
+so that the \PDFTEX\ output is identical to that from the original \TEX\
+engine.
+
+Font expansion can be activated in two modes. When
+\type{\pdfadjustspacing} is set to~1, font expansion is applied {\em
+after} \TEX's normal paragraph breaking routines have broken the paragraph
+into lines. In this case, line breaks are identical to standard \TEX\
+behavior.
+
+When set to~2, the width changes that are the result of stretching and
+shrinking are taken into account {\em while} the paragraph is broken into
+lines. In this case, line breaks are likely to be different from those of
+standard \TEX. In fact, paragraphs may even become longer or shorter.
+
+Both alternatives require a collection of \TFM\ files that are
+related to the \Something{stretch} and \Something{shrink} settings
+for the \type{\pdffontexpand} primitive, unless this is given with the
+\type{autoexpand} option.
+
+\pdftexprimitive{\Syntax{\Tex{\efcode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{efcode}}
+
+We haven't yet told the whole story. One can imagine that some glyphs are
+visually more sensitive to stretching or shrinking than others. Then the
+\type{\efcode} primitive can be used to influence the expandability of
+individual glyphs within a given font, as a factor to the expansion
+setting from the \type{\pdffontexpand} primitive. The syntax is similar
+to \type{\sfcode} (but with the \Something{font} required), and it
+defaults to~1000, meaning 100\,\% expandability. The given integer value
+is clipped to the range $0..1000$, corresponding to a usable
+expandability range of $0..100$\,\%. Example:
+
+\starttyping
+\efcode\somefont`A=800
+\efcode\somefont`O=0
+\stoptyping
+
+Here an A may stretch or shrink only by 80\,\% of the current expansion
+value for that font, and expansion for the~O is disabled. The actual
+expansion is still bound to the steps as defined by \type{\pdffontexpand}
+primitive, otherwise one would end up with more possible font inclusions
+than would be comfortable.
+
+Changes to this table are global, i.e., ignore \TeX's usual grouping,
+and apply only to the given \Something{font}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfprotrudechars} \Whatever{integer}}}
+\bookmark{\tex{pdfprotrudechars}}
+
+Yet another way of optimizing paragraph breaking is to let certain
+characters move into the margin (`character protrusion'). When
+\type{\pdfprotrudechars=1}, the glyphs qualified as such will make
+this move when applicable, without changing the line-breaking. When
+\type{\pdfprotrudechars=2} (or greater), character protrusion will
+be taken into account while considering breakpoints, so line-breaking
+might be changed. This qualification and the amount of shift are set by
+the primitives \type{\rpcode} and \type{\lpcode}. Character protrusion
+is disabled when \type{\pdfprotrudechars=0} (or negative).
+
+If you want to protrude some item other than a character (\eg\
+a \type{\hbox}), you can do so by padding the item with an invisible
+zero||width character, for which protrusion is activated.
+
+\pdftexprimitive{\Syntax{\Tex{\rpcode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{rpcode}}
+
+The amount that a character from a given font may shift into the right
+margin (`character protrusion') is set by the primitive \type{\rpcode}.
+The protrusion distance is the integer value given to \type{\rpcode},
+multiplied with 0.001\,em from the current font. The given integer value
+is clipped to the range $-1000..1000$, corresponding to a usable
+protrusion range of $-$1\,em..1\,em. Example:
+
+\starttyping
+\rpcode\somefont`,=200
+\rpcode\somefont`-=150
+\stoptyping
+
+Here the comma may shift by 0.2\,em into the margin and the hyphen by
+0.15\,em. All these small bits and pieces will help \PDFTEX\ to give
+you better paragraphs (use \type{\rpcode} judiciously; don't overdo it).
+
+Remark: old versions of \PDFTEX\ use the character width as measure. This
+was changed to a proportion of the em-width after \THANH\ finished his
+master's thesis.
+
+Changes to this table are global, i.e., ignore \TeX's usual grouping,
+and apply only to the given \Something{font}.
+
+\pdftexprimitive{\Syntax{\Tex{\lpcode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{lpcode}}
+
+This is similar to \type{\rpcode}, but affects the amount by which
+characters may protrude into the left margin. Here also the given integer
+value is clipped to the range $-1000..1000$.
+
+Changes to this table are global, i.e., ignore \TeX's usual grouping,
+and apply only to the given \Something{font}.
+
+\pdftexprimitive{\Syntax{\Tex{\leftmarginkern} \Something{box number}
+ \Whatever{expandable}}}
+\bookmark{\tex{leftmarginkern}}
+
+The \Tex{\leftmarginkern} \Something{box number} primitive expands to the
+width of the margin kern at the left side of the horizontal list stored
+in \Tex{\box} \Something{box number}. The expansion string includes the
+unit \type{pt}. \Eg, when the left margin kern of \type{\box0} amounts
+to $-$10\,pt, \type{\leftmarginkern0} will expand to \type{-10pt}.
+A similar primitive \type{\rightmarginkern} exists for the right margin.
+\introduced{1.30.0}
+
+These are auxiliary primitives to make character protrusion
+more versatile. When using the \TEX\ primitive \type{\unhbox} or
+\type{\unhcopy}, the margin kerns at either end of the unpackaged
+hbox will be removed (\eg\ to avoid weird effects if several
+hboxes are unpackaged behind each other into the same horizontal
+list). These \type{\unhbox} or \type{\unhcopy} are often used together
+with \type{\vsplit} for dis- and re||assembling of paragraphs, \eg\ to
+add line numbers. Paragraphs treated like this do not show character
+protrusion by default, as the margin kerns have been removed during the
+unpacking process.
+
+The \type{\leftmarginkern} and \type{\rightmarginkern} primitives allow
+to access the margin kerns and store them away before unpackaging the
+hbox. \Eg\, the following code snipplet restores margin kerning of
+a horizontal list stored in \type{\box\testline}, resulting in a hbox with
+proper margin kerning (which is then done by ordinary kerns).
+
+\starttyping
+\dimen0=\leftmarginkern\testline
+\dimen1=\rightmarginkern\testline
+\hbox to\hsize{\kern\dimen0\unhcopy\testline\kern\dimen1}
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\rightmarginkern} \Something{box number}
+ \Whatever{expandable}}}
+\bookmark{\tex{rightmarginkern}}
+
+The \Tex{\rightmarginkern} \Something{box number} primitive expands to
+the width of the margin kern at the right side of the horizontal list
+stored in \Tex{\box} \Something{box number}. See \type{\leftmarginkern}
+for more details.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\letterspacefont} \Something{control sequence}
+ \Something{font} \Something{integer}}}
+\bookmark{\tex{letterspacefont}}
+
+This primitive creates an instance of \Something{font} with the widths
+of all glyphs increased by \Something{integer} thousandths of an em (as
+set in \Something{font}). The effect is letter spacing, but the glyphs
+are actually larger (sidebearings are increased), so a single glyph will
+take more space. For instance, the following creates a font
+\type{\lsfont} whose glyphs are all 1.2\,pt larger than those of
+\type{\normalfont}:
+
+\starttyping
+\font\normalfont=myfont at 12pt
+\letterspacefont\lsfont\normalfont 100
+\stoptyping
+
+Negative values are allowed for \Something{integer}.
+Letter spacing works natively in \PDF\ mode only, unless special fonts are
+devised (in our example, a \type{myfont+100ls} font), as with font expansion.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcopyfont} \Something{control sequence}
+ \Something{font}}}
+\bookmark{\tex{pdfcopyfont}}
+
+This primitive defines \Something{control sequence} as a synonym for
+\Something{font}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdffontattr} \Something{font}
+ \Something{general text}}}
+\bookmark{\tex{pdffontattr}}
+
+This primitive inserts the \Something{general text} to the \type{/Font}
+dictionary. The text must conform to the specifications as laid down in
+the \PDFReference, otherwise the document can be invalid. For examples,
+see the \type{cmap} and \type{CJK} packages.
+
+\pdftexprimitive{\Syntax{\Tex{\pdffontname} \Something{font}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdffontname}}
+
+In \PDF\ files produced by \PDFTEX\ one can recognize a font resource
+by the prefix~\type{/F} followed by a number, for instance \type{/F12}
+or \type{/F54}. For a given \TEX\ \Something{font}, this primitive
+expands to the number from the corresponding font resource name.
+\Eg, if \type{/F12} corresponds to some \TEX\ font \type{\foo}, the
+\type{\pdffontname\foo} expands to the number~\type{12}.
+
+In the current implementation, when \type{\pdfuniqueresname} (see below)
+is set to a positive value, the \type{\pdffontname} still returns only the
+number from the font resource name, but not the appended random string.
+
+\pdftexprimitive{\Syntax{\Tex{\pdffontobjnum} \Something{font}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdffontobjnum}}
+
+This command is similar to \type{\pdffontname}, but it returns the
+\PDF\ object number of the font dictionary instead of the number from
+the font resource name. \Eg, if the font dictionary (\type{/Type
+/Font}) in \PDF\ object~3 corresponds to some \TEX\ font \type{\foo},
+the \type{\pdffontobjnum\foo} gives the number~\type{3}.
+
+Use of \type{\pdffontname} and \type{\pdffontobjnum} allows users full
+access to all the font resources used in the document.
+
+\pdftexprimitive{\Syntax{\Tex{\pdffontsize} \Something{font}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdffontsize}}
+
+This primitive expands to the font size of the given font, with unit
+\type{pt}. \Eg, when using the plain \TeX\ macro package, the call
+\type{\pdffontsize\tenrm} expands to \type{10.0pt}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfincludechars} \Something{font}
+ \Something{general text} \Whatever{expandable}}}
+\bookmark{\tex{pdfincludechars}}
+
+This command causes \PDFTEX\ to treat the characters in \Something{general
+text} as if they were used with \Something{font}\unkern, which means that the
+corresponding glyphs will be embedded into the font resources in the \PDF\
+output. Nothing is appended to the list being built.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfuniqueresname} \Whatever{integer}}}
+\bookmark{\tex{pdfuniqueresname}}
+
+When this primitive is assigned a positive number, \PDF\ resource names
+will be made reasonably unique by appending a random string consisting
+of six \ASCII\ characters.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfmapfile} \Something{map spec}}}
+\bookmark{\tex{pdfmapfile}}
+
+This primitive is used for reading a font map file consisting of
+one or more font map lines. The name of the map file is given in
+the \Something{map spec} together with an optional leading modifier
+character. If no \type{\pdfmapfile} primitive is given, the default map
+file \filename{pdftex.map} will be read by \PDFTEX. There is a companion
+primitive \type{\pdfmapline} that allows to scan single map lines;
+its map line argument has the same syntax as the map lines from a map
+file. Both primitives can be used concurrently. The \type{\pdfmapfile}
+primitive is fast for reading external bulk font map information (many
+map lines collected in a map file), whereas the \type{\pdfmapline} allows
+to put the font map information for individual \TeX\ fonts right into
+the \TeX\ source or a style file. In any case the map line information
+is scanned by \PDFTEX, and in the most common case the data are put into
+a fresh internal map entry data structure, which is then consulted once
+a font is called.
+
+Normally there is no need for the \PDFTEX\ user to bother about the
+\type{\pdfmapfile} or \type{\pdfmapline} primitives, as the main \TEX\
+distributions provide nice helper tools that automatically assemble
+the default font map file. Prominent tool examples are the scripts
+\type{updmap} and \type{updmap-sys} coming with \TEXLIVE\ and \TETEX.
+If your map file isn't in the current directory (or a standard system
+directory), you will need to set the \type{TEXFONTMAPS} variable (in
+\WEBC) or give an explicit path so that it will be found.
+
+When the \type{\pdfmapfile} or \type{\pdfmapline} primitive is read
+by \PDFTEX, the argument (map file or map line) will be processed
+{\em immediately}, and the internal map entry database is updated.
+The operation mode of the \type{\pdfmapfile} and \type{\pdfmapline}
+primitives is selected by an optional modifier character (\type{+},
+\type{=}, \type{-}) in front of the {\em tfmname} field. This modifier
+defines how the individual map lines are going to be handled, and how
+a collision between an already registered map entry and a newer one is
+resolved; either ignoring a later entry, or replacing or deleting an
+existing entry. But in any case, map entries of fonts already in use
+are kept untouched. Here are two examples:
+
+\starttyping
+\pdfmapfile{+myfont.map}
+\pdfmapline{+ptmri8r Times-Italic <8r.enc <ptmri8a.pfb}
+\stoptyping
+
+When no modifier character is given (\eg\ \type{\pdfmapfile{foo.map}}
+or \type{\pdfmapline{phvr8r Helvetica}}) and there hasn't already been
+any call of one of these primitives before, then the default map file
+\filename{pdftex.map} will {\em not} be read in. Apart from this the
+given map file will be processed similarly as with a \type{+} modifier:
+duplicate later map entries within the file are ignored and a warning is
+issued. This means, that you can block reading of the default map file
+also by an empty \type{\pdfmapfile{}} or \type{\pdfmapline{}} early in
+the \TeX\ file. When the default map file is large but you don't need it
+anyway, these command variants might considerably speed up the \PDFTEX\
+startup process.
+
+If a modifier is given, the mechanism is so that before reading the
+items given as arguments to \type{\pdfmapfile} or \type{\pdfmapline}
+the default map file will be read first --- if this hasn't already
+been done or been prevented by the above blocking cases. This should
+be mostly compatible with the traditional behavior. If you want to add
+support for a new font through an additional font map file while keeping
+all the existing mappings, don't use the primitive versions without
+modifier, but instead type either \type{\pdfmapfile{+myfont.map}} or
+\type{\pdfmapfile{=myfont.map}}, as described below.
+
+\type{\pdfmapfile {+foo.map}} reads the file \filename{foo.map}; duplicate
+later map entries within the file are ignored and a warning is issued.
+
+\type{\pdfmapfile {=foo.map}} reads the file \filename{foo.map};
+matching map entries in the database are replaced by new entries from
+\filename{foo.map} (if they aren't already in use).
+
+\type{\pdfmapfile {-foo.map}} reads the file \filename{foo.map}; matching
+map entries are deleted from the database (if not yet in use).
+
+If you want to use a base map file name other than \type{pdftex.map},
+or change its processing options through a \PDFTEX\ format, you can do
+this by appending the \type{\pdfmapfile} command to the \type{\everyjob{}}
+token list for the \type{-ini} run, \eg:
+
+\starttyping
+\everyjob\expandafter{\the\everyjob\pdfmapfile{+myspecial.map}}
+\dump
+\stoptyping
+
+This would always read the file \type{myspecial.map} after the default
+\type{pdftex.map} file.
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfmapline} \Something{map spec}}}
+\bookmark{\tex{pdfmapline}}
+
+Similar to \type{\pdfmapfile}, but here you can give a single
+map line (like the ones in map files) as an argument. The optional modifiers
+(\type{+-=}) have the same effect as with \type{\pdfmapfile}; see also
+the description above. Example:
+
+\starttyping
+\pdfmapline{+ptmri8r Times-Italic <8r.enc <ptmri8a.pfb}
+\stoptyping
+
+This primitive (especially the \type{\pdfmapline{=...}} variant) is useful
+for temporary quick checks of a new font map entry during development,
+before finally putting it into a map file.
+
+\type{\pdfmapline {}} like \type{\pdfmapfile {}} blocks reading
+of the default map file, if it comes early enough in the \TeX\
+input. \introduced{1.20a}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsuppresswarningdupmap} \Whatever{integer}}}
+\bookmark{\tex{pdfsuppresswarningdupmap}}
+
+Ordinarily, \PDFTEX\ gives a warning when a duplicate map entry for a
+given font is read, whatever the mechanism. However, sometimes it is
+useful to include map information within the document, using
+\type{\pdfmapfile} or \type{\pdfmapline}, even for fonts that happen to
+be installed on the system. Then seeing the warnings on every run is
+just noise, and can be suppressed by setting this parameter to a
+positive number. \introduced{1.40.13}
+
+\pdftexprimitive{\Syntax{\Tex{\pdftracingfonts} \Whatever{integer}}}
+\bookmark{\tex{pdftracingfonts}}
+
+This integer parameter specifies the level of verbosity for info about
+expanded fonts given in the log, \eg\ when \type{\tracingoutput=1}.
+If \type{\pdftracingfonts=0}, which is the default, the log shows the
+actual non-zero signed expansion value for each expanded letter within
+brackets, \eg:
+
+\starttyping
+...\xivtt (+20) t
+\stoptyping
+
+If \type{\pdftracingfonts=1}, also the name of the \TFM\ file is listed,
+together with the font size, \eg:
+
+\starttyping
+...\xivtt (cmtt10+20@14.0pt) t
+\stoptyping
+
+Setting \type{\pdftracingfonts} to a value other than~0 or~1 is not
+recommended, to allow future extensions. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfmovechars} \Whatever{integer}}}
+\bookmark{\tex{pdfmovechars}}
+
+Since \PDFTEX\ version 1.30.0 the primitive \type{\pdfmovechars} is obsolete,
+and its use merely leads to a warning. (This primitive specified whether
+\PDFTEX\ should try to move characters in range 0..31 to higher slots;
+its sole purpose was to remedy certain bugs of early \PDF\ viewers.)
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpkmode} \Whatever{tokens}}}
+\bookmark{\tex{pdfpkmode}}
+
+The \type{\pdfpkmode} is a token register that sets the \METAFONT\ mode for
+pixel font generation. The contents of this register is dumped into the
+format, so one can (optionally) preset it \eg\ in \type{pdftexconfig.tex}.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfnoligatures} \Something{font}}}
+\bookmark{\tex{pdfnoligatures}}
+
+This disables all ligatures in the loaded font \Something{font}.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\tagcode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{tagcode}}
+
+This primitive accesses a character's \type{char_tag} info. It is meant
+to delete \type{lig_tag} (the character's ligature/kerning program),
+\type{list_tag} (which indicates that the character belongs to a chain of
+ascending sizes) and/or \type{ext_tag} (which indicates that the character
+is extensible), with the following options: assigning \type{-7} or smaller
+clears all tags, \type{-6} clears \type{ext_tag} and \type{list_tag},
+\type{-5} clears \type{ext_tag} and \type{lig_tag}, \type{-4} clears
+\type{ext_tag}, \type{-3} clears \type{list_tag} and \type{lig_tag},
+\type{-2} clears \type{list_tag}, \type{-1} clears \type{lig_tag},
+and \type{0} or larger does nothing. Changes are irreversible and global.
+
+Conversely, when queried, the primitive returns \type{0} if the tag's
+value is \type{no_tag}, \type{1} if \type{lig_tag} is set, \type{2} if
+\type{list_tag} is set or \type{4} (not~3) if \type{ext_tag} is set.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfgentounicode} \Whatever{integer}}}
+
+By default, \PDFTEX\ does not include a \type{/ToUnicode} resource when
+including fonts in the output. Such a resource (also called a CMap
+resource) maps glyph names to Unicode characters in a \PDF\ file.
+Lacking such a resource, it is the \PDF\ reader which determines how and
+whether searching in the \PDF\ file works. In practice, searching for
+basic ASCII characters generally works, but searching for anything
+beyond those, including ligatures such as `fi', fails in some versions
+of some PDF browsers (most notably Adobe Reader).
+
+If \type{\pdfgentounicode} is set to \type{1} when the job ends, the
+\type{/ToUnicode} resource will be included in the output, with mappings
+for Type~1 fonts used in the documents. The mapping is created as
+follows: for each glyph in the font, look for its \type{ToUnicode} value
+in a global hash table. By default that global hash table is empty;
+entries are added to the table using the following command:
+
+\pdftexprimitive{\Syntax{\Tex{\pdfglyphtounicode} \Something{general text}
+ \Something{general text}}}
+
+The first argument is the name of a glyph, the second is a string of Unicode
+numeric values denoting characters, separated by spaces. For instance:
+
+\starttyping
+\pdfgentounicode=1
+\pdfglyphtounicode{ff}{0066 0066}
+\stoptyping
+
+\noindent maps the \type{ff} ligature to a pair of \type{f}'s (whose
+code is \type{U+0066}).
+
+The \type{glyphtounicode.tex} file (distributed with \PDFTEX\ and other
+software) contains thousands of such definitions, covering most common
+glyph names. So, for practical purposes, one would probably want:
+
+\starttyping
+\input glyphtounicode
+\pdfgentounicode=1
+\stoptyping
+
+\LATEX\ users could load the \type{cmap} package to achieve the same
+effect.
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfnobuiltintounicode} \Something{font}}}
+
+The primary purpose of this command is to prevent \PDFTEX\ from
+generating the \type{ToUnicode}/CMap resource for the given font when
+\type{\pdfgentounicode=1}, most likely because the CMap resource is
+already generated by some other method (for example, the \LATEX\
+\type{cmap} package uses \type{\pdffontattr} to generate a CMap
+resource).
+
+Minimal example:
+\starttyping
+\font\f=cmb10
+\pdfnobuiltintounicode\f
+\f No unicode mappings for this output.
+\stoptyping
+\introduced{1.40.11}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinterwordspaceon}}}
+\pdftexprimitive{\Syntax{\Tex{\pdfinterwordspaceoff}}}
+
+These commands create corresponding whatsit nodes which turn on/off
+generation of faked interword spaces in the output. This allows for
+better reflowing of text on the fly by \PDF\ readers, better extraction
+of textual content, and is required by \PDF/A. It does not affect the
+normal \TeX\ justification with glue.
+
+This requires finding and reading font files \type{dummy-space.tfm} and
+\type{pfb}; the font is included in the \PDF\ output and character 32 is
+inserted from it as the ``fake'' space.
+
+Example of usage (see also the \type{fake-interword-space.tex} test file):
+
+\starttyping
+Text with no interword spaces.
+
+\pdfmapline{+dummy-space <dummy-space.pfb}
+\pdfglyphtounicode{space}{0020}
+\pdfinterwordspaceon
+
+Switch to text with faked interword spaces.
+
+\pdfinterwordspaceoff
+
+Back to text with no interword spaces.
+\stoptyping
+\introduced{1.40.15}
+
+\pdftexprimitive{\Syntax{\Tex{\pdffakespace}}}
+
+Insert a faked interword space to the output, regardless of the value of
+\type{\pdfinterwordspaceon} and \type{\pdfinterwordspaceoff}. Example:
+
+\starttyping
+Text with no interword \pdffakespace\pdffakespace spaces.
+\stoptyping
+\introduced{1.40.15}
+
+%***********************************************************************
+
+\subsection{Spacing}
+
+Controlling spacing before and after characters was introduced in
+version 1.30, mostly to handle punctuation rules in different
+languages. The \type{\...code} tables here, like those in the previous
+section, operate globally, i.e., ignore \TeX's usual grouping, and apply
+only to the given \Something{font}, not other instances of the
+underlying font.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfadjustinterwordglue} \Whatever{integer}}}
+\bookmark{\tex{pdfadjustinterwordglue}}
+
+If positive, adjustment of interword glue is enabled and controlled by the
+following three primitives.
+
+\pdftexprimitive{\Syntax{\Tex{\knbscode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{knbscode}}
+
+The amount of space, in thousandths of an em, added to the natural width
+of the glue following a character (the name stands for ``kern before
+space'', although technically it is looking at glue items, not kern
+items). This amounts is clipped to the range $-1000..1000$. For
+instance, the following example means that glues after periods will be
+increased by .2\,em.
+
+\starttyping
+\pdfadjustinterwordglue=1
+\knsbcode\font`\.=200
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\stbscode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{stbscode}}
+
+This works like \type{\knbscode}, but applies to the stretch component of
+the following glue.
+
+\pdftexprimitive{\Syntax{\Tex{\shbscode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{shbscode}}
+
+Like \type{\stbscode}, but for the shrink component.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfprependkern} \Whatever{integer}}}
+\bookmark{\tex{pdfprependkern}}
+
+If positive, automatic insertion of kerns before characters is enabled.
+
+\pdftexprimitive{\Syntax{\Tex{\knbccode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{knbccode}}
+
+The width of the kern, in thousandths of an em, inserted before a character.
+It is clipped to the range $-1000..1000$. For instance, with the
+following code, a .15\,em-kern will be inserted before all question marks
+(useful for \eg\ French punctuation):
+
+\starttyping
+\pdfprependkern=1
+\knbccode\font`\?=150
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\pdfappendkern} \Whatever{integer}}}
+\bookmark{\tex{pdfappendkern}}
+
+Same as \type{\pdfprependkern}, but for kerns inserted after characters.
+
+\pdftexprimitive{\Syntax{\Tex{\knaccode} \Something{font}
+ \Something{8-bit number} \Whatever{integer}}}
+\bookmark{\tex{knaccode}}
+
+Same as \type{\knbccode}, except the kern is inserted after the
+character. Such a kern is required for instance after a left guillemet
+in French punctuation.
+
+%***********************************************************************
+
+\subsection{Vertical adjustments}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfignoreddimen} \Whatever{dimen}}}
+\bookmark{\tex{pdfignoreddimen}}
+
+This is the dimension which must assigned to the following four primitives
+so they are ignored. Default is \type{-1000pt}, and it should be modified
+with care since it also influences when a previous paragraph's depth is ignored
+(for instance, the plain \TEX\ macro \type{\nointerlineskip} should be
+modified accordingly).
+
+\pdftexprimitive{\Syntax{\Tex{\pdffirstlineheight} \Whatever{dimen}}}
+\bookmark{\tex{pdffirstlineheight}}
+
+This parameter specifies the height of the first line of a paragraph,
+regardless of its content. It is read when the paragraph builder is
+called, and ignored when set to \type{\pdfignoreddimen}. By default,
+it is set to \type{-1000pt}, so it is ignored as long as the value
+of \type{\pdfignoreddimen} is the same.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastlinedepth} \Whatever{dimen}}}
+\bookmark{\tex{pdflastlinedepth}}
+
+This is similar to the previous parameter, but affects the last line's
+depth of a paragraph.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfeachlineheight} \Whatever{dimen}}}
+\bookmark{\tex{pdfeachlineheight}}
+
+Similar to \type{\pdffirstlineheight}, but for all lines of a paragraph,
+including the first one, unless \type{\pdffirstlineheight} is specified.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfeachlinedepth} \Whatever{dimen}}}
+\bookmark{\tex{pdfeachlinedepth}}
+
+Like the preceding parameter, but for depth.
+
+%***********************************************************************
+
+\subsection{\PDF\ objects}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfobj} \Something{object type spec}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfobj}}
+
+This command creates a raw \PDF\ object that is written to the \PDF\
+file as \type{1 0 obj} \unknown\ \type{endobj}. The object is written to
+\PDF\ output as provided by the user. When \Something{object type spec}
+is not given, \PDFTEX\ no longer creates a dictionary object with
+contents \Something{general text}, as it did in the past.
+
+When, however, \Something{object type spec} is given as \Something{attr
+spec} \Literal{stream}, the object will be created as a stream with
+contents \Something{general text} and additional attributes in
+\Something{attr spec}\unkern.
+
+When \Something{object type spec} is given as \Something{attr spec}
+\Literal{file}, then the \Something{general text} will be treated as a file
+name and its contents will be copied into the stream contents.
+
+When \Something{object type spec} is given as \type{reserveobjnum},
+just a new object number is reserved. The number of the reserved object
+is accessible via \type{\pdflastobj}. The object can later be filled
+with contents by \Syntax{\Tex{\pdfobj} \Literal{useobjnum}
+\Something{number} \Lbrace\Something{balanced text}\Rbrace}.
+But the reserved object number can already be used before by other
+objects, which provides a forward||referencing mechanism.
+
+The object is kept in memory and will be written to the \PDF\ output only
+when its number is referred to by \type{\pdfrefobj} or when \type{\pdfobj}
+is preceded by \type{\immediate}. Nothing is appended to the list being
+built. The number of the most recently created object is accessible via
+\type{\pdflastobj}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastobj} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastobj}}
+
+This command returns the object number of the last object created by \type
+{\pdfobj}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfrefobj} \Something{object number}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfrefobj}}
+
+This command appends a whatsit node to the list being built. When the whatsit
+node is searched at shipout time, \PDFTEX\ will write the object
+\Something{object number}
+to the \PDF\ output if it has not been written yet.
+
+%***********************************************************************
+
+\subsection{Page and pages objects}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpagesattr} \Whatever{tokens}}}
+\bookmark{\tex{pdfpagesattr}}
+
+\PDFTEX\ expands this token list when it finishes the \PDF\ output and
+adds the resulting character stream to the root \type{Pages}
+object. When defined, these are applied to all pages in the
+document. Some examples of attributes are \type{/CropBox}, the rectangle
+specifying the region of the page being displayed and printed, and
+\type{/Rotate}, the number of degrees (in multiples of 90) the page
+should be rotated clockwise when it is displayed or printed.
+
+% /MediaBox is not a good example, since will never take effect
+
+\starttyping
+\pdfpagesattr
+ { /Rotate 90 % rotate all pages by 90 degrees
+ /CropBox [0 0 612 792] } % the crop size of all pages (in bp)
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpageattr} \Whatever{tokens}}}
+\bookmark{\tex{pdfpageattr}}
+
+This is similar to \type{\pdfpagesattr}, but has priority over it.
+It can be used to override any attribute given by \type{\pdfpagesattr}
+for an individual page. The token list is expanded when \PDFTEX\ ships out
+a page. The contents are added to the attributes of the current page.
+
+If the \type{\pdfpageattr} value contains the string \type{/MediaBox},
+then \PDFTEX\ omits outputting its own \type{/MediaBox} value (which is
+\type{[0 0 }\Something{\it page\_width} \Something{\it
+page\_height}\type{]}). (This behavior was introduced in version
+1.40.18.)
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpageresources} \Whatever{tokens}}}
+\bookmark{\tex{pdfpageresources}}
+
+These tokens are added to the resource dictionary for all pages, before
+the font, XOBject, and other resources.
+
+\starttyping
+\pdfpageresources{/MyPageResourceAttribute /MyValue}
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpageref} \Something{page number}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfpageref}}
+
+This primitive expands to the number of the page object that contains
+the dictionary for page \Something{page number}. If the page
+\Something{page number} does not exist, a warning will be issued,
+a fresh unused \PDF\ object will be generated, and \type{\pdfpageref}
+will expand to that object number.
+
+\Eg, if the dictionary for page~5 of the \TEX\ document is contained in
+\PDF\ object no.~18, \tex{pdfpageref5} expands to the number 18.
+
+%***********************************************************************
+
+\subsection{Form XObjects}
+
+The next three primitives support a \PDF\ feature called \quote {object
+reuse} in \PDFTEX. The idea is first to create a `form XObject' in
+\PDF. The content of this object corresponds to the content of a \TEX\
+box; it can contain pictures and references to other form XObjects
+as well. After creation, the form XObject can be used multiple times
+by simply referring to its object number. This feature can be useful
+for large documents with many similar elements, as it can reduce the
+duplication of identical objects.
+
+These commands behave similarly to \type{\pdfobj}, \type{\pdfrefobj}
+and \type{\pdflastobj}, but instead of taking raw \PDF\ code, they handle
+text typeset by \TEX.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfxform} \Optional{\Something{attr spec}}
+ \Optional{\Something{resources spec}} \Something{box number}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfxform}}
+
+This command creates a form XObject corresponding to the contents of the
+box \Something{box number}. The box can contain other raw objects, form
+XObjects, or images as well. It can however {\em not} contain annotations
+because they are laid out on a separate layer, are positioned absolutely,
+and have dedicated housekeeping. \type{\pdfxform} makes the box void,
+as \type{\box} does.
+
+When \Something{attr spec} is given, the text will be written
+as additional attribute into the form XObject dictionary. The
+\Something{resources spec} is similar, but the text will be added
+to the resources dictionary of the form XObject. The text given by
+\Something{attr spec} or \Something{resources spec} is written before
+other entries of the form dictionary and|/|or the resources dictionary
+and takes priority over later ones.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfrefxform} \Something{object number}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfrefxform}}
+
+The form XObject is kept in memory and will be written to the \PDF\
+output only when its object number is referred to by \type{\pdfrefxform}
+or when \type{\pdfxform} is preceded by \type{\immediate}. Nothing is
+appended to the list being built. The number of the most recently created
+form XObject is accessible via \type{\pdflastxform}.
+
+When issued, \type{\pdfrefxform} appends a whatsit node to the list being
+built. When the whatsit node is searched at shipout time, \PDFTEX\ will
+write the form \Something{object number} to the \PDF\ output if it is
+not written yet.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastxform} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastxform}}
+
+The object number of the most recently created form XObject is accessible
+via \type{\pdflastxform}.
+
+As said, this feature can be used for reusing information. This mechanism
+also plays a role in typesetting fill||in forms. Such widgets sometimes
+depends on visuals that show up on user request, but are hidden otherwise.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfxformname} \Something{object number}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfxformname}}
+
+In \PDF\ files produced by \PDFTEX\ one can recognize a form Xobject by
+the prefix~\type{/Fm} followed by a number, for instance \type{/Fm2}.
+For a given form XObject number, this primitive expands to the number in
+the corresponding form XObject name. \Eg, if \type{/Fm2} corresponds to
+some form XObject with object number 7, the \type{\pdfxformname7}
+expands to the number~\type{2}. \introduced{1.30.0}
+
+%***********************************************************************
+
+\subsection{Graphics inclusion}
+
+\PDF\ provides a mechanism for embedding graphic and textual objects: form
+XObjects. In \PDFTEX\ this mechanism is accessed by means of \type{\pdfxform},
+\type{\pdflastxform} and \type{\pdfrefxform}. A special kind of XObjects
+are bitmap graphics and for manipulating them similar commands are provided.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfximage}
+ \Optional{\Something{rule spec}}
+ \Optional{\Something{attr spec}}
+ \Optional{\Something{page spec}}
+ \Optional{\Something{colorspace spec}}
+ \Optional{\Something{pdf box spec}}
+ \Something{general text}
+ \Modelist{h, v, m}
+}}
+\bookmark{\tex{pdfximage}}
+
+This command creates an image object. The dimensions of the image can be
+controlled via \Something{rule spec}\unkern. The default values are zero
+for depth and \quote {running} for height and width. If all of them are
+given, the image will be scaled to fit the specified values. If some
+(but not all) are given, the rest will be set to a value corresponding
+to the remaining ones so as to make the image size to yield the same
+proportion of $width : (height+depth)$ as the original image size, where
+depth is treated as zero. If none are given then the image will take its
+natural size.
+
+An image inserted at its natural size often has a resolution of \type
+{\pdfimageresolution} (see below) given in dots per inch in the output
+file, but some images may contain data specifying the image resolution,
+and in such a case the image will be scaled to the correct
+resolution. The dimensions of an image can be accessed by enclosing the
+\type{\pdfrefximage} command to a box and checking the dimensions of the
+box:
+
+\starttyping
+\setbox0=\hbox{\pdfximage{somefile.png}\pdfrefximage\pdflastximage}
+\stoptyping
+
+Now we can use \type{\wd0} and \type{\ht0} to question the natural size of
+the image as determined by \PDFTEX. When dimensions are specified before the
+\type{{somefile.png}}, the graphic is scaled to fit these. Note that, unlike
+the \eg\ \type{\input} primitive, the filename is supplied between
+braces.
+
+The image type is specified by the extension of the given file name:
+\type{.png} stands for \PNG\ image, \type{.jpg} (or \type{.jpeg}) for
+\JPEG, \type{.jbig2} (preferred, but \type{.jb2} works also) for \JBIGTWO,
+and \type{.pdf} for \PDF\ file. But once \PDFTEX\ has opened the file,
+it checks the file type first by looking to the magic number at the
+file start, which gets precedence over the file name extension. This
+gives a certain degree of fault tolerance, if the file name extension
+is stated wrongly.
+
+Similarly to \type{\pdfxform}, the optional text given by \Something{attr
+spec} will be written as additional attributes of the image before
+other keys of the image dictionary. One should be aware, that slightly
+different type of \PDF\ object is created while including \PNG, \JPEG,
+or \JBIG2\ bitmaps and \PDF\ images.
+
+While working with \PDF\ or \JBIG2\ images, \Something{page spec}
+allows to decide which page of the document is to be included;
+the \Something{page spec} is irrelevant for the other two image
+formats. Starting with \PDFTEX\ 1.11 one may also decide in the \PDF\
+image case, which page box of the image is to be treated as a final
+bounding box. If \Something{pdf box spec} is present, it overrides the
+default behavior specified by the \type{\pdfpagebox} parameter, and is
+overridden by the (obsolete) \type{\pdfforcepagebox} parameter. This
+option is irrelevant for non||\PDF\ inclusions.
+
+Starting with \PDFTEX\ 1.21, \type{\pdfximage} command supports
+\type{colorspace} keyword followed by an object number (user||defined
+colorspace for the image being included). This feature works for \JPEG\
+images only. \PNG s are \RGB\ palettes, \JBIG2 s are bitonal, and \PDF\
+images have always self||contained color space information.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfrefximage} \Something{object number}}}
+\bookmark{\tex{pdfrefximage}}
+
+The image is kept in memory and will be written to the \PDF\ output only when
+its number is referred to by \type{\pdfrefximage} or \type{\pdfximage} is
+preceded by \type{\immediate}. Nothing is appended to the list being built.
+
+\type{\pdfrefximage} appends a whatsit node to the list being built. When
+the whatsit node is searched at shipout time, \PDFTEX\ will write the image
+with number \Something{object number} to the \PDF\ output if it has not been
+written yet.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastximage} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastximage}}
+
+The number of the most recently created XObject image is accessible via \type
+{\pdflastximage}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfximagebbox} \Something{integer}
+ \Something{integer} \Whatever{expandable}}}
+\bookmark{\tex{pdfximagebbox}}
+
+The dimensions of the bounding box of a \PDF\ image loaded with
+\type{\pdfximage} are stored in a table. This primitive returns those
+dimensions as follows:
+
+\starttyping
+\pdfximage{afile.pdf}
+\pdfximagebbox\pdflastximage 1 % Returns lower-left x
+\pdfximagebbox\pdflastximage 2 % Returns lower-left y
+\pdfximagebbox\pdflastximage 3 % Returns upper-right x
+\pdfximagebbox\pdflastximage 4 % Returns upper-right y
+\stoptyping
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastximagecolordepth}
+ \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastximagecolordepth}}
+
+The color depth (\type{1} for 1-bit images, \type{2} for 2-bit images,
+and so on) of the last image accessed with \type{\pdfximage}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastximagepages}
+ \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastximagepages}}
+
+This read||only register returns the highest page number from a file
+previously accessed via the \type{\pdfximage} command.
+This is useful only for \PDF\ files; it always returns \type{1}
+for \PNG, \JPEG, or \JBIGTWO\ files.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfimageresolution} \Whatever{integer}}}
+\bookmark{\tex{pdfimageresolution}}
+
+The integer \type{\pdfimageresolution} parameter (unit: dots per
+inch, dpi) is a last resort value, used only for bitmap (\JPEG, \PNG,
+\JBIGTWO) images, but not for \PDF{}s. The priorities are as follows:
+Often one image dimension (\type{width} or \type{height}) is stated
+explicitly in the \TEX\ file. Then the image is properly scaled so
+that the aspect ratio is kept. If both image dimensions are given,
+the image will be stretched accordingly, whereby the aspect ratio might
+get distorted. Only if no image dimension is given in the \TEX\ file,
+the image size will be calculated from its width and height in pixels,
+using the $x$ and $y$ resolution values normally contained in the image
+file. If one of these resolution values is missing or weird (either
+$<$~0 or $>$~65535), the \type{\pdfimageresolution} value will be used
+for both $x$ and $y$ resolution, when calculating the image size. And
+if the \type{\pdfimageresolution} is zero, finally a default resolution
+of 72\,dpi would be taken. The \type{\pdfimageresolution} is read when
+\PDFTEX\ creates an image via \type{\pdfximage}. The given value is
+clipped to the range $0..65535$\,(dpi).
+
+Currently this parameter is used particularly for calculating the
+dimensions of \JPEG\ images in \EXIF\ format (unless at least one
+dimension is stated explicitly); the resolution values coming with
+\EXIF\ files are currently ignored.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpagebox} \Whatever{integer}}}
+\bookmark{\tex{pdfpagebox}}
+
+When \PDF\ files are included, the command \type{\pdfximage} allows the
+selection of which \PDF\ page box to use in the optional field
+\Something{image attr spec}\unkern. If the option isn't present, the
+page box defaults to the value of \type{\pdfpagebox} as follows:
+(1)~media box, (2)~crop box, (3)~bleed box, (4)~trim box, and
+(5)~artbox.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfforcepagebox} \Whatever{integer}}}
+\bookmark{\tex{pdfforcepagebox}}
+
+%- It is now possible to specify the pdf page box to use when including pdfs.
+% The syntax has been extended:
+% \pdfximage [<image attr spec>] <general text> (h, v, m)
+% <image attr spec> --> [<rule spec>] [<attr spec>] [<page spec>] [<pdf box spec>]
+% <pdf box spec> --> mediabox|cropbox|bleedbox|trimbox|artbox
+% The default is cropbox (which defaults to mediabox), to be compatible with
+% previous versions of pdfTeX.
+% The page box specified at \pdfximage can be globally overridden with the
+% config parameter always_use_pdfpagebox and the command
+% \pdfoptionalwaysusepdfpagebox <integer>, where 0 is the default (use
+% whatever is specified with \pdfximage), 1 is media, 2 is crop, 3 is
+% bleed, 4 is trim and 5 is artbox. This can only be set once per
+% object, i.\,e.\ the value used at \pdfximage is remembered.
+% See the PDF Reference for an explanation of the boxes.
+
+The integer primitive \type{\pdfforcepagebox} allows globally
+overriding the choice of the page box used with \type{\pdfximage}. It
+takes the same values as \type{\pdfpagebox}. The command is available
+starting with \PDFTEX\ 1.30.0, as a shortened synonym of obsolete
+\type{\pdfoptionalwaysusepdfpagebox} instruction, but is itself
+now considered obsolete --- a mixture of \type{\pdfpagebox} and
+\Something{image attr spec} is better.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinclusionerrorlevel} \Whatever{integer}}}
+\bookmark{\tex{pdfinclusionerrorlevel}}
+
+This controls the behavior of \PDFTEX\ when a \PDF\ file is included
+that has a newer version than the one specified by
+\type{\pdfminorversion}. If \type{\pdfinclusionerrorlevel} is set to~0
+(the default), \PDFTEX\ gives only a warning; if 1, \PDFTEX\ raises an
+error; if negative, no diagnostic at all is given.
+
+It was originally a shortened synonym of
+\type{\pdfoptionpdfinclusionerrorlevel}, which is now obsolete.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfimagehicolor} \Whatever{integer}}}
+\bookmark{\tex{pdfimagehicolor}}
+
+This primitive, when set to~1, enables embedding of \PNG\ images with
+16~bit wide color channels at their full color resolution. As such an
+embedding mode is defined only from \PDF\ version~1.5 onwards, the
+\type{\pdfimagehicolor} functionality is automatically disabled in
+\PDFTEX\ if \type{\pdfminorversion}~$<$~5; then each 16~bit color
+channel is reduced to a width of 8~bit by stripping the lower 8~bits
+before embedding. The same stripping happens when
+\type{\pdfimagehicolor} is set to~0. For \type{\pdfminorversion}~$\ge$~5
+the default value of \type{\pdfimagehicolor} is~1. If specified, the
+parameter must appear before any data is written to the \PDF\ output.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfimageapplygamma} \Whatever{integer}}}
+\bookmark{\tex{pdfimageapplygamma}}
+
+This primitive, when set to~1, enables gamma correction while embedding
+\PNG\ images, taking the values of the primitives \type{\pdfgamma} as
+well as the gamma value embedded in the \PNG\ image into account. When
+\type{\pdfimageapplygamma} is set to~0, no gamma correction is
+performed. If specified, the parameter must appear before any data is
+written to the \PDF\ output. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfgamma} \Whatever{integer}}}
+\bookmark{\tex{pdfgamma}}
+
+This primitive defines the `device gamma' for \PDFTEX. Values are in
+promilles (same as \type{\mag}). The default value of this primitive
+is~1000, defining a device gamma value of~1.0.
+
+When \type{\pdfimageapplygamma} is set to~1, then whenever a \PNG\ image
+is included, \PDFTEX\ applies a gamma correction. This correction is
+based on the value of the \type{\pdfgamma} primitive and the `assumed
+device gamma' that is derived from the value embedded in the actual
+image. If no embedded value can be found in the \PNG\ image, then the
+value of \type{\pdfimagegamma} is used instead.
+If specified, the parameter must appear before any data is written to the
+\PDF\ output.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfimagegamma} \Whatever{integer}}}
+\bookmark{\tex{pdfimagegamma}}
+
+This primitive gives a default `assumed gamma' value for \PNG\ images.
+Values are in promilles (same as for \type{\pdfamma}). The default value
+of this primitive is~2200, implying an assumed gamma value of~2.2.
+
+When \PDFTEX\ is applying gamma corrections, images that do not have an
+embedded `assumed gamma' value are assumed to have been created for
+a device with a gamma of 2.2. Experiments show that this default setting
+is correct for a large number of images; however, if your images come
+out too dark, you probably want to set \type{\pdfimagegamma} to a lower
+value, like~1000.
+If specified, the parameter must appear before any data is written to the
+\PDF\ output.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfpxdimen} \Whatever{dimen}}}
+\bookmark{\tex{pdfpxdimen}}
+
+While working with bitmap graphics or typesetting electronic documents,
+it might be convenient to base dimensions on pixels rather than \TeX's
+standard units like \type{pt} or \type{em}. For this purpose, \PDFTEX\
+provides an extra unit called \type{px} that takes the dimension given to
+the \type{\pdfpxdimen} primitive. In example, to make the unit \type{px}
+corresponding to 96\,dpi pixel density (then 1\,px~=~72/96\,bp), one
+can do the following calculation:
+
+\starttyping
+\pdfpxdimen=1in % 1 dpi
+\divide\pdfpxdimen by 96 % 96 dpi
+\hsize=1200px
+\stoptyping
+
+Then \type{\hsize} amounts to 1200~pixels in 96\,dpi, which is
+exactly 903.375\,pt (but \TeX\ rounds it to 903.36914\,pt). The
+default value of \type{\pdfpxdimen} is 1\,bp, corresponding to a pixel
+density of 72\,dpi. This primitive is completely independent from the
+\type{\pdfimageresolution} and \type{\pdfpkresolution} parameters.
+\introduced{1.30.0} It used to be an integer register that gave
+the dimension 1\,px as number of scaled points, defaulting to 65536
+(1\,px equal to 65536\,sp~$=$~1\,pt). Starting with \PDFTEX\ 1.40.0,
+\type{\pdfpxdimen} is now a real dimension parameter.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinclusioncopyfonts} \Whatever{integer}}}
+\bookmark{\tex{pdfinclusioncopyfonts}}
+
+If positive, this parameter forces \PDFTEX\ to include fonts from a \PDF\
+file loaded with \type{\pdfximage}, even if those fonts are available on
+disk. Bigger files might be created, but included \PDF\ files are sure to
+be embedded with the adequate fonts; indeed, the fonts on disk might be
+different from the embedded ones, and glyphs might be missing.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsuppresswarningpagegroup}
+ \Whatever{integer}}}
+\bookmark{\tex{pdfsuppresswarningpagegroup}}
+
+Ordinarily, \PDFTEX\ gives a warning when more than one included \PDF\
+file has a so-called ``page group object'' (\type{/Group}), because only
+one can ``win'' --- that is, be propagated to the page level. Usually
+the page groups are identical, but when they are not, the result is
+unpredictable. It would be ideal if \PDFTEX\ in fact detected whether
+the page groups were the same and only gave the warning in the
+problematic case; unfortunately, this is not easy (a patch would be
+welcome). Nevertheless, often one observes that there is no actual
+problem. Then seeing the warnings on every run is just noise, and can
+be suppressed by setting this parameter to a positive number.
+\introduced{1.40.15}
+
+%***********************************************************************
+
+\subsection{Annotations}
+
+\PDF\ 1.4 provides four basic kinds of annotations:
+
+\startitemize[packed]
+\item hyperlinks, general navigation
+\item text clips (notes)
+\item movies
+\item sound fragments
+\stopitemize
+
+The first type differs from the other three in that there is a designated
+area involved on which one can click, or when moved over some action occurs.
+\PDFTEX\ is able to calculate this area, as we will see later. All
+annotations can be supported using the next two general annotation
+primitives.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfannot} \Something{annot type spec}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfannot}}
+
+This command appends a whatsit node corresponding to an annotation to
+the list being built. The dimensions of the annotation can be controlled
+via the \Something{rule spec}. The default values are running for all
+width, height and depth. When an annotation is written out, running
+dimensions will take the corresponding values from the box containing
+the whatsit node representing the annotation. The \Something{general
+text} is inserted as raw \PDF\ code to the contents of annotation. The
+annotation is written out only if the corresponding whatsit node is
+searched at shipout time.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastannot} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastannot}}
+
+This primitive returns the object number of the last annotation created by
+\type{\pdfannot}. These two primitives allow users to create any annotation
+that cannot be created by \type{\pdfstartlink} (see below).
+
+%***********************************************************************
+
+\subsection[linking]{Destinations and links}
+
+The first type of annotation, mentioned above, is implemented by three
+primitives. The first one is used to define a specific location as being
+referred to. This location is tied to the page, not the exact location on the
+page. The main reason for this is that \PDF\ maintains a dedicated list of
+these annotations |<|and some more when optimized|>| for the sole purpose of
+speed.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfdest} \Something{dest spec}
+ \Modelist{h, v, m}}}
+\bookmark{\tex{pdfdest}}
+
+This primitive appends a whatsit node which establishes a destination
+for links and bookmark outlines; the link is identified by either
+a number or a symbolic name, and the way the viewer is to display the
+page must be specified in \Something{dest type}\unkern, which must be
+one of those mentioned in \in{table}[appearance].
+
+\startbuffer
+\starttabulate[|l|l|]
+\HL
+\NC \bf keyword \NC \bf meaning \NC\NR
+\HL
+\NC \tt fit \NC fit the page in the window \NC\NR
+\NC \tt fith \NC fit the width of the page \NC\NR
+\NC \tt fitv \NC fit the height of the page \NC\NR
+\NC \tt fitb \NC fit the \quote{Bounding Box} of the page \NC\NR
+\NC \tt fitbh \NC fit the width of \quote{Bounding Box} of the page \NC\NR
+\NC \tt fitbv \NC fit the height of \quote{Bounding Box} of the page \NC\NR
+\NC \tt xyz \NC goto the current position (see below) \NC\NR
+\HL
+\stoptabulate
+\stopbuffer
+
+\placetable
+ [here][appearance]
+ {Options for display of outline and destinations.}
+ {\getbuffer}
+
+The specification \Literal{xyz} can optionally be followed by \Literal
+{zoom} \Something{integer} to provide a fixed zoom||in. The \Something
+{integer} is processed like \TEX\ magnification, i.\,e.\ 1000 is the
+normal page view. When \Literal{zoom} \Something{integer} is given,
+the zoom factor changes to 0.001 of the \Something{integer} value,
+otherwise the current zoom factor is kept unchanged.
+
+The destination is written out only if the corresponding whatsit node is
+searched at shipout time.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfstartlink}
+ \Optional{\Something{rule spec}}
+ \Optional{\Something{attr spec}}
+ \Something{action spec}
+ \Modelist{h, m}
+}}
+\bookmark{\tex{pdfstartlink}}
+
+This primitive is used along with \type{\pdfendlink} and appends
+a whatsit node corresponding to the start of a hyperlink. The whatsit
+node representing the end of the hyperlink is created by
+\type{\pdfendlink}. The dimensions of the link are handled in the
+similar way as in \type{\pdfannot}. Both \type{\pdfstartlink} and
+\type{\pdfendlink} must be in the same level of box nesting. A hyperlink
+with running width can be multi||line or even multi||page, in which case
+all horizontal boxes with the same nesting level as the boxes containing
+\type{\pdfstartlink} and \type{\pdfendlink} will be treated as part of
+the hyperlink. The hyperlink is written out only if the corresponding
+whatsit node is searched at shipout time.
+
+Additional attributes, which are explained in great detail in the
+\PDFReference, can be given via \Something{attr spec}\unkern. Typically,
+the attributes specify the color and thickness of any border around
+the link. Thus \typ {/C [0.9 0 0] /Border [0 0 2]} specifies a color
+(in \RGB) of dark red, and a border thickness of 2~points.
+
+While all graphics and text in a \PDF\ document have relative positions,
+annotations have internally hard||coded absolute positions. Again this
+is for the sake of speed optimization. The main disadvantage is that these
+annotations do {\em not} obey transformations issued by \type
+{\pdfliteral}'s.
+
+The \Something{action spec} specifies the action that should be performed
+when the hyperlink is activated while the \Something{user-action spec}
+performs a user||defined action. A typical use of the latter is to specify
+a \URL, like \typ {/S /URI /URI (http://www.tug.org/)}, or a named action like
+\typ {/S /Named /N /NextPage}.
+
+A \Something{goto-action spec} performs a GoTo action. Here \Something
+{numid} and \Something{nameid} specify the destination identifier (see
+below). The \Something{page spec} specifies the page number of the
+destination, in this case the zoom factor is given by \Something{general
+text}\unkern. A destination can be performed in another \PDF\ file by
+specifying \Something{file spec}\unkern, in which case
+\Something{newwindow spec} specifies whether the file should be opened
+in a new window. A \Something{file spec} can be either a \type{(string)}
+or a \type{<<dictionary>>}. The default behavior of the
+\Something{newwindow spec} depends on the browser setting.
+
+A \Something{thread-action spec} performs an article thread reading. The
+thread identifier is similar to the destination identifier. A thread can be
+performed in another \PDF\ file by specifying a \Something{file spec}\unkern.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfendlink} \Modelist{h, m}}}
+\bookmark{\tex{pdfendlink}}
+
+This primitive ends a link started with \type{\pdfstartlink}. All text
+between \type{\pdfstartlink} and \type{\pdfendlink} will be treated as part
+of this link. \PDFTEX\ may break the result across lines (or pages), in which
+case it will make several links with the same content.
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastlink} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastlink}}
+
+This primitive returns the object number of the last link created by
+\type{\pdfstartlink} (analogous to \type{\pdflastannot}).
+\introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdflinkmargin} \Whatever{dimen}}}
+\bookmark{\tex{pdflinkmargin}}
+
+This dimension parameter specifies the margin of the box representing
+a hyperlink and is read when a page containing hyperlinks is shipped out.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfdestmargin} \Whatever{dimen}}}
+\bookmark{\tex{pdfdestmargin}}
+
+Margin added to the dimensions of the rectangle around the destinations.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsuppresswarningdupdest} \Whatever{integer}}}
+\bookmark{\tex{pdfsuppresswarningdupdest}}
+
+Ordinarily, \PDFTEX\ gives a warning when the same destination is used
+more than once. However, due to problematic macro packages, sometimes a
+document may end up producing the warning through no fault of its own,
+and fixing the macros may well not be trivial. Then seeing the warnings
+on every run is just noise, and can be suppressed by setting this
+parameter to a positive number. \introduced{1.40.13}
+
+%***********************************************************************
+
+\subsection{Bookmarks}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfoutline}
+ \Optional{\Something{attr spec}}
+ \Something{action spec}
+ \Optional{\Literal{count} \Something{integer}}
+ \Something{general text}
+ \Modelist{h, v, m}
+}}
+\bookmark{\tex{pdfoutline}}
+
+This primitive creates an outline (or bookmark) entry. The first parameter
+specifies the action to be taken, and is the same as that allowed for \type
+{\pdfstartlink}. The \Something{count} specifies the number of direct
+subentries under this entry; specify~0 or omit it if this entry has no
+subentries. If the number is negative, then all subentries will be closed and
+the absolute value of this number specifies the number of subentries. The
+\Something{text} is what will be shown in the outline window. Note that this
+is limited to characters in the \PDF\ Document Encoding vector. The outline
+is written to the \PDF\ output immediately.
+
+%***********************************************************************
+
+\subsection{Article threads}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfthread} \Optional{\Something{rule spec}}
+ \Optional{\Something{attr spec}} \Something{id spec} \Modelist{h, v, m}}}
+\bookmark{\tex{pdfthread}}
+
+Defines a bead within an article thread. Thread beads with same
+identifiers (spread across the document) will be joined together.
+
+\pdftexprimitive{\Syntax{\Tex{\pdftstartthread}
+ \Optional{\Something{rule spec}}
+ \Optional{\Something{attr spec}}
+ \Something{id spec} \Modelist{v, m}}}
+\bookmark{\tex{pdfstartthread}}
+
+This uses the same syntax as \type{\pdfthread}, apart that it must be
+followed by a \type{\pdfendthread}. \type{\pdfstartthread} and the
+corresponding \type{\pdfendthread} must end up in vboxes with the same
+nesting level; all vboxes between them will be added into the thread.
+Note that during output runtime if there are other newly created
+boxes which have the same nesting level as the vbox/vboxes containing
+\type{\pdfstartthread} and \type{\pdfendthread}, they will be also added
+into the thread, which is probably not what you want. To avoid such
+unconsidered behavior, it's often enough to wrap boxes that shouldn't
+belong to the thread by a box to change their box nesting level.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfendthread} \Modelist{v, m}}}
+\bookmark{\tex{pdfendthread}}
+
+This ends an article thread started before by \type{\pdfstartthread}.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfthreadmargin} \Whatever{dimen}}}
+\bookmark{\tex{pdfthreadmargin}}
+
+Specifies a margin to be added to the dimensions of a bead within
+an article thread.
+
+%***********************************************************************
+
+\subsection{Literals and specials}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfliteral}
+ \Optional{\Something{pdfliteral spec}}
+ \Something{general text}
+ \Modelist{h, v, m}
+ }}
+\bookmark{\tex{pdfliteral}}
+
+Like \type{\special} in normal \TEX, this command inserts raw
+\PDF\ code into the output. This allows support of color and text
+transformation. This primitive is heavily used in the \METAPOST\
+inclusion macros. Normally \PDFTEX\ ends a text section in the \PDF\
+output and sets the transformation matrix to the current location on the
+page before inserting \Something{general text}\unkern, however this can be
+turned off by giving the optional keyword \Literal{direct}. This command
+appends a whatsit node to the list being built. \Something{general text}
+is expanded when the whatsit node is created and not when it is shipped
+out, as with \type{\special}.
+
+Starting with version 1.30.0, \PDFTEX\ allows to use a new keyword
+\type{page} instead of \type{direct}. Both modify the default behavior
+of \type{\pdfliteral}, avoiding translation of the coordinates space
+before inserting the literal code. The difference is that the \type{page}
+keyword instructs \PDFTEX\ to close a \type{BT ET} text block before
+inserting anything. It means that the literal code inserted refers to the
+origin (lower||left corner of the page) and can be safely enclosed with
+\type{q Q}. Note, that in most cases using \type{q Q} operators inside
+\type{\pdfliteral} with \type{direct} keyword will produce corrupted
+\PDF\ output, as the \PDF\ standard doesn't allow to do anything like
+this within a \type{BT ET} block.
+
+% HE: \unkern is a kludge here; wanted to have tight "{pdf:"
+\pdftexprimitive{\Syntax{\Tex{\special} \Lbrace\unkern\Literal{pdf:}
+ \Something{text} \Rbrace}}
+\bookmark{\tex{special}}
+
+This is equivalent to \Syntax{\Tex{\pdfliteral} \Lbrace \Something{text}
+\Rbrace}.
+
+\pdftexprimitive{\Syntax{\Tex{\special} \Lbrace\unkern\Literal{pdf:direct:}
+ \Something{text} \Rbrace}}
+\bookmark{\tex{special\ direct}}
+
+This is equivalent to \Syntax{\Tex{\pdfliteral} \Literal{direct} \Lbrace
+\Something{text} \Rbrace}.
+
+\pdftexprimitive{\Syntax{\Tex{\special} \Lbrace\unkern\Literal{pdf:page:}
+ \Something{text} \Rbrace}}
+\bookmark{\tex{special\ page}}
+
+This is equivalent to \Syntax{\Tex{\pdfliteral} \Literal{page} \Lbrace
+\Something{text} \Rbrace}.
+
+%***********************************************************************
+
+\subsection{Strings}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfescapestring} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfescapestring}}
+
+Starting with version 1.30.0, \PDFTEX\ provides a mechanism for converting
+a general text into \PDF\ string. Many characters that may be needed inside
+such a text (especially parenthesis), have a special meaning inside a \PDF\
+string object and thus, can't be used literally. The primitive replaces each
+special \PDF\ character by its literal representation by inserting a backslash
+before that character. Some characters (\eg\ space) are also converted into
+3||digit octal number. In example, \type{\pdfescapestring{Text (1)}} will be
+expanded to \type{Text\040\(1\)}. This ensures a literal interpretation of the
+text by the \PDF\ viewer.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfescapename} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfescapename}}
+
+In analogy to \type{\pdfescapestring}, \type{\pdfescapename} replaces each
+special \PDF\ character inside the general text by its hexadecimal
+representation preceded by \type{#} character. This ensures the proper
+interpretation of the text if used as a \PDF\ name object. In example,
+\type{Text (1)} will be replaced by \type{Text#20#281#29}.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfescapehex} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfescapehex}}
+
+This command converts each character of \Something{general text} into its
+hexadecimal representation. Each character of the argument becomes a pair of
+hexadecimal digits. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfunescapehex} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfunescapehex}}
+
+This command treats each character pair of \Something{general text} as
+a hexadecimal number and returns an \ASCII\ character of this code.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfstrcmp} \Something{general text}
+ \Something{general text} \Whatever{expandable}}}
+\bookmark{\tex{pdfstrcmp}}
+
+This command compares two strings and expands to \type{0} if the strings
+are equal, to \type{-1} if the first string ranks before the second, and
+to \type{1} otherwise. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfmatch} \Optional{\Literal{icase}}
+ \Optional{\Literal{subcount} \Something{integer}} \Something{general text}
+ \Something{general text} \Whatever{expandable}}}
+\bookmark{\tex{pdfmatch}}
+
+This command implements pattern matching (using the syntax of \POSIX\
+extended regular expressions). The first \Something{general text} is a
+pattern and the second is a string. The command expands to \type{-1} if
+the pattern is invalid, to \type{0} if no match is found, and to
+\type{1} if a match is found. With the \type{icase} option, the matching
+is case-insensitive. The \type{subcount} option sets the size of the
+table storing the found (sub)patterns; its default is 10.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastmatch} \Something{integer}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdflastmatch}}
+
+The matches found with \type{\pdfmatch} are stored in a table. This
+command returns the entry for \Something{integer}, in the format
+\Something{position}\type{->}\Something{string}; \Something{position} is
+the position of the match (starting at zero) or \type{-1} if no match
+was found, and \Something{string} is the matched substring.
+
+Entry~0 contains the match as a whole; the subsequent entries contain
+submatches corresponding to the subpatterns, up to \type{subcount-1}.
+
+If \Something{integer} is less than zero, an error is given.
+
+For instance:
+
+\starttyping
+\pdfmatch subcount 3 {ab(cd)*ef(gh)(ij)}{abefghij}
+\pdflastmatch0 % "0->abefghij"
+\pdflastmatch1 % "-1->"
+\pdflastmatch2 % "4->gh"
+\pdflastmatch3 % "-1->"
+\stoptyping
+
+Entry~1 is empty because no match was found for \type{cd}, and entry~3
+is empty because it exceeds the table's size as set by \type{subcount}.
+\introduced{1.30.0}
+
+%***********************************************************************
+
+\subsection{Numbers}
+
+\pdftexprimitive{\Syntax{\Tex{\ifpdfabsnum} \Whatever{expandable}}}
+\bookmark{\tex{ifpdfabsnum}}
+
+This conditional works like the standard \type{\ifnum}, except that it
+compares absolute values of numbers. Although it seems to be a trivial
+shortcut for a couple of \type{\ifnum x<0} tests, as a primitive it is
+considerably more friendly in usage and works a bit faster.
+\introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\ifpdfabsdim} \Whatever{expandable}}}
+\bookmark{\tex{ifpdfabsdim}}
+
+Analogous to \type{\ifpdfabsnum}, this conditional works like
+\type{\ifdim}, except that it compares absolute values of
+dimensions. \introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfuniformdeviate} \Something{number}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfuniformdeviate}}
+
+Generate a uniformly-distributed random integer value between 0
+(inclusive) and \Something{number} (exclusive). This primitive expands
+to a list of tokens. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfnormaldeviate} \Whatever{expandable}}}
+\bookmark{\tex{pdfnormaldeviate}}
+
+Generate a normally-distributed random integer with a mean of~0 and
+standard deviation 65\,536. That is, about 68\% of the time, the result
+will be between $-65536$ and $65536$ (one standard deviation away from
+the mean). About 95\% of results will be within two standard
+deviations, and 99.7\% within three. This primitive expands to a list
+of tokens. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfrandomseed} \Whatever{read||only integer}}}
+\bookmark{\tex{pdfrandomseed}}
+
+You can use \type{\the\pdfrandomseed} to query the current seed value,
+so you can \eg\ write the value to the log file. The initial value of
+the seed is derived from the system time, and is not more than
+1\,000\,999\,999 (this ensures that the value can be used with commands
+like \type{\count}). \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsetrandomseed} \Something{number}}}
+\bookmark{\tex{pdfsetrandomseed}}
+
+Set the random seed (\type{\pdfrandomseed}) to a specific value,
+allowing you to replay sequences of semi-randoms at a later moment.
+\introduced{1.30.0}
+
+%***********************************************************************
+
+\subsection{Timekeeping}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfelapsedtime} \Whatever{read||only integer}}}
+\bookmark{\tex{pdfelapsedtime}}
+
+Return a number that represents the time elapsed from the moment of the
+start of the run. The elapsed time is returned in `scaled seconds',
+meaning seconds divided by 65536, \eg\ \PDFTEX\ has run for
+\the\pdfelapsedtime\ `scaled seconds' when this paragraph was
+typeset. Of course, the command will never return a value greater than
+the highest number available in \TeX: if the time exceeds 32767 seconds,
+the constant value $2^{31}-1$ will be returned. \introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfresettimer}}}
+\bookmark{\tex{pdfresettimer}}
+
+Reset the internal timer so that \type{\pdfelapsedtime}
+starts returning micro||time from~0 again. \introduced{1.30.0}
+
+%***********************************************************************
+
+\subsection{Files}
+
+\pdftexprimitive{\Syntax{\Tex{\pdffilemoddate} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdffilemoddate}}
+
+Expands to the modification date of file \Something{general text} in the same
+format as for \type{\pdfcreationdate}, \eg\ it's {\tt \pdffilemoddate
+{./pdftex-t.tex}} for the source of this manual.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdffilesize} \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdffilesize}}
+
+Expands to the size of file \Something{general text}, \eg\ it's {\tt
+\pdffilesize {./pdftex-t.tex}} for the source of this manual.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfmdfivesum} file \Something{general text}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfmdfivesum\ file}}
+
+Expands to the \MDFIVE\ of file \Something{general text} in uppercase
+hexadecimal format (same as \type{\pdfescapehex}), \eg\ it's {\tt
+\pdfmdfivesum file {./pdftex-t.tex}} for the source of this manual.
+\introduced{1.30.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdffiledump} \Optional{\Literal{offset}
+ \Something{number}} \Optional{\Literal{length}
+ \Something{number}} \Something{general text} \Whatever{expandable}}}
+\bookmark{\tex{pdffiledump}}
+
+Expands to the dump of the file \Something{general text} in uppercase
+hexadecimal format (same as \type{\pdfescapehex}), starting at offset
+\Something{number} or 0 with length \Something{number}, if given. The first ten
+bytes of the source of this manual are {\tt \pdffiledump length 10
+{./pdftex-t.tex}}. \introduced{1.30.0}
+
+%***********************************************************************
+
+\subsection{Color stack}
+
+\PDFTEX\ 1.40.0 comes with color stack support (actually any graphic state
+stack).
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcolorstackinit} \Optional{\Literal{page}}
+ \Optional{\Literal{direct}} \Something{general text} \Whatever{expandable}}}
+\bookmark{\tex{pdfcolorstackinit}}
+
+The primitive initializes a new graphic stack and returns its number. Optional
+\Literal{page} keyword instructs \PDFTEX\ to restore the graphic at the
+beginning of every new page. Also optional \Literal{direct} has the same effect
+as for \Tex{\pdfliteral} primitive. \introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcolorstack} \Something{stack number}
+ \Something{stack action} \Something{general text}}}
+\bookmark{\tex{pdfcolorstack}}
+
+The command operates on the stack of a given number. If \Something{stack
+action} is \Literal{push} keyword, the new value provided as
+\Something{general text} is inserted into the top of the graphic stack
+and becomes the current stack value. If followed by \Literal{pop}, the
+top value is removed from the stack and the new top value becomes the
+current. \Literal{set} keyword replaces the current value with
+\Something{general text} without changing the stack size.
+\Literal{current} keyword instructs just to use the current stack value
+without modifying the stack at all. \introduced{1.40.0}
+
+\subsection{Transformations}
+
+Since the content of \Tex{\pdfliteral} is not interpreted anyhow, any
+transformation inserted directly into the content stream, as well as saving
+and restoring the current transformation matrix, remains unnoticed by
+\PDFTEX\ positioning mechanism. As a consequence, links and other annotations
+(that are formed in \PDF\ as different layer then the page content) are not
+affected by such user-defined transformations. \PDFTEX\ 1.40.0 solves this
+problem with three new primitives.
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsetmatrix}}}
+\bookmark{\tex{pdfsetmatrix}}
+
+Afine transformations are normally expressed with six numbers. First
+four (no unit) values defining scaling, rotating and skewing, plus two
+extra dimensions for shifting. Since the translation is handled by \TeX\
+itself, \Tex{\pdfsetmatrix} primitive expects as an argument a string
+containing just the first four numbers of the transformation separated
+by a space and assumes two position coordinates to be~0. In example,
+\type{\pdfsetmatrix{0.87 -0.5 0.5 0.87}} rotates the current space by 30
+degrees, inserting \type{0.87 -0.5 0.5 0.87 0 0 cm} into the content
+stream. \introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsave}}}
+\bookmark{\tex{pdfsave}}
+
+The command saves the current transformation by inserting \type{q}
+operator into the content stream. \introduced{1.40.0}
+
+\pdftexprimitive{\Syntax{\Tex{\pdfrestore}}}
+\bookmark{\tex{pdfrestore}}
+
+The command restores previously saved transformation by inserting \type{Q}
+operator into the content stream. One should keep in mind that \Tex{\pdfsave}
+and \Tex{\pdfrestore} pairs should always be properly nested and should start
+and end at the same group level. \introduced{1.40.0}
+
+%***********************************************************************
+
+\subsection{Miscellaneous}
+
+\pdftexprimitive{\Syntax{\tex {ifincsname} \Whatever{expandable}}}
+\bookmark{\tex{ifincsname}}
+
+This conditional is true if evaluated inside \type{\csname ... \endcsname},
+and false otherwise.
+
+
+\pdftexprimitive{\Syntax{\tex {ifpdfprimitive} \Something{control sequence}
+ \Whatever{expandable}}}
+\bookmark{\tex{ifpdfprimitive}}
+
+This condition checks if the following control sequence has its
+primitive meaning. If it has, \type{\ifpdfprimitive} returns true. In
+any other case (redefined, made \type{\undefined}, has never been
+primitive) false is returned. \introduced{1.40.0}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfcreationdate} \Whatever{expandable}}}
+\bookmark{\tex{pdfcreationdate}}
+
+Expands to the date string \PDFTEX\ uses in the info dictionary of the
+document, \eg\ for this file {\tt\pdfcreationdate}. \introduced{1.30.0}
+
+
+\pdftexprimitive{\Syntax{\tex {pdfdraftmode} \Whatever{integer}}}
+\bookmark{\tex{pdfdraftmode}}
+
+When set to 1 (or set by the command-line switch \type{-draftmode})
+\PDFTEX\ doesn't write the output \PDF\ file and doesn't actually read any
+images but does everything else (including writing auxiliary files),
+thus speeding up compilations when you know you need an extra run but
+don't care about the output, \eg\ just to get the \BIBTEX\ references
+right. \introduced{1.40.0}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfinsertht} \Something{integer}
+ \Whatever{expandable}}}
+\bookmark{\tex{pdfinsertht}}
+
+If \Something{integer} is the number of an insertion class, this command
+returns the height of the corresponding box at the current time.
+For instance, the following returns \type{12pt} in plain \TEX:
+
+\starttyping
+Abc\footnote*{Whatever.}\par
+\pdfinsertht\footins
+\stoptyping
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastxpos} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastxpos}}
+
+This primitive returns an integer number representing the absolute $x$
+coordinate of the last point marked by \type{\pdfsavepos}. The unit is
+`scaled points' (sp).
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdflastypos} \Whatever{read||only integer}}}
+\bookmark{\tex{pdflastypos}}
+
+Completely analogous to \type{\pdflastxpos}, returning the $y$ coordinate.
+
+
+\pdftexprimitive{\Syntax{\tex {pdfprimitive} \Something{control sequence}}}
+\bookmark{\tex{pdfprimitive}}
+
+This command executes the primitive meaning of the following control
+sequence, regardless of whether the control sequence has been redefined
+or made undefined. If the primitive was expandable, \type{\pdfprimitive}
+expands also. On the other hand, if the following control sequence never
+was a primitive, nothing happens and no error is raised. (In some
+versions of \PDFTEX\ prior to 1.40.19, an error was wrongly given.)
+\introduced{1.40.0}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfretval} \Whatever{read||only integer}}}
+\bookmark{\tex{pdfretval}}
+
+Set to $-1$ if \type{\pdfobj} ignores an invalid object number. Perhaps
+this will be used to store the error status of other primitives in the
+future.
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfsavepos} \Modelist{h, v, m}}}
+\bookmark{\tex{pdfsavepos}}
+
+This primitive marks the current absolute ($x,y$) position on the
+media, with the reference point in the lower left corner. It is active
+only during page shipout, when the page is finally assembled. The
+position coordinates can then be retrieved by the \type{\pdflastxpos}
+and \type{\pdflastypos} primitives, and \eg\ written out to some
+auxiliary file. The coordinates can be used only after the current
+\type{\shipout} has been finalized, therefore normally two \PDFTEX\
+runs are required to utilize these primitives. Starting with
+\PDFTEX\ 1.40.0, this mechanism can be used also while running
+in \DVI\ mode.
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdfshellescape} \Whatever{read||only integer}}}
+\bookmark{\tex{pdfshellescape}}
+
+This primitive is~1 if \type{\write18} is enabled, 2 if it is
+restricted, and 0 otherwise. (\type{\write18} was
+\ifnum\pdfshellescape=0\relax not \fi enabled when this manual was
+typeset.) \introduced{1.30.0}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdftexbanner} \Whatever{expandable}}}
+\bookmark{\tex{pdftexbanner}}
+
+Returns the \PDFTEX\ banner message, \eg\ for the version used here:
+{\tt \pdftexbanner}. \introduced{1.20a}
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdftexrevision} \Whatever{expandable}}}
+\bookmark{\tex{pdftexrevision}}
+
+\def\versplit#1#2#3{#1.#2#3}
+
+Returns the revision number of \PDFTEX, \eg\ for \PDFTEX\ version
+\expandafter\versplit\the\pdftexversion.\pdftexrevision\ (used to produce
+this document), it returns the number {\tt \pdftexrevision}.
+
+
+\pdftexprimitive{\Syntax{\Tex{\pdftexversion} \Whatever{read||only integer}}}
+\bookmark{\tex{pdftexversion}}
+
+Returns the version of \PDFTEX\ multiplied by 100, \eg\ for \PDFTEX\
+version \expandafter\versplit\the\pdftexversion.\pdftexrevision\ used to
+produce this document, it returns {\tt \number\pdftexversion}.
+
+
+\pdftexprimitive{\Syntax{\Tex{\quitvmode}}}
+\bookmark{\tex{quitvmode}}
+
+The primitive instructs \PDFTEX\ to quit vertical mode and start
+typesetting a paragraph. \type{\quitvmode} has the same effect as
+\type{\leavevmode} definition from \type{plain} macro package. Note
+however, that \type{\leavevmode} may conflict with \type{\everypar}
+tokens list. No such risk while using \type{\quitvmode} instead.
+\introduced{1.21a}
+
+
+\pdftexprimitive{\Syntax{\Tex{\vadjust}
+ \Optional{\Something{pre spec}}
+ \Something{filler}
+ \Lbrace \Something{vertical mode material} \Rbrace
+ \Modelist{h, m}
+}}
+\bookmark{\tex{vadjust}}
+
+The \type{\vadjust} implementation of \PDFTEX\ adds an optional
+qualifier \Something{pre spec}, which is simply the string \type{pre}, to
+the original \TEX\ primitive with the same name. If
+no \type{pre} is given, \type{\vadjust} behaves exactly as the original
+(see the \TEX book, p.~281): it appends an adjustment item created
+from \Something{vertical mode material} to the current list {\em after}
+the line in which \type{\vadjust} appears. However, with the qualifier
+\type{pre}, the adjustment item is put {\em before} the line in which
+\type{\vadjust pre} appears.
+
+%***********************************************************************
+
+\section{Graphics}
+
+\PDFTEX\ supports inclusion of pictures in \PNG, \JPEG, \JBIGTWO, and
+\PDF\ format; a few differences between these are discussed below. The
+most common technique with \TEX\ |<|the inclusion of \EPS\ figures|>|
+is replaced by \PDF\ inclusion. \EPS\ files can be converted to \PDF\ by
+\GHOSTSCRIPT, Adobe Distiller or other \POSTSCRIPT||to||\PDF\ converters.
+
+The \PDF\ format is currently the most versatile source format for
+graphics embedding. \PDFTEX\ allows to insert arbitrary pages from
+\PDF\ files with their own fonts, graphics, and pixel images into
+a document. The cover page of this manual is an example of such an insert,
+being a one page document generated by \PDFTEX.
+
+By default \PDFTEX\ takes the BoundingBox of a \PDF\ file from its CropBox
+if available, otherwise from its MediaBox. This can be influenced by
+the \Something{pdf box spec} option to the \type{\pdfximage} primitive,
+or by setting the \type{\pdfpagebox} or \type{\pdfforcepagebox} primitives to
+a value corresponding to the wanted box type.
+
+To get the right BoundingBox from a \EPS\ file, before converting to \PDF,
+it is necessary to transform the \EPS\ file so that the start point is
+at the (0,0)~coordinate and the page size is set exactly corresponding
+to the BoundingBox. A \PERL\ script (\EPSTOPDF) for this purpose has been
+written. The \TEXUTIL\ utility script and the \PSTOPDF\ program that comes
+with \GHOSTSCRIPT\ can so a similar job. (Concerning this conversion,
+they can handle complete directories, remove some garbage from files,
+takes precautions against duplicate conversion, etc.)
+
+The lossless compressing \PNG\ format is great for embedding crisp pixel
+graphics (\eg\ line scans, screen shots). Since \PDFTEX\ 1.30.0 also the
+alpha-channel of \PNG\ images is processed if available; this allows
+embedding of images with simple transparency. The \PNG\ format does not
+support the CMYK color model, which is sometimes required for print media
+(this often can be replaced by four component \JPEG\ in high quality or
+lossless compression mode). Photos in \PNG\ format have a rather weak
+compression; here the \JPEG\ format is preferable.
+
+Embedding \PNG\ images in the general case requires \PDFTEX\ to uncompress
+the pixel array and to re||compress it to the \PDF\ requirements; this
+process often takes a noticeable amount of time. Since \PDFTEX\ 1.30.0
+there is now a fast \PNG\ embedding mode that goes without uncompressing;
+the image data are directly copied into the \PDF\ stream, resulting in
+a much higher embedding speed. However this mode is only activated, if
+the image array structure of the \PNG\ file is compatible with the \PDF\
+image structure (\eg\ an interlaced \PNG\ image requires uncompressing to
+re||arrange the image lines). Luckily it seems that the most common \PNG\
+files also allow fast copying. The use of gamma correction disables fast
+copying, as it requires calculations with individual pixels. Whether the
+fast copy mode is used for a \PNG\ image can be seen from the log file,
+which then shows the string `(PNG copy)' after the \PNG\ file name.
+
+The \JPEG\ format is normally used in lossy mode; then it's ideal for
+embedding photos. It's not recommended for crisp images from synthetic
+sources with a limited amount of colors. Both \JFIF\ and \EXIF\ are
+supported for additional information.
+
+The \JBIGTWO\ format works only for bitonal (black and white) pixel
+images like scanned line and text documents, but for these it has
+typically a much higher compression ratio than the other two pixel
+image formats. The \JBIGTWO\ format is part of the \PDF\ standard since
+version 1.5; native \JBIGTWO\ image inclusion is available in \PDFTEX\
+since version 1.40.0. A \JBIGTWO\ file might contain many images, which
+gives an even better compression ratio than with a single image per file,
+as \JBIGTWO\ encoders can exploit similarities between bit patterns over
+several images. Encoders for \JBIGTWO\ can operate in lossy as well as
+lossless modes. Only recently a free \JBIGTWO\ encoder has been written
+and made available, see \from[jbig2enc].
+
+Other options for graphics in \PDFTEX\ are:
+
+\description {\LATEX\ picture mode} Since this is implemented simply in terms
+of font characters, it works in exactly the same way as usual.
+
+\description {Xy||pic} If the \POSTSCRIPT\ back||end is not requested, Xy||pic
+uses its own Type~1 fonts, and needs no special attention.
+
+\description {tpic} The \quote {tpic} \type{\special} commands (used in some
+macro packages) can be redefined to produce literal \PDF, using some macros
+written by Hans Hagen.
+
+\description {\METAPOST} Although the output of \METAPOST\ is \POSTSCRIPT,
+it is in a highly simplified form, and a \METAPOST\ to \PDF\ conversion
+(\MPTOPDF, written by Hans Hagen and Tanmoy Bhattacharya) is implemented
+as a set of macros which reads \METAPOST\ output and supports all of
+its features.
+
+For new work, the \METAPOST\ route is highly recommended. For the future,
+Adobe has announced that they will define a specification for \quote
+{encapsulated \PDF}.
+
+The inclusion of raw \POSTSCRIPT\ commands |<|a technique utilized
+by for instance the \type{pstricks} package|>| cannot directly be
+supported. Although \PDF\ is direct a descendant of \POSTSCRIPT, it
+lacks any programming language commands, and cannot deal with arbitrary
+\POSTSCRIPT.
+
+%***********************************************************************
+
+\section{Character translation}
+
+Characters that are input to \PDFTEX\ are subject to optional
+\TEX\ character translation (\TCX) under control of a \TCX\ file.
+The \TCX\ maps the input character codes (\eg\ from \type{\input} or
+\type{\read}) to the character codes as seen by \PDFTEX. This mapping
+takes place before the characters enter \PDFTEX's `mouth'. If no \TCX\
+file is read, the input characters enter \PDFTEX\ directly; no mapping
+is done.
+
+\TCX\ files consist of lines each containing one or two integer numbers
+in the range 0..255, either in decimal or hex notation.
+% strtol() C-function
+A comment sign \type{%} in a \TCX\ line starts a comment until the
+end of line. The first number in each line is for matching the input
+character code, the second, optional number is the corresponding \TEX\
+character code. If a line contains only one number, characters with
+this code enter \PDFTEX\ unchanged; no mapping is done.
+
+\TCX\ mapping also influences \PDFTEX\ output streams for \type{\message} and
+\type{\write}. Without \TCX\ mapping, only characters that are within
+the range 32..126 are flagged as `printable', meaning that these
+characters are output directly by \type{\message} and \type{\write}
+primitives. Characters outside the range 32..126 are instead output
+in escaped form, \eg\ as \type{^^A} for a character with code
+\type{0x01}. When a character code is mentioned in the 2nd column of the
+\TCX\ file, or as the only value in a line, it is flagged as `printable'.
+During \type{\message} and \type{\write}, output characters are mapped
+in reverse direction: they are looked up in the 2nd column of the \TCX\
+file and the corresponding values from the 1st column are output. Again,
+if a \PDFTEX\ character code is found as the only number in a line, no
+mapping is done. Mentioning a character code as the only number on
+a line has the sole purpose to flag this code `printable'; remember that
+character within the range 32..126 are `printable' anyway.
+
+The characters output into the \PDF\ file, \eg\ by \type{\pdfliteral}
+or \type{\special} primitives, are not subject to \TCX\ output remapping.
+
+Beware: Character translation interferes with the \ENCTEX\ primitives; to
+avoid surprises, don't use \ENCTEX\ and \TCX\ mapping at the same time.
+Further details about \TCX\ file loading can be found in the \TETEX\
+manual.
+
+%***********************************************************************
+
+\stopbodymatter
+
+%D We did use some abbreviations. Only those really used will end up in the
+%D following list.
+
+\startbackmatter
+
+\writebetweenlist[section]{\blank[line]}
+
+%***********************************************************************
+
+\section{Abbreviations}
+
+In this document we use numerous abbreviations. For convenience we mention
+their meaning here.
+
+\placelistofabbreviations
+
+%***********************************************************************
+
+\start \setupalign[nothanging,nohz]
+
+\section{Examples of HZ and protruding}
+
+In the following sections we will demonstrate \PDFTEX's protruding and
+\HZ\ features, using a text from E.~Tufte. This sample text has a lot
+of punctuation and often needs hyphenation. Former \PDFTEX\ versions
+had sometimes problems with combining these features, but from version
+1.21a on it should be ok. If you still encounter problems, please try
+to prepare a small test file that demonstrates the problem and send it
+to one of the maintainers.
+
+\startbuffer
+ \input tufte
+ \blank[big]
+ \startcolumns
+ \input tufte
+ \stopcolumns
+\stopbuffer
+
+\subsection{Normal} \start \getbuffer \stop
+\subsection{HZ} \start \setupalign[hz] \getbuffer \stop
+\subsection{Protruding} \start \setupalign[hanging] \getbuffer \stop
+\subsection{Both} \start \setupalign[hz,hanging] \getbuffer \stop
+
+\stop
+
+%***********************************************************************
+
+\section[sec.addpdfkeys]{Additional \PDF\ keys}
+
+{\em This section is based on the manual on keys written by Martin
+Schr\"oder, one of the maintainers of \PDFTEX.}
+
+A \PDF\ document should contain only the structures and attributes defined
+in the \PDF\ specification. However, the specification allows applications
+to insert additional keys, provided they follow certain rules.
+
+The most important rule is that developers have to register with Adobe
+prefixes for the keys they want to insert. Hans Hagen has registered the
+prefix \type{PTEX} for \PDFTEX.
+
+\PDFTEX\ generates an XObject for every included \PDF. The dictionary of
+this object contains these additional keys:
+
+\starttabulate[|lT|l|p|]
+\HL
+\NC \bf key \NC \bf type \NC meaning \NC \NR
+\HL
+\NC PTEX.FileName \NC string \NC The name of the included file as seen by
+ \PDFTEX. \NC \NR
+\NC PTEX.InfoDict \NC dictionary \NC The document information dictionary of the included
+ \PDF\ (an indirect object). \NC \NR
+\NC PTEX.PageNumber \NC integer \NC The page number of the included file. \NC \NR
+\HL
+\stoptabulate
+
+The \PDFReference\ says: \quotation {Although viewer applications can
+store custom metadata in the document information dictionary, it is
+inappropriate to store private content or structural information there;
+such information should be stored in the document catalog instead.}
+
+Although it would seem more natural to put this information in the
+document information dictionary, we have to obey the rules laid down in
+the \PDFReference. The following key ends up in the document catalog.
+
+\starttabulate[|lT|l|p|]
+\HL
+\NC \bf key \NC \bf type \NC meaning \NC \NR
+\HL
+\NC PTEX.Fullbanner \NC string \NC The full version of the \pt binary that
+produced the file as displayed by {\tt pdftex \hbox{-{}-version}}, \eg\
+{\tt\pdftexbanner}. This is necessary because the string in the
+\type{Producer} key in the info dictionary is rather short,
+namely {\tt pdfTeX-\currentpdftex}. \NC \NR
+\HL
+\stoptabulate
+
+Any or all of these keys can be suppressed with the
+\type{\pdfsuppressptexinfo} primitive, described in
+\in{section}[sec.docinfocatalog].
+
+%***********************************************************************
+
+\section{Colophon}
+
+This manual is typeset in \CONTEXT. One can generate an A4 version from
+the source code by typing:
+
+\starttyping
+texexec --result=pdftex-a.pdf pdftex-t
+\stoptyping
+
+Or in letter size:
+
+\starttyping
+texexec --mode=letter --result=pdftex-l.pdf pdftex-t
+\stoptyping
+
+Given that the A4 version is typeset, one can generate an A5 booklet by
+typing:
+
+\starttyping
+texexec --pdfarrange --paper=a5a4 --print=up --addempty=1,2
+ --result=pdftex-b.pdf pdftex-a
+\stoptyping
+
+Odd and even page sets for non-duplex printers can be generated using
+\type{-}\type{-pages=odd} and \type{-}\type{-pages=even} options
+(which might require some disciplined shuffling of sheet).
+
+This also demonstrates that \PDFTEX\ can be used for page imposition
+purposes (given that \PDFTEX\ and the fonts are set up properly).
+
+%***********************************************************************
+
+\page
+
+\definehead[gnusection][subsection]
+\definehead[gnusubject][subsubject]
+
+\setuphead[gnusection,gnusubject][style=\bfa,before=\blank,after=\blank,align={right,broad,nothyphenated}]
+
+\setuphead[gnusection][ownnumber=yes]
+
+\section{GNU Free Documentation License}
+
+\startnotmode[screen]
+ \switchtobodyfont[4.6pt] % squeeze everything on one page :-}
+ \setuplayout[grid=yes]
+ \setupcolumns[n=7]
+\stopnotmode
+
+\startmode[screen]
+ \setupcolumns[n=2]
+\stopmode
+
+\startcolumns[tolerance=verytolerant,distance=10pt] \widowpenalty10000 \clubpenalty10000
+
+\startlines
+Version 1.2, November 2002
+Copyright \copyright\ 2000, 2001, 2002
+Free Software Foundation, Inc.
+59 Temple Place, Suite 330,
+Boston, MA 02111-1307 USA
+\stoplines
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+\gnusubject{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document ``free'' in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+\gnusection{1}{APPLICABILITY AND DEFINITIONS}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants
+a world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The {\bf ``Document''}, below,
+refers to any such manual or work. Any member of the public is
+a licensee, and is addressed as {\bf ``you''}. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A {\bf ``Modified Version''} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A {\bf ``Secondary Section''} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part
+a textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The {\bf ``Invariant Sections''} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If
+a section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The {\bf ``Cover Texts''} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A {\bf ``Transparent''} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by \PDF\ viewers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called {\bf ``Opaque''}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, \POSTSCRIPT\ or \PDF\ designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, \POSTSCRIPT\ or \PDF\ produced by some word
+processors for output purposes only.
+
+The {\bf ''Title Page''} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section {\bf ``Entitled XYZ''} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for
+a specific section name mentioned below, such as {\bf ``Acknowledgements''},
+{\bf ``Dedications''}, {\bf ``Endorsements''}, or {\bf ``History''}.)
+To {\bf ``Preserve the Title''}
+of such a section when you modify the Document means that it remains
+a section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\gnusection{2}{VERBATIM COPYING}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\gnusection{3}{COPYING IN QUANTITY}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\gnusection{4}{MODIFICATIONS}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+\startitemize[A,packed]
+\item
+ Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+
+\item
+ List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+
+\item
+ State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+\item
+ Preserve all the copyright notices of the Document.
+
+\item
+ Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+\item
+ Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+
+\item
+ Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+
+\item
+ Include an unaltered copy of this License.
+
+\item
+ Preserve the section Entitled ``History'', Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled ``History'' in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+
+\item
+ Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the ``History'' section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+
+\item
+ For any section Entitled ``Acknowledgements'' or ``Dedications'',
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+
+\item
+ Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+
+\item
+ Delete any section Entitled ``Endorsements''. Such a section
+ may not be included in the Modified Version.
+
+\item
+ Do not retitle any existing section to be Entitled ``Endorsements''
+ or to conflict in title with any Invariant Section.
+
+\item
+ Preserve any Warranty Disclaimers.
+\stopitemize
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of
+a standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and
+a passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+\gnusection{5}{COMBINING DOCUMENTS}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all sections
+Entitled ``Endorsements''.
+
+\gnusection{6}{COLLECTIONS OF DOCUMENTS}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+\gnusection{7}{AGGREGATION WITH INDEPENDENT WORKS}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+\gnusection{8}{TRANSLATION}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include
+a translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section~1) will typically require changing the actual
+title.
+
+\gnusection{9}{TERMINATION}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+\gnusection{10}{FUTURE REVISIONS OF THIS LICENSE}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http:/\!/www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+\stopcolumns
+
+%***********************************************************************
+
+\stopbackmatter
+
+%D And then we're done.
+
+% Evidently ConTeXt somewhere sets \pdfgentounicode=1. Or something.
+% So insert the mappings. Seems like a good thing anyway.
+\input glyphtounicode
+\stoptext
diff --git a/systems/doc/pdftex/manual/pdftex-w.tex b/systems/doc/pdftex/manual/pdftex-w.tex
new file mode 100644
index 0000000000..5afdf9f44a
--- /dev/null
+++ b/systems/doc/pdftex/manual/pdftex-w.tex
@@ -0,0 +1,9 @@
+% $Id: pdftex-w.tex 689 2012-04-15 18:05:10Z karl $
+\pdfoutput=1
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+\pdfmapline{ptmr8r Times-Roman 2 <8r.enc}
+\font\tenrm=ptmr8r
+\tenrm
+Welcome to pdf\TeX!
+\bye
diff --git a/systems/doc/pdftex/manual/syntaxform.awk b/systems/doc/pdftex/manual/syntaxform.awk
new file mode 100644
index 0000000000..cdabfe77f8
--- /dev/null
+++ b/systems/doc/pdftex/manual/syntaxform.awk
@@ -0,0 +1,124 @@
+# $Id: syntaxform.awk 742 2016-04-25 17:30:55Z karl $
+# Public domain. Originally written by Petr Olsak.
+# pdftex-syntax.tex and pdftex-t.tex --> pdftex-syntax.txt
+# requires gawk due to gensub() function
+
+BEGIN{
+ buffer = "";
+}
+
+/\015*$/ {
+ gsub(/\015*$/, "");
+}
+
+/^%%S NL/ {
+ print "";
+ next;
+}
+
+/^%%S/ {
+ gsub (/^%%S/, "%%" );
+ print;
+ next;
+}
+
+/^\\Syntax/ {
+ printing = 1;
+ indentation = 0;
+ next;
+}
+
+// {
+ if (buffer != "") {
+ gsub(/^ */, "");
+ $0 = buffer $0;
+ }
+ buffer = "";
+}
+
+/\|\|/ {
+ gsub(/\|\|/, "-");
+}
+
+/^ */{
+ gsub(/^ */, indspaces);
+}
+
+/\\Something/ {
+ $0 = gensub(/\\Something *{([^}]*)}/, "<\\1>", "g");
+}
+
+/\\Literal/ {
+ $0 = gensub(/\\Literal *{([^}]*)}/, "\\1", "g");
+}
+
+/\\Tex/ {
+ $0 = gensub(/\\Tex *{([^}]*)}/, "\\1", "g");
+}
+
+/\\tex/ {
+ $0 = gensub(/\\tex *{([^}]*)}/, "\\\\\\1", "g");
+}
+
+
+/\\Optional/ {
+ $0 = gensub(/\\Optional *{([^}]*)}/, "[\\1]", "g");
+}
+
+/\\Means/ {
+ gsub(/\\Means/, "-->");
+ indentation = match($0, /-->/);
+ indspaces = " ";
+ for(i=0; i < indentation; i++)
+ indspaces = indspaces " ";
+}
+
+/\\Lbrace/ {
+ gsub(/\\Lbrace/, "{");
+}
+
+/\\Rbrace/ {
+ gsub(/\\Rbrace/, "}");
+}
+
+/\\Or/ {
+ gsub(/\\Or/, "|");
+}
+
+/\\Next/ {
+ gsub(/\\Next /, "");
+}
+
+/\\unkern/ {
+ gsub(/\\unkern */, "");
+}
+
+/\\(Whatever|Modelist)/ {
+ whatind = 57;
+ whatpos = match($0, /\\(Whatever|Modelist)/);
+ b = substr($0, 0, whatpos - 1)
+ c = substr($0, whatpos)
+ c = gensub(/\\(Whatever|Modelist) *{([^}]*)}/, "(\\2)", "g", c);
+ $0 = b;
+ for(i = whatpos; i < whatind; i++)
+ $0 = $0 " ";
+ $0 = $0 c;
+}
+
+/^}/ {printing = 0;}
+
+/% *$/ {
+ gsub(/% *$/, "");
+ buffer = $0;
+ next;
+}
+
+/^ *$/ {
+ $0 = "================= ERROR";
+}
+
+/ *$/ {
+ gsub(/ *$/, "");
+}
+
+{ if (printing) print; }
diff --git a/systems/doc/pdftex/manual/syntaxform.pl b/systems/doc/pdftex/manual/syntaxform.pl
new file mode 100755
index 0000000000..ad92b3ce30
--- /dev/null
+++ b/systems/doc/pdftex/manual/syntaxform.pl
@@ -0,0 +1,131 @@
+#!/usr/bin/env perl
+# $Id: syntaxform.pl 743 2016-04-25 17:34:08Z karl $
+# Public domain. Originally written by Karl Berry, 2016.
+# Read pdftex-t.tex, generate pdftex-syntax.tex
+# by looking for the primitive descriptions.
+
+use warnings;
+
+sub main {
+ my %primitive = &read_manual_for_primitives ();
+
+ # group primitives into classes based on their \Whatever construct.
+ my %class;
+ for my $p (sort keys %primitive) {
+ my ($class) = $primitive{$p} =~ /\\Whatever *\{(.*?)\}/;
+ # general commands don't have a \Whatever.
+ $class = "general" if ! $class;
+
+ # append this primitive, comma-separated.
+ $class{$class} .= "$p,"
+ }
+
+ print <<END_HEADER;
+%%S \$Id: syntaxform.pl 742 2016-04-25 17:30:55Z karl \$
+%%S This is the list of new or extended primitives provided by pdftex.
+%%S Don't edit this file, as it is now auto-generated from the
+%%S pdfTeX manual source pdftex-t.tex (and the generated
+%%S pdftex-syntax.tex) by the script syntaxform.awk.
+%%S Syntax rule conventions borrowed from `TeXbook naruby' by Petr Olsak.
+END_HEADER
+ &print_by_class (\%class, \%primitive);
+ return 0;
+}
+
+{
+ # classes should be shown in a specific order,
+ # and have specific text for the headings.
+ # sorry for using an array.
+ my %class_info = (
+ "integer" => [1, "Integer registers"],
+ "read||only integer" => [2, "Read-only integers"],
+ "dimen" => [3, "Dimen registers"],
+ "tokens" => [4, "Token registers"],
+ "expandable" => [5, "Expandable commands"],
+ "general" => [6, "General commands"],
+ );
+
+sub print_by_class {
+ my ($class_ref,$primitive_ref) = @_;
+ my %class = %$class_ref;
+
+ for my $c (sort by_class keys %class) {
+ my $aref = $class_info{$c};
+ my $heading_name = $class_info{$c}->[1];
+ # the %%S lines are for syntaxform.awk
+ print <<END_START_CLASS;
+%%S NL
+%%S $heading_name:
+\\subsubject{$heading_name}
+
+\\startpacked
+END_START_CLASS
+
+ # extract list of primitives for this class.
+ my @prims = split (/,/, $class{$c});
+ for my $p (@prims) {
+ my $val = $primitive_ref->{$p};
+
+ # get rid of the \pdftexprimitive{ and trailing }
+ $val =~ s,^\\pdftexprimitive *\{,,;
+ $val =~ s, *\} *$,,;
+
+ # leading \Syntax and trailing } on their own lines for syntaxform.awk.
+ $val =~ s,^ *\\Syntax *\{,\\Syntax\{\n,;
+ $val =~ s, *\} *$,\n\},;
+
+ # collapse multiple spaces
+ $val =~ s, +, ,g;
+
+ print "\n$val\n";
+ }
+ print "\n\\stoppacked\n";
+ }
+}
+
+sub by_class { $class_info{$a}->[0] <=> $class_info{$b}->[0]; }
+
+} # end block for %class_info
+
+
+# read <> for \pdftexprimitive blocks. Return hash with keys being the
+# primitive name (including the leading \) and values the entire block,
+# without newlines.
+#
+sub read_manual_for_primitives {
+ my $printing = 0;
+ my $primitive = "";
+
+ while (<>) {
+ # \pdftexprimitive block ends at next unindented blank or \... line.
+ $printing = 0 if /^($|\\)/;
+ if (/^\\pdftexprimitive/) {
+ $printing = 1;
+
+ my $type;
+ # \tex is used for primitives specified without a leading \.
+ ($type,$primitive) = m/\\([Tt])ex *\{(.*?)\}/;
+ warn "$ARGV:$.: no primitive found in: $_" if (! $primitive);
+ $primitive = "\\$primitive" if $type eq "t";
+
+ # \pdfmovechars is still in the manual, but doesn't do anything.
+ # Omit it from the output.
+ next if $primitive eq "\\pdfmovechars";
+
+ # Just one case, \special, has multiple instances of \pdftexprimitive.
+ # kludge by appending spaces to the name to make it unique;
+ # we later reduce multiple spaces to one, so it's not visible.
+ $primitive .= " " until ! exists $primitive{$primitive};
+ }
+
+ if ($printing) {
+ # concatenate lines of definition; assume spacing is reasonable.
+ chomp;
+ $primitive{$primitive} .= $_;
+ }
+ }
+
+ return %primitive;
+}
+
+exit (&main ());
diff --git a/systems/doc/pdftex/samplepdftex/cmr10.103 b/systems/doc/pdftex/samplepdftex/cmr10.103
new file mode 100644
index 0000000000..0db63e9892
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/cmr10.103
@@ -0,0 +1,255 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 -90 185 270
+%%Creator: MetaPost
+%%CreationDate: 2000.01.22:1541
+%%Pages: 1
+%%DocumentFonts: cmr10
+ /cmr10 /cmr10 def
+/fshow {exch findfont exch scalefont setfont show}bind def
+%%EndProlog
+%%Page: 1 1
+ 0.7 setgray 0 6.97377 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinejoin 10 setmiterlimit
+newpath 79.70117 153.42459 moveto
+69.02646 153.42459 59.0136 148.29141 52.6969 139.6834 curveto
+45.66814 130.105 44.83253 117.78 44.83253 105.9077 curveto
+44.83253 94.03539 45.66814 81.71039 52.6969 72.13199 curveto
+59.0136 63.52397 69.02646 58.3908 79.70117 58.3908 curveto
+79.70117 56.89613 lineto
+65.45702 56.89613 51.56941 61.75742 40.95534 71.25125 curveto
+31.02951 80.12946 24.90634 92.60257 24.90634 105.9077 curveto
+24.90634 119.21283 31.02951 131.68593 40.95534 140.56413 curveto
+51.56941 150.05795 65.45702 154.91924 79.70117 154.91924 curveto
+ closepath
+gsave fill grestore stroke
+newpath 79.70117 58.3908 moveto
+90.3759 58.3908 100.38876 63.52397 106.70546 72.13199 curveto
+113.73422 81.71039 114.56981 94.03539 114.56981 105.9077 curveto
+114.56981 117.78 113.73422 130.105 106.70546 139.6834 curveto
+100.38876 148.29141 90.3759 153.42459 79.70117 153.42459 curveto
+79.70117 154.91924 lineto
+93.94534 154.91924 107.83295 150.05795 118.44702 140.56413 curveto
+128.37285 131.68593 134.49602 119.21283 134.49602 105.9077 curveto
+134.49602 92.60257 128.37285 80.12946 118.44702 71.25125 curveto
+107.83295 61.75742 93.94534 56.89613 79.70117 56.89613 curveto
+ closepath
+gsave fill grestore stroke
+newpath 118.44714 140.564 moveto
+128.22917 151.59401 142.26622 157.90715 157.00899 157.90715 curveto
+157.00899 158.90407 lineto
+142.05032 158.90407 127.88689 152.16806 118.4469 140.56427 curveto
+ closepath
+gsave fill grestore stroke
+newpath 157.00899 157.90715 moveto
+163.8467 157.90715 168.8665 151.67432 168.8665 144.55785 curveto
+170.85944 144.55785 lineto
+170.85944 152.3925 164.75017 158.90407 157.00899 158.90407 curveto
+ closepath
+gsave fill grestore stroke
+newpath 156.91127 144.55785 moveto
+156.91127 150.94083 163.48349 152.94232 167.60516 150.56235 curveto
+170.85944 144.55785 lineto
+170.85944 135.25906 156.91127 135.25906 156.91127 144.55785 curveto closepath
+gsave fill grestore stroke
+newpath 45.30899 71.57796 moveto
+18.50632 46.29672 31.5723 5.98181 60.25307 5.98181 curveto
+60.25546 5.98181 89.66144 5.98181 89.66383 5.98181 curveto
+89.66383 20.01962 lineto
+89.66144 20.01962 60.25546 20.01962 60.25307 20.01962 curveto
+36.18747 20.01962 24.78682 52.22023 45.30922 71.5777 curveto
+ closepath
+gsave fill grestore stroke
+newpath 89.66383 5.98181 moveto
+106.425 5.98181 123.6577 5.5558 138.45341 -2.39297 curveto
+148.08914 -7.56964 154.04207 -17.66093 154.04207 -28.60449 curveto
+154.04207 -40.80983 145.60735 -50.88159 135.18617 -57.49542 curveto
+121.66623 -66.0759 105.67108 -69.46239 89.66383 -69.46239 curveto
+73.65659 -69.46239 57.66144 -66.0759 44.14148 -57.49542 curveto
+33.72032 -50.88159 25.28558 -40.80984 25.28558 -28.60449 curveto
+25.28558 -19.41197 28.99132 -10.61298 35.5273 -4.14825 curveto
+42.1066 2.35933 50.99866 5.98181 60.25307 5.98181 curveto
+60.25307 6.48044 lineto
+48.39644 6.48044 36.64467 3.3158 27.15794 -3.79567 curveto
+19.15564 -9.79437 13.44954 -18.64792 13.44954 -28.60449 curveto
+13.44954 -41.88544 23.93777 -51.97589 35.77214 -58.55229 curveto
+52.15475 -67.65616 70.93266 -70.95703 89.66383 -70.95703 curveto
+108.395 -70.95703 127.1729 -67.65616 143.55553 -58.55229 curveto
+155.3899 -51.97589 165.8781 -41.88544 165.8781 -28.60449 curveto
+165.8781 -13.9194 159.7333 0.3921 147.42345 8.2457 curveto
+130.47827 19.0566 109.73244 20.01962 89.66383 20.01962 curveto
+ closepath
+gsave fill grestore stroke
+ 0 setgray
+114.57275 143.564 moveto
+(0l) cmr10 9.96265 fshow
+ 0 3 dtransform truncate idtransform setlinewidth pop 1 setlinecap
+newpath 118.44714 140.564 moveto 0 0 rlineto stroke
+75.8268 156.42459 moveto
+(1l) cmr10 9.96265 fshow
+newpath 79.70117 153.42459 moveto 0 0 rlineto stroke
+40.95816 108.9077 moveto
+(2l) cmr10 9.96265 fshow
+newpath 44.83253 105.9077 moveto 0 0 rlineto stroke
+75.8268 61.39078 moveto
+(3l) cmr10 9.96265 fshow
+newpath 79.70117 58.3908 moveto 0 0 rlineto stroke
+110.69543 108.9077 moveto
+(4l) cmr10 9.96265 fshow
+newpath 114.56981 105.9077 moveto 0 0 rlineto stroke
+153.1346 160.90715 moveto
+(5l) cmr10 9.96265 fshow
+newpath 157.00899 157.90715 moveto 0 0 rlineto stroke
+164.99213 147.55785 moveto
+(6l) cmr10 9.96265 fshow
+newpath 168.8665 144.55785 moveto 0 0 rlineto stroke
+153.03688 147.55785 moveto
+(7l) cmr10 9.96265 fshow
+newpath 156.91127 144.55785 moveto 0 0 rlineto stroke
+41.4346 74.57796 moveto
+(8l) cmr10 9.96265 fshow
+newpath 45.30899 71.57796 moveto 0 0 rlineto stroke
+53.88802 8.9818 moveto
+(10l) cmr10 9.96265 fshow
+newpath 60.25307 5.98181 moveto 0 0 rlineto stroke
+83.29877 8.9818 moveto
+(11l) cmr10 9.96265 fshow
+newpath 89.66383 5.98181 moveto 0 0 rlineto stroke
+147.67702 -25.6045 moveto
+(12l) cmr10 9.96265 fshow
+newpath 154.04207 -28.60449 moveto 0 0 rlineto stroke
+83.29877 -66.46239 moveto
+(13l) cmr10 9.96265 fshow
+newpath 89.66383 -69.46239 moveto 0 0 rlineto stroke
+18.92052 -25.6045 moveto
+(14l) cmr10 9.96265 fshow
+newpath 25.28558 -28.60449 moveto 0 0 rlineto stroke
+115.95634 143.56413 moveto
+(0) cmr10 9.96265 fshow
+newpath 118.44702 140.56413 moveto 0 0 rlineto stroke
+77.2105 157.1719 moveto
+(1) cmr10 9.96265 fshow
+newpath 79.70117 154.17192 moveto 0 0 rlineto stroke
+32.37875 108.9077 moveto
+(2) cmr10 9.96265 fshow
+newpath 34.86945 105.9077 moveto 0 0 rlineto stroke
+77.2105 60.64346 moveto
+(3) cmr10 9.96265 fshow
+newpath 79.70117 57.64346 moveto 0 0 rlineto stroke
+122.04224 108.9077 moveto
+(4) cmr10 9.96265 fshow
+newpath 124.53291 105.9077 moveto 0 0 rlineto stroke
+154.5183 161.40561 moveto
+(5) cmr10 9.96265 fshow
+newpath 157.00899 158.40561 moveto 0 0 rlineto stroke
+167.37228 147.55785 moveto
+(6) cmr10 9.96265 fshow
+newpath 169.86298 144.55785 moveto 0 0 rlineto stroke
+161.39467 147.55785 moveto
+(7) cmr10 9.96265 fshow
+newpath 163.88535 144.55785 moveto 0 0 rlineto stroke
+42.81842 74.57782 moveto
+(8) cmr10 9.96265 fshow
+newpath 45.3091 71.57782 moveto 0 0 rlineto stroke
+55.27171 16.0007 moveto
+(10) cmr10 9.96265 fshow
+newpath 60.25307 13.00072 moveto 0 0 rlineto stroke
+84.68248 16.0007 moveto
+(11) cmr10 9.96265 fshow
+newpath 89.66383 13.00072 moveto 0 0 rlineto stroke
+154.97873 -25.6045 moveto
+(12) cmr10 9.96265 fshow
+newpath 159.96008 -28.60449 moveto 0 0 rlineto stroke
+84.68248 -67.2097 moveto
+(13) cmr10 9.96265 fshow
+newpath 89.66383 -70.2097 moveto 0 0 rlineto stroke
+14.38622 -25.6045 moveto
+(14) cmr10 9.96265 fshow
+newpath 19.36757 -28.60449 moveto 0 0 rlineto stroke
+114.0052 143.56425 moveto
+(0r) cmr10 9.96265 fshow
+newpath 118.4469 140.56427 moveto 0 0 rlineto stroke
+75.25948 157.91924 moveto
+(1r) cmr10 9.96265 fshow
+newpath 79.70117 154.91924 moveto 0 0 rlineto stroke
+20.46463 108.9077 moveto
+(2r) cmr10 9.96265 fshow
+newpath 24.90634 105.9077 moveto 0 0 rlineto stroke
+75.25948 59.89613 moveto
+(3r) cmr10 9.96265 fshow
+newpath 79.70117 56.89613 moveto 0 0 rlineto stroke
+130.0543 108.9077 moveto
+(4r) cmr10 9.96265 fshow
+newpath 134.49602 105.9077 moveto 0 0 rlineto stroke
+152.56728 161.90407 moveto
+(5r) cmr10 9.96265 fshow
+newpath 157.00899 158.90407 moveto 0 0 rlineto stroke
+166.41772 147.55785 moveto
+(6r) cmr10 9.96265 fshow
+newpath 170.85944 144.55785 moveto 0 0 rlineto stroke
+166.41772 147.55785 moveto
+(7r) cmr10 9.96265 fshow
+newpath 170.85944 144.55785 moveto 0 0 rlineto stroke
+40.86751 74.57768 moveto
+(8r) cmr10 9.96265 fshow
+newpath 45.30922 71.5777 moveto 0 0 rlineto stroke
+53.3207 23.0196 moveto
+(10r) cmr10 9.96265 fshow
+newpath 60.25307 20.01962 moveto 0 0 rlineto stroke
+82.73145 23.0196 moveto
+(11r) cmr10 9.96265 fshow
+newpath 89.66383 20.01962 moveto 0 0 rlineto stroke
+158.94572 -25.6045 moveto
+(12r) cmr10 9.96265 fshow
+newpath 165.8781 -28.60449 moveto 0 0 rlineto stroke
+82.73145 -67.95703 moveto
+(13r) cmr10 9.96265 fshow
+newpath 89.66383 -70.95703 moveto 0 0 rlineto stroke
+6.51717 -25.6045 moveto
+(14r) cmr10 9.96265 fshow
+newpath 13.44954 -28.60449 moveto 0 0 rlineto stroke
+37.08095 74.25125 moveto
+(8') cmr10 9.96265 fshow
+newpath 40.95534 71.25125 moveto 0 0 rlineto stroke
+42.74222 74.7797 moveto
+(8'') cmr10 9.96265 fshow
+newpath 48.00032 71.7797 moveto 0 0 rlineto stroke
+ 0 0.4 dtransform truncate idtransform setlinewidth pop 2 setlinecap
+newpath 0 0 moveto
+179.32765 0 lineto stroke
+newpath 0 249.06535 moveto
+179.32765 249.06535 lineto stroke
+newpath 0 268.99066 moveto
+179.32765 268.99066 lineto stroke
+newpath 0 154.42062 moveto
+179.32765 154.42062 lineto stroke
+newpath 0 86.67494 moveto
+179.32765 86.67494 lineto stroke
+newpath 0 -69.73825 moveto
+179.32765 -69.73825 lineto stroke
+newpath 0 -89.66356 moveto
+179.32765 -89.66356 lineto stroke
+ 0.4 0 dtransform exch truncate exch idtransform pop setlinewidth
+newpath 0 -89.66356 moveto
+0 268.99066 lineto stroke
+newpath 179.32765 -89.66356 moveto
+179.32765 268.99066 lineto stroke
+newpath 19.9253 -89.66356 moveto
+19.9253 268.99066 lineto stroke
+newpath 39.85059 -89.66356 moveto
+39.85059 268.99066 lineto stroke
+newpath 59.77588 -89.66356 moveto
+59.77588 268.99066 lineto stroke
+newpath 79.70117 -89.66356 moveto
+79.70117 268.99066 lineto stroke
+newpath 99.62646 -89.66356 moveto
+99.62646 268.99066 lineto stroke
+newpath 119.55176 -89.66356 moveto
+119.55176 268.99066 lineto stroke
+newpath 139.47705 -89.66356 moveto
+139.47705 268.99066 lineto stroke
+newpath 159.40233 -89.66356 moveto
+159.40233 268.99066 lineto stroke
+newpath 184.30884 154.42062 moveto
+184.30884 77.21031 lineto stroke
+showpage
+%%EOF
diff --git a/systems/doc/pdftex/samplepdftex/obj.dat b/systems/doc/pdftex/samplepdftex/obj.dat
new file mode 100644
index 0000000000..40f513288b
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/obj.dat
@@ -0,0 +1,4 @@
+<<
+/Type /File
+/Name (obj.dat)
+>>
diff --git a/systems/doc/pdftex/samplepdftex/pdfcolor.tex b/systems/doc/pdftex/samplepdftex/pdfcolor.tex
new file mode 100644
index 0000000000..f09ecbcb75
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pdfcolor.tex
@@ -0,0 +1,158 @@
+% Very simple macros to show how to use colors with pdftex
+
+\def\cmykGreenYellow{0.15 0 0.69 0}
+\def\cmykYellow{0 0 1 0}
+\def\cmykGoldenrod{0 0.10 0.84 0}
+\def\cmykDandelion{0 0.29 0.84 0}
+\def\cmykApricot{0 0.32 0.52 0}
+\def\cmykPeach{0 0.50 0.70 0}
+\def\cmykMelon{0 0.46 0.50 0}
+\def\cmykYellowOrange{0 0.42 1 0}
+\def\cmykOrange{0 0.61 0.87 0}
+\def\cmykBurntOrange{0 0.51 1 0}
+\def\cmykBittersweet{0 0.75 1 0.24}
+\def\cmykRedOrange{0 0.77 0.87 0}
+\def\cmykMahogany{0 0.85 0.87 0.35}
+\def\cmykMaroon{0 0.87 0.68 0.32}
+\def\cmykBrickRed{0 0.89 0.94 0.28}
+\def\cmykRed{0 1 1 0}
+\def\cmykOrangeRed{0 1 0.50 0}
+\def\cmykRubineRed{0 1 0.13 0}
+\def\cmykWildStrawberry{0 0.96 0.39 0}
+\def\cmykSalmon{0 0.53 0.38 0}
+\def\cmykCarnationPink{0 0.63 0 0}
+\def\cmykMagenta{0 1 0 0}
+\def\cmykVioletRed{0 0.81 0 0}
+\def\cmykRhodamine{0 0.82 0 0}
+\def\cmykMulberry{0.34 0.90 0 0.02}
+\def\cmykRedViolet{0.07 0.90 0 0.34}
+\def\cmykFuchsia{0.47 0.91 0 0.08}
+\def\cmykLavender{0 0.48 0 0}
+\def\cmykThistle{0.12 0.59 0 0}
+\def\cmykOrchid{0.32 0.64 0 0}
+\def\cmykDarkOrchid{0.40 0.80 0.20 0}
+\def\cmykPurple{0.45 0.86 0 0}
+\def\cmykPlum{0.50 1 0 0}
+\def\cmykViolet{0.79 0.88 0 0}
+\def\cmykRoyalPurple{0.75 0.90 0 0}
+\def\cmykBlueViolet{0.86 0.91 0 0.04}
+\def\cmykPeriwinkle{0.57 0.55 0 0}
+\def\cmykCadetBlue{0.62 0.57 0.23 0}
+\def\cmykCornflowerBlue{0.65 0.13 0 0}
+\def\cmykMidnightBlue{0.98 0.13 0 0.43}
+\def\cmykNavyBlue{0.94 0.54 0 0}
+\def\cmykRoyalBlue{1 0.50 0 0}
+\def\cmykBlue{1 1 0 0}
+\def\cmykCerulean{0.94 0.11 0 0}
+\def\cmykCyan{1 0 0 0}
+\def\cmykProcessBlue{0.96 0 0 0}
+\def\cmykSkyBlue{0.62 0 0.12 0}
+\def\cmykTurquoise{0.85 0 0.20 0}
+\def\cmykTealBlue{0.86 0 0.34 0.02}
+\def\cmykAquamarine{0.82 0 0.30 0}
+\def\cmykBlueGreen{0.85 0 0.33 0}
+\def\cmykEmerald{1 0 0.50 0}
+\def\cmykJungleGreen{0.99 0 0.52 0}
+\def\cmykSeaGreen{0.69 0 0.50 0}
+\def\cmykGreen{1 0 1 0}
+\def\cmykForestGreen{0.91 0 0.88 0.12}
+\def\cmykPineGreen{0.92 0 0.59 0.25}
+\def\cmykLimeGreen{0.50 0 1 0}
+\def\cmykYellowGreen{0.44 0 0.74 0}
+\def\cmykSpringGreen{0.26 0 0.76 0}
+\def\cmykOliveGreen{0.64 0 0.95 0.40}
+\def\cmykRawSienna{0 0.72 1 0.45}
+\def\cmykSepia{0 0.83 1 0.70}
+\def\cmykBrown{0 0.81 1 0.60}
+\def\cmykTan{0.14 0.42 0.56 0}
+\def\cmykGray{0 0 0 0.50}
+\def\cmykBlack{0 0 0 1}
+\def\cmykWhite{0 0 0 0}
+
+\def\GreenYellow{\pdfsetcolor{\cmykGreenYellow}}
+\def\Yellow{\pdfsetcolor{\cmykYellow}}
+\def\Goldenrod{\pdfsetcolor{\cmykGoldenrod}}
+\def\Dandelion{\pdfsetcolor{\cmykDandelion}}
+\def\Apricot{\pdfsetcolor{\cmykApricot}}
+\def\Peach{\pdfsetcolor{\cmykPeach}}
+\def\Melon{\pdfsetcolor{\cmykMelon}}
+\def\YellowOrange{\pdfsetcolor{\cmykYellowOrange}}
+\def\Orange{\pdfsetcolor{\cmykOrange}}
+\def\BurntOrange{\pdfsetcolor{\cmykBurntOrange}}
+\def\Bittersweet{\pdfsetcolor{\cmykBittersweet}}
+\def\RedOrange{\pdfsetcolor{\cmykRedOrange}}
+\def\Mahogany{\pdfsetcolor{\cmykMahogany}}
+\def\Maroon{\pdfsetcolor{\cmykMaroon}}
+\def\BrickRed{\pdfsetcolor{\cmykBrickRed}}
+\def\Red{\pdfsetcolor{\cmykRed}}
+\def\OrangeRed{\pdfsetcolor{\cmykOrangeRed}}
+\def\RubineRed{\pdfsetcolor{\cmykRubineRed}}
+\def\WildStrawberry{\pdfsetcolor{\cmykWildStrawberry}}
+\def\Salmon{\pdfsetcolor{\cmykSalmon}}
+\def\CarnationPink{\pdfsetcolor{\cmykCarnationPink}}
+\def\Magenta{\pdfsetcolor{\cmykMagenta}}
+\def\VioletRed{\pdfsetcolor{\cmykVioletRed}}
+\def\Rhodamine{\pdfsetcolor{\cmykRhodamine}}
+\def\Mulberry{\pdfsetcolor{\cmykMulberry}}
+\def\RedViolet{\pdfsetcolor{\cmykRedViolet}}
+\def\Fuchsia{\pdfsetcolor{\cmykFuchsia}}
+\def\Lavender{\pdfsetcolor{\cmykLavender}}
+\def\Thistle{\pdfsetcolor{\cmykThistle}}
+\def\Orchid{\pdfsetcolor{\cmykOrchid}}
+\def\DarkOrchid{\pdfsetcolor{\cmykDarkOrchid}}
+\def\Purple{\pdfsetcolor{\cmykPurple}}
+\def\Plum{\pdfsetcolor{\cmykPlum}}
+\def\Violet{\pdfsetcolor{\cmykViolet}}
+\def\RoyalPurple{\pdfsetcolor{\cmykRoyalPurple}}
+\def\BlueViolet{\pdfsetcolor{\cmykBlueViolet}}
+\def\Periwinkle{\pdfsetcolor{\cmykPeriwinkle}}
+\def\CadetBlue{\pdfsetcolor{\cmykCadetBlue}}
+\def\CornflowerBlue{\pdfsetcolor{\cmykCornflowerBlue}}
+\def\MidnightBlue{\pdfsetcolor{\cmykMidnightBlue}}
+\def\NavyBlue{\pdfsetcolor{\cmykNavyBlue}}
+\def\RoyalBlue{\pdfsetcolor{\cmykRoyalBlue}}
+\def\Blue{\pdfsetcolor{\cmykBlue}}
+\def\Cerulean{\pdfsetcolor{\cmykCerulean}}
+\def\Cyan{\pdfsetcolor{\cmykCyan}}
+\def\ProcessBlue{\pdfsetcolor{\cmykProcessBlue}}
+\def\SkyBlue{\pdfsetcolor{\cmykSkyBlue}}
+\def\Turquoise{\pdfsetcolor{\cmykTurquoise}}
+\def\TealBlue{\pdfsetcolor{\cmykTealBlue}}
+\def\Aquamarine{\pdfsetcolor{\cmykAquamarine}}
+\def\BlueGreen{\pdfsetcolor{\cmykBlueGreen}}
+\def\Emerald{\pdfsetcolor{\cmykEmerald}}
+\def\JungleGreen{\pdfsetcolor{\cmykJungleGreen}}
+\def\SeaGreen{\pdfsetcolor{\cmykSeaGreen}}
+\def\Green{\pdfsetcolor{\cmykGreen}}
+\def\ForestGreen{\pdfsetcolor{\cmykForestGreen}}
+\def\PineGreen{\pdfsetcolor{\cmykPineGreen}}
+\def\LimeGreen{\pdfsetcolor{\cmykLimeGreen}}
+\def\YellowGreen{\pdfsetcolor{\cmykYellowGreen}}
+\def\SpringGreen{\pdfsetcolor{\cmykSpringGreen}}
+\def\OliveGreen{\pdfsetcolor{\cmykOliveGreen}}
+\def\RawSienna{\pdfsetcolor{\cmykRawSienna}}
+\def\Sepia{\pdfsetcolor{\cmykSepia}}
+\def\Brown{\pdfsetcolor{\cmykBrown}}
+\def\Tan{\pdfsetcolor{\cmykTan}}
+\def\Gray{\pdfsetcolor{\cmykGray}}
+\def\Black{\pdfsetcolor{\cmykBlack}}
+\def\White{\pdfsetcolor{\cmykWhite}}
+
+\def\pdfsetcolor#1{\pdfliteral{#1 k}}
+\def\setcolor#1{\mark{#1}\pdfsetcolor{#1}}
+
+\pdfoutput=1
+\def\maincolor{\cmykBlack}
+\pdfsetcolor{\maincolor}
+
+\def\makefootline{
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}}
+
+\def\makeheadline{%
+ \edef\M{\topmark}
+ \ifx\M\empty\let\M=\maincolor\fi
+ \vbox to 0pt{\vskip-22.5pt
+ \line{\vbox to8.5pt{}%
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\M}}\vss}%
+ \nointerlineskip}
diff --git a/systems/doc/pdftex/samplepdftex/pic.eps b/systems/doc/pdftex/samplepdftex/pic.eps
new file mode 100644
index 0000000000..b3dd0d71da
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic.eps
@@ -0,0 +1,12486 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: tiff2ps
+%%Title: pic.tif
+%%CreationDate: Thu Aug 31 14:36:15 2000
+%%DocumentData: Clean7Bit
+%%Origin: 0 0
+%%BoundingBox: 0 0 440 311
+%%LanguageLevel: 1
+%%Pages: (atend)
+%%EndComments
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+gsave
+100 dict begin
+440.000000 311.000000 scale
+/bwproc {
+ rgbproc
+ dup length 3 idiv string 0 3 0
+ 5 -1 roll {
+ add 2 1 roll 1 sub dup 0 eq {
+ pop 3 idiv
+ 3 -1 roll
+ dup 4 -1 roll
+ dup 3 1 roll
+ 5 -1 roll put
+ 1 add 3 0
+ } { 2 1 roll } ifelse
+ } forall
+ pop pop pop
+} def
+/colorimage where {pop} {
+ /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def
+} ifelse
+%ImageData: 440 311 8 3 0 1 2 "false 3 colorimage"
+/scanLine 440 string def
+440 311 8
+[440 0 0 -311 0 311]
+{currentfile scanLine readhexstring pop} bind
+false 3 colorimage
+a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7b0cbdca5c4d7
+a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7
+a5c4d7b0cbdca5c4d7a5c4d7b0cbdcb0cbdcb0cbdcb0cbdca5c4d7a5c4d7b0cbdc
+a5c4d7b0cbdca5c4d7b0cbdca5c4d7aec4d0a5c4d7aec4d0a5c4d7a5c4d7b0cbdc
+b0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdcaec4d0a5c4d7b0cbdca5c4d7b0cbdc
+aec4d0a5c4d7b0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+a5c4d7b0cbdcaec4d0b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+bacdd9b0cbdcaec4d0bacdd9b0cbdcb8c3c6bacdd9b0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcbacdd9aec4d0b0cbdcb0cbdca5c4d7b0cbdcaec4d0aec4d0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdca5c4d7aec4d0a5c4d7b0cbdcaec4d0b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7aec4d0b0cbdcaec4d0b0cbdcb0cbdc
+a5c4d7b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdca5c4d7b0cbdc
+b0cbdcb0cbdca5c4d7a5c4d7b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcaec4d0aec4d0a5c4d7b0cbdcb0cbdca5c4d7b0cbdcaec4d0
+b0cbdcb0cbdcaec4d0b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+aec4d0b0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0aec4d0
+a5c4d7b0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+aec4d0b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0a5c4d7b0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0
+aec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcaec4d0b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+aec4d0b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+bacdd9aec4d0b0cbdcb0cbdcbacdd9aec4d0b0cbdcb0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b8c3c6b0cbdcbacdd9b0cbdc
+bacdd9b0cbdcb0cbdcb0cbdca3b8bcafc0ab8b98826b8673757c718b98828b9882
+7d98b17e98828da0b6b0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9b0cbdc
+b2d2e0b2d2e0bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9c1d4e2cdd5de
+bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2cccdcccdd5dec1d4e2c1d4e2bacdd9
+cdd5debacdd9c1d4e2cccdcccdd5dec1d4e2cdd5decccdcccdd5decdd5decdd5de
+d2dee6cccdcccdd5dec5dae4cdd5decdd5decdd5decdd5decdd5decdd5dedcd6d6
+c1d4e2cccdccc1d4e2cccdccbacdd9c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2cccdccc1d4e2cdd5dec1d4e2
+c1d4e2cccdccc1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2cdd5decdd5dedfe1e6
+dcd6d6dfe1e6dcd6d6d2dee6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6cccdccc1c4c7dcd6d6dcd6d6cfc6b89da1abc1c4c7cccdcc
+afb9bccccdcccccdcccfc6b8c1c4c7afb9bcc0b8a6c1c4c7c0b8a6c1c4c7dcd6d6
+a5c4d7a5c4d7a5c4d7a5c4d7b0cbdcb0cbdca5c4d7b0cbdca5c4d7a5c4d7b0cbdc
+a5c4d7a5c4d7a5c4d7b0cbdcb0cbdca5c4d7a5c4d7b0cbdcb0cbdca5c4d7a5c4d7
+a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7b2d2e0a5c4d7a5c4d7
+a5c4d7b0cbdca5c4d7a5c4d7b0cbdca5c4d7b0cbdcaec4d0a5c4d7a5c4d7a5c4d7
+b0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdc
+b0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdc
+aec4d0b0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0bacdd9aec4d0aec4d0
+b0cbdcbacdd9b0cbdcaec4d0b2d2e0bacdd9aec4d0bacdd9b8c3c6bacdd9b0cbdc
+b0cbdcb0cbdcb0cbdca5c4d7b0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcb0cbdcaec4d0aec4d0b0cbdcb0cbdcaec4d0aec4d0b0cbdc
+aec4d0b0cbdca5c4d7aec4d0b0cbdcb0cbdcaec4d0b0cbdcaec4d0aec4d0b0cbdc
+b0cbdca5c4d7b0cbdca5c4d7aec4d0aec4d0aec4d0aec4d0b0cbdca5c4d7a5c4d7
+b0cbdcb0cbdcb0cbdca5c4d7aec4d0b0cbdca5c4d7b0cbdcaec4d0b0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcb0cbdca5c4d7aec4d0b0cbdcb0cbdcaec4d0b0cbdcaec4d0
+aec4d0b0cbdcaec4d0b0cbdcb0cbdca5c4d7b0cbdcaec4d0b0cbdca5c4d7b2d2e0
+b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0bacdd9aec4d0bacdd9
+b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdca5c4d7b0cbdc
+aec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb8c3c6b0cbdcbacdd9b0cbdcb8c3c6b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9aec4d0b0cbdcb0cbdcb0cbdcb8c3c6b0cbdc
+b8c3c6bacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9aec4d0bacdd9
+bacdd9b0cbdcb8c3c6b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+b0cbdcbacdd9bacdd9aec4d0b0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcaec4d0
+bacdd9bacdd9aec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb8c3c6bacdd9b0cbdcb0cbdc
+bacdd9bacdd9b0cbdcb0cbdcbacdd9aec4d0bacdd9b0cbdcbacdd9b0cbdcbacdd9
+b0cbdcbacdd9bacdd9bacdd9a3b8bc8ea089637471475832657c44767b47778772
+a0b09f819fb7a4bfb5b0cbdcb0cbdcb0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9b2d2e0bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9bacdd9
+c1d4e2bacdd9cccdcccdd5dec1d4e2c1d4e2bacdd9c1d4e2cccdccc1d4e2bacdd9
+c1d4e2cccdccc1d4e2bacdd9cdd5decdd5decdd5decccdccc1d4e2cdd5decdd5de
+cdd5debacdd9cccdccd2dee6cdd5decdd5ded2dee6cdd5decdd5ded2dee6cdd5de
+d2dee6cdd5dec1d4e2c1d4e2bacdd9bacdd9c1d4e2bacdd9cccdccc1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2cccdcc
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2cccdcccdd5dec1d4e2d2dee6cdd5dedfe1e6
+cdd5dedfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dcd6d6e0e6e8dcd6d6dcd6d6dcd6d6dcd6d6dcd6d69da1ababa9a6cccdccdcd6d6
+c1c4c7aeb0bdc1c4c7cccdcccfc6b8aeb0bdc1c4c7c1c4c7cccdcccccdccc1c4c7
+a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7a5c4d7b0cbdca5c4d7a5c4d7b0cbdca5c4d7
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7a5c4d7a5c4d7a5c4d7b0cbdca5c4d7
+a5c4d7a5c4d7a5c4d7a5c4d7b0cbdca5c4d7b0cbdca5c4d7a5c4d7a5c4d7b0cbdc
+a5c4d7a5c4d7b0cbdca5c4d7a5c4d7aec4d0a5c4d7b0cbdca5c4d7b0cbdcb0cbdc
+a5c4d7a5c4d7b0cbdca5c4d7b0cbdca5c4d7a5c4d7b0cbdcb0cbdca5c4d7a5c4d7
+b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9bacdd9
+b0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb8c3c6
+bacdd9b8c3c6b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdc
+aec4d0a5c4d7b0cbdcb0cbdcaec4d0b0cbdcaec4d0b0cbdcaec4d0b0cbdcaec4d0
+b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdca5c4d7
+aec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0b0cbdcb0cbdc
+a5c4d7b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcb0cbdca5c4d7aec4d0b0cbdcb0cbdcaec4d0aec4d0b0cbdcaec4d0bacdd9
+b0cbdcaec4d0a5c4d7b0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9aec4d0b0cbdcb0cbdcbacdd9aec4d0bacdd9
+b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+c1c4c7b0cbdcb0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcb8c3c6b0cbdcb0cbdc
+b0cbdcb0cbdcb8c3c6bacdd9aec4d0b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb2d2e0bacdd9b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+aec4d0bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcbacdd9aec4d0b0cbdc
+b0cbdcb0cbdcbacdd9b0cbdcaec4d0c1c4c7b0cbdcb0cbdcb0cbdcb0cbdcc1c4c7
+b0cbdcb0cbdcbacdd9b0cbdcc1c4c7b0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9
+b0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdc
+c1d4e2b0cbdcb0cbdcbacdd9aec4d09da1ab757c716374717d908277877275704d
+7d90828b98829fb0bbb0cbdcbacdd9bacdd9aec4d0bacdd9b0cbdcbacdd9bacdd9
+bacdd9b0cbdcbacdd9b0cbdcb2d2e0b2d2e0bacdd9bacdd9bacdd9cccdccc1d4e2
+c1d4e2c1d4e2bacdd9bacdd9bacdd9c1d4e2c1d4e2cdd5dec1d4e2cccdccc1d4e2
+c1d4e2cdd5decccdcccccdcccdd5decdd5decdd5decdd5decdd5decdd5debacdd9
+d2dee6cccdccc1d4e2c1d4e2cdd5decdd5decdd5decdd5ded2dee6cdd5ded2dee6
+cdd5decdd5ded2dee6cdd5decdd5decdd5debacdd9bacdd9c1d4e2bacdd9c1d4e2
+c1d4e2bacdd9c1d4e2cccdccbacdd9cdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2bacdd9cdd5dec1d4e2c1d4e2cdd5ded2dee6d2dee6dfe1e6dcd6d6
+dfe1e6dcd6d6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dcd6d6ebeae7dfe1e6dfe1e6
+dfe1e6dfe1e6cccdcccccdcccccdccdcd6d6dfe1e6dcd6d6dcd6d6dfe1e6dcd6d6
+dcd6d6dcd6d6cccdccc1c4c7cfc6b8dcd6d6cccdcccccdcccccdccaeb0bd9da1ab
+a5c4d7a5c4d7b0cbdca5c4d7a5c4d7b0cbdca5c4d7b0cbdcb0cbdcb0cbdca5c4d7
+b0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdca5c4d7a5c4d7a5c4d7a5c4d7a5c4d7
+b0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdca5c4d7a5c4d7b2d2e0a5c4d7b0cbdc
+a5c4d7a5c4d7b0cbdca5c4d7b2d2e0a5c4d7a5c4d7b0cbdca5c4d7b0cbdca5c4d7
+b0cbdcb0cbdca5c4d7a5c4d7b0cbdcaec4d0a5c4d7b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdca5c4d7b2d2e0aec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcaec4d0b0cbdcb0cbdcbacdd9
+bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb8c3c6bacdd9b0cbdc
+bacdd9aec4d0b0cbdcb0cbdcb0cbdcbacdd9b0cbdcaec4d0b0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0aec4d0b0cbdcb0cbdcb8c3c6aec4d0
+b0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0
+b0cbdcb0cbdcaec4d0a5c4d7b0cbdca5c4d7aec4d0b0cbdcaec4d0b0cbdcb0cbdc
+a5c4d7aec4d0b0cbdcaec4d0a5c4d7a5c4d7b0cbdcb0cbdcaec4d0b0cbdcaec4d0
+aec4d0bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdca5c4d7b2d2e0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcbacdd9
+aec4d0b8c3c6b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b8c3c6b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcc1c4c7
+bacdd9b0cbdcc1c4c7b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcc1c4c7b0cbdcbacdd9bacdd9b0cbdc
+bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9bacdd9
+b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb8c3c6b0cbdcbacdd9b0cbdcbacdd9
+b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcc1c4c7b0cbdcc1c4c7bacdd9
+b0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdc
+bacdd9b0cbdcb8c3c6bacdd9bacdd9b8c3c69fb0bbaec4d09fb0bb8a99ab9ea08a
+6b85458b9882afb9bcc1d4e2b8c3c6bacdd9bacdd9bacdd9b0cbdcbacdd9c1d4e2
+aec4d0bacdd9bacdd9bacdd9bacdd9b0cbdcc1d4e2bacdd9c1d4e2bacdd9bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2cdd5dec1d4e2cdd5decdd5decdd5decdd5decdd5decdd5decdd5de
+c5dae4cdd5decdd5dec1d4e2c1d4e2c1d4e2cdd5decdd5decdd5decdd5dedcd6d6
+cdd5decdd5decdd5dec1d4e2bacdd9c1d4e2cdd5debacdd9c1d4e2bacdd9cccdcc
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5decccdcccdd5dec1d4e2c1d4e2
+cccdcccdd5dec1d4e2cdd5decdd5decdd5decdd5decdd5dedcd6d6d2dee6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6ebeae7dfe1e6ebeae7dfe1e6ebeae7
+dfe1e6dcd6d69da1abdcd6d6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6
+cdd5dec1c4c7c1c4c7dcd6d6dcd6d6dcd6d6dcd6d6cccdccaeb0bdaeb0bdaeb0bd
+a5c4d7a5c4d7a5c4d7b0cbdca5c4d7a5c4d7a5c4d7a5c4d7a5c4d7b0cbdca5c4d7
+a5c4d7b0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7
+a5c4d7a5c4d7a5c4d7b0cbdca5c4d7a5c4d7b2d2e0a5c4d7b0cbdca5c4d7b0cbdc
+a5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcaec4d0b0cbdca5c4d7b0cbdc
+a5c4d7b0cbdcb0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdcbacdd9
+b0cbdcb0cbdcbacdd9bacdd9aec4d0b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdc
+b8c3c6b0cbdcbacdd9b0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcaec4d0aec4d0
+b0cbdcaec4d0b0cbdcaec4d0aec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdc
+aec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcaec4d0b0cbdcb0cbdc
+b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9a5c4d7b0cbdcb0cbdcbacdd9aec4d0b0cbdcb0cbdcaec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcaec4d0aec4d0b0cbdcb0cbdcb0cbdcb0cbdcb8c3c6
+b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0aec4d0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9aec4d0aec4d0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9aec4d0bacdd9b0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb2d2e0
+b0cbdcb0cbdcbacdd9bacdd9b8c3c6b0cbdcb0cbdcb0cbdcc1c4c7b0cbdcb0cbdc
+bacdd9bacdd9b0cbdcb0cbdcb0cbdcaec4d0bacdd9b0cbdcb0cbdcb0cbdcb8c3c6
+b0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+c1c4c7b0cbdcb0cbdcbacdd9c1c4c7b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9
+aec4d0bacdd9b2d2e0bacdd9b0cbdcbacdd9b0cbdcb0cbdcc1c4c7b0cbdcaec4d0
+b0cbdcbacdd9b0cbdcc1c4c7b0cbdcbacdd9bacdd9c1c4c7b0cbdcbacdd9b0cbdc
+b0cbdcc1c4c7b0cbdcbacdd9bacdd9c1c4c7b0cbdcbacdd9b0cbdcbacdd9b0cbdc
+bacdd9b0cbdcb0cbdcbacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9c1d4e2
+bacdd9b0cbdca5c4d7b8c3c6bacdd9bacdd9c1d4e2b8c3c67d9082757c718b919f
+757c719da1abaec4d0aec4d0aeb0bdaba9a6bacdd9bacdd9bacdd9bacdd9bacdd9
+c1d4e2b0cbdcb0cbdcbacdd9b2d2e0c1d4e2b0cbdcbacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9cccdccbacdd9bacdd9bacdd9
+cccdccc1d4e2cdd5decccdccc5dae4cdd5decdd5decdd5decdd5decdd5decdd5de
+cdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5decdd5ded2dee6
+cccdcccdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2cdd5decdd5decdd5decdd5dec1d4e2cdd5decdd5dec1d4e2
+c1d4e2d2dee6d2dee6c1d4e2cdd5decdd5decdd5ded2dee6d2dee6dcd6d6dfe1e6
+dcd6d6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6
+dfe1e6cdd5dedcd6d6dfe1e6dcd6d6cccdccdfe1e6dfe1e6dfe1e6c1c4c7c1c4c7
+cdd5decccdcccdd5decccdcccdd5decdd5deaba9a6c1c2ae9da1ababa9a6afb9bc
+a5c4d7a5c4d7a5c4d7a5c4d7b2d2e0a5c4d7a5c4d7b0cbdca5c4d7a5c4d7b0cbdc
+a5c4d7a5c4d7b0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdca5c4d7
+b2d2e0b0cbdca5c4d7a5c4d7b0cbdca5c4d7a5c4d7b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+b0cbdcb0cbdcb8c3c6bacdd9b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcbacdd9b0cbdc
+bacdd9b0cbdcc1c4c7b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9
+bacdd9aec4d0bacdd9aec4d0bacdd9b0cbdcb0cbdcaec4d0b0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcaec4d0bacdd9b0cbdcb0cbdcb0cbdcaec4d0b0cbdcaec4d0aec4d0b0cbdc
+b0cbdcb0cbdcaec4d0a5c4d7b0cbdcb0cbdca5c4d7b0cbdcaec4d0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb8c3c6
+b0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcc1c4c7bacdd9bacdd9
+bacdd9b0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdcb0cbdcb0cbdcc1c4c7b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9
+b0cbdcb0cbdcc1c4c7b0cbdcbacdd9bacdd9b0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9b2d2e0b0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcb0cbdcbacdd9b0cbdcc1c4c7
+b0cbdcbacdd9bacdd9b0cbdcb0cbdcaec4d0bacdd9b0cbdcbacdd9bacdd9b0cbdc
+bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9c1c4c7bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+cccdccb0cbdc9ea9b4afb9bcc1d4e2bacdd9c1d4e29fb0bb667c74667c74667c74
+576b339da1abafc0ab848887757c719da1abbacdd9c1d4e2bacdd9bacdd9bacdd9
+bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9cdd5de
+bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2cccdccbacdd9
+c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2cdd5dec1d4e2c5dae4c1d4e2cdd5de
+cdd5decdd5decdd5debacdd9c1d4e2c1d4e2cdd5dec1d4e2cdd5decdd5decdd5de
+d2dee6c1d4e2cccdccc1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2cdd5dec1d4e2cdd5debacdd9cdd5ded2dee6c1d4e2cdd5dec5dae4d2dee6
+c1d4e2cdd5decdd5decdd5decdd5decdd5dedcd6d6d2dee6dcd6d6d2dee6dcd6d6
+dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6ebeae7dfe1e6dcd6d6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dcd6d6dcd6d6cccdccdcd6d6dcd6d6c1c4c7
+cccdccb8c3c6afb9bcaeb0bdafb9bcafb9bc9da1ababa9a6aba9a68b919faeb0bd
+a5c4d7a5c4d7b0cbdca5c4d7a5c4d7a5c4d7b0cbdcb0cbdca5c4d7a5c4d7b0cbdc
+b2d2e0a5c4d7b0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b0cbdcb2d2e0a5c4d7b0cbdca5c4d7b0cbdca5c4d7b0cbdc
+a5c4d7b2d2e0a5c4d7b0cbdca5c4d7b0cbdcb0cbdca5c4d7a5c4d7b0cbdca5c4d7
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdca5c4d7b2d2e0
+aec4d0b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcaec4d0
+b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9
+bacdd9b0cbdcbacdd9bacdd9b8c3c6b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9bacdd9b0cbdcb0cbdcc1c4c7b0cbdcb0cbdcbacdd9aec4d0b0cbdcb0cbdc
+b0cbdcaec4d0bacdd9b0cbdcaec4d0b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+aec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb8c3c6
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0aec4d0b0cbdcb0cbdcb0cbdc
+b0cbdcaec4d0b0cbdcb0cbdcaec4d0b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcc1c4c7
+b0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9
+b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcc1c4c7b0cbdc
+aec4d0b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+b0cbdcbacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcc1d4e2b0cbdcb0cbdc
+bacdd9bacdd9b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdc
+bacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdc
+bacdd9bacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+b0cbdcbacdd9b0cbdcc1d4e2b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9
+bacdd9b0cbdcbacdd9bacdd9c1c4c7bacdd9bacdd9b2d2e0bacdd9bacdd9b0cbdc
+bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdc
+bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9c1d4e2cccdccbacdd9
+c1d4e2bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9afb9bc
+9ea9b49fb0bb92a8b6aeb0bdb0cbdcbacdd9bacdd9a0b09f7b90346b8545627444
+576a626374716b8673547443667c74afb9bcb0cbdcb0cbdcbacdd9b0cbdcbacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9cdd5dec1d4e2cccdccbacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9bacdd9bacdd9cdd5debacdd9c1d4e2cdd5debacdd9
+c1d4e2bacdd9cdd5decdd5dec1d4e2cdd5dec1d4e2cdd5dec1d4e2c1d4e2c1d4e2
+c1d4e2cccdcccdd5debacdd9c1d4e2bacdd9bacdd9cdd5dec1d4e2c1d4e2cdd5de
+c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5dec1d4e2cdd5decdd5decdd5decdd5de
+d2dee6cdd5decdd5decdd5ded2dee6cdd5ded2dee6cdd5ded2dee6dcd6d6dfe1e6
+dfe1e6dcd6d6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6ebeae7
+dfe1e6dcd6d6dcd6d6dfe1e6dfe1e6dfe1e6cccdccafb9bccccdccc1c4c7c1c4c7
+c1c4c7aba9a69da1ab9d99819d99819da1ab9ea88eafb9bcb8c3c68488878b919f
+b0cbdca5c4d7a5c4d7b2d2e0b0cbdca5c4d7b2d2e0a5c4d7b0cbdca5c4d7a5c4d7
+b2d2e0a5c4d7b0cbdcb0cbdca5c4d7b2d2e0a5c4d7b2d2e0b0cbdcb0cbdca5c4d7
+b0cbdcb0cbdcb0cbdca5c4d7b2d2e0b0cbdcb0cbdcb0cbdca5c4d7b2d2e0a5c4d7
+b0cbdca5c4d7a5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdc
+b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb8c3c6b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcb0cbdcc1d4e2b0cbdcb0cbdcb0cbdcbacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9b0cbdcc1c4c7b0cbdcbacdd9b0cbdc
+c1c4c7bacdd9b0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcb0cbdcb8c3c6
+b0cbdcb0cbdcbacdd9bacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9aec4d0bacdd9
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb8c3c6b0cbdcb0cbdcaec4d0aec4d0b0cbdcb0cbdcaec4d0b0cbdcb0cbdc
+b0cbdcb0cbdcaec4d0bacdd9aec4d0b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0bacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9
+b0cbdcb0cbdcb8c3c6b0cbdcb0cbdcbacdd9b0cbdcbacdd9b2d2e0b0cbdcbacdd9
+bacdd9b0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcb2d2e0
+b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcbacdd9c1c4c7b0cbdcb0cbdcbacdd9bacdd9
+b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9b0cbdcb0cbdc
+bacdd9b0cbdcbacdd9b0cbdcbacdd9bacdd9b0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+b0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9
+bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9
+bacdd9bacdd9b2d2e0b2d2e0bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcb0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2cccdcc
+bacdd9bacdd9c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9c1d4e2c1d4e2bacdd9
+9d99818b9080857d6787886d8b98829ea08a8ea0896b8545627444576b334c5026
+3f4e32576a624960326b86737e9882aeb0bdafb9bcaec4d0bacdd9bacdd9bacdd9
+bacdd9c1d4e2bacdd9bacdd9bacdd9bacdd9cccdccc1d4e2cdd5decdd5dec1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9cdd5decdd5decdd5decdd5dec1d4e2
+cdd5debacdd9cdd5decdd5decdd5decdd5dec1d4e2cccdccc1d4e2cdd5debacdd9
+c1d4e2bacdd9c1d4e2c1d4e2bacdd9cdd5debacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9cdd5decdd5debacdd9cdd5decdd5dec1d4e2bacdd9c1d4e2cccdccc1d4e2
+cdd5decdd5dec5dae4cdd5dec1d4e2cdd5decdd5decdd5decdd5dec1d4e2cdd5de
+cdd5decdd5ded2dee6cdd5dec5dae4dcd6d6d2dee6dcd6d6d2dee6d2dee6dcd6d6
+d2dee6dfe1e6dfe1e6dcd6d6dfe1e6dcd6d6dfe1e6ebeae7dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dcd6d6dfe1e6dcd6d6cdd5dec1c4c7
+afb9bca0b09fa0b09f8a99ab8ea0899ea9b4aeb0bdaeb0bdaeb0bdafb9bcb8c3c6
+a5c4d7b2d2e0a5c4d7a5c4d7b2d2e0a5c4d7a5c4d7a5c4d7b0cbdcb0cbdcb0cbdc
+a5c4d7b2d2e0a5c4d7a5c4d7b2d2e0a5c4d7b0cbdca5c4d7a5c4d7b0cbdca5c4d7
+a5c4d7a5c4d7b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+a5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+c1c4c7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcb0cbdc
+b0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9bacdd9bacdd9
+bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9b0cbdc
+bacdd9b0cbdcbacdd9bacdd9b0cbdcb0cbdcb0cbdcbacdd9c1c4c7bacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9b8c3c6b0cbdcb0cbdcb0cbdcb0cbdcaec4d0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb8c3c6b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcbacdd9bacdd9bacdd9bacdd9b0cbdcb0cbdcbacdd9b0cbdcb0cbdc
+bacdd9bacdd9b0cbdcb0cbdcbacdd9c1c4c7b0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+bacdd9b0cbdcb2d2e0bacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdc
+b0cbdcbacdd9b0cbdcbacdd9bacdd9b0cbdcb0cbdcb0cbdcc1d4e2b0cbdcbacdd9
+bacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcc1d4e2bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9b0cbdcbacdd9c1c4c7b0cbdcb2d2e0bacdd9b0cbdcbacdd9bacdd9
+c1c4c7b0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9b0cbdc
+bacdd9c1c4c7bacdd9bacdd9bacdd9b0cbdcc1d4e2b0cbdcb2d2e0b0cbdcbacdd9
+bacdd9bacdd9bacdd9bacdd9b2d2e0b2d2e0bacdd9bacdd9bacdd9b2d2e0bacdd9
+bacdd9b2d2e0b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2cccdccc1d4e2cdd5de
+bacdd9cccdccbacdd9c1d4e2c1d4e2cccdccc1d4e2c1d4e2bacdd9c1d4e2c1c4c7
+ada17f857d6786874a95885c9a9178767b4762744468752b576b333f4e1e272c1f
+2b33223944463a4423667c74757c71848887aba9a6aec4d0c1d4e2bacdd9bacdd9
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2cdd5dec1d4e2d2dee6c1d4e2c5dae4cdd5de
+d2dee6cdd5decccdccd2dee6cdd5dec5dae4cdd5decdd5decdd5decdd5debacdd9
+cdd5decdd5decdd5decdd5ded2dee6d2dee6cdd5decdd5decdd5decdd5decdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2cdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5ded2dee6c1d4e2c1d4e2cdd5de
+c1d4e2cdd5dec1d4e2c1d4e2c1d4e2cdd5dec1d4e2d2dee6cdd5decccdcccdd5de
+d2dee6cdd5decdd5ded2dee6cdd5ded2dee6cdd5ded2dee6dcd6d6dcd6d6dfe1e6
+dcd6d6dcd6d6dfe1e6dfe1e6dcd6d6ebeae7dcd6d6dfe1e6dfe1e6dcd6d6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6c1c4c7c1c4c7
+b8c1afafb9bcc1c4c79da1ab9da1ab9ea9b4aeb0bdafb9bcc1c4c7cfc6b8c1c4c7
+a5c4d7a5c4d7a5c4d7b2d2e0a5c4d7b0cbdcb2d2e0a5c4d7b2d2e0a5c4d7b0cbdc
+a5c4d7a5c4d7b0cbdcb0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdca5c4d7b2d2e0
+b0cbdca5c4d7b2d2e0a5c4d7b2d2e0a5c4d7b0cbdcb2d2e0b2d2e0b2d2e0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdca5c4d7b2d2e0a5c4d7b2d2e0b0cbdcb0cbdcb0cbdc
+b0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+aec4d0b0cbdcb0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9b0cbdcb0cbdcb2d2e0
+b0cbdcbacdd9b0cbdcbacdd9bacdd9c1c4c7bacdd9b2d2e0b0cbdcb0cbdcbacdd9
+bacdd9b0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9b0cbdcb0cbdcbacdd9
+b0cbdcb0cbdcc1c4c7bacdd9b0cbdcbacdd9b0cbdcc1c4c7bacdd9bacdd9b0cbdc
+b0cbdcbacdd9b0cbdcb8c3c6b0cbdcb0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcaec4d0bacdd9b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9bacdd9b0cbdcb0cbdcb0cbdcbacdd9b0cbdcb0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdcb0cbdcb2d2e0b0cbdcbacdd9
+bacdd9b2d2e0b0cbdcb0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9
+b0cbdcb0cbdcbacdd9b0cbdcc1c4c7b0cbdcbacdd9bacdd9b2d2e0b0cbdcb0cbdc
+bacdd9c1d4e2b0cbdcbacdd9bacdd9bacdd9c1d4e2b0cbdcbacdd9b0cbdcb2d2e0
+bacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9b2d2e0b0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b2d2e0c1d4e2bacdd9
+bacdd9b2d2e0bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9c1d4e2b0cbdc
+bacdd9bacdd9bacdd9b2d2e0b0cbdcbacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2
+c1d4e2c1d4e2bacdd9b2d2e0c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2c1d4e2cdd5dec1d4e2c1d4e2cccdcccdd5decdd5de
+cdd5decdd5dec1d4e2bacdd9c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+c0b8a69a917874643e75704d666033767b47576b335e7429576b33475832475832
+354c313f4e323944467787728a99ab8488879d9981bacdd9cccdccc1d4e2c1d4e2
+cdd5dec1d4e2bacdd9c1d4e2c1d4e2cdd5decdd5dec1d4e2c1d4e2cdd5decdd5de
+d2dee6d2dee6cdd5decdd5decdd5decdd5ded2dee6cdd5decdd5decdd5dec1d4e2
+cdd5decdd5ded2dee6d2dee6cdd5dedfe1e6d2dee6cdd5decdd5decdd5dec1d4e2
+cdd5decdd5dec1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2cdd5decdd5dec1d4e2cdd5dec1d4e2cdd5dec5dae4cdd5de
+cdd5decdd5decdd5decdd5decdd5decdd5decdd5decdd5ded2dee6cdd5decdd5de
+d2dee6cdd5ded2dee6cdd5ded2dee6dcd6d6dfe1e6d2dee6cdd5dedfe1e6dcd6d6
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dcd6d6dcd6d6dfe1e6
+dfe1e6dcd6d6dfe1e6dcd6d6cdd5dedfe1e6cdd5dedfe1e6c1c4c79da1ababa9a6
+b8c3c6cdd5dec1c4c78ea089637471afb09e9ea9b4c0b8a69da1ab9da1ababa9a6
+b0cbdca5c4d7b0cbdca5c4d7a5c4d7b0cbdca5c4d7b0cbdca5c4d7b0cbdcb0cbdc
+a5c4d7b0cbdca5c4d7b2d2e0b2d2e0a5c4d7b0cbdcb0cbdcb0cbdcb0cbdca5c4d7
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0
+b2d2e0b2d2e0bacdd9b0cbdcb2d2e0b0cbdcb2d2e0a5c4d7b2d2e0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcc1c4c7
+b0cbdcc1c4c7b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9c1c4c7bacdd9bacdd9
+bacdd9bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9b2d2e0b0cbdcbacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9
+b0cbdcbacdd9b0cbdcbacdd9c1c4c7b0cbdcb0cbdcc1d4e2b0cbdcbacdd9b0cbdc
+b0cbdcb0cbdcbacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9
+bacdd9bacdd9b0cbdcb2d2e0c1d4e2b0cbdcb0cbdcbacdd9b8c3c6bacdd9bacdd9
+b0cbdcc1d4e2b0cbdcbacdd9b0cbdcbacdd9b0cbdcbacdd9b2d2e0b0cbdcbacdd9
+bacdd9b0cbdcbacdd9bacdd9b0cbdcbacdd9b2d2e0b2d2e0b0cbdcbacdd9bacdd9
+b0cbdcbacdd9b0cbdcbacdd9b2d2e0bacdd9b2d2e0b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9b2d2e0bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdc
+bacdd9bacdd9b0cbdcc1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9
+bacdd9bacdd9b2d2e0bacdd9b2d2e0bacdd9b2d2e0bacdd9bacdd9b0cbdcbacdd9
+bacdd9b0cbdcc1d4e2b0cbdcc1d4e2c1d4e2bacdd9bacdd9bacdd9bacdd9c1d4e2
+b2d2e0bacdd9bacdd9bacdd9bacdd9b2d2e0c1d4e2b2d2e0bacdd9b0cbdcc1d4e2
+b0cbdcb2d2e0c1d4e2b2d2e0bacdd9b2d2e0c1d4e2b0cbdcc1d4e2bacdd9bacdd9
+c1d4e2b2d2e0c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9b2d2e0b2d2e0c1d4e2
+b2d2e0bacdd9c1d4e2bacdd9b2d2e0b2d2e0bacdd9bacdd9c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2cdd5dec1d4e2cdd5decdd5de
+c1d4e2cccdccc1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4cccdcc
+c1d4e2afb9bc9d998175704d4e44255658383f4e1e5474435e7429576b33547443
+6b8673637471667c749fb0bbbacdd98a99abafb9bcc1d4e2c1d4e2cdd5decdd5de
+cdd5decdd5dec1d4e2cdd5decdd5decccdcccdd5decdd5decdd5ded2dee6cdd5de
+cdd5decdd5decdd5decdd5ded2dee6d2dee6cdd5decdd5decdd5decdd5decdd5de
+c5dae4cdd5decdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5decdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2
+cdd5decdd5dec1d4e2c1d4e2bacdd9cdd5dec1d4e2cdd5dec1d4e2d2dee6cdd5de
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6dfe1e6d2dee6cdd5ded2dee6dfe1e6
+dcd6d6d2dee6dcd6d6d2dee6cdd5decdd5decdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6dcd6d6dfe1e6dcd6d6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6
+dcd6d6dfe1e6dfe1e6d2dee6dfe1e6dcd6d6d2dee6cccdcccdd5dec0b8a6afb9bc
+b8c3c6c1c4c7b8c1afa0b09fb0b8a3a3b7a48ea0898a99ab8b919f9da1ab757c71
+b0cbdcb0cbdca5c4d7b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdca5c4d7
+b0cbdcb0cbdcb0cbdca5c4d7b2d2e0b2d2e0b0cbdca5c4d7b2d2e0b0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdca5c4d7a5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcbacdd9b2d2e0b2d2e0b2d2e0b0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcc1d4e2b0cbdc
+b0cbdcb0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcb2d2e0bacdd9b2d2e0
+b0cbdcbacdd9bacdd9c1d4e2b2d2e0bacdd9bacdd9c1d4e2b2d2e0bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+c1d4e2bacdd9c1d4e2bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2b2d2e0b2d2e0bacdd9bacdd9bacdd9
+bacdd9b0cbdcb0cbdcbacdd9bacdd9b0cbdcbacdd9c1d4e2bacdd9bacdd9b0cbdc
+bacdd9b0cbdcc1d4e2b0cbdcb0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9b0cbdcbacdd9b0cbdcbacdd9b0cbdcb0cbdcbacdd9bacdd9bacdd9b0cbdc
+b0cbdcbacdd9bacdd9b0cbdcb2d2e0bacdd9bacdd9c1d4e2bacdd9b0cbdcb2d2e0
+b0cbdcbacdd9b2d2e0bacdd9bacdd9b2d2e0bacdd9bacdd9bacdd9b2d2e0c1d4e2
+bacdd9bacdd9bacdd9bacdd9b0cbdcc1d4e2bacdd9bacdd9c1d4e2b0cbdcbacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2b2d2e0b0cbdcc1d4e2b2d2e0
+bacdd9c1d4e2bacdd9c1d4e2b2d2e0c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2
+bacdd9bacdd9cccdccc1d4e2c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2b2d2e0bacdd9bacdd9
+bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2bacdd9c1d4e2
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2bacdd9b2d2e0b2d2e0c1d4e2
+c1d4e2b2d2e0c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2bacdd9b2d2e0bacdd9
+c1d4e2c1d4e2b2d2e0bacdd9c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2bacdd9
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2cdd5decccdcccdd5de
+d2dee6c1d4e2cdd5dec1d4e2c1d4e2c1d4e2bacdd9cdd5decdd5dec1d4e2aec4d0
+aec4d08da0b6848887626e8c3944463f4e325474436b8545657c444960324b6865
+7d98b1aec4d0bacdd9bacdd9c1c4c78a99abc1d4e2c5dae4c5dae4cdd5dec5dae4
+cdd5decdd5decdd5decdd5ded2dee6cdd5ded2dee6cdd5decdd5decdd5decdd5de
+cdd5ded2dee6dfe1e6cdd5ded2dee6d2dee6cdd5decdd5decdd5ded2dee6cdd5de
+cdd5ded2dee6d2dee6cdd5decdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2cdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5dec5dae4
+c1d4e2cdd5dec1d4e2cdd5decdd5ded2dee6d2dee6cdd5decdd5ded2dee6cdd5de
+d2dee6cdd5ded2dee6d2dee6cdd5ded2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6dcd6d6dfe1e6dfe1e6cdd5dedfe1e6cdd5decdd5dedfe1e6
+dcd6d6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6d2dee6dcd6d6dfe1e6
+dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6cdd5dec0b8a6c1c4c7dcd6d6cccdccafb9bc
+afb9bcc0b8a6b8c3c6cdd5deb8c3c6afc0abbacdd9afb9bc9ea9b4a3b8bc9ea9b4
+b0cbdca5c4d7b2d2e0b0cbdca5c4d7b2d2e0a5c4d7b0cbdca5c4d7b2d2e0b2d2e0
+a5c4d7b0cbdcb2d2e0b2d2e0b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdc
+b0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b0cbdca5c4d7b2d2e0b0cbdcb0cbdcb0cbdc
+bacdd9b0cbdcb0cbdcb0cbdcb0cbdcbacdd9bacdd9c1d4e2b2d2e0b2d2e0b2d2e0
+b2d2e0b2d2e0b0cbdcbacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b0cbdcb2d2e0bacdd9
+bacdd9bacdd9bacdd9b0cbdcbacdd9bacdd9bacdd9b0cbdcc1d4e2bacdd9bacdd9
+bacdd9b2d2e0b2d2e0b2d2e0c1d4e2bacdd9c1d4e2bacdd9bacdd9bacdd9c1d4e2
+c1c4c7c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9bacdd9bacdd9bacdd9c1d4e2
+bacdd9c1d4e2b2d2e0c1d4e2bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9b0cbdcbacdd9b0cbdcc1d4e2c1d4e2
+bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9b0cbdcbacdd9bacdd9bacdd9
+bacdd9bacdd9b0cbdcb2d2e0bacdd9bacdd9bacdd9b2d2e0b0cbdcbacdd9c1d4e2
+b0cbdcb2d2e0b0cbdcbacdd9bacdd9c1d4e2c1d4e2b2d2e0bacdd9bacdd9bacdd9
+c1d4e2b0cbdcc1d4e2bacdd9bacdd9b0cbdcc1d4e2b2d2e0bacdd9bacdd9b2d2e0
+c1d4e2b2d2e0b0cbdcc1d4e2b2d2e0c1d4e2c1d4e2bacdd9b2d2e0c1d4e2aec4d0
+b2d2e0b2d2e0c1d4e2c1d4e2bacdd9bacdd9b2d2e0b2d2e0b0cbdcc1d4e2c1d4e2
+bacdd9c1d4e2bacdd9b2d2e0bacdd9bacdd9bacdd9b2d2e0b2d2e0bacdd9bacdd9
+bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9b2d2e0c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2cccdcccdd5decdd5decdd5dec1d4e2c1d4e2cdd5dec1d4e2
+c1d4e2b0cbdcc5dae4bacdd9bacdd9b2d2e0b2d2e0bacdd9bacdd9bacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9c1d4e2b2d2e0bacdd9b2d2e0c1d4e2c1d4e2c1d4e2
+c1d4e2b2d2e0c1d4e2b2d2e0bacdd9c1d4e2bacdd9bacdd9bacdd9c1d4e2b0cbdc
+c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2b2d2e0b2d2e0
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2b2d2e0bacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2cdd5de
+cdd5decdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9afb9bc
+92a8b6a3b8bc54605f4658644960656b8673657c44666c5e56603a547443819fb7
+a3b8bcaec4d0c1d4e2afb9bc8b98828da0b6c1c4c7d2dee6cdd5decdd5decdd5de
+d2dee6cdd5decdd5decdd5ded2dee6d2dee6cdd5ded2dee6d2dee6d2dee6dcd6d6
+d2dee6dcd6d6cdd5dedfe1e6dcd6d6dfe1e6d2dee6dfe1e6cdd5decdd5dec5dae4
+c5dae4d2dee6cdd5ded2dee6cdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+cdd5dec5dae4cdd5decdd5dec1d4e2c1d4e2cdd5decdd5dec1d4e2cdd5decdd5de
+d2dee6c5dae4c5dae4c5dae4d2dee6cdd5decdd5ded2dee6d2dee6cdd5ded2dee6
+cdd5dedfe1e6d2dee6cdd5decdd5dedfe1e6dcd6d6dfe1e6dfe1e6dcd6d6dcd6d6
+dfe1e6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dcd6d6
+dfe1e6d2dee6dfe1e6dcd6d6dcd6d6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6cccdccc1c4c7cccdcccdd5dedcd6d6afb9bc
+cdd5decdd5deafb9bcafb9bc9da1abaeb0bdaeb0bdafb9bcb8c3c6c1c4c7cccdcc
+b0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b2d2e0b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b0cbdcb2d2e0
+b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0bacdd9b0cbdcb2d2e0b0cbdcc1d4e2c1d4e2
+b2d2e0c5dae4b2d2e0c1d4e2bacdd9bacdd9b2d2e0c1d4e2b2d2e0b2d2e0bacdd9
+bacdd9b2d2e0c1d4e2b2d2e0b2d2e0bacdd9b2d2e0bacdd9b2d2e0b2d2e0b2d2e0
+b2d2e0bacdd9b2d2e0b2d2e0c1d4e2bacdd9bacdd9c1d4e2b0cbdcbacdd9bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9bacdd9
+bacdd9c1d4e2bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9
+bacdd9c1d4e2c1d4e2b0cbdcc1d4e2bacdd9b2d2e0c1d4e2bacdd9bacdd9b2d2e0
+bacdd9c1d4e2b0cbdcc1d4e2b0cbdcc1d4e2bacdd9bacdd9bacdd9bacdd9bacdd9
+bacdd9c1d4e2bacdd9bacdd9bacdd9bacdd9bacdd9b2d2e0b0cbdcbacdd9bacdd9
+b0cbdcc1d4e2bacdd9bacdd9bacdd9b2d2e0b0cbdcc1d4e2b0cbdcc1d4e2bacdd9
+c1d4e2bacdd9c1d4e2bacdd9b2d2e0b2d2e0b0cbdcb2d2e0bacdd9c1d4e2bacdd9
+b0cbdcc1d4e2bacdd9c1d4e2bacdd9b2d2e0c1d4e2b0cbdcbacdd9c1d4e2bacdd9
+bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2bacdd9c1d4e2bacdd9b2d2e0
+b0cbdcbacdd9c1d4e2b2d2e0bacdd9b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2cdd5decdd5decdd5decdd5decdd5ded2dee6cdd5decdd5decdd5dec1d4e2
+c1d4e2bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9c1d4e2c5dae4bacdd9b2d2e0
+bacdd9c1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2b0cbdcc1d4e2b2d2e0c1d4e2b0cbdcc1d4e2c1d4e2bacdd9bacdd9c1d4e2
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5de
+c1d4e2cdd5decdd5dec1d4e2cccdccc1d4e2c1d4e2c1d4e2c1d4e2cdd5deafb9bc
+8b919f87886d657c44657c446b86738b9882576a626274444960326b8673709081
+7a91a8607590757c716b8673757c71a3b8bccdd5ded2dee6cdd5decdd5ded2dee6
+d2dee6cccdcc9ea9b4cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5dedfe1e6
+d2dee6dfe1e6d2dee6cdd5ded2dee6cdd5decdd5ded2dee6d2dee6cdd5decdd5de
+d2dee6cdd5ded2dee6cdd5ded2dee6cdd5decdd5decdd5decdd5dec1d4e2c5dae4
+c5dae4d9e6ead2dee6cdd5dec5dae4c1d4e2cdd5dec5dae4d2dee6c1d4e2cdd5de
+cdd5dec5dae4d2dee6c1d4e2d2dee6cdd5ded2dee6cdd5dedfe1e6cdd5dedfe1e6
+d2dee6dcd6d6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dcd6d6dfe1e6cdd5dedfe1e6
+dcd6d6dcd6d6dfe1e6dcd6d6d2dee6d2dee6dcd6d6dfe1e6dfe1e6d2dee6dcd6d6
+dcd6d6d2dee6d2dee6dfe1e6dcd6d6d2dee6d2dee6dfe1e6cdd5dedfe1e6dfe1e6
+dfe1e6dcd6d6d2dee6dcd6d6cdd5deafb9bcaeb0bdcdd5decdd5dec1c4c7c1c4c7
+cccdccaba9a6a0b09f9ea88e8ea089a3b7a48b90808a99abcccdccc1c4c7cdd5de
+a5c4d7b0cbdcb2d2e0a5c4d7b0cbdcb2d2e0b0cbdcb0cbdcb2d2e0b0cbdcb0cbdc
+b0cbdcb0cbdcb2d2e0b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b0cbdcbacdd9b0cbdcb0cbdcb2d2e0b0cbdcb2d2e0b0cbdcb2d2e0b0cbdcbacdd9
+b2d2e0b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2bacdd9b2d2e0bacdd9b2d2e0
+bacdd9bacdd9c1d4e2b0cbdcc1d4e2b2d2e0bacdd9b2d2e0bacdd9bacdd9b0cbdc
+b2d2e0bacdd9bacdd9b2d2e0c1d4e2bacdd9b2d2e0bacdd9c1d4e2c1d4e2b2d2e0
+c1d4e2bacdd9c1d4e2b2d2e0c1d4e2bacdd9bacdd9bacdd9bacdd9bacdd9c1d4e2
+bacdd9bacdd9c1d4e2c1d4e2bacdd9cccdccbacdd9c1d4e2bacdd9b2d2e0bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9bacdd9
+c1d4e2bacdd9bacdd9bacdd9bacdd9b0cbdcc1d4e2bacdd9bacdd9c1d4e2c1d4e2
+b2d2e0b0cbdcc1d4e2bacdd9b2d2e0bacdd9b2d2e0b2d2e0bacdd9bacdd9bacdd9
+b2d2e0bacdd9b2d2e0bacdd9b2d2e0bacdd9bacdd9b0cbdcc1d4e2bacdd9b2d2e0
+b2d2e0c1d4e2c1d4e2b2d2e0bacdd9b0cbdcc1d4e2bacdd9bacdd9bacdd9bacdd9
+bacdd9b2d2e0bacdd9bacdd9c1d4e2bacdd9b2d2e0bacdd9c1d4e2b0cbdcb2d2e0
+c1d4e2b0cbdcc1d4e2b2d2e0bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9
+bacdd9c1d4e2b2d2e0c1d4e2bacdd9bacdd9bacdd9b2d2e0b0cbdcbacdd9bacdd9
+c1d4e2b2d2e0bacdd9c1d4e2bacdd9bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2bacdd9c1d4e2cdd5de
+cdd5decdd5decdd5decdd5ded2dee6cdd5decdd5dec1d4e2cdd5dec5dae4c1d4e2
+cdd5dec1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2
+b2d2e0c1d4e2bacdd9c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c5dae4bacdd9c1d4e2bacdd9c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+bacdd9bacdd9c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2bacdd9cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2bacdd9
+cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b8c3c6b8c3c69ea08a
+867c4c757c71657c44618345778746627444657c44627444657c44627444394446
+354c315773767787726b86738ea089b8c3c6cdd5ded2dee6cdd5ded2dee6cdd5de
+cdd5dea0b09f8a99abc5dae4dcd6d6d2dee6dcd6d6dcd6d6d2dee6dcd6d6cdd5de
+d2dee6d2dee6dcd6d6d2dee6d2dee6d2dee6cdd5decdd5decdd5decdd5ded2dee6
+cdd5ded2dee6d2dee6cdd5decdd5ded2dee6d2dee6cdd5ded2dee6cdd5decdd5de
+cdd5ded2dee6cdd5ded2dee6cdd5decdd5dec1d4e2d2dee6cdd5decdd5ded2dee6
+c1d4e2d2dee6c1d4e2d2dee6cdd5ded2dee6dcd6d6d2dee6d2dee6d2dee6dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6
+d2dee6d2dee6dfe1e6dcd6d6dfe1e6d2dee6dfe1e6dcd6d6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6cdd5dedfe1e6dfe1e6dcd6d6dfe1e6cdd5dedfe1e6dcd6d6dfe1e6
+dfe1e6dfe1e6dfe1e6cdd5dedfe1e6cdd5ded2dee6cdd5decfc6b8aba9a6a0b09f
+aba9a687886d8488877787729fb0bbc0cbb8b8c3c6c1c4c7bacdd99ea9b4b8c3c6
+b0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b0cbdcb0cbdcb2d2e0
+b2d2e0a5c4d7b2d2e0a5c4d7b2d2e0b0cbdcb0cbdcb0cbdcb2d2e0a5c4d7b2d2e0
+b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b2d2e0b0cbdcb0cbdcbacdd9
+b0cbdcb2d2e0b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb2d2e0b0cbdcc1d4e2
+b0cbdcb2d2e0bacdd9b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2
+b2d2e0bacdd9bacdd9bacdd9c1d4e2c1d4e2bacdd9b2d2e0b2d2e0c1d4e2c1d4e2
+b0cbdcbacdd9b0cbdcc1d4e2b2d2e0b2d2e0b2d2e0bacdd9b2d2e0bacdd9b0cbdc
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2b2d2e0c1d4e2bacdd9c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2bacdd9
+bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2bacdd9
+c1d4e2c1d4e2bacdd9bacdd9c1d4e2b2d2e0c1d4e2b0cbdcbacdd9bacdd9c1d4e2
+b2d2e0bacdd9bacdd9bacdd9bacdd9c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0
+bacdd9c1d4e2b2d2e0bacdd9c1d4e2bacdd9bacdd9bacdd9b2d2e0bacdd9bacdd9
+c1d4e2b0cbdcc1d4e2b2d2e0c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0
+b2d2e0c1d4e2bacdd9c1d4e2b2d2e0c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2bacdd9
+bacdd9c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2bacdd9c1d4e2bacdd9c5dae4c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2b0cbdcc5dae4cccdcccdd5dec1d4e2cdd5de
+cdd5decdd5decdd5decdd5ded2dee6c1d4e2cdd5decdd5decdd5decdd5dec1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2
+b2d2e0c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2bacdd9c1d4e2bacdd9c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+b2d2e0bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+cdd5dec5dae4d2dee6bacdd99ea9b4b8c3c6c1d4e2bacdd9aeb0bd8a99ab857d67
+767b475f615647583249603277874686874a767b475e7429657c446274443d573b
+576a62709081637471666c5eb8c3c6cdd5decdd5ded2dee6d2dee6cdd5decdd5de
+c1c4c79d9981aeb0bdcdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6
+dcd6d6d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6cdd5decdd5dec5dae4cdd5de
+cdd5ded2dee6cdd5dec5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4d2dee6cdd5de
+cdd5ded2dee6cdd5decdd5decdd5ded2dee6dfe1e6dcd6d6dfe1e6dfe1e6dcd6d6
+dfe1e6dcd6d6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6
+dcd6d6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6dfe1e6cdd5ded2dee6d2dee6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6c1c4c7dcd6d6cccdccb8c3c69da1ab95af7a
+8b9882a0b09f8ea0898a99abaec4d0b8c3c6c1d4e2dcd6d69da1ab666c5e8da0b6
+b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b0cbdcb2d2e0b2d2e0b0cbdc
+a5c4d7b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b0cbdcb0cbdcb0cbdc
+a5c4d7b2d2e0b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b0cbdcbacdd9b0cbdc
+b2d2e0b0cbdcbacdd9c1d4e2b0cbdcbacdd9c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9bacdd9
+c1d4e2c1d4e2bacdd9c1d4e2bacdd9b2d2e0c1d4e2c1d4e2bacdd9b2d2e0c5dae4
+bacdd9b2d2e0bacdd9c1d4e2b2d2e0c1d4e2bacdd9c1d4e2bacdd9bacdd9c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2bacdd9cccdccc1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2bacdd9bacdd9c1d4e2bacdd9c1d4e2b2d2e0c1d4e2
+bacdd9c1d4e2bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9bacdd9b2d2e0
+bacdd9bacdd9b2d2e0bacdd9bacdd9c1d4e2bacdd9b2d2e0c1d4e2bacdd9bacdd9
+bacdd9bacdd9b0cbdcb0cbdcc1d4e2bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9b2d2e0
+bacdd9c1d4e2bacdd9c1d4e2bacdd9b2d2e0b2d2e0b2d2e0bacdd9b2d2e0c1d4e2
+c1d4e2bacdd9b2d2e0c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2
+c1d4e2b2d2e0c1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5de
+c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5decdd5decdd5de
+cdd5ded2dee6cdd5decdd5decdd5decdd5decccdccc1d4e2cdd5decdd5decdd5de
+cdd5dec1d4e2cdd5dec1d4e2c1d4e2c1d4e2bacdd9bacdd9bacdd9c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2cdd5dec1d4e2cdd5dec5dae4
+cdd5dec1d4e2c1d4e2bacdd99ea9b48a99abafb9bc9fb0bb9fb0bbb8c3c6b0b8a3
+8a99ab757c71667c74627444778746767b4756603a778772576b3386874a6b8545
+7d98b1a4bfb5778746666c5eafb9bcd2dee6d2dee6cdd5decdd5ded2dee6afb9bc
+9d99819da1abafb9bcc1d4e2d2dee6cccdcccdd5decdd5decdd5decdd5dedfe1e6
+cdd5decdd5ded2dee6cdd5decdd5decdd5ded2dee6cdd5decdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6dcd6d6d2dee6cdd5ded2dee6cdd5decdd5dec5dae4
+cdd5decdd5dec5dae4d2dee6cdd5dec5dae4cdd5decdd5decdd5dec1d4e2c1d4e2
+c5dae4cdd5ded2dee6cdd5decdd5dedcd6d6dfe1e6d2dee6d2dee6dfe1e6dfe1e6
+dfe1e6dfe1e6d2dee6dcd6d6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dcd6d6dfe1e6
+dfe1e6dcd6d6d2dee6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6d2dee6
+dfe1e6dcd6d6dfe1e6dfe1e6dcd6d6dfe1e6cdd5dedfe1e6d2dee6dcd6d6d2dee6
+cdd5dedfe1e6d2dee6dfe1e6cdd5debacdd9cccdcccdd5decdd5de9ea88ea0b09f
+a0b09f9da1ab848887afc0ab9ea9b475889bb8c3c6d2dee6afb9bc8da0b6afb9bc
+a5c4d7b2d2e0b0cbdcb0cbdca5c4d7b0cbdcb0cbdca5c4d7b2d2e0b2d2e0b2d2e0
+b2d2e0b2d2e0b0cbdcb0cbdcb2d2e0b0cbdca5c4d7b2d2e0b2d2e0b2d2e0b0cbdc
+b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0bacdd9b0cbdcb2d2e0b2d2e0
+b2d2e0b2d2e0bacdd9bacdd9b2d2e0b2d2e0bacdd9bacdd9b2d2e0b2d2e0c1d4e2
+b2d2e0b2d2e0bacdd9b0cbdcc1d4e2b0cbdcb2d2e0c1d4e2c1d4e2b2d2e0bacdd9
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2b2d2e0bacdd9
+bacdd9b2d2e0c1d4e2b0cbdcc1d4e2b0cbdcbacdd9c1d4e2b2d2e0b2d2e0b2d2e0
+b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9bacdd9bacdd9bacdd9
+bacdd9c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2bacdd9
+c1d4e2bacdd9bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9bacdd9c1d4e2
+bacdd9c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2bacdd9
+c1d4e2c1d4e2bacdd9c1d4e2b2d2e0bacdd9bacdd9bacdd9bacdd9c1d4e2bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9b2d2e0c1d4e2c1d4e2bacdd9bacdd9bacdd9c1d4e2b2d2e0bacdd9
+c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0bacdd9bacdd9bacdd9
+c1d4e2c1d4e2bacdd9bacdd9c1d4e2bacdd9bacdd9bacdd9c1d4e2bacdd9bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9cdd5dec5dae4c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2d2dee6cdd5de
+cdd5decdd5decdd5decdd5decdd5dec1d4e2cdd5decccdcccdd5dec5dae4cdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2b2d2e0c5dae4b2d2e0c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+b2d2e0c1d4e2c1d4e2c1d4e2bacdd9c5dae4c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2cdd5dec1d4e2cdd5dec1d4e2
+cdd5dec1d4e2c5dae4cccdccaba9a68b90808ea0898b9882657c448ea089b8c3c6
+bacdd9a3b8bc94afa18b98826f8f52757c718b90806b8673666b3b6374717d9082
+8ea0898ea0896b86736b8673a0b09fc1d4e2cdd5decdd5dec1c4c79ea9b4848887
+9ea08abacdd9cdd5dec5dae4c5dae4cdd5ded2dee6cdd5ded2dee6cdd5decdd5de
+d2dee6cdd5decdd5decdd5dec5dae4cdd5dec1d4e2d2dee6cdd5ded2dee6cdd5de
+dcd6d6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4
+d2dee6cdd5ded2dee6cdd5dec5dae4c1d4e2c1d4e2c5dae4c5dae4d2dee6c1d4e2
+d2dee6c5dae4d2dee6dcd6d6d2dee6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6
+dcd6d6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6
+dfe1e6dcd6d6dfe1e6d2dee6dcd6d6d2dee6dcd6d6dfe1e6dfe1e6dfe1e6d2dee6
+dfe1e6dfe1e6cdd5dedfe1e6cdd5dedfe1e6dcd6d6dcd6d6d2dee6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6dcd6d6cdd5debacdd9c1c4c7b8c3c68a99ab7d9082
+667c7477877275889bafb9bcafb9bc9ea9b48da0b6cdd5dec1c4c7b8c3c6b8c3c6
+a5c4d7a5c4d7b0cbdcb2d2e0b2d2e0b2d2e0b2d2e0b0cbdcb0cbdcb2d2e0a5c4d7
+b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdc
+b2d2e0b2d2e0b0cbdcbacdd9b0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb0cbdcbacdd9
+b2d2e0b2d2e0bacdd9b0cbdcb2d2e0b2d2e0b2d2e0bacdd9bacdd9b2d2e0bacdd9
+b2d2e0b2d2e0b2d2e0c1d4e2b0cbdcc1d4e2b2d2e0b2d2e0bacdd9b8c3c6c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c5dae4c1d4e2bacdd9c1d4e2
+c1d4e2b2d2e0b0cbdcc1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2b2d2e0b2d2e0
+c1d4e2bacdd9bacdd9bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2cccdccc1d4e2bacdd9cdd5dec1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2bacdd9bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9bacdd9c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2
+b0cbdcc1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2b2d2e0bacdd9bacdd9c1d4e2
+b2d2e0c1d4e2c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2bacdd9c1d4e2b0cbdc
+c1d4e2c5dae4b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5de
+cdd5dec1d4e2cccdcccdd5decccdcccdd5dec1d4e2c1d4e2cdd5decdd5decdd5de
+cdd5decdd5decdd5decdd5dec5dae4c1d4e2c1d4e2cdd5ded2dee6cdd5dec1d4e2
+cdd5dec1d4e2cdd5dec1d4e2bacdd9c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4cdd5dec1d4e2c5dae4c1d4e2c5dae4
+cdd5dec5dae4c1d4e2cdd5deaba9a69a91789a91789e9853867c4c656c2687886d
+7e98827e988292a88d778746657c44666b3b667c74757c71627444697c2b657c44
+7c90535f7b2a5e7429667c74bacdd9c5dae4c1d4e2a3b8bc7d90828b98829d9981
+9da1abcdd5ded2dee6cdd5decdd5ded2dee6cdd5decdd5ded2dee6cdd5decdd5de
+c1d4e2cdd5decdd5ded2dee6cdd5dec1d4e2d2dee6c1d4e2c5dae4cdd5ded2dee6
+cdd5decdd5ded2dee6cdd5decdd5decdd5ded2dee6cdd5ded2dee6c5dae4dfe1e6
+cdd5ded2dee6c5dae4d2dee6cdd5ded2dee6c5dae4cdd5dec5dae4cdd5decdd5de
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dcd6d6dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dcd6d6dfe1e6dcd6d6dfe1e6
+dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5dedfe1e6cdd5de
+d2dee6cdd5dedfe1e6d2dee6dfe1e6d2dee6c1c4c7afb9bcafb9bc92a88d92a8b6
+9fb0bbafb9bcbacdd9b8c3c6b8c3c6aec4d0a3b8bcb8c3c6b8c3c6cdd5dec1d4e2
+b0cbdcb0cbdcb0cbdca5c4d7b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcb0cbdcb2d2e0
+b2d2e0b2d2e0b0cbdcb2d2e0b0cbdcb2d2e0b0cbdcb2d2e0b2d2e0b2d2e0b2d2e0
+b0cbdcb0cbdcb0cbdcc1d4e2b0cbdcb2d2e0b2d2e0bacdd9b2d2e0b2d2e0b0cbdc
+b2d2e0b2d2e0b2d2e0bacdd9b2d2e0b2d2e0b2d2e0c1d4e2b0cbdcb2d2e0bacdd9
+bacdd9c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2bacdd9cdd5dec1d4e2
+b2d2e0b0cbdcc1d4e2b2d2e0c1d4e2c1d4e2c1d4e2d2dee6c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2bacdd9bacdd9bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2bacdd9bacdd9bacdd9bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2
+c1d4e2bacdd9c1d4e2b2d2e0bacdd9c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2
+c1d4e2bacdd9c1d4e2bacdd9c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c5dae4c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+cdd5dec5dae4cdd5decdd5ded2dee6cdd5decdd5decdd5decdd5decdd5decdd5de
+cdd5decdd5decdd5decdd5decdd5dec1d4e2c1d4e2c1d4e2cdd5decdd5ded2dee6
+c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c5dae4c5dae4c1d4e2cdd5dec1d4e2
+c5dae4cdd5dec1d4e2cdd5dec1d4e2c5dae4cdd5decdd5dec5dae4c5dae4c1d4e2
+cdd5dec5dae4c5dae4c1d4e2aeb0bd84888766603395885c857d674b69335e7429
+6b852c657c446b8545697c2b5474287c9053618345576b33627444666b3b5e7429
+6b85455f7b2a4b681e627444afb9bcc0cbb88b9882657c4468752b9ea08ab8c1af
+c0b8a6dfe1e6dfe1e6d2dee6dcd6d6cdd5ded2dee6cdd5decdd5ded2dee6cdd5de
+cdd5dec1d4e2cdd5dec1d4e2cdd5decdd5ded2dee6d2dee6c1d4e2c1d4e2d2dee6
+c5dae4d2dee6cdd5decdd5ded2dee6d2dee6c5dae4d2dee6cdd5ded2dee6d2dee6
+d2dee6dcd6d6d2dee6c5dae4cdd5dec5dae4cdd5decdd5ded2dee6d2dee6d2dee6
+dcd6d6d2dee6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6dfe1e6dcd6d6dcd6d6dfe1e6dcd6d6dfe1e6d2dee6dcd6d6dcd6d6
+dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dcd6d6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6cdd5dedfe1e6cdd5ded2dee6dfe1e6
+dfe1e6dfe1e6dcd6d6dfe1e6cdd5dedcd6d6c1c4c79ea9b4b8c3c6cccdccbacdd9
+bacdd9cccdccbacdd9bacdd9afb9bc9ea9b492a8b69fb0bbafb9bcd2dee6cdd5de
+b2d2e0b0cbdcb2d2e0b0cbdcb2d2e0b2d2e0b0cbdcb2d2e0b0cbdcb2d2e0b2d2e0
+b2d2e0bacdd9b0cbdcb0cbdcaec4d0b2d2e0b2d2e0b0cbdcb0cbdcbacdd9b2d2e0
+b0cbdcb2d2e0b2d2e0b0cbdcc1d4e2b0cbdcbacdd9b2d2e0b0cbdcb2d2e0b2d2e0
+b2d2e0bacdd9bacdd9b2d2e0bacdd9b2d2e0b2d2e0c1d4e2b2d2e0b2d2e0b2d2e0
+bacdd9bacdd9c1d4e2bacdd9b2d2e0c1d4e2b2d2e0c1d4e2bacdd9dcd6d6bacdd9
+b2d2e0c5dae4b2d2e0c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c5dae4c5dae4
+c5dae4d2dee6c1d4e2c5dae4c5dae4bacdd9c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2
+c1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5debacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2cccdccbacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2cdd5debacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2b0cbdc
+c1d4e2c1d4e2b2d2e0c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2bacdd9b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2bacdd9c5dae4b2d2e0
+b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2cdd5de
+cdd5decccdccc5dae4c1d4e2c5dae4cdd5dec5dae4c1d4e2c5dae4c1d4e2d2dee6
+cdd5decdd5decdd5ded2dee6c1d4e2c5dae4cdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+cdd5dec1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c5dae4c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2cdd5dec5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4cdd5dec5dae4
+c1d4e2d2dee6c5dae4cdd5decccdcc9fb0bb75889b9ea08a9ea08a778772627444
+576b33576a1f576b33627444657c44657c446b85455f7b2a556024666b3b778746
+656c263a44234960323d573b627444767b47666b3b5474286274449ea9b4d2dee6
+d2dee6dfe1e6dcd6d6dfe1e6dfe1e6d2dee6c5dae4d2dee6cdd5dec1d4e2d2dee6
+cdd5dec1d4e2d2dee6cdd5decdd5dec1d4e2d2dee6d2dee6d2dee6c5dae4c1d4e2
+cdd5decdd5ded2dee6c1d4e2cdd5dec5dae4cdd5decdd5ded2dee6c1d4e2cdd5de
+d2dee6c1d4e2d2dee6d2dee6c1d4e2d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+cdd5dedfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6
+dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6
+d2dee6dfe1e6dcd6d6dfe1e6dfe1e6cdd5dedfe1e6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6cdd5dedfe1e6
+cdd5ded2dee6d2dee6cdd5ded2dee6d2dee6cdd5decdd5debacdd9c1c4c7b8c3c6
+a3b8bc9da1ab9da1abb8c3c6afb9bc9da1ab9da1ab667c74aec4d0c1d4e2d2dee6
+b0cbdcb0cbdcb2d2e0b0cbdcb0cbdcb2d2e0b2d2e0b2d2e0b0cbdcb2d2e0b2d2e0
+b0cbdcbacdd9b0cbdcafb9bcb0cbdcbacdd9bacdd9b0cbdcb2d2e0b0cbdcb2d2e0
+b0cbdcb2d2e0b2d2e0b2d2e0bacdd9b2d2e0bacdd9c1d4e2b2d2e0b2d2e0bacdd9
+b2d2e0b2d2e0bacdd9b2d2e0b2d2e0c1d4e2b0cbdcc1d4e2c1d4e2b2d2e0c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2bacdd9c1d4e2bacdd9dcd6d6bacdd9
+c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2cdd5dec5dae4c5dae4c5dae4c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+b2d2e0c1d4e2bacdd9bacdd9c1d4e2b2d2e0bacdd9c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9bacdd9c5dae4c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2bacdd9c1d4e2bacdd9bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2bacdd9c5dae4c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2cdd5dec1d4e2c1d4e2
+c5dae4cdd5decdd5dec1d4e2c5dae4cdd5dec1d4e2cdd5decdd5dec1d4e2cdd5de
+cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4cdd5dec5dae4c1d4e2
+c1d4e2cdd5dec1d4e2cdd5dec1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c5dae4
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+d2dee6c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2cdd5dec5dae4c5dae4
+c1d4e2d2dee6c1d4e2cdd5dec5dae4c5dae4cdd5dec1d4e2c5dae4d2dee6cdd5de
+c1d4e2cdd5ded2dee6c1d4e2d2dee6c1d4e2bacdd9a0b09f9da1ab7d9082576b33
+4b69334758324b693349603249601f4b681e6f8f526b852c4960323f4e1e5e7429
+576b333a44235f6156576b33576b33656c2656603a4960327d9082cdd5dedcd6d6
+dfe1e6d2dee6d2dee6dfe1e6dcd6d6cdd5decdd5ded2dee6c1d4e2cdd5dec1d4e2
+c5dae4c1d4e2c1d4e2c5dae4cdd5decdd5decdd5decdd5decdd5ded2dee6c1d4e2
+c5dae4c1d4e2cdd5dec1d4e2d2dee6c5dae4c1d4e2cdd5dec1d4e2cdd5decdd5de
+cdd5decdd5ded2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6
+d2dee6dfe1e6dfe1e6d2dee6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6
+dfe1e6dfe1e6d2dee6dcd6d6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6cdd5dedfe1e6
+d2dee6d2dee6d2dee6cdd5ded2dee6dfe1e6d2dee6dfe1e6d2dee6cdd5ded2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d2dee6cdd5decdd5ded2dee6cdd5decdd5dec1d4e2c1d4e2afb9bc
+a3b8bc9ea9b48da0b6afb9bc9fb0bb8ea0898a99ab8b98829ea9b4bacdd9cccdcc
+b2d2e0b0cbdcb0cbdcb0cbdcb0cbdcb0cbdcb2d2e0b2d2e0b2d2e0b2d2e0b0cbdc
+b2d2e0bacdd9b0cbdcc1d4e2bacdd9b2d2e0b2d2e0c1d4e2b0cbdcc1d4e2b2d2e0
+c1d4e2b2d2e0b2d2e0bacdd9c1d4e2bacdd9b2d2e0bacdd9c1d4e2b0cbdcc1d4e2
+b2d2e0b0cbdcbacdd9bacdd9c5dae4b0cbdcc1d4e2b0cbdcb2d2e0c1d4e2c1d4e2
+c5dae4b2d2e0c1d4e2b2d2e0b2d2e0bacdd9c1d4e2b2d2e0c1d4e2cdd5decdd5de
+bacdd9bacdd9c5dae4b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0bacdd9c1d4e2
+c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2cccdccc1d4e2bacdd9c1d4e2cdd5dec1d4e2cdd5debacdd9c1d4e2c1d4e2
+cdd5dec1d4e2cccdccc1d4e2cdd5dec1d4e2cdd5dec1d4e2c1d4e2c1d4e2cdd5de
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2b2d2e0c1d4e2c1d4e2bacdd9c1d4e2c1d4e2b2d2e0
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2bacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2bacdd9
+c1d4e2c1d4e2bacdd9c1d4e2bacdd9c5dae4c1d4e2c1d4e2b0cbdcc5dae4c5dae4
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+cccdccc1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2d2dee6c1d4e2
+cdd5dec1d4e2d2dee6c1d4e2cdd5debacdd9c5dae4c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4cdd5dec1d4e2c5dae4c1d4e2d2dee6c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2cdd5dec1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2
+c5dae4c5dae4c1d4e2cdd5dec1d4e2c5dae4c1d4e2c5dae4d2dee6c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2cdd5dec1d4e2d2dee6c5dae4c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2c1d4e2c1d4e2c5dae4cdd5dec1d4e2c5dae4cdd5decdd5dec1d4e2c1d4e2
+d2dee6c1d4e2cdd5dec5dae4bacdd9b8c3c6c5dae4c5dae4afb9bc92a88d709081
+6274444b69335474436f8f52576b335e7429697c2b5e74293f4e1e47581f5e7429
+56603a2f3c224758323f4e323f4e1e657c445474437d9082b8c3c6d2dee6cdd5de
+d2dee6dfe1e6cdd5ded2dee6d2dee6cdd5ded2dee6c1d4e2cdd5ded2dee6c5dae4
+cdd5decdd5decdd5dec1d4e2c5dae4c5dae4cdd5ded2dee6c1d4e2c5dae4d2dee6
+d2dee6cdd5decdd5dec5dae4cdd5ded2dee6c5dae4cdd5dec5dae4c5dae4d2dee6
+d2dee6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6d2dee6d2dee6
+dcd6d6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6
+dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6
+cdd5ded2dee6d2dee6d2dee6dcd6d6d2dee6cdd5ded2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6cdd5ded2dee6dfe1e6cdd5ded9e6ea
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6bacdd9c1d4e2bacdd9
+a3b8bc94afb98b90808ea0898b90808b90807090818ea0898b919f9ea9b48da0b6
+b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0bacdd9b0cbdcbacdd9b0cbdcb2d2e0b2d2e0
+b2d2e0b2d2e0bacdd9b2d2e0b2d2e0b0cbdcb2d2e0b2d2e0b2d2e0b0cbdcc1d4e2
+bacdd9b0cbdcb2d2e0b2d2e0bacdd9c1d4e2b2d2e0c1d4e2bacdd9b2d2e0c1d4e2
+b2d2e0c1d4e2b2d2e0bacdd9b2d2e0b2d2e0c1d4e2c1d4e2bacdd9c1d4e2bacdd9
+c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c1d4e2b2d2e0cdd5de
+c1d4e2bacdd9c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2b0cbdcc1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5decdd5dec1d4e2d2dee6c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c5dae4c1d4e2c1d4e2b2d2e0c1d4e2c5dae4
+bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+cdd5dec1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c5dae4c1d4e2c5dae4c5dae4
+cdd5ded2dee6c1d4e2c5dae4bacdd9cdd5dec1d4e2c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4
+c1d4e2c5dae4c5dae4c5dae4cdd5dec5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4
+cdd5dec1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c5dae4cdd5de
+c1d4e2c1d4e2c5dae4c1d4e2cdd5decdd5dec1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+cdd5dec1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c1d4e2c1d4e2c5dae4
+d2dee6c1d4e2d2dee6c1d4e2d2dee6c1d4e2d2dee6c1d4e2c1d4e2c1d4e2cdd5de
+c5dae4c5dae4cdd5debacdd9b8c3c68da0b6a0b09fc1d4e2c5dae49ea9b4778772
+576b33627444657c446b85455e74296183455e74293f4e32383c233f4e323d573b
+4758324960656b8545637471576a6292a88da0b09fd4dcd0d2dee6d2dee6dfe1e6
+cdd5ded2dee6cdd5decdd5ded2dee6c1d4e2cdd5dec1d4e2cdd5decdd5dec1d4e2
+c1d4e2c5dae4c5dae4cdd5dec1d4e2c5dae4c1d4e2d2dee6cdd5dec1d4e2c5dae4
+cdd5decdd5decdd5ded2dee6cdd5decdd5decdd5decdd5ded2dee6d2dee6d2dee6
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6dcd6d6d2dee6dfe1e6d2dee6
+dcd6d6d2dee6dcd6d6d2dee6d2dee6dcd6d6cdd5decdd5decdd5ded2dee6d2dee6
+dfe1e6d2dee6dcd6d6d2dee6d2dee6d2dee6dfe1e6cdd5dedfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6cdd5dedfe1e6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5decdd5decdd5decdd5debacdd9
+cccdccbacdd9aec4d0aec4d08a99ab6b8673576a6275889b92a8b68ea0898a99ab
+bacdd9b0cbdcb2d2e0b2d2e0b2d2e0b2d2e0b0cbdcb2d2e0b2d2e0b2d2e0bacdd9
+b2d2e0bacdd9b2d2e0bacdd9b2d2e0b2d2e0bacdd9b2d2e0b2d2e0c1d4e2b0cbdc
+b2d2e0c1d4e2b2d2e0bacdd9bacdd9bacdd9bacdd9bacdd9b2d2e0c1d4e2b2d2e0
+bacdd9bacdd9c1d4e2b2d2e0bacdd9c1d4e2b2d2e0bacdd9b2d2e0c1d4e2c1d4e2
+b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c5dae4bacdd9c1d4e2c1d4e2c1d4e2b2d2e0
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b0cbdcc1d4e2c1d4e2c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5ded2dee6
+cdd5decdd5ded2dee6c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c5dae4bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2cccdccc1d4e2c1d4e2c1d4e2cdd5debacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c1d4e2bacdd9
+c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2bacdd9bacdd9c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c5dae4b2d2e0bacdd9c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2d2dee6c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2cdd5decdd5dec5dae4c5dae4cdd5dec1d4e2d2dee6c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2
+c5dae4c5dae4c5dae4cdd5dec5dae4c1d4e2c5dae4c1d4e2cdd5dec5dae4c5dae4
+c1d4e2c5dae4c5dae4cdd5dec1d4e2c5dae4c1d4e2c5dae4c5dae4cdd5dec5dae4
+c5dae4c5dae4c5dae4c5dae4cdd5dec1d4e2c5dae4c5dae4c5dae4c5dae4cdd5de
+c1d4e2c1d4e2c1d4e2c5dae4c5dae4cdd5dec1d4e2d2dee6bacdd99fb0bbbacdd9
+c5dae4c5dae4d2dee6bacdd99fb0bb6b85456374717e98828ea0896b8673567f3a
+547443667c74657c444960325773764b6933576b333a4423383c233335223d4f56
+3d573b3944467d9082c1c4c7afb9bcaec4d0cdd5ded2dee6d2dee6d2dee6d2dee6
+cdd5decdd5decdd5decdd5dec1d4e2cdd5dec1d4e2c1d4e2c5dae4cdd5decdd5de
+c1d4e2c5dae4c5dae4c1d4e2d2dee6d2dee6cdd5dec1d4e2d2dee6c5dae4c5dae4
+d2dee6c5dae4d2dee6cdd5decdd5ded2dee6cdd5ded2dee6d2dee6d2dee6dcd6d6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6cdd5dedfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6d2dee6dfe1e6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5dec1d4e2bacdd9bacdd9
+bacdd9bacdd9c1d4e2a3b8bc8a99ab75889b6b86738ea089aeb0bd8a99ab9ea9b4
+b0cbdcb0cbdcb0cbdcb0cbdcb2d2e0bacdd9b2d2e0b0cbdcc1d4e2b2d2e0bacdd9
+b2d2e0b2d2e0b2d2e0bacdd9b2d2e0c1d4e2b2d2e0bacdd9b2d2e0bacdd9bacdd9
+bacdd9b0cbdcb2d2e0c1d4e2bacdd9b2d2e0c1d4e2c1d4e2bacdd9bacdd9c1d4e2
+b2d2e0c1d4e2c1d4e2b2d2e0bacdd9c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4bacdd9
+c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2d2dee6cdd5ded2dee6d2dee6c1d4e2cdd5dec1d4e2c1d4e2c1d4e2
+bacdd9c1d4e2c1d4e2c1d4e2cdd5dec1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2bacdd9cdd5dec1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2
+c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4bacdd9c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+cdd5dec1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+d2dee6c1d4e2cdd5dec1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2cdd5decdd5de
+c1d4e2c1d4e2cdd5dec5dae4cdd5dec5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2d2dee6
+c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c5dae4c1d4e2c5dae4cdd5dec1d4e2c1d4e2
+c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2
+c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2d2dee6c1d4e2
+c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4cdd5ded2dee69da1ab9fb0bb
+bacdd9c1d4e2c5dae4cdd5deafb9bc92a8b68ea0897a91a86b8673576a626b8673
+92a8b64b68657d90828b9882607590666c5e3f4e32333522342d1f272c1f3d4f56
+6b867375889baec4d0c5dae4d2dee6cdd5ded2dee6d2dee6dcd6d6d2dee6cdd5de
+cdd5dec1d4e2cdd5decdd5dec1d4e2c5dae4c1d4e2c1d4e2c1d4e2d2dee6c1d4e2
+cdd5ded2dee6c5dae4c1d4e2cdd5dec1d4e2d2dee6cdd5decdd5decdd5ded2dee6
+d2dee6d2dee6d2dee6c1d4e2d2dee6c5dae4d2dee6cdd5decdd5ded2dee6dfe1e6
+d2dee6d2dee6dcd6d6cdd5ded2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dcd6d6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6cdd5decdd5de
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6
+d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4c1d4e2cccdccb0cbdcc1d4e2c1d4e2
+b8c3c6afb9bcb8c3c6b0cbdc8a99ab92a8b6a5c4d79fb0bb8da0b69da1abaeb0bd
+b2d2e0b2d2e0b2d2e0b0cbdcb2d2e0c1d4e2b2d2e0b0cbdcb0cbdcbacdd9b2d2e0
+b2d2e0bacdd9b2d2e0c1d4e2b2d2e0b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0b2d2e0
+b2d2e0c5dae4b2d2e0b2d2e0c1d4e2bacdd9b2d2e0c1d4e2b2d2e0c1d4e2b0cbdc
+c1d4e2b0cbdcc1d4e2c1d4e2b2d2e0bacdd9c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2
+c1d4e2b2d2e0c1d4e2c5dae4c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2b2d2e0
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2cdd5dec1d4e2cdd5decdd5decdd5ded2dee6cdd5decdd5dec1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4cdd5dec1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2d2dee6c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2cdd5dec5dae4c1d4e2c5dae4c5dae4c1d4e2cdd5dec5dae4c1d4e2c5dae4
+c1d4e2d2dee6c1d4e2cdd5dec1d4e2c5dae4cdd5dec5dae4c1d4e2cdd5decdd5de
+c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c1d4e2cdd5dec1d4e2c5dae4
+c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c1d4e2d2dee6c1d4e2
+c1d4e2cdd5dec5dae4cdd5dec5dae4c5dae4c1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+d2dee6c5dae4c5dae4c1d4e2cdd5dec5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4
+cdd5dec1d4e2d2dee6c1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4
+cdd5dec5dae4c1d4e2d2dee6c5dae4cdd5decdd5dec5dae4cdd5dec1d4e2cdd5de
+cdd5decdd5ded2dee6c5dae4d2dee6cdd5dec1d4e2cdd5decdd5de9ea9b48ea089
+8da0b67d98b1afb9bcafc0ab7d9082a3b8bcaec4d092a88d7d98b17e98827e9882
+7e988249606577877275889b496065576a624960322f3c22272c1f2f3c22475832
+96b7aba5c4d7d2dee6dfe1e6d2dee6cdd5decdd5decdd5ded2dee6c1c4c7d2dee6
+cdd5dec5dae4c5dae4c1d4e2c1d4e2d2dee6c5dae4d2dee6c1d4e2cdd5decdd5de
+c1d4e2cdd5ded2dee6cdd5dec5dae4d2dee6cdd5dec5dae4c5dae4cdd5ded2dee6
+cdd5ded2dee6cdd5decdd5ded2dee6cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6
+dcd6d6d2dee6d2dee6d2dee6cdd5dedfe1e6dcd6d6dfe1e6dcd6d6dfe1e6dfe1e6
+cdd5dedfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5decdd5decdd5decdd5dec5dae4d2dee6c1d4e2d2dee6cdd5ded2dee6d2dee6
+d2dee6cdd5dec5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+cdd5ded2dee6d2dee6cdd5dec1d4e2cdd5dec1d4e2afb9bcafb9bcbacdd9afb9bc
+a3b8bcb8c3c6aeb0bdaec4d09fb0bbb0cbdcc1d4e2c1d4e2b8c3c6aeb0bd8da0b6
+b0cbdcb2d2e0b2d2e0bacdd9b2d2e0bacdd9b2d2e0b2d2e0c1d4e2bacdd9b2d2e0
+b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0b2d2e0b2d2e0b2d2e0bacdd9bacdd9c1d4e2
+b2d2e0b2d2e0c1d4e2b2d2e0b2d2e0b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+bacdd9c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c5dae4
+b2d2e0c1d4e2c1d4e2b2d2e0c5dae4c5dae4c5dae4c5dae4b2d2e0c5dae4b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c5dae4b2d2e0
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2d2dee6c1d4e2d2dee6d2dee6c1d4e2d2dee6
+cdd5ded2dee6c1d4e2d2dee6cdd5dec1d4e2cdd5dec1d4e2c1d4e2c5dae4cdd5de
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2cdd5dec5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2cdd5decdd5dec1d4e2c5dae4cdd5dec5dae4c1d4e2c5dae4
+c1d4e2cdd5dec1d4e2cdd5dec5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2d2dee6c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2cdd5dec1d4e2c1d4e2
+c1d4e2c5dae4c5dae4c1d4e2cdd5dec5dae4cdd5dec5dae4c5dae4c5dae4cdd5de
+c5dae4c1d4e2cdd5dec1d4e2c5dae4c5dae4cdd5dec1d4e2c5dae4cdd5ded2dee6
+c5dae4c1d4e2c1d4e2d2dee6bacdd9cdd5dec5dae4cdd5dec1d4e2c5dae4d2dee6
+c1d4e2cdd5dec5dae4c1d4e2cdd5dec5dae4d2dee6c5dae4c5dae4c1d4e2c5dae4
+cdd5dec1d4e2d2dee6c1d4e2c5dae4c5dae4c5dae4d2dee6c5dae4c1d4e2c5dae4
+c5dae4cdd5decdd5dec1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4c1d4e2c1d4e2
+c5dae4cdd5dec1d4e2d2dee6c5dae4c1d4e2d2dee6c5dae4c5dae4d2dee6c5dae4
+c5dae4c1d4e2d2dee6d2dee6cdd5ded2dee6d2dee6cdd5decdd5dec1c4c7afb9bc
+92a88d6b86737d90826b85454b69336b86737f97536274445773764b6933496065
+757c714960654b6865757c71496065627444666b3b2f3c222f3c22354c313f4e32
+597c75b0cbdcd4dcd0d2dee6d2dee6d2dee6cdd5decdd5dec1d4e2afb9bcc1d4e2
+c1d4e2cdd5ded2dee6cdd5dec1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2d2dee6
+c5dae4cdd5ded2dee6c5dae4cdd5dec5dae4d2dee6d2dee6cdd5ded2dee6cdd5de
+d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dcd6d6cdd5de
+cdd5decdd5ded2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6dcd6d6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dcd6d6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6dfe1e6d2dee6c5dae4d2dee6
+cdd5ded2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6b0cbdca3b8bcafb9bcbacdd98a99ab9da1abafb9bc94afb9
+a5c4d7aec4d09ea9b49fb0bba3b8bcbacdd9c1d4e2d2dee6bacdd99ea9b492a8b6
+bacdd9bacdd9bacdd9b2d2e0bacdd9b2d2e0c1d4e2b2d2e0b2d2e0b2d2e0b2d2e0
+b0cbdcbacdd9c1d4e2bacdd9b2d2e0c1d4e2c1d4e2bacdd9c1d4e2c1d4e2b2d2e0
+c1d4e2c1d4e2bacdd9c1d4e2bacdd9c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2b2d2e0
+c1d4e2bacdd9b2d2e0b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2c5dae4c1d4e2b2d2e0
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2d2dee6c5dae4c1d4e2
+cdd5dec1d4e2cdd5decdd5dec5dae4cdd5ded2dee6cdd5ded2dee6cdd5dec1d4e2
+cdd5decdd5dec1d4e2c5dae4c1d4e2d2dee6c1d4e2c1d4e2cdd5dec1d4e2cdd5de
+c1d4e2d2dee6c1d4e2c5dae4c5dae4c1d4e2cdd5dec1d4e2cccdcccdd5dec5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2
+c1d4e2cdd5dec1d4e2cdd5decdd5dec1d4e2cdd5decdd5dec1d4e2d2dee6cdd5de
+c1d4e2d2dee6c1d4e2cdd5dec1d4e2c5dae4c1d4e2c1d4e2d2dee6c5dae4c5dae4
+cdd5ded2dee6c1d4e2cdd5dec1d4e2cdd5ded2dee6d2dee6c1d4e2c5dae4c1d4e2
+d2dee6c1d4e2c5dae4cdd5ded2dee6c5dae4c5dae4c5dae4c1d4e2cdd5debacdd9
+cdd5dec1d4e2c1d4e2cdd5dec5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4d2dee6
+c5dae4c5dae4c1d4e2d2dee6cdd5dec5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4
+c1d4e2c5dae4d2dee6c1d4e2c5dae4d2dee6c5dae4cdd5dec5dae4c5dae4d2dee6
+c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c5dae4d2dee6
+d2dee6c5dae4cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+afb9bc9ea88e7e98826274444b681e5474287787465f7b2a5e74295f7b2a627444
+576b334b69336b8673667c746b8673657c444960322f3c22304321373e43354c31
+4b686575889bb8c3c6d2dee6d2dee6cdd5ded2dee6c1d4e29fb0bb8da0b6bacdd9
+d2dee6d2dee6c5dae4cdd5dec5dae4cdd5ded2dee6cdd5dec1d4e2d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5decdd5ded2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dcd6d6dfe1e6d2dee6dfe1e6cdd5dedfe1e6dfe1e6d2dee6
+dfe1e6cdd5ded2dee6d2dee6cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4cdd5dec5dae4d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+d2dee6cdd5ded2dee6bacdd9aec4d092a8b68da0b68b98827d908281a08975889b
+a3b8bc92a8b68da0b6c1d4e2bacdd9afb9bcafb9bcaec4d0afb9bca3b8bc9fb0bb
+b0cbdcc1d4e2b0cbdcc1d4e2b2d2e0b2d2e0b2d2e0c1d4e2c1d4e2bacdd9b2d2e0
+b2d2e0c1d4e2bacdd9b2d2e0b2d2e0b2d2e0c1d4e2bacdd9c1d4e2bacdd9bacdd9
+c1d4e2b2d2e0bacdd9c1d4e2bacdd9c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0
+c1d4e2c1d4e2c5dae4b2d2e0c5dae4b2d2e0c5dae4b2d2e0c5dae4b2d2e0c5dae4
+c1d4e2b2d2e0c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c5dae4
+cdd5ded2dee6c1d4e2d2dee6c1d4e2cdd5ded2dee6c1d4e2c5dae4cdd5dec5dae4
+d2dee6c1d4e2cdd5decdd5dec1d4e2c5dae4c5dae4c5dae4c1d4e2cdd5dec1d4e2
+cdd5dec5dae4c1d4e2c1d4e2c1d4e2c5dae4d2dee6c1d4e2c5dae4c1d4e2c5dae4
+c5dae4c1d4e2cdd5decdd5dec1d4e2cdd5dec1d4e2cdd5dec1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2cdd5dec5dae4cdd5dec1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4
+b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec5dae4
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2cdd5decdd5dec1d4e2c5dae4
+c1d4e2d2dee6c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec1d4e2
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2cdd5decdd5dec1d4e2c5dae4
+cdd5dec1d4e2c5dae4c5dae4d2dee6cdd5decdd5dec1d4e2cdd5dec1d4e2c5dae4
+c1d4e2d2dee6c1d4e2c1d4e2d2dee6c1d4e2cdd5dec5dae4cdd5ded2dee6c1d4e2
+d2dee6c1d4e2c1d4e2cdd5dec5dae4c1d4e2c5dae4d2dee6c1d4e2d2dee6c1d4e2
+cccdccc1d4e2c1d4e2cdd5dec1d4e2cdd5dec5dae4cdd5dec5dae4c1d4e2d2dee6
+c1d4e2c1d4e2d2dee6c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4c5dae4d2dee6
+c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4cdd5ded2dee6
+c5dae4d2dee6c5dae4c5dae4d2dee6cdd5dec5dae4d2dee6d2dee6d2dee6d2dee6
+d9e6ead9e6ead2dee6b8c3c6b8c3c6cdd5ded2dee6d2dee6d2dee6d2dee6dfe1e6
+cccdcccccdcc8ea089496032657c44576b336274445e74294b69335e74295e7429
+77877287886d7f97537787726f8f52657c44576b332f3c223944464960653f4e32
+3d573b4b68657e9882cccdcc9ea9b4aec4d0b8c3c68a99ab8b988292a8b6c1d4e2
+c1d4e2d2dee6d2dee6cdd5dec5dae4cdd5debacdd9cdd5dec5dae4cdd5ded2dee6
+cdd5ded2dee6d2dee6d9e6eacdd5ded2dee6d2dee6dfe1e6cdd5dedfe1e6d2dee6
+d2dee6cdd5ded2dee6cdd5ded2dee6cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6
+d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6cdd5decdd5ded2dee6cdd5de
+d2dee6d2dee6d2dee6cdd5ded2dee6cdd5decdd5decdd5ded2dee6cdd5ded2dee6
+cdd5ded2dee6cdd5ded2dee6c5dae4cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6cdd5ded2dee6d2dee6c1d4e2b8c3c692a88d7d908270908175889b7d9082
+a3b8bc7a91a88da0b6a5c4d7afb9bca3b8bc9ea9b48a99ab92a8b69fb0bba4bfb5
+bacdd9b0cbdcc1d4e2bacdd9bacdd9c1d4e2b2d2e0bacdd9b2d2e0c1d4e2c1d4e2
+b2d2e0b0cbdcc1d4e2bacdd9c5dae4b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0
+c1d4e2c1d4e2b2d2e0b2d2e0c5dae4c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c5dae4
+b2d2e0c1d4e2b2d2e0b2d2e0c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c5dae4c1d4e2c5dae4bacdd9c5dae4c5dae4b2d2e0c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4b2d2e0c5dae4c5dae4c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2
+c5dae4b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4c5dae4cdd5dec1d4e2d2dee6cdd5decdd5dec5dae4d2dee6
+cdd5ded2dee6c5dae4c1d4e2cdd5decdd5dec1d4e2c5dae4c5dae4c1d4e2d2dee6
+c1d4e2c1d4e2d2dee6c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2d2dee6c1d4e2
+cdd5dec1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+cdd5dec5dae4c1d4e2cdd5dec1d4e2c1d4e2cdd5dec1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2d2dee6c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c5dae4c5dae4cdd5dec5dae4c1d4e2cdd5dec1d4e2c5dae4c5dae4c5dae4c1d4e2
+cdd5dec1d4e2c5dae4c1d4e2c5dae4bacdd9c5dae4c5dae4c1d4e2c1d4e2c1d4e2
+d2dee6c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4cdd5dec1d4e2cdd5dec1d4e2
+c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4cdd5dec5dae4c1d4e2cdd5de
+c5dae4c1d4e2c5dae4c1d4e2c5dae4cdd5decdd5dec1d4e2c1d4e2c5dae4c5dae4
+cdd5ded2dee6c5dae4c1d4e2c1d4e2d2dee6cdd5ded2dee6cdd5dec5dae4cdd5de
+c1d4e2d2dee6c1d4e2c1d4e2d2dee6d2dee6c5dae4c5dae4c1d4e2d2dee6cdd5de
+b8c3c6b8c3c6c1d4e2c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4
+c5dae4d2dee6c1d4e2c5dae4c1d4e2c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4
+c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6c1d4e2c5dae4
+c5dae4c1d4e2d2dee6cdd5dec5dae4c5dae4c1d4e2c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6dcd6d6c1c4c792a8b6b0cbdccdd5ded2dee6d2dee6dfe1e6d2dee6
+dfe1e6dfe1e6c0cbb8667c748ea0896b8545627444767b47475832576b33657c44
+81a0898b98827c90536274447e98826b85454960325560243043213d4f56496065
+344d59576b336b86737e988254605f7787729ea9b47090818a99aba4bfb5d2dee6
+cdd5ded2dee6c5dae4cdd5ded2dee6bacdd99ea9b4b0cbdcd2dee6cdd5ded2dee6
+cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6cdd5de
+d2dee6d2dee6cdd5dedfe1e6cdd5ded2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+c5dae4d2dee6d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6c1d4e2b8c3c6bacdd9afb9bc7d98b181a08992a8b68a99ab
+7d98b17a91a894afb9a3b8bcb0cbdc9fb0bba3b8bc92a88d7787727e9882a3b7a4
+bacdd9b0cbdcb2d2e0c1d4e2b2d2e0b2d2e0b2d2e0c1d4e2b2d2e0bacdd9c1d4e2
+b2d2e0b2d2e0c1d4e2bacdd9c5dae4b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c5dae4b2d2e0c1d4e2c1d4e2
+b2d2e0c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+b2d2e0c5dae4b2d2e0c5dae4b2d2e0c1d4e2c1d4e2c5dae4c5dae4c5dae4b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4b2d2e0
+c5dae4c1d4e2c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c1d4e2
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2cdd5decdd5dec5dae4
+cdd5ded2dee6cdd5ded2dee6c5dae4d2dee6cdd5ded2dee6c1d4e2cdd5decdd5de
+c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2d2dee6cdd5dec1d4e2cdd5dec5dae4
+c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2d2dee6c1d4e2c5dae4c5dae4
+c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2d2dee6cdd5decdd5dec1d4e2d2dee6
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4cdd5dec1d4e2c1d4e2c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2cdd5dec5dae4c1d4e2c5dae4cdd5de
+bacdd9c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4c5dae4
+cdd5dec1d4e2c1d4e2c1d4e2c5dae4cdd5dec1d4e2c5dae4c1d4e2cdd5dec1d4e2
+cdd5dec1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4cdd5dec1d4e2d2dee6c1d4e2
+c1d4e2cdd5dec5dae4cdd5decdd5dec5dae4c1d4e2c1d4e2c1d4e2d2dee6c1d4e2
+c5dae4d2dee6c5dae4c1d4e2c5dae4cdd5ded2dee6c5dae4c5dae4cdd5ded2dee6
+c1d4e2d2dee6c5dae4d2dee6c1d4e2c5dae4c5dae4c5dae4cdd5dec5dae4d2dee6
+c5dae4d2dee6c5dae4d2dee6cdd5dec5dae4cdd5decdd5dec1d4e2c5dae4c1d4e2
+cccdccc1d4e2c1d4e2c1d4e2d2dee6c1d4e2d2dee6c1d4e2c5dae4d2dee6c5dae4
+c1d4e2c5dae4c5dae4d2dee6c1d4e2d2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6
+c1d4e2c5dae4c5dae4d2dee6cdd5dec5dae4c5dae4d2dee6c5dae4cdd5dec5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6cdd5dec5dae4cdd5ded2dee6d2dee6
+d2dee6c1d4e2d2dee6c1d4e284888781a089b8c3c6c1d4e2d2dee6d2dee6d2dee6
+dfe1e6dcd6d6dfe1e6bacdd9bacdd97e9882657c447090814b6933576b333f4e1e
+4e5043576b336274444960326b8673657c443f4e324c5026394446577376597c75
+576a62577376547443576a1f6b8545a4bfb594afb994afa194afb9bacdd9d2dee6
+c1d4e2d2dee6c5dae4d2dee6cdd5de9ea9b48b919fc1d4e2c1d4e2cdd5decdd5de
+d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6cdd5dedfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6cdd5dec5dae4d2dee6
+cdd5ded2dee6d2dee6cdd5ded2dee6c5dae4c5dae4d2dee6cdd5decdd5ded2dee6
+cdd5ded2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6c1d4e2d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6
+c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6cdd5deaec4d0a4bfb5bacdd9bacdd9a3b8bc9fb0bb819fb792a8b69ea88e
+7787727e988296b7aba5c4d7aec4d0aeb0bd8da0b66b86735474436b85458b9882
+bacdd9bacdd9bacdd9b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2
+b2d2e0c1d4e2bacdd9c1d4e2b2d2e0c5dae4b2d2e0c1d4e2c5dae4b2d2e0c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4b2d2e0c5dae4b2d2e0c1d4e2c5dae4b2d2e0c5dae4
+c1d4e2b2d2e0c1d4e2b2d2e0c5dae4c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2
+c5dae4b2d2e0c5dae4c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2d2dee6c1d4e2c1d4e2d2dee6cdd5de
+c5dae4c1d4e2d2dee6cdd5decdd5decdd5dec5dae4d2dee6d2dee6c5dae4c1d4e2
+d2dee6c1d4e2cdd5dec5dae4c1d4e2cdd5dec5dae4c5dae4cdd5dec5dae4cdd5de
+d2dee6c1d4e2c5dae4c5dae4cdd5decdd5dec5dae4c1d4e2d2dee6c5dae4cdd5de
+cdd5ded2dee6c1d4e2cdd5dec1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2
+cdd5dec1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4
+c1d4e2cdd5dec5dae4c1d4e2c5dae4d2dee6c1d4e2c1d4e2cdd5dec5dae4c5dae4
+c5dae4d2dee6c1d4e2d2dee6c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2
+cdd5decdd5dec5dae4c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4
+c5dae4c1d4e2d2dee6c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c1d4e2
+c5dae4c5dae4c1d4e2c1d4e2cdd5dec5dae4d2dee6c5dae4cdd5dec5dae4c5dae4
+cdd5dec1d4e2cdd5ded2dee6c1d4e2c5dae4cdd5dec5dae4d2dee6c1d4e2c1d4e2
+d2dee6c1d4e2d2dee6c1d4e2d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4c1d4e2
+c5dae4c1d4e2cdd5dec5dae4cdd5ded2dee6c1d4e2d2dee6cccdccbacdd9cdd5de
+b8c3c6bacdd9d2dee6cdd5decdd5dec1d4e2c1d4e2d2dee6c5dae4c5dae4d2dee6
+d2dee6d2dee6c5dae4c5dae4c5dae4c1d4e2c5dae4cdd5dec1d4e2d2dee6c5dae4
+c5dae4d2dee6c1d4e2c5dae4c1d4e2d2dee6c1d4e2d2dee6cdd5dec5dae4c5dae4
+c5dae4c5dae4c5dae4cdd5ded2dee6c5dae4d2dee6cdd5dec5dae4d2dee6c1d4e2
+d2dee6c5dae4d2dee6cdd5de9fb0bb8b98827787729ea9b4cdd5ded2dee6d4dcd0
+d9e6ead2dee6dfe1e6dcd6d6d2dee69d99813d573b496032767b47576a1f475832
+3335223f4e325e7429576b336b8673496065496065565838394446627d9930444d
+344d59608471637471767b479d9981b0cbdcc1d4e2c1d4e2c5dae4c5dae4c5dae4
+d2dee6c1d4e2d2dee6bacdd99da1ab8b919f9fb0bbc1d4e2c1d4e2d2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5de
+dfe1e6dcd6d6d2dee6d2dee6d2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c1d4e2
+cccdccb8c3c69fb0bbaec4d0c5dae4c1d4e2bacdd9aec4d0aec4d092a8b66b8673
+7090817e988292a8b69fb0bb8a99abafb9bc9fb0bb848887757c717787728b919f
+c1d4e2b2d2e0c1d4e2bacdd9b2d2e0c1d4e2b2d2e0bacdd9c1d4e2c1d4e2c1d4e2
+b2d2e0c1d4e2bacdd9c5dae4b2d2e0c1d4e2c1d4e2bacdd9c1d4e2b2d2e0b2d2e0
+c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c5dae4b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0
+c5dae4b2d2e0c1d4e2b2d2e0c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4c1d4e2
+c5dae4c5dae4bacdd9c5dae4b2d2e0c5dae4b2d2e0c1d4e2b2d2e0c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2b2d2e0c5dae4c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2
+d2dee6c1d4e2c5dae4cdd5ded2dee6cdd5decdd5dec5dae4cdd5ded2dee6c1d4e2
+d2dee6c5dae4d2dee6c5dae4c5dae4cdd5ded2dee6c1d4e2d2dee6c5dae4c1d4e2
+d2dee6c5dae4c5dae4c5dae4c5dae4cdd5ded2dee6c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2cdd5decdd5decdd5dec1d4e2d2dee6c1d4e2c1d4e2c5dae4cdd5dec5dae4
+c1d4e2cdd5dec1d4e2c5dae4d2dee6c1d4e2c5dae4cdd5dec1d4e2cdd5dec1d4e2
+c1d4e2cdd5dec1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2cdd5dec1d4e2cdd5dec5dae4c1d4e2c5dae4c5dae4c1d4e2
+cdd5dec1d4e2cdd5decdd5dec1d4e2d2dee6c1d4e2c5dae4c5dae4cdd5decdd5de
+c1d4e2c1d4e2c5dae4c5dae4c1d4e2d2dee6c1d4e2cdd5dec5dae4c1d4e2d2dee6
+c1d4e2d2dee6cdd5dec1d4e2c5dae4c1d4e2c1d4e2d2dee6c1d4e2c5dae4c5dae4
+cdd5dec5dae4cdd5dec5dae4c1d4e2d2dee6c5dae4c1d4e2d2dee6d2dee6c1d4e2
+d2dee6cdd5ded2dee6cdd5dec5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6
+c1d4e2d2dee6c5dae4c5dae4cdd5decdd5decdd5decdd5dec1c4c7bacdd9cdd5de
+cdd5debacdd9c5dae4c5dae4cdd5dec5dae4d2dee6c5dae4c5dae4cdd5dec5dae4
+c5dae4c5dae4cdd5dec5dae4d2dee6d2dee6c1d4e2d2dee6c1d4e2cdd5decdd5de
+c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c1d4e2c5dae4
+c5dae4c5dae4c5dae4c1d4e2d2dee6cdd5dec5dae4d2dee6d2dee6c5dae4c1d4e2
+d2dee6d2dee6d2dee6d2dee6c1d4e28b98826374718b90809da1aba0b09fd2dee6
+d2dee6dfe1e6d9e6eacdd5dec1d4e287886d354c31547428697c2b656c26496032
+2a34383f4e326183455773763d573b576a627787725f61562e3c44465864465864
+475832657c448b9080757b2db8c3c6d2dee6d2dee6c5dae4cdd5ded2dee6cdd5de
+c5dae4c1d4e2b8c3c69ea9b49ea88e9ea9b4afb9bcd2dee6c1d4e2cdd5decdd5de
+d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6cdd5decdd5dedfe1e6d2dee6
+d2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6
+d2dee6cdd5dedfe1e6d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6cdd5decdd5de
+d2dee6d2dee6cdd5ded2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6d2dee6cdd5ded2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6bacdd9
+9ea9b49fb0bbafb9bca3b8bcafb9bcaec4d0cdd5decdd5deaec4d09fb0bb75889b
+6b86737e98827a91a892a8b6709081a0b09faec4d08b9882757c717e9882aec4d0
+bacdd9bacdd9b2d2e0c1d4e2c1d4e2bacdd9c1d4e2b2d2e0bacdd9b2d2e0c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c1d4e2
+b2d2e0c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c5dae4b2d2e0c5dae4c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4b2d2e0c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2cdd5dec1d4e2c1d4e2c1d4e2d2dee6c5dae4c1d4e2
+c1d4e2cdd5dec5dae4cccdccd2dee6c1d4e2cdd5ded2dee6c1d4e2d2dee6c1d4e2
+d2dee6c5dae4c1d4e2d2dee6c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4
+d2dee6c1d4e2d2dee6c5dae4c5dae4cdd5dec1d4e2c1d4e2d2dee6c5dae4c1d4e2
+d2dee6c1d4e2c1d4e2c5dae4cdd5dec1d4e2c5dae4d2dee6c1d4e2c1d4e2c5dae4
+c5dae4cdd5dec5dae4c1d4e2c1d4e2cdd5dec1d4e2c5dae4c5dae4c5dae4c1d4e2
+d2dee6c1d4e2cdd5dec5dae4c5dae4c5dae4c1d4e2c1d4e2cdd5dec5dae4c5dae4
+c1d4e2c5dae4c5dae4d2dee6c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2
+c5dae4cdd5ded2dee6c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2
+c5dae4d2dee6c1d4e2cdd5dec5dae4c5dae4cdd5dec1d4e2d2dee6c1d4e2cdd5de
+c5dae4c5dae4c5dae4cdd5decdd5dec5dae4c5dae4c1d4e2d2dee6cdd5dec1d4e2
+d2dee6c1d4e2d2dee6c5dae4c5dae4c5dae4cdd5ded2dee6cdd5decdd5dec1d4e2
+c1d4e2c5dae4cdd5dec5dae4d2dee6cdd5dec5dae4d2dee6c1d4e2d2dee6c5dae4
+cdd5dec5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6bacdd9bacdd9c1d4e2cdd5de
+c1c4c7b8c3c6c5dae4bacdd9c1d4e2cdd5dec5dae4c5dae4c5dae4c5dae4d2dee6
+c1d4e2d2dee6d2dee6cdd5dec5dae4c1d4e2d2dee6c1d4e2d2dee6c5dae4d2dee6
+c1d4e2c5dae4c5dae4c5dae4c5dae4d2dee6c1d4e2c5dae4c1d4e2d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4cdd5dec5dae4c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d4dcd0c0cbb87787726f8f526f8f5277874681a089
+c0cbb8cdd5debacdd9b0b8a392a8b6667c745474436f8f526f8f524b6933304321
+4b68656084717e988294afa17d98b1667c749da1ab848887373e43354c316b8673
+6f8f525e742949601f6b854594afa1c5dae4cccdccd4dcd0c1d4e2bacdd9bacdd9
+b8c3c69ea88e7787726084717d9082afc0abbacdd9c1d4e2c5dae4d2dee6d2dee6
+cdd5ded2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6
+d2dee6cdd5ded2dee6cdd5ded2dee6d2dee6dfe1e6cdd5decdd5ded2dee6cdd5de
+cdd5ded2dee6cdd5ded2dee6cdd5ded9e6ead2dee6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6cdd5ded2dee6cdd5ded2dee6cdd5decdd5ded2dee6c5dae4d2dee6d2dee6
+c5dae4cdd5ded2dee6d2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6c5dae4c1d4e2b8c3c6c0cbb8
+92a8b69ea08a9ea9b49ea9b4778772819fb7aec4d0b8c3c6b8c3c6b0cbdc9fb0bb
+7d90828da0b69da1ab9ea9b47d908270908192a8b6afb9bc8a99ab6b86738ea089
+bacdd9c1d4e2bacdd9bacdd9b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+b2d2e0c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c5dae4b2d2e0
+c1d4e2c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2
+c5dae4c1d4e2c1d4e2c5dae4b2d2e0b2d2e0c5dae4c1d4e2c5dae4b2d2e0c1d4e2
+b2d2e0c5dae4c1d4e2b2d2e0c1d4e2c1d4e2b2d2e0c5dae4b2d2e0c5dae4b2d2e0
+c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c5dae4c1d4e2c5dae4b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2cdd5ded2dee6
+c1d4e2c1d4e2c5dae4cccdcccdd5dec1d4e2c1d4e2cdd5dec1d4e2d2dee6c1d4e2
+d2dee6c5dae4c1d4e2d2dee6d2dee6cdd5decdd5ded2dee6d2dee6c5dae4c5dae4
+c5dae4c5dae4cdd5dec1d4e2c5dae4cdd5ded2dee6c1d4e2c5dae4d2dee6c1d4e2
+c5dae4c5dae4c1d4e2c5dae4c1d4e2cdd5dec5dae4c5dae4cdd5decdd5dec5dae4
+c1d4e2cdd5decdd5dec1d4e2c5dae4d2dee6c1d4e2c5dae4c1d4e2c5dae4c5dae4
+c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2cdd5dec1d4e2c5dae4
+d2dee6c1d4e2cdd5dec5dae4cdd5ded2dee6c1d4e2c5dae4cdd5dec5dae4c1d4e2
+c5dae4c1d4e2cdd5decdd5dec1d4e2d2dee6c5dae4d2dee6c1d4e2c1d4e2cdd5de
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2
+cdd5ded2dee6c1d4e2c5dae4cdd5decdd5dec5dae4c5dae4c5dae4c5dae4cdd5de
+cdd5dec5dae4d2dee6c5dae4c5dae4cdd5dec1d4e2d2dee6c1d4e2cdd5dec1d4e2
+d2dee6d2dee6cdd5dec5dae4c5dae4cdd5dec5dae4d2dee6c1d4e2cdd5dec5dae4
+c5dae4c1d4e2d2dee6c1d4e2d2dee6c1d4e2cdd5debacdd99ea9b4afb9bcbacdd9
+bacdd9bacdd9bacdd99fb0bbc1d4e2cdd5ded2dee6cdd5decdd5dec5dae4c5dae4
+cdd5dec5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6c1d4e2c5dae4c5dae4d2dee6
+d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4
+c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6
+d2dee6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e68ea0897f97536b8673697c2b657c44
+8ea0898ea0898b98828ea08992a88d81a08996b7aba3b7a481a089577376577376
+8a99abaec4d0a5c4d7aec4d09ea9b48b919f637471565838394446576a626f8f52
+576b33354c314b69335e74298b98828ea0898a99ab7787727787726b8673667c74
+667c7462744477877295af7a9fb0bbafb9bc9da1abcdd5dec1d4e2cdd5ded2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6cdd5decdd5de
+dfe1e6d2dee6cdd5decdd5decdd5decdd5ded2dee6d2dee6cdd5decdd5ded2dee6
+cdd5ded2dee6d2dee6cdd5decdd5ded2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6cdd5dedfe1e6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6d2dee6c5dae4cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6bacdd9aec4d0aec4d0a3b8bc
+afc0ab92a88d9da1ab8b98828b98827d98b192a8b6aeb0bda5c4d7aec4d0aec4d0
+aec4d0aec4d09fb0bb8da0b66886a67e9882a3b8bcaec4d09ea9b48da0b6778772
+b2d2e0b2d2e0b2d2e0c1d4e2bacdd9c1d4e2b2d2e0c1d4e2b2d2e0b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c5dae4c1d4e2b2d2e0c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c5dae4b2d2e0b2d2e0c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c5dae4b2d2e0c5dae4c5dae4c5dae4b2d2e0c5dae4c1d4e2c5dae4c1d4e2
+c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4
+c5dae4b2d2e0c5dae4c5dae4b2d2e0c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4
+b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2cdd5decdd5dec1d4e2c1d4e2
+c1d4e2d2dee6c5dae4c5dae4d2dee6c5dae4cdd5ded2dee6c1d4e2cdd5decdd5de
+c1d4e2c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4c1d4e2d2dee6d2dee6
+cdd5ded2dee6c5dae4d2dee6cdd5dec5dae4cdd5dec5dae4cdd5ded2dee6cdd5de
+d2dee6c5dae4c1d4e2d2dee6c1d4e2d2dee6cdd5dec1d4e2c5dae4cdd5dec5dae4
+c5dae4c1d4e2c5dae4c5dae4cdd5dec1d4e2c1d4e2d2dee6c1d4e2cdd5decdd5de
+cdd5dec1d4e2d2dee6cdd5dec5dae4c5dae4c5dae4c5dae4d2dee6c1d4e2cdd5de
+c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2d2dee6cdd5dec5dae4c5dae4c5dae4
+c5dae4d2dee6c1d4e2c1d4e2c5dae4c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4
+d2dee6c5dae4c1d4e2d2dee6c1d4e2d2dee6cdd5ded2dee6c5dae4c5dae4d2dee6
+c1d4e2c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4cdd5dec5dae4
+cdd5decdd5decdd5dec1d4e2d2dee6c1d4e2d2dee6c1d4e2bacdd9bacdd9b8c3c6
+cdd5dec1d4e2c1d4e2d2dee6cdd5dec1d4e2d2dee6c1d4e2d2dee6c5dae4c1d4e2
+d2dee6cdd5dec5dae4c5dae4c5dae4d2dee6c1d4e2bacdd9a3b8bcafb9bc9fb0bb
+afb9bcafb9bcaec4d0a3b8bcb2d2e0d2dee6d2dee6cdd5dec5dae4c5dae4d2dee6
+c5dae4c1d4e2d2dee6d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6cdd5dec5dae4
+cdd5ded2dee6d2dee6c5dae4c1d4e2d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c1d4e2
+d2dee6d9e6ead2dee6dfe1e6dfe1e6d4dcd0b8c1af8c9853778746697c2b657c44
+60832a697c2b697c2b697c2b7787466f8f528c98537d9082475832576a627d9082
+9fb0bbafb9bc8a99ab77877284888784888754605f4e50433a442356603a657c44
+576b333f4e1e68752b86874a867c4c3f4e323f4e323944464960654b68653d5f25
+666c5e6b867394afa1c1d4e2cdd5de9da1abada17fb8c3c6cdd5dec1d4e2c1d4e2
+d2dee6cdd5ded2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6c1d4e2d2dee6bacdd9cccdcccdd5ded2dee6d2dee6d2dee6
+d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6c1d4e2
+d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+c1d4e2d2dee6d2dee6cdd5decdd5ded2dee6c1d4e2d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6c1d4e2d2dee6d2dee6c1d4e2c5dae4bacdd9bacdd9afb9bcaec4d0
+c5dae49fb0bba4bfb58a99ab92a8b6a3b8bcb0cbdc9fb0bb8da0b6aeb0bdc1c4c7
+c1d4e2c5dae4c1d4e2aec4d07a91a8627d9992a8b6aec4d0aec4d09ea9b47d9082
+bacdd9bacdd9b2d2e0c1d4e2c1d4e2bacdd9b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0
+bacdd9c1d4e2c5dae4c5dae4b2d2e0c1d4e2c1d4e2b2d2e0c5dae4c5dae4c5dae4
+c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2c5dae4
+c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c5dae4
+c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c1d4e2cdd5ded2dee6c1d4e2
+c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c5dae4cdd5dec5dae4c5dae4d2dee6
+cdd5ded2dee6cdd5dec5dae4d2dee6cdd5dec1d4e2d2dee6c5dae4c5dae4c5dae4
+c1d4e2d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4c1d4e2c1d4e2c1d4e2
+cdd5ded2dee6c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4c5dae4cdd5dec1d4e2
+c5dae4cdd5dec5dae4c5dae4d2dee6cdd5dec1d4e2c5dae4c5dae4c5dae4d2dee6
+c1d4e2c5dae4c5dae4c1d4e2cdd5ded2dee6c1d4e2c1d4e2c5dae4cdd5decdd5de
+c5dae4d2dee6c5dae4d2dee6c5dae4c1d4e2d2dee6d2dee6c1d4e2d2dee6c5dae4
+c5dae4c5dae4cdd5dec5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4c1d4e2
+d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2cdd5dec1d4e2c5dae4c5dae4
+cdd5dec5dae4c5dae4c5dae4d2dee6d2dee6c1d4e2d2dee6c5dae4d2dee6c5dae4
+c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4cdd5dec1d4e2b8c3c6b8c3c6aec4d0
+cdd5debacdd9c1d4e2c5dae4cdd5ded2dee6c5dae4c1d4e2d2dee6d2dee6c1d4e2
+d2dee6c5dae4cdd5dec5dae4c5dae4d2dee6bacdd9bacdd9afb9bcb8c3c692a8b6
+94afa1afc0ab9ea9b4b2d2e0c1d4e2c5dae4d2dee6c1d4e2d2dee6cdd5ded2dee6
+c5dae4c5dae4c5dae4d2dee6cdd5ded2dee6d2dee6c1d4e2d2dee6c5dae4d2dee6
+c1d4e2c5dae4c1d4e2d2dee6d2dee6d2dee6c5dae4c5dae4c1d4e2d2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6c1d4e2cdd5decdd5decdd5de9ea08a576b335e74294b6933
+4b69335474285474285e74297b90347c90536f8f525e74294758324b6865608471
+94afa19fb0bba0b09f757c7163747175704d3944465f61565658386b8673627444
+576b33576a1f7787469f90356660334c50263d5f253d573b496065709081819fb7
+a3b7a4b8c3c6b8c3c6a0b09f8b905587886dafb09ecccdccd2dee6c1d4e2cdd5de
+c1d4e2cdd5ded2dee6cdd5decdd5dec1d4e2d2dee6d2dee6cdd5ded2dee6d2dee6
+c5dae4c5dae4d9e6eacdd5decccdcca3b8bcbacdd9cdd5ded2dee6c5dae4cdd5de
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6aec4d0aec4d0bacdd99ea9b4b0cbdca3b8bcaec4d0bacdd9bacdd9
+aec4d0b8c3c6aec4d0a3b8bca3b8bcb0cbdcb8c3c6aec4d0aec4d0a3b8bca3b8bc
+a3b8bcc1d4e2c5dae4d2dee68b919fa3b8bca5c4d79fb0bbafb9bc8a99ab8ea089
+c1d4e2c1d4e2b2d2e0bacdd9b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c5dae4c1d4e2b2d2e0c1d4e2c5dae4b2d2e0c1d4e2c1d4e2b2d2e0c5dae4b2d2e0
+b2d2e0c5dae4c1d4e2c1d4e2c5dae4c5dae4b2d2e0c5dae4c1d4e2c1d4e2c5dae4
+c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2
+c1d4e2b2d2e0c5dae4c1d4e2c5dae4c5dae4b2d2e0c1d4e2c1d4e2c5dae4c5dae4
+c5dae4c1d4e2c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c1d4e2d2dee6
+c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2
+d2dee6c1d4e2c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c1d4e2c5dae4c5dae4
+c5dae4cdd5dec5dae4cdd5dec5dae4cdd5dec1d4e2c5dae4d2dee6c5dae4cdd5de
+d2dee6c1d4e2d2dee6cdd5dec1d4e2d2dee6d2dee6c5dae4c5dae4c1d4e2d2dee6
+d2dee6c5dae4d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c1d4e2c5dae4cdd5dec5dae4
+cdd5dec5dae4cdd5ded2dee6c1d4e2c5dae4d2dee6cdd5dec5dae4d2dee6c1d4e2
+d2dee6c5dae4c5dae4d2dee6c1d4e2cdd5decdd5dec1d4e2d2dee6c5dae4c1d4e2
+d2dee6c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4d2dee6c5dae4cdd5dec1d4e2cdd5dec5dae4c5dae4d2dee6c5dae4c5dae4
+c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4cdd5de
+c5dae4d2dee6cdd5dec5dae4c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4d2dee6
+d2dee6c1d4e2d2dee6d2dee6c5dae4c5dae4c5dae4bacdd9b8c3c6a4bfb5aec4d0
+c0cbb8bacdd9bacdd9c1d4e2c5dae4c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6
+c5dae4d2dee6c5dae4c5dae4c1c4c7c1d4e2bacdd9aec4d0a3b8bca4bfb5a4bfb5
+a0b09f9da1abafc0abc5dae4c1d4e2d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6
+c5dae4d2dee6d2dee6c5dae4cdd5ded2dee6c5dae4d2dee6c1d4e2d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4afb9bc9fb0bbcccdccd2dee6c0cbb87787727c9053618345
+576b334b6933567f3a576b338b9055656c266b85455f7b2a576a62597c7592a8b6
+a3b8bc9fb0bb8488874e50434e50433a44233d4f56666c5e56603a757c714b6933
+3c58223f4e1e77874687872c75704d475832657c447e988254744381a08994afa1
+b0b8a39ea88e778746657c44657c44657c449fb0bbc1d4e2d2dee6bacdd9c5dae4
+c1d4e2c5dae4cdd5ded2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6c1d4e2
+d2dee6d2dee6c5dae4d2dee6bacdd9c1c4c7cccdccd2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6cdd5decdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dcd6d6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6cdd5de
+d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6cdd5dec5dae4d2dee6c5dae4
+d2dee6d2dee6c5dae4c1d4e2cdd5deb0cbdcc5dae4aec4d0a3b8bc9fb0bba3b8bc
+aec4d0c1d4e2bacdd9bacdd9aec4d0afb9bcafb9bc9ea9b49fb0bba5c4d7819fb7
+7d98b1a3b8bc9fb0bbaec4d0a3b8bc96b7abd2dee6c1d4e29ea9b48b9882778772
+c1d4e2b2d2e0c5dae4bacdd9c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2b2d2e0
+b2d2e0c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2b2d2e0c5dae4
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c5dae4d2dee6c1d4e2
+d2dee6c1d4e2d2dee6d2dee6c5dae4d2dee6c5dae4c1d4e2d2dee6c5dae4cdd5de
+d2dee6c5dae4c5dae4d2dee6c5dae4cdd5ded2dee6d2dee6d2dee6c1d4e2d2dee6
+d2dee6c5dae4cdd5ded2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6d2dee6c5dae4
+d2dee6c5dae4cdd5ded2dee6c5dae4d2dee6d2dee6c1d4e2d2dee6cdd5ded2dee6
+c5dae4c1d4e2cdd5decdd5decdd5dec5dae4d2dee6c5dae4cdd5dec5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6c1d4e2c5dae4d2dee6c5dae4
+d2dee6c1d4e2cdd5ded2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+c1d4e2c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c1d4e2d2dee6
+c5dae4c1d4e2d2dee6c5dae4c1d4e2d2dee6c1d4e2c5dae4cdd5dec5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6d2dee6c1d4e2c5dae4
+d2dee6cdd5ded2dee6c5dae4c5dae4d2dee6c5dae4c1d4e2afc0abafb9bc9fb0bb
+a4bfb5a3b8bcb8c3c6c1d4e2cdd5dec5dae4d2dee6c5dae4c5dae4c5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4bacdd9bacdd9bacdd9a3b8bca3b7a494afb992a8b6
+b8c3c692a88daec4d0bacdd9c1d4e2d2dee6c5dae4cdd5ded2dee6c5dae4d2dee6
+c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6bacdd99fb0bbafb9bccdd5decdd5decccdcc8b9882657c44
+5474436b86736183457d90827787468b90556f8f5281a0897d98b17d98b19fb0bb
+aec4d09ea9b4666b3b4c50263a4423383c235f615687886d87886daeb0bd778772
+5474436b8545767b47574f26383c23556024618345778746657c447b90347c9053
+7d97365e74295e74295f7b2a709081819fb7a3b8bcbacdd9c5dae4cdd5dec1d4e2
+cdd5dec5dae4d2dee6d2dee6c1d4e2d2dee6cdd5ded2dee6c1d4e2d2dee6c5dae4
+d2dee6cdd5ded2dee6cdd5deb0cbdcafb9bcb8c3c6d2dee6cdd5dec5dae4cdd5de
+cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+c1d4e2d2dee6d2dee6cdd5ded2dee6dfe1e6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6bacdd9c1d4e2c5dae4
+cdd5ded2dee6c5dae4d2dee6d2dee6b8c3c6bacdd99fb0bba0b09faec4d0a4bfb5
+a5c4d7aec4d0aec4d0afb9bcafb9bcaec4d0b8c3c69ea9b4aec4d09ea9b47a91a8
+7a91a8819fb78da0b692a8b68da0b681a089aec4d0c1d4e2b8c3c67d9082778772
+c1d4e2c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2
+c5dae4c1d4e2b2d2e0b2d2e0c5dae4c5dae4b2d2e0b2d2e0c5dae4c1d4e2c5dae4
+c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4b2d2e0c1d4e2c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4d2dee6c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c5dae4c1d4e2c5dae4b2d2e0c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4c1d4e2c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4
+c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4
+c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2d2dee6
+cdd5ded2dee6cdd5ded2dee6d2dee6c5dae4cdd5decdd5ded2dee6d2dee6c5dae4
+cdd5ded2dee6d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4c1d4e2c5dae4
+c5dae4d2dee6c5dae4cdd5dec5dae4c5dae4c5dae4d2dee6c5dae4c1d4e2d2dee6
+c5dae4c1d4e2d2dee6cdd5dec5dae4d2dee6c1d4e2d2dee6c1d4e2c5dae4d2dee6
+d2dee6c5dae4d2dee6d2dee6c5dae4c1d4e2d2dee6c5dae4c1d4e2d2dee6c5dae4
+c1d4e2d2dee6c1d4e2d2dee6c1d4e2d2dee6c1d4e2d2dee6c5dae4c5dae4d2dee6
+d2dee6c1d4e2c5dae4c1d4e2c1d4e2d2dee6c5dae4cdd5ded2dee6c5dae4c5dae4
+d2dee6d2dee6c1d4e2d2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6c5dae4cdd5de
+c5dae4c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6c1d4e2c5dae4d2dee6d2dee6
+c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6bacdd9bacdd992a88d81a089
+8ea0899ea9b4aec4d0c1d4e2cdd5dec5dae4d2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6c5dae4d2dee6cdd5ded2dee6cdd5deb0cbdca3b8bc92a8b694afa1709081
+9ea88e7d90829fb0bbbacdd9d2dee6c1d4e2c1d4e2c5dae4d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d9e6ead2dee6
+dfe1e6c5dae4d2dee6d2dee6d2dee6d9e6ead2dee6c5dae4d2dee6d9e6eac5dae4
+d2dee6d2dee6d2dee6d2dee6c0cbb88b98828a99abafb9bccccdcc75889b3d5f25
+547443657c446b85456b854577874668752b576b3371975392a8b6c0cbb8b0cbdc
+bacdd98b9080666b3b5560243a44234758327787468b90558ea0899ea08a778772
+6f8f527b90345560243a44233a44233c5822697c2b4b6933556024767b476b8545
+697c2b68752b6b8545657c4492a88da4bfb5afc0abc1d4e2cdd5dec5dae4cdd5de
+d2dee6d2dee6c5dae4c1d4e2d2dee6c5dae4cdd5decdd5dec5dae4d2dee6d2dee6
+cdd5debacdd9cccdccc5dae4afb9bc9fb0bbcdd5decdd5ded2dee6cdd5decdd5de
+d2dee6cdd5decdd5ded2dee6d2dee6d2dee6cdd5ded9e6eac5dae4d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6cccdccd2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6c5dae4d2dee6d9e6eac5dae4bacdd9a3b8bcafb9bc
+bacdd9cccdccb8c3c6bacdd9c1d4e2bacdd9b8c3c6afb9bc94afa175889b8a99ab
+c1d4e2bacdd9bacdd9c1d4e2c1d4e2cdd5dec1d4e2b0cbdca3b8bc6b86737a91a8
+94afb9a5c4d796b7ab9fb0bb94afb9a4bfb57e98828ea0898da0b68ea089709081
+c1d4e2b2d2e0c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4b2d2e0c5dae4c5dae4c5dae4b2d2e0c5dae4c1d4e2
+c5dae4b2d2e0c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4
+c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4
+c5dae4c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4
+c5dae4c5dae4c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c1d4e2
+d2dee6c5dae4c1d4e2c5dae4c5dae4c5dae4cdd5ded2dee6c5dae4c5dae4c5dae4
+c5dae4d2dee6c5dae4d2dee6d2dee6cdd5dec5dae4c5dae4d2dee6d2dee6c1d4e2
+d2dee6c5dae4cdd5ded2dee6cdd5decdd5ded2dee6cdd5ded2dee6d2dee6d2dee6
+c1d4e2d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6c5dae4d2dee6cdd5dec1d4e2c5dae4d2dee6cdd5decdd5de
+d2dee6c5dae4c5dae4d2dee6c1d4e2d9e6eac1d4e2d2dee6c5dae4d2dee6c1d4e2
+d2dee6c1d4e2cdd5ded2dee6d2dee6c1d4e2d2dee6c5dae4c5dae4d2dee6d2dee6
+c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4cdd5ded2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4
+c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6c5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c1d4e2bacdd9b8c3c68ea0898ea089
+81a08992a88da3b8bcbacdd9cdd5dec1d4e2c5dae4cdd5ded2dee6c1d4e2d2dee6
+c5dae4c5dae4d2dee6c5dae4d2dee6bacdd9a3b8bca3b7a49ea9b4bacdd996b7ab
+81a0897090819fb0bbb2d2e0c5dae4b0cbdcaec4d0c1d4e2c5dae4c5dae4c5dae4
+d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6c1d4e29ea9b46b85456b85458c98537c9053608471
+7090816b85456b8545657c446f8f52778746778746697c2b6b867392a7599ea88e
+9ea88e87886d86874a666b3b757c717e9882697c2b697c2b867c4c9e98538c9853
+6b852c6b852c56603a3335222f3c224b69336b852c757b2d8b9033757b2d767b47
+6b852c68752b7787467090817090818b90809ea9b4cdd5decdd5ded2dee6c5dae4
+c5dae4d2dee6d2dee6c5dae4cdd5dec5dae4d2dee6cdd5ded2dee6c5dae4d2dee6
+d2dee6c1d4e2c1d4e2bacdd9c1c4c7b8c3c6cdd5ded2dee6cdd5debacdd9cccdcc
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d2dee6cdd5dec1d4e2d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5dec1c4c7c5dae4a5c4d7a5c4d7
+b8c3c6bacdd9b0cbdcc1d4e294afa192a88daec4d0a4bfb57090817e988294afb9
+a4bfb5aec4d0bacdd9aec4d0a4bfb5bacdd9bacdd99fb0bb9da1ab75889b819fb7
+aec4d09fb0bb819fb7819fb77a91a8819fb76b86736374716b867375889b92a8b6
+c1d4e2c1d4e2c1d4e2b2d2e0b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4
+b2d2e0c1d4e2b2d2e0c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2b2d2e0c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4
+d2dee6c1d4e2c5dae4d2dee6c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2
+c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4
+c1d4e2d2dee6c1d4e2c5dae4c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4
+c1d4e2c5dae4c5dae4c1d4e2d2dee6c5dae4c1d4e2c5dae4c1d4e2c5dae4d2dee6
+d2dee6c5dae4c1d4e2cdd5dec1d4e2d2dee6c5dae4c5dae4c1d4e2d2dee6c1d4e2
+d2dee6c5dae4cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6
+d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6c1d4e2d2dee6d2dee6c5dae4
+d2dee6c1d4e2c5dae4d2dee6c1d4e2d2dee6c5dae4d2dee6cdd5dec5dae4d2dee6
+c5dae4d2dee6d2dee6c5dae4c5dae4cdd5ded2dee6c5dae4c5dae4c1d4e2d2dee6
+c5dae4d2dee6c5dae4c1d4e2d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4c5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6cdd5ded2dee6cdd5de
+d2dee6c5dae4c5dae4d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4cdd5decdd5de
+d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4
+d2dee6c1d4e2c5dae4cdd5dec5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+cdd5ded2dee6d2dee6c1d4e2d2dee6cdd5decdd5debacdd9b8c3c695af7a7e9882
+7d90827e9882a3b8bcc1d4e2bacdd9c1d4e2cdd5ded2dee6c5dae4d2dee6c1d4e2
+d2dee6cdd5decdd5decdd5ded2dee6c1d4e2a3b7a4709081a3b7a496b7ab94afa1
+819f5960847192a88dafc0abbacdd98ea08994afb9c1d4e2d2dee6d2dee6c5dae4
+d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d4dcd0bacdd9afb09e87886d547443657c446f8f52
+7e98827c90537787466f8f5292a88d86874a8b9055656c26576b334b69337b9034
+657c44576b336b85455f7b2a6b86738b9055697c2b68752b7787467b90346b852c
+7b9034627444547443354c31576b337787467b90347b90348b9055766e2d757b2d
+657c44547443657c447e98827e98827e988275889bc1d4e2d2dee6d2dee6d2dee6
+cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+cdd5ded2dee6cdd5deb8c3c6aec4d0afb9bcc1d4e2d2dee6d2dee6cdd5decdd5de
+cdd5decdd5ded2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6bacdd9d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6b0cbdca3b8bcbacdd9b8c3c6
+b8c3c6bacdd9b8c3c6a5c4d79fb0bba3b8bca4bfb58da0b694afa1b0cbdcbacdd9
+aec4d0a3b8bc9fb0bb8b98826374717d90829ea9b494afa192a8b67e9882819fb7
+aec4d0b0cbdca3b8bcb0cbdc81a08992a8b6819fb77d98b19ea9b48da0b68da0b6
+c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c5dae4b2d2e0c5dae4b2d2e0c1d4e2
+c5dae4c5dae4c1d4e2c5dae4b2d2e0c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4cdd5dec5dae4c5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4
+c5dae4c1d4e2c1d4e2c5dae4c1d4e2d2dee6c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4c1d4e2c1d4e2c5dae4d2dee6c5dae4c5dae4c1d4e2c5dae4d2dee6c5dae4
+c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6c1d4e2d2dee6
+c5dae4d2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6c5dae4c5dae4d2dee6c1d4e2
+d2dee6c5dae4cdd5ded2dee6c5dae4cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6c1d4e2d9e6eacdd5dec5dae4d2dee6d2dee6
+d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6cdd5dec5dae4
+c5dae4cdd5ded2dee6d2dee6c5dae4cdd5ded2dee6cdd5ded2dee6cdd5ded2dee6
+c5dae4c5dae4d2dee6d2dee6c1d4e2c5dae4d2dee6c1d4e2cdd5ded2dee6c1d4e2
+d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6d2dee6c5dae4cdd5ded2dee6d2dee6
+d2dee6c5dae4c5dae4d2dee6cdd5dec5dae4c5dae4cdd5ded2dee6c5dae4c5dae4
+d2dee6cdd5ded2dee6cdd5ded2dee6c5dae4cdd5debacdd9a0b09f8ea0897c9053
+8b988281a089a0b09faec4d0b8c3c6bacdd9c5dae4d2dee6c1c4c7c5dae4c1d4e2
+d2dee6c1d4e2bacdd9c1d4e2d2dee6c5dae4a3b7a47c90536b86736b867392a88d
+6b8673576b33597c757090817e98828b9882b2d2e0d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6c5dae4d2dee6d2dee6c1d4e2c5dae4d2dee6c1d4e2d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d9e6ead2dee6d4dcd0cccdcc848887547443597c755f7b2a
+6b85456b852c54742854744392a88d7c905356603a3f4e32576b335474285f7b2a
+5e74295f7b2a6b85457787467d90826f8f526b852c778746767b4787872c60832a
+6b854592a88d92a8b692a88d81a08992a8b67787467c905386874a666b3b555824
+47583270908181a089a4bfb5bacdd9bacdd9b8c3c6c1d4e2d4dcd0cdd5ded2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6d2dee6
+d2dee6cdd5decdd5debacdd9aec4d09ea9b4c1c4c7bacdd9cdd5decccdcccccdcc
+c5dae4d2dee6cdd5ded2dee6d2dee6d2dee6cdd5ded2dee6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c1d4e29ea9b494afb9a3b8bc
+aec4d0b8c3c69fb0bba3b8bc92a8b692a8b6a3b8bc9fb0bb9ea88e9da1abafb9bc
+bacdd9afb9bc9ea9b475889b7787727090817e988270908196b7ab81a08994afb9
+b0cbdcbacdd9cccdccb0cbdc7d98b19fb0bba3b8bc7e988292a8b6c0cbb8a3b8bc
+c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c5dae4c5dae4b2d2e0c1d4e2c5dae4
+c5dae4b2d2e0c5dae4c5dae4c5dae4c1d4e2c5dae4b2d2e0c5dae4c5dae4c1d4e2
+c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4
+c1d4e2c5dae4c5dae4c1d4e2c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6
+cdd5ded2dee6c5dae4d2dee6c5dae4c5dae4c5dae4c1d4e2c5dae4d2dee6c5dae4
+c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2c1d4e2c5dae4
+d2dee6c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4
+c5dae4c5dae4c1d4e2c5dae4c5dae4cdd5decdd5dec5dae4d2dee6c1d4e2c5dae4
+c5dae4c5dae4c1d4e2d2dee6c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6
+cdd5ded2dee6c5dae4cdd5dec1d4e2d2dee6c1d4e2c5dae4d2dee6c5dae4cdd5de
+d2dee6d2dee6c1d4e2d2dee6d2dee6c1d4e2d2dee6c1d4e2d2dee6c5dae4cdd5de
+cdd5ded2dee6d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4c5dae4
+d2dee6d2dee6c5dae4d2dee6cdd5dec5dae4d2dee6c5dae4cdd5ded2dee6d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6c1d4e2d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c1d4e2
+d2dee6c5dae4cdd5ded2dee6c5dae4cdd5ded2dee6d2dee6d2dee6cdd5ded2dee6
+c5dae4d2dee6cdd5ded2dee6c1d4e2c5dae4cdd5dec5dae4d2dee6c1d4e2d2dee6
+d2dee6c5dae4d2dee6d2dee6c5dae4cdd5ded2dee6cdd5ded2dee6c5dae4c5dae4
+d2dee6c1d4e2c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6cdd5de
+d2dee6c5dae4c1d4e2c1d4e2c1d4e2cdd5dec0cbb8bacdd994afa18b98827f9753
+7c905392a88d92a88da3b8bca3b8bcaec4d0c5dae4cdd5deb8c3c6bacdd9d2dee6
+cdd5deb8c3c6a5c4d7a3b8bcbacdd9cdd5dec5dae47d908254744354744392a88d
+6b8673547443567f3a6084716b8673a3b8bcc5dae4cdd5ded2dee6c1d4e2c5dae4
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5ded2dee6d2dee6cdd5ded9e6ead2dee6d2dee6d2dee6d2dee6c1d4e2cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c1d4e29fb0bb7e98827d90823d573b
+5474435e7429657c444b6933657c446b854554742849601f475832576b3349601f
+6183455f7b2a819f59778746657c446274445e7429576b336274447b9034657c44
+6f8f52c1d4e2c1d4e2c5dae4b0cbdcc0cbb87c9053627444666b3b6660333f4e1e
+3a442370908194afb9c1d4e2d2dee6d4dcd0d2dee6dfe1e6dfe1e6dfe1e6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4aec4d0b8c3c6c1d4e2d2dee6cdd5ded2dee6
+cdd5ded2dee6cdd5deaec4d09fb0bbaeb0bdb8c3c69ea9b4bacdd9bacdd9aeb0bd
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5ded2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4c1d4e2c1d4e2b8c3c6a4bfb581a0899fb0bb
+a5c4d7a4bfb5aec4d094afa18b98828ea089a0b09f9fb0bba0b09f8b98829fb0bb
+aec4d09fb0bb9fb0bbafb9bcaec4d09fb0bb7d908281a089a3b8bc7e988294afb9
+a3b8bc9fb0bbafb9bca3b8bc7d90828da0b6a3b8bc9da1ab8b98829ea88e9ea08a
+bacdd9c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c1d4e2c5dae4
+b2d2e0c5dae4c5dae4c5dae4b2d2e0c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2
+c1d4e2c5dae4c5dae4d2dee6c1d4e2c1d4e2c5dae4c1d4e2d2dee6c1d4e2c5dae4
+c1d4e2c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4c1d4e2
+d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4
+c1d4e2c5dae4d2dee6c5dae4c1d4e2c5dae4d2dee6c1d4e2d2dee6c1d4e2c1d4e2
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4c5dae4
+c1d4e2d2dee6c1d4e2d2dee6c5dae4c1d4e2d2dee6c5dae4c5dae4c1d4e2c5dae4
+c5dae4cdd5ded2dee6d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4
+cdd5ded2dee6c5dae4c5dae4cdd5ded2dee6d2dee6c5dae4d2dee6cdd5dec5dae4
+d2dee6c1d4e2d2dee6d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6d2dee6d2dee6
+c1d4e2d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6cdd5ded2dee6
+cdd5ded2dee6d2dee6cdd5ded2dee6c1d4e2d2dee6d2dee6c5dae4c1d4e2d2dee6
+c1d4e2d2dee6d2dee6c5dae4d2dee6c1d4e2d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6c5dae4c5dae4d2dee6
+cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6cdd5de
+d2dee6c5dae4c1d4e2d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6cdd5ded2dee6c5dae4
+d2dee6d2dee6cdd5debacdd9b0cbdcc1d4e2c1d4e2b8c3c6a0b09f8ea0897f9753
+8b98827787468ea08994afa1a4bfb5aec4d0bacdd9bacdd9b8c3c6c1d4e2d2dee6
+c5dae4d2dee6aec4d0afc0ab92a88da0b09fbacdd994afa1547443547443608471
+4b6933547443657c44a5c4d7c5dae4c5dae4d2dee6c1d4e2bacdd9d2dee6c5dae4
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5debacdd9c1d4e2
+d2dee6c1c4c7bacdd9cdd5ded2dee6d2dee6d2dee6c1d4e2aec4d092a8b63d4f56
+667c74637471344d1e497323708f317c9053697c2b697c2b3a4423383c23304321
+5474434b681e6b8545657c447787726b8673657c444e5043576b336b85456f8f52
+8b9882a3b8bcc5dae4d2dee6c5dae4b8c3c66274443f4e323335223f4e1e565838
+4e5043496065709081afc0abcdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+cdd5ded2dee6d2dee6cdd5dec1c4c78a99ab9fb0bbc1d4e2d2dee6d2dee6d2dee6
+cdd5dec1d4e2aec4d0afb9bc94afb9afb9bcafb9bc8da0b6b8c3c692a8b69ea88e
+c1d4e2d2dee6cdd5decdd5decdd5ded2dee6d2dee6d2dee6d2dee6cdd5dedfe1e6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6d2dee6b0cbdcbacdd9cccdccbacdd9bacdd9aec4d0a3b8bc94afa1819fb7
+94afb994afb9b8c3c67d90826b8673a3b7a494afa19ea08a8b98827d90828da0b6
+bacdd9c1c4c79fb0bb8da0b6a0b09f9da1ab7d9082757c718da0b69fb0bb94afb9
+92a8b69ea9b48b9882a0b09fa4bfb5afb9bc9ea9b48b988292a88d7c90538b9080
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2b2d2e0c5dae4c5dae4
+b2d2e0c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4
+c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c1d4e2d2dee6c5dae4
+d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6
+c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4c5dae4
+d2dee6c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4d2dee6c1d4e2
+d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6c1d4e2d2dee6c1d4e2d2dee6
+c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6cdd5ded2dee6c5dae4
+d2dee6c1d4e2d2dee6cdd5ded2dee6c5dae4c5dae4d2dee6c1d4e2cdd5ded2dee6
+cdd5decdd5dec5dae4d2dee6d2dee6d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+c5dae4d2dee6d9e6eacdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+c5dae4c5dae4cdd5ded2dee6d2dee6cdd5ded2dee6d2dee6d2dee6cdd5ded2dee6
+c5dae4d2dee6cdd5decdd5ded2dee6d2dee6d2dee6cdd5ded2dee6c5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4c5dae4
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+cdd5ded2dee6c0cbb8bacdd9afb9bcbacdd9c0cbb896b7aba0b09f92a88d7e9882
+7c90537c90538b98828a99abafb9bca3b8bcafc0abaeb0bdafc0abc1d4e2cdd5de
+cdd5dec5dae4c1d4e28b98826b86736b854592a88d7d90824b6865608471667c74
+81a0896b867360847181a089c1d4e2c1d4e2cdd5debacdd9b8c3c6c5dae4c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6eacdd5ded9e6eacdd5deaeb0bdaec4d0
+d2dee6c1d4e2a0b09fb8c3c6d2dee6cdd5ded9e6ead2dee6d4dcd092a8b6a0b09f
+b2d2e06b8673597c757e98827c90537c905360832a567f3a496032304321304321
+304321475832576b335f7b2a92a88db8c3c694afa15658384c50267787728da0b6
+92a8b6667c74aec4d0d4dcd0cdd5de9d9981576b332f3c222f3c224c5026496032
+667c74709081bacdd9c1c4c7d2dee6dcd6d6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5deb8c3c6afb9bc9fb0bb7787728ea089b8c3c6cdd5ded2dee6d2dee6d2dee6
+cdd5deb8c3c69fb0bb8da0b67787728ea0899da1ab6b8673608471757c7192a8b6
+cdd5deb0cbdcaec4d0c5dae4dfe1e6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6afb9bcb8c3c6aec4d0cccdccaec4d0b8c3c670908192a88db0cbdc
+a5c4d7aec4d0bacdd97d908270908192a8b68ea0899fb0bb70908194afb9a4bfb5
+a3b8bc9ea9b4a3b7a4a3b7a4a0b09f8da0b694afb97e98827d908292a88db8c3c6
+a3b7a49fb0bba3b7a492a88da3b8bcbacdd9b8c3c69ea9b47d90827787468b9080
+c1d4e2c1d4e2bacdd9c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2
+c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c1d4e2c5dae4
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2d2dee6c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4c5dae4cdd5ded2dee6d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6c5dae4d2dee6c5dae4c1d4e2
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4
+d2dee6d2dee6c5dae4c5dae4c1d4e2c5dae4c5dae4cdd5decdd5ded2dee6c5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6cdd5dec1d4e2d2dee6c5dae4cdd5ded2dee6
+c1d4e2d2dee6d2dee6c1d4e2c1d4e2d2dee6d2dee6cdd5dec5dae4d2dee6c5dae4
+d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d9e6eacdd5dec5dae4
+d2dee6d2dee6d2dee6d2dee6c5dae4cdd5ded2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6
+d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5de
+c5dae4cdd5ded2dee6c5dae4d9e6eac1d4e2d2dee6c5dae4d2dee6c1d4e2d2dee6
+c1d4e2c5dae4bacdd9b8c3c6a4bfb5b8c3c6c1c4c794afa195af7a8ea0897c9053
+8c98537c90537e9882709081a3b8bcaec4d092a8b68b9882afb9bcbacdd9c1d4e2
+cdd5dec5dae4c0cbb895af7a6f8f525474435773764b6865354c31496065597c75
+7787725f7b2a54744394afb996b7abbacdd99ea9b4a3b8bcbacdd9b8c3c6c1d4e2
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6d2dee6cdd5de8da0b6a3b7a4
+cccdccc5dae4a3b8bc81a089a0b09fb8c3c6cdd5ded2dee6cdd5deafb9bcaec4d0
+cccdcc6274447e988294afa176872d697c2b6b85454b69337090814b69333f4e32
+333522383c23496032497323657c449ea88e7e9882565838767b47767b476b8673
+4658646374717a91a8a3b7a4b0b8a3778746656c263f4e1e30432156603a778772
+556c8492a8b6c1d4e2cdd5ded2dee6cdd5dec1c4c7cccdccc1c4c7cfc6b8afb9bc
+9ea08a7787727d908281a08975889b92a8b6d2dee6d2dee6dcd6d6d2dee6d2dee6
+d2dee6cdd5de8da0b67d90827787728b9080666c5e57737660847170908181a089
+aec4d09fb0bbc1c4c7d2dee6d2dee6d2dee6dfe1e6cdd5dedfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6
+d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4bacdd9afb9bc92a8b6b0cbdcc5dae4
+bacdd9bacdd9b8c3c6aec4d0aec4d07d90828b9882c1d4e28da0b6a5c4d7b8c3c6
+81a0897d908292a88d8b98828b90808ea0898da0b6a3b7a49fb0bb95af7aafc0ab
+92a88d81a089a4bfb5a4bfb5a5c4d7b0cbdcb8c3c6b8c3c692a88d81a0898ea089
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c1d4e2
+d2dee6c5dae4d2dee6c1d4e2c5dae4d2dee6cdd5ded2dee6c1d4e2d2dee6c5dae4
+c5dae4d2dee6c5dae4cdd5dec5dae4c5dae4d2dee6d2dee6d2dee6c5dae4cdd5de
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4cdd5de
+c5dae4c5dae4d2dee6cdd5dec5dae4cdd5dec5dae4c1d4e2d2dee6c1d4e2d2dee6
+c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2c5dae4d2dee6
+c5dae4c5dae4cdd5dec1d4e2c1d4e2c5dae4cdd5ded2dee6d2dee6d2dee6c1d4e2
+d2dee6cdd5ded2dee6cdd5dec5dae4c5dae4c5dae4cdd5ded2dee6c5dae4d2dee6
+d2dee6cdd5dec5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4c5dae4cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4cdd5ded2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6cdd5dec5dae4d2dee6c1d4e2d2dee6d2dee6
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+c1d4e2cdd5debacdd9a4bfb5a0b09fafb9bcafc0ab8ea0898ea089819f598b9882
+8ea0597f97537f975381a08992a88d8da0b66b8673709081aec4d0cccdccc1d4e2
+d2dee6cdd5debacdd9c1d4e281a0894b69334b693392a88d70908192a88d94afa1
+7e9882597c754b6865587ca0a3b8bcaec4d092a88d778772a3b7a4aec4d0d2dee6
+c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d9e6eac5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4cdd5ded9e6ead2dee6
+dfe1e6d9e6eadfe1e6d9e6ead9e6ead2dee6d9e6eadfe1e6cdd5dea3b8bc8ea089
+7787728ea089afb9bc8ea0897c9053657c447787728b988292a88d77877254605f
+6374715474437e98827d9082767b4768752b4b6933657c4481a08992a8b64e5043
+272c1f2b33223f4e1e47581f5474436b8545778746666b3b847144574f26394446
+3335222f3c225474437c90536b852c5f7b2a576a1f576b333f4e1e304321637471
+63747194afa1afb09eafb09e8b98827d9082778746757c71778772778772778772
+6b854562744454744370908181a089bacdd9d2dee6d2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6bacdd9bacdd98ea08975889b8b988281a08981a0898da0b68da0b6
+b8c3c6b8c3c6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6bacdd9bacdd9bacdd9aec4d0
+c1d4e2aec4d0afb9bca0b09f9ea9b4a4bfb5c1d4e2aec4d0a3b8bc7e98828ea089
+7d90827e98827787467c9053819f597d908296b7abafc0ab95af7a92a75995af7a
+a4bb7eb2d2e0d4dcd0c1d4e2a3b7a4afc0abcccdccafb09e77874692a7597e9882
+bacdd9c1d4e2c1d4e2c5dae4c5dae4c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2
+c1d4e2c1d4e2c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c1d4e2
+cdd5dec5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4c1d4e2d2dee6c5dae4
+c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6d2dee6
+c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6cdd5ded2dee6cdd5de
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4
+c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4d2dee6d2dee6c1d4e2d2dee6c5dae4
+d2dee6c5dae4c5dae4bacdd9b0cbdcc5dae4c5dae4cdd5dec5dae4c5dae4d2dee6
+c5dae4c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4cdd5ded2dee6cdd5dec5dae4
+d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6cdd5ded2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6
+d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c1d4e2d2dee6d2dee6cdd5ded2dee6
+cdd5ded2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6c5dae4d2dee6c1d4e2d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6c5dae4d2dee6d2dee6cdd5de
+b8c3c6bacdd9b8c1afa0b09f92a88daec4d0afb9bc95af7a8ea0898c98538b9882
+8ea0598c98538b98827c905381a0896b86736b86737a91a8a3b7a4b8c3c6aec4d0
+c5dae4c1d4e2b0b8a3a3b7a481a0893c5822496032597c75597c758a99ab96b7ab
+7e9882657c443d5f25597c75aec4d092a8b694afa1819fb796b7abd2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d4dcd092a88d709081
+7c9053567f3a6183456b86736b852c6183454b69334960323d573b4960324b6933
+5f7b2a6b8545618345475832767b474758324960324b6933576b336374713f4e32
+30432130432147581f4960327090816b85457d9082767b4795885c555824304321
+3a44234758326b8545697c2b5e7429547428555824354c313f4e322b33223f4e32
+54605f4e50435f6156666b3b576b33547443627444576b33657c44576b33627444
+7e9882b0b8a38b9882a0b09fc0cbb8d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6
+d2dee6cdd5deafb9bcaec4d09fb0bb92a88d7d9082819fb792a8b68b98829fb0bb
+afb9bcb8c3c6cdd5ded2dee6d2dee6cdd5dedfe1e6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6c1d4e2d4dcd0c1c4c7d2dee6
+c1d4e2aec4d0bacdd99ea9b4a0b09fa3b8bcafb9bc7d90827e98827090817e9882
+8b98828ea0897e98826b85457f97537197537e988281a0897e98827e988281a089
+a5c4d7b0cbdcbacdd98ea08960847196b7ab95af7a56603a49601f7f97537c9053
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c1d4e2d2dee6c1d4e2c5dae4
+c5dae4c1d4e2c5dae4c5dae4d2dee6c5dae4c5dae4c1d4e2c5dae4c5dae4c1d4e2
+d2dee6cdd5dec5dae4d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4
+c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6
+cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4
+d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4
+c5dae4c5dae4c5dae4cdd5deaec4d0c5dae4cdd5dec5dae4d2dee6c5dae4d2dee6
+d2dee6cdd5ded2dee6c1d4e2c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6
+c5dae4d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6
+dfe1e6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c1d4e2d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+a4bfb5a3b8bca0b09f94afa19ea88ea3b8bca3b8bca3b7a48ea0598ea0898ea059
+92a7598b98827f9753778772667c745474436b867394afa19fb0bba4bfb5c5dae4
+d2dee6d4dcd0c1d4e292a88d597c754b69334b69334b6933657c4494afa1a4bfb5
+7090815474434b68654b693381a0898ea08994afa1a4bfb5b0cbdcc5dae4cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d9e6eac5dae4d2dee6c5dae4dfe1e6d2dee6
+d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6d2dee6bacdd99ea88e
+8b98826b8673657c44657c446b85456274444960323f4e322f3c223a44233d573b
+6274445f7b2a3f4e323a44235658384c50263d573b3c58224b69337c9053657c44
+576a1f576b33657c446b86737787725474436b8545767b479f9154556024475832
+5560246b854560832a657c445474283f4e1e2f3c223d4f5675889b3f4e32475832
+576a623d573b2f3c223a44236274447d9082576b336374717d9082657c447e9882
+aec4d0d2dee6cdd5ded2dee6d9e6eac1c4c7cdd5ded2dee6dfe1e6dfe1e6d2dee6
+dfe1e6d2dee6cdd5deafb9bc819fb777877257737670908181a0897e98829fb0bb
+9fb0bbafb9bcaec4d0d2dee6d2dee6cdd5decdd5ded2dee6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c1d4e2b8c3c69fb0bbb8c3c6bacdd9afb9bcbacdd9
+afb9bcafb9bcafb9bc9fb0bba3b8bc92a88d8ea0897d90827d90828ea0597d9082
+7787467787728ea0896b867370908192a8b68da0b692a88d7e988281a08994afa1
+a4bfb5b8c3c6bacdd994afa160847196b7ab8b98824758325474436f8f527f9753
+c1d4e2c1d4e2c1d4e2b2d2e0c1d4e2c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2
+c1d4e2c5dae4c1d4e2c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2
+d2dee6c1d4e2c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4
+c5dae4d2dee6c1d4e2c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6
+c5dae4d9e6eac5dae4c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6
+c5dae4c5dae4d2dee6c5dae4c5dae4d9e6eac5dae4d2dee6c5dae4c5dae4c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4bacdd9b8c3c6d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4
+c5dae4cdd5ded2dee6c5dae4d2dee6c5dae4d2dee6c5dae4cdd5ded2dee6c5dae4
+c1d4e2d2dee6c1d4e2d2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5ded2dee6d9e6ead9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d4dcd0
+bacdd9a3b7a49fb0bb92a88d94afa18ea0899ea9b48ea0898b98828b90557e9882
+8ea0597c90538c98537c90536b867381a0897090819fb0bba3b8bc9fb0bba5c4d7
+bacdd9c5dae4d2dee6bacdd97e98825474436b8545567f3a4b6933576a62778772
+5474433f4e32496032597c75547443597c7594afb9a5c4d7a3b8bcbacdd9cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+94afa1a4bfb57e9882627444697c2b576b3349601f4b6933354c313a4423304321
+4b6933383c23262e35342d1f2a34383f4e323043214960324b681e576b335e7429
+7b90348ea0598ea0598c98535f7b2a5474434b69336274449f915474643e576b33
+778746697c2b6b852c697c2b3c58224758323944464758329fb0bb757c71778772
+75889b577376757c71394446576a62afc0ab8b919f8a99abafb9bca3b7a4bacdd9
+d4dcd0dfe1e6dfe1e6dfe1e6cccdccaeb0bdcdd5dedfe1e6cdd5decdd5dedfe1e6
+d2dee6dfe1e6d2dee6c1c4c78a99ab7e98828b98827090816b86737090818ea089
+709081afb9bcbacdd9cdd5deb8c3c6b8c3c6d2dee6d2dee6d2dee6dfe1e6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5dedfe1e6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+c1d4e2c5dae4d2dee6d2dee6bacdd9bacdd9a3b8bc9fb0bb8a99ab8da0b6a4bfb5
+a3b8bc9fb0bba3b8bc9fb0bb92a88d7e98827c9053657c446b86737f9753778746
+8c98537e988295af7a94afb996b7ab96b7ab92a8b692a8b67e9882b2d2e0b8c3c6
+a3b8bcaec4d0bacdd984888781a089b0cbdca0b09f4b6865597c7595af7a6f8f52
+b2d2e0c1d4e2c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4
+c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4
+c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4
+c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4
+c5dae4c5dae4c5dae4d2dee6cdd5dec5dae4c5dae4d2dee6c5dae4d2dee6c5dae4
+c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6
+c1d4e2c1d4e2d2dee6bacdd9aec4d0d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6dcd6d6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4cdd5de
+bacdd9a0b09fa0b09f8ea0898ea0898ea08994afa192a88d819f597c9053778746
+8b90558ea0898ea0897f975381a08992a8b68b98828ea089a0b09f81a089afb9bc
+bacdd9d4dcd0c5dae4d2dee6aec4d07090816f8f526084713d5f254b68654b6933
+657c44576a624b69335773765474437090817a91a8819fb7a4bfb5bacdd9c5dae4
+d2dee6dfe1e6d2dee6d9e6ead2dee6c5dae4d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6c0cbb86b86736b85456b8545576b335e74294960324b6933475832
+56603a383c232e3c442b33224658644758323f4e32576b334b693349601f4b681e
+7c90538ea0597787466b8545627444657c44475832666033847144767b47767b47
+576a1f5f7b2a5e7429576a1f49601f657c44576a62496065c1c4c7cccdcca3b8bc
+8da0b692a8b6afc0ab637471a3b8bccdd5deafb09eb8c3c6d4dcd0c5dae4dcd6d6
+afb9bcaeb0bdb8c1af9ea9b4848887aeb0bddfe1e6cdd5de9ea9b4cdd5decdd5de
+cccdccbacdd9cccdccd4dcd0c1d4e2b8c3c6657c44597c755474436b86736b8673
+7e98829fb0bbafc0ab9fb0bbafb9bccdd5ded2dee6d2dee6dfe1e6cdd5dedfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6cdd5de
+bacdd9cdd5debacdd9b8c3c6a3b8bc9fb0bba3b8bca3b8bc9fb0bb7a91a8a5c4d7
+aec4d0b8c3c6a3b8bc92a88d7090817e98826b86734b6933618345667c74778772
+778772657c4481a0897d98b192a8b68da0b67d98b192a8b6a4bfb59fb0bb8b9882
+a3b8bcb8c3c6aba9a68ea0899ea08a6f8f526b86737c9053657c447e9882819f59
+c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c1d4e2c5dae4
+c1d4e2c5dae4c5dae4d2dee6c1d4e2c5dae4c5dae4c1d4e2c5dae4d2dee6c5dae4
+c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4
+d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4d2dee6c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6
+c5dae4d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d9e6eac5dae4d2dee6c5dae4d2dee6c5dae4d2dee6
+c5dae4c5dae4d2dee6c5dae4d2dee6d9e6eac5dae4c5dae4d2dee6c5dae4c5dae4
+d2dee6bacdd9bacdd9a3b8bc9fb0bbc1d4e2c5dae4d2dee6c5dae4c1d4e2c5dae4
+d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6
+cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6c5dae4c0cbb8
+afc0abafb9bc8ea0898c98538ea089b0b8a3a1b1709ea88e8b9882767b47778746
+8b90808b98828b9080657c4470908181a08992a8b68ea08994afa192a8b6b8c3c6
+c1d4e2c1d4e2d2dee6c1d4e2c5dae492a88d597c75547443577376597c756b8673
+92a8b67e9882667c74657c444b69336886a696b7aba3b8bca3b8bcc1d4e2cdd5de
+d2dee6d2dee6d2dee6d2dee6cdd5decdd5dec5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d4dcd0a4bfb592a88d6b86736b86736b8545767b475474437c9053
+576a623f4e323d4f563043214960654b68657090814758323f4e323a4423496032
+657c447c90537c9053657c44576b333f4e1e3f4e3274643eab91589a9178627444
+6274446b8545576a62576b335e7429697c2b383c233f4e327d90828488878b919f
+666c5e757c718da0b69da1abafb9bc8da0b6757c717787728b9080b0b8a39ea08a
+63747154605f7d9082667c748b9080aeb0bddcd6d6b0b8a39d9981d2dee6afb9bc
+aba9a68ea0898a99ab9fb0bbc1d4e2afb09e5f61563f4e32576b33576a62576b33
+7d90827d908270908192a8b6c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+aec4d0cccdccafb9bc9fb0bba5c4d7b0cbdcc1d4e2c1d4e2a0b09f92a8b6b8c3c6
+9ea9b4a3b8bca0b09f8ea08992a88d8ea08992a88d6084717e988292a88d92a88d
+9fb0bb8b988292a8b692a88da3b8bc8da0b67d98b194afb9aec4d07e98827d9082
+94afb9a4bfb58da0b692a88d8b98828c98537e9882a4bb7e778772778772657c44
+c5dae4c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4c1d4e2c1d4e2
+c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6
+d2dee6d2dee6c5dae4c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4
+c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4
+c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6cdd5ded2dee6
+d2dee6c1d4e2aec4d092a88d8da0b6c1d4e2c5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6cdd5ded2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6c1d4e2d9e6eac5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c1d4e2
+b8c3c6afc0ab9ea88e87886dafb9bcb8c3c69ea08a8ea0898ea089657c448c9853
+8ea05992a7597c9053667c7471975394afa194afa1b0cbdc8ea08994afa1b8c3c6
+bacdd9b8c3c6c1d4e2b8c3c6b2d2e07e98824b68653c58225474285e7429547443
+6b8673567f3a4b69334b69336b867381a089a4bfb5819fb7a0b09fbacdd9bacdd9
+c1d4e2c5dae4d2dee6d2dee6cdd5decccdccc5dae4d2dee6d4dcd0c1d4e2d2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d9e6eadfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6cdd5dec1d4e2c5dae4d2dee6
+d2dee6d9e6ead2dee6c0cbb8a3b7a47e988292a88d6b867381a08971975381a089
+81a08970908141678a70908192a8b681a0897e9882354c313a4423333522383c23
+576b3362744456603a3f4e32547428576b33667c74848887a48954ada17f8b9080
+7787727e98828b98827e9882697c2b627444373e43576a623d4f56394446373e43
+3944463f4e323944465658384658644e5043383c2330444d3a4423465864637471
+4e50433944467090817d9082b8c3c6cdd5deaeb0bd9d9981aba9a6d2dee6cccdcc
+8b98827787726084717e98829ea88e7d90825f61563f4e324b6933576b33475832
+5773767090818a99aba3b8bcd9e6ead2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ead9e6eadfe1e6cdd5de
+a3b8bcaec4d0aeb0bd92a8b6b0cbdcd2dee6cdd5de9fb0bb9ea9b47d9082a4bfb5
+8ea0897d98b1b8c3c69fb0bb7e988294afb97e98827f975396b7aba3b7a4b0cbdc
+b0cbdca4bfb59ea9b49da1ab94afb9aec4d08a99ab8ea0898b919f77877281a089
+8da0b6afc0aba3b7a47787727d90828ea0597f97538c98536b85453f4e324b6933
+c5dae4c5dae4c1d4e2c1d4e2c5dae4c5dae4c5dae4c1d4e2d2dee6c5dae4c5dae4
+c5dae4c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4
+c5dae4c1d4e2d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4
+c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d9e6ead2dee6
+c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6cdd5ded2dee6c5dae4c1d4e2
+d2dee6c5dae49fb0bb709081819fb7aec4d0c1d4e2cdd5decdd5ded2dee6d2dee6
+c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6c5dae4d9e6eacdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6cdd5dedfe1e6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+c1d4e2dfe1e6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5decdd5ded2dee6d2dee6cdd5de
+d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d9e6ead2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6cdd5de
+bacdd9afb9bc8ea0898b98828b98829ea9b4a0b09f8ea0598ea0598c9853757c71
+6b85457c9053778772778746576a626b8673a3b8bcbacdd9afc0aba3b7a49ea9b4
+afc0abb8c3c6a0b09f8ea089bacdd9afc0ab6b86734b693341671b547443597c75
+627444567f3a567f3a608471a4bfb592a88d81a08992a8b6afc0ab8da0b694afa1
+c1d4e2d2dee6cdd5ded2dee6cdd5dec0cbb8c1d4e2d4dcd0bacdd9b8c1afc1d4e2
+d4dcd0cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6c1d4e29ea88ec1c4c7d9e6ea
+d2dee6d2dee6d2dee6cdd5deafb9bc92a8b6a3b7a4a4bfb5a4bfb5a4bfb5a4bfb5
+b0cbdcb0cbdc94afa196b7abb2d2e09fb0bb757c71373e433f4e325f61565f6156
+75704d68752b4758323f4e1e576b33657c4492a8b6666c5e847144aea8868b9882
+8b9080709081778772a3b7a475889b7787724e5043626e8c757c71637471394446
+60759054605f2e3c443944463944463043213d4f56496065637471576a62637471
+9ea9b49da1aba0b09fafb9bc9ea88e7f97537787729d9981c1c2aedfe1e6d2dee6
+afb9bc7787724b68656b86736b86737d9082496032354c314b6933597c75667c74
+7e988296b7abaec4d0cdd5dedfe1e6d2dee6d2dee6dcd6d6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6d2dee6cdd5dedfe1e6
+dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d9e6eacdd5de
+b8c3c6c1d4e2d4dcd0cdd5debacdd9cccdcc9ea9b4a3b8bc9fb0bb7d908292a8b6
+8b9882a4bfb5d2dee6afc0aba4bfb5b8c3c6a0b09f709081afc0abc1d4e29fb0bb
+9fb0bbbacdd9a4bfb5b8c3c6afb9bc8da0b68da0b68ea0896374717787728ea089
+8b98828ea0898ea0898b98828b90807c90538c9853657c444960323f4e1e576b33
+b2d2e0c1d4e2c5dae4c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c5dae4c5dae4
+c1d4e2c5dae4c1d4e2c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4
+cdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d9e6eac5dae4d2dee6
+c5dae4c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+c5dae4c5dae496b7ab6b867392a8b6aec4d0c5dae4c1d4e2d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dcd6d6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d4dcd0
+cdd5de92a88d8b98828ea08977877294afa1b0b8a392a88d7c90537787467f9753
+8b90808b90806b8673618345597c757090818ea0898a99aba3b8bca3b7a4c0cbb8
+c1d4e2c1d4e2a3b8bc6b86738ea089aec4d07d98b1577376354c313a44233f4e1e
+4b69334b681e4b693381a089a4bfb57197b494afa16b8673597c7581a089afb9bc
+d2dee6d4dcd0d4dcd0d4dcd0c5dae4c0cbb8c0cbb8c1d4e2c0cbb8c0cbb8b8c3c6
+d4dcd0cdd5ded2dee6cdd5ded9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6cdd5de8ea089778772aba9a6
+bacdd9cdd5decccdccd4dcd0c1c2aeaba9a6afb9bcbacdd994afa1c5dae494afa1
+b0b8a3bacdd9a3b8bc819fb7cccdccafb9bc4e5043333522383c23475832666b3b
+75704d657c44576a1f496032576b335474286374715f6156977c4f9ea08a8b9882
+7d90828b98826b86736b867375889b8a99ab6b8673576a628da0b6848887637471
+819fb7aba9a64658644658644b6865667c746b867392a88da3b7a48b98828ea089
+a0b09fb0b8a38ea0896b8545657c446b854587886d8ea089dcd6d6cdd5dedcd6d6
+d2dee6cdd5de8ea089576a626b86737787725773764b69334b69336b86736b8673
+709081819fb7bacdd9d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8e0e6e8dcd6d6
+bacdd9cccdccb8c3c6bacdd9cccdccc1c4c7a3b8bca4bfb5afc0ab81a0899fb0bb
+8b9882b8c3c6bacdd9b0cbdc9ea9b494afa192a88d7e9882a0b09faec4d08da0b6
+a3b8bca3b8bcafb9bcc5dae4bacdd9afb9bc7d9082667c748ea089afc0ab9fb0bb
+9ea08a4758324b686595af7a8ea089778746819f59666b3b344d1e576b3347581f
+c1d4e2c1d4e2d2dee6c1d4e2c5dae4c5dae4c5dae4c1d4e2c5dae4c5dae4c5dae4
+c5dae4d2dee6c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4
+d2dee6c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6
+c5dae4c5dae4c5dae4c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d9e6ead9e6ea
+c5dae4d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6cdd5ded9e6ea
+d2dee6d2dee6d2dee6c5dae4d9e6eac5dae4d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6c5dae492a88d6374717a91a8a3b8bcc5dae4b8c3c6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+dcd6d6d2dee6dfe1e6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6c5dae4d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6d9e6ead2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6bacdd9c1c4c7
+afc0ab9ea9b4b0b8a392a7597d90829ea88ea0b09f8c98536f8f527787467d9082
+8b98829ea88e8ea089667c746b86737090817d90828b90809ea9b49fb0bbaec4d0
+b8c3c6c1d4e2a0b09f7e98824b6933577376657c444960652f3c222f3c223d573b
+5474284b69334b69337090817e9882577376627444547443576a6281a089c1d4e2
+d2dee6cdd5ded9e6eac5dae4c1d4e2c0cbb8c0cbb8c0cbb8a4bfb5afc0abb8c3c6
+d2dee6c1d4e2c0cbb8cccdccd2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d4dcd0d4dcd09ea88e7c90536b8545
+7d90827d90828ea0898ea0897d90827c90538b90806b86737787726f8f526f8f52
+5f615654605f666c5e4b6865576a62465864333642272c1f342d1f2a34384e5043
+75704d6274444c5026344d1e3f4e1e657c44778772857d67ab9158b8c1afc1c4c7
+afb9bcb8c3c6a0b09f7d90827a91a884888775889b626e8c576a623d4f563f4e32
+667c74848887576a6254605f547443657c447e988292a88d9ea08a8b9882767b47
+7787468b9055767b47767b47667c746b86739ea88ecccdccdfe1e6c1c4c7afb9bc
+d2dee6dfe1e6b8c3c6778772709081657c446b86734b6933597c7581a089627d99
+7090817e9882b0cbdcc1d4e2bacdd9d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ead9e6ead2dee6dfe1e6
+dfe1e6dfe1e6cdd5ded2dee6e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6
+cdd5decdd5deb8c3c69fb0bbafb9bc8a99aba0b09faec4d0b8c3c692a8b6afc0ab
+8ea08992a8b6a0b09f7e98828ea089a3b8bc778772627444657c4492a8b68da0b6
+bacdd9bacdd9cdd5ded2dee6bacdd9cdd5dea0b09f8b988275889bafb9bca4bfb5
+afb9bc667c7460847192a88d7c90538b9055a4bb7e666c5e5474437c9053767b47
+c1d4e2c5dae4cdd5dec5dae4c1d4e2c5dae4d2dee6c1d4e2c5dae4c1d4e2c5dae4
+c5dae4c5dae4c5dae4d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2d2dee6d2dee6
+d2dee6c1d4e2d2dee6d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6c5dae4
+d2dee6c5dae4d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4b8c3c6
+c1d4e2d2dee681a0897e98827d98b1a4bfb5a4bfb59fb0bbc5dae4c5dae4d2dee6
+d2dee6c5dae4d2dee6c5dae4c1d4e2d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6eacdd5ded2dee6d2dee6d2dee6dfe1e6d2dee6
+d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6dcd6d6dfe1e6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6c1c4c7b8c3c6
+b0b8a3a4bb7e9ea88e7e98828b90808b98828ea0897787726f8f527d90827d9082
+8b98829ea88e8da0b692a88d8b988281a0897e9882a3b8bc7e9882a3b8bc94afa1
+a0b09fbacdd99fb0bb8b98823c58223c58224b69333f4e323043213f4e32354c31
+3c5822576b334960324658643043213d573b3d5f256b867396b7abaec4d0d2dee6
+cdd5ded4dcd0cdd5dec0cbb8aec4d0c0cbb8a3b7a4afc0aba0b09fafc0abc1c4c7
+b8c3c6bacdd9aec4d0c1d4e2cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6eabacdd9c1c4c7d2dee6d2dee6cccdccb0b8a38b9882
+7d90827c90537787466b8545657c448c98538c9853666b3b4960323f4e32475832
+2f3c222a34383d4f563f4e323a44233d4f562e3c442a3438342d1f394446637471
+8ea0898b90804758322f3c223f4e324b6933567f3a8b9055c0b197c1c2aed2dee6
+cdd5decccdccbacdd9b8c3c6b8c3c692a8b67d90828ea0898da0b6576a62465864
+3944463043213d4f566374717787728ea0899ea88e757c716b8545576b334b6933
+6274446b85456b86738ea089a3b7a4bacdd9d4dcd0dfe1e6cdd5dec1c4c7afb9bc
+afb9bccccdccb8c1af8da0b692a88d8ea089657c44576b334b69337090817e9882
+8488876084718b9882aeb0bdcdd5ded2dee6cdd5ded2dee6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6dfe1e6
+d2dee6d2dee6cdd5decdd5ded2dee6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6cdd5de
+bacdd9b8c3c6c1c4c79ea88e92a8b67d908281a089a3b8bcb8c3c692a88dafc0ab
+a3b7a4b0cbdcb0cbdc92a88daec4d092a8b6667c74576b33576b3370908194afa1
+c1d4e2cdd5debacdd9c5dae4cccdccd2dee6bacdd99fb0bba4bfb5c1d4e2b8c3c6
+b0cbdcaec4d08ea089709081778746b0b8a3778746576b33657c448ea059778746
+c1d4e2c1d4e2c1d4e2c5dae4c1d4e2c5dae4c5dae4c1d4e2d2dee6c5dae4d2dee6
+c5dae4c5dae4c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6c5dae4
+d2dee6c5dae4c5dae4d2dee6d2dee6c1d4e2c5dae4d2dee6d2dee6c5dae4d2dee6
+c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4
+c5dae4d9e6ead2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6c5dae4d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d9e6ead2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4a3b8bc
+92a8b6c5dae494afa181a0897090818da0b6819fb7aec4d0d2dee6d2dee6d2dee6
+d2dee6d2dee6cdd5debacdd9cdd5ded2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+c5dae4d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6
+dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5de
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6c5dae4b8c3c6b8c1af
+8ea0898c98537787728ea0598b98828b98827c90537d908281a08992a88d9fb0bb
+9ea08aa0b09f8ea0897d908292a88d92a88da3b7a4c5dae4b8c3c6a3b7a4aec4d0
+92a88d8ea089a3b8bc7787724c5026344d1e3c58223d573b2f3c223f4e322f3c22
+3f4e1e4b6933475832304321304321344d59709081aec4d0bacdd9cdd5decdd5de
+d4dcd0b8c3c6afc0abb8c3c6bacdd9b8c1afa3b7a4a1b170a4bb7eb0b8a3b8c1af
+b0b8a3a0b09fc1d4e2bacdd9d2dee6d2dee6c5dae4dfe1e6c5dae4d2dee6d2dee6
+d2dee6d2dee6cccdcccdd5deafb9bc8a99abc1c4c7c1d4e2cccdccc1d4e2b8c1af
+afb9bc8ea0898b9882657c444b69338b90808b9055757c71354c3130444d496065
+354c31354c31848887394446394446709081667c746374712a343854605f576a62
+9ea9b4a0b09f6374713f4e1e3f4e323f4e1e4b6933757b2dada17fc1c2aecdd5de
+cdd5decdd5debacdd9aeb0bdcdd5deb8c3c68a99ab9fb0bb757c71667c74637471
+54605f354c3154605f6b8545667c747787468b9055778746656c26576b33627444
+657c44afc0ab92a88d9ea9b4cdd5decdd5deb8c1afcdd5dedcd6d6afb9bc9ea9b4
+7d90828b9080afb9bc8ea089657c44618345576b3330432149606594afa18ea089
+667c74496032709081c1c4c7cdd5deafb9bcb0cbdcd2dee6cdd5dedfe1e6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6
+cdd5dec1c4c7cccdccd2dee6c5dae4d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+cdd5deafb9bc9fb0bb8b988281a089a3b8bca3b8bcbacdd9b0b8a38ea089a3b7a4
+afc0abbacdd9bacdd99fb0bbb0b8a3afb9bc637471475832576b33608471a3b7a4
+c5dae4c0cbb8b8c3c6cdd5debacdd99fb0bbc1d4e29fb0bba3b8bcc5dae4bacdd9
+afb9bcbacdd9bacdd98b9882637471778746555824627444576b33778746767b47
+c1d4e2d2dee6cdd5dec5dae4d2dee6c1d4e2d2dee6c5dae4c5dae4c5dae4c5dae4
+d2dee6c1d4e2c5dae4c1d4e2d2dee6c5dae4d2dee6c5dae4d2dee6c1d4e2d2dee6
+d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4c5dae4c5dae4
+d2dee6c5dae4d2dee6d2dee6c5dae4c5dae4c5dae4d2dee6c1d4e2b0cbdcbacdd9
+cdd5dec5dae4d2dee6c5dae4d9e6eac5dae4d2dee6c5dae4d2dee6c5dae4d9e6ea
+c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+c5dae4d9e6eac5dae4c5dae4d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+92a88d8da0b692a88d7a91a86084716b867392a8b6bacdd9cdd5dec1d4e2d2dee6
+d2dee6d2dee6c1d4e2bacdd9d2dee6c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d2dee6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6cdd5dedfe1e6
+cdd5dedfe1e6d2dee6d2dee6d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6d2dee6d4dcd0c1d4e2cdd5dea0b09f
+92a75992a88d8ea0898ea0897c90537787727c905392a88d7d90827e98829ea08a
+9ea88e8b98828b988294afa1a3b7a48ea089aec4d0cdd5debacdd99ea08aaec4d0
+b8c3c67d90826b86737c9053657c444b6933576b333f4e323f4e1e333522333522
+4960325474434b69333d5f25576a62667c74a4bfb5a3b7a4c1d4e2cdd5decdd5de
+c1c4c7a3b7a4b8c1afc0cbb8c0cbb8afc0aba0b09fa4bb7e8ea059a3b7a4a3b7a4
+95af7aa3b7a4b0cbdcc0cbb8bacdd9d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6cccdccafb9bcbacdd98b98828b9882a1b1709ea88eafb09ea0b09f
+b8c1afafb09e9ea88e87886d7787468b908095885c8b9080576b33576a624b6865
+608471709081a3b8bc465864587ca096b7ab96b7ab92a8b6577376496065637471
+afb9bcafb9bc49603247581f3a4423383c23576b33697c2b9d9981c0b8a6d2dee6
+cdd5ded2dee6bacdd98da0b6bacdd9cdd5de9ea9b48a99ab7a91a89ea08a637471
+383c232e3c44496032576b333f4e1e55602476872d68752b576b336f8f527e9882
+9ea88ebacdd9b8c3c6a3b7a4b8c3c69da1abaeb0bddcd6d6dcd6d6cfc6b88ea089
+547443657c445773767787726b85454b69334960323043213f4e32547443627444
+3f4e324b68657e98829fb0bb7e98828b9882b0cbdccdd5dedfe1e6d2dee6dfe1e6
+dfe1e6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6
+bacdd9bacdd9cdd5dec1d4e2c5dae4afb9bcbacdd9d2dee6cdd5ded2dee6d2dee6
+cdd5deaec4d0c0cbb8a3b8bcafb9bcc0cbb8aec4d0aec4d0afb9bc7e988294afa1
+92a8b6bacdd9afb9bc81a0897e9882a3b8bc757c71496065576b3370908196b7ab
+92a8b6b8c3c6bacdd9bacdd9cccdccc1d4e2cdd5de75889b92a8b6c5dae4c1d4e2
+afb9bca3b8bca3b8bc7d90827787726274444e5043475832657c446b8545475832
+c1d4e2c1d4e2c5dae4c1d4e2c1d4e2c1d4e2c1d4e2c1d4e2d2dee6c5dae4c5dae4
+c5dae4d2dee6c5dae4d2dee6c5dae4c5dae4d2dee6c1d4e2d2dee6c5dae4c5dae4
+c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c1d4e2b8c3c6afb9bcb8c3c6
+c5dae4c5dae4d2dee6c5dae4d2dee6c5dae4d9e6eac5dae4d9e6eac5dae4d2dee6
+d9e6ead2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4c1d4e2
+94afa17090817090816b867360847160847194afb9c1d4e2bacdd9bacdd9d2dee6
+d2dee6d2dee6cdd5dec1d4e2d2dee6cdd5ded2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+dfe1e6dfe1e6d9e6ead2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d9e6ead2dee6
+dfe1e6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6cdd5decdd5decdd5ded2dee6cdd5dec1d4e2afc0ab
+b0b8a3a4bb7e8ea089a0b09f8ea0898b90557d90828ea0597c90537e98829ea88e
+9ea08a8b98828a99ab8a99ab94afa17e98827d90829fb0bbc0cbb89fb0bbb0b8a3
+a4bfb577877292a88d7e98828c98535e7429657c4468752b5474434960323f4e32
+3d573b3c5822496065597c757090816886a695af7a9ea9b4c0cbb8cccdccb8c1af
+b0b8a3c0cbb8afc0abc1c2aec0cbb8b0b8a38ea089afbf779ea88ea1b1709ea08a
+81a089b0b8a3afc0abb8c3c6bacdd9d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6cdd5decdd5deafb9bc9ea88e8b9882778772657c446b854576872d778746
+767b477c90538b98828b98828c98538b988286874a7787468b90808da0b66b8673
+597c75a4bfb581a089576a6275889bbacdd9c1d4e2c1d4e28da0b675889b6b8673
+aec4d0a0b09f3f4e1e627444344d1e354c316b8545767b47ada17fc0b197cdd5de
+c5dae4d2dee6c1d4e28b919faec4d0dfe1e69da1ab627d997d98b17e98827d9082
+5f61563a4423475832627444496032496032697c2b5f7b2a657c44a0b09fa0b09f
+b8c1afbacdd9b8c1af9ea88e7c90538b9882c0cbb8dfe1e6c1c4c7cccdccb8c3c6
+6374713f4e3241671b41671b576b33576b333d573b354c313f4e1e4960323d5f25
+3d573b3d5f256b8673597c757d90828b9882b0cbdcd2dee6dcd6d6dfe1e6d2dee6
+dfe1e6d2dee6cccdccbacdd9d2dee6cdd5ded2dee6cdd5ded2dee6cdd5decdd5de
+c1d4e2c1c4c7c1d4e2bacdd9b8c3c6afc0abb8c3c6bacdd9cccdccc1c4c7bacdd9
+b8c3c6afb9bcaec4d09fb0bbb0cbdcd2dee6d2dee6c5dae4c1d4e2a4bfb5aec4d0
+94afa194afa19fb0bb778772667c74547443637471667c74576a62778746618345
+709081aec4d0cdd5dec1c4c7bacdd9b8c3c6c1d4e29ea88ea4bfb5c1d4e2d2dee6
+cdd5dea3b8bcb0cbdc7d98b1709081657c44344d1e5560244758323f4e322f3c22
+c1d4e2c1d4e2c1d4e2cccdccbacdd9aec4d0bacdd9c5dae4c1d4e2c5dae4d2dee6
+c5dae4d2dee6c5dae4d2dee6cdd5ded2dee6d2dee6d2dee6c1d4e2c5dae4d2dee6
+c5dae4d2dee6d2dee6c5dae4d2dee6c1d4e2d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c1d4e2cdd5deafc0abb8c3c6b8c3c6
+d2dee6d2dee6d2dee6d2dee6d9e6eac5dae4c5dae4d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6ead2dee6d2dee6c5dae4d2dee6d9e6eac5dae4d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d9e6eacdd5dea3b8bc
+96b7ab709081709081597c757e9882819fb79fb0bbbacdd99fb0bbaec4d0d2dee6
+cdd5dec1c4c7bacdd9b8c3c6c1d4e2b8c3c6cdd5ded2dee6d2dee6cdd5ded2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6d9e6ea
+d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead9e6ead2dee6
+d9e6ead2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6cdd5debacdd9afb9bcc0cbb8cdd5dec1d4e2afb9bc
+b0b8a39ea88e8c98538ea0898c98538ea0899ea08a92a88d7f97538b98828ea089
+a0b09f9ea88e8b98827e98828da0b68ea0899da1ab8ea089afb9bcafc0aba3b7a4
+c1d4e2afc0aba0b09f81a0897f9753778746757b2d6274448c98538b9882576a62
+41671b344d1e3c58224b68656b86737090817c9053a0b09fcccdccb0b8a395af7a
+c1cd99b8c1afb8c1afa4bb7eb8c1afafc0ab8ea089a1b170a1b17092a88d8ea059
+a1b170afc0ab95af7aa3b7a4c0cbb8c1d4e2d2dee6d2dee6cdd5decdd5ded2dee6
+d2dee6d2dee6dcd6d6bacdd98ea0898b9882667c7456603a56603a576a1f6b8545
+68752b77874686874a86874a767b47867c4c767b4768752b87886d8b9882757c71
+667c7481a0898ea08961834561834595af7aafc0abb8c1af7e9882709081626e8c
+7e98827c9053576a1f3f4e1e333522333522547443767b47c4a979c0b8a6cdd5de
+cdd5decdd5deb8c3c67d98b19fb0bbd2dee69da1ab7a91a8a3b8bc8a99ab7d9082
+7787726374716b86737787466274446274446b85458b9882b0b8a3c0cbb8d4dcd0
+cccdcc8b98827787728b98827d9082b0b8a3c1c2aeaeb0bddcd6d6cdd5deb8c3c6
+778772667c746b86737090814960653a4423304321354c3141671b4b69337c9053
+7090815773766f8f52576a62608471a3b8bcb8c3c6cdd5ded2dee6dfe1e6dfe1e6
+d2dee6dfe1e6dfe1e6d2dee6d2dee6d2dee6cdd5debacdd9c1c4c7b8c1afc1d4e2
+c1d4e2d2dee6d2dee6cdd5dec1d4e29ea88eb0b8a3afb09ea3b8bcaec4d0c1c4c7
+bacdd9b0cbdcbacdd9a3b8bcbacdd9dfe1e6d4dcd0cdd5dec1d4e2cdd5deb8c3c6
+92a8b68a99ab7d90828ea0896b86734960324b6933657c44667c74637471657c44
+b0cbdcd2dee6d2dee6aeb0bdbacdd9aec4d0b8c3c681a08992a88db2d2e0d2dee6
+d2dee6c5dae4c5dae46b86736274446f8f52618345657c444960323d5f2547581f
+c1d4e2c1d4e2bacdd9b8c3c6bacdd9bacdd9c1d4e2c1d4e2d2dee6c5dae4c5dae4
+d2dee6c1d4e2d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6
+c5dae4d9e6eac5dae4c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6eac5dae4d2dee6d2dee6c5dae4
+d9e6eac5dae4c5dae4d9e6ead9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6eac5dae4d2dee6d2dee6cdd5ded2dee6d2dee6cdd5deb0cbdc
+92a8b6608471618345547443597c758da0b6c5dae4aec4d09ea9b4afb9bcd2dee6
+d2dee6bacdd9afb9bcafb9bca4bfb5c1d4e2d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d9e6ead2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6dfe1e6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6cdd5ded2dee6d2dee6d2dee6dcd6d6dfe1e6d2dee6
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6d2dee6d4dcd0afc0aba3b7a4afb9bcb8c1afb0b8a3
+a0b09f95af7a8ea059819f597e98828c98538ea059a1b17081a0897e988292a88d
+afc0ab94afa1afb9bc92a88d7d908292a88d8ea0898b988294afa19ea88e9da1ab
+c0cbb8c1d4e2a3b7a48c9853767b47576b3368752b5e74297c90538ea059778746
+5f7b2a4960323d573b60847192a88d4b69336b854595af7aa1b170b0b86ca4bb7e
+afc0abafbf77afc0aba4bb7eb0b8a3c1cd999ea88e9ea88e8ea059a4bb7e8ea059
+b0b8a38c985392a75992a88db8c3c6c1d4e2cdd5decdd5decccdcccdd5decdd5de
+d2dee6dfe1e6d2dee6d2dee6c1d4e2afc0ab92a88d57737677877277877268752b
+697c2b8b90558b90558b9055576b336274448b905586874a87886d9e98539ea08a
+86874a757b2d7787465e74296f8f526274446b85456b85456274443f4e322f3c22
+4960327b9034767b472b3322272c1f272c1f3f4e1e87886dd8c291c0b8a6c0b8a6
+afb9bc9da1ab8488877a91a875889b8a99ab8a99ab8a99ab9ea9b48a99ab75889b
+626e8c778772667c74576a62576b33627444576b33778772b0b8a3c1c2ae9ea88e
+8b9055576a1f4b69336f8f52a0b09f9ea88ea0b09f8b98829fb0bbcccdcccccdcc
+a3b8bc7090817a91a88b919f7787723a44234758326274445474433d5f25608471
+667c744b69333d573b5474436084717e9882aec4d0cdd5dedfe1e6c5dae4cdd5de
+d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6cdd5dec1d4e2c1c4c7cdd5dec1c4c7
+b8c3c6c1d4e2afc0abbacdd9cccdcc92a88d9ea88eb8c3c6b0b8a3b8c3c6d4dcd0
+d2dee6d2dee6c5dae4afc0abbacdd9cdd5debacdd9bacdd9afb9bcaec4d0afb9bc
+8da0b6757c717d908275889b667c744b6865496032608471657c444b69337d9082
+a4bfb5a3b8bcc1d4e2afb9bccdd5dec1d4e2a0b09f77877277877292a8b6b8c3c6
+d2dee6cdd5decdd5de92a88d597c757b90346f8f526b85456b85455f7b2a627444
+c5dae4c1d4e2bacdd9c1d4e2cdd5decdd5ded2dee6c5dae4d2dee6c5dae4c5dae4
+c5dae4cdd5dec5dae4c5dae4c5dae4c5dae4c5dae4cdd5ded2dee6c5dae4d2dee6
+d2dee6c5dae4c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+cdd5dec5dae4cdd5ded2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6
+c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6aec4d0a0b09f
+7e9882597c75597c75547443597c75597c75bacdd99fb0bba5c4d7c1d4e2d2dee6
+d2dee6d2dee6b0cbdcaec4d0b8c3c6c5dae4d2dee6c5dae4d2dee6d2dee6dfe1e6
+d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead9e6ea
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6cdd5dedfe1e6dfe1e6cdd5de
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ead2dee6dfe1e6
+d2dee6d2dee6d2dee6d2dee6dfe1e6d4dcd0cdd5dec0cbb8afc0aba3b7a48b9882
+9ea88e8b90807c90538ea0897f97536b86738ea0898ea0598b988294afa19ea9b4
+a0b09f9fb0bba0b09f9fb0bba3b7a4a0b09fafc0ab9fb0bba0b09f92a88d81a089
+bacdd9bacdd9a0b09f7d9082657c44778746757b2d657c447787468c98536f8f52
+496032344d1e3d5f256f8f5281a0896b85456b85457f9753a0b09fa1b170afbf77
+b0b8a3a1b170afc0aba1b170a4bb7eafbf7792a88d92a88d9ea88eafb09e8ea089
+8c985392a88da4bb7e92a88da0b09fb8c3c6c1c4c7cdd5ded2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6dfe1e6d2dee6cdd5dec1d4e2c0cbb8b0cbdca0b09f92a88d
+767b478b90558c98539a9178767b47627444857d67767b47767b4777874687886d
+86874a8b905575704d68752b5e74294b693349601f5e7429576b334960323f4e1e
+576b335f7b2a49601f44362324261c342d1f3336428b9055c0b197c0b19787886d
+8b919f9ea9b4757c71667c74637471576a627a91a8666c5e627d998b988254605f
+6374714b68653f4e326374717787467c90537787467d90828b90557c9053757b2d
+697c2b5e74294960324b69336183457787728b9882b0b8a38ea089aeb0bdafb9bc
+c0cbb8cccdcc94afa163747156603a576b33576b33567f3a47581f49601f657c44
+547443354c313d5f256f8f5281a089aec4d0cdd5ded2dee6a3b8bcafb9bcd2dee6
+d2dee6dfe1e6d2dee6cdd5ded2dee6cdd5decccdccd2dee6d2dee6cdd5dec1d4e2
+aec4d0b8c3c6afb9bcafc0abafc0aba0b09f94afa1a0b09fa4bfb5c1d4e2c0cbb8
+c1d4e2bacdd9c1d4e2aeb0bdd9e6eabacdd9a3b8bcc1d4e29fb0bbaec4d09fb0bb
+7d908292a8b67d90828da0b692a8b6778772547443576b3349601f657c447d9082
+94afa18a99abafc0abc1c4c7b0cbdc8a99ab8b9882547443597c7596b7aba3b8bc
+afb9bcc5dae4aec4d08ea0897787467c9053708f317f97537c90535474433f4e1e
+c5dae4c1d4e2cdd5decdd5dec5dae4c5dae4c5dae4c5dae4cdd5ded2dee6c5dae4
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6
+d2dee6cdd5ded2dee6d2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d2dee6d9e6ea
+c5dae4d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d9e6eac5dae4d9e6ead9e6ead2dee6d9e6ead2dee6d2dee6
+d9e6ead9e6eac5dae4d2dee6c5dae4d9e6ead2dee6d9e6ead2dee6c5dae4d2dee6
+d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6b8c3c6c1d4e2cdd5de9fb0bb9fb0bb
+94afa15474434b68654b69334b68656b867394afb99fb0bbb0cbdcc1d4e2dfe1e6
+d2dee6d2dee6cdd5dec1c4c7bacdd9cccdccd2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead9e6ead2dee6d9e6ea
+d9e6ead9e6ead9e6ead2dee6dfe1e6dfe1e6d9e6eadfe1e6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d2dee6d9e6ead2dee6d9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6
+dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6cdd5de
+d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6aec4d0afc0aba3b7a481a089
+92a88da1b1708b9080a0b09f81a0897e98828ea089afb09e92a88dbacdd9a3b7a4
+afc0aba4bfb5c1c4c7a0b09fa0b09f92a8b6b8c3c6a3b8bc94afa1afb9bc81a089
+a0b09fbacdd99ea88e8b98828b90557c9053697c2b4b6933627444767b475e7429
+3d5f25354c314b69335474435474286b8545627444719753afc0aba3b7a4a4bb7e
+9fa8578c985395af7a8ea0899fa857a0b09f8c985392a75992a7599ea88e7c9053
+8b9882a1b170a4bb7e92a7598ea089a3b7a4b8c3c6cdd5decdd5decccdccc5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d4dcd0d2dee6cdd5decdd5de
+8b98828b98828c98538b908095885c86874a857d67857d67757c714c502675704d
+767b4775704d8b9080767b47496032547443576b333f4e32576b334b681e49601f
+49601f576b333a4423342d1f24261c342d1f2b3322576b3395885cafb09e9a9178
+757c71666c5e626e8c627d998a99ab92a8b6aec4d094afb996b7aba3b8bc778772
+7d9082496032637471666c5e7787468c9853767b477f9753657c445e74295e7429
+656c26475832496032496032576a62a3b7a48b9882a4bfb5a3b8bc8b9882576a62
+8b9882c0cbb8afc0ab6b86735474286b85456b85454b69333d5f253c58223d5f25
+4b69334b6933597c7581a089b2d2e0cdd5decccdcc9da1ab92a8b6c1d4e2d2dee6
+d2dee6dfe1e6cccdcccdd5dec1c4c7b8c3c6c1c4c7c1d4e2cdd5debacdd9b8c3c6
+a3b7a4a0b09f92a88d8ea089a0b09fafc0ab96b7aba0b09fbacdd9c1d4e2b8c3c6
+afb9bca4bfb5b8c3c6c5dae4dfe1e6cdd5dec1d4e2afb9bcb8c3c6bacdd992a8b6
+81a089a4bfb5a4bfb5a4bfb5bacdd97d90826183456b8545657c446b867392a88d
+a0b09f7d90827d9082afb9bca3b8bc92a8b6667c744b69335e742970908194afa1
+a4bfb5c5dae4afb9bc7d9082627444576b336b85457c9053666b3b3f4e1e496032
+cdd5dec5dae4c5dae4c5dae4d2dee6c5dae4c5dae4d2dee6c5dae4cdd5ded2dee6
+c1d4e2d2dee6c5dae4c5dae4c5dae4d2dee6d2dee6d2dee6c5dae4c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d9e6eac5dae4d9e6ead9e6ead2dee6d2dee6c5dae4d9e6ead2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6ead2dee6d9e6ead9e6eac5dae4d9e6ead2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6b8c3c6aec4d0c5dae494afa18da0b6
+81a0896084713d573b354c31496032667c7470908194afb9a3b8bcafb9bcd2dee6
+d2dee6d2dee6c1d4e2cccdccc1d4e2c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead9e6ead9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d9e6eacdd5dedfe1e6dfe1e6d2dee6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6
+d2dee6d2dee6dfe1e6d2dee6dfe1e6d9e6ead2dee6d2dee6dfe1e6dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d9e6ead2dee6d2dee6
+d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6
+dfe1e6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d9e6eadfe1e6d2dee6dfe1e6
+d9e6eadfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6b8c1afa3b8bcb8c3c6b8c1af
+a0b09f9ea88e9ea88eb0b8a38ea089b0b8a39ea88ea0b09f8ea0899da1aba0b09f
+a0b09fa3b7a4afc0abb8c3c6a0b09fa3b7a4afc0abafb9bcafc0abafc0ab9da1ab
+7e9882b0b8a394afa1a0b09f7c9053778746576b3347581f4b681e5f7b2a4b6933
+547428496032496032304321657c4492a7598ea089a3b7a4c0cbb8b8c1af92a88d
+8ea059819f598ea05992a88d8ea089a1b1708b988292a7598ea0598c98538ea059
+81a089a1b17092a88d95af7a8ea059a0b09fcdd5decdd5decdd5decdd5ded2dee6
+dfe1e6d2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6dcd6d6d2dee6d4dcd0d4dcd0
+cdd5de8ea0898ea0898b98828ea0898b988286874a8c985384888756603a7d9082
+757c71576b3362744487886d778772a0b09f8ea0895474436274443f4e1e475832
+4960325e7429354c313d4f56333522272c1f2b33225658389f9154c0b8a6ada17f
+565838394446383c23333522394446666c5e77877275889b8a99ab7d9082757c71
+657c444b69337787728b9882627444778772767b478b9882778772657c44576b33
+576b33344d1e63747177877294afb9c0cbb89fb0bbb0b8a37d9082657c444b6865
+4b6933709081a0b09f618345657c44719753576b33344d1e4b6933496032475832
+567f3a6f8f52618345709081a4bfb5a3b7a4778772608471a3b8bccdd5dedfe1e6
+d2dee6d2dee6aec4d0cccdccaec4d0afb9bcb8c3c6b8c3c6aec4d0b8c3c692a88d
+8b98828b98828ea0598ea08992a88d8ea089a0b09fa3b8bca4bfb5bacdd9afc0ab
+a3b8bcaec4d0b0cbdccdd5ded2dee6d2dee6bacdd9a3b8bcc1d4e2cdd5dea0b09f
+81a089b0cbdcafb9bc7d90827e98827e9882819f598c98538c98537c90538b9080
+6274446274447090819ea88e7e98828ea08975704d56603a496032567f3a92a8b6
+8da0b692a8b68ea089637471576b334b6933576a1f767b4768752b576b335e7429
+c1d4e2cdd5ded2dee6c1d4e2d2dee6d2dee6c1d4e2d2dee6c5dae4cdd5dec1d4e2
+bacdd9cccdccd2dee6d2dee6c5dae4d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d9e6ea
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6bacdd992a8b6b2d2e07e9882709081
+9fb0bb6b86733d5f253d573b5474436b867381a0897d98b175889b8da0b6c5dae4
+c1d4e2d4dcd0c1d4e2afb9bcbacdd9b8c3c6cdd5ded2dee6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d9e6ea
+d2dee6dfe1e6d9e6ead9e6ead2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6d9e6ea
+d2dee6d2dee6d9e6ead2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6dfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d9e6ead9e6ead9e6ead2dee6
+dfe1e6e0e6e8dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6cdd5dedfe1e6d2dee6dfe1e6
+d2dee6d2dee6dcd6d6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6
+d9e6ead2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6
+d9e6ead2dee6cccdcccccdccd2dee6d2dee6d2dee6b8c3c6aec4d0b0b8a3b8c3c6
+afc0aba0b09f8ea05992a88d8c985395af7a8ea0898ea05992a88d9ea88eafb09e
+9ea88e9ea88eafb9bcb8c3c6b8c3c6b8c3c6bacdd9cccdccb8c3c6a3b8bc8da0b6
+70908177877295af7a8ea0897c90535e74294b69334b6933697c2b5f7b2a5e7429
+41671b576b334758322f3c224b69336f8f529fb0bbb8c3c6afc0aba0b09fa4bb7e
+a0b09f95af7a8ea0599ea88e95af7a92a7597787468c9853a1b1708ea0899fa056
+92a88d92a88d95af7a7f97537787728ea089bacdd9cccdccd2dee6cdd5ded2dee6
+d2dee6d2dee6dfe1e6dfe1e6d4dcd0d2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6
+dfe1e6bacdd9cdd5deb8c1afaba9a69ea88e9a91788b9882778772757c71c0cbb8
+8ea0896374718b9882767b47757c71b8c3c6b0b8a3757c71657c443d5f253c5822
+354c31576b33475832666c5e4e5043262e353335224c5026857d67aea886ada17f
+5f61565f6156394446394446333522262e35262e35342d1f3336423a4423576b33
+576b334960327a91a8a0b09fb0b8a3a0b09f778772657c447e98826b8673667c74
+496065576a62a3b7a4c1d4e2cdd5dedfe1e6cdd5deb8c1af7d90826374713d5f25
+3f4e323d5f25547443657c445474434b69333c58223c58224973233c58223a4423
+3d5f2557737692a88d6b85456f8f526b86736b8545a3b8bcd2dee6d2dee6dfe1e6
+dfe1e6d2dee6aec4d0c1c4c7bacdd9c1c4c7bacdd9b8c3c6afb9bcafc0aba0b09f
+8ea0898ea05992a7598ea0598ea0596b86739ea08aa3b7a4a4bfb5b8c3c6b8c1af
+9ea88ea4bfb5bacdd9b8c1afaec4d0cdd5deafb9bcaec4d08ea08994afa18ea089
+7e9882a4bfb5afc0ab8b98827e98827c90536b85456b852c76872d778746657c44
+54742861834594afa181a08981a0896f8f52697c2b576b3354744381a089709081
+6b8673667c746374716b8545666b3b618345576b33767b4768752b857d67576b33
+c1d4e2c5dae4d2dee6c5dae4c5dae4cdd5ded2dee6c5dae4d2dee6cdd5decdd5de
+bacdd9c1d4e2c1d4e2d2dee6d2dee6c5dae4d2dee6cdd5dec5dae4d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6d2dee6d2dee6d2dee6
+d2dee6c5dae4d9e6eac5dae4d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+c5dae4d9e6ead2dee6c5dae4d9e6ead2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d9e6ead9e6ead9e6ead9e6ead2dee6d9e6ead2dee6d2dee6d9e6ead2dee6
+d9e6ead2dee6d9e6ead2dee6d9e6ead9e6ead2dee6d2dee6c5dae4d9e6ead9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c0cbb8afb9bcb2d2e096b7ab709081
+81a0897090815474433c58226274445474437e988281a089819fb7a4bfb5d2dee6
+bacdd9a3b8bcafb9bc8da0b6a3b8bcc5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead9e6ead9e6ea
+d9e6ead2dee6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d9e6eadfe1e6d2dee6d9e6ea
+d2dee6d9e6ead2dee6dfe1e6d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d9e6ea
+dfe1e6d2dee6d9e6eadfe1e6dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6d9e6ead9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6d2dee6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d9e6eadfe1e6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6d9e6ea
+d2dee6d9e6eadfe1e6d2dee6d9e6ead2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6
+dfe1e6d2dee6cdd5debacdd9d2dee6d9e6eacdd5dec0cbb8a3b7a4bacdd9b0b8a3
+92a88d8b988286874a8b90557c90537787727c90537c90538c98538b98828ea089
+8ea0598ea089a0b09fa0b09fcccdccd4dcd0bacdd9aec4d0afc0abafb9bcc0cbb8
+95af7a8ea089a0b09f7c905362744468752b68752b576a1f657c4449601f354c31
+304321354c312f3c223d573b5474436f8f52aec4d0afc0aba0b09f8ea05992a88d
+8ea0899fa85792a759a4bb7e95af7a92a7599ea88e92a7598ea0598c98538ea089
+92a88d8b98826b8545667c74597c7592a88d94afa1b0b8a3b8c3c6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6d4dcd0dfe1e6cdd5ded4dcd0d2dee6
+dcd6d6d2dee6dfe1e6d4dcd0cccdccb0b8a3aea8869ea08a8b90809ea9b4c1d4e2
+cdd5deb8c3c6a0b09f857d67666c5e8b98829ea08a7d9082547443666c5e627444
+3f4e32576b33637471757c71394446342d1f2f3c223f4e328b9055aea8869a9178
+767b4787886d5f6156373e4333352233352224261c272c1f2b33223a4423576b33
+6183458ea089cdd5debacdd9cdd5deafb9bc8b9882667c747787729ea9b494afa1
+94afa1afb9bccccdccd2dee6dfe1e6dfe1e6dfe1e6cdd5de8da0b692a88d576a62
+496032576b33576b335474286274444b693347581f657c444b69332f3c222a3438
+3d5f254b6933657c444b69334b681e597c75a4bfb5d2dee6d2dee6d9e6eadfe1e6
+d2dee6d2dee6cdd5ded2dee6cdd5ded2dee6dfe1e6bacdd9aec4d0aec4d0afb9bc
+b8c3c68b98827c905381a08992a88d81a08994afa1a0b09fb0b8a3afc0abafc0ab
+a0b09fa0b09f9ea88e8a99ab8ea0898a99ab94afb981a0898da0b692a88d7e9882
+8ea08994afa19fb0bb94afa1a4bfb581a0896b8545576b33767b47767b47778746
+7f9753709081a4bfb5aec4d0778772576a625e74294b69335474287d9082627444
+657c44637471576b336f8f526274445e7429657c44767b47666b3b576b336b8545
+cdd5dec5dae4d2dee6c5dae4c5dae4cdd5ded2dee6d2dee6c5dae4c5dae4d2dee6
+d9e6eacdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6c5dae4d2dee6c5dae4d2dee6c5dae4d9e6eac5dae4d2dee6d2dee6
+d2dee6c5dae4d2dee6d2dee6c5dae4d9e6eac5dae4d2dee6d2dee6c5dae4d9e6ea
+d2dee6d9e6ead9e6eac5dae4d9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6d2dee6d9e6ea
+d9e6ead2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6b8c3c6a3b8bca4bfb5a4bfb592a8b6
+6f8f5281a089608471547443657c445474437090816886a6b0cbdcc1d4e2b8c3c6
+bacdd9aec4d07d90827e9882aec4d0c1d4e2d2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d9e6eadfe1e6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6
+d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6dfe1e6d9e6ead2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6
+d9e6ead2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dcd6d6dfe1e6
+d2dee6d2dee6d2dee6cdd5dedfe1e6dfe1e6dfe1e6d2dee6dcd6d6d9e6ead2dee6
+d2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6d9e6eadfe1e6d9e6ea
+d2dee6dfe1e6cccdccbacdd9c1c4c7d4dcd0d4dcd0b8c1afb0b8a3a3b7a495af7a
+8b98828b905577877277874687886d92a88d7e98826b85456f8f527d90829ea88e
+9ea88e8b98828ea089a3b8bcb8c3c6c1c4c7c1c4c7afc0abb8c3c6a3b8bcc1d4e2
+afc0abb0b8a39ea88e8b9055666b3b5474434758324960326b8545576b33304321
+3c58222f3c22304321547443657c447e9882afc0ab92a88d92a7598ea05992a759
+7f97538ea05992a759a1b1707787466f8f5292a7598ea0597c90538c98537c9053
+8ea0898ea05992a88d7e98826b8673aec4d0a0b09fafc0abafc0abcdd5ded2dee6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6cdd5deafb9bcafc0ab
+d4dcd0d2dee6dfe1e6e0e6e8dfe1e6b8c1afafb09e9d9981757c71aeb0bdcdd5de
+dcd6d6d2dee6bacdd99ea08a667c74a0b09fafb9bc9ea88e7787726274445f6156
+767b47666b3b354c31465864373e43333522333642383c235f61569d99819f9154
+667c749da1ab9ea9b44e5043383c23333522342d1f2b33223f4e324b6933627444
+778772aec4d0d4dcd0cdd5decdd5dedfe1e6afb9bc757c717e9882b8c3c6d2dee6
+d2dee6d2dee6e0e6e8dfe1e6cdd5decdd5dedfe1e6d2dee6d4dcd09fb0bb637471
+4b6865354c31344d1e344d1e344d1e344d1e47583247581f2f3c223a4423333522
+354c314b69333d5f25547443576a6292a88da4bfb5c1d4e2d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6d2dee6dcd6d6c1d4e2cccdccbacdd9bacdd9a3b8bcbacdd9
+bacdd9afb9bca0b09fb0b8a39ea88e8ea089b0b8a38ea08992a88d8ea0598ea059
+8b988281a0898b98828ea089a4bfb592a88da0b09fa0b09fb0b8a38b98827c9053
+6b86737787727d98b194afa18ea0897e9882767b47496032576b33556024555824
+778746778772a0b09faeb0bda0b09f757c71576b33576b334b6933576b33767b47
+667c747787466274446b8545767b475e7429657c44778746556024496032576b33
+c5dae4c1d4e2d2dee6cdd5ded2dee6d2dee6cdd5ded2dee6c1d4e2d2dee6d2dee6
+c1d4e2d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead9e6ea
+d2dee6c5dae4b2d2e0d9e6ead2dee6d2dee6c5dae4d9e6ead9e6eac5dae4d2dee6
+c5dae4d2dee6d2dee6d9e6eac5dae4d9e6ead2dee6d2dee6d2dee6d2dee6d9e6ea
+d9e6ead2dee6d2dee6d2dee6d9e6ead9e6ead2dee6d2dee6d9e6ead9e6ead2dee6
+d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead2dee6d9e6ead2dee6c5dae4
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6c1d4e29fb0bb92a8b67090816b8673
+567f3a6b86734b6933567f3a5474434b6933577376819fb79ea9b4aec4d092a88d
+c1d4e2a5c4d770908181a089a5c4d7cdd5dedfe1e6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6e0e6e8d2dee6d9e6ead9e6ea
+d2dee6dfe1e6d2dee6d9e6ead2dee6e0e6e8d2dee6dfe1e6d9e6eadfe1e6d2dee6
+d9e6ead9e6eae0e6e8d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d9e6ea
+dfe1e6d9e6eadfe1e6e0e6e8dfe1e6e0e6e8d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d9e6eadfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6cdd5deb8c1afafb9bcbacdd9cdd5deafc0abb0b8a3b0b8a392a88d
+7f97539ea88e9ea88e8ea0598b98828ea0897c90537787468ea059778772a0b09f
+cccdcca0b09f94afa194afa1b8c3c6afc0abc1d4e2b8c3c6afc0abcdd5decdd5de
+afb9bcb8c3c69fb0bb8ea0898b98827787465474433f4e1e576b3347581f475832
+4960324b69335474436b854592a88dc0cbb8b0b8a3819f598ea089a0b09f92a759
+7c90536f8f528c98538c98537c90538c98538c98538c9853657c447f9753778746
+6274446b854592a88d8ea0898ea089a0b09fafb9bcc0cbb8c1d4e2d2dee6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6dfe1e6cdd5dec1c4c7dfe1e6d2dee6afc0ab8b9080
+8ea089b0b8a3c1d4e2d4dcd0dcd6d6c1c4c7cccdccb8c3c69da1abc1c2aeb8c1af
+dcd6d6d4dcd0cdd5decccdccaec4d0cdd5debacdd9c0cbb8b8c3c66374713f4e32
+778772757c71576b335f61564e50434e50435f61565f6156574f2686874aa1b170
+8b9055afb9bcc0b8a663747156603a394446576a623d573b7d90826b854547581f
+637471c0cbb8bacdd9aeb0bdafb9bccdd5de9ea9b492a8b6757c7192a8b6dcd6d6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6c1c4c7b8c3c6cdd5ded4dcd0b8c3c692a88d
+a3b8bc576a624658644b6865657c445474284b69334758322b33222f3c222a3438
+354c314973237090817090817090816f8faea3b8bcc1d4e2c1c4c7cdd5ded2dee6
+d2dee6dfe1e6d2dee6dfe1e6cdd5deb8c1af9fb0bbb8c1afd2dee6bacdd9cdd5de
+cdd5deb8c3c67e98828ea0598ea0898ea0597e988292a75992a88d8ea0896f8f52
+7c9053a4bfb581a0898ea08992a88d9ea88e8ea0898ea089afc0ab8b98826b8545
+6b854561834594afa1a4bfb57e9882627444576b33576b33576b33657c44576b33
+757c7192a8b68a99ab81a089778772666b3b657c4462744456603a62744468752b
+657c44576a625e74297787466274445e74295f7b2a656c26556024576b33576b33
+d2dee6c5dae4d2dee6c1d4e2c5dae4c5dae4cdd5ded2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6
+d2dee6d2dee6b0cbdcc5dae4d2dee6d2dee6d2dee6c5dae4d9e6eac5dae4d9e6ea
+d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6
+d9e6ead9e6ead9e6ead2dee6d2dee6d9e6ead9e6eac5dae4d2dee6d9e6eac5dae4
+d2dee6d9e6ead2dee6c5dae4d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6bacdd99fb0bb96b7ab608471597c75
+6b86735474284b69334b69333d573b3d573b49603281a089a3b8bc94afb9a3b8bc
+c1d4e2afc0ab96b7ab94afb9c1d4e2cdd5decdd5decccdccd2dee6d2dee6d2dee6
+d9e6ead2dee6d2dee6d2dee6d2dee6d9e6eadfe1e6dfe1e6d2dee6d2dee6d2dee6
+d9e6ead9e6ead2dee6d9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+d2dee6d9e6eadfe1e6d2dee6dfe1e6dfe1e6d9e6ead2dee6d9e6ead9e6ead2dee6
+d2dee6dfe1e6d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6
+d9e6ead2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6d2dee6d2dee6dcd6d6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6dfe1e6d9e6eadfe1e6d2dee6dfe1e6
+d4dcd0c5dae4cdd5deb0b8a3b8c3c6c0cbb8b8c3c6b0b8a3b0b8a3a0b09f8ea059
+7787467e98828b90808b90558b98827d9082657c446183457c90538b9882afb09e
+cccdccc1c2ae8b98828a99ab9fb0bbb8c3c6c1c4c7b8c3c6d2dee6d2dee6c1c4c7
+b8c3c6bacdd9b0b8a38b9882848887767b47576b333a44233f4e32344d1e475832
+47581f7787466f8f526f8f5292a88dafbf77a1b1708c9853a1b170a4bb7e9fa857
+8c985392a7598c98538c985392a88d7f97536b85457c9053767b477c90538ea059
+767b476b85456f8f528b98827787468b9882a0b09fa3b7a4c1d4e2d4dcd0d2dee6
+dfe1e6d2dee6d2dee6dcd6d6dfe1e6d2dee6bacdd9dcd6d6d2dee6b8c3c67d9082
+7090816b86738488877e98828b919f8a99ababa9a6b8c3c6aba9a6aeb0bdb8c3c6
+c0b8a6c1c4c7c1c4c7afb9bcaeb0bd8488878b919f637471757c71576b33637471
+92a88d8b98826b8673576a623d4f565f61564e50433944464e5043766e2d8c9853
+7c90538ea089afb09e7d90824960326374715f6156667c74a0b09f657c445e7429
+5474439ea9b4c1c4c79d9981757c719fb0bbc1c4c79fb0bb9fb0bbcdd5ded4dcd0
+dfe1e6dfe1e6dfe1e6dfe1e6d2dee6cdd5dea0b09fa0b09fb8c3c6bacdd9b8c3c6
+a5c4d792a88d576a627197535f7b2a354c313f4e32354c313c5822496032344d1e
+4b69335773766084714b68654b6933709081a4bfb58da0b6b8c3c6d2dee6d2dee6
+d2dee6cdd5dedfe1e6d2dee6bacdd9c1c4c7aec4d0a0b09fb8c3c6c1d4e2bacdd9
+c0cbb8afc0ab7d90827e98828c98538c98537d90828c985392a88d8c98537e9882
+a3b7a4a0b09f8ea08992a88d8c98537c90537e98828ea05992a88d8c9853778746
+627444819f5992a88da4bfb592a88d666c5e3f4e1e4960326274446b854556603a
+6374718b98827787727d9082667c74576b33697c2b576b33576b33627444627444
+7c9053576b336b8545576b33576b334b69335474435e7429576b33657c44576b33
+c1d4e2d2dee6c5dae4d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6
+c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6
+d2dee6a3b8bc92a8b6a5c4d7c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ea
+d2dee6c5dae4d9e6eac5dae4d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d9e6ea
+d9e6ead9e6ead9e6ead9e6ead9e6ead2dee6d9e6ead2dee6d9e6ead2dee6d2dee6
+d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6d2dee6a5c4d792a8b66b8673547443
+567f3a597c754973235474433d573b3d5f254b69336b8673819fb7a3b8bc92a8b6
+b0cbdc8b9882709081a4bfb5a3b8bc8da0b69fb0bbc1d4e2d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ea
+d2dee6d2dee6dfe1e6d2dee6d9e6ead9e6ead9e6eadfe1e6d9e6ead2dee6dfe1e6
+dfe1e6d9e6ead2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d9e6ea
+d2dee6dfe1e6d2dee6d9e6ead9e6ead2dee6d9e6eadfe1e6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6dfe1e6d2dee6
+d9e6ead9e6ead9e6ead2dee6d9e6ead2dee6d9e6ead2dee6dfe1e6d2dee6d4dcd0
+afc0abb8c3c6afc0aba4bfb5b0b8a3a0b09fa3b7a4b0b8a3afb09ea0b09f8b9882
+7c90537d90827c90536b85458b9055666c5e7787727e98827d908281a089b0b8a3
+aeb0bdcfc6b88a99ab94afa1b2d2e0b8c3c6afb9bccdd5decdd5ded2dee6a3b7a4
+8ea089a0b09f8ea08992a88d778746627444576b335474435e74294960323d5f25
+5474287c9053778746778746a1b170a1b1709fa85792a759afbf77a1b1707b9034
+7787467f97537d97367c9053657c44576b336183455e7429657c447787467c9053
+6b85456b8545576b336b85457e988281a0897e9882a0b09fbacdd9cdd5ded2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6c1c4c7cdd5ded4dcd0d2dee6b8c3c6
+a3b8bc8a99ab7787723d4f563a44233944463d4f56465864666c5e6374718b919f
+9d99819a91789d9981757c715f6156666c5e757c717787727787467787468b9882
+c0b197666c5e3944464e5043373e432a3438272c1f342d1f565838767b477c9053
+7787467c90538b90557787466b85457d9082757c717090817d90824b6933576a1f
+49603281a089bacdd992a8b69fb0bbafb9bccdd5ded2dee6dcd6d6dfe1e6dfe1e6
+dfe1e6d9e6eadfe1e6e0e6e8dfe1e6cccdcca0b09f7e98826f8f528ea05992a88d
+81a089778772597c75597c754b69334b69333c582249601f567f3a618345547443
+547443344d1e4b69334b693349732370908192a88d9fb0bbbacdd9b8c3c6a3b8bc
+bacdd9dfe1e6d2dee6d2dee6d2dee6cdd5deb0cbdcafc0abb8c3c6b8c3c6c0cbb8
+bacdd9b8c3c69ea88ea0b09f9ea08ab0b86ca1b1708b98828ea0597f9753778746
+92a88d92a88d7e98828ea0898ea0897c905392a8b6a3b8bca3b7a481a0897c9053
+7c90537c9053618345657c44666b3b576b33354c313c5822657c445e7429597c75
+4b69337787466f8f52afc0ab778772778746627444576b33657c44576b33657c44
+657c445474434758323f4e1e47581f3f4e32475832657c4468752b6b8545666b3b
+c5dae4d2dee6d2dee6cdd5dec5dae4d2dee6d2dee6c5dae4d2dee6c5dae4d2dee6
+cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d9e6eac5dae4
+d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee692a8b6709081a4bfb5c5dae4d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ea
+d2dee6d2dee6d9e6ead2dee6d9e6ead9e6ead9e6eac5dae4d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6eadfe1e6d2dee6
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6cdd5deaec4d081a0896084714b6865
+567f3a6f8f524b69333f4e3230444d354c31597c756b854570908181a0898da0b6
+81a0896183456b867381a08970908181a089aec4d0d2dee6d9e6ead2dee6dfe1e6
+d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d9e6ea
+dfe1e6d9e6ead2dee6d9e6ead2dee6dfe1e6dfe1e6d2dee6dfe1e6d9e6ead2dee6
+dfe1e6dfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d9e6ea
+d9e6eadfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6dfe1e6d9e6ea
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6
+d9e6eadfe1e6d9e6ead2dee6d9e6ead2dee6dfe1e6d9e6eadfe1e6d2dee6d2dee6
+c0cbb8a3b7a49ea08a94afa1c0cbb89ea88ea0b09fafc0ab8ea0598c98538ea059
+7787467c90537787466b85458b90806b8545757c7181a0898ea0897090819da1ab
+b8c1afc0b8a69da1abb8c3c6d2dee6afc0aba3b8bcd2dee6b8c3c6bacdd9b8c1af
+a0b09f8ea0897c90537090816b85457f9753778746657c4449603249601f49601f
+6b85456b8545819f59767b47819f5992a759a1b170a1b170a1b1707f97537f9753
+92a7596f8f527c90535e7429576b33767b476274443d5f255f7b2a5474436b8545
+767b47547443657c447d908281a0897e98827e9882a4bfb5c1d4e2dfe1e6d2dee6
+d2dee6d2dee6dcd6d6dfe1e6d2dee6d4dcd0afb9bc9ea08aafb09ebacdd9cdd5de
+c0cbb8bacdd9a3b7a43f4e32304321576a623d4f562f3c22757c717787727c9053
+9ea88e9ea08a87886d757c716374717e98828b98827c90536f8f528b90559fb0bb
+aeb0bd4e5043443623262e35272c1f342d1f262e35342d1f383c23767b47778746
+86874a8c98537c90537787467f97537090818ea0897f9753576b333a44232f3c22
+3d573b7d9082c1c4c7cdd5decdd5decccdcccccdcccdd5dedfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6cdd5de8b9882618345729e34819f597c9053
+5474287c9053819f597f97534758323f4e1e3c58224b681e54742841671b4b6933
+70908154744341671b4b69333d573b567f3a96b7ab94afa17e98827d9082b8c3c6
+c5dae4d2dee6dfe1e6d4dcd0c1d4e2c1c4c7a3b7a4a4bfb5a4bfb5b0b8a3b8c3c6
+c0cbb8aec4d0a1b170a0b09f8ea059a1b1709ea88e8ea0598ea0897c9053597c75
+6183457e98827c90537e98827f97537d908281a089b0cbdca0b09f8ea0896b8545
+819f597c90537d97365f7b2a62744456603a2f3c223f4e1e6274444b6933547443
+6b8545757c7192a88dcccdcc8ea089627444627444666b3b6274444b6933657c44
+657c445e742949601f4b69333f4e1e344d1e49601f576b33697c2b77874668752b
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6
+d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d9e6ead2dee6
+d2dee6aec4d0a3b8bcc1d4e2c5dae4d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ea
+d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6
+d2dee6d9e6ead9e6ead2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d9e6ead9e6ea
+d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6
+d9e6ead2dee6d2dee6d9e6eadfe1e6d2dee6d2dee6a5c4d794afa1709081608471
+657c446b85455474434960323043213043213d573b4b69336084717197537e9882
+6b8545576b33597c75497323597c7592a88dc5dae4c5dae4b8c3c6c5dae4d9e6ea
+d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d9e6ea
+d9e6ead2dee6d2dee6d9e6eadfe1e6d2dee6d2dee6dfe1e6d9e6eadfe1e6dfe1e6
+dfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6eadfe1e6e0e6e8dfe1e6dfe1e6dfe1e6
+dfe1e6d2dee6d2dee6e0e6e8dfe1e6d2dee6d9e6ead2dee6dfe1e6dfe1e6d2dee6
+d9e6ead2dee6dfe1e6dfe1e6e0e6e8d2dee6e0e6e8dfe1e6d2dee6dfe1e6d2dee6
+d9e6eadfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6d2dee6
+d4dcd0a0b09f8ea089a0b09fa0b09fa1b170b0b8a39ea9b48ea0898ea0598ea089
+7787467787466274447c90537d90827787466b86736b8673757c716b86738ea089
+afb09eafb9bca3b8bcbacdd9c5dae4afb9bcafb9bcb8c3c692a88dafb9bcb8c3c6
+a3b8bca0b09f7e9882778746657c446274447c9053576b33496032576b335e7429
+697c2b657c447787467f97538ea0597c90538ea0598ea08992a88d6b85455f7b2a
+92a75992a759778746556024576b338c98537c90538ea0597f97538b9882627444
+6b85457c90538c98536b85458ea089a4bfb5b0cbdcafb9bccdd5ded2dee6dcd6d6
+dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6b8c3c68ea0897c90539d99818ea089
+8ea0898ea0898b9882547443618345778772576a62496032576b33576b33778746
+9fa0569ea88eada17f8b90559d9981778772778772778772778746667c74778772
+757c713944462b3322333642342d1f262e35342d1f2b33223335224c5026778746
+7f97537c90537c90536b852c657c447787467c9053708f31576b333a44232a3438
+3335222f3c22666c5e8b919f9ea08aaeb0bdcccdccdcd6d6dcd6d6dfe1e6dfe1e6
+dfe1e6dfe1e6d9e6eadfe1e6dfe1e6cdd5de81a0897090817c90537197536b8545
+5e74295474437197536183454b6933344d1e3d5f256b85456b8545497323547428
+5474434b693347581f3f4e1e5773764b69335474435474437090817e9882c1d4e2
+d9e6ead2dee6dfe1e6d2dee6c0cbb8c5dae4afc0aba3b7a4c0cbb8c0cbb8afc0ab
+7d90828c9853a0b09f8ea0598b9882a0b09fb0b8a39ea88e9ea88e7787727e9882
+81a08981a0898ea0598ea0897c905381a08992a88d92a8b692a88dafc0ab8b9882
+576b334b69336b854560832a576b33496032304321344d1e576a1f68752b4b6933
+576b33697c2b8b98829ea08a8b9882666b3b576b334960326b85455e7429778746
+7c90537c90534b693347581f3c58223c58224960325e74295e7429767b47666033
+c5dae4cdd5ded2dee6c5dae4cdd5ded2dee6d2dee6c5dae4d2dee6d2dee6c5dae4
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6eac5dae4
+d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+d2dee6b0cbdc94afa1aec4d0c1d4e2c5dae4d2dee6d9e6ead9e6eac5dae4d2dee6
+d9e6ead9e6ead2dee6d2dee6c1d4e2c1d4e2d2dee6d2dee6d2dee6d9e6ead9e6ea
+d9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead2dee6d9e6ead9e6ead2dee6d2dee6
+d9e6ead2dee6d2dee6d9e6ead9e6ead9e6ead2dee6dfe1e6d9e6ead2dee6d9e6ea
+d2dee6c1d4e2b8c3c6d2dee6d2dee6d2dee6cdd5dea5c4d781a089608471608471
+567f3a657c44496032354c31304321354c313c58224b6933608471618345547443
+5474436183457e98826f8f5254744370908181a0897d90828a99abd4dcd0d9e6ea
+d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6
+dfe1e6d2dee6d2dee6d9e6ead9e6eadfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6d9e6eadfe1e6d9e6eadfe1e6d2dee6e0e6e8d2dee6dfe1e6d2dee6dfe1e6
+d9e6ead9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6d9e6ead2dee6dfe1e6dfe1e6
+d9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d2dee6
+d2dee6d2dee6d9e6ead9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6d9e6ead2dee6
+dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d9e6eacdd5de
+b8c3c692a88d7e988292a88da3b7a4b8c1afb0b8a3a0b09fc0cbb87d90828ea089
+7c90538b90806b86738b98828b9080767b47667c74757c71778772667c748b9882
+afb09ea3b7a4bacdd9bacdd9cccdccbacdd992a8b6a3b7a47e988294afa1b8c3c6
+a0b09fafb9bc92a88d6b86735f7b2a627444666c5e4960325474286f8f525e7429
+3a4423576b33757c71819f598ea059819f597f975395af7a95af7a7c90538ea059
+a1b1708c9853778746576b3349603268752b7c90537787466f8f527f9753778746
+657c448c98538ea0597e98828b988292a88db8c3c6b8c3c6b8c1afcdd5ded2dee6
+d2dee6dcd6d6dfe1e6d2dee6d2dee6dfe1e6cdd5deb0b8a38ea0597c9053697c2b
+7787467787465e74296b85456b852c576b3349601f3f4e323f4e32475832627444
+7787469a91789fa8579d99819a91788b98828ea08994afa1afb9bca3b7a4a0b09f
+9d9981373e43272c1f333522262e35342d1f272c1f3336423335224c5026767b47
+6b852c697c2b6b852c6b852c6b852c708f3160832a6b852c576a1f47581f3a4423
+4758323043212a34382f3c2256603a576b33848887ada17fc0b8a6c1c4c7cdd5de
+dfe1e6dfe1e6d4dcd0dfe1e6d4dcd0cccdcc92a88d95af7a7090816b85454b681e
+47581f618345618345576b333f4e1e3a44234b6933547428697c2b4b693341671b
+49601f3c5822576b334960323a4423344d1e4b6933547428618345709081bacdd9
+dfe1e6d2dee6cdd5deb8c3c6a3b7a4bacdd9bacdd9aec4d08ea08992a88d819f59
+7f97537787468b9882a0b09f7d9082a0b09fc0cbb8aeb0bd8b98827e988294afa1
+92a8b67787726b852c7f97538b988281a08995af7a8ea0897787727e98826b8545
+576b33344d1e4b69335f7b2a708f31657c44576b336274446b854568752b47581f
+627444778746778746697c2b6b854568752b66603347581f7787466b8545697c2b
+657c446b85454758323f4e1e4960324b6933657c444b69335e74295560243a4423
+d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6aec4d0b0cbdc
+a3b8bca3b8bc709081a0b09fbacdd9c5dae4d9e6ead2dee6d2dee6d2dee6d9e6ea
+d2dee6d9e6ead2dee6c1d4e2aec4d0aec4d0d2dee6d9e6ead2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6
+d2dee6c5dae49da1abbacdd9c1d4e2bacdd9aec4d0a4bfb5a5c4d7608471597c75
+6183456183454b69333d5f253043213d573b3d573b3d573b3d573b4b693341671b
+3c5822657c447090815474434b6933547443709081709081afc0abd2dee6d2dee6
+d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d9e6ea
+d2dee6dfe1e6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead9e6ead9e6ea
+dfe1e6d9e6ead2dee6d9e6eadfe1e6dfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6
+d2dee6dfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d2dee6d9e6ea
+dfe1e6dfe1e6e0e6e8d2dee6d9e6eadfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6
+d2dee6dfe1e6dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6
+dfe1e6d9e6eadfe1e6dfe1e6d4dcd0d2dee6d2dee6cdd5decdd5decdd5deb8c3c6
+b8c3c6a0b09f7e98828ea08994afa195af7a92a88db8c1afcccdcc8b98828b9882
+8ea0897c90539da1ab7d908281a0898ea0897787467c90537787466f8f528b9080
+b8c1afb0b8a38b919f9fb0bbbacdd9c1c4c7cdd5deaec4d08b98829ea9b49fb0bb
+b8c3c6a4bfb592a88d8b9882667c74576b3354605f354c314b6933576b33496032
+5474286b85457d90827c90536183457c90538ea08995af7a95af7a7787468b9882
+778746697c2b6b85455e7429576b337c90537787466b8545767b476b8673778746
+7c90536183457c905392a88d9ea9b48ea0899ea88eafc0abcdd5dedcd6d6d2dee6
+cccdccafb9bccdd5dedfe1e6dfe1e6d2dee6dfe1e6cdd5dea3b7a487886d8ea089
+8b9882778746657c446b85456183455f7b2a656c265560243f4e324c5026565838
+87886d9a91789d99819d99818b90808488879ea08aaeb0bdafb9bcafb9bc9fb0bb
+757c71394446333522262e352b33223944463944463f4e324e50434e5043778746
+627444576b33576b33697c2b657c446b852c76872d6b852c5e74295e7429576b33
+657c4447583239444630444d576b33767b478b90558b9080857d678488879ea9b4
+cdd5dedfe1e6dfe1e6cccdccc1c2aea0b09f6183456f8f526b852c6b8545344d1e
+3d5f254960325560243a4423383c233f4e1e6b854568752b6660332f3c224b681e
+49601f3f4e323f4e32373e43354c31354c314973235474436b867392a88dc1d4e2
+d4dcd0cdd5dec1c4c7a3b8bcb8c3c6d4dcd0c1d4e2a3b8bc92a88d94afa192a88d
+94afa196b7ab92a88d81a08992a88d9ea9b49fb0bb8b98827787726b854592a88d
+a4bfb57d90826f8f5281a08996b7ab92a88d81a0897787466374715f7b2a5e7429
+4b681e547428576b335f7b2a6b8545708f316f8f527787466b8545767b47576b33
+757c71778746778746767b47697c2b8c9853767b4747581f6274448b90337c9053
+7c90535f7b2a5f7b2a657c44657c44656c266274445e7429576b334b6933555824
+c5dae4cdd5decdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6d2dee6d9e6eabacdd97e9882
+94afa181a0897e9882a3b8bcbacdd9d4dcd0d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6aec4d094afa1c1d4e2d2dee6d2dee6d2dee6d2dee6d9e6ea
+d9e6ead2dee6d2dee6d9e6ead9e6ead2dee6d2dee6d9e6ead9e6ead2dee6d2dee6
+dfe1e6d2dee6d9e6ead2dee6d2dee6d9e6eadfe1e6d2dee6d9e6ead9e6ead9e6ea
+d2dee6d2dee6a3b8bcafb9bcb8c3c6a4bfb59fb0bb96b7ab92a8b66f8f523d573b
+576b336183453d5f254b6933354c313f4e32354c313043213f4e323d573b4b6865
+5474435474434b69335474433c586f60847194afa1c5dae4d2dee6d2dee6d2dee6
+dfe1e6d2dee6d2dee6d2dee6dfe1e6d9e6ead2dee6d9e6ead9e6ead2dee6d2dee6
+d2dee6dfe1e6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d9e6ead9e6ead9e6ead2dee6
+d9e6ead9e6ead2dee6dfe1e6d2dee6e0e6e8dfe1e6dfe1e6d2dee6dfe1e6d9e6ea
+dfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6d2dee6d9e6eadfe1e6d2dee6dfe1e6
+d9e6ead2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d9e6eadfe1e6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6ea
+d2dee6d4dcd0d9e6eadfe1e6dfe1e6dfe1e6cdd5deafb9bcaeb0bdcdd5dec1d4e2
+b8c3c6a3b7a4a3b7a492a88d9ea08a9ea88e9ea88eb0b8a3a0b09f8ea0597c9053
+8b988262744492a8b6afb9bc8b988292a88d7787727e98828ea0897787728b9882
+aba9a6b8c3c69fb0bb7d90829fb0bbbacdd9cdd5deafb9bc7e988294afa18b9080
+9ea88eafc0ab8ea089657c44667c74576b333f4e3247581f657c44344d1e576b33
+7c90537c90537d97367c9053819f5995af7aa0b09fa3b7a4a3b7a492a88d7c9053
+618345657c44576b336b8545697c2b697c2b5f7b2a7c90537f97536b8545778746
+6b85456b85458b98828ea0898ea0898ea05994afa1afc0abd9e6eadfe1e6dfe1e6
+dfe1e6d2dee6cdd5ded2dee6dfe1e6dfe1e6dfe1e6d4dcd0cdd5deb0b8a3b8c1af
+b0b8a37c90537d90827c9053778772557f225f7b2a5474434960326374718b9882
+a0b09f9ea08a95885c857d67afb09e8b9080afb09eb8c1afc1c4c7666c5e54605f
+56603a3a4423333522342d1f3d4f56848887b8c1afaeb0bd848887574f26767b47
+7787468ea0898b98824960325f7b2a6b852c5f7b2a4b681e4b681e6b852c547428
+6274445773763f4e32576a626b854577874687886d86874a9a917884888787886d
+afc0abd2dee6d4dcd0cccdcc9ea9b48c98536b852c76872d6b852c7c9053597c75
+618345496065344d1e3c582249601f6b852c49732368752b3a44233a4423547428
+5f7b2a4b681e5f7b2a3d4f56304321637471497323497323709081b0cbdcb8c3c6
+bacdd9bacdd9c0cbb8b8c3c6bacdd9c1d4e2b8c1afafb9bcbacdd9b8c3c6a3b7a4
+c0cbb894afb970908192a88d81a0898b9882a3b8bc8488877787726274447c9053
+afc0aba3b8bc94afa1a3b7a492a88d7e988292a88d92a88d7d9082576b33657c44
+5e742960832a41671b3d5f25576a1f576b335f7b2a697c2b657c447e98827d9082
+666b3b697c2b77874687886d767b47867c4c766e2d666b3b656c26767b478c9853
+76872d77874660832a778746767b47657c44778746657c4455602449601f657c44
+d2dee6d2dee6c5dae4d2dee6d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6
+d9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d9e6ead2dee6b0cbdc
+7d98b1608471709081a5c4d7a3b8bcbacdd9d2dee6d2dee6d2dee6d9e6eadfe1e6
+dfe1e6dfe1e6d9e6eac1d4e294afa1c5dae4d2dee6d2dee6d9e6ead2dee6d9e6ea
+d2dee6d9e6ead9e6ead2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ead9e6ea
+d2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+dfe1e6d9e6eabacdd99fb0bb94afa18a99ab94afb9a4bfb581a089608471496065
+5474434b69334960323d573b3d573b3d5f25354c31344d1e3d5f25496032709081
+94afb9597c754960323d573b5d83a4a3b8bcc1d4e2d2dee6d9e6eadfe1e6d2dee6
+d2dee6d9e6eadfe1e6d9e6ead2dee6d2dee6d9e6ead2dee6dfe1e6d9e6ead9e6ea
+d9e6ead9e6eadfe1e6c1d4e2d2dee6dfe1e6d2dee6d9e6ead2dee6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6d2dee6d9e6ead2dee6d9e6ead9e6eadfe1e6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6d9e6eadfe1e6d2dee6dfe1e6dfe1e6d2dee6
+dfe1e6dfe1e6d9e6ead9e6eadfe1e6dfe1e6e0e6e8d9e6ead2dee6dfe1e6d9e6ea
+d9e6eadfe1e6d9e6ead9e6ead2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6
+dfe1e6d2dee6d2dee6dfe1e6dfe1e6d2dee6d9e6eadfe1e6d2dee6dfe1e6d2dee6
+e0e6e8dfe1e6d9e6eacdd5decccdccbacdd9c0cbb8b8c1afc1c4c7cdd5deb8c3c6
+b8c1af92a88da0b09f8ea089a0b09fa3b7a4b0b8a3afb09e92a88d8ea0598ea089
+92a88d7787729ea88ea3b8bc8a99ab8b988287886d8b98827e98827787727d9082
+9ea88eaeb0bd9ea9b47d908281a089b8c1afc1c4c7b8c3c6afb9bc92a8b68b9882
+9ea08a8ea0899ea88e8b98827d90827e9882576b33576b334960323335223f4e32
+5e742961834560832a7c90538c985392a88da1b17092a88db0b8a38ea059778746
+5e74295e74295e7429697c2b5e74296b852c6b85457c90537c90537c9053778746
+7c90536b85455f7b2a7c9053819f5992a88db8c3c6cdd5dedcd6d6d2dee6d9e6ea
+dcd6d6cdd5dec1c4c7cccdccdcd6d6d2dee6d4dcd0dfe1e6d2dee6dfe1e6cdd5de
+c0cbb89ea08a94afa19ea88e6b8673576b337d90828ea0897d9082b8c3c692a8b6
+afb09eaba9a68b9080857d679d99818b908087886d87886d9da1ab5f61565f6156
+56603a767b4756603a373e43757c71b8c3c6bacdd9aeb0bd7787725f615668752b
+767b477d90826374714960325f7b2a576b33576a1f3d5f255e74295e74293f4e32
+4b693395af7a87886d6274447787467787468b908095885c767b4756603a3d4f56
+4e50435f61566374716374716274446b852c697c2b55602447583281a089afc0ab
+6b8673354c314960325f7b2a6b852c708f3176872d68752b4c5026344d1e4b6933
+4960323d573b547443567f3a597c75657c443d573b4b686554744381a08992a88d
+9ea88eafb9bcb8c3c6a4bfb5b8c3c6bacdd9aec4d0a4bfb5c0cbb8a3b8bcafb9bc
+aec4d0afb9bc92a8b692a8b69ea88e92a8b68b98828ea0897e9882666b3b657c44
+657c448b988292a88d7e988281a0898ea08992a88d92a88d778772576b336b8545
+697c2b6274445e74295f7b2a5e7429576b3360832a6b85455e742981a08981a089
+6183455f7b2a60832a7e988287886d77874668752b7c9053778746757b2d68752b
+8c985376872d7b90348c9853627444666b3b7c9053778746767b47657c446b8545
+d2dee6cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6c5dae4c0cbb8
+96b7ab94afa170908196b7ab9fb0bbbacdd9c1d4e2d2dee6d2dee6d9e6ead2dee6
+d9e6ead2dee6dfe1e6cccdccaec4d0aec4d0d2dee6d9e6ead9e6ead9e6ead9e6ea
+d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6d9e6ead9e6ead2dee6dfe1e6
+d2dee6d2dee6d2dee696b7ab71975381a08981a089a4bfb57090816b8673618345
+657c44547443576b33354c313f4e324b693354744362744454744354744392a88d
+6b86736b8673567f3a5474437a91a8a4bfb5c1d4e2d9e6ead2dee6d2dee6cdd5de
+d2dee6d2dee6d9e6eadfe1e6d9e6eadfe1e6dfe1e6d2dee6d2dee6d9e6ead9e6ea
+d2dee6d2dee6d2dee6cccdccd2dee6d2dee6dfe1e6d9e6ead9e6ead9e6ead2dee6
+d9e6ead9e6ead2dee6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d9e6ea
+d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6d9e6ea
+d9e6ead2dee6d2dee6e0e6e8d2dee6d9e6ead9e6eae0e6e8dfe1e6d9e6ead2dee6
+dfe1e6d2dee6d2dee6e0e6e8d9e6ead2dee6dfe1e6dfe1e6d2dee6d9e6eadfe1e6
+dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6d4dcd0
+d9e6eadfe1e6d4dcd0b8c3c6afb9bccccdccc0cbb8c1d4e2afc0abb8c1afc0cbb8
+b8c1af8ea089a0b09f9ea88e9ea08aa3b7a4b8c1afa0b09fa1b1708ea0898ea089
+8ea0897e98829ea08aafb9bc9ea9b48b98828c98537d90827090817d90829da1ab
+8b98829fb0bba0b09f7d90828b9882aec4d0b8c3c6b8c3c6afb9bc8b98828b9882
+8b98827c90538b98827c9053657c447787464960324758322f3c222e3c44383c23
+3f4e32697c2b576b336183457f97537e98827c905392a7599fa857778746778746
+6274447c9053778746657c4468752b7787466b852c5e74297c905376872d767b47
+657c444b6933657c447d90828ea0597f9753afc0abc5dae4dfe1e6dcd6d6d2dee6
+dcd6d6d4dcd0c1c4c79d9981c0b8a6cdd5dedfe1e6d2dee6dfe1e6dfe1e6d4dcd0
+d2dee6cdd5dec0cbb8b8c3c6a0b09f576a62afc0abc0cbb86b86738b90808b9080
+84888787886d75704d56603a75704d86874a75704d666033857d67767b47565838
+5f6156757c718b908054605f7d90829ea9b49da1ab8488874e4425666033867c4c
+5658384c5026496032697c2b5f7b2a5e742949601f576a1f576a1f47581f3a4423
+333522496032767b477787467b90348c98538c98539a9178778746666b3b4b6933
+3f4e1e4758325e74295f7b2a6b852c656c263a4423383c233f4e1e7f97538b9882
+7787466f8f526183454b681e6b85455e74295e7429778746556024657c444b681e
+4b681e3f4e1e576a624b69335474433c58224960324b6933608471819f597f9753
+8b9882c1cd99c1d4e2afc0aba3b7a4afb9bca0b09fafb9bc92a88d92a88da3b8bc
+8ea0899fb0bba0b09f9ea88e8ea0897d9082576a62666b3b657c447c9053767b47
+7f97538b98827c90537e98826f8f52778772778772637471657c446b8545657c44
+7c905377874668752b5e74295e742949601f6274444960323c582260832a618345
+576b33576b33555824627444767b478b9080666b3b7787467c9053767b4768752b
+757b2d7787468ea0598ea059767b4768752b8b9055778746767b478c9853778746
+d2dee6cdd5ded2dee6cdd5dec5dae4d2dee6c5dae4d2dee6d9e6ead2dee6d2dee6
+d2dee6c5dae4d2dee6d9e6eac5dae4d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6dfe1e6d2dee6d9e6ead9e6ead2dee6d2dee6cdd5dec1d4e294afa1
+7e98827e988270908192a88da0b09fd2dee6d2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6c5dae4b8c3c6afb9bcd2dee6dfe1e6d2dee6d9e6ead2dee6
+d9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6
+d9e6ead9e6ead2dee6d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6c1d4e2a5c4d76b8673567f3a81a0897090816b8673597c756b8545
+6f8f526b85455474435474434b69333f4e323f4e325474286183456084717e9882
+7090816f8f52618345597c7581a089c1d4e2d2dee6d2dee6dfe1e6d2dee6cccdcc
+d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead9e6ead9e6eadfe1e6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d9e6ea
+dfe1e6d2dee6d9e6ead9e6ead9e6ead9e6ead2dee6dfe1e6d2dee6dfe1e6d2dee6
+dfe1e6d2dee6d9e6ead9e6eadfe1e6dfe1e6d2dee6d2dee6dfe1e6d2dee6d2dee6
+dfe1e6dfe1e6dfe1e6d9e6eae0e6e8d2dee6d2dee6d9e6eadfe1e6d2dee6dfe1e6
+d9e6eadfe1e6dfe1e6d2dee6e0e6e8d2dee6d9e6eadfe1e6d9e6ead2dee6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d4dcd0d9e6ead2dee6
+dfe1e6d9e6ead4dcd0d2dee6d2dee6cdd5dec1c4c7c1c4c7a0b09fafb9bc9ea9b4
+b0b8a38b90808ea0898b98828ea089afb09eafc0ababa9a69fa0569ea88e8ea089
+8b98828b98828ea089a0b09f8ea089757c719ea88e7d908277877294afa17e9882
+9da1abafb09e9ea9b49ea9b47e9882afb9bc9fb0bbc1c4c7b0b8a39ea08a92a759
+8ea0897c90537c9053657c4456603a6b8545657c44576b332f3c223335222a3438
+3a44238ea0598c98537c90538ea0597c90536b85458c98538c98538c98358ea059
+7c90537f97537c9053757b2d68752b666b3b767b47556024778746697c2b657c44
+576b3356603a576b337f97536f8f527c9053afc0abbacdd9cccdcccdd5ded2dee6
+d9e6eadcd6d6bacdd99ea08a9d99819ea88eafb09ec1c4c7cdd5ded4dcd0d2dee6
+dcd6d6dcd6d6d4dcd0d2dee6b0b8a3778772c1c4c78b919f576a627d90828b9080
+848887857d674c50264e5043565838666b3b56583866603374643e8b9055757c71
+757c718b919f9fb0bb7d9082afb9bc9ea9b4757c71666c5e6374715658389a9178
+574f26475832657c446b852c5f7b2a778746576a1f656c26576a1f576a1f47581f
+344d1e3043216274447c90537c90538b90558c98538b9055767b4776872d708f31
+6b852c6b852c7d97365f7b2a697c2b4b69332f3c22344d1e4b69337b903476872d
+7c9053657c44697c2b354c313f4e1e3f4e1e5e74293f4e1e49601f76872d547428
+556024333522383c233043213c5822576b334b6933576b336b85456b85457d9736
+8c9853a3b7a492a88d92a88da4bfb5aec4d0a0b09f8b98828ea05981a08981a089
+7090818b98828b98827e98827787727d90828b98824960327f97537c90537c9053
+778746819f597e98827787726b86737e98827e9882778772627444778746778746
+7b90347c9053697c2b555824576a1f5e742947581f475832657c446b8545657c44
+576b33576b33576b334e5043666b3b8c9853576b335e74295e7429778746778746
+8b905586874a757b2d86874a767b4775704d666b3b556024657c447b90349e9853
+d2dee6c5dae4cdd5ded2dee6d2dee6d9e6ead2dee6c5dae4d2dee6c5dae4d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6
+d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d9e6ead2dee6a4bfb5bacdd9a4bfb5
+6f8f526183456084717090817e9882aec4d0cdd5deb8c3c6d2dee6d9e6eadfe1e6
+dfe1e6bacdd99ea9b4aec4d0b8c3c6a4bfb5bacdd9cdd5ded2dee6dfe1e6dfe1e6
+d9e6ead2dee6dfe1e6d9e6ead9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6d2dee6
+dfe1e6d2dee6d9e6ead9e6ead9e6ead2dee6d9e6ead9e6ead2dee6d9e6ead2dee6
+d9e6eadfe1e6c0cbb8a4bfb596b7ab6084716f8f52567f3a6b86736f8f52618345
+4973234b69334960323c58222e3c442f3c224b69334b69334b693341671b709081
+618345567f3a60847181a0898da0b6afc0ab9ea9b4b8c1afd2dee6c1d4e2b8c3c6
+c1d4e2d2dee6d9e6eadfe1e6d2dee6d2dee6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d9e6ead9e6eadfe1e6d9e6eadfe1e6d9e6ead9e6ead2dee6
+dfe1e6dfe1e6dfe1e6d2dee6d2dee6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6ea
+dfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d9e6ead2dee6dfe1e6d2dee6
+d9e6ead2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d2dee6e0e6e8d9e6ead2dee6
+dfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6d9e6ead2dee6d2dee6dfe1e6dfe1e6d9e6ead2dee6
+d9e6ead9e6eadfe1e6dfe1e6d2dee6bacdd9cccdccc0cbb8afb9bcafc0ab92a759
+8b98827c90538b90559fa0568ea089afb09e9ea88e8c98538b98828ea0598b9882
+7787467787468ea089afb09e7d90826b86738b908087886d7787729fb0bba0b09f
+afb09ea0b09fb8c3c69ea88e8a99ab9da1ab7a91a892a8b6b0b8a39ea88e9ea88e
+7e98827c9053496032627444576a1f657c44576b33576b33354c314758322a3438
+3a44236f8f52657c44576b3392a7597c90536274447787467787467b90347c9053
+6b852c819f598ea0598c98538b90336274446274448c98537c9053767b47778746
+7c9053778746657c44657c445e74295474437d9082bacdd9afb9bca0b09fbacdd9
+d4dcd0cdd5ded4dcd0b0b8a387886d778746767b477787469d99819ea9b4b8c3c6
+cdd5ded4dcd0dfe1e6dfe1e6afb9bca4bfb5b8c3c68488878da0b69fb0bb8da0b6
+9ea88e8ea089565838394446565838666c5e475832666c5e75704d87886d87886d
+aba9a6afb9bc9ea9b48488877d908275889b757c71576a6254605f604f2a867c4c
+565838757c715e7429697c2b76872d697c2b5e74295e742949601f576b33547428
+54742854742849601f7c90538b90558b90809e98537c90538b90337c90537b9034
+6b8545576b33576a1f5e7429656c26344d1e344d1e697c2b5f7b2a7b9034697c2b
+76872d5e74295f7b2a576a1f576a1f49601f49601f47581f6183455f7b2a49601f
+3f4e1e2f3c222f3c223f4e32576b3341671b5e7429708f318ea05992a75992a759
+697c2b7f975394afa1b8c3c6aec4d0b0cbdc92a88d8ea08992a88d5474436f8f52
+94afa1a3b8bc7e98827d908295af7aa3b8bc92a88d657c447c90536b85457c9053
+6b86736f8f52afc0abb0cbdc92a88dafc0ab778772778772576b33767b47627444
+5f7b2a5f7b2a5e7429475832576b33697c2b5e74294960325e74294b681e5e7429
+576b33627444576a1f4758323c5822778746576b33576b335e7429657c44656c26
+697c2b8b90558b9055757b2d62744477874686874a767b47767b47778746757b2d
+cdd5ded2dee6d2dee6d2dee6cdd5ded2dee6c5dae4d2dee6d9e6eac5dae4d2dee6
+d9e6eac5dae4d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6d2dee6d2dee6d2dee6
+d2dee6dfe1e6d4dcd0dfe1e6d4dcd0d9e6ead4dcd0c1d4e2afb9bca3b7a4aec4d0
+70908141671b4b6933608471819fb7a4bfb5a4bfb5b0cbdccdd5ded2dee6dfe1e6
+dfe1e6d4dcd0a3b8bc7e98828a99ab8da0b69fb0bbcdd5dedfe1e6d2dee6dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d2dee6d9e6eadfe1e6
+d9e6ead9e6eadfe1e6d2dee6d2dee6d2dee6d2dee6dfe1e6d9e6ead9e6ead2dee6
+d9e6ead2dee6c5dae494afa1a5c4d781a0896183454b6933547443597c75547443
+5f7b2a3d573b4758323d573b2b33222a34384960324b6933354c31344d1e4b6933
+41671b3c58223d5f25657c446084716f8f526b86738da0b6b8c3c6b8c3c69ea9b4
+9fb0bbc1d4e2d2dee6d2dee6dfe1e6dfe1e6d9e6eadfe1e6d9e6eadfe1e6d9e6ea
+d9e6ead2dee6d2dee6d2dee6d9e6ead9e6eadfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+d9e6eadfe1e6d9e6ead9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6
+d9e6ead9e6ead9e6ead9e6ead2dee6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6
+dfe1e6d9e6eadfe1e6dfe1e6d9e6ead9e6ead9e6eadfe1e6dfe1e6d2dee6e0e6e8
+d2dee6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6d2dee6d9e6ea
+dfe1e6d2dee6e0e6e8d9e6eadfe1e6e0e6e8dfe1e6dfe1e6d4dcd0dfe1e6e0e6e8
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6d2dee6d4dcd0c0cbb8b0b8a38ea08992a759
+8ea0899fa85792a7598c98539d9981a1b1708ea0898c98537787468b90806f8f52
+6b86737e988294afa1afb9bc9ea88e7787467e98827787467d908292a88d92a8b6
+a3b7a49ea08abacdd9a0b09fa0b09f81a089657c447d90828ea0898ea0898ea089
+a1b1707d9082576b336274446274445e7429576a1f4758324758324758322b3322
+3a4423627444657c446f8f527c90537787467c905368752b76872d76872d778746
+6b852c697c2b7787467b90348ea0598ea0598c98537c90537787467c90537f9753
+657c44767b477c90534b6933657c447f97537d9082a0b09fa0b09fa0b09fb8c1af
+cdd5ded2dee6dfe1e6d4dcd08ea0897c90537787466b85457787468b9055778772
+7787728b908092a8b69ea88eb8c3c6cccdcccdd5dedcd6d6cdd5dedcd6d6c1c2ae
+cccdccafb09ea0b09f9da1ab9da1ab757c714e504384888787886d9a91788b9080
+87886d9ea08a8b9080c1c2aeaeb0bd8b919f757c7163747154605f4e504375704d
+666c5e7787466b85455f7b2a6b852c5e74295e7429656c263f4e1e3f4e32496032
+47581f5f7b2a60832a8ea0598c98538ea0598b90557787467787465e742960832a
+576a1f47581f49601f5e7429547428576a1f47581f5f7b2a697c2b60832a557f22
+547428557f226b852c576b3368752b344d1e3c58225e7429576b33304321576a1f
+576b3347581f576a1f54742849601f6183457d90827f975395af7ab0b8a39fa056
+697c2b778746a0b09fc0cbb8b0cbdca4bfb57e98827e988281a0897090817c9053
+81a08992a8b694afa1c1d4e2c1d4e2bacdd9a3b8bc8ea089778772778746767b47
+767b477d9082a3b8bc9ea88e7e9882a4bb7e8b98827d90826b8545667c745e7429
+62744455602468752b697c2b7787466b85455f7b2a4b69334b69334b69335e7429
+576b33576b33576b335474435f7b2a576b335474436183455e74295e74295f7b2a
+657c44767b4776872d56603a556024627444767b47767b4786874a867c4c767b47
+c1d4e2d2dee6cdd5ded2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6
+d9e6eadfe1e6d2dee6d9e6ead9e6ead2dee6c0cbb892a8b692a88d96b7ab92a88d
+5474433d5f253c586f41671b709081a3b8bc94afb992a8b6c1d4e2d4dcd0d4dcd0
+d9e6ead9e6eac5dae4a4bfb594afa1b2d2e0d4dcd0d2dee6d9e6eadfe1e6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6d9e6eadfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6ea
+d2dee6e0e6e8d2dee6e0e6e8dfe1e6d9e6ead9e6ead2dee6d2dee6dfe1e6d9e6ea
+d9e6eadfe1e6d2dee694afa16b867381a0896f8f526183455474434b6933547443
+4b69333d573b3c58223d573b2f3c22344d1e567f3a4b6933354c31354c3141671b
+3d5f254b6865496065496032608471819f5960847170908194afa1bacdd9a0b09f
+a0b09fcdd5ded9e6eadfe1e6d2dee6d2dee6dfe1e6d9e6ead2dee6dfe1e6d2dee6
+d9e6ead2dee6dfe1e6d9e6ead9e6ead2dee6d9e6eadfe1e6dfe1e6d9e6ead9e6ea
+d9e6ead9e6ead9e6ead2dee6d9e6eae0e6e8d9e6eadfe1e6d9e6eadfe1e6d2dee6
+dfe1e6dfe1e6d2dee6dfe1e6dfe1e6d9e6eadfe1e6d9e6eadfe1e6dfe1e6d9e6ea
+dfe1e6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d2dee6dfe1e6dfe1e6d2dee6e0e6e8
+dfe1e6d9e6ead2dee6dfe1e6dfe1e6dfe1e6d2dee6e0e6e8dfe1e6d9e6ead2dee6
+dfe1e6dfe1e6d2dee6dfe1e6d9e6ead2dee6dfe1e6e0e6e8dfe1e6d9e6eadfe1e6
+d2dee6d4dcd0e0e6e8dfe1e6dfe1e6d2dee6d2dee6c0cbb89ea88e9ea08aa0b09f
+92a88d95af7a92a88d8ea0598b98828b98829ea08a9ea88e7e98828b90556b8673
+77874692a88da0b09fa3b7a494afa17787728b98828b98828c98538ea0899da1ab
+a0b09f8b9882afb9bcb8c3c6afb9bc9ea9b4667c747e98829ea88e8ea0598b9080
+77874649603249603247581f4960326274444960323a4423576b33576b333f4e1e
+576b337787469fa8578c9853657c445474437c90537787468c98538c98538ea059
+7f97536f8f527787468c98538e9f3b8c98537787466f8f528b90557787466b8545
+7b90347e98826b85456b8545657c446f8f5294afa1a0b09fa3b8bcafb9bccdd5de
+dfe1e6d4dcd0dcd6d6dfe1e6b8c1af92a88d7787727787727787468b988286874a
+627444697c2b778746576b33637471757c71757c71afb9bccccdccdcd6d6cccdcc
+cdd5dec1c4c7cccdcccccdcc8a99ab4e50433d573b757c718b908087886d857d67
+87886dada17faeb0bdc1c2aeaba9a675704d54605f54605f4436234e504366592c
+565838666b3b6b852c76872d697c2b4960323a4423354c312b332233352247581f
+4b69335f7b2a6f8f528b90558b90559d998186874a697c2b656c2649601f5f7b2a
+576a1f697c2b576a1f5e74295e7429697c2b3c582249601f49601f697c2b576a1f
+5474285f7b2a49601f3c58225e74293c5822576b3360832a4c50262b33223c5822
+3d5f2560832a6b8545618345657c4481a089b8c1afa3b7a4a4bb7e7d908268752b
+657c448ea059819f5981a08992a88d81a08981a08992a88d92a88d81a0897e9882
+92a88d94afa16b8673aec4d0a3b8bcafc0abb8c3c67d90826b8545627444547428
+576b33657c447787727787728b90808c98537c9053778746697c2b7c90537d9082
+7c9053767b477787465f7b2a5f7b2a697c2b5e742955602447581f3043213f4e1e
+49732349601f49601f5f7b2a6f8f52576b33576b334b6933496032496032496032
+4b681e68752b556024666b3b556024576b3347581f556024666b3b95885c8b9055
+cccdccc1d4e2d2dee6cdd5ded2dee6d9e6eac5dae4d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6d2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6afb9bc81a0896084717090816b8673
+4973233d573b3d4f563d4f5660847196b7ab7090817e9882c1d4e2cdd5dedfe1e6
+d2dee6dfe1e6bacdd9a0b09fa5c4d7b8c3c6d2dee6cdd5ded2dee6dfe1e6dfe1e6
+e0e6e8dfe1e6d9e6eadfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6d9e6eadfe1e6d9e6eadfe1e6d9e6eadfe1e6d9e6eae0e6e8d2dee6d4dcd0
+d9e6ead2dee6d2dee6afc0ab7787726f8f526b8545567f3a5474435474434b6933
+41671b3d573b3d5f253d5f253043214b6933547443567f3a3f4e32354c31344d59
+6b86733d5f253d573b657c4470908181a0896b867381a08970908192a88d81a089
+92a88dc1d4e2d2dee6d2dee6dfe1e6d2dee6d9e6eadfe1e6dfe1e6d9e6eadfe1e6
+cdd5ded9e6eacdd5ded9e6ead9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6
+d2dee6d9e6ead9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6d9e6eadfe1e6d2dee6
+dfe1e6dfe1e6d2dee6d9e6eadfe1e6d2dee6dfe1e6d2dee6d2dee6dfe1e6dfe1e6
+d2dee6d9e6eae0e6e8d9e6eadfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6d9e6ea
+d9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6
+d9e6ead9e6eadfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d2dee6dfe1e6
+dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6c0cbb8a3b7a4afc0abb0b8a3
+a0b09f8ea0899ea08a7d90827787469d9981a1b1708ea0898ea0897c90537e9882
+8ea089a0b09fa0b09f8a99aba0b09f77877294afa1aba9a695af7a9ea08aa0b09f
+b0b8a392a8b6b8c1afc1c4c7b8c3c692a8b677877292a88d95af7a8b98827c9053
+666c5e4758324e50434960322e3c44475832354c31304321556024627444767b47
+8c98537c90537c9053767b477c905386874a8c98538ea0598ea0599fa8579ea88e
+7c90535f7b2a576b3368752b7c90537787468c98537197538ea0598ea059819f59
+92a7597f97537d90828c98537c90537787728ea0898b9882bacdd9afb9bcbacdd9
+d2dee6cdd5deb8c1afcdd5ded4dcd0c0cbb8a3b7a49ea88e87886d7c905387886d
+7c9053778746778746657c44666b3b394446354c31637471626e8c9da1ab8b919f
+9da1ab9d99819da1abc0b8a68b90803f4e32373e437787729da1ab9ea88e8a99ab
+9d9981aba9a6aba9a6c0b8a69a9178666c5e5f61564e4425383c234e4425565838
+574f26666b3b68752b5e74293f4e1e3335222b3322272c1f272c1f2f3c22496032
+697c2b3f4e1e697c2b8b90559d99818c985368752b576a1f41671b4b681e6b852c
+76872d708f316b852c5e74294b681e5e74295f7b2a5f7b2a5f7b2a6b852c4b681e
+4b681e6b852c4b681e3d5f25547428576b33344d1e54742860832a5474284b681e
+3c58225474436b85457197536f8f52a1b170a3b7a48c98538b9033697c2b547428
+7b90347197537d97367787465f7b2a6183456f8f527090817f9753819f5981a089
+a3b7a4aec4d092a88da3b8bc7d90827e98828b98827c90536374714b6933697c2b
+68752b657c447c90538ea089a0b09f7787725e7429576a1f4b6933657c4492a759
+8ea059778746547428496032576b3368752b576b3355602447581f354c313a4423
+3d5f254960323c58225f7b2a567f3a56603a4960325560244b69333f4e1e4c5026
+475832556024556024627444576b33666033576b33576b3368752b778746767b47
+c1d4e2bacdd9d2dee6c5dae4d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead9e6ead2dee6dfe1e6d2dee6d2dee6
+dfe1e6d2dee6dfe1e6dfe1e6d9e6ead2dee6b2d2e081a0896b86734973234b6865
+3d573b354c313c586f576a625474436183454b686581a089b0cbdcc5dae4dfe1e6
+d4dcd0d2dee6bacdd981a0899fb0bbc1d4e2bacdd97d98b1b0cbdcdfe1e6d2dee6
+dfe1e6d9e6eadfe1e6dfe1e6d2dee6dfe1e6d9e6eadfe1e6d2dee6d2dee6dfe1e6
+d9e6eadfe1e6d2dee6dfe1e6d9e6ead2dee6dfe1e6d2dee6e0e6e8dfe1e6cdd5de
+d4dcd0d9e6eadcd6d6c5dae481a0896f8f52618345547443547443547443547443
+4960323d573b3043213d573b3d5f25567f3a576b333d5f255474283d573b354c31
+6084716084716183456f8f526f8f52608471618345576a6270908192a88d6f8f52
+6f8f52b0cbdcbacdd9dfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6ead9e6eadfe1e6
+cdd5ded2dee6d2dee6dfe1e6d2dee6d9e6ead2dee6d9e6ead2dee6dfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6e0e6e8e0e6e8d9e6eadfe1e6d9e6ead9e6eadfe1e6d9e6ea
+d2dee6dfe1e6dfe1e6d9e6ead9e6ead2dee6e0e6e8dfe1e6d9e6ead9e6eadfe1e6
+d9e6eadfe1e6d2dee6dfe1e6d9e6ead2dee6e0e6e8d2dee6d9e6ead4dcd0dfe1e6
+e0e6e8d2dee6e0e6e8d9e6ead9e6eadfe1e6dfe1e6e0e6e8d4dcd0dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6d9e6eadfe1e6d9e6eadfe1e6d2dee6e0e6e8d9e6eadfe1e6
+d2dee6e0e6e8e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6cdd5dec0cbb8a4bfb5afb9bc
+a3b7a492a88d8ea0897787467d90829ea08a8ea0599e98538b98828ea0898b9882
+8b9080aba9a6aba9a68b988292a88d9ea88ea0b09f9ea08ab8c1afa0b09f8ea089
+8b98828b9882a4bfb5b8c3c6b0b8a3a0b09f92a8b69ea88ea0b09f9ea08a7e9882
+7d90826b8673576a62657c4447583249603249603247583247581f41671b7c9053
+8c98538ea0597b90347c90539fa857b1b0699fa8577c90537c9053aea8868ea059
+76872d5f7b2a5e74298c98537c90537c90537c9053a1b1707b90348b90559ea88e
+92a88d7c90536b86738ea0598b98828c985392a88d8ea0898ea089bacdd9d4dcd0
+d2dee6c5dae4a0b09f8ea089c0cbb8d2dee6c0cbb8a3b7a48b98828ea0597d9082
+9ea88e8b98827d90828b9882576b334758326374717787724658648ea0899da1ab
+8488878488878b908075704d6274444c5026574f26666c5e857d67848887848887
+afb09eafb09e9ea9b4b8c1afaba9a68a99ab757c71373e434e504375704d74643e
+4c502655602468752b75704d4c5026342d1f342d1f272c1f272c1f383c2347581f
+68752b3a442368752ba1b170aea8868b905568752b576b3347581f54742847581f
+68752b5f7b2a708f317b903468752b697c2b76872d60832a6b852c76872d697c2b
+60832a6b85455474284b681e3a4423383c233043214973235e74296b852c5e7429
+49601f657c44475832567f3a92a75992a7599fa8578ea0598c98536b852c6b8545
+60832a618345547428576b33547428819f599ea88e92a88d7c90537f975381a089
+81a08992a8b69ea9b48b9882667c746b86736b8545767b47778746697c2b7c9053
+778746657c446f8f52a3b7a4afc0ab8b90806b85457c90536b86735e74295e7429
+8c98538b90555e74294b693354742862744447581f3a44233a44234960323c5822
+3f4e324960324960323d5f254b69334758324758324758324960323c582249601f
+576b334c5026496032666b3b55582456583855582475704d778746666b3b666b3b
+afb9bccdd5ded2dee6cdd5decdd5ded2dee6d2dee6d2dee6d2dee6c5dae4d9e6ea
+d2dee6d9e6ead9e6ead2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d9e6ea
+d2dee6d2dee6d2dee6d2dee6d4dcd0d9e6ead4dcd0a3b8bc597c75597c754b6933
+354c31354c3157737649732354744349732360847181a0899fb0bbd2dee6dcd6d6
+c1d4e2afb9bcb8c3c68da0b69ea88e9da1ab8b9882afb9bcc5dae4d2dee6dfe1e6
+dfe1e6d2dee6d2dee6d9e6eadfe1e6d9e6ead2dee6dfe1e6dfe1e6dfe1e6dfe1e6
+d2dee6d9e6ead9e6eadfe1e6d9e6eae0e6e8d9e6eadfe1e6dfe1e6dfe1e6d2dee6
+b8c3c6cdd5deb8c3c6c0cbb892a8b66b86737197534b69334960324b69334b6933
+3d573b344d1e2e3c443f4e324b69336183456f8f524b69333d5f254b6933547443
+81a08981a0896183456183454973236084715474434b6933709081709081567f3a
+6084718ea089bacdd9d2dee6d2dee6dfe1e6dfe1e6d9e6ead2dee6d9e6eadfe1e6
+d2dee6d2dee6dfe1e6dfe1e6d9e6ead9e6ead9e6eadfe1e6e0e6e8d9e6ead9e6ea
+e0e6e8dfe1e6d9e6ead9e6eadfe1e6d2dee6dfe1e6dfe1e6d2dee6dfe1e6d2dee6
+e0e6e8d2dee6e0e6e8d9e6eadfe1e6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6d9e6ea
+d2dee6d2dee6e0e6e8d2dee6dfe1e6e0e6e8d9e6eae0e6e8dfe1e6e0e6e8dfe1e6
+e0e6e8dfe1e6dfe1e6e0e6e8e0e6e8d9e6ead9e6eadfe1e6dfe1e6dfe1e6dfe1e6
+e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8d4dcd0e0e6e8dfe1e6e0e6e8dfe1e6e0e6e8
+d9e6eadfe1e6dfe1e6d9e6eae0e6e8dfe1e6dfe1e6d9e6eac0cbb8b0b8a3afb9bc
+b8c1afafb9bc8ea0897f97537c90538b98828b908077874687886d9ea88e9ea88e
+94afa19ea88ea1b1708b90557787468ea0898b9882aba9a69ea88e9da1ab7d9082
+a0b09f8b98828ea089a0b09f9da1abafb9bca0b09f92a88d8ea0899ea88e8b9882
+7e988281a08992a88d7d9082597c754b68654b6933344d1e4758325f7b2a7b9034
+7c90538ea0598c98538ea05992a759b0b86c8ea0597f97538c98538b9033778746
+697c2b7c90538c98538ea0597d9736778772657c448ea0595f7b2a5e74297c9053
+8b98827e98828b98828c98538c98537f97538ea0898ea08995af7ab0b8a3cdd5de
+d4dcd0d9e6eab8c1af8b98827d90829ea88eb0b8a3c0cbb8b0b8a39ea08a9d9981
+92a7597c9053a0b09fafb09e7787728ea0899fb0bb9da1ab6b86737d9082757c71
+767b47857d679a9178767b475658384c50264e5043565838857d67afb09eb8c1af
+c1c4c7c1c4c7aeb0bdaba9a6757c714e4425333522373e43666c5e95885c95885c
+666b3b68752b68752b3f4e1e3f4e323a44233a44233335223a4423666b3b697c2b
+8b90558b98829fa056aea8869d9981666b3b5560244b681e3f4e1e576a1f576a1f
+5560246b85458ea0597f97535f7b2a697c2b60832a5f7b2a6b852c76872d708f31
+6b8545547443657c443c58224b681e5f7b2a49601f47581f4b69334b681e4b681e
+6b852c547428344d1e547443819f597787466b852c7b903492a7598ea0598c9835
+68752b4b6933627444576b33657c447c9053afb9bc7c9053627444667c747e9882
+576b337090817e988254744354605f5474435474437b90346b854576872d778746
+627444576b3394afa1bacdd9afb9bc7d90827787466f8f527f97536b852c60832a
+7787468b9055576b335e74297787466b85454b681e56603a354c3147581f496032
+49601f4b693347581f54742847581f3f4e1e4960324c502647581f3c58223d5f25
+557f2249603247581f55602447581f627444767b47556024666b3b7787466b8545
+aec4d0c5dae4d2dee6c1d4e2cdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d9e6ead2dee6d2dee6dfe1e6d2dee6
+d9e6ead9e6ead9e6ead2dee6d2dee6c1d4e2cdd5dec5dae4a3b8bc6b8673547443
+3d5f25354c31354c313d573b3d5f25597c7560847196b7abc1d4e2dfe1e6dfe1e6
+bacdd9b8c3c6c0b8a69da1ab8b9882667c7494afb9c1d4e2d9e6eadfe1e6d9e6ea
+dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d9e6ead9e6ead2dee6dfe1e6dfe1e6
+d2dee6dfe1e6d9e6eadfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6d9e6ead2dee6
+9fb0bbb8c1afafb9bcc1d4e2a3b7a45474436b86734b69334b6933657c443d5f25
+354c314758322f3c222b33222f3c223f4e324b69334b69333043213d573b4b6933
+6f8f52719753719753618345567f3a4b693341671b547443567f3a567f3a567f3a
+70908192a88dbacdd9d2dee6d9e6eadfe1e6d2dee6dfe1e6d2dee6d9e6eadfe1e6
+dfe1e6d9e6ead9e6eadfe1e6d2dee6d9e6ead9e6ead9e6ead2dee6dfe1e6dfe1e6
+d9e6eadfe1e6d9e6eae0e6e8dfe1e6d9e6eadfe1e6dfe1e6d2dee6dfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6d9e6ead2dee6d2dee6dfe1e6d2dee6d9e6eae0e6e8
+dfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6d9e6eae0e6e8
+e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d9e6ead9e6eadfe1e6d2dee6e0e6e8
+dfe1e6d2dee6e0e6e8e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8
+dfe1e6d9e6eae0dfc6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8cccdccafb9bccccdcc
+c1c4c7afb9bc9ea88e7d90827787468ea0897d90827787468b9882afb9bcafb9bc
+a0b09fa1b1709ea88e8c98537787467d90828b9882b8c1afa0b09fa0b09f9d9981
+afb9bcafb09e7d9082afb9bc8b90807e98828ea0898b98828ea0899ea88e8ea089
+8b9882a3b7a492a88d7e98826f8f52576a62597c7547583256603a7787469ea88e
+8c985386874a7b90349fa8578b90559fa8577787467f97538ea059767b47576b33
+5f7b2a76872d8b9055656c265e7429496032576b337787725f7b2a657c446f8f52
+657c447f97537c90537f97538b90806f8f528b98827d9082a0b09fa3b7a4c1d4e2
+d4dcd0dfe1e6cccdcc8b98827c90538b90558b98828c98538ea0899ea88e9ea88e
+8c9853778746a3b7a4b8c1af7d9082576a62667c748b98829ea9b47d9082778772
+5f6156867c4c867c4c77874675704d576a625f61568b9080afb9bcc1c4c7cccdcc
+cdd5dec0b8a68b98825f61564e4425373e433336426b867387886dada17f95885c
+767b47757b2d5658384e504375889b7d9082848887848887657c4486874a86874a
+9e98539e98539a91789e985386874a666b3b576b3349601f49601f4b681e5e7429
+3f4e3263747194afa192a88d7f9753576a1f5f7b2a708f316b852c6b852c5f7b2a
+576a1f3c58226183454b69333a44233a44232f3c2247581f4b693354742849601f
+4b681e5e742947581f49601f7d97367b903477874676872d7b90347b90347b9034
+778746a1b170b0b86c8b905568752b6b8545637471576b334960324b6933608471
+597c757e988281a0898b98824960326084717d90827787466b85457787466b8545
+657c4470908192a8b6c0cbb88b919f767b477c9053627444618345697c2b708f31
+7c90539e98535e7429576b335e74295f7b2a5f7b2a496032496032344d1e3f4e1e
+576b333c58224758323d5f253c58223f4e324758323f4e323a4423344d1e3c5822
+5f7b2a576b3349601f55602455602456603a666033666b3b66603356603a666033
+aec4d0cdd5dec1d4e2cccdcccdd5ded2dee6d2dee6d2dee6d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d2dee6d2dee6d2dee6dfe1e6
+d2dee6d2dee6d2dee6dfe1e6dfe1e69fb0bb94afa1bacdd9c5dae4a4bfb5709081
+5474433d573b344d593d573b3c586f6b8673587ca094afb9c5dae4dfe1e6d2dee6
+d2dee69fb0bbafb09e9ea88e8ea0898ea0898b919fb8c3c6d2dee6dfe1e6d2dee6
+d9e6ead9e6eadfe1e6d9e6ead2dee6dfe1e6d2dee6dfe1e6dfe1e6d9e6eae0e6e8
+e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8d2dee6dfe1e6d4dcd0c1d4e2
+bacdd98b988294afa19fb0bb96b7ab657c446b8545567f3a547443576b333c5822
+3d573b2b33222f3c22262e352a34382f3c22354c31344d1e354c31354c31709081
+576a62547443567f3a4b69333d573b30444d354c313d5f254b6933547443567f3a
+719753709081afb9bcd2dee6d2dee6d2dee6dfe1e6d9e6eadfe1e6dfe1e6d9e6ea
+dfe1e6dfe1e6d2dee6d9e6eae0e6e8d9e6eadfe1e6d9e6eadfe1e6d9e6ead2dee6
+dfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d9e6ea
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6d9e6eadfe1e6d9e6ea
+d9e6eadfe1e6d9e6eadfe1e6d4dcd0d9e6ead9e6ead9e6ead9e6eadfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d2dee6e0e6e8e0e6e8d4dcd0
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8e0e6e8dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6cdd5deafb9bccccdcc
+b8c3c6cccdccb0b8a37d90829ea08a9ea88e7d90827c90538b98829ea08aa0b09f
+9ea08a9ea08a92a88d8b90806b85457787467c905387886d8ea089aeb0bda3b7a4
+9ea08ac1c2aea0b09fa0b09f7d908292a88da0b09f9ea88e9ea08aafb09ea0b09f
+8b988294afa17d90827d90827d90825474436374713f4e322f3c22666c5e8ea059
+9fa857a1b1708c983592a75986874a7c90536b85457c90537c9053627444556024
+576a1f778746767b476b854568752b627444627444657c44778746567f3a657c44
+7c9053667c7492a88d7c90537787726274447d908281a08981a089b0b8a3c0cbb8
+d4dcd0dfe1e6d4dcd0cccdcca0b09f8b9882afb09e7c90537b90348c98538c9853
+7787468b905587886d8b90558ea059767b477c90538ea0599ea88e7c9053778746
+767b4786874a87886d857d678b9080aba9a6b0b8a3c1c4c7cccdccc0b8a68a99ab
+848887757c718b919f7787724e50433a44234658649ea08a9ea08ac0b1979fa056
+76872d767b475558244e504354605f84888784888754605f565838778746778746
+9a9178778746857d67767b47666b3b87886d778772576b33576b33547443767b47
+576a624960327c9053709081a3b7a47e98828ea0597787464b681e5e742960832a
+6f8f525f7b2a576b334b681e3c5822475832697c2b7f975376872d697c2b4b681e
+576b33697c2b576a1f3c58226f8f527787467b90347d97367b90347b90348c9835
+92a7597c90538b90558c9853656c26656c26556024576b33576b33719753819f59
+92a88d7d9082757c717090816274447e98828ea0897e9882767b474b69338b9080
+afc0abbacdd9afc0abb0b8a3667c74666b3b778746657c44656c26697c2b76872d
+8c9853778746576b33576b33576b3349601f49601f3f4e1e576a1f576b33576b33
+475832344d1e47581f4960324960323c58224960323f4e1e344d1e3f4e32496032
+4960324c5026576b33576b33666b3b496032556024666b3b666b3b475832565838
+a4bfb5afb9bcaec4d0bacdd9cdd5ded2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6
+d2dee6dfe1e6d9e6ead2dee6d2dee6d2dee6d2dee6d9e6ead2dee6d9e6ead2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6a4bfb56084717e988296b7ab94afa1618345
+4973234973234973234b686554744381a08992a8b692a8b6c0cbb8d2dee6d2dee6
+d9e6ead2dee6aba9a68488879fb0bb8da0b692a8b6d2dee6d2dee6d2dee6d2dee6
+dfe1e6d2dee6d9e6eadfe1e6dfe1e6dfe1e6d9e6ead2dee6dfe1e6d2dee6dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6d4dcd0afb9bc
+b0b8a37090816b86737d90827e9882657c44657c44547443657c446b8545496032
+354c312b33222f3c22272c1f3335223f4e323d573b304321304321344d594b6933
+354c31304321576a62475832344d1e3043213043214b6865547443547443567f3a
+567f3a608471b8c3c6b8c3c6cdd5ded2dee6d2dee6d9e6ead9e6ead9e6ead2dee6
+dfe1e6dfe1e6dfe1e6d9e6eadfe1e6d9e6ead9e6ead9e6eadfe1e6e0e6e8e0e6e8
+e0e6e8dfe1e6d9e6eadfe1e6d9e6eadfe1e6d9e6ead9e6eadfe1e6d9e6ead9e6ea
+dfe1e6d9e6ead9e6eadfe1e6d2dee6d9e6ead2dee6dfe1e6d2dee6dfe1e6d9e6ea
+d9e6ead2dee6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d9e6ead2dee6e0e6e8
+e0e6e8e0e6e8d9e6ead9e6eadfe1e6d9e6eadfe1e6d4dcd0dfe1e6dfe1e6dfe1e6
+d2dee6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8ebeae7
+dfe1e6dfe1e6e0e6e8cdd5ded4dcd0d4dcd0dfe1e6dfe1e6dcd6d6afb09ec1d4e2
+c1c2aec1d4e29ea88e8b9882b0b8a39ea88eafb09e9e98538b98829ea88e8c9853
+92a7599fa0568ea0899ea88e8b98827c90537787468b90808b9882b0b8a3c1c2ae
+8b9882ada17fb8c1af9fb0bb8b988292a88d7d9082a0b09f8b98829ea88e8ea089
+7787726b86737d90827787724b6933475832637471576a62304321496032778746
+8c98537787468c98538ea83e8b90338c98537f97537b90346b852c5e74296b8545
+697c2b5f7b2a68752b8c98538c985376872d576b33576b33666b3b77874686874a
+7787466b85457d90827f9753778772576b33576a6281a089a3b7a4afc0ab92a88d
+c1c4c7dfe1e6dfe1e6e0e6e8c0cbb8c0cbb8c1c4c78b9033576b33697c2b76872d
+76872d778746656c265e74296b85456b8545697c2b68752b7787465e7429697c2b
+819f598ea0598b90809e985386874aafb09ec0b8a69ea9b48b919f9da1ab9d9981
+9a9178aba9a6c0b8a68b90805f615687886d8b905595885c857d6795885c9e9853
+76872d757b2d576b3354605f757c71637471342d1f383c23666b3b87886d8c9853
+95885c8b90809ea88e757c718b9882a0b09fa0b09f8b98828b988292a8b6b0b8a3
+666c5e4960326f8f527d9082a0b09fcdd5deb8c3c6757c713a44233d5f25697c2b
+5f7b2a4b681e576a1f4b6933576a1f7c90538b903392a7597c90538c98538c9853
+8c98538e9f3b76872d5e74297d97367c90538c98537b90347b90347b9034697c2b
+757b2d5e742968752b576a1f496032576b333f4e323f4e326b85458ea089a3b7a4
+a0b09f8b98826274447090816274444b6933576a626b8673697c2b5e74298ea089
+c0cbb8afc0ab9da1ab8488877c9053576b33576b33767b47666b3b5e7429576b33
+697c2b767b476274444b69334b69335560243f4e323c5822576a1f5e7429657c44
+5560244b69335e74293f4e1e496032576b3356603a576b334960324c502647581f
+56603a55582455602486874a55602447581f627444666b3b666b3b666033565838
+a5c4d792a8b69ea9b4bacdd9c5dae4cdd5ded2dee6cdd5decdd5decdd5ded2dee6
+d2dee6d2dee6d2dee6d9e6ead2dee6d9e6eadfe1e6d2dee6d9e6ead9e6eadfe1e6
+d2dee6dfe1e6d4dcd0dfe1e6d2dee6bacdd996b7ab608471608471719753719753
+5474435474433d5f253d5f254b6865709081618345597c757e9882bacdd99fb0bb
+b8c3c6d2dee6c0cbb88ea08992a88d8b98829ea9b4cdd5dedcd6d6bacdd9b8c3c6
+d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6
+dfe1e6dfe1e6d9e6eadfe1e6dfe1e6d9e6eadcd6d6d2dee6dfe1e6d4dcd0a3b8bc
+92a88d7e98826183456183457090816b86735474286183454b69336f8f524b6933
+3c58223043212e3c44272c1f2e3c44547443344d1e3d573b354c31354c31475832
+3d5f253f4e1e3944463c58223d5f253043212e3c4449603254605f496032547443
+4b6933667c7494afb99fb0bbafb9bccdd5ded2dee6dfe1e6d2dee6dfe1e6dfe1e6
+d9e6ead9e6ead9e6eadfe1e6dfe1e6dfe1e6dfe1e6d9e6eae0e6e8e0e6e8d2dee6
+d9e6ead9e6eadfe1e6d9e6eae0e6e8d9e6eae0e6e8d2dee6d9e6ead9e6ead9e6ea
+dfe1e6dfe1e6dfe1e6d9e6ead9e6ead9e6eadfe1e6dfe1e6e0e6e8d2dee6d9e6ea
+d2dee6dfe1e6d9e6ead9e6ead2dee6dfe1e6d9e6eadfe1e6d4dcd0dfe1e6d9e6ea
+dfe1e6d2dee6dfe1e6d4dcd0dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d4dcd0dfe1e6
+d4dcd0d9e6eadfe1e6d2dee6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6ebeae7dfe1e6
+ebeae7dfe1e6dcd6d6cccdccd4dcd0cdd5decdd5dedcd6d6c0cbb8c1c4c7c1c4c7
+b0b8a3afb09ec1c2aec0b8a6cccdccc0b8a6c1c2ae8b90558ea089afb09e9ea08a
+9ea88e9ea88e9fa0569ea08a87886d7787467c90537f975387886dc0b8a6afb9bc
+9d99818b9080a0b09fafb09e92a88da3b8bc8ea0899ea88e9ea88e92a88d7e9882
+6b85457d90827d9082667c744b69336b86737f97537e9882547443576b3356603a
+8c98537b90347787466b85455e74297c905368752b6f8f526b85457787468c9853
+656c26576b337787468c98538c9853666b3b778746767b4762744484888792a88d
+8b98828ea08981a08987886d778746627444576b337787729ea9b4a3b7a48b9080
+94afa1d4dcd0d2dee6dfe1e6cccdcccdd5dec0cbb8778772767b478c9853778746
+757b2d778746697c2b5e7429767b4786874a767b47556024697c2b6b852c6b852c
+8b90558b90559e98538b988295885c9ea08a9ea08aada17fada17fc0b197aba9a6
+9d9981ada17fada17f857d6787886d9a91789da1abc1c2aec1c2aeaba9a68b9033
+7b9034778746697c2b63747175889b666c5e4e44255f61568c9853aea8869e9853
+8b90559ea08a92a88d848887b0b8a3b8c3c68a99ab9ea9b4b8c1afb8c3c6cccdcc
+7d9082576b33767b4768752b5f615654605f4e50433a44232b33224758325e7429
+657c443c58226b85455f7b2a7787468ea0598c985376872d76872d80a03b8ea059
+91af499fa8578e9f3b8c98538e9f3b7b903460832a697c2b6b852c7d9736697c2b
+576a1f697c2b778746576b3349601f4b69335e7429767b476b85457f97538b9055
+8ea0598ea0597e98827e98826b86736183457197536b86736b85456183456f8f52
+8b90807e988292a88da4bfb57d90826b8545576b3362744487886d697c2b5e7429
+697c2b5558246660333a44233f4e323a44234b6933656c266274444b681e5e7429
+496032666b3b4b69334758323a44232f3c22354c31657c44666033576b33576b33
+8b903387872c6b8545778746656c26576a1f666033666b3b666033576b33576b33
+bacdd9b0b8a3a0b09fcccdccd2dee6cdd5decdd5dec1c4c7c1d4e2d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6d2dee6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d4dcd0afb9bc94afa181a089608471567f3a547443
+4b69333d5f253d573b3d5f254b6933608471567f3a60847196b7ab94afb98b9882
+8ea089a0b09fafc0ab7d9082627444778772aeb0bdb8c3c69fb0bbb8c3c6d2dee6
+d2dee6d9e6ead9e6eadfe1e6dfe1e6d2dee6dfe1e6d2dee6dfe1e6d9e6ead9e6ea
+d9e6eadfe1e6dfe1e6dfe1e6d9e6eadfe1e6d4dcd0cccdccd9e6ead2dee6b8c3c6
+7e9882719753657c444b69334b69334b6933657c44618345547428657c44576b33
+4b69332f3c22394446272c1f3a44234b6933354c313d573b3f4e324960324b6933
+4b69333d5f253f4e1e344d1e3d5f252f3c22354c31608471618345567f3a618345
+5474434b69337d98b194afa18ea089cdd5ded9e6eadfe1e6d9e6eadfe1e6dfe1e6
+d2dee6dfe1e6d9e6ead9e6eadfe1e6dfe1e6d2dee6dfe1e6d9e6eae0e6e8dfe1e6
+d9e6eadfe1e6dfe1e6e0e6e8dfe1e6d9e6eae0e6e8dfe1e6d9e6eadfe1e6d9e6ea
+d9e6eadfe1e6dfe1e6d9e6eadfe1e6d9e6ead9e6eadfe1e6d9e6eae0e6e8d9e6ea
+e0e6e8d9e6eae0e6e8dfe1e6e0e6e8d2dee6d9e6eadfe1e6dfe1e6dfe1e6d9e6ea
+dfe1e6d2dee6dfe1e6d4dcd0dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6d9e6eae0e6e8
+dfe1e6d2dee6e0e6e8dfe1e6d9e6eadfe1e6e0e6e8e0dfc6ebeae7e0e6e8ebeae7
+ebeae7dcd6d6c1c4c7c1c4c7cdd5dec1c4c7b8c1afb8c1afaeb0bdcccdcccccdcc
+9ea88eaba9a6c1c2aecccdccc1c4c7afb9bccdd5deada17fb0b8a3c1c2aeaea886
+9ea88eb1b0699ea08a8c985387886d6183457e98828ea0596b85459ea88eb8c1af
+9ea08aa0b09fa0b09f9da1ab9da1aba0b09f92a88d8b9882a0b09f9fb0bb8b9882
+7d90828ea089a0b09f7787724b686592a759667c746274444b69333c58226b8545
+8ea05968752b68752b697c2b4b681e7c9053576b33697c2b7b9034697c2b8c9853
+697c2b657c44697c2b7c9053778746757b2d778746767b47767b47666b3b7d9082
+7c90537787726b8545627444627444576b33657c447787467e9882bacdd9afb09e
+a3b7a4cdd5dedcd6d6d9e6eac1c2ae8b98828ea08968752b8c98539ea08a5e7429
+7787467787467c90537b90346b852c8b90558c9853767b47757b2d77874668752b
+77874686874a9f91548b905595885c87886daea886aba9a6aba9a6aba9a69d9981
+ada17fafb09ec1c2aec0b197c1c2aec0b8a6cccdcccccdcce0dfc6afb09e87872c
+7787467787465e74299d99819ea88e87886d75704d9d99819fa0569ea08a767b47
+8b9055aba9a68ea0898b9882afc0abb8c1af9da1abcccdcccdd5decccdccdcd6d6
+b8c3c68b98826b85455e74293f4e1e3a44233a4423333522272c1f2b33222f3c22
+576b33344d1e627444a0b09f8ea0598c98538e9f3b8c98538b90338ea0599fa857
+9fa8578ea0598c98538c98357787465e7429576a1f7b90347f97537d973676872d
+697c2b7b90348ea059697c2b6b852c76872d7c90537787467787467c90538ea089
+7c90539ea88e95af7a657c44657c444b69334b6933709081666b3b6183457c9053
+8c98536b86738b988294afa1667c745e742949601f576b33576b338b9055627444
+576b333f4e324758323f4e1e2f3c22576b33657c44778746656c26657c44556024
+3f4e3247583249601f4758325e74293a442362744492a75986874a767b47576b33
+6b85458b903368752b627444767b4768752b55602462744468752b857d67666033
+a4bfb5a3b8bca3b8bca3b8bcc1d4e2d2dee6d2dee6cdd5ded2dee6d2dee6dfe1e6
+d2dee6dfe1e6d2dee6d2dee6d9e6ead9e6ead9e6ead2dee6d2dee6dfe1e6dfe1e6
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6bacdd992a8b681a089719753497323597c75
+3d5f25344d592e3c443d573b567f3a54744354744381a08996b7ab7a91a8819fb7
+bacdd97787728b9882657c44576b33637471757c71757c71b8c3c6c1d4e2afb9bc
+cdd5ded2dee6dfe1e6d2dee6d9e6eadfe1e6d9e6eadfe1e6dfe1e6dfe1e6d2dee6
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6e0e6e8cdd5deb8c3c6c1c4c7d2dee6afc0ab
+7e9882597c755474434960324b69334b69333d5f25576b333d573b4b69334b6933
+496032344d1e272c1f272c1f3d4f565e7429496032344d1e354c313c58225e7429
+567f3a5f7b2a567f3a3d573b3c5822547443497323618345597c75497323567f3a
+4b69334b6933597c7570908181a089cdd5ded2dee6d9e6eae0e6e8d9e6ead9e6ea
+e0e6e8d9e6eadfe1e6d9e6eadfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d9e6ea
+dfe1e6d9e6ead9e6ead9e6ead9e6ead9e6eadfe1e6d9e6ead9e6eae0e6e8d2dee6
+dfe1e6d9e6ead9e6eadfe1e6dfe1e6d2dee6dfe1e6d9e6eadfe1e6e0e6e8d2dee6
+d9e6eadfe1e6e0e6e8d4dcd0dfe1e6d9e6eadfe1e6d9e6ead9e6eadfe1e6dfe1e6
+d9e6eadfe1e6cdd5decdd5dedfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6
+d4dcd0dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6ebeae7dfe1e6dfe1e6
+ebeae7d4dcd0cccdccc0cbb8c0cbb8c1d4e2afb09eaba9a6afb09eb0b8a3c1c4c7
+aea886a0b09fb0b8a3afb09e9ea08ac0b197b0b8a39ea88ec1c2aecccdccc0b8a6
+c0b8a6afb09eb0b8a38b98828c98537787468b98827d90828b98828b9882b0b8a3
+afb09eafb09eafb9bc9d99819ea88ea3b7a48b9882b0b8a3a3b7a4a0b09f8b9882
+92a88d81a08994afa18ea089576a62657c44475832576b333c5822657c448ea059
+8ea0597c90537c90537c9053656c26576b33556024657c448c98537f97538b9055
+556024767b47697c2b697c2b697c2b62744468752b666b3b8c98538b90559ea08a
+8ea05987886d767b47767b47627444657c447c9053657c447d9082c0cbb8bacdd9
+c1c4c7cdd5dedfe1e6dfe1e6d4dcd0afb09e767b4776872d7c9053697c2b75704d
+576b33697c2b757b2d7b9034767b479e98538c98538b9033767b47757b2d76872d
+656c26767b478b90558b9055857d6787886d87886dc0b8a6c0b197c1c2aeafb09e
+9a9178ada17faeb0bdcccdcccccdccafb9bcc1c4c7cdd5dec0cbb89d99819fa857
+9fa0569fa8579ea88eb8c1afc1c2aeafb09eb1b069ada17f857d679a91788b9080
+778772afb09e9ea88e8b9080cccdccafb9bcaba9a6b8c3c6dcd6d6dfe1e6d2dee6
+aeb0bd8b9080556024576b3349601f2f3c223f4e32383c23333522272c1f2b3322
+5e7429576b337f97539fa0568c985387872c8ea05992a7598c98538e9f3b8c9835
+a1af4e9fa8578e9f3b8e9f3b7d97367b9034697c2b8ea0598c98538c983576872d
+76872d76872d76872d6b85457787466b852c68752b6b854577874676872d7c9053
+7c90538c98539ea88e7f97536274443d5f255474435e742949601f547443576b33
+7787466b85457c9053667c74657c446274444960323c5822496032666b3b767b47
+556024555824576b33576b33666b3b576b33576b3356603a496032656c2649601f
+344d1e47581f576b333c58224b6933576b33576b33778746847144576a1f576b33
+666033576a1f657c446b852c778746767b47697c2b62744468752b6660334c5026
+a0b09f92a88d94afb98da0b6b0cbdccdd5ded2dee6cdd5decdd5ded2dee6dfe1e6
+d2dee6d2dee6dfe1e6d2dee6d2dee6d2dee6d9e6ead2dee6dfe1e6d2dee6d2dee6
+dfe1e6dfe1e6d9e6ead2dee6dfe1e6d2dee6b0cbdc709081709081567f3a4b6933
+3f4e323043213043213043213d5f253c5822344d593d573b81a089afb9bcc0cbb8
+bacdd992a88d6b85456274446b867377877275889b84888792a8b6709081aec4d0
+d2dee6dfe1e6dfe1e6dfe1e6d9e6ead2dee6d9e6ead2dee6d9e6eadfe1e6dfe1e6
+d9e6eadfe1e6e0e6e8dfe1e6d9e6eadfe1e6d2dee6a4bfb59fb0bbd2dee6bacdd9
+81a0896f8f525474433d573b496032354c3130444d547443547428657c444b6933
+4960323d573b2b33222b33223a4423657c44657c444960324b69334b6933697c2b
+5474283c58225474284b6933497323697c2b60832a567f3a49601f576b335f7b2a
+4758324960324b693370908181a089cdd5ded4dcd0dfe1e6d9e6ead9e6eadfe1e6
+d2dee6e0e6e8dfe1e6d9e6eae0e6e8dfe1e6d2dee6dfe1e6d9e6eadfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d9e6eae0e6e8dfe1e6d9e6eae0e6e8d9e6ea
+e0e6e8d9e6ead9e6eadfe1e6d2dee6e0e6e8d9e6eadfe1e6d2dee6e0e6e8dfe1e6
+d9e6eadfe1e6d9e6eae0e6e8dfe1e6d2dee6e0e6e8dfe1e6dfe1e6d2dee6e0e6e8
+d2dee6e0e6e8dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8ebeae7dfe1e6ebeae7ebeae7dfe1e6
+ebeae7dfe1e6dcd6d6c1c2aec0b8a6afb09e8ea089b0b8a3afb09eb0b8a3c1c2ae
+afb09eb1b069aba9a6c1c2aeafb09eaba9a69d9981c1c4c7cfc6b8d3cea2cccdcc
+b8c1af9d99819ea88e7787467787468b9882a0b09f8b98828b98828b98829ea88e
+aea886b0b8a3bacdd9afb09eafb09eaba9a69ea08aa3b8bc9ea08a8ea089848887
+667c746b8545667c746b8545627444666b3b47581f576a1f3043214758326f8f52
+7d97367c90538b90338ea0598ea05968752b68752b68752b7787468c9853697c2b
+4b681e757b2d68752b767b47576b337c90537c9053778746767b479ea88ecccdcc
+afb09e8c98538c9853778746778746576b337d90828c98538ea059b0b8a3cdd5de
+e0dfc6dfe1e6d4dcd0e0e6e8d4dcd0d4dcd0b0b8a37787467787467c90538c9853
+666b3b75704d76872d697c2b576a1f68752b778746656c26666b3b666b3b767b47
+68752b767b47857d678b905587886daba9a687886d9a9178c1c4c7c0b8a6aba9a6
+8b9882b2a856b0b8a3cccdccdcd6d6dcd6d6cfc6b8c1c2aeada17f9d9981afb09e
+b1b069c0b197c0b8a6c3c17ac1c2aec0b1979d9981867c4c757c71c0b8a6b8c1af
+c0b8a6afb9bcaba9a6778772dcd6d6c0cbb8aeb0bd8b9882c1c4c7dcd6d6dfe1e6
+aba9a68b98825e74297787465e74295560243f4e1e3f4e1e333522333522304321
+60832a92a7598ea0599fa8578c98538b90338c98539e98537b90347b90348c9853
+7c905376872d7c905376872d8c985376872d7b90347b90347d97368ea0597b9034
+7b903476872d5e7429697c2b5e7429576b33576b336b852c77874676872d8c9853
+7787467c90539ea88e7f9753767b475e7429708f317b9034576b33697c2b778746
+8b90556b85456b852c778746819f59778772576b3349601f576a1f56603a778746
+778746767b47697c2b657c4477874649601f576b33697c2b496032697c2b576b33
+4b681e6b85457b9034778746697c2b767b475e742968752b75704d666b3b697c2b
+576b333f4e1e5558244b69336b852c8b90338c9853656c26666c5e778746666033
+a0b09f7e98826f8f527a91a8aec4d0cdd5decccdccbacdd9d2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6
+dfe1e6d2dee6c5dae4cccdccd2dee6cdd5deb0cbdc92a88d7090814b68654b6933
+5474433d573b354c314b686541671b3d5f253043215773769ea88e8ea089778772
+7e988294afa17d9082576a62667c749da1ab9fb0bb94afa1556c847d9082c1d4e2
+dfe1e6dfe1e6d2dee6d9e6ead9e6ead9e6eadfe1e6dfe1e6d2dee6d2dee6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d9e6ead2dee6afc0ab757c71a0b09fc0cbb8
+7e9882657c444b69333d573b576b333c5822496032547443547443475832547443
+4b69334758322f3c222b33222e3c445f7b2a4b69335474435e742949601f5f7b2a
+4b69332f3c224758323c5822576b335f7b2a5f7b2a567f3a4b69333c5822657c44
+3d5f253c582241671b657c448da0b6cccdccb8c3c6cdd5ded2dee6d9e6eae0e6e8
+e0e6e8d9e6eae0e6e8dfe1e6d9e6ead2dee6dfe1e6e0e6e8e0e6e8d9e6ead9e6ea
+d9e6ead9e6ead9e6ead9e6eae0e6e8dfe1e6d9e6eae0e6e8dfe1e6dfe1e6dfe1e6
+d9e6eadfe1e6d2dee6e0e6e8dfe1e6dfe1e6dfe1e6d2dee6dfe1e6d9e6ead9e6ea
+d9e6eae0e6e8d2dee6dfe1e6e0e6e8e0e6e8d2dee6d2dee6e0e6e8e0e6e8dfe1e6
+d9e6eadfe1e6d2dee6dfe1e6d9e6eadfe1e6d9e6ead2dee6dfe1e6e0e6e8d2dee6
+e0e6e8dfe1e6ebeae7ebeae7dfe1e6ebeae7dfe1e6ebeae7ebeae7ebeae7ebeae7
+ebeae7e0e6e8cdd5deb8c1afb8c1af9ea08aa0b09f9ea88e9ea88eaba9a6c0b197
+c0cbb8c1c2aec0b8a6cfc6b8b0b8a3afb09e9d9981c1c4c7cccdccc1c2aec0b8a6
+afb09e9ea88e9e98537787728ea0598b988287886d8c98537787727787469ea88e
+9ea08ac1c2aeaeb0bd9d99818b98829ea88e8b988292a8b69ea88e8ea0897c9053
+56603a496032576a62657c44576b3349601f576a1f576b332f3c2256603a7b9034
+8ea0597787467787467b90347c90538c98537787467787467b90347c9053576a1f
+56583868752b627444656c26757b2d8c985386874a697c2b576b33afb09ec1c2ae
+afb09e87886d7787468b98827787466f8f529ea88eafb09e8c98538b9882cccdcc
+d4dcd0dcd6d6dfe1e6dfe1e6dfe1e6dcd6d6c1c2aea1b170b0b8a3b0b8a39ea88e
+8b90558b98828b90338b9055666b3b867c4c77874668752b68752b86874a767b47
+576b338c9853757c71767b478ea0899ea08a8b9080857d67aba9a6cccdcca1b170
+9d99818b90558b9882c1c2aedcd6d6dfe1e6dcd6d6c0b8a6aea8869ea08a95885c
+867c4cada17faea886c0b197c4a979ada17f95885c666b3b8b9882afb9bccfc6b8
+c1c4c7c1c2ae9ea08a87886dcdd5dedfe1e6c1d4e29ea9b4bacdd9dfe1e6dcd6d6
+b0b8a37c9053697c2b60832a697c2b6274443f4e1e656c263a4423383c233f4e1e
+77874676872d8c98358ea0599fa85792a7599fa8578b90337c90537d9736697c2b
+4b681e555824556024576a1f697c2b68752b697c2b7b903492a759757b2d76872d
+6b852c5e7429556024657c44576b334b681e49601f7787467c90539fa8578ea089
+7787465474437b9034819f597787464b681e60832a6b854586874a76872d7f9753
+8b9055778746778746697c2b6f8f526b8545697c2b556024627444556024778746
+7c9053767b47666b3b656c2676872d7c90538e9f3b92a7598ea0597b9034778746
+697c2b757b2d576a1f666b3b757b2d76872d8ea0598c983586874a86874a767b47
+576b33576a1f5e7429555824767b47576b3376872d5560244c50265f6156576b33
+92a88d70908160847157737681a089b8c3c6afb9bcaec4d0cdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6d2dee6
+dfe1e6d9e6eaa4bfb58b9882c5dae4cccdccc0cbb8a4bfb57e98825474434b6933
+3d573b2e3c44344d1e4973233d5f253c586f6b8673afb9bcbacdd97d90824b6933
+597c7581a0896b86734b69333f4e323d573b576a625474437197b4b8c3c6d2dee6
+d2dee6dfe1e6dfe1e6dfe1e6d2dee6d9e6eae0e6e8dfe1e6dfe1e6d9e6eadfe1e6
+dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6c5dae47d908260847192a88d
+81a089657c44567f3a3d5f253d573b354c3162744460832a6183455474433d5f25
+5474433f4e322a34382b33222f3c225f7b2a657c444b69334b69334b6933496032
+4758323043213d573b4b69336183455474284973234b69334b69334b69336f8f52
+4b6933547428618345547443aec4d0b8c3c68da0b69fb0bbcdd5dedfe1e6dfe1e6
+dfe1e6d9e6eadfe1e6dfe1e6e0e6e8d2dee6d2dee6dfe1e6dfe1e6dfe1e6e0e6e8
+dfe1e6dfe1e6d2dee6dfe1e6d9e6ead9e6ead9e6eadfe1e6e0e6e8e0e6e8d2dee6
+e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6d9e6eae0e6e8d9e6eae0e6e8dfe1e6e0e6e8
+e0e6e8dfe1e6e0e6e8d4dcd0dfe1e6dfe1e6e0e6e8d9e6ead9e6ead2dee6dfe1e6
+dfe1e6cdd5ded4dcd0d2dee6dfe1e6dfe1e6d4dcd0e0e6e8d9e6ead2dee6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6ebeae7dfe1e6ebeae7
+dfe1e6e0dfc6dcd6d6cccdccb8c1afb0b8a3afb09ea0b09f8b98829ea08ac1c2ae
+afb09ecccdcccdd5dec1c2aecfc6b8cfc6b8afb09e9ea08ac0b8a6c0b8a6aea886
+afb09e9fa8578b98827c90537c90538b98828b90558b98827787467c90538ea059
+9fa056afb09e9ea88e8ea0898b98828ea0898b988292a8b6a0b09f7d9082657c44
+576b3347581f576b336274444960324758324758325474435e74298b9055a1b170
+a1af4ea1b170b1af4d8ea0598ea0597c90536b852c8b90556b8545757b2d576a1f
+56603a657c447787466274447f97538c985368752b576b336b854587886d9d9981
+8b988286874a9ea88e7c90538ea0897787728b98828b98827c90539ea88eb8c3c6
+afb9bcdcd6d6dfe1e6dfe1e6e0e6e8dfe1e6dcd6d6dcd6d6dfe1e6cdd5dec1c2ae
+8ea089a1b170afb09e8ea0599ea88e9ea88e9fa0567787468b90559a91788c9853
+778772778772576b33627444afc0abc0cbb89ea88eaeb0bd8b9080c0b8a6aba9a6
+8b90557787467787469ea9b4cdd5dedcd6d6cfc6b8afb09ec0b8a6aea886b2a053
+ab9158ada17f9d9981ada17fada17f9a917895885c74643e848887afb9bcaeb0bd
+cfc6b8cfc6b88b9080778772cccdccdcd6d6d4dcd0cfc6b8cccdccdfe1e6cdd5de
+b0b8a37c9053697c2b6f8f52697c2b5e74294b681e697c2b47581f4b681e5e7429
+7f97537b90348c9853a1af4e9fa8577787468ea0597b903476872d8c985368752b
+5e7429576b33576a1f6b852c7d9736708f315f7b2a697c2b76872d76872d76872d
+7787467787465e74295e742947581f49601f6b854576872d7b90348b9055767b47
+9ea88e7f97537c90539fa85792a75976872d576a1f4b681e7787466b85457d9736
+7b90347c90538ea059697c2b5f7b2a6b852c68752b68752b7787467b9034697c2b
+7787467c90538b905577874676872d8c98538b9033a1b1708e9f3b8b90338c9853
+7c90538b9055697c2b657c4468752b68752b77874676872d8b9033767b47766427
+47581f6b852c8b9033778746766e2d56603a666b3b778746666b3b56603a666b3b
+7d90827197536b86734b68656886a68da0b6a3b8bcb8c3c6c1d4e2d2dee6d2dee6
+dfe1e6d2dee6dfe1e6d2dee6d2dee6d2dee6dfe1e6dfe1e6d2dee6d2dee6d4dcd0
+d2dee6d2dee6bacdd981a08994afa194afa194afa1719753618345567f3a41671b
+344d1e3043214b686541671b354c31344d59627d9981a08992a88d667c743d5f25
+576a624b69334960656b86734b68654960324b6933597c7581a0899fb0bbcdd5de
+d2dee6dfe1e6d2dee6dfe1e6dfe1e6d9e6eadfe1e6d9e6eadfe1e6e0e6e8dfe1e6
+dfe1e6dfe1e6d9e6ead9e6eadfe1e6d2dee6dfe1e6c0cbb87e98826183455f7b2a
+657c44657c44778746576b33576b334b69334b6933576b33496032496032496032
+4b6933344d1e3043212b33223d573b4b69334b6933576b33576b33496032576b33
+4b681e4b681e576b335474283d5f2541671b4b693341671b344d1e4b681e4b6933
+344d1e576b33567f3a6b8673b8c3c681a089667c74afc0abd2dee6dfe1e6dfe1e6
+e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6d2dee6d4dcd0d9e6eadfe1e6e0e6e8dfe1e6
+e0e6e8dfe1e6dfe1e6d9e6eadfe1e6e0e6e8dfe1e6d9e6eadfe1e6dfe1e6dfe1e6
+dfe1e6e0e6e8d9e6eadfe1e6dfe1e6e0e6e8e0e6e8d2dee6d9e6eadfe1e6d9e6ea
+e0e6e8e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6d2dee6d2dee6
+dfe1e6c1c4c7dcd6d6d4dcd0e0e6e8d2dee6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6
+dfe1e6dcd6d6dfe1e6dfe1e6ebeae7dfe1e6ebeae7ebeae7dfe1e6dcd6d6ebeae7
+dfe1e6dfe1e6e0dfc6cccdccb0b8a3b0b8a3c1c2aeb0b8a3c1c2aeafb09ec1c4c7
+c1c2aec0b8a6dcd6d6cfc6b8c1c4c7aea886afb09e9ea08ac0b8a6cccdccb0b8a3
+afb09eafb09ea0b09f9fa0569ea08a9fa8578ea0599fa0568b98828c985392a88d
+9fa056b0b8a39ea88e9ea88e8b90808b9882b0b8a38ea0898b9882778772627444
+4b69333f4e1e4e5043576b33778772767b476b86738b908068752b8b9055a1b170
+7d973692a7598e9f3b8c985376872d697c2b8c9853697c2b5560246274448c9853
+576a1f68752b697c2b49601f7c90536b8545767b476b8545657c44757c71c1c2ae
+a1b1708c98539ea88e8c9853b0b8a39ea08a75704d7c9053767b47a0b09fcccdcc
+cccdccafb09eafb9bccccdccdcd6d6e0e6e8e0e6e8dfe1e6e0e6e8e0e6e8d4dcd0
+c1c2aeb0b8a3afb09eaea886afb09eb0b8a3b0b8a3aea8868b98827c90538ea089
+7787727d90828b908087886dcdd5decccdccc0b8a6c0b8a6c0b8a69ea88eafb09e
+8b90557787728b9882c1c4c7dcd6d6cccdccc0b8a6c0b197c0b8a69d9981c4a979
+ada17f9a917895885cada17f95885c66603375704d75704d75704d666c5e9d9981
+c0b8a69a9178757c71778772bacdd9dfe1e6dcd6d6c1c4c7cccdccd4dcd0c1c2ae
+9ea88e8c98536b852c767b47627444697c2b576a1f576b3347581f47581f7c9053
+9fa8579fa0566b852c7f97537c905376872d9fa8578c985386874a7c90537b9034
+7f975376872d708f31708f316b852c54742860832a5f7b2a547428576b334b681e
+5474286b854576872d68752b697c2b5e74297b9034708f31697c2b8c9853778746
+657c44819f598c98357c90538b903377874676872d76872d86874a697c2b7d9736
+76872d8b9033819f597b90347d9736778746778746656c2668752b6b8545697c2b
+618345757b2d6b852c767b47656c2668752b7f97538c98537c90537b90348ea059
+7f97537f9753657c445e7429778746757b2d767b47697c2b766e2d75704d767b47
+867c4c7787468b90338471448b905566592c5558244c5026574f26565838767b47
+7c90537f97535474434b68655773766886a692a8b6afb9bccdd5ded2dee6d2dee6
+d2dee6d2dee6d2dee6dfe1e6d2dee6dfe1e6d2dee6cdd5dedfe1e6dfe1e6d2dee6
+dfe1e6d2dee6d2dee6cdd5de92a88d597c755474436b86736b8545618345547443
+41671b567f3a6183453d573b304321354c31496065657c44547443576b337e9882
+92a88d597c75576a62778772576a62597c75597c75709081a3b8bcaec4d0b8c3c6
+bacdd9dfe1e6dfe1e6dfe1e6d2dee6d9e6eadfe1e6d9e6ead2dee6d9e6eadfe1e6
+dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6bacdd992a88d6b8545547443
+547443567f3a576b33576b336b85454b69334758325f7b2a5f7b2a576b333c5822
+4758323d573b3a4423354c316183454b69334b69334b69333d5f253043213d573b
+5474285f7b2a5f7b2a4b681e5474434b69335474433d5f253c5822547443547443
+41671b547443657c448ea0897e9882496032667c74a4bfb5d2dee6dfe1e6dfe1e6
+dfe1e6e0e6e8dfe1e6d2dee6c1c4c7c1d4e2cdd5debacdd9d4dcd0dfe1e6d2dee6
+e0e6e8d9e6eadfe1e6e0e6e8dfe1e6d9e6eadfe1e6d9e6ead9e6ead9e6ead9e6ea
+dfe1e6dfe1e6d9e6eadfe1e6dfe1e6d2dee6e0e6e8e0e6e8d9e6eadfe1e6dfe1e6
+dfe1e6d9e6eae0e6e8dfe1e6dfe1e6d9e6ead9e6ead4dcd0d4dcd0d2dee6cdd5de
+d4dcd0afb9bccccdccd2dee6dfe1e6d2dee6cdd5decdd5ded2dee6d2dee6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6ebeae7dfe1e6dfe1e6dfe1e6
+dcd6d6dcd6d6dcd6d6c1c4c7cfc6b8b0b8a3cfc6b8b8c1afa0b09fc1c2aec1c2ae
+b8c1afb0b8a3cccdccc1c2aea1b1709ea88eb8c1afb0b8a3cfc6b8d3cea2afb09e
+c1c2aed3cea2b0b8a39ea88e9fa0568ea0599ea88e8c98538c98538ea089778746
+778746afb09eafb09e9ea88e7c90539ea88ec0cbb8cdd5de8ea089757c71657c44
+576b333f4e323f4e323f4e326274447787464658645f615692a7599fa8579ea88e
+8ea059b1b0698ea059697c2b5e74297c90537f9753697c2b576b33576a1f7f9753
+7787468c9853697c2b697c2b8c9853697c2b6274447f97536b8545778746afb09e
+b0b8a38ea0597c90538c9853b0b8a39ea88e68752b77874681a089afb09eb8c3c6
+bacdd9afb09e8c98538ea089cccdccdfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+e0dfc6cccdcccccdccdcd6d6c1c2aecccdccdcd6d6cccdcc8ea0599ea88e9ea88e
+b0b8a38b9882b0b8a3b8c1afd2dee6cccdccc1c4c7aeb0bdcfc6b8c1c2aeafb09e
+aba9a69ea08a8b9882b0b8a3cfc6b8c0b8a6c0b197c0b1979a917875704db09954
+9d998195885c9d99819e985375704d75704d75704d666b3b8b908095885c9d9981
+757c715f61563a44234e50438488879ea9b4aeb0bdaeb0bdafb9bcdfe1e6b8c3c6
+8ea0598ea0597b903449601f49601f4b681e3f4e1e3f4e1e4b681e6b852c7f9753
+8e9f3b8b903368752b576b335e74296b852c7b903476872d76872d8b90338c9853
+7b90348b9033778746708f31656c2649601f576b333a44232f3c22383c233f4e1e
+576a1f5f7b2a6b854560832a7d9736819f597d97367b90347b90347f97538e9f3b
+7c90537f9753757b2d68752b576a1f75704d7c90537b90347c90535e74297b9034
+7f97538b903376872d6b852c697c2b8c98357c905355602447581f5e74296b8545
+5f7b2a576b337787466b852c767b4768752b5e742976872d7b90347b9034708f31
+819f59708f316b852c54742877874686874a68752b576b334c5026576b33666b3b
+766e2d555824556024757b2d86874a56603a5558244c50264e504366603356603a
+7f97537f9753597c75709081a4bfb594afb9aec4d0a3b8bcd2dee6d2dee6d2dee6
+d2dee6d2dee6d2dee6d2dee6d2dee6d2dee6dfe1e6d2dee6d2dee6dfe1e6d2dee6
+d2dee6cdd5dec0cbb8d2dee6afc0ab6b8673657c44567f3a567f3a6183454b6933
+4b6865618345567f3a3d573b3043212f3c224960325474436b8545709081a0b09f
+a3b7a492a88d6b86737e98826f8f526b8673709081a3b8bcafb9bc9fb0bb92a8b6
+aec4d0d2dee6d4dcd0d9e6eadfe1e6d9e6eadfe1e6dfe1e6dfe1e6d2dee6dfe1e6
+dfe1e6dfe1e6d9e6eadfe1e6dfe1e6d4dcd0d4dcd0afc0ab92a88d6084715e7429
+4b68654b6933496032497323547428344d1e475832778746567f3a4b6933354c31
+354c313043212f3c22354c31576b335474286b8545547428576b33576b333c5822
+576b335f7b2a41671b3c5822344d1e354c314960654758324b69333c58223d573b
+3d5f2561834592a88d81a08954605f3d573b96b7ab92a8b6cdd5ded2dee6d9e6ea
+d9e6eadfe1e6e0e6e8d4dcd0d2dee6c1c4c7c1c4c7cdd5dedfe1e6e0e6e8dfe1e6
+dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6d9e6eadfe1e6
+d9e6eadfe1e6dfe1e6dfe1e6e0e6e8e0e6e8dfe1e6d9e6eadfe1e6d2dee6e0e6e8
+dfe1e6dfe1e6e0e6e8dfe1e6d9e6eadfe1e6dfe1e6e0e6e8dfe1e6d9e6eadfe1e6
+d2dee6cdd5deaeb0bdcdd5decdd5dedcd6d6d4dcd0d4dcd0d9e6eadfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6ebeae7dfe1e6dfe1e6dcd6d6ebeae7dfe1e6dfe1e6
+dcd6d6e0e6e8dcd6d6d4dcd0d4dcd0cdd5decccdcccfc6b8cccdccc1c2aecfc6b8
+aba9a6c0b8a6b0b8a39ea08a9fa0569ea08ac1c2aeafb09e9ea88ecccdccc0b8a6
+c0b8a6c1c2aeb1b0698ea0899ea88e9e98538ea0598c98539ea88e9ea08a8b9882
+8b9882b1b069afb09e8ea08987886da0b09fcccdcccdd5deb8c1af94afa1848887
+576b334b69336274446274444960324b681e576a1f7c9053757b2d767b4792a759
+b1b0698ea0596b8545547428656c266b8545697c2b697c2b6b8545556024555824
+697c2b8ea0597c9053657c445e7429657c447787468ea0597c9053657c4487886d
+8ea0897787467c9053576b338c98539d99817c9053657c447787468b98829ea88e
+b8c3c69ea88e819f599fa0568ea089b1b069cfc6b8d8c291dcd6d6dcd6d6e0dfc6
+dcd6d6dcd6d6c1c2aec0cbb8c0b8a6dcd6d6dfe1e6c1c4c79ea88ec0cbb8cdd5de
+cdd5deaba9a6c1c4c7c1c4c7cdd5decfc6b8cccdcccccdcccfc6b8c0b197ada17f
+afb09e9e98539d998195885c9a9178ada17faea8869a917875704d95885c9d9981
+86874a9a91789d998184714475704d867c4c627444767b478b90559a9178857d67
+767b474e5043342d1f342d1f2b3322383c23394446565838857d679ea08a8b9882
+778772576b335474434b6933576a1f5e74295560243c5822697c2b819f599fa857
+8c98536b852c576a1f576a1f5e742976872d76872d76872d68752b697c2b76872d
+697c2b5e7429576a1f5e742976872d47581f344d1e2f3c222b33223f4e1e4b6933
+7b90348ea83e6b852c76872d5e7429708f31697c2b7c9053697c2b6b852c708f31
+8e9f3b8ea059576b33576a1f3f4e1e555824576a1f697c2b6b852c7b90348c9853
+8ea0599fa857697c2b697c2b6b852c77874668752b576b335e74294b693360832a
+576a1f576b337b90347c90538b9055657c4477874686874a657c446b852c5f7b2a
+7c90536f8f526b852c6b8545708f318b9055766e2d576b3356603a576b33627444
+867c4c666b3b86874a9e9853767b47666b3b4c50264e50434e4425574f264c5026
+719753657c444960654960657e988292a8b6afb9bcb8c3c6cdd5dedfe1e6d2dee6
+d2dee6cdd5dedfe1e6dfe1e6dfe1e6d2dee6dfe1e6d2dee6cdd5ded2dee6dfe1e6
+d4dcd0cdd5de8a99aba3b7a4b2d2e0a1b1706084716183454973234b6933496032
+4b6933567f3a567f3a344d1e2a343830444d3d573b547443657c44547443576a62
+70908192a88d778772576b3361834557737663747192a8b677877263747194afb9
+cdd5dedfe1e6d2dee6dfe1e6d2dee6dfe1e6dfe1e6d9e6eadfe1e6d2dee6e0e6e8
+dfe1e6dfe1e6dfe1e6d9e6eadfe1e6cdd5decdd5de9fb0bb8ea089709081547443
+344d1e4758324b69335474434973234973234b69337787465f7b2a496032354c31
+354c313d573b4960323335222a3438354c313f4e1e3f4e1e3d5f255e7429576b33
+496032475832666b3b304321383c233335222f3c222f3c22354c31344d1e344d1e
+597c756f8f526b86734960323d5f25667c747d908292a88dd4dcd0dfe1e6dfe1e6
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6cdd5ded4dcd0d2dee6dfe1e6d4dcd0dfe1e6
+dfe1e6e0e6e8e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6
+d9e6eadfe1e6d9e6eae0e6e8dfe1e6d9e6eae0e6e8dfe1e6e0e6e8d9e6eae0e6e8
+e0e6e8e0e6e8d9e6eadfe1e6d9e6eae0e6e8dfe1e6dfe1e6dfe1e6d9e6ead4dcd0
+d4dcd0e0dfc6b8c1afcdd5dec1c4c7d4dcd0dfe1e6dfe1e6d9e6eadfe1e6d2dee6
+dcd6d6dfe1e6dfe1e6d2dee6dfe1e6dcd6d6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6
+dcd6d6dfe1e6dfe1e6dfe1e6e0dfc6e0dfc6cfc6b8c1c2aedcd6d6c0b8a69ea08a
+aeb0bdb0b8a38b90558c98537f97538ea089c1c2aec0b8a69d9981cdd5deafb09e
+c0b8a6c1c2aeaea8868c98538ea0898c98538c9853767b478ea0898b90808b9882
+8b90808b90558ea08987886d7d90828ea089c1c4c7dcd6d6cdd5dea0b09f667c74
+56603a576b33778772657c445e7429657c445e74298c985386874a657c447c9053
+8b90338c985360832a576a1f62744468752b627444556024656c2649603256603a
+5f7b2a7b903476872d49601f767b47576b336b86738b98826b8545697c2b8b9055
+a1b1707787465e7429627444657c447787726274447c90537787468c98538ea089
+a3b7a4a0b09fa4bb7e8c98537f97538c985386874a767b479e98538b9882afb09e
+9ea08aaea886aea886b0b8a3afb09eafb09eafb09eaba9a69ea88ec0b8a6b0b8a3
+aba9a68b9882757c71757c71757c7175704d84888787886d87886d87886d95885c
+95885c9a91788b9882ada17fc0b197c0b197aba9a69d998195885c84714495885c
+9a9178ada17f87886d666b3b5f6156767b47757c7187886d857d679d99819a9178
+56603a4c50263335222b3322272c1f342d1f2b3322333642333642333522373e43
+3a44233f4e1e344d1e49601f5f7b2a60832a697c2b5f7b2a697c2b7b90348e9f3b
+7c90535f7b2a60832a76872d6b852c757b2d5e74296b852c697c2b6b852c656c26
+47581f3c58225e7429576a1f757b2d656c26656c2647581f30432149601f576a1f
+7b90347f97538c98538e9f3b7c9053697c2b7c90538c98536b852c5e7429697c2b
+8c983587872c576a1f657c445e742968752b5e74296b85458b90337f9753767b47
+86874a767b477787467787468c98537b9034757b2d576a1f6274445e742949601f
+5474286b852c71975376872d8b90338c98538c9853576a1f55602468752b4b681e
+697c2b6b8545556024496032354c3147581f576a1f656c26767b476b85457c9053
+86874a766e2d77874656603a68752b4c50264e44255658384c50265f6156555824
+6b86734b69333d573b3d573b4b68655374998da0b6bacdd9cdd5decdd5dedcd6d6
+d2dee6dfe1e6d2dee6cdd5ded2dee6dfe1e6d2dee6c1d4e2cdd5decdd5ded2dee6
+dfe1e6cdd5dea3b8bc7e988292a88d94afa16183455474433d573b354c313d5f25
+567f3a5474434b693341671b354c313d573b567f3a6084716f8f525474434b6865
+576b33627444597c755f7b2a5474433d573b4b6865637471597c75597c75b8c3c6
+dfe1e6d2dee6cdd5dedfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6
+d2dee6dfe1e6dfe1e6dfe1e6d2dee6c0cbb892a88db8c1af92a88d7197536f8f52
+61834554744361834581a0896f8f526b85456183456b8545547443475832354c31
+354c31344d1e3c58222b33222f3c223043214960324b69333f4e32547428547428
+344d1e2a34383a44233a4423262e352b33222b3322354c313f4e1e4b6933547428
+576b334b69333f4e32304321667c747c90536b8673a3b7a4e0e6e8dfe1e6d2dee6
+e0e6e8dcd6d6cdd5ded4dcd0d4dcd0bacdd9cccdccd2dee6cdd5dedcd6d6d2dee6
+dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6d9e6eae0e6e8
+dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6d2dee6dfe1e6e0e6e8dfe1e6dfe1e6
+dfe1e6e0e6e8e0e6e8d9e6eadfe1e6dfe1e6e0e6e8dfe1e6e0e6e8d4dcd0dfe1e6
+d2dee6cccdccc1c4c7c1c4c7cdd5dedfe1e6dfe1e6dfe1e6d4dcd0dfe1e6dfe1e6
+d4dcd0cccdccd4dcd0dfe1e6dfe1e6ebeae7dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6d4dcd0c1c4c7c1c4c7b8c1af9ea08a
+afc0ab9d99817e98828b905577874687886daba9a6c0cbb88b9882cfc6b8aea886
+c1c2aecccdccb8c1af8ea0597c90538b9882778746657c448c985392a88d8b9055
+8ea0898ea0898b98828ea0598b98828ea0899ea88ec1c4c7c0cbb88ea0898b9080
+7787464758323f4e32576b33657c447787468b90557787468ea0598b90336b8545
+7d97368c98538c985376872d6b852c5e7429576b33576a1f556024555824697c2b
+49601f576b334b681e56603a627444576b3347581f666b3b7c90537787467c9053
+8ea0898c98537787467e98827787467d90827f97537c90537b90347c905376872d
+9d9981a1b170c0cbb89ea88e77874680a03b7787466274447b903476872d86874a
+7c90538b90558ea059afb09e92a88d87886d8b98828ea0898b9882afb09eaba9a6
+75704d666b3b656c26555824373e434e504366592c75704d75704d857d67857d67
+8b90809a91789d9981b0b8a3aea8869d99819d9981867c4c75704d857d6795885c
+9e98539a91788471448b9882637471565838565838767b479d99819ea08a9ea08a
+5658383f4e32475832383c232b33223335222f3c22333522272c1f333522304321
+47581f5e742955602460832a5f7b2a5e742960832a60832a708f318c98537b9034
+576b335f7b2a697c2b697c2b7787465e7429556024576b33697c2b666b3b47581f
+2f3c222f3c22656c267d973676872d697c2b47581f344d1e3f4e1e55602460832a
+7787468e9f3b92a7597d97367b90345e74298b903368752b576a1f6b852c697c2b
+757b2d556024344d1e5f7b2a76872d86874a6b85457b90347c90535e74294b6933
+656c26656c267787468b90337c905386874a767b47697c2b4b681e4b6933576b33
+49601f4973237c90538c9853697c2b6b85458c9853576b335e7429547428576b33
+6b854549601f49601f47581f5558244b69335e74297d97368c98539fa8578c9853
+778746666b3b766e2d576b33666033666b3b77874668752b666033767b47555824
+6f8f524b69333d5f7a4b6865819fb7576a627d98b1afb9bcbacdd9cdd5decdd5de
+d2dee6cdd5dedfe1e6d2dee6d2dee6d2dee6dfe1e6afb9bc9fb0bbafb9bcd2dee6
+d2dee6dcd6d6c0cbb87090816f8f52719753567f3a4960324b69333d5f253d573b
+4973233d5f25354c3130444d3d573b4b69337197536b85454973233d5f2541671b
+547443597c75567f3a576b33597c757090817d90828da0b6aec4d08da0b69fb0bb
+cccdcc9fb0bbb8c3c6dfe1e6d2dee6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6c0cbb88ea089618345618345567f3a567f3a
+6084714b6933657c447e9882819f594973236b8545567f3a4b69333d5f25354c31
+3043214960322f3c222e3c444960326b85455f7b2a41671b3c58224b681e627444
+344d1e3043213d5f254b69333d5f25344d1e3c58224b69335f7b2a6183454b6933
+3d5f25496032304321354c3181a0896f8f528ea089c5dae4d4dcd0dfe1e6d9e6ea
+d9e6eadfe1e6cccdccb8c3c6cdd5dec1c4c7afb9bcc1c4c7cdd5dedfe1e6cccdcc
+d9e6eae0e6e8d9e6eadfe1e6d9e6eadfe1e6e0e6e8e0e6e8dfe1e6e0e6e8d9e6ea
+dfe1e6e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6d9e6eae0e6e8e0e6e8
+dfe1e6dfe1e6dfe1e6e0e6e8d9e6ead9e6eadfe1e6dfe1e6dfe1e6d2dee6dfe1e6
+d2dee6d4dcd0a3b7a4bacdd9cccdcccdd5decccdcccccdccdfe1e6cdd5dedfe1e6
+d2dee6cdd5dedfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6ebeae7dfe1e6ebeae7dcd6d6cccdccd3cea2c1c4c7b8c1af9ea88e
+afb09e767b478c9853778746757c7187886d8b9080aea886aba9a6c0b8a6aea886
+b0b8a3c1c2aeaea8868c9853657c447c90537787468b98828b90808b98827c9053
+a0b09fa1b1708b98828b98828b98828ea08987886d7787729ea88e92a88d7c9053
+7c9053576b333043214c5026576b3392a7598ea83e7b90347787468c9853778746
+819f5992a75992a7598e9f3b7f97538ea05976872d697c2b657c447c905368752b
+576b33576a1f56603a3f4e1e5e74295f7b2a6274447d90828ea0597c9053778746
+8ea08992a7597787466f8f52a0b09fa3b7a48b98827f97537c90537c9053697c2b
+7c90538b90558ea059aea8868c985387872c76872d7787468c98537d97368b9033
+5f7b2a697c2b62744463747156603a576b3347581f576b33496065475832565838
+304321576b33666b3b576b33383c233a442347583256603a56603a767b479d9981
+b8c1afafb9bcaeb0bdc0b8a6c0b1979a9178a4895475704d66592c9f9154ada17f
+ab915875704d5658387d908254605f757c71757c71767b47767b474e442575704d
+5558243a442356603a3a44232f3c223a4423475832304321344d1e49601f4b681e
+5e742976872d656c265f7b2a5e74295f7b2a5f7b2a6b852c80a03b8e9f3b697c2b
+576a1f5e74295e7429697c2b757b2d656c2655602447581f7c905368752b757b2d
+3f4e1e47581f68752b8ea0598c983568752b47581f5e7429697c2b8b903376872d
+576a1f5e7429657c445e74297d97367b903476872d6b852c7b9034697c2b556024
+766e2d55602449601f6f8f527d97368c98355e74297b90346b852c77874660832a
+576a1f576b3377874676872d7787465f7b2a5e74297787465e74295f7b2a3f4e1e
+3f4e1e5f7b2a6b8545576b33547428657c44657c44657c44576a1f5f7b2a576a1f
+576a1f55602468752b92a759757b2d4b681e7787467b903476872d68752b76872d
+86874a767b47666b3b556024576a1f697c2b86874a8b903368752b767b47766e2d
+4b69334b69334b686557737694afb97090816b86737e98828a99abb8c3c6cdd5de
+dfe1e6d2dee6d2dee6dfe1e6d2dee6dfe1e6d9e6eac5dae4bacdd9bacdd9d4dcd0
+dfe1e6d2dee6aec4d081a0897090814b6933597c75567f3a4b686541671b4b6933
+4b69333043212f3c22304321496032567f3a7197536183454b68653d5f253d573b
+4b6933567f3a6183454b69335773769ea9b4b8c3c692a8b692a88d7d98b17e9882
+75889b9fb0bbcdd5dedfe1e6d4dcd0d2dee6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6
+d9e6eadfe1e6dfe1e6d9e6ead9e6ead4dcd081a089667c745474434b69335f7b2a
+4b6933576b33547428547443547443547443657c444960324960324b6933354c31
+3d573b354c312b33222a34383a4423547428576b334b6933657c4454742860832a
+6b85455f7b2a60832a557f2241671b41671b6b854560832a49601f344d1e3f4e32
+3f4e323c58225474435f7b2a6f8f5260832a92a88dd4dcd0cdd5deb8c3c6dfe1e6
+e0e6e8d9e6ead2dee6aeb0bd9ea9b4b8c3c6afb9bcb8c3c6cdd5ded2dee6bacdd9
+dfe1e6d2dee6dfe1e6dfe1e6dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6
+dfe1e6e0e6e8d9e6eae0e6e8e0e6e8d4dcd0e0e6e8dfe1e6dfe1e6e0e6e8e0e6e8
+e0e6e8e0e6e8d4dcd0dfe1e6dfe1e6d4dcd0e0e6e8dfe1e6dfe1e6dfe1e6d2dee6
+b8c1afa3b7a49ea88ea0b09f92a88d92a8b6b8c3c6d2dee6dfe1e6dfe1e6d4dcd0
+dcd6d6cdd5ded2dee6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6ebeae7dfe1e6e0dfc6
+ebeae7dfe1e6e0dfc6dfe1e6dfe1e6dcd6d6cfc6b8cccdccc1c2aeafb09ec0b8a6
+b0b8a37787728b9882778746767b4786874a8b98829ea08aa0b09fb0b86cb0b8a3
+b1b069b8c1afb0b8a38b9882767b477787467787469ea88e7787728b9882778746
+6274449ea08a9fa0569ea08aa1b1707e98827f97537787467c9053778746778746
+7787465560243f4e323f4e1e3f4e328c98537b90348b90338b90557787468b9033
+8e9f3b8c98538c9853778746576a1f576b336274447b903476872d68752b576a1f
+576a1f4758323a4423666b3b627444697c2b767b477d90828b9882697c2b778746
+92a88d7d90825f7b2a6274449ea88e8ea0899ea88e7c90538c98538b98828b9055
+7c9053697c2b7787467b90348c98357b90346b852c6274447d97367b90347b9034
+8b903380a03b697c2b49601f3f4e325e7429576a1f576b337787463f4e32475832
+3f4e1e576b33778746867c4c4e442556603a637471565838757c718b9882afb9bc
+dcd6d6cfc6b8afb9bcafb09e9ea08a9a917886874a867c4c9a91789a9178ab9158
+95885c565838333642383c234e5043757c71857d6795885c75704d4e5043475832
+5558243f4e1e47581f576a1f344d1e4758324b69332b33223f4e1e697c2b6b852c
+757b2d7d9736697c2b4b681e697c2b6b852c708f317b90348c985386874a68752b
+55602468752b68752b6b852c6b852c6b852c55602455602476872d76872d68752b
+55602468752b68752b5e7429757b2d76872d697c2b7d97368e9f3b7b90348b9033
+556024344d1e576b335f7b2a7c9053757b2d757b2d5e7429576a1f697c2b576b33
+576a1f656c265e74296b852c76872d697c2b6b852c7c90538b90337b903468752b
+68752b576b336b852c7787467c90536b85455e7429697c2b6b85454b6933496032
+3c58224b6933547428657c445f7b2a5e74295e7429657c445f7b2a5f7b2a576b33
+475832496032697c2b697c2b697c2b576b333f4e32576a1f576a1f68752b778746
+697c2b656c26767b477787467c905368752b7787468b905576872d86874a778746
+4658644b6933597c757090817d98b17e98825773767e988294afa1cccdccd2dee6
+d2dee6cdd5ded2dee6d2dee6dfe1e6d2dee6cdd5deb8c3c6afc0abbacdd9d2dee6
+dcd6d6dfe1e6bacdd992a88d719753567f3a567f3a547443344d1e30444d2e3c44
+354c31354c313d573b5474436183456f8f52567f3a3d5f253d5f253d4f563d573b
+667c746f8f525474433d573b6b867394afa19fb0bb667c74577376577376576a62
+81a089d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6d4dcd0e0e6e8dfe1e6
+dfe1e6dfe1e6d2dee6dfe1e6d2dee6d4dcd081a0895f7b2a496032547443547443
+576b33627444618345657c444b693347581f6b85456183456274443d5f253f4e32
+3944462f3c222f3c2230432130432160832a77874649601f41671b576b334b6933
+4b681e496032576b33497323576b335474284b69333f4e1e3f4e323043212f3c22
+3043214960326b8545708f316f8f524b693392a88dbacdd98b919fc1c4c7e0e6e8
+d2dee6e0e6e8d4dcd0cdd5deb8c3c6c0cbb89ea9b4cccdcccccdccc0cbb8afb9bc
+c0cbb8d2dee6e0e6e8e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6d9e6eae0e6e8e0e6e8
+dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6e0e6e8d9e6eadfe1e6dfe1e6dfe1e6
+e0e6e8e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6c0cbb8
+8a99ab6b86736374718b90807e98828da0b6d4dcd0dfe1e6dfe1e6dcd6d6cccdcc
+cccdcccccdccdcd6d6dfe1e6d2dee6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6cccdccb8c1afcfc6b8cccdccafb09ec1c2ae
+b0b8a38b988292a88da0b09f8c98538b98828c9853afb09ea1b1709ea08ac0b8a6
+afb09ea0b09fb1b0697f97537787467d90827c9053757c71757c717d9082627444
+657c449ea08ac1c2ae9d99819ea08a767b478c98537c90538ea0598b90558c9853
+778746767b476b8545576a1f4c50267b90348ea0598ea0598ea05992a7598ea059
+7b90348c9853757b2d5e7429576b33576b334b681e657c447787468b9033757b2d
+5560243043213f4e1e656c26697c2b77874668752b4c5026667c745f7b2a778746
+95af7a8b90558b90557c90539d9981576a627787727787468b90558b9882b0b8a3
+95af7a8ea0897c905376872d7b903487872c5e74294b681e697c2b7b9034708f31
+76872d6b852c6b852c6b852c576a1f7787467b90347b90347e9882666c5e767b47
+778772767b4786874a778746767b47757c71848887666c5eaba9a6aba9a6aeb0bd
+dcd6d6cccdccc0b8a69da1ab95885c95885c847144666033867c4c95885c867c4c
+74643e767b474e5043333522666c5e8b90808b98829a9178767b474e44253a4423
+666b3b576b3347581f656c2647583256603a47581f4c50263f4e1e576b33697c2b
+757b2d8c983576872d5e7429656c266b852c7b90348e9f3b8c98538b903386874a
+767b47766e2d86874a9e98537c90535e742949601f49601f5e7429656c2649601f
+47581f60832a7b90346b852c76872d76872d697c2b8b90338e9f3b7b9034778746
+47581f41671b557f2249732376872d697c2b68752b47583247581f47581f4b681e
+6274448b90556b852c576a1f6b852c76872d708f3176872d7b9034697c2b576a1f
+5f7b2a5f7b2a54742860832a6b852c5f7b2a6b85455f7b2a5f7b2a4973234b681e
+3f4e1e4b681e6b8545697c2b697c2b7b9034778746656c266274446b8545576b33
+49601f657c447b90348471444758325560243a442355602449601f5e7429576a1f
+68752b697c2b757b2d697c2b697c2b697c2b867c4c767b478b90338b9055757b2d
+3d4f56567f3a4b686575889b597c75608471597c7592a88dc1d4e2d2dee6d2dee6
+dcd6d6dfe1e6d2dee6cdd5ded4dcd0d4dcd0bacdd97e988257737692a8b6cdd5de
+dfe1e6cdd5ded4dcd081a0896f8f52618345567f3a5474433d5f25344d1e30444d
+2f3c2230444d576b33567f3a6183454b6933354c31354c313d573b3c582230444d
+354c31567f3a576b33354c313f4e3249606554605f4960653d573b6b8673aec4d0
+cdd5dedfe1e6dfe1e6d2dee6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6
+e0e6e8d2dee6dfe1e6cdd5decdd5deb8c1afa3b8bc6b85454b6933657c443c5822
+354c31576b335e7429576b33496032496032576a1f7787465f7b2a5e7429344d1e
+2f3c222f3c223c58225474435f7b2a5f7b2a708f31576b334960323f4e1e354c31
+3f4e32344d1e576b334960323f4e32344d1e304321373e43344d1e2b3322354c31
+576b336183455f7b2a6b8545576b334960327d9082576a62757c71cdd5dedfe1e6
+c1c4c7dcd6d6dfe1e6dfe1e6b8c1afb8c3c6afc0abc1d4e2d2dee6b8c3c6afc0ab
+b8c3c6cdd5ded9e6eadfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6
+e0e6e8e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d9e6eae0e6e8
+dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d4dcd0
+d4dcd09ea88e7d90829ea9b48ea089c0cbb8d2dee6dfe1e6d2dee6d4dcd0bacdd9
+c1c4c7bacdd9d4dcd0cdd5dedcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6
+ebeae7dfe1e6dfe1e6dcd6d6e0dfc6cccdccc0b8a6afc0abdcd6d6afb09eb0b8a3
+c1c2ae9ea88eb0b8a38ea0898b90808ea0599ea88e9d99818ea0598c9853afb09e
+b8c1afaba9a68c98538b90558b9080767b478ea089778746657c447787726b8545
+6b8673b0b8a3b8c1af9ea08a9d99818b988286874a8b90338c98538ea0598c9853
+86874a77874668752b576b335560247787468e9f3b80a03b8c98358c98538ea059
+9fa8578ea0595e7429576a1f5f7b2a76872d556024576b33576a1f7c90538c9853
+576a1f496032576b33657c44767b478b9055697c2b5560247c90537c90537c9053
+7787467787728c98538b98828b9882757c718b90807c90538c98537c90538b9882
+b0b8a3cccdccc1c2ae80a03b8c98357f97536b852c697c2b47581f5f7b2a697c2b
+7787466b852c778746778746657c446274445560247787468b90807c9053afb09e
+afb09e8b905586874a95885c8c9853757c71565838637471c1c2aeaeb0bd9da1ab
+afb9bc84888775704d75704d75704d767b47867c4c565838767b4775704d847144
+8471449a91789f9154565838767b4787886d9d998187886d857d67565838383c23
+555824576a1f49601f5e7429576a1f767b47576a1f4c50263f4e1e555824656c26
+656c2668752b697c2b576a1f47581f4b681e7d97368ea83ea1af4e8c985387872c
+8b905586874a86874a8ea059757b2d60832a576b33576a1f47581f697c2b5e7429
+5f7b2a76872d708f3176872d8c9835697c2b778746697c2b697c2b47581f3a4423
+49601f656c2680a03b708f316b8545778746576a1f4b681e576b3349601f4c5026
+3f4e1e47581f9d99816b85457b90347787467b90347b90347b903476872d576a1f
+5f7b2a6b852c5f7b2a5f7b2a5474285f7b2a5e74294973235f7b2a4b693349601f
+4b681e576b336b85458c9853778746767b4768752b576b33576a1f576b335f7b2a
+4b681e4b681e7787465e74293f4e1e304321576a1f767b47496032344d1e666b3b
+62744455602455582468752b576b3375704d666b3b666b3b7787467c9053778746
+496032657c44496065597c75547443608471a3b8bcc0cbb8d2dee6d2dee6dcd6d6
+d2dee6cdd5dedfe1e6dcd6d6cdd5decccdccaec4d092a88d709081a4bfb5aec4d0
+c0cbb8cdd5decdd5de81a0896f8f52719753567f3a41671b344d593c58222f3c22
+2f3c22354c313d5f255474435474433c5822304321304321547443547443496032
+4b68655773764b69334b68653f4e323d5f25496065608471709081a4bfb5afb9bc
+cdd5dedfe1e6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6d9e6eadfe1e6dfe1e6dfe1e6
+dfe1e6d4dcd0c0cbb8c5dae4afc0abc1d4e292a88d6f8f5241671b5474433d5f25
+3d573b3c58224b69334b69333d5f254758324960327c90536b8545657c44354c31
+2f3c22354c31475832344d1e3c58224b6933556024666b3b3f4e322b3322344d1e
+4c50263f4e1e56603a3a44233a44232f3c223043212f3c224b69334b69335f7b2a
+41671b547428567f3a5474284960324b69333d5f253d4f56aeb0bdd9e6eac0cbb8
+c1d4e2c0cbb8cccdccd2dee6c1c2ae9ea9b4c0cbb8cccdccb8c3c692a88da3b7a4
+a3b8bccccdccdcd6d6d9e6eadfe1e6e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6e0e6e8
+dfe1e6e0e6e8e0e6e8e0e6e8e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6
+e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d9e6ead2dee6dfe1e6dfe1e6
+d4dcd0afc0ab8ea089bacdd9cdd5dec1c4c7d2dee6dcd6d6d2dee6cdd5decdd5de
+afb09eaeb0bdb8c1afcccdccdfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dcd6d6dfe1e6ebeae7dfe1e6dcd6d6d4dcd0d4dcd0d4dcd0cccdcc9da1abcfc6b8
+c1c2ae8b919f9ea08aafc0ab8b98829ea88eb0b8a386874a8c98537787729ea08a
+afb09e9d99818ea0597d90829ea88e8b908087886d576b336b86736274448b9080
+87886d9ea88ec0b8a69ea88e778746778746757c717c9053767b477787467c9053
+8b905577874668752b576b333f4e1e6b85458c98537b90347b903476872d8c9853
+7b90348c98537b903476872d7787467b90345e74295e7429757b2d8ea0598b9033
+7787465558245558244b6933576a1f7787467787467787468ea0898c98536f8f52
+7c90538b98828b9055a1b1707787727c90537787467c90537c90538c98537e9882
+8ea089cdd5decccdcca1b1708c98539ea88e6b8545576a1f344d1e5f7b2a5e7429
+76872d60832a5e74298b98828c985387886d4758327787729ea88e8b98829e9853
+9ea88eada17f8b905586874a75704d666c5e5f6156757c719ea88e75704d565838
+5f61565f6156757c719d99819a91788b9080aea8868b9080867c4c74643e766e2d
+75704d75704d9a91789d99819ea08ac0b8a6ada17f757c7174643e74643e383c23
+3a44234758324b681e54742860832a7d973676872d576a1f7b903477874668752b
+656c2647581f656c2655602447581f68752b6b852c8ea059a1af4ea1a73c8c9853
+b2a053757b2d8c985376872d55602476872d47581f55582447581f556024697c2b
+76872d76872d7b903468752b76872d60832a68752b5e7429576b332f3c22344d1e
+576a1f576a1f6b852c7d9736656c2654742847581f3f4e1e3c58225560243a4423
+30432147581f4b681e576a1f576a1f576b3377874676872d6b852c656c2649601f
+5e7429576a1f4b681e4b681e4b681e49601f49601f344d1e60832a54742849601f
+4b681e5e7429576b33656c26757b2d778746767b47576b335474283d5f254b6933
+4b681e567f3a547428547428496032344d1e49601f576a1f49601f47581f47581f
+556024576a1f55602462744449601f55602447581f556024697c2b657c44576a1f
+7c90533d5f253d573b4b68656f8f526b86738da0b6cccdccd2dee6cdd5ded2dee6
+d2dee6d2dee6cdd5decccdccc1c4c7b8c3c681a089597c756b867394afb9afb9bc
+bacdd9b0b8a3c5dae481a0896084715474435474434b69333c58223d573b304321
+354c31354c3141671b4b69334b69334960324960324960654b6933496032354c31
+7787727e9882667c747e98826084716084717d98b192a8b6819fb792a8b6afb9bc
+bacdd9cccdccd2dee6dfe1e6d4dcd0d2dee6dfe1e6dfe1e6d4dcd0dfe1e6d2dee6
+dfe1e6dfe1e6afc0abb8c3c69ea9b48ea0897e9882657c446183455474433d5f25
+344d1e4758324b6933657c44657c443d5f255e74296b854560832a4b6933354c31
+2f3c223d5f25496032354c313f4e32354c312f3c222f3c22354c312b33222b3322
+2a34382f3c22344d1e4b69335474285f7b2a5e74295f7b2a60832a5f7b2a557f22
+49601f4b69336183453d573b354c313d573b354c31607590bacdd9afb9bc8ea089
+cdd5deb8c3c6a0b09fcdd5dea3b7a47d9082afb9bc9ea88e81a0898ea08981a089
+7d908292a8b6d2dee6dfe1e6e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8d4dcd0
+e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6ebeae7dfe1e6e0e6e8
+dfe1e6e0e6e8e0e6e8d9e6ead9e6ead9e6eacdd5decccdcccccdccd4dcd0dfe1e6
+cccdcca0b09f6b86739ea9b4afb9bcafc0abcccdccd4dcd0dfe1e6d4dcd0cccdcc
+8b90809ea9b4aeb0bdcdd5ded2dee6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6cccdccb0b8a3c1c4c7
+afb09e9ea08a9ea9b49ea08a9ea88e8b98828b98827c9053767b477787468b9882
+87886db1b0698b98827c9053a4bb7e8ea0896b8673576a628b9882657c44757c71
+9ea08a9ea08ab8c1af9a9178767b474960327787468b9882778772627444778746
+7d9082627444576b33627444576a1f7787465e74297c90537c905376872d76872d
+7c90537f97538b90338c98537b9034697c2b68752b767b478b903386874a76872d
+77874668752b697c2b757b2d344d1e657c4460832a7c9053a1b1708b905576872d
+81a089778746778772afc0ab9ea88e7c90537f97537e98828b9882a1b170b0b8a3
+8ea059afc0abcccdccc1c2aeafb09eb8c1af657c44344d1e656c266b852c557f22
+6f8f527f9753657c44778746b8c3c6b8c1af8488879d99817787728b9882767b47
+767b478b905584714486874a766e2d56603a5f61565f61565658384e50434e5043
+666c5e9da1abaeb0bdc0b8a6aba9a6afb09ec1c2ae9a9178867c4c66592c74643e
+84714486874a767b47aea886afb09eafb09eada17faea8868b9055767b474e4425
+333522354c31576a1f344d1e49601f5f7b2a76872d6b852c7b90348c9835708f31
+76872d757b2d576a1f576a1f68752b7b90347b90349fa8578ea05987872c8c9853
+8b9055757b2d8b903376872d49603247581f3043214c50264c5026576a1f5f7b2a
+697c2b7b90348ea83e8ea05980a03b7f97538c9853697c2b47581f3f4e1e49601f
+60832a6b85456b85455e74293a44233f4e1e49601f344d1e556024576a1f2f3c22
+3a44234b681e576a1f576b3355602449601f576a1f576a1f55582449601f5e7429
+697c2b657c44576b336274445e7429576a1f3c582254742876872d547428576a1f
+618345576a1f3a4423657c44618345767b47576a1f49601f4b69334b6933547428
+5f7b2a576a1f5f7b2a5e74294b693349732376872d656c26576b33576a1f778746
+7787467c90537c90536b8545576b33656c2647583268752b656c26555824766e2d
+7c90534758324960326b86736f8f527197537d9082afb9bccdd5decdd5dedcd6d6
+dfe1e6cdd5decdd5deb8c3c6a3b8bcb8c1afa3b7a46183457d9082a0b09fcccdcc
+b8c3c68da0b6afc0abafc0ab7197535474434b69335474434b6933354c3130444d
+354c313d573b618345547443354c313043213d573b547443344d1e3d573b3d5f25
+577376496032597c756f8f52496032608471819fb77a91a87a91a8aec4d0a3b8bc
+7d9082aeb0bddfe1e6dfe1e6dfe1e6dfe1e6dfe1e6d2dee6dfe1e6e0e6e8dfe1e6
+d2dee6dfe1e6cccdcc9fb0bbc0cbb87e98827787466183456f8f52567f3a5f7b2a
+567f3a496032576b335e742947581f47581f697c2b7c9053567f3a4b6933497323
+576b335f7b2a4b69333f4e1e4758323f4e1e496032556024576b3347581f3f4e1e
+344d1e2f3c223f4e3247581f4b69334b681e547428576b33567f3a4960323c5822
+4758323f4e322f3c222f3c222e3c443043218a99abafc0aba3b7a47d908292a88d
+d2dee6d2dee6b8c3c67d90827e98826b86737787727090816f8f526b8673667c74
+666c5eafb9bcd4dcd0e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6
+dfe1e6e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6e0e6e8e0e6e8
+e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6d2dee6c1c4c79ea9b48ea089bacdd9
+d2dee6a0b09f92a88da0b09f9ea08a81a0899da1abafb9bcafb9bcbacdd9cdd5de
+b8c1afb8c1afb8c1afcccdccdfe1e6cdd5decdd5dedfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6e0dfc6dcd6d6dcd6d6d4dcd0cccdcc
+a0b09f9ea88ec1c4c7c1c4c79ea88e7c90536274447787727787466b854587886d
+9ea88ec1c2aeafb09e8ea0899ea08a92a88d7c90537d9082778772576a62657c44
+8b9882c1c2aeb0b8a38b9882697c2b576b334758327787468b98827e98827c9053
+8ea0898b98829ea88e6b85456b85457c90538ea0598c98538ea0598c983576872d
+7b90346b852c7c905376872d8b90557c90535e74296b852c778746656c2668752b
+6b8545757b2d8c9853778746576a1f666b3b657c44767b476b86737787468ea059
+7f97537c90538ea089b8c1afafbf777c90539ea88ec0cbb8a3b7a4a0b09f9ea08a
+afc0abb8c1afc1c4c7c1c4c7a0b09f9fa857778746547443657c4476872d7b9034
+95af7a92a88d627444657c44cccdccc0cbb89ea08a7787723f4e32767b47857d67
+867c4c867c4c555824766e2d66592c47583266592c574f265f6156666c5e8b9882
+c1c4c7cccdcccccdcccfc6b8aba9a6aba9a69d99819a91789a9178766e2d75704d
+9a91789f915486874a9e9853afb09e9e9853ada17fc0b8a69e985375704d4c5026
+3a4423383c234e44253f4e1e383c2347581f5f7b2a76872d76872d76872d60832a
+76872d7d973676872d76872d7b90347b90348c98359fa85776872d6b852c8e9f3b
+8b9033867c4c76872d68752b6b852c47581f4b681e5e742955602433352247581f
+76872d76872d80a03b8e9f3b92a75980a03b8c9853697c2b4c502649601f49601f
+6b852c5e742947581f47581f3043213c582247581f2f3c223f4e1e3f4e1e344d1e
+3a44233c5822547428576b337b90345e74295e74297b9034576b3347581f547428
+4b681e7d9736778746547428576b3360832a6f8f526b852c80a03b5e74294b681e
+49601f4b6933576a1f5e7429576b335e74294960324b681e49601f344d1e3d5f25
+4b681e656c265e74296b852c8c985360832a5560243f4e1e3f4e1e4b681e656c26
+766e2d68752b867c4c86874a68752b767b476660335560245e742956603a627444
+597c753d5f25547443657c44819f597f97537090817a91a8afb9bccdd5ded2dee6
+dfe1e6cdd5dec1d4e2a3b7a49ea88e92a88d95af7a92a88d95af7ab8c3c6b0b8a3
+b8c3c6b0cbdc81a0896b86736b8673567f3a497323618345497323354c31354c31
+2f3c222e3c44567f3a497323354c313d573b344d1e5474434b69334960654b6933
+567f3a6183456183455474434b6933778772a3b8bc81a089667c747e9882667c74
+7d9082c1d4e2d2dee6dfe1e6d2dee6dfe1e6dfe1e6e0e6e8e0e6e8d4dcd0dfe1e6
+dfe1e6dfe1e6c0cbb892a8b6a3b7a481a0896b85455f7b2a618345547428618345
+567f3a6b8545627444627444657c44767b478b90557787465f7b2a4b6933627444
+54742860832a496032576b335f7b2a5f7b2a5f7b2a60832a547428627444547428
+576b3354742860832a5f7b2a4b681e496032496032304321354c31344d1e304321
+2f3c22333522272c1f2b33222b33223c586f92a88d7090817787468b9882c0cbb8
+cdd5decccdccc5dae4a3b8bc81a0897c90537090817e988292a88d92a88d94afa1
+9ea88ea3b8bcc1c4c7d4dcd0dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6e0e6e8e0e6e8
+e0e6e8d4dcd0dfe1e6e0e6e8dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6
+d9e6eadfe1e6dfe1e6dfe1e6dfe1e6e0e6e8d4dcd0cdd5dec1c2ae81a089778772
+afc0abafb9bca0b09f92a88d81a08981a089667c747e9882c0b8a6cdd5dec0cbb8
+cdd5deafb9bcbacdd9d2dee6d2dee6afb9bccdd5dedfe1e6dfe1e6dfe1e6e0e6e8
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dcd6d6d4dcd0afb9bc
+9da1ab9ea08aafb9bcb8c1af9ea88e8b98826b86736b8545666b3b7787727c9053
+7d90829d99819ea88e8b90809ea88e8b908087886d8c9853778772667c74627444
+778772afb09e9ea08a8b9882757c71576b33576b3349601f576b336374716b8545
+8b90558c9853a0b09f87886d7787727f97539fa8578e9f3b8ea0598b9033697c2b
+6b852c697c2b6b852c7c90537b903476872d5e742968752b767b47666033555824
+5e7429657c44697c2b767b47475832383c234758325e74296f8f527c90536f8f52
+5474437f97538b9882afc0ab9ea88e657c448b9080b8c1afa0b09f8ea089afc0ab
+afc0abb0b8a3afb09ec0b1979d99817c90538c98355e7429576b334b69336b8545
+a0b09f7c90535f7b2a778746b0b8a3b8c1af9ea08a666b3b7c90538ea0599fa056
+8b905587886d666b3b666033574f263a442356603a857d6787886da0b09fcccdcc
+d4dcd0dcd6d6cdd5decdd5dec0b8a69d99819ea08a857d67767b4775704d9f9154
+9ea08ab1b0698c985386874a778746867c4c9e9853ada17f9a917886874a68752b
+5e7429576a1f3a4423556024576a1f4b681e6b852c7b90347b90347b90347b9034
+7b903476872d6b852c7d973676872d76872d8b90339fa0568b90336b85457d9736
+7b903486874a5e742949601f7b9034697c2b6b852c4c50262f3c222b33225e7429
+757b2d4c50267c90536b852c6b852c7197328ea0597d9736708f315f7b2a60832a
+80a03b697c2b3c582260832a76872d49601f344d1e3043212f3c222f3c222f3c22
+3f4e1e30432149601f4973236b852c5e74295f7b2a5e74295474285474285e7429
+557f225f7b2a708f31697c2b4b681e5e7429708f31708f31697c2b576b33778746
+5e742949601f6b85457787465e74295f7b2a497323576a1f8c9853656c263f4e32
+697c2b656c263f4e1e49601f68752b76872d556024666b3b697c2b68752b666033
+666b3b666033576b3368752b576a1f47581f576b33627444576a1f5560243a4423
+4b69334b69335474436084716f8f52608471608471597c758da0b6c1d4e2cdd5de
+dcd6d6cccdccc1c4c795af7aa0b09f9fa05695af7a8c98536b867392a88d7e9882
+92a88d94afa194afa1567f3a4b693361834560847141671b567f3a344d1e2e3c44
+2a34382f3c225474433d5f253d573b3d5f25567f3a657c4461834541671b3d5f25
+4960326b85454b69334b693354744354744354605f5474434b68653d5f25627d99
+b8c3c6c1c4c7d2dee6dfe1e6dfe1e6dfe1e6dfe1e6d9e6eadfe1e6dfe1e6dfe1e6
+d2dee6dfe1e6b8c3c67197536b867394afa17e98825474436b85455f7b2a576b33
+547428657c444b69334b693356603a4b6933627444697c2b7787465f7b2a496032
+778746567f3a4b69334960324b69335e7429496032496032354c312f3c222f3c22
+3335223f4e324b69335474285e74293d5f253f4e1e3043212f3c22304321383c23
+262e35262e352b33222a34383d573b637471597c75567f3a657c448ea089bacdd9
+a0b09fa3b7a4d4dcd0cccdccbacdd992a88d7787728ea0898ea0898ea0898ea089
+a0b09f9da1abb8c3c6d2dee6dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6
+e0e6e8d4dcd0e0e6e8e0e6e8e0e6e8dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8
+dfe1e6e0e6e8d4dcd0dfe1e6dfe1e6dfe1e6dfe1e6cdd5decccdcc778746667c74
+657c448ea0898ea089657c4462744441671b5474438ea089cdd5dec0cbb8a3b7a4
+afc0abc0b8a6cdd5decdd5dec0b8a6b0b8a3dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6
+dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dcd6d6cccdccafb9bc
+8ea0898ea0899ea9b4b0b8a39fa8578c98538b9882618345576a62627444767b47
+657c44697c2b778772afb09e9ea88e8b98829da1ab87886d757c71576a62667c74
+a0b09f9da1ab9ea08a8b98827c90536274446274445558245e7429475832496032
+767b476b8545767b477787468b9055a1b1709fa85786874a8c98358ea0598b9033
+778746576b33656c267787467b90346b852c778746576a1f576b333f4e32576b33
+7787465e742968752b576a1f3a4423383c235658384c50265e7429778746667c74
+6b854577874677874695af7a7c90536274446b854592a88d8b90807d90829ea88e
+b8c3c6b0b8a392a88d8b903386874a68752b6b852c5e74293f4e1e3f4e323a4423
+627444697c2b576b335e7429697c2b7c90537b903486874a7c905376872d86874a
+9e9853666b3b766e2d666c5e66603354605f6b8673b0b8a3afb9bccccdccdcd6d6
+dfe1e6dfe1e6dfe1e6dcd6d6c1c2ae9d9981666b3b666b3b86874a767b479f9154
+9a91789e9853697c2b7787468b90559e98539a91789e98538b90556b85456b8545
+5f7b2a6b852c7b90347d97366b852c6b852c7b9034719732708f318c98358c9835
+76872d76872d708f3176872d708f317b90348e9f3b8c98538c985376872d76872d
+68752b757b2d76872d5f7b2a708f315e74295560242b3322272c1f2f3c22576a1f
+3d5f25576a1f6b852c7b903460832a6b852c708f317f9753719732708f31719732
+80a03b7d97366b852c80a03b80a03b708f313f4e1e304321344d1e304321344d1e
+344d1e49601f55602441671b5e7429697c2b697c2b8c985376872d6b852c708f31
+7d973676872d7d97365e74294973235f7b2a76872d6b8545576a1f60832a697c2b
+7b90346b85455e7429576b336b854541671b5f7b2a6b852c8b903366592c3a4423
+475832576a1f576a1f77874668752b666b3b666b3b556024867c4c5560244c5026
+3f4e324c5026475832576b33576b333f4e1e49603249601f576b3347581f3a4423
+3d573b496032547443597c754960323d5f255474433d5f7a8da0b6cdd5decccdcc
+cccdccc1c4c7a0b09fa0b09f92a88d8ea0597f97536f8f526f8f526f8f527c9053
+657c446b867396b7ab6b86733d5f2541671b608471547443567f3a4b6933304321
+2b33222a34383f4e322a34382e3c445474436b8545657c44567f3a576b33475832
+30444d3f4e323d5f256274444b69334b69333d573b3f4e323d4f564b6865608471
+8b919fbacdd9dfe1e6d9e6eadfe1e6dfe1e6dfe1e6d9e6ead9e6ead2dee6dfe1e6
+dfe1e6e0dfc6b2d2e081a0896b85456274447f9753657c44567f3a547428567f3a
+657c4441671b3c5822576b33344d1e3a4423627444496032657c444b6933344d1e
+6274445f7b2a576b333d5f254b6933576b33344d1e2b33222b3322262e35342d1f
+272c1f2b33224758322f3c223a4423383c23475832475832354c312a3438272c1f
+2b33222b33222f3c22304321354c314b6933547443567f3a6b8673afc0aba0b09f
+7d908292a88da0b09fb8c3c692a88d92a88d6f8f526f8f526b86736b8673608471
+6b867381a089bacdd9d4dcd0d2dee6e0e6e8dfe1e6ebeae7e0e6e8e0e6e8e0e6e8
+dcd6d6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8d2dee6e0e6e8dfe1e6dfe1e6
+dfe1e6e0e6e8e0e6e8dfe1e6dfe1e6e0e6e8e0dfc6d4dcd0aec4d0afc0ab92a88d
+4b6933576b338b9080576b334b69336b85457d90828ea089afc0ab92a88d9ea9b4
+8b9882a3b7a4a3b7a49ea08a8da0b6cccdccdfe1e6d2dee6dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dcd6d6cdd5dec1c2ae
+7d90828b90809ea88ea1b1709ea88e95af7a8ea0897c9053627444627444576b33
+767b4768752b6660338b9882afb09e8b988292a88d6b8673657c44757c71afc0ab
+b8c1afafb09e9d99819ea08aa0b09f6b85454960322f3c22475832344d1e304321
+7787468ea0598c98537b903455602486874a7b90347c90538ea059757b2d7f9753
+8b903368752b5e7429697c2b778746697c2b76872d6b8545656c263f4e1e56603a
+68752b666b3b778746666b3b4c50264c50264960322f3c226274448b9055778746
+8b90808c985377874692a88d9ea88e7e98827c90538ea0597c90537c90538ea089
+afc0abc1c2ae87886d8b90335e7429656c26767b47576b334960323f4e1e2f3c22
+56603a5f7b2a5f7b2a3a44234758325e7429757b2d7b9034697c2b6b852c6b852c
+8b9055767b47666b3b767b47767b47778772aba9a6c1c4c7cccdccdcd6d6d2dee6
+dfe1e6dfe1e6dcd6d6d4dcd0cfc6b8847144666b3b75704d86874a95885c9fa056
+7c90536b852c68752b757b2d7787469a9178666b3b8b9055757b2d757b2d5f7b2a
+49601f5f7b2a5f7b2a76872d7b90347b90347d9736708f3176872d697c2b5e7429
+76872d7197328c98357b90346b852c76872d7f97538c98358c985376872d76872d
+8ea059778746576a1f6b852c60832a4b681e3f4e1e383c23272c1f55602449601f
+49601f49601f7787468c9853697c2b547428497323557f227197326b852c497323
+5f7b2a60832a6b852c7b9034697c2b708f315f7b2a5474283f4e1e3043214b681e
+576a1f47581f4b681e576a1f708f316b85456b852c8e9f3b5e7429576b33497323
+708f317b90345f7b2a49601f47581f6183457197325e7429576b33657c44778746
+7f97537f97535474285f7b2a697c2b5e74297f975376872d6b8545565838576a1f
+556024767b47576b33697c2b697c2b5560245e7429767b4755582456603a496032
+47581f565838556024657c448c98535560244c50265f7b2a778746656c264c5026
+3d573b3f4e32657c44597c754960323c586f344d594b686592a8b6c1d4e29fb0bb
+9fb0bbafc0ab8ea059a1b1708ea0597c90537197534b6933778772819f596f8f52
+6b86735474437c9053597c753d5f25567f3a547443567f3a618345576a62354c31
+3d573b2f3c222f3c222f3c22344d1e6b8545567f3a3d573b4b69335474433f4e32
+2f3c223944464758326274444960653d5f253d573b4b6865597c757a91a896b7ab
+bacdd9d4dcd0dfe1e6d9e6eadfe1e6d2dee6d4dcd0e0e6e8e0e6e8dfe1e6dfe1e6
+dfe1e6dfe1e6c1d4e27197536183454b6933567f3a6b85455f7b2a576b334b6933
+576b333d5f253d5f25576b33344d1e304321618345344d1e5f7b2a5e7429627444
+657c443d5f25304321344d1e567f3a496032354c31272c1f262e352b33222b3322
+272c1f2f3c22383c232f3c222b33223043213d5f254960323f4e1e344d1e3f4e1e
+3d573b2f3c22354c313f4e323043213d5f254b69336b86738b9882709081667c74
+a3b7a494afa16b8673819f5981a089819f59576b334b69336084716b8545557f22
+6183458ea089afc0abc0cbb8b8c3c6d2dee6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8
+dfe1e6d4dcd0e0e6e8e0e6e8dfe1e6dfe1e6e0e6e8e0e6e8d9e6eadfe1e6e0e6e8
+dfe1e6e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6cdd5dedfe1e6c0cbb8b8c3c6a0b09f
+a3b7a47e98828b98826274447787727e988296b7abc1c4c7b8c1af92a88d8b9882
+6b85457e98827e98828ea089afc0abd2dee6d4dcd0cccdccdfe1e6dfe1e6dfe1e6
+e0e6e8d4dcd0dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6c1c4c7b0b8a3
+7e98827d9082afb09e92a88d9fa0568ea08987886d7c90536b8545627444627444
+657c44767b47627444757c71b0b8a37787728b98828b9080666c5e8ea089d4dcd0
+c1c4c79da1ab8b9882b0b8a39ea88e87886d576b332f3c224b6933304321344d1e
+6b85458c98538b90337c905368752b6b85458c9853819f597f9753576b337c9053
+8c98538b903368752b68752b8b905576872d867c4c778746556024555824475832
+4c5026656c267787463f4e1e47581f75704d547443475832757c71afb09e8ea059
+657c44657c4477874695af7aa1b1708b98828ea0598b98827787466f8f528ea089
+92a88d8b9882757c717c9053576a1f6274446b8545576a1f5474284b6933344d1e
+778746576b333f4e1e49601f344d1e49601f5e74295e74296b852c6b852c6b8545
+7787467c90538b9080757c71767b47848887c1c4c7cccdccdcd6d6d2dee6dcd6d6
+dfe1e6d4dcd0cccdccb0b8a3b0b8a39d99819e985368752b8c98538b90338b9033
+76872d5f7b2a68752b767b47767b47666033666b3b9e98537c905376872d5f7b2a
+5f7b2a5e74296b852c6b852c708f3176872d76872d708f3176872d7b90347b9034
+7d97368c9835708f316b852c708f31697c2b7b90348c983576872d7787468b9033
+7b903476872d68752b657c4449601f47581f5560243a44233f4e1e576a1f697c2b
+697c2b77874668752b697c2b697c2b76872d6f8f52547428557f226b852c5f7b2a
+41671b557f2260832a5e74295e7429719732697c2b5e742955602430432149601f
+576b335474283d5f254b681e5f7b2a7b903476872d576b334b681e3c58223c5822
+49601f6b852c7b90344b681e47581f47581f5e7429576a1f497323708f317d9736
+92a75960832a5f7b2a5f7b2a576a1f76872d7b9034656c265e742949603249601f
+627444656c264c502656603a49603247581f5474285e74292f3c223f4e3249601f
+4b681e576b3362744477874677874668752b5e74296b852c6b8545656c26556024
+4960653d5f25657c446f8f52567f3a3d5f254b69334b68656b86738ea0897e9882
+6b86737e98827e98828ea0597f97537f97538c98536f8f526f8f5292a88d8c9853
+6f8f525f7b2a567f3a4960324b69334b686541671b567f3a41671b3d5f254b6933
+567f3a344d1e2e3c445474436f8f526f8f52657c443d5f25576b334b69333c5822
+3f4e323d573b657c445474433d573b4960655773767d9082aec4d0c1d4e2c1c4c7
+d2dee6dfe1e6dfe1e6d2dee6dfe1e6dfe1e6dfe1e6d9e6ead2dee6dfe1e6d2dee6
+dfe1e6dfe1e6cdd5de81a089567f3a5474436b85456f8f52567f3a4b69336b8545
+5474434b6933547443567f3a4b6933576b336183455474286b8545576b33496032
+60832a6b854541671b3d5f25576b334758323f4e323043212b3322304321496032
+4960324960324973234b681e4973234973234960323d5f25547428567f3a547428
+3c58222f3c222b33222f3c223d573b3d5f25657c443c58224b69336f8f52778772
+c5dae4c5dae481a089567f3a6b85456b867341671b3c58224b69334b693360832a
+8b98829ea9b4c0cbb8a0b09f9ea88ecdd5dedfe1e6e0e6e8e0e6e8e0e6e8e0e6e8
+d4dcd0dfe1e6dfe1e6e0e6e8e0e6e8e0e6e8dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6
+e0e6e8dfe1e6dfe1e6d4dcd0dfe1e6cdd5dec1d4e2cdd5ded2dee6c0cbb89da1ab
+a3b7a47d90826274446b854581a089819f5992a88dc1d4e2c5dae49ea88e94afa1
+8b90807d908294afa1a3b8bccccdccc0cbb8c1c4c7cdd5ded2dee6dfe1e6dfe1e6
+dfe1e6e0e6e8e0e6e8e0e6e8dfe1e6d4dcd0d9e6eadcd6d6d4dcd0cfc6b8afc0ab
+9ea88e9ea08ac1c2ae9ea88ea1b1709ea88e8b9882767b47778746767b477c9053
+657c44767b47627444757c71c1c2ae8b98827d9082778772576a629ea9b4cccdcc
+c1c4c7b8c3c69d99819ea88e8b9080819f59778746657c446274444b6933767b47
+7c90538b98826274447787468c98538b9882b0b8a38ea0598c985377874680a03b
+8c985368752b7c90538b90557b903486874a778746576a1f5560243f4e1e56603a
+555824576a1f767b4747581f556024576a1f6b86737c9053627444c0b1979d9981
+666b3b7787466b85458ea0598c98537c90538ea0597d90826b8545657c447d9082
+8b9882657c444960326f8f525e74296274447787467787465f7b2a576b33708f31
+6b852c576a1f3a442349601f556024576a1f5474285f7b2a5f7b2a76872d656c26
+6274448ea0898b98829d998187886d8a99abafb9bccccdccdcd6d6dcd6d6d2dee6
+dcd6d6afb09e9ea88e767b478ea0599d99818c98538b90558ea05977874676872d
+6b852c76872d76872d757b2d6660334c5026666b3b9fa8578c98537b903476872d
+76872d76872d6b852c697c2b708f317b90347b9034708f31708f317d973680a03b
+76872d6b852c7b90347b903468752b656c2676872d7b9034697c2b7b9034778746
+656c2668752b576a1f4c50263043213a4423656c26767b47576b33657c447d9736
+8b90337787466274445f7b2a6b852c7d973661834541671b41671b557f22576a1f
+3d5f2549601f49601f4b681e3f4e1e4b681e68752b5e7429576a1f4c50263f4e1e
+5f7b2a6b852c60832a6b852c76872d5e74294b681e3f4e1e4b681e697c2b576b33
+576a1f576a1f68752b68752b5e7429576a1f7d97367d9736708f3180a03b719732
+7b903460832a60832a6b854549601f41671b6b8545576b33657c4447581f49601f
+4b69333f4e323a4423354c313043213f4e1e5e7429576b333f4e1e4b681e5f7b2a
+77874677874668752b778746778746576b334b681e5560245560244758323f4e32
+4960325474437e98827f97536b86735474434b686541671b618345709081657c44
+567f3a6183457f97538ea0598c9853819f597c90538ea0597f97536f8f526f8f52
+657c446084716183453c58224b69333d5f254b6865567f3a5474433d573b547443
+3d5f252e3c442f3c227787466b8545618345567f3a3d5f25475832304321496032
+4960325474436183454960323d5f253d5f7a7e98829fb0bbc5dae4afc0ab9ea9b4
+cdd5dedfe1e6dfe1e6d4dcd0dfe1e6dfe1e6d9e6eadfe1e6d9e6eadfe1e6d2dee6
+dfe1e6d2dee6d4dcd095af7a5474434b6933547443576b335f7b2a5474285f7b2a
+3d5f254b69335e74295f7b2a3d5f254758324758325e7429576b335474285f7b2a
+547428576b334b69334973234b693349603256603a3043213a44234b69334b6933
+49601f576b334b693349601f496032576b3347581f3a44233a44233a44232e3c44
+2b33222a34382f3c223043214973236f8f523d5f253a44234b69337c905392a88d
+afc0abb8c1afc1d4e2819f595f7b2a576a625474434b6865608471618345567f3a
+54744377877292a88d8ea089afc0abd4dcd0d2dee6e0e6e8dfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6e0e6e8e0e6e8dfe1e6e0e6e8
+e0e6e8dfe1e6d4dcd0cdd5dedcd6d6dfe1e6c0cbb8a0b09fc1c2aecccdccafc0ab
+c0cbb8a4bb7e7c90536b8673819f596b86737d9082b8c1afd4dcd07d9082778772
+7787469ea88e8b9882b8c3c6b8c3c69ea9b4aba9a6cdd5dedfe1e6dfe1e6dfe1e6
+dfe1e6dfe1e6d4dcd0e0e6e8dfe1e6d4dcd0cdd5decdd5decccdccb0b8a3afb09e
+afbf77afc0abc1c2aeb0b8a3afc0ab7f97537c90537787727f97537787468b9055
+767b477c90537d90828b9882b8c1afafb09e8ea0898b98826274448b9080aba9a6
+8b919fafb9bc9ea08a8b908087886d8ea059767b477090817d90828ea089757c71
+8b90808b988292a88d92a7598b98829fa056a1b17092a75992a7598c98537c9053
+7b90345474287f97538b90337787467f97538b903355582468752b767b4768752b
+77874668752b666b3b555824576b33475832576b337c90537c90539a91789f9154
+87886d6274446183456b85457787467787467c90537c9053819f59778746657c44
+576b336b8545547443656c26496032576b33576b336b85453f4e32576b337b9034
+7d97366b852c4b681e30432147581f3f4e1e3f4e1e55602468752b697c2b6f8f52
+6b86739ea88e8ea0898488878b90808b9080848887bacdd9dfe1e6dfe1e6dcd6d6
+c1c4c7757c718b90557d97367b9034708f3176872d76872d708f3176872d6b852c
+697c2b6b852c76872d68752b555824565838657c44aea8868c98538c98538c9835
+76872d8c98358c98357b9034708f31697c2b5f7b2a697c2b7b90348b90338c9835
+76872d76872d77874676872d6b852c49601f7b903476872d576a1f6b852c697c2b
+757b2d7c90535560242f3c22344d1e3f4e1e344d1e3f4e1e47581f697c2b5e7429
+7c905368752b47583249601f3d5f25576a1f3f4e1e3c5822557f2260832a60832a
+47581f3c58223f4e1e3f4e1e344d1e5e7429576a1f3f4e1e3a44234c502676872d
+708f315e7429697c2b47581f68752b76872d576a1f3a44233f4e1e627444576a1f
+576b334b681e3f4e1e656c2668752b49601f7d97365f7b2a708f31719732708f31
+4b693341671b54742860832a4b6933344d1e344d1e3043213f4e1e47581f3d5f25
+3f4e1e47581f3f4e1e344d1e344d1e3f4e1e4758323f4e1e4c5026697c2b5e7429
+5f7b2a656c26576a1f68752b656c26666b3b5e742955602447581f3a4423383c23
+4b6933547443576b336f8f524960323d4f56547443657c445e74296b86734b6865
+3d573b576b336b85458c9853819f598ea0597197537f9753719753618345547443
+4b69335474434b69334b6933497323567f3a567f3a657c445474434b6933497323
+5474432f3c223f4e326f8f527197535f7b2a7787466b85454b6933354c313c5822
+4b6933547428657c443d573b3d5f25496032667c749fb0bba3b8bc7d98b19ea9b4
+d2dee6d9e6ead2dee6d4dcd0d2dee6d2dee6d2dee6dfe1e6d2dee6d4dcd0dfe1e6
+dfe1e6dfe1e6b8c3c6a0b09f567f3a5f7b2a4b69335474435474433d5f255e7429
+567f3a547443547428547443344d1e3043213f4e3256603a666b3b475832657c44
+5f7b2a4b69333f4e32576b335474434960324960323f4e1e49601f5e7429354c31
+2f3c222f3c223a44233f4e323043212b3322373e433043213f4e32354c31272c1f
+272c1f2b33223043213c58225474286183453f4e324b69336b8673719753819f59
+7c9053a0b09fc1d4e292a88d4b69334b69335474436084716183456183454b6933
+3f4e326b86738b9882819f59b8c3c6dcd6d6dfe1e6dfe1e6dfe1e6dfe1e6cdd5de
+cdd5ded4dcd0d4dcd0e0e6e8e0e6e8dfe1e6e0e6e8e0dfc6e0e6e8d9e6eadfe1e6
+dfe1e6dfe1e6dfe1e6dcd6d6dfe1e6e0e6e8d4dcd0b0b8a37787728ea089a0b09f
+a0b09f7e98826f8f526274446f8f527f975392a7598b988292a88d778772657c44
+8b98828b98828ea089c0cbb89ea88e8b90809ea88ecdd5dedcd6d6dfe1e6d2dee6
+dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6dcd6d6dcd6d6e0dfc6cccdccb0b8a3cccdcc
+c1c4c7c1c2aeafc0ab92a88db0b8a38ea0898b9882778772767b478c98538c9853
+7f97537d908277874686874a8b98829d9981aba9a68b98828488878ea089afb09e
+9ea08aaba9a6b8c1af9fa0567d9082767b4754742847581f5474436b8545627444
+95af7a8ea0897787467787468ea0899fa8578ea05977874686874a77874676872d
+4b6933657c448b90336b852c5e74297787466b8545778746778746767b47778746
+68752b656c2655582456603a767b47475832475832657c44656c2686874ab1b069
+9ea88e6274447c9053697c2b6b8545576b33667c748ea0898ea089657c446f8f52
+627444767b476b854547581f3f4e1e3043213f4e32657c444758324960327f9753
+6b852c576a1f3f4e1e3a44232f3c222f3c22304321576a1f5f7b2a576a1f757c71
+9ea88e8ea0899ea88eada17f87886d8b98825f61569ea08acccdccdcd6d6dcd6d6
+857d6756603a8ea0598c9853576a1f6b852c6b852c76872d76872d5f7b2a5e7429
+5e7429697c2b6b852c576b334c502676872d7c90538c98538c98537b903476872d
+697c2b5e74298c983576872d76872d697c2b5560244b681e697c2b5560245f7b2a
+7d97366b852c76872d8b903376872d576a1f656c265560243f4e1e666b3b757b2d
+8c983576872d304321342d1f3f4e1e576a1f497323576b33576a1f666033697c2b
+656c26656c2649601f4b681e3c582241671b344d1e3c58223c58224b681e5f7b2a
+5560244c502649601f3c5822576a1f76872d6b852c3a44232f3c223043215f7b2a
+576a1f4c50263f4e1e3a4423383c233f4e3247581f4c50263f4e1e7b9034697c2b
+3f4e1e3a44232f3c2247581f3f4e1e3f4e1e60832a6b852c557f2241671b3d5f25
+49601f547428697c2b576b33576a1f3f4e1e354c31344d1e3c582249601f3c5822
+49601f344d1e4b6933576a1f47581f627444496032304321475832576a1f697c2b
+68752b68752b56603a757b2d757b2d76872d556024576a1f76872d556024383c23
+6f8f52608471547428657c443d573b304321547443547443627444657c44618345
+6183456b85458b98828c98537f97537f97536b852c657c44547428567f3a547428
+567f3a6183453d5f253d5f254b69334b6933567f3a6183454b69333c5822304321
+3d573b4b69336f8f526b85457197325474284b6933657c444960323d573b3d5f25
+394446475832576b334758324b69334b69334b6865667c747090817e9882bacdd9
+cdd5ded4dcd0aeb0bd9fb0bbcdd5ded4dcd0d4dcd0dfe1e6d4dcd0b8c3c6d2dee6
+dfe1e6d4dcd0a0b09f7787726183454b69335e7429576b333f4e1e496032576b33
+5474433d5f253c58225474433d5f2541671b5e74295e74296274446274445e7429
+6183454b693356603a47581f4b6933344d1e354c31304321627444576b33344d1e
+383c234b693347581f344d1e4b681e3a44232b33223f4e1e383c23342d1f272c1f
+2b33223c582254744341671b4b69334b69333d5f256f8f526183456b85456f8f52
+6f8f52657c4470908181a0896b8545618345497323657c447f9753547443618345
+547443657c447d908294afa1a4bfb5d2dee6dcd6d6dcd6d6d9e6eadfe1e6cdd5de
+cccdcccdd5ded4dcd0e0e6e8e0e6e8dfe1e6d4dcd0e0e6e8dfe1e6dfe1e6e0e6e8
+dfe1e6dfe1e6d4dcd0cdd5dedcd6d6dfe1e6e0e6e8c1d4e26f8f525474437c9053
+7f97536b85455f7b2a47581f5474286183456f8f526b85456f8f527c90536b8673
+8b90558ea0898ea0598ea089667c74667c749ea9b4d2dee6dfe1e6dfe1e6d4dcd0
+dfe1e6dfe1e6dfe1e6d2dee6d4dcd0cdd5decdd5decccdcccccdcccdd5decccdcc
+b8c1afafb09ea3b7a49ea88e7787468c98537e98827c90537c90537e9882778746
+8b9055657c44657c447787468ea0898ea059afb09ea0b09f8ea0897d90829da1ab
+9ea9b49da1ab8b98829ea08a8ea0897c9053657c4456603a3f4e32547443778772
+7c90537c90537787467c9053819f598ea0598b9033697c2b757b2d697c2b697c2b
+49601f54742860832a697c2b657c44576a1f76872d76872d576a1f68752b576b33
+576b33576a1f657c447b903477874686874a757b2d757b2d697c2b8b9055aea886
+8b98825e74296b8545576b3347583247581f657c446b8545657c445e7429627444
+576b33496032547443576b333d573b354c3170908195af7a4b693349603276872d
+5e74293a4423333522272c1f272c1f344d1e4c50263f4e1e5f7b2a60832a8ea089
+a3b7a47d90829ea88e8ea0899a91788b905554605f666c5e767b479a9178666c5e
+4e4425857d67b0b86c8ea05968752b5e74297d973676872d6b852c5e74295e7429
+5e74295e7429576a1f4c50264c50266b852c7c90539e9853767b47576a1f5e7429
+697c2b5e74297d97367b9034708f31757b2d55582447581f4c5026342d1f2f3c22
+556024576a1f5e742976872d76872d3f4e1e4c5026333522272c1f3f4e1e6b8545
+8c98357b9034767b472f3c22272c1f3a44233a4423555824576b33576a1f49601f
+697c2b576b335e74293d5f25576b333f4e1e344d1e344d1e304321344d1e47581f
+344d1e4c502649601f41671b5f7b2a576a1f5e742949601f344d1e778746555824
+3f4e1e3f4e1e344d1e4b681e344d1e3c5822547428576a1f656c2668752b656c26
+556024576a1f3a4423576a1f3043213043214973235f7b2a3d5f254758323d5f25
+47581f41671b4b681e5658384758324c50262f3c2230432149601f49601f497323
+697c2b55602447581f6183455560243f4e3249601f497323496032496032778746
+576b33576b33354c31576b33656c2668752b576a1f576a1f666033656c26666033
+618345657c44618345547443354c313944463d5f25657c44778746819f598ea059
+819f5992a7597b90347787466b85457c9053697c2b778746496032657c44618345
+5f7b2a6183455474435474434b69333d5f25567f3a567f3a3d5f253d4f562f3c22
+3f4e32547443657c44557f226f8f525474284960323d5f25354c314758323f4e32
+2f3c222f3c224758324758324b69333d5f253d5f255773767e98827d98b1cccdcc
+a3b7a48488875773767d90828da0b6afb9bcdfe1e6d2dee6bacdd9a3b7a4a3b7a4
+d4dcd0cdd5dec0cbb881a089657c444b69335f7b2a5474434960323043213a4423
+547443344d1e3c58224960323f4e1e627444557f226b8545496032576b335f7b2a
+3c5822344d1e2b3322304321576b333d5f25354c313f4e32576b3355602456603a
+576b3355602462744449601f49732349601f4758323944462b33222b33223c5822
+4b69334b69334b6933344d1e3f4e324b69334b69336f8f5241671b567f3a719753
+819f597e98826183456f8f526183456f8f525474435474435474285e74296f8f52
+6f8f525474437f975392a88d95af7aa4bfb5c0cbb8d4dcd0dfe1e6dfe1e6cccdcc
+c1c4c7cccdccdcd6d6e0e6e8dfe1e6dfe1e6dfe1e6dfe1e6dfe1e6e0e6e8dfe1e6
+dfe1e6d4dcd0c1c4c7cdd5decdd5ded4dcd0d4dcd0d2dee6c1d4e2618345657c44
+47581f657c44657c445f7b2a657c446f8f527787468b98828ea0898ea0896b8545
+7f97537787467787726f8f52567f3a7e9882afc0abd4dcd0dfe1e6dfe1e6e0e6e8
+dfe1e6dfe1e6dfe1e6dfe1e6cccdccc0b8a6c1c2aeb0b8a3cdd5dee0dfc6c1c2ae
+9ea88ea1b1708ea0598b98827c90538c9853657c448b98828ea0597f9753778746
+7c90537787467787467f97537787468b98829ea9b49ea88eafb09e6b8545778772
+8ea0899ea08a857d678c985387886d6b85455f7b2a49601f3f4e1e354c31475832
+576b337f975392a88da1af4e819f599fa0567c90537787467c90538c9853697c2b
+556024576b33576b335e7429697c2b576b3368752b8b9033576b3356603a656c26
+627444656c268b903377874668752b8ea05987872c7b90348b90338c98538b9055
+857d675e7429778746576b33576a62475832627444627444618345576b33496032
+3d5f25344d1e576b336b85453c58224e5043b0b8a3c1c4c7576b3349601f6b852c
+5e742947581f3f4e1e2f3c222b3322657c44576b3349601f5e74297c9053a0b09f
+8ea0597d90827c90537787468b98828c98537787468ea05986874a556024555824
+68752bafb09e9fa857a0a03a7b903476872d76872d697c2b76872d557f22576a1f
+5474285f7b2a5560243335223f4e1e697c2b8b90558b90557787468b98828b9033
+5e74293f4e1e576a1f6b852c708f3176872d555824342d1f272c1f24261c342d1f
+3335223f4e1e4c50264c50264c50263a4423333522383c23272c1f2b3322656c26
+778746757b2d4b681e383c23342d1f24261c3335223f4e1e47581f49601f5e7429
+49601f3d5f2549732349601f41671b344d1e3043213043213c58223c58223f4e1e
+4c502649601f3f4e1e47581f3c582247581f5e7429576a1f3d5f25697c2b576b33
+576a1f7b9034557f227b90346b852c697c2b7b903476872d556024656c26666b3b
+3a442347581f33352247581f344d1e4973235f7b2a576b33344d1e3a442347581f
+4b693349601f49601f47581f383c23383c232f3c222f3c22344d1e344d1e354c31
+576b33496032496032666b3b4b681e3c58223c58223f4e1e657c443f4e1e3d5f25
+4b69333f4e1e344d1e4758324960324c50264e504375704d767b47556024656c26
+6183456b85457c9053657c443d573b3f4e325474437197537f97536f8f527c9053
+7f97537c9053567f3a657c446b85457c90537f97537f9753547443576b336f8f52
+567f3a3c58224973234b69333d5f253d573b547443547443344d1e354c312f3c22
+2a3438344d1e3d5f25576b33547443618345567f3a5474283d573b3f4e322f3c22
+373e432b33223f4e324b69334b69334758323d573b4b6865547443667c748ea089
+577376576b33576a62a4bfb594afa18b9882b8c3c6cdd5de92a88d8ea0897e9882
+b8c1afb8c1af94afa1afc0ab7f97535474434b69336183455474283f4e32304321
+3d5f25576b33627444496032344d1e3c58226b85456b85454758323f4e1e56603a
+344d1e3d573b2a34383a442362744449601f3f4e322f3c22304321354c313f4e32
+666c5e8b90557787463f4e1e4960323a4423383c23333642272c1f304321547428
+60832a4960322f3c222b3322576b334b69336183456f8f52567f3a6f8f52819f59
+6f8f52608471afc0ab92a88d7f97536b85456183456274444b6933547428819f59
+7f97536f8f52819f596f8f526b8673a0b09fcdd5dedfe1e6dfe1e6d4dcd0dfe1e6
+cdd5decdd5ded4dcd0dfe1e6e0e6e8d4dcd0dcd6d6d4dcd0dfe1e6d4dcd0dfe1e6
+dcd6d6bacdd9b8c3c6b8c3c6b8c1afa0b09fd4dcd0dfe1e6d4dcd0a0b09f92a88d
+547443576b336274448ea0896b8545819f596b85457c9053a3b7a4afc0ab8ea089
+7c9053657c44657c44657c446183458b9882b8c3c6dfe1e6dfe1e6dcd6d6d2dee6
+e0e6e8dfe1e6d2dee6dfe1e6d4dcd0cccdcccdd5dedcd6d6cccdcccccdccc1c2ae
+9ea88e8b98829ea88e8ea0898ea0597c9053657c447c90538c98537c90537c9053
+7787467c90537c90537c90537787468b9882778772a0b09fafb09e8b98827c9053
+7d90828b9882657c447787727c90537787465474434b69334960324758324b6933
+4b69335f7b2a7f97538c98537b90348e9f3b7b903476872d7c9053657c44576b33
+697c2b4b693349603247581f49603249601f555824657c44697c2b6183455e7429
+555824576b33778746757b2d68752b8ea0598b90338b90338e9f3b8c98539fa056
+7b90345e74296b85455e74296274443f4e326f8f52627444657c44547443657c44
+709081576b334960325f7b2a5474286274449ea88e87886d576a1f49601f60832a
+6b852c76872d557f2247581f3a44237c9053547443576b3376872d7b90348b9882
+b0b8a3b8c1af87886d87886d8c98538b905586874a757b2d86874a778746778746
+8ea0599fa8578ea0598c98537d97367b90347c905376872d76872d697c2b5f7b2a
+5e74296b852c656c26383c233a4423656c267787468b90558b9055aea886b1b069
+8b9055766e2d4c5026576a1f76872d76872d556024342d1f272c1f272c1f342d1f
+383c235558243f4e1e272c1f24261c272c1f342d1f333522272c1f3f4e1e656c26
+47581f3f4e1e3a4423333522342d1f272c1f383c23666b3b56603a576a1f5f7b2a
+55602441671b49601f5e742949601f344d1e304321344d1e49601f344d1e47581f
+30432147581f5f7b2a708f31576a1f3043215f7b2a6b852c76872d6b852c5e7429
+576a1f76872d76872d697c2b7b903480a03b6b852c68752b656c265558244c5026
+4c502649601f383c232f3c22576a1f60832a4b681e3d5f253043213a44234c5026
+657c445e74293f4e323f4e1e3a44233335222b3322344d1e2f3c22342d1f2f3c22
+304321304321354c313a44233d5f253d5f254b6933354c31567f3a3f4e32496032
+6b852c657c44576a1f4c50264758323f4e323f4e323a4423354c31576b33475832
+7c90536f8f52819f59657c44496032354c315474436f8f526b8545618345547443
+6b85456f8f52576b33496032657c448c9853819f596f8f524b69333d5f256f8f52
+6183454b69334b693360832a3d5f25354c314b693341671b496032354c312b3322
+2f3c223f4e32354c31304321576b33567f3a3d5f254b69334b6933576b333c5822
+3f4e32344d1e5474435f7b2a4960323043213c5822496065597c75547443496032
+3d4f564b6933597c7594afa16084716374717d9082a3b7a47f9753819f597c9053
+6b8545a0b09f8b988261834581a089576b334b69336b85455f7b2a576b33576b33
+3f4e1e3f4e323c5822344d1e5474435e74295f7b2a3f4e1e2a34382b33222f3c22
+3944464c50262b3322354c314b69336b85454960323f4e1e47581f344d1e333522
+2f3c2256603a857d67383c23333522272c1f272c1f272c1f354c315f7b2a60832a
+557f22344d1e262e352b33224960326f8f52708f317197326b8545547443618345
+567f3a657c4492a88d95af7a6f8f52547428657c44547443547443618345618345
+5f7b2a5773765474434b693394afa1d2dee6dfe1e6dfe1e6dcd6d6cccdcccdd5de
+c1c4c7cccdcccdd5decccdccdfe1e6dfe1e6cdd5ded4dcd0dfe1e6dfe1e6dfe1e6
+cdd5ded4dcd0b8c1afafb9bcc0cbb8b8c3c6afb09ec1c4c7d2dee6bacdd99ea88e
+608471576b33657c446f8f526f8f526f8f526f8f52618345819f598b98827c9053
+7787464b69334b69335474435474437d9082c0cbb8d4dcd0dcd6d6cdd5dedfe1e6
+dfe1e6dcd6d6dfe1e6d4dcd0cdd5dec1c4c7cdd5ded4dcd0cfc6b8afc0abb0b8a3
+9ea88e8c98539ea88e8b9080afc0ab8b9882778746657c44767b47778746778746
+7c90537b90347c90537c9053767b477c90537d9082c1c2aec1c2aea0b09f8b9882
+637471767b47767b47778746767b4754744349601f3f4e1e576b33344d1e47581f
+56603a567f3a7c9053697c2b567f3a8c9853697c2b76872d76872d576a1f576b33
+6b852c47581f3f4e323d5f253f4e1e4758323c582249601f697c2b7b90348c9853
+68752b55582476872d697c2b5560248c98537b90347b90347c90538b90338ea059
+8e9f3b778746576b335e74296b85457787466b8673778772576b335e7429576b33
+567f3a597c75344d1e3c5822576b336b8545697c2b6b852c576a1f5e74295e7429
+49601f6b852c76872d49601f3d573b6f8f525e74296b852c71973276872d7f9753
+c1c2aec0cbb8a1b1708ea08986874a767b47757b2d76872d8c98355e742976872d
+8c98358c98537b903476872d576a1f576a1f55602486874a8b9033697c2b656c26
+6b852c76872d656c26574f262f3c223f4e1e767b47867c4c86874a767b479d9981
+aea886b1b0699d998195885c767b47556024576b333a4423333642342d1f342d1f
+342d1f333522383c23272c1f272c1f24261c272c1f24261c24261c2b33223f4e1e
+4e5043333522272c1f24261c342d1f383c233f4e1e9d998186874a666b3b3f4e1e
+3f4e1e4b681e5f7b2a576a1f47581f3c58223a44234b681e4b681e5f7b2a4b681e
+49601f4b681e80a03b7b90345e74294b681e697c2b7b90347d97366b852c5e7429
+5474285f7b2a60832a5e742980a03b91af495f7b2a556024576b33576b333f4e1e
+576a1f383c2347581f3a4423344d1e47581f3f4e3247581f344d1e3f4e1e304321
+4b6933657c445e74294b681e4e4425383c233043213f4e1e3f4e1e2f3c222f3c22
+3a44233a4423475832496032354c313043213d573b344d1e354c313a44233f4e1e
+344d1e4b69333a44233a4423344d1e3a4423383c232f3c223f4e1e475832475832
+7c90536f8f52719753657c447c90536b8545657c44778746657c44618345496032
+5e7429657c444758324758327787467f97538c98537f97536183454b6933547428
+61834541671b4b6933567f3a4973234960325474434b69333d573b304321262e35
+3d573b5474433d5f25547443547443657c444b69333d5f255474434b69334b681e
+5e7429576b336b8545657c443f4e32304321344d1e3d5f253d5f254960323d573b
+576b337e98827090818ea0894b6933576b336b85457e98826b8545547443657c44
+6b8673657c448ea0897c90536b854541671b4960326b8545618345557f226b8545
+41671b3f4e32475832576b33354c31354c313f4e322f3c22272c1f2a34382b3322
+272c1f2b33222f3c22475832576a1f6b85455f7b2a4960324960323f4e1e2b3322
+333522383c234c5026272c1f262e35272c1f272c1f2b33225f7b2a618345657c44
+3c58222b3322262e352f3c223d5f25708f31567f3a5f7b2a5f7b2a547428496032
+6183454b69337197537197536f8f526f8f52567f3a618345708f316b85456b8545
+7d9082657c44496032577376a4bfb5cdd5dedfe1e6d2dee6cdd5decccdccb8c3c6
+c1c4c7b8c3c6afc0abd2dee6d2dee6dfe1e6cdd5ded2dee6dfe1e6d2dee6d4dcd0
+dcd6d6dfe1e6c1c4c7afb9bcbacdd9bacdd995af7a8b9882b8c1afc0cbb8afc0ab
+7e98826b86737c90536f8f52708f317787467c90534973234b69336b85456b8545
+657c44657c44547443475832576a62a0b09fcdd5deafb9bcc0b8a6cccdccd2dee6
+dfe1e6d4dcd0dcd6d6cdd5decccdccc1c2aec1c4c7c0cbb8b8c1af9ea88ea4bb7e
+9ea88e8ea059a1b1708b9080a3b7a4a0b09f8ea0897c90537c90537c90538b9055
+77874668752b7787467b90346b85457d90827c9053a0b09fcfc6b8b0b8a38ea059
+496032667c748b9882778746576b334b69333c582247581f657c443d5f2547581f
+4758325f7b2a7197534b681e5e74296b85455f7b2a819f597d9736697c2b657c44
+76872d4b681e475832344d1e47581f4758325e74295474287f97538ea0598c9853
+76872d767b476b85454c502649601f657c44697c2b697c2b7b903476872d8b9055
+8c98357b9034708f316b852c697c2b8c98538b98828b9882576b336274445f7b2a
+5e7429576b33344d1e304321496032497323697c2b767b4792a88da3b7a48c9853
+49601f576b337c90535f7b2a657c4492a7596f8f526b8545708f316b85458b9882
+9ea08a9ea08a8b90558b90558b90337c905376872d757b2d5e74295e74295e7429
+5e74297f97536b852c6b852c6b852c8c9853778772757b2d77874668752b556024
+697c2b757b2d4e4425383c234e44254c50269ea08a656c2666592c565838565838
+74643e87886d87886d9a91789fa056767b474960323f4e1e2f3c222b3322333522
+342d1f272c1f24261c24261c24261c24261c1e241b24261c24261c272c1f2b3322
+4c5026342d1f24261c272c1f24261c342d1f4c50268b9033757b2d4c50262f3c22
+344d1e4b681e5e74296b852c47581f49601f656c265f7b2a576a1f576a1f60832a
+47581f576a1f6b852c697c2b7b90347d9736697c2b576b336b852c7b90347b9034
+708f317b90346b852c76872d708f3176872d76872d708f31576a1f55602468752b
+656c26383c23344d1e49601f4960325560243f4e322f3c222f3c22304321576a1f
+8c9835697c2b68752b5560244c502654742841671b3f4e1e3f4e1e304321304321
+3a4423333522383c234c50263a44233043212f3c22272c1f2f3c222b33222f3c22
+344d1e3f4e322f3c223f4e32627444576b33342d1f2b33223f4e1e3a44233f4e1e
+657c446b85457c90535474436f8f527c90534960325474434b6933576b33496032
+576b333d5f253d5f253f4e326b85457c90536f8f52657c44567f3a5f7b2a5f7b2a
+6b8545567f3a567f3a4b69335474433d5f256183454b6933354c31354c31304321
+3043215474434b69333d5f253d5f25344d1e4b69333d5f25497323475832576b33
+3d5f254b6933627444576b33354c313f4e323d573b4758323c5822354c314b6933
+567f3a709081709081719753576b337090817c90537197535f7b2a627444719753
+7197536f8f525f7b2a657c44567f3a576b3347583247581f618345657c44697c2b
+4b693347581f576b333d5f25344d1e304321344d1e3f4e322f3c22354c312b3322
+262e353a442347581f4960326183455f7b2a4960322f3c222b3322262e35272c1f
+333642383c232f3c222b33222f3c222f3c22496032657c446b852c60832a49601f
+2f3c222b332230432141671b60832a6f8f5260832a6183456f8f526f8f526b8673
+6f8f52657c447f97537197326b8545708f31719753719732567f3a567f3a4b6933
+5474434b6933567f3a667c74a4bfb5afc0abb8c3c6b0b8a3c5dae4b8c3c68ea089
+a0b09f8b9882afb09ecdd5decccdccb8c3c6b8c3c6c0cbb8cccdccdcd6d6d2dee6
+c0cbb8d4dcd0c0cbb8a4bb7ea0b09fb8c3c6c0cbb86b85456b8673778772b0b8a3
+b0b8a3757c717b90347c90536183455f7b2a657c444b6933618345618345657c44
+3f4e323f4e3239444630432154605f667c747e9882757c71a3b8bcd4dcd0dfe1e6
+d2dee6cccdccd4dcd0b0b8a3b0b8a3b0b86c8b98828b9882afc0aba4bb7e8ea089
+95af7aa1b1708c98537c90539ea88e92a88d92a88d7c90538b90557787468b9055
+7787467787468b9882778746757c717c90538b9882b0b8a3cccdccb0b8a38b9882
+666b3b757c71aea8869d99816274443f4e1e4960325e74297c905368752b3d5f25
+3f4e32576b3356603a3d573b5e74295f7b2a6b85457b9034657c445e7429657c44
+708f31576b335e74292f3c223a442349601f576b33556024697c2b68752b576a1f
+68752b6b852c7787465560243f4e1e576b335e74295e74295f7b2a5f7b2a7b9034
+7f97537b90347b90347d97367f97535f7b2a77874677877256603a475832555824
+4b6933576b3349601f49601f5e74294960326b85457e9882a0b09fb0b8a38b9882
+4960323043214c5026576b334b69337787467d973677874677874656603a3f4e32
+2f3c224c502668752b8c98538b903386874a87872c76872d68752b778746766e2d
+76872d8c98537b903476872d7787468ea059aea8869fa85786874a656c26666033
+574f26383c23333522333522767b47767b4795885c666b3b666033383c23383c23
+3a44236660334c502686874a7c90535e742947581f556024344d1e333522342d1f
+383c23342d1f24261c24261c24261c24261c24261c24261c24261c272c1f2b3322
+2b332224261c24261c24261c24261c2b332256603a666b3b766e2d383c23342d1f
+342d1f3335223f4e1e778746344d1e344d1e3f4e1e4b681e576a1f4b681e5f7b2a
+5e74295e74297d9736697c2b68752b68752b47581f4b681e6b852c708f318ea83e
+8c98358e9f3b76872d8e9f3b5f7b2a6b852c5e7429697c2b6b852c7d97367b9034
+7b90345560243c582241671b47581f3f4e1e3f4e1e3c582249601f3d5f25497323
+708f318c9853697c2b47581f3a44233f4e1e3f4e1e2f3c22383c233a44233f4e32
+2f3c222f3c224c502647583256603a2f3c222b3322272c1f2a34382f3c222b3322
+3c58223d5f25304321333522475832666b3b333522342d1f2f3c222b33222b3322
+576b336f8f52778746576a625f7b2a6f8f52576b334960324960324b69333d5f25
+3f4e32354c313d573b4960325e74296b854560832a576b33354c31618345567f3a
+4960325f7b2a6183453d5f253d573b54742849732341671b354c313043212f3c22
+304321344d1e4b69333c58224b69334b6933657c445474284b6933354c31344d1e
+4b6933475832576b33576b334758322f3c223043213043213043214b6933567f3a
+6b8545657c443d573b4b69336f8f527f97537f97536f8f526f8f526b85458c9853
+7c905360832a567f3a5474435e74294b69334960323f4e1e4b681e576b33778746
+576b33344d1e3c58224b6933576b335474435474282f3c222f3c223a44232b3322
+262e353f4e32576b335e7429547428567f3a3d5f252f3c22272c1f272c1f2b3322
+3a44232f3c222f3c224758325e74296b852c80a03b708f316b8545557f22576b33
+3c58223c58224973235f7b2a719753708f316b8545497323618345719732719753
+6183456f8f52819f595f7b2a4b6933657c447197536f8f526f8f52657c44657c44
+597c756f8f526183455474436b86738ea0896b86739ea88ed4dcd0cdd5deb0b8a3
+8b98827e9882b8c3c6c1d4e2e0dfc6c1c4c7afb9bcafc0abcccdccdfe1e6dcd6d6
+9ea9b4a0b09fa3b7a48ea089778746a3b7a4b8c3c67c90535474433d5f25657c44
+7e98827787467f97536b852c6183455474433d5f25657c446183455e7429547443
+4758323a44232f3c223f4e32576a624b69334b6865637471afc0abd2dee6cdd5de
+c1c2aeafb9bcb8c1afa0b09f7d9082767b478b9882afc0abb8c1afb0b8a39ea88e
+7d9082b0b8a3a1b1707c90536b85458ea0596b85456b8545657c44778746778746
+657c4477874686874a7c90537787467e9882a3b7a4a3b7a4c0cbb8c1c4c78ea089
+4b6933666b3b637471b0b8a387886d666b3b576b335e74295f7b2a697c2b47581f
+54744347583249601f47581f627444657c446b8545576a1f697c2b576b33556024
+60832a68752b697c2b47581f5558243f4e1e4e44253a4423556024475832778746
+7b90348c98537b9034778746304321576b33576a1f4b681e497323576a1f6b8545
+778746697c2b60832a60832a708f3176872d7f97537c905347581f3a4423383c23
+2f3c223043213f4e1e576a1f5474284b681e7e988292a88d95af7a7b9034697c2b
+5560243f4e1e4b681e576a1f56603a576b335e742949601f3a44232b3322272c1f
+2f3c22576b3377874676872d7b903487872c68752b757b2d87872c8c98538c9853
+8b9033767b475e742968752b778746a1b1709fa056a1b1709e985376872d766427
+66592c4436233335223335224e4425666b3b74643e666c5e666b3b666033475832
+3a442347581f3f4e1e666b3b68752b3f4e1e2b33222f3c223f4e1e3a4423333522
+66592c565838342d1f24261c24261c24261c24261c24261c24261c24261c342d1f
+272c1f24261c272c1f24261c24261c272c1f383c23383c233f4e1e3a44232f3c22
+272c1f2b33223f4e1e5560243a442347581f344d1e576a1f76872d6b852c576a1f
+5e7429708f31719732557f22708f316b852c576a1f708f317197327d9736708f31
+8e9f3b7d973676872d697c2b76872d697c2b576a1f697c2b8c98357b903476872d
+7b90347b903454742849732354742855582447581f4b681e4b681e41671b60832a
+6b852c76872d5e7429778746657c44576b332f3c22272c1f3335222f3c22333522
+2b3322344d1e3a44235f61569d99813a4423342d1f272c1f2f3c223c58222f3c22
+3c5822344d1e3a4423333522354c31576b332f3c223335222b3322272c1f2b3322
+4758326b8545547443475832657c44547443576a623a4423576a625474433f4e32
+354c31304321354c313c58224b6933657c447787464960322f3c223d4f564b6933
+4b6933657c446183454960324960323d5f25496032497323354c312a34382f3c22
+4b68654b6933304321344d1e4b69333d5f254b6933618345567f3a344d1e2f3c22
+3a44233043214758324758323f4e322f3c22354c313043214b6933547443576a62
+3d573b3f4e32475832547443657c446f8f527197536b85455f7b2a77874692a759
+819f596b85455474434b69333c5822344d1e5474283d5f25576b334973235e7429
+6183453d5f253f4e1e2f3c223335223a4423344d1e2b33222f3c225f7b2a3c5822
+2f3c224973236b8545708f316b8545496032354c31496032354c31344d1e49601f
+4960324b69333f4e1e576b337c90537d97368c98535e74293c582241671b4b6933
+497323497323618345557f2260832a6b8545708f31557f226f8f526f8f52708f31
+557f226b8545819f596b852c6b85455f7b2a496032576b335474437c90537b9034
+819f596f8f52567f3a3d5f254960326084718ea089c0cbb8c1d4e2d9e6ead4dcd0
+afc0abb0b8a3afb9bccccdccd2dee6cccdccafc0abc1c4c7d2dee6dfe1e6e0e6e8
+c0cbb88ea0898ea08977877270908192a88d8ea089819f595474434b6933344d1e
+657c446274447c90536b854560832a4b681e496032354c314960324b6933576b33
+3043212f3c223944463a44233f4e323f4e323d573b8b9882bacdd9dcd6d6cdd5de
+afb09ea3b7a48b98827787467c90536b86737f9753a0b09f8ea089afc0ab8ea089
+87886da0b09f95af7a8c98537787467c9053697c2b778746697c2b6b8545576b33
+68752b657c4477874668752b6b85458b9882b8c3c6b0b8a3b8c1afafb09e9ea88e
+576b33475832475832afb09e86874a7787466f8f526b854560832a657c44475832
+3a44233f4e1e3f4e1e5e7429576b33576b335e7429576b33618345576a1f4b6933
+5e7429576b33656c264c50264960322f3c222b3322333522576b334758327b9034
+4b681e60832a656c2677874655602447581f3f4e1e556024576a1f496032767b47
+7787465e74295474285f7b2a6b852c5f7b2a7c90538c98357b9034576a1f4b681e
+656c264b681e5474286b852c7b90347d97367d97368ea0598ea0597d97366b852c
+6b852c5560243a44233a44233f4e325474283d5f2547581f5e7429304321342d1f
+3335225560248c985376872d6b852c68752b6b852c697c2b7b90347d97368c9835
+8ea059b1b0697c9053656c267b9034a1b170778746778746697c2b8c9835666b3b
+4e4425443623342d1f383c234e504387886d767b47666b3b4c50264c502675704d
+4758324c50264c50263335223a44232b33222f3c222f3c223a4423767b47666033
+4c50265558244e4425342d1f24261c24261c24261c24261c24261c272c1f342d1f
+342d1f342d1f44362324261c24261c24261c342d1f2b3322272c1f2f3c222b3322
+2f3c2230432141671b576a1f4b681e5e7429576a1f8ea83e8e9f3b76872d60832a
+5e7429697c2b576a1f4b681e4b681e4b681e6b852c7b90348c98356b852c8c9835
+7c9053757b2d6b85456b852c697c2b3f4e1e576a1f576a1f7b90348ea83e76872d
+697c2b8c983576872d5f7b2a76872d7b90348b90337b90346b852c5f7b2a5e7429
+5f7b2a6b852c60832a7b9034697c2b576b335560242f3c22333522272c1f272c1f
+2b33224b681e576b333f4e1e576b334758322f3c22304321344d1e3f4e1e383c23
+2f3c222f3c22304321344d1e354c31656c263f4e1e2f3c22344d1e344d1e304321
+4960326b86734b69333d573b6183456b854554744347583256603a576b33475832
+30444d3d573b576a62576b336b8545576b33657c444758324758323d5f254b6933
+567f3a547443567f3a41671b4b69336183456b867341671b354c312f3c222f3c22
+344d1e4b69333d5f25657c445474284b69333c58225474434b681e4b69333d5f25
+354c313a44233f4e3256603a4960323043215474434b69334b69333f4e1e304321
+304321576a62618345576b33496032547443819f596f8f527787468ea0598ea059
+7b90345f7b2a4b6933344d1e4b69334758324b681e3d5f255474286183456b852c
+6b85454973234b69334960322b3322262e35354c313f4e32304321618345497323
+576b3360832a60832a60832a5f7b2a49603247581f3043213f4e1e3c5822576b33
+3f4e1e547443697c2b576a1f76872d7b9034708f314b681e4758324b69333d5f25
+3d5f254973236f8f526b854560832a497323657c446183456b852c60832a567f3a
+41671b5474287787465f7b2a6b85456b852c344d1e4960656084716183455f7b2a
+6183457c9053576b33354c31354c31547443a3b7a4c0cbb8c1c4c7c1c4c7c1c4c7
+a0b09f8b98829ea9b4c1c4c7b8c1afbacdd9c1c4c7cdd5ded4dcd0dfe1e6dfe1e6
+cdd5de9ea88e7d90827f975392a88db8c1af757c717c90535474435f7b2a547428
+3d5f25394446867c4c6b85456183455e74294b6933627444657c444b6933475832
+3c58222f3c222f3c222f3c22354c31496032667c74aeb0bdb8c3c6afb9bcaba9a6
+a0b09fa3b7a47f97536374716183456f8f526f8f527c9053757c7195af7a92a88d
+92a75992a7597f97537c90536f8f527787466b85456b85457c90537c9053576b33
+5e7429576b337787466b8545657c448ea089a3b7a4a0b09f9ea9b49ea88eb0b8a3
+757c71475832354c31afb09e8b9055767b476b85457f975360832a576b335f7b2a
+3f4e1e3335223335222f3c224c5026767b4747581f576b335e742949601f4b6933
+6b85454b69336274443f4e1e4c50264c50262b33223335224c502656603a618345
+4b681e54742847581f5560243f4e1e576b334758323f4e1e4c50263f4e1e475832
+666b3b3f4e1e49601f576a1f4b681e5e74297c90536b852c76872d76872d708f31
+6b852c7b9034708f31697c2b7b90347b90346b852c6b852c697c2b7b903476872d
+5f7b2a344d1e2f3c222b3322383c23304321576a1f60832a697c2b3f4e1e272c1f
+2b332249601f86874a68752b5e74297b90346b852c76872d7b903476872d76872d
+7d97368e9f3b92a7597d97367b90347b90345560243f4e1e576b337787464e4425
+4e44254e3d22342d1f4e3d2287886d9e98539ea08a86874a666b3b4c5026383c23
+383c233a44234e4425342d1f383c232f3c223a44233043212b3322576b339d9981
+86874a4e4425383c2324261c24261c24261c342d1f24261c24261c24261c24261c
+272c1f383c23443623272c1f24261c272c1f272c1f2b3322333522344d1e304321
+3f4e1e4b681e708f3160832a49601f576a1f4b681e6b852c8e9f3b757b2d68752b
+76872d68752b556024576a1f576a1f41671b6b852c697c2b7b90345f7b2a708f31
+576a1f49601f656c266b852c6b852c55602476872d55602454742860832a6b852c
+4b681e49601f697c2b7b90347d9736757b2d68752b767b47576b3349601f47581f
+68752b77874668752b697c2b47581f5f7b2a4b6933354c312f3c222f3c222b3322
+344d1e5e7429576a1f3f4e1e657c448ea0593c5822496032304321333522333522
+2f3c223043212b3322344d1e3d5f25767b47666b3b3043213c582247581f304321
+4b6933567f3a4b69333f4e32576b33657c445f7b2a627444496032496032496032
+3f4e1e496032778746657c44657c44627444697c2b56603a547428618345618345
+6f8f52567f3a497323547443497323576b33567f3a4b6933344d1e2e3c442a3438
+333522496065576b3341671b4b69333d5f253d5f253d5f254b69334b6933344d1e
+3f4e322f3c22383c23475832657c445474286274443d5f253f4e1e30444d304321
+344d1e41671b4b69334b69334b69336b8545819f596f8f525f7b2a7f975392a759
+7f97536b852c576b33497323576b333c5822576b3349601f657c446f8f526b852c
+6b8545576b335f7b2a3043213d573b304321304321576b3360832a5474285f7b2a
+41671b49601f5e74296183456f8f52496032354c313043212f3c222f3c222f3c22
+2b33223a4423354c31354c313f4e32547428708f31567f3a5f7b2a3d573b304321
+3c58224b693341671b3d5f253d5f2560832a567f3a5f7b2a618345819f597b9034
+567f3a4b6933547428576a1f6b8545576b33657c44547428618345567f3a657c44
+4b6933576b33547443354c31354c3170908192a88d92a8b6afc0ab92a88d8ea089
+92a88d94afa19ea88ebacdd9b0b8a3b8c1afb0b8a3afb9bcb8c1afb8c3c6cdd5de
+d4dcd0a3b7a47d90827c90538ea089a3b7a47e98823d573b3d5f255f7b2a567f3a
+657c44657c447c90537c90536b85454b69336b8673597c755474434758323c5822
+4960322f3c22262e353f4e326274447d90829fb0bba3b7a49ea88e8ea0897d9082
+7f97537787727c90536b86736f8f527c90537d908292a88d7c90537d90827c9053
+8ea0598c98536f8f527c9053778746547443576b337787468c98537787465e7429
+62744449732377874676872d6b85458b98828ea0597d90828ea0598b98828b9882
+657c444758323a44238b98828b90805e74296b8545697c2b6b85455e7429657c44
+354c31272c1f342d1f2f3c222f3c223f4e1e344d1e576b334b693349601f6b852c
+7787465560244b681e3f4e1e3f4e1e3a44232b3322333522383c233f4e1e49601f
+5560244b6933576b33383c233a442347581f3a44233a44233c58223f4e32778746
+766e2d383c233f4e1e4973235e7429547443697c2b708f31557f22697c2b708f31
+7b903460832a697c2b576a1f5e74296b852c6b852c576a1f5f7b2a6b852c7b9034
+5f7b2a47581f3043213335222b3322576b3377874668752b55602468752b47581f
+41671b68752b7b9034697c2b6b852c656c2668752b80a03b7b903476872d7b9034
+7d97366b852c7b9034757b2d49601f5e74293f4e1e33352255602474643e4e3d22
+74643e74643e272c1f383c23666033766e2d857d67767b47666033666b3b383c23
+3335222b3322333522272c1f2b3322383c233a44233043213a44233335223f4e1e
+4e44253f4e1e574f264436231c1e1924261c24261c24261c24261c24261c24261c
+1c1e19342d1f333522342d1f333522333522272c1f272c1f2b33222b33222b3322
+304321344d1e4b681e49601f30432149601f5f7b2a76872d6b852c697c2b697c2b
+68752b556024556024576a1f4b681e49601f5e742947581f576a1f5e7429656c26
+49601f3d5f255e742976872d7d9736708f3192a7595e7429697c2b5f7b2a708f31
+3d5f2549601f7b90346b852c7b903476872d77874676872d68752b5e74296b852c
+68752b76872d76872d49601f576b333f4e1e6b85454b681e344d1e3a44233f4e1e
+49601f344d1e4b69333f4e1e576b337787466660333f4e1e2b33222b33222b3322
+304321354c31344d1e3043213043214b6933556024344d1e41671b3c58222f3c22
+576b335474435474434960326274446b8545657c44576b335474434b6933547443
+4b6933576b33778746627444657c44576b334960325560245e74296b8545708f31
+567f3a6b8545618345567f3a3d5f25354c31547443576b33344d1e2f3c222f3c22
+2f3c22344d1e567f3a4960324658644960323d5f25475832657c444b6933354c31
+3043213043213336422a34384b6933576b3349601f344d1e304321354c314b6933
+5474434b69334b69335474434b6933657c44708f31708f3154742860832a7d9736
+719753708f316183456b852c708f314973235f7b2a547428576b33708f316b8545
+4b693349601f4b681e344d1e2f3c22262e35344d1e4758325e74295474436b852c
+6183453c58224b681e54742849601f2f3c223335223335222b33222b3322304321
+2b3322272c1f3335222b33223a44233043216b8545576b33344d1e496032496032
+3c58226b85453d5f254b69333d5f255474437f97533c582249601f496032576b33
+576b335474284b69333d5f2547581f3f4e1e4b69336f8f525f7b2a3d5f256f8f52
+6183453d573b3d573b3c58223d5f25597c758b98828ea089a0b09f7f9753657c44
+6b86736b86737e98828ea0899ea88e95af7aa0b09f8ea0899ea88e8b9080a0b09f
+cccdcc95af7a8ea0596f8f52667c74afc0abb0b8a34960323d5f25576b33496032
+657c447d97367b9034778746576b334b6933576b33496032567f3a547443475832
+354c312f3c22304321304321657c446374716374717090816b85457787728ea089
+6f8f527787466f8f526b85456183453d5f25778772a4bb7e819f596b85456b8545
+7f97537f97538ea0596f8f52657c4454742841671b657c446b8545697c2b5e7429
+5f7b2a5474284b6933697c2b6b85457787466b8545576b337c9053819f598ea059
+6374717787464e50439ea08a8ea0593f4e1e3c58224b6933697c2b576b334b681e
+47581f2b3322272c1f3a4423272c1f272c1f3a442368752b556024496032697c2b
+6274443a44232f3c223a44233f4e1e3f4e1e47581f697c2b576a1f5560245e7429
+49601f344d1e576a1f383c232b33223a4423383c23383c233f4e1e3f4e1e767b47
+767b47333522344d1e576a1f47581f576b3376872d60832a5e74296b852c5e7429
+5e74295e7429576a1f5e7429576a1f5e74295f7b2a697c2b7d97366b852c576a1f
+5e7429557f22576a1f2f3c222f3c22344d1e47581f4b681e5f7b2a656c26697c2b
+6b852c76872d76872d68752b708f313c582249601f6b852c7b90348c98357b9034
+8c983576872d7b9034576a1f3a442347581f3a44232f3c2256603a74643e574f26
+74643e4e3d22342d1f342d1f4e5043666033666033666b3b4e50435658383a4423
+2b3322333522333522272c1f2b33222b3322383c23344d1e304321342d1f496032
+383c233a44233f4e323a44232f3c223a44232b3322342d1f1c1e1924261c24261c
+24261c24261c342d1f333522333522333522383c23272c1f24261c2b3322304321
+3f4e1e2f3c22333522344d1e4b681e708f31708f318b903376872d697c2b47581f
+4c502655582447581f4b681e576a1f5f7b2a47581f47581f54742876872d47581f
+3f4e1e41671b4b681e656c2649601f49601f697c2b60832a80a03b697c2b5e7429
+697c2b8c98358b90338b905576872d7f975376872d697c2b6b852c767b474b681e
+68752b697c2b708f31697c2b576a1f49603262744447581f3d5f253a44233d5f25
+41671b5474283d5f25304321304321576b335f61562b33222b33222f3c22333522
+2b33223335222f3c223f4e1e3043213a4423354c31344d1e49601f49601f304321
+576b334b69337c90537c90537f97537f9753576b335e74296f8f52618345496032
+3f4e32657c446274443c5822576b334960323f4e324b69337197536f8f52618345
+41671b4b69337197536f8f523c58224b6933354c313c58224973233d5f25344d1e
+3d573b4b69336b852c4973233043213c5822354c313c58225474435f7b2a304321
+3043213f4e322f3c2256603a697c2b657c44576b334758323f4e324758325f7b2a
+576b333d5f254b69335474435474436f8f526b85456f8f525f7b2a5f7b2a6f8f52
+7197326f8f525f7b2a60832a5474284b69335f7b2a618345576b33657c445f7b2a
+4b681e6274445474433f4e1e3043213043214758324b6933576b334b69335e7429
+657c44354c315474285474284960324758322b3322373e43262e35333522394446
+3335223335223f4e32304321354c312f3c224758324960323a4423304321475832
+47581f567f3a3f4e1e547443344d1e4973237f97533d5f253f4e1e4b69334b681e
+4b69335f7b2a41671b4b69333c58222b3322304321547443618345547443576b33
+4973233d573b3043213d573b41671b6b867392a88d8ea08971975396b7ab92a88d
+5474437e9882a3b7a492a88d95af7a95af7a8b988292a75992a88d92a7598b9882
+81a089757c716f8f525474435f7b2a7e9882a0b09f7d9082657c443f4e32304321
+576b33547443657c446b852c567f3a576b333d5f25496032657c444b69332f3c22
+2b33223043212f3c223f4e326274444b6933547443657c44657c446f8f527d9082
+6183456f8f526f8f52547428547428576b334960326b86737c9053557f226b852c
+708f318c98537c9053657c445f7b2a6274444b681e5f7b2a7c9053778746547443
+5e74295e74294b69336b8545657c44627444576a1f576b337c90537787466b8545
+56603a8ea059767b4787886dada17f4960323f4e323f4e1e4b6933576a1f576a1f
+47581f3043212f3c22344d1e2b3322272c1f2b332249603247581f657c445e7429
+47581f3043212f3c222f3c223f4e1e576a1f7f975376872d576a1f5e7429697c2b
+4758323a4423576a1f3f4e1e383c233a44232f3c223a44233a442330432156603a
+867c4c383c233a44233f4e1e2f3c225f7b2a6b852c5e742960832a576a1f697c2b
+6b852c6b852c576a1f5f7b2a6b852c6b852c5f7b2a5f7b2a76872d656c263a4423
+49601f5f7b2a5f7b2a3a442333352230432147581f6b852c76872d576a1f5e7429
+7d973676872d576a1f5e742960832a5e74294b681e5f7b2a7b90348e9f3b7b9034
+8c983576872d8b90336b852c49601f2f3c222b33222f3c22767b4774643e66592c
+74643e443623342d1f272c1f342d1f373e43383c23555824666b3b4c50263a4423
+383c232f3c223a44233a4423383c23272c1f2b3322344d1e4c50262b33223f4e1e
+47581f383c233a44233f4e1e47581f576a1f76872d656c264e4425342d1f342d1f
+24261c24261c342d1f342d1f342d1f342d1f383c233a4423383c233a44233f4e1e
+3f4e1e3f4e1e2f3c222f3c225474286b852c8c983576872d5e7429576a1f3f4e1e
+574f2655602447581f68752b47581f41671b5f7b2a76872d697c2b4b681e344d1e
+3c58223f4e1e3f4e1e4b681e3043212b33223f4e1e6b852c8ea83e76872d76872d
+8b90338e9f3b8c98538c98356b852c68752b6b852c5f7b2a68752b697c2b555824
+4b6933576a1f697c2b697c2b576b3349603247581f3f4e1e47581f5f7b2a557f22
+5474285f7b2a41671b49601f3d5f255474438c9853344d1e3f4e1e304321304321
+2b33222f3c22344d1e3f4e322f3c222f3c223a4423304321344d1e2f3c223f4e1e
+8c98537787467c9053657c446f8f527f97535474435f7b2a618345547443496032
+3f4e326b85456f8f524b6933657c446b85455474286b85457c90536b852c6b8545
+5474284973235f7b2a6183454b69334b69333d5f25344d593d573b3d5f253d573b
+3d573b497323547443567f3a4960325474434960323043213f4e1e496032304321
+354c31354c313a4423576b336274443f4e322f3c223043213043213d5f253d5f25
+3f4e32496032597c756b85453c58223f4e326b85457197535474286f8f526b8545
+7b90346b8545547443557f226b85454b69333f4e32657c446b852c5e7429627444
+778746496032344d1e49601f576b33657c446b852c4b69335e742968752b576a1f
+4960324b69334b69334758323a44232f3c22272c1f333522333522383c232b3322
+383c235f6156666b3b5558243043212f3c222f3c223d5f253d5f25344d1e496032
+5f7b2a5f7b2a3c58223c58224b6933557f22657c444b69336274444b6933576b33
+6b85455e74294b69333d5f253c5822344d1e3d573b4973236b85456f8f526f8f52
+547443354c312e3c44354c314b6865597c75576a6260832a6b85458ea08992a88d
+8c98537e98826f8f527787467e98827f97537c9053819f597c905392a88d81a089
+7f97534960323f4e32576b336183456b85459ea88eafc0ab7e98823c5822576b33
+4b69333f4e326b8545778746657c44576b33344d1e354c31576b333f4e32354c31
+354c312f3c223d5f25567f3a657c44496032496032657c446b86738ea0897f9753
+7197537c90535f7b2a4b69335474433c58225474285e7429657c445474286b8545
+8c98537c90537787466b8545576b33576b334b69335e742960832a657c443f4e1e
+576b3347581f475832657c44576a1f56603a6274445e7429657c445e74295f7b2a
+47583275704daea8868b9882c0b1974b681e47581f475832576b334b681e5e7429
+5f7b2a576b33576b3355602447581f304321344d1e344d1e47581f708f314b6933
+2f3c2230432147581f4b6933778746778746697c2b767b47656c267787464c5026
+2f3c223f4e3256603a6660333335222b33223043212f3c224c50263f4e1e556024
+767b473a4423344d1e344d1e30432154742854742876872d6b852c576a1f6b852c
+708f317b90345474286b852c6b852c6b852c76872d6b852c697c2b5560243f4e1e
+5560245f7b2a60832a47581f2f3c22344d1e3c582249601f3f4e1e344d1e556024
+5e7429557f226b852c708f317d9736708f3176872d7b903480a03b7d97365f7b2a
+5e7429757b2d5e74295e74294b681e3a44234e4425304321697c2b574f26766427
+604f2a33352224261c342d1f342d1f3335224e4425565838666b3b4e4425383c23
+383c233335223f4e1e49601f383c233335222b332241671b697c2b3a44235e7429
+49601f4436234c5026576b33556024697c2b76872d76872d8c985376872d68752b
+333522342d1f342d1f342d1f383c233335224e3d223043213a4423576a1f4b681e
+3c5822576a1f4b681e3c5822576a1f6b852c5f7b2a6b852c697c2b5e7429556024
+697c2b7b90345e742954742847581f49601f4b681e6b852c3f4e1e49601f3c5822
+49732347581f344d1e5f7b2a5f7b2a5f7b2a68752b7b903480a03b76872d708f31
+7b90348c98357c90537d973676872d697c2b76872d5f7b2a5e7429576a1f4b681e
+697c2b5e74295f7b2a68752b576a1f4c502647581f41671b497323576a1f6b852c
+55602447581f49601f557f2241671b576b3362744454742841671b3f4e323f4e1e
+2f3c223d5f254b681e3043212b33223335223043213f4e1e4758322f3c22333522
+92a759778746576b335474437f9753778746657c44657c445474434b6933496032
+657c447c90537197536b85455f7b2a71975361834560832a6f8f5260832a60832a
+6f8f525f7b2a567f3a3d573b496032547443304321304321304321354c312e3c44
+344d1e61834549732354744341671b4973235474434b69333c58223d573b304321
+3a4423373e43373e434c50263f4e1e344d1e344d1e4b69334b69335474433d5f25
+3d5f25576b33657c44657c44344d1e344d1e7787467d97365f7b2a4b69335f7b2a
+819f596b8545547428547428618345344d1e3c58225f7b2a5f7b2a49601f576b33
+6b85455e7429576b336b85453f4e1e547443576b334960324c5026657c444c5026
+2f3c223a44232f3c22272c1f272c1f272c1f24261c24261c342d1f2f3c224e5043
+56603a627444767b4749601f5e7429557f225f7b2a6b854560832a547428567f3a
+7f97535f7b2a41671b3c58224b69335f7b2a3c58223c58226b854576872d547428
+7787467c90535f7b2a497323567f3a708f31719753557f22567f3a6b8545657c44
+3d5f253043212f3c222b3322354c314960324b69336f8f527197536183456b8545
+8c98537e9882567f3a61834592a88d5f7b2a6f8f526f8f5292a88d7e98828ea089
+b8c3c69ea88e667c743d573b5474437090818b98828ea0596b86733c58224b6933
+3f4e1e475832547428567f3a41671b4b693349603230432156603a3f4e1e576b33
+4b693341671b4b693354744349732349603254744392a88d7d908292a88d7c9053
+576b33547428618345567f3a4b69334b681e4b681e4960324b681e496032627444
+7c90537b90347b9034657c44576b33576b33576b335560246274445e7429576b33
+49601f47583247581f576b333c58223f4e1e576b33576b337787467787467e9882
+576b334b69339fa857aea886b1b0694758323f4e1e344d1e3d5f2549601f3c5822
+55602449601f819f5992a7597d97366b852c576a1f4b681e6b854576872d47581f
+344d1e5e74295e74295f7b2a5f7b2a6b85454b681e47583249601f6b85453c5822
+344d1e344d1e383c2347581f2f3c222f3c222f3c223335223f4e322f3c22475832
+6b85454c50262f3c222f3c223043213c5822344d1e4b681e557f2276872d7b9034
+76872d7b90346b852c697c2b60832a708f3176872d5f7b2a757b2d3a442347581f
+697c2b6b852c6b852c576a1f2f3c223f4e1e55602447581f344d1e2f3c222b3322
+2b33223f4e1e5e742976872d76872d6b852c708f317d97367b90347d9736576a1f
+344d1e47581f656c2654742847581f5560243f4e1e383c236660336660334e4425
+443623342d1f342d1f262e35333522333522383c23383c233f4e324c5026383c23
+3a44233a4423656c2655602449601f3043213a4423576b335f7b2a3a442349601f
+5558243f4e1e766e2d9e985386874a8b903386874a8c98538c98538b90338c9835
+697c2b656c264c50263a44234e44253335222b3322383c232f3c22576a1f5e7429
+3f4e1e497323697c2b576a1f576a1f60832a5e74296b852c76872d697c2b6b852c
+7b90346b852c49601f49601f5f7b2a5e7429656c2649601f3f4e1e30432141671b
+3c5822576a1f6b852c6b852c6b852c697c2b76872d8c9835708f316b852c7b9034
+92a759697c2b6b852c7f97537b90347787465f7b2a5e742949601f5e742949601f
+49601f547428697c2b60832a60832a547428576a1f76872d697c2b576a1f555824
+344d1e3c582241671b4b681e4c50262f3c223f4e32475832344d1e3d5f253d5f25
+3d5f253d5f253d5f253a44232f3c222b332256603a56603a383c232f3c222f3c22
+819f59657c44576b33576b338ea05992a759819f59657c44576b33576b33354c31
+3d5f255474437f97534b69334b69336b854560832a567f3a618345567f3a618345
+60832a6b85454b69333d5f25547443567f3a3d573b3d5f25373e432f3c222b3322
+3043216b85454b69334b693360832a4b69334b681e4b69335474285474433d573b
+2f3c222b33222f3c223944462b33223d5f25576b334758323a44233f4e32496032
+6183455474433f4e324b69335474435f7b2a6f8f5260832a6b85455f7b2a6b8545
+7f97536b85456183454b681e657c445560244b6933547428576b334b69333f4e1e
+6b854568752b47581f4758322f3c22576b3349603256603a3a4423354c313a4423
+2b33223043213c5822342d1f272c1f272c1f272c1f272c1f272c1f3335224e5043
+3a44233f4e32657c446b852c60832a5e74295f7b2a60832a547428576b3349601f
+657c446b85456f8f524b681e6f8f5260832a3c5822344d1e3c58224973237b9034
+7f97535e74295f7b2a61834561834580a03b6b8545557f223d5f253d5f25354c31
+3d5f254b68653043212a34382b3322354c314b6933597c75618345567f3a618345
+7c9053657c444b69336084717197536f8f527f97536b85457197536f8f524b6933
+6b86737c9053576b33576b337e988295af7a6b8545657c445f7b2a576b335f7b2a
+4b6933576b3360832a7787464b69333f4e323f4e32304321344d1e304321496032
+4960324960324960324960323c58223f4e326f8f527c9053657c44618345657c44
+4758323f4e326274446b85454b693354742854742849601f4b681e4b681e627444
+3f4e1e56603a5f7b2a6f8f525f7b2a657c444b69333f4e1e47583249601f657c44
+3c58223c58223f4e1e576b334b6933475832576b33576b336f8f526b852c627444
+5e74294b6933778746c0b197c0b1974758323a44233f4e1e627444576b3349601f
+3a44233043214b681e7787467c90537d97367d97367f97538c98537b90344b681e
+576b33547428475832697c2b576b336b8545576b333f4e1e496032576b3347581f
+47581f344d1e2f3c223f4e1e383c232b33222f3c22272c1f3043212f3c2247581f
+767b475658382f3c2230432130432147581f4b681e5e742976872d708f31708f31
+7d97366b852c708f3176872d6b852c708f316b852c60832a76872d47581f344d1e
+576a1f49601f697c2b576a1f383c2349601f576a1f5558243f4e1e3a4423272c1f
+272c1f30432149601f5e74293f4e1e5e7429576a1f76872d6b852c697c2b5e7429
+4b681e344d1e4c502668752b5e74294c50262f3c222b3322333522383c23333522
+443623342d1f342d1f24261c2b33223a4423555824333522383c233a4423333522
+3335224e442556603a6b852c5e74293f4e1e344d1e697c2b697c2b576a1f6b852c
+76872d76872d7b90347b90348b903380a03b7b90348b90338b90336b852c6b852c
+a1af4e9fa8578b90558b90558b90557664273a4423383c233a442368752b576a1f
+5f7b2a6b852c6b852c68752b576a1f60832a576a1f3c5822697c2b6b852c708f31
+5e74294b681e344d1e4b681e708f316b852c4b681e576a1f3f4e1e3f4e1e3c5822
+3f4e1e5474287b9034576a1f697c2b76872d7b90348ea0597f97537b90345e7429
+5474285f7b2a557f22697c2b697c2b6b852c6b852c76872d656c2649601f49601f
+5f7b2a697c2b55602449601f697c2b6b852c7b90344b6933556024708f31576a1f
+344d1e3043213d5f254b681e4b681e3f4e1e3335223a44233a4423304321344d1e
+344d1e4758323a4423383c232f3c222f3c223a44232f3c22383c233a44232b3322
+7e9882627444354c316274448c98538ea0598c98534b69333c5822344d59354c31
+354c313f4e324b6865354c31304321567f3a6b8545547428567f3a3c58223d5f25
+41671b567f3a49601f475832708f316b85453d573b3043212f3c22272c1f2a3438
+2f3c2261834560832a4b69333f4e324960324960323d5f25576b33576b333d5f25
+496032666b3b627444475832475832657c443d5f252f3c222a34382f3c223c5822
+6374713f4e322f3c223d573b6b8545708f3192a7597f975392a75992a759819f59
+7d97366b852c576b334960323f4e1e3a44234b69334960323c58224960323c5822
+656c266b854547581f3f4e1e3043212f3c223043213c58222f3c22576b33354c31
+2f3c224c5026576b333f4e3224261c272c1f342d1f24261c24261c24261c272c1f
+272c1f3a44235e74293f4e1e47581f344d1e3f4e1e6b852c76872d4b681e354c31
+5e7429697c2b656c2649601f7c90536183454b6933344d1e576b336b8545778746
+5f7b2a5f7b2a60832a708f31576b3349603247583241671b41671b3043213d573b
+41671b41671b2f3c222f3c222b3322344d594b69334b69334973235f7b2a6b8545
+5474436f8f524b69335474436183456b8673819f596b85456183456f8f52567f3a
+3c58224b6933657c445e7429627444547443576b336f8f525f7b2a41671b5f7b2a
+49601f5f7b2a618345657c443d5f25304321354c3147581f5474434b69333d573b
+496032354c31304321354c313c5822354c314960325474435474434960323d5f25
+344d1e344d1e496032547428576a1f41671b496032344d1e4758323f4e1e496032
+56603a4758327787727c9053657c445f7b2a47581f3a44233f4e1e5e7429576b33
+3c58224758323f4e1e4758326274445e74296274445e7429767b475f7b2a4b681e
+657c44475832576b339a9178c0b8a6666b3b3043214c5026697c2b76872d557f22
+47581f3f4e1e49601f49601f7b9034819f598c983576872d6b852c757b2d697c2b
+76872d576b333043214758325558243f4e1e3f4e1e2f3c223a44233f4e1e3f4e1e
+47581f3335222b3322383c233f4e1e3043212f3c223a442347581f55602447581f
+86874a4c50262f3c22344d1e344d1e2f3c224c502655602449601f656c26708f31
+5f7b2a4b681e49601f697c2b697c2b7b9034697c2b68752b76872d76872d68752b
+5560243f4e1e60832a697c2b68752b697c2b697c2b49601f3043212f3c222b3322
+383c23272c1f3a4423383c233a44233f4e1e3f4e1e6b852c5e7429576a1f5e7429
+656c263f4e1e383c23383c234436233335222f3c22555824576b33565838383c23
+443623342d1f342d1f24261c3a4423697c2b4c5026342d1f342d1f333522333522
+342d1f2b33224c502677874649601f3043215e74297197327b90348ea0595e7429
+5f7b2a7787465f7b2a576a1f5f7b2a76872d6b852c8c985376872d6b852c7b9034
+95af7a8b9033697c2b9fa0569fa8578e9f3ba0a03a76872d6b852c708f3160832a
+6b852c6b852c557f2260832a60832a76872d576a1f49601f47581f576a1f5e7429
+47581f3f4e1e3f4e1e49601f576a1f47581f576a1f76872d49601f576a1f6b852c
+6b852c697c2b7b90347b90348c9853aeb84e92a7598c98356b852c5e74297c9053
+4b681e5f7b2a547428697c2b576a1f576a1f5e74294b681e576a1f76872d697c2b
+576b333a4423383c233f4e325f7b2a76872d697c2b656c2647581f3f4e1e304321
+2f3c223335223a4423497323576b33344d1e2b33223a44233a4423304321304321
+2f3c222f3c222b33222f3c22272c1f3a4423383c232b33222b33223a4423272c1f
+5474434758323043216b854592a7597f97536b8545475832354c31304321354c31
+30444d3043213043213043214b69334b69336f8f526183454973234b6933657c44
+5474286b85457c9053567f3a697c2b6183453c5822354c313d573b2f3c222a3438
+3043215474434b6933344d1e3043213d573b3f4e323043213043213d5f25496032
+4b69336b85457c9053697c2b5f7b2a5f7b2a3f4e32354c31344d1e3f4e323d573b
+344d1e2f3c222e3c443d5f256b85455f7b2a6183456b85457c905380a03b92a759
+819f597b9034547428576b33354c312b33223d5f253d5f253043213c58225e7429
+68752b6b8545576a1f657c444758322b33222f3c224b69334c50263f4e322f3c22
+2b33223a44233335222b332224261c24261c24261c342d1f24261c24261c262e35
+383c234758324960322f3c222f3c224b6933344d1e4b693347581f49601f4b6933
+6b8545576b333c58226b85457d97364b681e6b85455f7b2a5e742954742849601f
+6b852c4973235e742949601f3d5f255f7b2a496032547443344d1e354c313d5f25
+3d573b3d573b3043212a34383043213d573b354c31344d1e4b6933567f3a4b6933
+4b69335474433f4e32657c445474286b85455474285e74295474436b85454b6933
+304321344d1e56603a30432147581f4960323d5f254973236b8545576b333c5822
+4b69336b85455474285e7429576b333c58223043213f4e1e5474284b6933547443
+47581f304321344d1e3d5f254b69333c58223f4e323f4e1e496032354c313a4423
+4b69334b69333d5f256f8f52697c2b576b33344d1e304321344d1e4758323f4e1e
+5f7b2a7c9053667c747f97536f8f525474434b69333c58224758324b69335e7429
+49601f475832344d1e3a4423496032657c44656c26576b337b9034657c44547428
+49601f47581f576b33767b47cfc6b87787464c50266b85457f975376872d7d9736
+5f7b2a54742860832a5e74297b90347d97368c98358c9853708f318b90337b9034
+7b903449601f344d1e3335223043213a44232f3c22333522344d1e3c5822344d1e
+3f4e1e2b3322272c1f2f3c224c50263f4e1e3f4e1e656c266b852c49601f627444
+8c9853767b47344d1e47581f3f4e1e2f3c222f3c222f3c222f3c223a442349601f
+3a4423383c232f3c222f3c22576a1f697c2b49601f47581f8b903376872d757b2d
+383c233f4e1e76872d76872d76872d6b852c76872d68752b3a44233043212f3c22
+47581f272c1f272c1f2b33224b681e3a44232b33225560245f7b2a576a1f5e7429
+576a1f555824333522342d1f272c1f3a4423656c26778746767b47666b3b66592c
+4e3d224e3d22443623383c23627444697c2b3f4e1e3a442366603356603a333522
+342d1f3a4423556024656c26344d1e47581f76872d7b903476872d8b90337b9034
+697c2b4b681e5f7b2a576a1f6b852c5f7b2a5e742976872d8b90338c98536b852c
+576b337b90347d97367b90348b90338c983592a7598c9835697c2b697c2b697c2b
+76872d697c2b5f7b2a6b852c6b852c76872d697c2b47581f3c58223c58223f4e1e
+47581f3f4e1e47581f344d1e3c58223f4e1e76872d7b903476872d697c2b76872d
+8b903376872d8b90338e9f3b8b903376872d8e9f3b697c2b708f316b852c576a1f
+49601f576a1f3d5f25576b3349601f697c2b576a1f576a1f576a1f54742876872d
+576a1f3a4423383c233a44235e7429576a1f5e74293f4e322f3c223f4e1e2b3322
+2f3c222f3c222f3c22344d1e3c58223c58223043212f3c225658383f4e1e3f4e1e
+304321304321272c1f2b33222f3c222f3c22333522383c23333522383c233a4423
+3d573b3f4e32354c31657c448c985392a7597c90534960323d573b304321354c31
+304321354c313043213f4e32567f3a708f31708f31657c44557f22567f3a4b6933
+5474286f8f526f8f526b85457c90536f8f525f7b2a5474433f4e32262e35333522
+2a34383335222f3c22373e434960323f4e1e3d573b3f4e323d573b4b6933496032
+3c58224960324b69335560243f4e323a4423344d1e3c58224b69334b69333c5822
+354c314b693349732361834580a03b6f8f525f7b2a77874692a7597c90535f7b2a
+7f97536b85454960323c58223f4e1e2a34382f3c223f4e323043213a44234b6933
+3f4e1e47581f62744447581f3c58224758323043212f3c223335222b332224261c
+1e241b342d1f262e3524261c272c1f24261c1c1e1924261c24261c272c1f24261c
+3335224c50264b6933576a1f47581f3a44233f4e322f3c223a4423576b3376872d
+5e74293d5f25344d1e5e74298ea05949732360832a6b85457b90346b852c60832a
+5e7429657c444b681e4960325474286b8545557f224973234b6933344d1e2f3c22
+354c312f3c223043212f3c22354c31354c31354c313d5f253d573b4b6933547428
+4b69333c5822354c31475832657c44497323547443567f3a5f7b2a5f7b2a49601f
+354c312f3c223f4e1e3f4e1e49601f5474284b681e576b336b852c4b693347581f
+4b681e547428778746567f3a557f225474283c5822354c313043213043214b6933
+657c445560243f4e323c58224b6933354c31344d1e354c313a44233a44233f4e32
+3d573b4b69335f7b2a4b693349603249732354742849601f4b681e49601f576b33
+576b336274446183456b86737c9053497323557f224960324b693349601f657c44
+47581f3f4e1e3f4e1e3f4e1e47581f6b85457c90535e74296b8545576b33697c2b
+4b69333f4e1e576b33767b47cfc6b868752b576b3368752b6b85457b90347d9736
+7b90347b903480a03b7c90538ea0598c98357d973676872d7b90348c98538b9033
+77874647581f3a44233f4e1e47581f3c58223a44232f3c223f4e1e3f4e1e49601f
+49601f2f3c22272c1f3043213f4e1e47581f697c2b76872d68752b47581f496032
+8b905595885c3f4e1e5e742949601f49601f2b33222b33222f3c223f4e1e3a4423
+383c232b3322272c1f272c1f576a1f76872d556024576a1f76872d76872d556024
+272c1f3a442368752b6b852c757b2d757b2d757b2d6660333a44232f3c2247581f
+697c2b3335223335222f3c225e74293f4e1e2b33223f4e1e5e74295e742966592c
+5558244c50262f3c224c5026576a1f7c9053a4bb7e9fa8579fa056666033666b3b
+5560245558244c50266b852c5474286274445560246660335658384e4425333522
+342d1f2f3c2247581f576a1f55602476872d697c2b4c5026475832576a1f76872d
+6b852c697c2b708f31557f226b852c5f7b2a697c2b7b903487872c8b9033757b2d
+3f4e1e576a1f5e74295f7b2a5f7b2a6b852c6b852c6b852c6b852c6b852c697c2b
+697c2b557f2276872d8e9f3b8b90336b852c7b903476872d576a1f344d1e304321
+49601f5e742949601f47581f60832a708f317b90347b90347d97367b9034757b2d
+757b2d697c2b757b2d87872c8e9f3b8c9835697c2b576b336b852c54742847581f
+49601f4b681e49601f4b681e4b681e4b681e656c265e74296b852c3d5f253f4e1e
+4b681e697c2b3f4e1e49601f576b333c5822344d1e2f3c222f3c223f4e1e4c5026
+496032344d1e344d1e3f4e1e3f4e323f4e1e3f4e1e3f4e1e7d9082666b3b2f3c22
+2f3c22383c232b33222b33222f3c222b33223a44233f4e1e3335222f3c224e4425
+4960324b6933354c314758328b9080819f596b85454b69333f4e32304321373e43
+3043213d573b3d573b3043214b69336b85457197534b681e41671b3d5f253d573b
+41671b6b85457b9034657c444b6933618345547428354c312f3c222a3438262e35
+3d573b3c5822657c44657c44657c445474433f4e1e2b33223f4e324b6933475832
+344d1e3f4e1e3a44235560243a442339444630432149601f576b333c58223d5f25
+3c5822547443657c444b6933657c448ea0595f7b2a657c4460832a7197535f7b2a
+5f7b2a567f3a576b3349603249601f2b33222f3c22304321354c313a44234b6933
+4960323043213f4e323a44235e74296183454b6933272c1f262e35272c1f24261c
+24261c24261c24261c24261c24261c262e3524261c3335223335222b33223c5822
+344d1e496032576b333f4e1e576a1f5e742947581f47583249601f496032576b33
+47581f3043212f3c22354c31657c4449601f497323557f225f7b2a5474436b852c
+697c2b697c2b49601f5e74295f7b2a5474286b854541671b41671b354c312b3322
+2b33222a3438272c1f262e352b3322304321354c313d5f253d573b344d1e547428
+3d573b3d5f254b6933344d1e4b6933567f3a4b6933657c445474435474433f4e1e
+304321344d1e5f7b2a6b852c576b334960323d5f25557f225f7b2a5f7b2a576b33
+3c582260832a7787465f7b2a618345576b333f4e1e2f3c222b3322304321556024
+49603247581f2b33223335222b33222f3c222b33222f3c22354c31354c313d5f25
+5474286183455474284b693349601f4b69334b681e5f7b2a76872d697c2b49601f
+576a1f697c2b6b85457f9753697c2b6183455f7b2a68752b576b334b6933656c26
+496032304321475832304321475832576a1f6b8545576b335f7b2a555824627444
+47581f47583249601f627444d3cea2ada17f5560245f7b2a697c2b708f31719753
+697c2b5e7429697c2b76872d76872d7c90536b852c757b2d7787469fa0567c9053
+7b90346b852c5f7b2a5f7b2a76872d5e742947581f4c50263f4e1e3f4e1e47581f
+3f4e1e344d1e304321344d1e4b681e5e74297b9034555824576b335e742949601f
+7787468c985347581f5560243c58223043212b3322272c1f272c1f47581f556024
+3f4e1e2b33222b3322342d1f3f4e1e68752b5e742976872d708f31757b2d4e4425
+24261c2b33224e442547581f3f4e1e576a1f3a44233335223335223335225e7429
+6b852c344d1e576a1f576a1f5e7429383c232b3322556024757b2d656c264c5026
+383c23383c234b681e697c2b7b90349fa056afb09ec2b868b1b0699fa85786874a
+76872d76872d76872d656c265e74297787468c9853766e2d666b3b3a4423333522
+333522304321576a1f767b4777874676872d666b3b3f4e1e55582454742876872d
+76872d4b681e697c2b5e7429656c2676872d68752b576a1f7b903476872d6b852c
+5f7b2a5e7429656c264b681e6b852c76872d76872d757b2d697c2b76872d4b681e
+697c2b6b852c8c98357b903476872d6b852c576a1f576a1f4c502649601f76872d
+5f7b2a60832a6b852c80a03b7d9736708f317b90347d97367b90348c98357d9736
+697c2b5560243f4e1e5560246b852c76872d5e74295e74293f4e1e49601f47581f
+3c582241671b49601f68752b47581f4b681e576a1f5e7429757b2d3f4e1e3a4423
+3f4e1e47581f4b681e41671b4b681e68752b4b681e344d1e2f3c22304321333522
+3f4e32344d1e496032344d1e3f4e1e49601f5e742949601f576b339e9853383c23
+2f3c222f3c222f3c223f4e1e2f3c22272c1f2b33223f4e1e383c233335222f3c22
+354c31496032354c313d573b8b90557c90535f7b2a4b6933354c31354c31354c31
+373e43344d1e3d573b3043213d5f256b8545708f31567f3a567f3a567f3a497323
+5474284b69333f4e32496032576b337c9053657c44496032344d1e3d5f253c5822
+6b854560832a7c90535e74294b69335474283c5822354c313c582249601f304321
+354c313f4e32304321354c314960323d5f25576b335f7b2a3d5f25344d1e3d573b
+497323576b335474287c9053819f598ea83e708f315474285f7b2a6b8545657c44
+657c447787463c58224960325474284b69335474284b6933576b334b681e47581f
+3f4e1e2f3c22383c233a442362744460832a47581f354c31272c1f2a3438262e35
+272c1f1e241b24261c24261c3336423a4423262e3556603a5e7429697c2b708f31
+576a1f697c2b76872d6b852c7b90345f7b2a3f4e1e3f4e1e576b3347581f5e7429
+4758322b33222b33224758326274444b69333c58223d5f2549601f49601f5f7b2a
+708f316b852c576b33576a1f4973236b852c6183456f8f524973233c5822304321
+272c1f2b3322272c1f2b3322262e352e3c442f3c22354c313c58223d5f25497323
+496032496032354c31354c314960325f7b2a3d5f256b85455f7b2a5474284b6933
+47583249603247581f60832a76872d6f8f526b85455f7b2a6b85456f8f52547428
+5e74295f7b2a5f7b2a6b8545475832354c31576b334b69333f4e1e4758323f4e1e
+4b681e3a4423272c1f272c1f272c1f4960322f3c22304321344d1e2f3c224b6933
+567f3a4b69334b6933496032344d1e3d5f253f4e1e4b6933657c445f7b2a497323
+4b693360832a6b85456b85455f7b2a6b85457f975368752b6b8545627444576a1f
+354c313f4e1e4758323a4423354c313c5822657c445e7429576b3356603a666b3b
+4758323c58223c582256603aafb09ec0b8a647581f60832a7c90537d97367b9034
+697c2b7787467c90535e74296b85457787465e74294b681e656c2668752b7b9034
+7b90347b9034a0a03a8c98357b90346b852c6b852c4b681e47581f47581f344d1e
+304321576a1f5e7429576b335e74296b852c757b2d47581f3043213a4423496032
+475832b1b0695560243335223f4e1e3f4e1e3043212b3322272c1f272c1f2f3c22
+2b3322342d1f24261c272c1f333522757b2d6b852c708f317b9034697c2b333522
+24261c24261c24261c272c1f342d1f3335223f4e1e272c1f24261c2b33223f4e1e
+49601f344d1e54742841671b576a1f344d1e555824556024766e2d3f4e1e383c23
+383c233f4e1e5e74297787468c98539fa8579fa857aea8869fa0568c985376872d
+8b90337b9034697c2b576a1f6b852c9d9981666033666b3b666033383c23333522
+4e4425555824697c2b656c26867c4c86874a8b9033757b2d6b852c5e74295e7429
+4b681e344d1e4b681e6b852c47581f76872d49601f656c2676872d76872d76872d
+60832a4b681e5f7b2a5e74296b852c80a03b697c2b55602447581f5f7b2a5f7b2a
+6b852c5e74297b9034757b2d5558244b681e4c502649601f3d5f255e7429719732
+8c9835757b2d87872c76872d5e74296b852c7d97367b90347b90345e7429557f22
+708f31576a1f5560244b681e5e7429576a1f7787466b852c5e742947581f3f4e1e
+41671b49601f47581f344d1e2b332247581f697c2b556024304321383c23333522
+383c234c502649601f576a1f576a1f5e742947581f3f4e1e344d1e2f3c222b3322
+2b33222b3322333522383c23344d1e5e742949601f4c5026354c318b988247581f
+3f4e1e3f4e1e3043214960322b3322342d1f2f3c224c50262f3c22342d1f272c1f
+3944464758323f4e324758328c9853657c44547443657c443d573b344d1e354c31
+304321354c31354c313043214b69336b8545708f3161834560832a60832a567f3a
+4b6933344d1e3d573b354c31344d1e657c44657c447c90536183456f8f52567f3a
+708f31557f226183455e74294b69336183455e74294b6933576b335f7b2a3c5822
+3d5f253f4e32304321354c31576b334b69334973234b69333d5f25344d1e4b6933
+4b6933657c4449601f657c448c9853819f596b8545576b336b8545497323547428
+6b8545576b33354c312f3c22547428618345576b335e74296b8545576b3349601f
+576b33576b3356603a5560245558246b854568752b4b69332b3322496032383c23
+272c1f262e35272c1f272c1f2f3c2249601f3043215e74297f975392a759a1b170
+76872d697c2b8b90558b9055576a1f3f4e324b69336b854580a03b6b8545708f31
+3f4e1e2b33223335223043215474284b681e4b69336b85456b85455474285f7b2a
+7197326b85456274448c98536b852c657c44547428708f316b854541671b354c31
+3043213043212f3c222b3322272c1f272c1f262e353043213d5f2541671b4b6933
+3f4e323043213d573b2f3c22344d1e4b6933344d1e4960324b69333c582241671b
+344d1e576b3347581f4b6933576b335474285f7b2a5f7b2a708f3160832a567f3a
+4b6933567f3a5f7b2a5f7b2a47581f3f4e1e5474434960325e74294b681e4b6933
+6274444c5026272c1f2b33223a44234960323f4e322f3c22344d1e4b6933547443
+576b33547428496032344d1e47581f4b693347581f3c58223d5f255e7429547428
+5e74293d5f255e7429576b335e74297f97538ea0597787467c90535e742947581f
+3f4e323a44233043213a442330432149601f4b69334b6933576b33475832565838
+4758324c50263c58223f4e1e9d9981c0b8a6766e2d7787468c98537d9736778746
+8c98537b90347b903449601f576a1f7787465e74296b852c697c2b576b3368752b
+8ea05976872d8b90337b9034a0a03a8b9033757b2d3f4e1e5f7b2a5e74292f3c22
+304321697c2b6b852c49601f5e74296b852c6b852c5e74295e742947581f49601f
+4e5043c1c2ae767b47342d1f3043212f3c223043213a44232b3322272c1f272c1f
+272c1f272c1f24261c24261c272c1f4c502668752b576a1f656c263a4423333522
+272c1f24261c24261c24261c24261c383c23656c26383c2324261c272c1f333522
+344d1e47581f5f7b2a697c2b49601f5f7b2a576b3355582468752b666033656c26
+576a1f697c2b8c983580a03b7b903476872d7b90348c98358c98358b90337d9736
+76872d697c2b49601f3f4e1e627444c0b1979788346660334e4425574f26383c23
+4e44255e74296b852c68752b8b90557787467c90537b90346b852c697c2b5f7b2a
+576a1f60832a5f7b2a6b852c4b681e6b852c5f7b2a697c2b708f3176872d557f22
+6b852c4b681e5f7b2a5e7429576a1f697c2b3f4e1e3a44233f4e1e5f7b2a6b852c
+76872d757b2d76872d778746656c2647581f3f4e1e49601f80a03b8e9f3b778746
+5e7429697c2b76872d76872d80a03b708f315f7b2a5f7b2a6b852c5e7429576a1f
+76872d76872d766e2d68752b68752b576a1f6b852c76872d697c2b4b681e4b681e
+49732347581f4b681e3a44232b33223a442347581f383c23342d1f333522272c1f
+2f3c223a442330432149601f49601f5e74295560243f4e1e697c2b344d1e2b3322
+272c1f3a4423342d1f272c1f344d1e576a1f4b681e4758322b3322576b336b852c
+6b852c6b852c49601f3f4e1e2f3c223335223043213f4e1e333522333522272c1f
+4758324758324658644b69337c9053618345576b334b69333d5f25344d1e354c31
+3f4e32567f3a354c31354c314b6933567f3a5f7b2a61834561834561834541671b
+3d5f253d573b344d1e354c31576b335474434960326b85455e74293c58223f4e32
+627444657c445474435f7b2a54742847581f5474435e74296f8f526183455f7b2a
+657c44344d1e2f3c224b69333d5f253f4e323f4e1e4960322f3c22354c31475832
+3c58226183457b90344b693354742880a03b6f8f52576b336b85455474285e7429
+49601f3c5822576b33344d1e576b335f7b2a5f7b2a697c2b7787465f7b2a6b8545
+76872d7787466b852c86874a76872d778746697c2b55602449601f697c2b49601f
+3d5f252b3322272c1f272c1f2f3c226b852c557f22708f316b852c6b852c778746
+708f31708f317c9053657c445e7429557f225f7b2a7b9034819f59819f5980a03b
+557f222f3c223043217f97537b9034557f22576b33576b3354744341671b496032
+6b85453d5f25344d1e6b8545557f226b852c5e74293c58223c5822344d1e304321
+3043212a34382f3c22272c1f2f3c223043212b33222f3c223c5822344d1e304321
+3a44232f3c222f3c22354c313c58224960323043213c58225e742949603247581f
+3f4e1e3c5822576a1f557f22344d1e5e742960832a5474284b69334b69335f7b2a
+5f7b2a5474435474285e74294b69334b69336274445474284b69337b9034657c44
+5474284b681e3043212f3c224758324b681e576b333d5f25547428496032496032
+3c5822354c31344d1e3c5822576b335f7b2a4b681e3f4e1e4960325f7b2a5e7429
+4b69333d5f255474436b85456b852c8c98537c90536b852c8c9853767b474b6933
+4758323043212f3c22304321344d1e576b335e74294b69333c58223a442356603a
+3a442362744447581f47583287886ddcd6d668752b5e74298c98538c98538ea059
+8c98357c90535e7429576b335e74296b8545708f318b90337c90536b852c697c2b
+9fa05676872d8c98538b90337d9736697c2b8b9033697c2b576a1f3f4e1e2f3c22
+304321576a1f576b335e7429708f316b852c6b852c4973235e742947581f3f4e1e
+3f4e32c0b1979f91543335222f3c223a44232b33222b3322272c1f2b3322333522
+24261c272c1f342d1f272c1f272c1f2f3c225558243f4e1e3a4423383c23555824
+4e4425272c1f1e241b342d1f383c2349601f697c2b3a4423272c1f24261c2f3c22
+333522344d1e5f7b2a547428576a1f708f3176872d76872d697c2b697c2b7b9034
+6b852c7d9736708f3176872d708f31708f316b852c5e74296b852c708f317b9034
+5f7b2a697c2b656c264c5026867c4cafb09e95885c766e2d4436234c502675704d
+556024556024697c2b8b90558b903386874a8b903376872d5560245f7b2a4b681e
+557f2276872d49601f6b852c7d973676872d708f316b852c7b9034708f31697c2b
+76872d6b852c6b852c697c2b576a1f3f4e1e3335222b33222b332247581f697c2b
+76872d6b852c9e98538c985368752b4b681e576a1f76872d7b90347d9736757b2d
+547428576b33697c2b5e74296b852c576a1f576a1f47581f576a1f497323576a1f
+8b90338b9033576a1f576a1f656c2649601f4b681e3c58223f4e1e49601f3c5822
+49601f344d1e3f4e1e47581f3f4e1e3a4423383c23272c1f272c1f3335222f3c22
+344d1e2f3c223a442349601f54742868752b576a1f576a1f5e74293a44232f3c22
+2b3322272c1f272c1f2b33225f7b2a60832a3f4e1e4c5026354c314b6933778746
+708f315474283d5f2560832a576b333f4e1e333522383c23272c1f272c1f342d1f
+4758324b69334960325474435e7429567f3a618345576b33567f3a496032354c31
+354c316183454b69333d5f253d5f254973235474435f7b2a60832a6f8f5241671b
+5474433d5f25618345567f3a5474285474434973236183456b85454758322b3322
+2e3c443c58223d5f254b6933354c313d5f25576b33576b335f7b2a6f8f526b852c
+4b69332f3c223a4423576b334960323f4e322f3c22354c312f3c223043213a4423
+767b477787467f97536b85456f8f52719732557f225474286f8f52576b334b6933
+5e742954744360832a4b681e5f7b2a6b85456b852c6b85456b852c7b90345f7b2a
+547443576a1f5e74297b90348c98537d97367787467c90537c9053697c2b5f7b2a
+4b69333043212b3322272c1f2b33225f7b2a719732557f2260832a49601f3f4e1e
+47581f576b3347581f2f3c2249601f719753708f3180a03b819f595f7b2a5f7b2a
+6b852c41671b3c5822708f3176872d7197325f7b2a3043213f4e1e354c312f3c22
+5474283c582249601f7f97536f8f527b903460832a3f4e1e3d5f25344d1e344d1e
+2a3438272c1f2b3322272c1f3043213043212b33222a3438344d1e3043212b3322
+2f3c223335222f3c223a44234b69335f7b2a3d5f25576b3349732349601f576b33
+5558243d5f255e74296183455474285e74293c58223f4e1e344d1e49603249601f
+3f4e1e3f4e323f4e1e344d1e4b681e5474284b69334b6933657c44708f31576b33
+3c58225f7b2a5e742941671b4b69335f7b2a567f3a4b681e576b334b6933475832
+3a44233a44233043213d5f253d5f25496032697c2b556024354c31576a1f5e7429
+576b333f4e1e47581f576b33576b338c98538c985376872d819f595560243c5822
+4c50262f3c222f3c2230432149601f5e742949601f576b33344d1e2f3c22383c23
+4c5026666b3b666b3b4c502675704de0dfc686874a5f7b2a7c905368752b576a1f
+49601f4b69335474287b90348ea059697c2b656c2677874677874676872d6b852c
+77874676872d778746757b2d76872d697c2b7b90348c98355e74295e74295e7429
+4b681e4c5026697c2b556024657c44576b3377874649601f5e74293f4e1e3a4423
+3a44239a9178aea8864e3d22383c23342d1f2b33222b3322272c1f272c1f333522
+272c1f272c1f24261c272c1f272c1f2b3322383c2347581f47581f342d1f333522
+3a4423342d1f1e241b2b3322383c23697c2b76872d4e44253335222f3c223c5822
+344d1e3f4e1e7b90346b852c76872d576a1f49601f697c2b8c98356b852c6b852c
+708f31708f31708f316b852c6b852c708f316b852c576a1f5e742976872d708f31
+4b681e697c2b887b2c5560249a9178b2a85695885c867c4c66592c3a442366592c
+75704d576a1f697c2b8b90558c98538b90338b905549601f68752b5f7b2a60832a
+6b852c6b852c4b681e49601f49601f47581f7b903476872d5e74297b90346b852c
+8e9f3b708f316b852c49601f2f3c222f3c222b33222b3322272c1f3f4e1e656c26
+76872d757b2d757b2d68752b68752b697c2b697c2b5e742960832a6b852c8e9f3b
+76872d656c263f4e1e55582449601f576a1f47581f5e74295474284b681e4b681e
+47581f5e74294b681e47581f3f4e1e4b681e49601f344d1e2f3c22344d1e3d5f25
+3043213f4e1e4b681e47581f574f263a44232f3c223043212b332249601f3d5f25
+49732349601f3043213a44233c58225558245560243f4e1e47581f30432149601f
+49601f2f3c222f3c222f3c2241671b6b852c49601f47581f304321576a1f767b47
+6b852c576b335e7429708f3141671b47581f333522383c23333522272c1f2b3322
+3f4e3287886d6274443d573b4b6933567f3a6f8f52657c443f4e32496032344d1e
+344d1e547443618345497323567f3a5f7b2a567f3a4b6933708f3180a03b618345
+4960323043213f4e324960324758323d5f25354c315e74296b8545576b33304321
+2f3c224758324973233d5f25354c313d5f25497323576b3349601f4b69333f4e32
+496032496032576b33576a1f3d573b30432130432130432130432130444d354c31
+5f7b2a7f9753819f596b852c7787468c98537787465e7429657c44576b334b681e
+547428697c2b68752b60832a708f317787465e7429496032576b336b8545576a1f
+4960323f4e32547443697c2b7197535e742976872d7d97366b8545557f22576b33
+5e74296b85455474284b69334b69337b903480a03b5f7b2a708f314973233f4e1e
+4b69336b852c5f7b2a3f4e1e6f8f526f8f52708f3160832a657c4460832a719753
+708f316b852c6b852c7197537f97537c90534b681e6183453c58223043212b3322
+3f4e1e49601f618345719732708f317c90537d97366f8f52567f3a3d5f253c5822
+3043212b3322272c1f262e352f3c222b33222f3c22262e35344d1e3c5822304321
+2f3c222f3c22304321344d1e576b33496032344d1e49601f47581f3a4423576b33
+5e74293c58223d5f25576a1f5e7429547428576a1f4b681e3d5f253c58223f4e1e
+304321354c3147581f4960324b69334960323d5f253c58223043215e74294b6933
+4758323f4e1e3f4e1e576b33576b33576b334960323f4e1e2f3c223a44232b3322
+2b33222f3c22354c315474435f7b2a3c5822344d1e576b335e7429576b334b6933
+576b3347581f3c582247581f47581f5e74297787468c98537b90345e74293d5f25
+49601f344d1e47581f5560244b6933576b335e74295f7b2a5e742947581f304321
+56603a4b6933576b334c5026666c5ee0dfc6857d675558246b854549601f576a1f
+3c58225f7b2a708f317b90347b90348ea0598e9f3b8c98537c9053697c2b778746
+697c2b5e7429697c2b697c2b6b852c5e7429576b3376872d76872d7b903476872d
+3a442349601f56603a3a4423576b333d5f25344d1e2b33223f4e32666033565838
+383c2395885cc1c2ae84712f656c262f3c222b33222b3322272c1f2b3322272c1f
+272c1f272c1f272c1f24261c24261c272c1f2f3c223a44232f3c222b332224261c
+24261c24261c24261c272c1f2b3322697c2b76872d5560247787468c98537b9034
+4b681e4b681e76872d697c2b5e7429344d1e3c582276872d5f7b2a47581f547428
+708f317b9034708f3176872d68752b576a1f5f7b2a6b852c60832a5e74295e7429
+55582468752b867c4c8471449fa056ada17f95885c9a9178666b3b604f2a666b3b
+767b47757b2d757b2d8b903386874a8b9055778746656c268b90335560245e7429
+7d97365e7429344d1e3f4e1e304321344d1e576a1f3c58223f4e1e557f22708f31
+708f315f7b2a5f7b2a47581f2f3c222f3c222f3c222f3c22333522556024766e2d
+76872d656c26656c26555824576a1f5e74295f7b2a708f3176872d5f7b2a5f7b2a
+576b3347581f3a44237787465560244c50263f4e1e344d1e3c58225474283f4e1e
+30432149601f5f7b2a497323557f223f4e1e47581f5560243f4e1e47581f344d1e
+3c582247581f5e7429576a1f3a44233043212f3c223a4423304321576a1f5e7429
+6b852c60832a49732349732349601f4973236b852c5e74295e742941671b547428
+3f4e1e3c58224b681e41671b49732360832a4b681e576b33576a1f54742860832a
+5474283a44233f4e1e54742849601f47581f3a442349601f576a1f3d5f25344d1e
+3f4e32576b338b90804b69335474436b85456b8545496032344d1e5474434b6933
+3d573b344d1e4b69336183456183455f7b2a567f3a567f3a60832a6f8f52567f3a
+344d1e30432130444d2b3322383c232f3c222f3c222f3c22373e433335222b3322
+627444657c446183454b69333a4423475832557f225e74294c50262e3c44272c1f
+2f3c223a4423576b33576b334960323c5822344d1e3d5f25354c312b33222f3c22
+3c58227197538ea83e6f8f52576b337d97367c90535e7429344d1e5e7429547443
+4b69335f7b2a5f7b2a576b33708f317197534b69335e7429547428576b333c5822
+2f3c222f3c22576b33697c2b6f8f527b90347787466b852c76872d60832a496032
+4b69334b681e5474286f8f5260832a7b903491af497197326b852c5474283f4e1e
+557f226b852c49732347581f4973235474286b85456b852c497323547428618345
+708f317197325474287197325f7b2a49601f556024576b333d573b2f3c222f3c22
+2a343849601f47581f4b69335f7b2a6b852c708f315474286b8545708f314b6933
+344d1e2b3322272c1f272c1f2b3322272c1f2b33222f3c222f3c22304321304321
+4960323043212f3c222f3c223d5f25576b3349601f4b693347581f344d1e767b47
+576b33344d1e657c4471975360832a5474285474285f7b2a41671b576b33354c31
+2f3c223a44234960325e742960832a4960324758323f4e1e576b335474433f4e1e
+3043213d5f253f4e324960323c5822344d1e49601f576b333335222f3c22383c23
+2b33222b33223f4e1e4b6933475832344d1e344d1e3d5f255474285474285e7429
+49603249603249603249601f3c58226b852c7b90348c98537b90346b852c497323
+5f7b2a5e74296b854568752b697c2b5e74295e74295474287787465f7b2a3f4e1e
+49601f778746576b3375704d666033cfc6b887886d574f263f4e1e3f4e1e3a4423
+4b681e708f31708f317787468c985377874686874a5e74294b681e4b681e576a1f
+5f7b2a7b90347c9053576b33576a1f4b69335e74295e74295e7429576a1f4c5026
+5558243a4423333522272c1f3a442347581f3a4423272c1f2b33223a4423666b3b
+7787469e9853c3c17a9fa0568e9f3b6b852c576a1f47581f3a44232b33222b3322
+2b3322272c1f272c1f24261c24261c24261c24261c272c1f272c1f24261c24261c
+24261c24261c272c1f2f3c223a442368752b757b2d767b47afb09eb0b86c8b9033
+656c26576b335e74295e74295474284b681e5e74296b852c5f7b2a49601f697c2b
+60832a5e7429576a1f60832a76872d76872d708f316b852c60832a47581f4c5026
+556024555824666033666b3b9e9853afb09e9f915486874a84714466592c666033
+766e2d767b47867c4c8c98358b90338b90337d973676872d77874668752b3f4e1e
+49601f697c2b6b852c576b3347581f557f225f7b2a3d5f25576a1f4973237d9736
+5f7b2a49601f3c58222f3c22304321344d1e383c233f4e1e47581f656c26656c26
+757b2d656c265e74293f4e1e556024576a1f5e742954742849601f49601f3c5822
+3a4423576a1f6b852c5560244b681e576a1f3f4e1e3a44235560244b681e3f4e1e
+3043215f7b2a8c9835576a1f557f225e74293f4e1e3a44233a44233c58224b681e
+49601f49601f47581f3a442355602447581f3a44233f4e1e5e74293c582249601f
+49601f47581f47581f3d5f25697c2b76872d656c2649601f4c50263c5822497323
+4b681e576a1f344d1e3c58225474287b903441671b49601f6b852c4b681e5e7429
+49601f2f3c222f3c2249732360832a708f31697c2b49601f68752b60832a4b681e
+567f3a5e74297c9053819f596f8f526b85456f8f52496032344d1e497323567f3a
+41671b4b69336b854560832a5474283d5f255e74295474436b852c719732618345
+4960323043212f3c222a34382a3438354c314960323043212f3c222f3c22344d1e
+6f8f525474283d5f25344d1e354c31344d1e354c313043212f3c223f4e1e3c5822
+5f7b2a6274445f7b2a5f7b2a3c58224b6933496032344d1e344d1e3f4e324b6933
+5f7b2a7c90537b90348c98536b85456b852c547428657c44697c2b4b693349601f
+47581f3d5f25657c444960325e74295e74293f4e1e4b693360832a4b69333c5822
+3c5822272c1f3c58225f7b2a567f3a5f7b2a76872d778746708f314b693347581f
+576b33657c443c58225f7b2a6b852c5f7b2a557f22708f316b852c7197326b852c
+7c90534b69333c582249601f5e742991af4980a03b708f317f975349601f3c5822
+60832a4973233d5f254b681e6183456b852c4973233c582241671b344d1e2b3322
+3043212f3c2230432149601f5f7b2a5f7b2a547428344d1e41671b497323344d1e
+2f3c222f3c222f3c221e241b262e35272c1f272c1f2b3322262e352b33222f3c22
+68752b3043212b33222b3322344d1e49601f344d1e3043213f4e1e76872d8c9835
+68752b49601f6b85457d9736567f3a5474284973235474285f7b2a576a1f2f3c22
+2f3c222b33222f3c223d5f25576b333c58223043213c582249601f3f4e1e3f4e32
+47581f49601f2f3c223335222f3c22344d1e3c5822576b333a4423342d1f24261c
+2f3c224960324b681e3c58223f4e1e49601f4b681e4b681e4b681e5e74295e7429
+3d5f253f4e1e47581f576b33576b33576a1f5f7b2a8c98536b852c6b8545697c2b
+6b85457b90347c9053697c2b7f9753708f31576b33576b335e74294960325e7429
+475832576b33576b33767b4774643ec0b19775704d383c233335223a4423304321
+3f4e1e5f7b2a6b852c767b4776872d47581f47581f344d1e47581f697c2b6b8545
+5f7b2a6b852c5e74295560243f4e1e576a1f5e742947581f556024556024383c23
+4e442568752b3a44233335224c50263c582247581f344d1e2b3322333522333522
+867c4c9d9981c3c17a9fa05676872d76872d47581f708f31697c2b4b681e697c2b
+697c2b3f4e1e342d1f24261c24261c272c1f342d1f342d1f3f4e1e3a44233a4423
+3f4e1e47581f5e742976872d7b9034778746576b3347581f8c98538c9853767b47
+5558243f4e1e576a1f697c2b60832a49601f4b681e47581f49601f2f3c2247581f
+697c2b5f7b2a5f7b2a76872d60832a576a1f76872d6b852c49601f49601f344d1e
+656c264e44254e442566592c86874aaea8869f9154757b2d867c4c766e2d757b2d
+656c26556024697c2b7787467b903476872d708f31708f3176872d556024475832
+3f4e1e7b90348c98355e7429547428708f31708f315f7b2a557f225f7b2a778746
+3f4e1e2b33222b33222b33223a44233f4e1e3a44233f4e1e5558244c502647581f
+68752b576a1f576a1f556024576a1f697c2b697c2b5f7b2a576a1f49601f3f4e1e
+47581f7c90537d97365e7429697c2b576a1f47581f86874a7b9034556024304321
+2f3c223f4e1e49601f47581f576a1f8c9835656c26304321344d1e5e7429547428
+5e74296b852c5560243f4e1e4b681e344d1e3f4e1e49601f5e74293043213f4e1e
+2b33223335223043212f3c222f3c22383c23383c233043213f4e1e3f4e1e497323
+576a1f87872c344d1e3d5f2541671b5474283c58225e742960832a557f225f7b2a
+49601f344d1e3043213c582276872d5f7b2a5f7b2a547428708f315e74295e7429
+6f8f526183456b85457c9053657c445e74297c90536b8545567f3a567f3a567f3a
+567f3a719753618345497323576b335f7b2a4973235474436183456f8f525f7b2a
+4b69332f3c223043212a34382b33222b33223f4e323d573b3d5f255474436b8545
+719732567f3a4b69333043213f4e323043212e3c44354c313f4e32567f3a60832a
+76872d8c98538ea0595f7b2a3c5822344d1e2f3c22394446496032576b33547443
+4758324b69336f8f527d97367787465e74296b8545576b33576a1f47581f496032
+3a44232f3c22576b33656c267787466b854568752b5e742947581f3f4e32344d1e
+4960322b33224960325f7b2a657c44344d1e6274447c905360832a4b6933344d1e
+3f4e323f4e1e3d5f255f7b2a6b852c7b9034547428719732708f317d9736708f31
+4b6933497323708f3160832a7197536f8f524b69334b693360832a4b681e3d5f25
+4b681e41671b3c58226183455f7b2a5f7b2a60832a708f3160832a547428344d1e
+3c58223043213c58224b69335e74293d5f254b681e4b69333c5822344d1e41671b
+3c58223043213043212b33222f3c22272c1f2b3322272c1f272c1f1e241b2f3c22
+56603a3a4423272c1f2f3c223c58224b693349601f475832555824757b2d8b9033
+8b903376872d6b852c7b9034657c446b8545576b334b69333d5f256b852c6b852c
+4b681e344d1e4b681e5474285e7429576b333f4e1e3f4e1e49603247581f2f3c22
+3f4e1e3f4e1e344d1e3a44233a4423344d1e3c58224b69333f4e1e2f3c222f3c22
+49601f5474283f4e1e354c313335223a442347581f576b3354742847581f475832
+3043212f3c222f3c22576a1f8ea0598c9853708f317d97368c98537c90537b9034
+6b852c697c2b8c98537b90346b85456f8f52576a1f576b3349601f3f4e1e475832
+2f3c222f3c224758328b988275704dcfc6b887886d3335222f3c22304321304321
+47581f576b3349601f3f4e1e576a1f576b3349601f3f4e1e5e7429657c447d9736
+6b852c7b90345f7b2a576a1f576a1f77874676872d5558242f3c22555824496032
+3a4423656c2668752b49601f344d1e3043215e7429576b332b33223335222b3322
+33352287886ddecab49fa85776872d5f7b2a49601f6b852c68752b76872d92a759
+8c98536b852c5e74295e7429576a1f68752b778746757b2d87872c76872d697c2b
+7b9034697c2b708f316b852c697c2b757b2d4c5026576a1f76872d8b9055697c2b
+47581f576a1f656c2655602447581f47581f344d1e383c23333522272c1f333522
+49601f5f7b2a6b852c6b852c656c2630432149601f576a1f49601f55602447581f
+3a44233335223335224e4425867c4c95885c778746867c4c757b2d8b905595885c
+867c4c656c2668752b68752b5e7429697c2b5f7b2a76872d76872d76872d8c9853
+7787467b903476872d76872d76872d708f317b9034697c2b60832a6b852c576a1f
+2b3322272c1f272c1f333522333522576a1f666b3b4e442547581f3f4e1e47581f
+576a1f757b2d68752b49601f5e742976872d5e742960832a708f315f7b2a6b852c
+6b852c76872d5e74294b681e49601f3a4423344d1e555824757b2d576a1f3f4e1e
+576a1f6b852c76872d80a03b8ea83e697c2b47581f3f4e1e4c502647581f3a4423
+3f4e1e54742847581f497323576a1f4b681e383c23697c2b3f4e1e2f3c223a4423
+272c1f2f3c223043212f3c22383c23342d1f342d1f3d5f25576a1f576a1f697c2b
+778746697c2b68752b76872d547428576a1f54742876872d7f975354742860832a
+576b33656c263d5f255f7b2a6b854554742841671b5f7b2a60832a708f317b9034
+618345547428657c446b8545657c446b8545567f3a6f8f525f7b2a547443618345
+60832a6f8f526f8f52576b334b69335474433c58223c58223c58223f4e32354c31
+3d5f25354c312b3322262e35272c1f262e352f3c22304321354c314b681e6f8f52
+708f316b85453d5f25344d1e2f3c22272c1f3336423043214758325474435f7b2a
+5e7429657c446b85455474283f4e32354c312f3c222b33222b332230432149601f
+576b3349601f5f7b2a6f8f527f97537b90347b9034697c2b576b333f4e1e304321
+354c312f3c2247581f7787465e7429576b33656c26778746656c26576b33576a1f
+5474282f3c223f4e32496032354c312b33222f3c224758325e74293c5822354c31
+3a4423344d1e4973235e742960832a60832a5474286b852c7d973649601f49601f
+41671b60832a7197535f7b2a719732557f22344d1e3c5822557f2241671b4b681e
+6f8f525f7b2a497323557f2254742860832a6b852c6b852c576b33576a1f304321
+3043213c58223f4e1e3043213f4e1e3d5f256b8545697c2b4b69332f3c22344d1e
+2f3c222b33222b3322344d1e3d5f25344d1e2b33222b3322272c1f272c1f272c1f
+3a4423272c1f2b33222f3c22556024576b333d5f253c582249601f576b33697c2b
+87872c576a1f47581f778746567f3a697c2b3d5f253d5f25576a1f5474285f7b2a
+557f225f7b2a4b681e5e74295e74293c5822344d1e47581f3a442349601f5e7429
+576a1f3d5f253a4423383c233043213f4e1e497323576b334b681e5474283f4e1e
+3043213043212f3c222f3c222b33222b33222f3c2249603247581f383c2347581f
+304321272c1f2b332247581f657c447b90346b85457787467d97368e9f3b8ea059
+7787466b852c7c90535e742960832a697c2b49601f576b3347581f2f3c222b3322
+3a44233043214c5026576b33767b47afb09e95885c3f4e1e33352249601f49601f
+344d1e3043213f4e1e4960325e74295474284960324b681e5e742976872d6b8545
+60832a7b9034576b33576b338c9853576a1f3f4e1e778746383c233a44234c5026
+4b681e66592c5560244c502647581f4b681e5f7b2a3a4423272c1f272c1f272c1f
+333522443623afb09ec2b868697c2b757b2d6b852c5e7429576a1f656c265e7429
+7b9034708f316b852c6b852c76872d7d97368ea0597b90347d97368e9f3b7d9736
+7d97366b852c7b9034757b2d8b90558b90336b852c76872d6b852c5f7b2a5f7b2a
+68752b76872d697c2b3f4e1e55602476872d5e74293043212b33222f3c22304321
+3f4e1e5f7b2a697c2b6b852c5e74292f3c222f3c22344d1e6b852c7d9736697c2b
+4e4425342d1f44362355582474643e666b3b86874a8b90559f915495885c84712f
+757b2d757b2d656c263f4e1e3f4e1e4b681e5f7b2a4b681e7b90348b90338e9f3b
+7b9034697c2b76872d6b852c60832a697c2b5e74294b681e5f7b2a6b852c49601f
+2b3322342d1f3335222f3c224c50265558245560243a44233f4e1e576a1f5e7429
+76872d757b2d4b681e5f7b2a7b90347b9034697c2b76872d5f7b2a697c2b7d9736
+7b90346b852c68752b6b852c8c983568752b55582449601f6b852c576a1f5e7429
+80a03b7d97368c983587872c6b852c697c2b557f226b852c7b903468752b49601f
+49601f4b681e49601f697c2b5f7b2a3a44232b33223a4423304321383c232b3322
+272c1f2f3c222f3c22272c1f272c1f2b33222b332249601f4b681e49601f556024
+576a1f47581f6b852c7d9736708f31557f2260832a60832a5e74296b852c5e7429
+5f7b2a697c2b6b852c708f315f7b2a5474285474284b681e60832a7f9753697c2b
+4b69334b69336183457c9053576b337c90534960324b69335f7b2a4973236b8545
+4973236b8545819f596b852c5474286b85453c5822576b33344d1e2f3c22304321
+576b33354c312f3c222b33222b33222b33223043213f4e3247583247581f7c9053
+60832a5474284960323d573b4758323043212f3c223043213c58224b6933496032
+3043214b681e5e74294960322f3c222b33223043213043212a34383043215f7b2a
+627444576b336b85455f7b2a6b8545778746697c2b708f313d5f2530432147581f
+344d1e475832627444757b2d5e742947583247581f576b33576b335f7b2a4b6933
+3c5822333522342d1f3f4e322f3c22272c1f272c1f2b33224960323f4e1e3f4e1e
+2f3c22576b336b852c3d5f253f4e1e576b333c58225e74296b852c3043213f4e1e
+344d1e3f4e1e344d1e576a1f576b333c582241671b3c58224b69333d5f254b681e
+3c58223f4e1e576b33344d1e496032576b3376872d47583247581f344d1e4b681e
+6b852c49732341671b557f225474283c58223c58223f4e1e304321272c1f304321
+344d1e304321272c1f2f3c2241671b3c5822344d1e304321272c1f2b33222b3322
+2f3c22272c1f272c1f272c1f30432149601f49601f344d1e3f4e1e47581f656c26
+7f9753557f226b852c8c98356b8545576a1f41671b5f7b2a5f7b2a576b3347581f
+5f7b2a60832a576a1f576a1f576a1f576b333f4e1e3a44233f4e1e49601f697c2b
+576a1f344d1e49601f49601f47581f5e74295474283f4e1e3f4e1e344d1e3f4e32
+2f3c22272c1f2b33222b3322272c1f2f3c223a442349601f68752b4c50263f4e1e
+3c582230432130432168752b7787467787466b852c697c2b7c90537787466b852c
+697c2b697c2b7c9053697c2b6274445e7429576b333043213a44232f3c22344d1e
+3a442347581f4960325e7429657c449ea08a9d99812f3c223f4e1e576a1f576a1f
+3d5f2541671b4b681e6b852c4973233c58224b69335f7b2a576b335e7429778746
+708f317c90535560244b681e49601f5560243f4e1e576a1f656c2647581f47581f
+3c58223a44235558244c502668752b576a1f6b852c33352224261c272c1f24261c
+383c23383c239a9178d3cea287872c8c98358c98357b90346b852c76872d697c2b
+7d97365e74294b681e5e742960832a6b852c76872d76872d76872d7b9034708f31
+7b90346b852c708f316b852c76872d76872d5f7b2a7b9034697c2b697c2b5f7b2a
+5e742976872d757b2d4b681e576a1f5e74295e742947581f30432147581f344d1e
+49601f49601f697c2b697c2b5f7b2a576a1f30432149601f697c2b697c2b76872d
+47581f443623383c23604f2a766427867c4c7787469e98538b90558c9853867c4c
+76872d867c4c757b2d3f4e1e383c23576a1f3f4e1e5560247d97367b90348c9835
+76872d5e742960832a5f7b2a6b852c7b90346b852c6b852c60832a60832a576a1f
+344d1e2f3c223a44232f3c222f3c2247581f555824383c23383c234c5026576a1f
+76872d76872d7b90347b90348e9f3b8c9835708f3176872d708f316b852c8ea059
+7f975376872d5558246b852c7f975368752b55582455602468752b80a03b8c9853
+7d97367d97367d97368b903347581f47581f4b681e5f7b2a5e742947581f3c5822
+60832a4b681e4c50263f4e1e383c23342d1f272c1f272c1f344d1e3f4e1e3a4423
+272c1f272c1f2b3322272c1f24261c3335222f3c222f3c223043213a4423576a1f
+5f7b2a5e74297d973676872d5e7429576a1f5f7b2a5f7b2a4b681e61834549601f
+576a1f5474287b90347b903460832a5474285f7b2a576b334b681e5f7b2a6b852c
+4b69334b69336274446b86734960326183454b69334b69336b8545547443567f3a
+4b6933557f22719753719753708f31708f31708f3160832a5474435474434b6933
+576b33304321354c312a34382a3438262e352a34382f3c223043215e7429719753
+719732618345354c313f4e32576b334b69334b6933576b334960323f4e1e47581f
+49603262744449601f4960322f3c222f3c22354c313a44233043213d5f253c5822
+6183455474287d97366b85455f7b2a6b85455f7b2a60832a4b6933354c313a4423
+3f4e324b6933576b33556024576b3347581f556024354c31576b335f7b2a4b681e
+3f4e32262e35272c1f2b33222b33222b3322272c1f2b332247581f6b85455f7b2a
+344d1e49601f5f7b2a576b335474283f4e1e3f4e1e49601f697c2b3043212b3322
+2b33223335223a44235474286b85455f7b2a60832a3c58223d5f255e7429497323
+576a1f80a03b6b852c547428708f3147581f6b852c576a1f68752b5e74297d9736
+547428708f316b852c60832a6b852c5f7b2a344d1e344d1e2f3c222f3c22304321
+41671b3d5f252b3322262e352f3c22354c313043213043213043212b33222f3c22
+4960322b33222b33222f3c223043213f4e1e3c58223f4e1e344d1e656c268e9f3b
+8e9f3b6b852c80a03b80a03b708f316b852c547428497323547428547428547428
+3c5822576b335f7b2a497323344d1e49601f3d5f252f3c222f3c2249601f576b33
+576b3347581f3c58223a44232b33223a4423354c313f4e323043213335222b3322
+272c1f272c1f272c1f272c1f272c1f3a44233a442349601f60832a5e7429496032
+49601f3c58225560247c90538ea0597f975377874649601f6b852c7b903476872d
+6b8545576b33657c445e742947581f5e7429576a1f3f4e1e49601f697c2b47581f
+49601f5e742947581f576a1f86874ac0b8a6b1b0693f4e1e697c2b5f7b2a5e7429
+5474285e74295f7b2a5e74296b854549603247581f5f7b2a49601f547428576a1f
+5e7429556024576a1f697c2b5e742947581f344d1e49601f5474283f4e1e5e7429
+3f4e1e3f4e1e3f4e1e333522666033656c2668752b656c26333522342d1f272c1f
+3335223a44238b9080e0dfc68b90338c98357b90347b90347d9736656c26576a1f
+708f31656c263043213043214b681e697c2b60832a6b852c7b903476872d8b9033
+76872d47581f60832a6b852c68752b656c265f7b2a697c2b6b852c6b852c47581f
+47581f697c2b7b90348c98358c98353f4e1e344d1e47581f272c1f272c1f2f3c22
+2f3c225560246b852c5f7b2a49601f5e74294b681e4b681e6b852c60832a76872d
+68752b68752b666033666b3b86874a9e98538b90558b90559e98539f9154ada17f
+867c4c576a1f867c4c6660333f4e1e5560243c58225f7b2a6b852c7197327d9736
+7b90346b852c6b852c76872d7d9736719732708f3176872d5e74295e74293f4e1e
+383c233335223335223f4e1e3f4e1e576a1f697c2b76872d697c2b5560246b852c
+6b852c68752b656c2676872d8c98357b90346b852c6b852c697c2b576b33496032
+576b33576a1f3a442349732347581f49601f49601f576b3376872d8c985376872d
+7c9053656c26555824757b2d757b2d47581f4c50263a44235560245f7b2a60832a
+68752b3f4e1e383c23342d1f3335222b3322272c1f383c233043212f3c222f3c22
+272c1f2b33222b3322272c1f342d1f272c1f342d1f383c23576a1f2f3c2247581f
+5f7b2a5e742991af495f7b2a4b681e547428576a1f5f7b2a49601f6b852c497323
+576a1f6b8545708f3176872d697c2b5e74295e7429576b3347581f576a1f6b8545
+657c444b6933576b337787724960326183453c58223d5f25657c444b6933547443
+3d5f25567f3a60832a6b85457197536b854560832a5e7429576b335e7429354c31
+3043212f3c224b69333f4e322b3322262e352b33222a34382f3c22496032657c44
+4b6933496032496032344d1e3f4e1e4b69335474435f7b2a6274446b8545657c44
+47581f4973236b8545475832354c31383c232a34382f3c223f4e323c5822496032
+6b85455f7b2a7197536b85454b681e5e74296b85457d97364b69333c5822475832
+383c23576a1f5e742949601f68752b68752b556024383c23656c26657c4449601f
+4960322b3322272c1f272c1f2b33222b3322272c1f272c1f344d1e708f31576b33
+5f7b2a7197535e7429547428344d1e4973234b681e708f317d9736576a1f3f4e1e
+3f4e1e2f3c22576a1f6b852c7197536b852c41671b344d1e576a1f60832a708f31
+80a03b6274443f4e1e576b335f7b2a576b337b903480a03b91af497d9736708f31
+5f7b2a6b852c708f317d973660832a60832a47581f3c58223c58222b3322262e35
+2b3322344d1e304321272c1f262e352b33222b33222f3c222f3c222b3322344d1e
+3f4e1e3043212f3c223043212f3c224b69334b681e5e742949601f5f7b2a8e9f3b
+80a03b708f317d97367d973660832a7b90345f7b2a41671b4b69335f7b2a49601f
+3c58223c58224b681e5f7b2a49603249601f47581f47581f2b33223f4e1e4b681e
+3f4e1e2f3c224c5026344d1e3a442349601f47581f3043212b33222b33222b3322
+272c1f24261c272c1f24261c1e241b2f3c22344d1e3a4423576b335e74293c5822
+344d1e49601f576b3376872d8b90337b90346f8f525e7429697c2b77874676872d
+697c2b475832657c44657c4447581f496032576b3347581f49601f5e7429697c2b
+7c9053757b2d6b852c7b90348b9033aea886c3c17a767b47576a1f3f4e1e576a1f
+49601f49601f4b681e576b335e74294b681e68752b697c2b3f4e1e3c58223c5822
+54742849601f49601f49601f4960323c582249601f7787465f7b2a3f4e1e576b33
+3f4e1e383c233a4423576a1f3f4e1e3335223a4423556024556024656c26766e2d
+5560244c50269e9853d3cea28c98538c983576872d7b90347b903476872d7b9034
+8c983568752b3f4e1e3a4423344d1e4b681e5f7b2a60832a68752b6b852c76872d
+5560245558245474285474286b852c697c2b576a1f5f7b2a697c2b5f7b2a304321
+576a1f60832a6b852c76872d8c9835778746656c2647581f2f3c2224261c342d1f
+2b33223a44235e742949601f3f4e1e3f4e1e49601f5560245e742960832a76872d
+76872d757b2d87872c887b2c86874a9e985386874a8c9853b1b069c3c17aada17f
+9f9154757b2d68752b383c234e44253f4e1e5f7b2a708f31708f31708f31708f31
+6b852c6b852c6b852c7b90347b90345f7b2a3c58225e74295f7b2a5e742947581f
+2f3c222b3322272c1f4c5026697c2b68752b55602468752b708f3176872d76872d
+87872c76872d666b3b5558248c9835757b2d5474285f7b2a557f22576a1f3f4e1e
+60832a47581f2f3c223c5822497323697c2b4b681e5e74295f7b2a697c2b697c2b
+778746576b333f4e1e5560244b681e47581f3f4e1e47581f3f4e1e3c5822547428
+3f4e1e3a4423272c1f2f3c22333522272c1f272c1f3f4e1e697c2b3f4e1e383c23
+2b33222f3c22344d1e344d1e2b33222f3c222b33223335228b90335e74294b681e
+54742854742880a03b6b852c60832a697c2b47581f657c4449601f657c44576b33
+576a1f60832a7787467c90537b9034576b333f4e1e3043213043214b681e547428
+5474433d573b4e50436274444b6933657c444b69334b69335474434b693341671b
+3d573b5474285f7b2a60832a5f7b2a6b852c6b854541671b5474286b852c3d5f25
+5f7b2a5f7b2a6f8f523d5f252b33222b33222a34382b3322262e352f3c22475832
+5f7b2a344d1e3c58223d573b304321354c313d5f25344d1e4960325e74296b8545
+657c446b8545576b33475832383c23342d1f262e352b3322354c31344d1e3c5822
+7b90346b852c6b8545697c2b4b69335e74296183456b852c6b852c47581f3c5822
+4b6933697c2b657c44576b3362744468752b767b47304321576b33576a1f576b33
+4b69332b3322272c1f24261c24261c272c1f262e35272c1f2b3322656c26576b33
+657c4476872d708f315e7429497323657c445e742960832a557f225e7429719732
+8ea83e5e7429576b336b852c5f7b2a557f224973235e7429576a1f6b852c7d9736
+708f31719732697c2b3c5822557f22719732708f314b681e708f3180a03b719732
+80a03b729e3491af4980a03b76872d7b90345f7b2a4973233d5f253043212f3c22
+272c1f2f3c22272c1f2b33222b33222b3322262e352b3322272c1f2f3c222f3c22
+344d1e344d1e3043213043213043215e74293d5f256b852c8e9f3b697c2b8c9835
+8c98357d97366b852c5f7b2a567f3a5e7429576b334b6933576b334b681e3f4e1e
+30432149601f576b334b681e3043213f4e1e2f3c22344d1e2f3c224b6933556024
+3a4423272c1f3a44233f4e1e47581f47581f4758323f4e1e272c1f2f3c2247581f
+2b3322272c1f24261c272c1f272c1f30432147581f47581f5e7429697c2b344d1e
+3f4e1e47581f697c2b7787468ea0598ea83e7c90537787467f97537b90346b8545
+656c263d5f255e7429576a1f3d5f2547581f5f7b2a576b335e74295e7429778746
+8b90335e742968752b86874a576b33ada17fc1c2ae697c2b3f4e1e3c58223f4e1e
+49601f3f4e1e3f4e1e3043215e7429697c2b697c2b6b852c49601f3a44232f3c22
+3d5f254b681e576b334b69333f4e1e47581f5f7b2a5e74293f4e1e383c23333522
+272c1f2b332249601f697c2b3a4423342d1f3f4e1e47581f49601f4c502668752b
+87872c7787468b90339e98538c98358c983576872d76872d7b903476872d8c9835
+7b903447581f3f4e1e47581f656c2676872d76872d49601f3a44235e7429576a1f
+2f3c222f3c222b332247581f76872d697c2b5f7b2a6b852c576a1f68752b47581f
+5f7b2a697c2b5e742976872d87872c7b90347b90347b903468752b383c23272c1f
+24261c272c1f383c23383c23272c1f2f3c223a4423383c2347581f576a1f697c2b
+6b852c87872c867c4c76872d9e98539fa857aea8868c98539e9853c0b197c2b868
+aea8869fa056757b2d383c2333352247581f5e7429719732708f31547428576a1f
+47581f5e7429697c2b5f7b2a576a1f49601f304321576a1f6b852c708f314b681e
+49601f304321344d1e49601f697c2b5e74294e44253a44234b681e6b852c8c9853
+8e9f3b87872c76872d7787467b9034576a1f576a1f4b681e47581f3c58223d5f25
+49601f49601f2f3c224b681e5e74295560245e742949601f576a1f547428708f31
+7b9034576a1f3f4e1e344d1e3f4e1e3f4e1e47581f4b681e3a44232f3c223a4423
+2f3c22383c233a44232f3c222f3c222b3322344d1e3c58225474282f3c223f4e1e
+3f4e1e3f4e1e576a1f41671b41671b697c2b2f3c22304321657c4476872d5f7b2a
+557f22708f317b903476872d68752b547428576a1f6b8545576a1f3f4e1e3d5f25
+5f7b2a697c2b576a1f6b85455e7429576b333f4e1e2f3c2230432147581f576b33
+475832576a624758324960324b6933618345576b33547443576b334960323d573b
+3d5f25618345708f31708f3160832a60832a6b85455474285474435f7b2a6b8545
+61834549732360832a567f3a3c582230444d2b33222b33222f3c22304321497323
+657c444960323f4e323a44232f3c22496032344d1e3c58224758324960323f4e1e
+56603a576b333f4e1e354c312a3438272c1f2a34382b33223d5f253d573b627444
+6f8f528c9853778746697c2b6b854576872d5e74294b681e5e74296b8545576b33
+5f7b2a656c26576a1f576a1f47581f3f4e1e576b333f4e1e576a1f76872d5e7429
+3f4e1e373e431e241b262e3524261c262e35272c1f262e353f4e1e55602447581f
+2f3c2254742876872d54742860832a60832a5e74294b69333d5f255474286b852c
+5f7b2a54742880a03b80a03b6b852c719732729e348ea83e80a03b8e9f3b547428
+60832a7b903476872d4b681e49601f60832a6b852c41671b708f31708f31557f22
+60832a6b852c7d9736729e34729e345f7b2a6b852c7f97536b852c3c5822304321
+3043212f3c222b33222b33222f3c222f3c22272c1f2b33221e241b2b33222f3c22
+344d1e3c5822344d1e2f3c22344d1e4b681e49601f697c2b80a03b80a03ba1a73c
+8e9f3b708f314b681e49601f3c5822354c313a44233f4e1e3a4423344d1e344d1e
+3f4e1e576a1f47581f3f4e1e3f4e1e555824576a1f55602449601f5f7b2a4c5026
+2f3c222b33223a44232f3c222b33222b3322272c1f2b33223043213f4e1e3c5822
+272c1f24261c24261c1e241b272c1f576a1f576b33344d1e576a1f556024344d1e
+3f4e1e576a1f666b3b7787468ea059a1b1707d97368e9f3b7b90345f7b2a5f7b2a
+5f7b2a576b336b852c5e74295f7b2a5f7b2a71973280a03b80a03b7b90347b9034
+76872d77874677874668752b5e7429aea886d3cea268752b5560245f7b2a5e7429
+54742849601f576a1f5e742976872d7c905376872d757b2d3a44232b33222f3c22
+344d1e49601f5f7b2a4b681e47581f47581f556024383c23383c233a4423342d1f
+2f3c223f4e1e5560242f3c223a44233f4e1e2f3c224b681e576a1f5e7429556024
+55582456603a666b3b9fa0569fa05676872d576a1f8c9835708f318b90338b9033
+76872d576a1f68752b697c2ba1af4e8b9033576a1f47581f3f4e1e5e74295f7b2a
+4b681e3f4e1e2f3c223f4e1e68752b697c2b5f7b2a6b852c5f7b2a557f225e7429
+5e74293f4e1e5e7429697c2b697c2b757b2d76872d87872c7d973647581f342d1f
+24261c272c1f272c1f24261c24261c333522272c1f272c1f2f3c223a44234c5026
+666033766427867c4c8b9033c0b8a6b2a8569fa056a1af4e8c98539fa8579fa857
+b1b069b2a05386874a3a44234c5026656c26656c26757b2d76872d3f4e1e47581f
+3043214b681e6b852c5f7b2a3a44233043213f4e1e344d1e383c233a4423344d1e
+344d1e3043212f3c22344d1e5f7b2a576a1f3f4e1e47581f697c2b708f318e9f3b
+7d97368c98357b90347b9034656c2668752b47581f344d1e30432130432149601f
+47581f3f4e1e3a44234b681e5e74295560246b85453f4e1e30432149601f6b8545
+76872d5e742947581f3043213f4e1e304321383c233335222b3322304321272c1f
+2b33222b33223043214c5026344d1e2f3c223043213043215474284b681e4b681e
+49601f3c58223f4e1e4b681e576a1f5f7b2a3f4e1e656c26344d1e4b69337d9736
+5f7b2a60832a71973277874649601f47581f41671b5e7429697c2b55602447581f
+697c2b697c2b344d1e5e74295f7b2a3c58223f4e1e47581f41671b3d5f25547428
+496032547443567f3a547443547443576b334b6933576b33627444547443496032
+41671b708f31567f3a6183456f8f5260832a6b852c5474284b69333d5f25547428
+3c582241671b6183456b852c4973233c582241671b4b69333d5f254973235f7b2a
+5474284960324b693341671b5474285474433d5f25576b333c5822383c232b3322
+3f4e32657c4449603247581f3f4e322f3c22333522304321576b3349601f41671b
+7c9053657c44708f316b852c6b852c627444576b33576b335474285e74294b681e
+5f7b2a5f7b2a5f7b2a49603256603a576b333d5f254b69335f7b2a708f31496032
+49601f4b681e344d1e3a44232b33222b33223a44233043216f8f525e7429657c44
+60832a7787467b90344b69336f8f52627444344d1e344d1e3c58223f4e1e557f22
+719732708f3176872d7d973691af4991af4991af497d9736719732557f225f7b2a
+708f318ea83e708f315e742980a03b7d9736497323497323708f314b681e4b681e
+6b852c708f317d9736719732557f223c58223c58225e74294b681e344d1e344d1e
+344d1e2f3c223043212b3322272c1f1e241b272c1f1e241b272c1f272c1f2b3322
+344d1e344d1e304321344d1e4b681e4b681e41671b557f227b90347b90348e9f3b
+7d97367d97365e7429344d1e304321383c232f3c224b681e344d1e47581f5f7b2a
+576a1f49601f344d1e47581f344d1e3a44233f4e323f4e1e3f4e1e49601f3f4e1e
+3f4e1e47581f47581f2b33223335222f3c222f3c2230432149601f49601f47581f
+2b3322272c1f24261c272c1f47581f60832a3f4e1e2b33223f4e324c5026556024
+6274446b85455e7429778746a1af4e8c98538c98538c98536b85455f7b2a6b852c
+60832a5e742960832a5e7429657c445e7429697c2b7b90347b90347b903476872d
+7b903476872d576a1f697c2b6b852c9ea08ac3c17a76872d68752b49601f41671b
+576a1f576a1f697c2b697c2b5e7429576a1f6b852c576a1f2b33222b3322354c31
+304321344d1e5560243f4e1e47581f3f4e1e2b33223335223335222b33222f3c22
+49601f5e742947581f2f3c22383c233f4e1e3a44233a44233a44233335223f4e1e
+49601f2b33225558249a91789fa05655582447581f6b852c68752b8c98358b9033
+68752b76872d5560248c9853a0a03a87872c697c2b60832a5e74296b852c697c2b
+5e74295e74293f4e1e47581f576a1f576a1f68752b5e74295f7b2a6b852c76872d
+76872d3f4e1e30432147581f6b852c5474285f7b2a7b90347b9034757b2d333522
+24261c24261c24261c24261c272c1f3335223335223335223335223335223a4423
+2f3c224e44259f9035b1b069c0b8a6c2b8689fa8579fa056b1b069b1b069b1b069
+9e98539e9853757b2d55602468752b76872d757b2d5560243a4423333522344d1e
+47581f5f7b2a6b852c76872d3a44233a4423383c232b3322272c1f30432147581f
+47581f272c1f2f3c22576a1f5e74296b852c60832a708f3176872d697c2b76872d
+757b2d7787468b90337b903476872d697c2b47581f3f4e1e49601f47581f3f4e1e
+2f3c22304321304321576a1f2f3c2247581f5e74295e742949601f49601f547428
+47581f3a44232f3c22304321344d1e344d1e2f3c22272c1f2b33223335222b3322
+272c1f272c1f2f3c222b33222f3c224c5026576a1f3a44232f3c222f3c223f4e1e
+3f4e1e2f3c22304321333522344d1e4b681e344d1e3a44233f4e1e8c985380a03b
+7d97366b852c5f7b2a6b852c4b681e5f7b2a4b681e4b681e697c2b6b852c6b8545
+6b852c49601f3d5f254b681e4b6933576a1f49732354742860832a60832a49601f
+547428547443627444657c446274446b8545576a1f6274446b8545697c2b719753
+6f8f52719753708f31567f3a5f7b2a61834560832a60832a567f3a4b681e4b6933
+576b334b6933557f226f8f52567f3a497323567f3a547443567f3a567f3a547428
+576b3349603249601f5f7b2a547428567f3a4b69333c58223043212e3c442b3322
+3a44233043214758324b69334758322f3c223f4e324960325474286274443c5822
+354c31344d1e7c90538c9853697c2b49603249603249601f576b3349603249601f
+576b334b69333f4e1e3043213f4e324c502649601f657c44697c2b49601f5e7429
+697c2b6274444960325e74295f7b2a5f7b2a7d97367b90346b852c6b852c778746
+576b33576b336b852c60832a5f7b2a47581f4b693360832a547428576a1f80a03b
+8ea83e91af498e9f3b91af499eb74c7d973691af49708f3171973280a03b9eb74c
+8ea83e8ea83e8e9f3b708f318ea83e8ea83e7d97366b852c7b90346b852c4b681e
+7b90346b852c5e74295f7b2a54742841671b618345697c2b60832a6183455e7429
+5f7b2a3043212b33221e241b272c1f272c1f272c1f272c1f1e241b2b3322272c1f
+2b3322304321344d1e5f7b2a5f7b2a4b681e60832a6b852c60832a5f7b2a8b9033
+76872d708f315e7429557f224b681e656c26697c2b708f314973235474284b681e
+3c5822344d1e3f4e1e5560243a44233a44233f4e1e49601f49601f3f4e1e576a1f
+5e7429576a1f3f4e1e2b33223a442347581f47581f49601f5560243f4e1e333522
+24261c272c1f2f3c224b681e68752b4960322f3c22272c1f272c1f3335223a4423
+3f4e1e4c50265e74299e98538c98538c98536b852c6b852c5f7b2a6b85457d9736
+6183455e742949601f5f7b2a576b33576b337c9053778746697c2b7b9034697c2b
+6b852c68752b68752b576a1f697c2b86874a9fa056666b3b697c2b576a1f5f7b2a
+576a1f5f7b2a7b90346b852c576a1f3f4e1e576a1f47581f3043213a4423333522
+2b33222b33223a44233a442347581f47581f3c58223f4e1e3f4e1e383c232f3c22
+47581f4b681e47581f2f3c2247581f697c2b47581f576a1f3a4423383c23556024
+4c50262f3c2255602475704d8b905574643e3f4e1e656c2668752b7b90345e7429
+5e742968752b5560247b90348e9f3b76872d6b852c6b852c576a1f576a1f556024
+5560243f4e1e555824383c23383c23304321656c265f7b2a697c2b757b2d8c9835
+757b2d3f4e1e2f3c223f4e1e5f7b2a49601f576a1f6b852c656c26556024272c1f
+272c1f24261c24261c24261c272c1f383c232f3c22304321333522342d1f342d1f
+2b33224c50269e98538c98539fa056c3c17ab1b0698c98538c98539fa857b1b069
+b1af4d8b903368752b5560246b852c60832a697c2b3f4e1e383c233335222f3c22
+3f4e1e60832a6b852c697c2b3a4423383c233335224c50263f4e1e47581f344d1e
+344d1e2b3322344d1e576a1f576b3347581f656c266b852c5f7b2a5e74295e7429
+656c266b852c8c98357b90347b903476872d4973233d5f2549601f344d1e304321
+304321344d1e3c5822556024272c1f3043215f7b2a5e7429576a1f3f4e1e4b681e
+576a1f5e74293f4e1e344d1e49601f47581f344d1e272c1f272c1f342d1f272c1f
+272c1f3335222f3c222b33222b3322344d1e49601f47581f3f4e1e3f4e1e304321
+344d1e383c232b33222f3c223f4e1e344d1e3c582249601f41671b7f97537d9736
+8c98357f975376872d757b2d576b335e7429657c44576b3377874676872d8c9853
+697c2b576a1f496032344d1e3f4e1e3f4e1e6b852c6b852c4973235f7b2a576a1f
+547443496032354c316274446183457787467b903476872d6b85456b85457c9053
+60832a6b85456f8f5260832a5f7b2a567f3a5f7b2a708f316f8f526f8f52778746
+7f97537c905360832a719753547443354c313043213c58223d5f255474433d5f25
+3d5f254960325e74294b6933497323557f224973234960322b33222f3c22342d1f
+262e35342d1f3336423335222b33222f3c22344d1e576b334b681e344d1e304321
+3f4e322f3c22657c447c90535f7b2a6b852c6b852c6b8545344d1e547428557f22
+4b69332f3c22304321333522576a1f697c2b697c2b7f97535e74295e74294b6933
+354c31304321354c31344d1e4b69335e74295f7b2a697c2b6b852c6b852c7d9736
+697c2b7f97536b85454b681e6183455f7b2a7b903471973260832a7197328e9f3b
+80a03b9eb74c91af498ea83e8ea83e7197327d97367d973660832a80a03ba1af4e
+8ea83e80a03b60832a7197328ea83e8ea83e91af496b852c8ea83e7d97367b9034
+91af497b903449732341671b3c58223c58224b681e60832a77874649601f5e7429
+60832a41671b304321272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f
+262e35272c1f2f3c225f7b2a7b90345474285474286b852c5f7b2a49601f7b9034
+697c2b5e7429576a1f7b903476872d8c98357d9736557f22557f22557f22547428
+5e742947581f5e74295f7b2a556024576a1f5e7429576a1f49601f556024576a1f
+68752b576a1f3f4e1e30432147581f49601f49601f576a1f2f3c222f3c222b3322
+2b33223043215e7429576b3347581f2f3c22272c1f24261c272c1f2b332247581f
+47581f5560247c90538c98358ea0598c98537f97536b85455474285e74295f7b2a
+697c2b4b69334960323f4e1e4b681e4b681e576b3360832a5f7b2a5f7b2a6b852c
+68752b576a1f5f7b2a656c264b681e576b339fa0568c983576872d7d9736708f31
+6b852c7b90347d97366b852c68752b49601f5e74295e7429656c2647581f344d1e
+2f3c223f4e1e383c233043212f3c223f4e1e576a1f47581f3a4423383c23304321
+697c2b3f4e1e556024576a1f55582476872d68752b576a1f3043213335223f4e32
+272c1f272c1f47581f5558248b9055b1b069656c2676872d576a1f656c26656c26
+68752b576a1f656c267b903476872d6b852c697c2b576a1f4b681e697c2b6b852c
+555824383c233a44232b33222b33223335224b681e76872d6b852c7b9034b1af4d
+76872d576a1f49601f576a1f3f4e1e3a442347581f47581f3f4e1e3f4e1e342d1f
+44362324261c24261c24261c272c1f333522333522272c1f272c1f272c1f272c1f
+4e44259fa056757b2d86874a8b9055ada17fc3c17a757b2d8b9033a0a03a9fa857
+9fa8579fa056757b2d576a1f4b681e5560244b681e576a1f344d1e2f3c22383c23
+2f3c2247581f4b681e47581f2b33222b3322272c1f3f4e1e3f4e1e47581f304321
+2f3c223a44233a44233f4e1e2f3c223a442349601f697c2b697c2b697c2b656c26
+576a1f76872d8c98357b90347d973676872d547428557f22576a1f3c5822304321
+2f3c222f3c2249601f5e742930432147581f5f7b2a576a1f55602447581f697c2b
+4b681e5f7b2a576a1f49601f41671b3043213a44233043212f3c222b33222b3322
+2b33223335222f3c22272c1f3043213c58223c5822556024576a1f2b33223f4e1e
+344d1e3f4e1e3335223a44234973233c58226b852c6b852c6b852c6b852c7b9034
+8c98537b9034819f597b9034576a1f547428708f318c9853697c2b76872d7d9736
+697c2b697c2b4b681e2f3c223043214b69335e742976872d5e74295e74296b852c
+4758323f4e323f4e32576b336f8f52708f316183456b85455474286f8f526b8545
+708f3161834560832a819f597197326183455474284b6933567f3a547428778746
+92a88d7c90536b8545697c2b3d5f253c58224b69333d573b3043214960325e7429
+4b69333d5f253c58224960325f7b2a576b333a44232a34382b33222a34383f4e32
+344d1e2f3c223a44233f4e322f3c223043213d5f254b69334758323c58223d573b
+5474283f4e1e4758327c90535f7b2a6b852c576b336b852c47581f657c445f7b2a
+576b333f4e325e74293a4423576b336b852c656c26576a1f576b335e74293f4e1e
+3043212f3c223f4e1e3f4e1e41671b60832a6b852c6b852c76872d7b903476872d
+76872d76872d7d97367b9034697c2b7c90537b9034708f31708f3160832a8ea059
+7d97367d9736778746557f22708f3171973260832a557f2249732360832a60832a
+7b903460832a41671b41671b708f318ea83e7d97366b852c8e9f3b7d9736729e34
+7d97365f7b2a497323497323344d1e3c5822344d1e4758325e74293f4e1e56603a
+576a1f576b334973233c58222b33221e241b272c1f272c1f1e241b272c1f2b3322
+2b3322272c1f2b3322344d1e5e7429697c2b7b90347d97366b852c49601f8c9835
+8c9835708f318c98357b903480a03b8e9f3b76872d5f7b2a576a1f60832a719732
+5e74293335224c502641671b556024556024576a1f656c2647581f4c5026576a1f
+656c2647581f3f4e1e4b681e5e742949601f383c23383c232b33222f3c222f3c22
+2f3c222f3c223f4e1e3a4423304321272c1f2b33222b3322304321697c2b76872d
+576b3347581f7787467c905392a7598c98356b852c697c2b576b335474285f7b2a
+6b85455e74293c58223d5f256b8545576a1f708f318c9853697c2b76872d5f7b2a
+4b681e68752b5f7b2a47581f3f4e1e576b339ea08a767b4747581f697c2b7d9736
+6b852c5e742968752b76872d576a1f68752b5e74294b681e3c58224b681e344d1e
+49601f576a1f2f3c223a44232f3c224c50263f4e1e5560243a44232b33222f3c22
+3f4e1e3f4e1e47581f3d5f253a4423555824576b33656c264c5026383c23333522
+2b3322383c2347581f3a4423574f26aea886ada17f574f264c50263a44233a4423
+5560244c502668752b87872c76872d697c2b3f4e1e3a44233f4e1e68752b76872d
+697c2b55602449601f4b681e576a1f68752b76872d697c2b6b852c76872d7b9034
+656c2660832a76872d5560243335223335223f4e1e49601f3c5822344d1e333522
+3a442324261c24261c24261c24261c272c1f383c233a44233f4e1e3f4e1e556024
+afb09e9fa0567b903487872c8c98539e9853b2a8568ea0598c9835a0a03aa0a03a
+9f98359fa8579fa0568b9033656c2647581f47581f47581f49601f49601f76872d
+55602447581f576b334c50263f4e1e3f4e1e3a44234c5026556024576a1f576a1f
+3f4e1e3f4e1e3c582247581f3f4e1e3a442347581f5e742976872d5e742976872d
+76872d697c2b68752b757b2d7b9034557f225e74296b852c76872d4b681e3f4e1e
+2b33222b332247581f6b852c697c2b576a1f5e74295e74293f4e1e47581f49601f
+547428576a1f49601f344d1e47581f3043212b3322383c233c5822344d1e2b3322
+2b3322272c1f3043213f4e1e47581f47581f3043213f4e1e3335223335223a4423
+3a44232b33223f4e1e6b852c5e742949601f76872d576a1f76872d5e74296b852c
+7b90346b852c71973276872d576b335e74297b90348c98538b90335e74295f7b2a
+6b852c8e9f3b7f97535e74294b681e77874668752b697c2b4b681e5f7b2a767b47
+354c31304321354c314b69336f8f52547443657c446f8f525e74296f8f526f8f52
+7d97366b85454b69335f7b2a708f316b852c567f3a4b6933557f22618345719753
+80a03b6b852c7d97367197534b69333d5f25354c313043212e3c44304321576b33
+576b334b69333c58223d573b576b334960322b3322272c1f262e352b3322304321
+3944463d573b576b334b6933496032576b33576b335e7429576b332f3c222f3c22
+5e7429547428344d1e576b33778746697c2b576a1f76872d6b852c6b852c657c44
+3d5f25304321576b33354c31576b3368752b49601f2f3c22627444697c2b5f7b2a
+4b681e4b693347581f60832a6b852c76872d76872d557f22708f316b852c91af49
+92a75992a7599eb74c80a03b9eb74c8ea83e60832a708f316b8545697c2b7f9753
+80a03b7197536b852c54742860832a60832a557f2241671b4b69333c5822576b33
+5f7b2a5e7429547428719732729e34708f316b8545618345708f31708f31719732
+7b90346b852c557f22819f594b69333043213043213a44232f3c22354c312b3322
+3043214960322f3c222f3c22272c1f272c1f262e351e241b272c1f272c1f272c1f
+272c1f2b33222b33222f3c22344d1e5f7b2a7d97368ea83e8e9f3b8c98358e9f3b
+8c98357d97367d97368e9f3b7b90348b9033576a1f47581f3c5822344d1e3f4e1e
+47581f3f4e1e47581f54742849601f47581f4c5026576a1f3f4e1e4c5026576a1f
+697c2b4c50262b3322383c234c5026383c23272c1f272c1f3335222f3c223a4423
+2f3c223335222b3322272c1f342d1f24261c24261c33352247583249601f5e7429
+576a1f697c2b697c2b757b2d8c98536b8545576b3360832a5e74295e74296b8545
+697c2b3d5f253f4e1e3f4e1e5e74296b852c778746708f3160832a708f31556024
+3f4e1e4c5026576a1f3f4e1e475832576b339e98538c98537b90345e74295e7429
+68752b656c266b852c8c983576872d76872d5e74296b852c8c9835708f3176872d
+76872d76872d576a1f49601f3f4e1e766e2d76872d6b852c5560243335223c5822
+4b681e47581f576a1f5e742947581f556024576a1f47581f47581f3f4e1e3a4423
+383c233a4423383c23383c233a442374643eada17f6660333335223a4423576a1f
+68752b556024697c2b87872c556024556024556024333522383c23576a1f708f31
+708f31576a1f6b852c5f7b2a6b852c708f316b852c76872d6b852c5f7b2a6b852c
+576a1f576a1f5e742947581f3a44232b332249601f6b852c576a1f3043212f3c22
+4e4425342d1f24261c24261c272c1f3f4e1e697c2b6b852c87872c8c98359e9853
+9fa8579fa0568b90338c9835a1a73c9e98539fa0569fa0568b90338c98357d9736
+7d97369e98538c985387872c5560243a4423333522383c235560246b852c7d9736
+6b852c68752b576a1f47581f656c267c90537d97367b9034757b2d697c2b5e7429
+3f4e1e2f3c223a44232f3c224758324c502649601f76872d8e9f3b55602449601f
+697c2b5e7429576b33555824576a1f5e742976872d708f315f7b2a49601f304321
+2b33222b33223f4e1e4b681e4b681e5e7429576a1f344d1e3c5822304321304321
+47581f47581f3a44233f4e1e3043212f3c222b33222f3c223335222b33222b3322
+344d1e3c58225f7b2a49601f547428697c2b3f4e1e2b332249601f576a1f3f4e1e
+576a1f5558245e7429656c26697c2b757b2d6b852c666b3b68752b697c2b8c9853
+7b9034697c2b7c90538c98355f7b2a6b852c708f31708f317c9053697c2b47581f
+6b852c7b90346b852c4b681e5f7b2a7b90344b681e656c263f4e1e697c2b7b9034
+3d5f253d5f253d5f254960327f9753576b33657c446f8f52557f22708f31567f3a
+5f7b2a708f315f7b2a5474435474436f8f524973235f7b2a60832a557f22657c44
+60832a60832a7f9753719732557f22496032304321354c313043213d573b304321
+3c582249601f3d5f253043212f3c222f3c223043212e3c443043213f4e1e3c5822
+3f4e1e354c313f4e1e3f4e1e496032354c31383c234960325e74293043213f4e32
+60832a697c2b4b69336b852c7b9034778746576b335e74295e74294b681e475832
+3043213a442356603a3a4423576a1f666b3b4960323f4e1e5e74295e74295f7b2a
+576a1f5f7b2a4b69336b852c6b852c719732719732708f31708f318ea83e8ea83e
+8ea83e8ea83e7d97368ea83e71975371973280a03b80a03b708f31708f317f9753
+71973260832a708f3171973260832a708f3160832a3d5f253f4e1e49601f5e7429
+41671b5e74297b90347d973680a03b719732557f223c5822576a1f7b903460832a
+657c445f7b2a5f7b2a41671b344d1e2b33223043213c58223043212b33222b3322
+2b33223043213a4423272c1f2b33222b33222b33222b3322272c1f272c1f2b3322
+272c1f1e241b272c1f272c1f3043213c5822576a1f708f3180a03b8e9f3b5f7b2a
+697c2b576a1f5f7b2a76872d7b90348c983576872d7b903449601f49601f5e7429
+47581f49601f76872d5f7b2a49601f49601f47581f55602447581f3a44233f4e1e
+47581f3f4e1e333522304321383c232b3322272c1f2b3322342d1f2b3322333522
+2b3322272c1f272c1f24261c272c1f342d1f2b33222b33223a44233a442349601f
+49601f576a1f7b90347b90348c98537b903476872d77874676872d80a03b7d9736
+7787464b681e344d1e49601f576b3360832a576a1f576b333c582249601f47581f
+47581f3a442368752b3a44233f4e1e5f7b2a8c98538c9853697c2b6b852c6b852c
+5f7b2a6b852c76872d6b852c697c2b7b9034697c2b6b852c76872d7b90347b9034
+7d97366b852c76872d757b2d68752b8c98538ea0598c98357b90343f4e1e5f7b2a
+76872d576a1f656c26576a1f4b681e576a1f576a1f656c2668752b49601f68752b
+656c26576a1f4c50264c50264c50263a4423867c4c9f91543a442347581f5e7429
+4b681e68752b8b903376872d3f4e1e5560245560243f4e1e55602468752b76872d
+708f3176872d76872d576a1f4b681e576a1f5f7b2a76872d697c2b5e74295f7b2a
+547428576a1f6b852c68752b4b681e656c26757b2d5e74294c50262b3322272c1f
+272c1f24261c1c1e19342d1f333522697c2b576a1f76872d7b90347b90348c9835
+8b90338c98357787468b90339e98539fa8579f98358c98538c98358e9f3b7b9034
+76872d76872d8c98357b903468752b3a4423383c23656c26757b2d8ea059697c2b
+68752b68752b68752b697c2b6b852c76872d7c9053708f316b852c6b852c5f7b2a
+3f4e1e2b33222b33222b332247581f556024697c2b80a03b757b2d55582447581f
+87872c5e74295e74295e7429576a1f4b681e697c2b5e742949601f2f3c22342d1f
+3335223043212f3c223f4e1e3f4e1e5f7b2a4b681e3d5f2554742849601f49601f
+49601f47581f3f4e1e3f4e1e344d1e3f4e1e3043213043212f3c222b33223c5822
+4b681e3c58223f4e1e3a442355602468752b574f263a44235f7b2a6b852c47581f
+5e742986874a767b4755582468752b576a1f68752b4c50265558247b90348ea059
+8c983576872d7b9034a1af4e6b852c6b852c708f3160832a77874686874a556024
+576b336b852c6b852c5e74295e742949601f49601f697c2b576b334b681e76872d
+41671b3d573b496032475832547443576b336b854560832a4b6933618345618345
+5f7b2a6b852c708f3149601f344d1e4b693349601f4b69334b69333f4e322f3c22
+354c31496032657c446183456183454758322a3438354c313c5822547428496032
+41671b547428567f3a496032354c31344d1e3d5f25344d1e3f4e32354c31304321
+344d1e47581f3d573b344d1e2f3c22342d1f272c1f383c23627444576b334b6933
+5474286b852c4b681e6b852c80a03b7787465f7b2a697c2b576b335e74294b681e
+4758323335222f3c223f4e324c5026576a1f4e44254c50265e742976872d6b8545
+5f7b2a3f4e1e3043213d5f254b681e497323557f22557f22729e3491af4980a03b
+8ea83e80a03b71973291af497197326b852c5f7b2a7b903460832a6f8f5260832a
+60832a80a03b6b852c6f8f524973235f7b2a708f31576a1f47581f576b33304321
+576b33708f316b85455f7b2a5e742976872d5f7b2a708f317197326f8f526b852c
+41671b5474286183454973233d5f25344d1e2f3c222f3c223f4e1e2b33222f3c22
+3a4423344d1e2b33222b3322272c1f272c1f2b33221e241b272c1f272c1f272c1f
+272c1f272c1f272c1f2f3c223f4e1e47581f49601f708f317197325e742949601f
+5e74294b681e697c2b708f3176872d7b9034697c2b76872d6b852c60832a7b9034
+6b852c708f31708f31656c26697c2b68752b55582447581f4c5026576a1f3f4e1e
+2f3c22333522383c233a44233a4423333522272c1f24261c24261c272c1f272c1f
+24261c24261c24261c1e241b272c1f2b332247581f47581f49601f5e7429778746
+76872d76872d8c98538b90338ea0598c98537b903486874a6b852c7f97535f7b2a
+61834547581f47583249601f6b854549601f576a1f4b681e3f4e1e4758323f4e1e
+49601f5e7429697c2b697c2b76872d8b90338b903376872d5e74295e742960832a
+5e74295e7429697c2b5e742987872c7b90347b90348b90338c98357b903476872d
+697c2b76872d76872d8c983586874aa0a03a8b903376872d76872d757b2d7b9034
+8e9f3b8c983576872d6b852c697c2b708f316b852c697c2b576a1f556024556024
+304321656c26697c2b55602468752b574f2675704db1b06968752b697c2b697c2b
+5e7429656c26697c2b68752b3f4e1e3f4e1e556024555824757b2d6b852c76872d
+4b681e76872d76872d60832a6b852c76872d4b681e6b852c708f31697c2b47581f
+3f4e1e4b681e6b852c6b852c8b90337b903476872d555824342d1f272c1f342d1f
+24261c24261c24261c333522383c235e742947581f49601f76872d6b852c76872d
+7b90348b903386874a87872c8b90339fa0568c983568752b8b90338e9f3b8c9835
+68752b576a1f7b90347d973676872d576a1f576a1f576a1f76872d8c983568752b
+576a1f757b2d76872d68752b6b852c76872d7b9034576a1f5e742960832a547428
+2f3c22272c1f2b33222f3c223a442347581f5e742976872d68752b4c50266b852c
+8b903368752b87872c656c265560243f4e1e5474284b681e344d1e2f3c22272c1f
+2b3322576a1f5e7429576a1f49601f5e74294b681e5560243f4e1e4b681e49601f
+3a4423344d1e5560245560245558243a44233f4e1e3f4e1e3f4e1e47581f576a1f
+5e74294b681e5f7b2a76872d6b852c656c265558243a4423697c2b68752b4c5026
+76872d7b9034757b2d757b2d76872d7c9053656c26656c264960327b9034708f31
+7d973676872d7d97367d97367b9034708f31708f31697c2b68752b76872d556024
+344d1e49601f7b9034697c2b5560243f4e1e49601f5f7b2a5e74293f4e1e5f7b2a
+4960323f4e3249603254605f3f4e32496032627444547443344d1e567f3a547443
+547443657c446183454b69335474285f7b2a6274443f4e323d5f254960322f3c22
+3d573b3d5f25344d1e41671b576b332f3c222a34382f3c223c5822567f3a4b6933
+4b69335474434b681e344d1e3c58224758324960323043212f3c222f3c22304321
+54744341671b3f4e1e354c31262e353335222f3c223043214960325e74294b6933
+47581f6b854576872d6b852c5f7b2a5f7b2a5f7b2a6b852c6b852c5e74294b681e
+5f7b2a49601f47581f657c44576b33627444666b3b7787466b852c8e9f3b80a03b
+8ea83e7197326b852c5f7b2a60832a708f31729e34729e3491af4960832a6b852c
+80a03b80a03b91af49819f597197534b681e657c44708f31657c444b681e576a1f
+5474286f8f5260832a5f7b2a41671b708f3171973260832a3c58222f3c222f3c22
+557f225f7b2a6b854549601f496032656c267b90348e9f3b708f317197326b8545
+3c582249601f60832a3d5f253d5f252f3c22262e35272c1f272c1f2b33222b3322
+2b33222b33222b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2f3c222f3c223d5f25697c2b76872d8e9f3b76872d6b852c697c2b
+5f7b2a5f7b2a6b852c76872d576a1f76872d8c98357b9034576a1f8e9f3b80a03b
+8c9835708f315e7429656c2687872c697c2b5560244c502647581f47581f4c5026
+3f4e1e4c50263a44233335222b3322383c23342d1f272c1f24261c24261c24261c
+1e241b24261c1e241b272c1f272c1f272c1f3a4423576a1f5e7429697c2b697c2b
+87872c7787468e9f3b8c98538e9f3b8ea0598c98538b90338ea0598b90335e7429
+576a1f47581f55602447581f5e7429576b335e74294b681e496032576b334b681e
+697c2b697c2b576b335e74297b90348c98537b9034697c2b47581f576a1f3c5822
+576a1f4b681e3f4e1e49601f68752b5e7429697c2b7b90347f97537b9034576a1f
+5e74295f7b2a7b903492a7598c98358c985376872d6b852c76872d5474288c9835
+8c9835697c2b757b2d7b9034757b2d76872d5f7b2a6b852c5560243f4e1e4c5026
+47581f5560245560243a4423697c2b656c26766e2d9fa8579fa056697c2b697c2b
+4b681e6b852c697c2b6b852c68752b68752b76872db2a8569fa85768752b6b852c
+697c2b697c2b5f7b2a76872d76872d5f7b2a6b852c76872d6b852c76872d383c23
+2f3c22576a1f556024697c2b697c2b757b2d68752b3a4423342d1f272c1f24261c
+24261c24261c24261c342d1f3335224c50263043213f4e1e576a1f6b852c76872d
+708f317d97369f98358b90338b90339f983576872d76872d7b90348c98357b9034
+76872d576a1f76872d697c2b5e742955602468752b576a1f76872d6b852c6b852c
+697c2b697c2b76872d68752b697c2b708f31697c2b47581f47581f5e74294b681e
+304321342d1f333522383c23574f26555824576a1f576a1f697c2b68752b708f31
+8b903387872c87872c6660334c50263f4e1e49601f49601f2f3c222f3c222b3322
+3335225560246b852c576a1f3a4423576a1f576a1f68752b576a1f576a1f576a1f
+656c26576a1f656c265e742987872c47581f47581f708f3160832a49601f344d1e
+6b852c87872c7b90345560244c502668752b757b2d757b2d68752b7d973676872d
+8e9f3b8c9853767b47656c268c98538e9f3b7d9736697c2b7b90347f9753708f31
+7d97366b852c76872d7d97368c98537b90346b85455f7b2a3f4e1e576a1f656c26
+47581f49601f60832a7b90346b852c576a1f60832a76872d697c2b576a1f5e7429
+3d5f253c58224758323f4e32475832657c446f8f52567f3a576b33697c2b547443
+354c3141671b4973234973235f7b2a60832a3c58223043213f4e323043212b3322
+3f4e323d5f2541671b4973233d5f253043212a3438272c1f354c313d5f253c5822
+3a4423354c314b69333d573b3d573b3c58223c58223d5f255f7b2a576b33547428
+6274443a44232a34382f3c222a34382f3c223043214758326274446b852c5e7429
+49601f76872d7d97366b85454973236b852c6b852c697c2b68752b6b8545576a1f
+708f315e74295e742976872d47581f576b335f7b2a778746656c268c985380a03b
+80a03b8ea83e7d9736708f3191af499eb74c80a03b91af498ea83e4b693380a03b
+60832a708f3171973280a03b5e7429697c2b719753708f3141671b60832a708f31
+4b681e7d9736547428708f31708f31708f31708f313d5f25354c31304321547428
+7d97367d97365f7b2a4b681e3d5f2549601f778746708f317b90345e74293d5f25
+344d1e3043216274443c58222f3c222f3c22272c1f272c1f2b33222b33222b3322
+262e352b3322272c1f272c1f2f3c222b33222b33221e241b272c1f2b33221e241b
+2f3c22304321344d1e4b681e576a1f5e74295e74297d97366b852c5474285e7429
+7b90346b852c5f7b2a697c2b5f7b2a708f3176872d76872d7f97538ea059778746
+76872d8b90336b852c766e2d8b903368752b576a1f576a1f576a1f556024576a1f
+47581f47581f383c23383c23272c1f272c1f272c1f1e241b24261c24261c24261c
+1e241b272c1f333522344d1e272c1f24261c272c1f3f4e1e697c2b7d9736aeb84e
+b0b86c9fa857a1af4eb1af4d9fa0568e9f3b8ea0597b90346b852c697c2b47581f
+576b33656c26576b33697c2b767b47656c2649601f49601f5e7429576b3376872d
+7b90345e742947581f657c4476872d76872d778746576b33344d1e5e742947581f
+47581f5558242f3c223a442347581f3f4e1e49601f697c2b7b903476872d697c2b
+4b681e576b3392a7598e9f3b8c98358e9f3b76872d4b681e5f7b2a5560245e7429
+5e74295e74294b681e76872d7b90347b9034697c2b656c26757b2d68752b556024
+555824656c26656c26656c2676872d767b475560248b90559e985368752b5e7429
+557f2254742876872d76872d8c98357d9736aea886b0b86c9fa0566b852c76872d
+697c2b76872d697c2b49601f5f7b2a656c265f7b2a576a1f47581f3f4e1e383c23
+3f4e1e576a1f3f4e1e383c2347581f76872d8c9835555824342d1f342d1f24261c
+342d1f24261c272c1f3335223335224c502647581f68752b5e7429697c2b5e7429
+68752b697c2b7b9034a0a03a8c98358b90336b852c8b90337b90348b90337b9034
+757b2d5560243a4423383c23383c233a4423556024697c2b8b90335e742949601f
+5e74296b852c76872d76872d697c2b8c98355e74293a44232f3c22383c233f4e1e
+4c50262f3c222b3322556024887b2c87872c8b9033757b2d766e2d8b903376872d
+84712f87872c887b2c656c26656c26576a1f4b681e3a44233335223335223a4423
+2f3c223f4e1e656c2655602449601f68752b68752b55602447581f47581f555824
+4b681e76872d697c2b697c2b7b90346b852c60832a76872d8c98355560243a4423
+576a1f68752b4b681e5e74295e7429556024757b2d556024576a1f8c985376872d
+708f317787467787467787467c90538e9f3b7787466b8545778746697c2b778746
+697c2b7c90537d97368c98357b90346b852c708f3177874654742849601f697c2b
+6b852c576a1f4b681e6b852c697c2b697c2b697c2b7b903476872d76872d6b852c
+3d573b354c313c58223f4e323d573b547443708f316f8f525474286b8545657c44
+3d5f254b69334b69336183455f7b2a354c313043213043212a343830444d344d1e
+344d1e4b69334b69335474283d5f253d5f253043212f3c22475832497323567f3a
+3d5f254b681e3c5822354c312b33222b33223043213f4e324b69335f7b2a5f7b2a
+576b333043212f3c22333522304321394446383c233043213a44236b85455e7429
+4b69335e7429697c2b656c26576b3376872d697c2b3f4e1e4758322f3c22496032
+6b8545697c2b697c2b76872d49601f697c2b60832a697c2b697c2b8c9853a1af4e
+8ea83e91af498ea83e8ea83e80a03b708f31557f22708f3141671b3d5f2560832a
+708f31708f316b852c708f31708f316b852c576b3349601f4b69335f7b2a3f4e32
+6183457197323d5f25567f3a497323547428697c2b5f7b2a4b681e4b681e576b33
+7d97366b85454b681e76872d557f2260832a7b90345f7b2a547428496032304321
+2b3322262e35262e35272c1f272c1f262e352f3c22272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f262e352b3322272c1f272c1f272c1f272c1f272c1f
+2b33222f3c223043217b90347d973676872d60832a76872d7b9034708f3176872d
+5f7b2a5e742949601f47581f5f7b2a708f31708f317b9034a0a03aa1a73c7b9034
+7b9034656c26766e2d76872d87872c556024656c265560243a44233a442347581f
+555824576a1f47581f3a442347581f3f4e1e33352224261c24261c24261c272c1f
+272c1f3c582247581f2f3c2224261c24261c24261c2b332247581f76872d8b9033
+87872c87872c8c98538c98538c98358ea0598c98538b903387872c8b9033697c2b
+697c2b7787465f7b2a6b852c5e74295e74295e74295e74295e7429576a1f5f7b2a
+576b33576b33697c2b5e7429576b33697c2b86874a9e9853656c26556024656c26
+68752b4c5026333522342d1f3a44233a44233f4e1e576b33697c2b5f7b2a5e7429
+47581f5e7429697c2b4b681e76872d7d973649601f49601f60832a4b681e5e7429
+708f316b852c49601f697c2b76872d6b852c697c2b7b9034757b2d697c2b576a1f
+4e44254c502647581f49601f7b90345560243f4e1e576a1f86874a68752b4c5026
+6b852c6b852c68752b5e742968752b76872d7b90348c983576872d76872d76872d
+5e742976872d49601f344d1e4c5026697c2b656c263f4e1e4c5026383c234e4425
+47581f3f4e1e342d1f2b3322383c238b90338ea059576a1f3a442324261c24261c
+24261c2b33223f4e1e767b47656c26766e2d576a1f656c2647581f576a1f576a1f
+757b2d7b90347b90348c9835a1a73c8c983576872d708f3176872d5560244c5026
+3f4e1e3335222b33223a442347581f5f7b2a76872d697c2b76872d697c2b656c26
+656c265e74296b852c76872d6b852c6b852c344d1e272c1f3335222b33222b3322
+383c233f4e1e333522383c23656c269f90359788348b90339788349f98359f9835
+97883468752b87872c8b90335e742949601f4b681e383c232b33223335224c5026
+47581f656c26697c2b76872d576a1f87872c76872d576a1f5e742976872d556024
+3f4e1e576a1f555824576a1f5e7429576a1f7d97368e9f3b76872d76872d304321
+47581f49601f4b681e6b852c7b903449601f656c265560245f7b2a7d97368c9835
+708f317d97366b852c8c98537d97367b903460832a4b681e5f7b2a708f315f7b2a
+6b852c76872d708f317b903476872d5f7b2a5e7429697c2b576b335f7b2a6b852c
+76872d76872d5560243c58225f7b2a60832a5e74295e74297b903476872d708f31
+354c31354c313f4e323043213043214b69336f8f526183454960325e74297c9053
+697c2b6f8f524b681e3c58224960322f3c222e3c442f3c222b33223043214b6933
+4b69334b69333d5f253d5f2549601f4960324b69333d5f25304321344d1e4b681e
+49603249603247581f354c312f3c222f3c22304321354c31354c313f4e32354c31
+3f4e1e49603256603a2f3c223a44235f6156656c266b8545576b336b8545697c2b
+6b854547581f60832a5f7b2a576a1f4b681e5f7b2a3f4e322f3c2249601f576a1f
+3a442347581f76872d7787463f4e1e5f7b2a5f7b2a697c2b7787467b90346b852c
+627444697c2b5f7b2a8ea83e729e3471973271973241671b41671b41671b708f31
+7197325f7b2a3c58224973235f7b2a3d5f25547428576b333f4e1e576a1f304321
+5e742949601f3c5822344d1e3c58223f4e1e4960325e742941671b3c582247581f
+76872d697c2b6b852c49732341671b6b852c7197327d97366b852c6b852c3d5f25
+2f3c222b3322272c1f1e241b1e241b272c1f2f3c222b33221e241b272c1f272c1f
+1e241b272c1f1e241b1e241b272c1f1e241b272c1f272c1f272c1f272c1f272c1f
+2b33223a44232f3c2247581f8c9835708f316b852c7b90348c983580a03b6b852c
+5e74295f7b2a5474285f7b2a6b852c6b852c8b90338c985377874686874a76872d
+697c2b656c268b903376872d8c9835656c265560244c50263335224e4425576a1f
+4b681e3c5822576a1f6b852c6b852c5e7429576a1f3a4423383c23333522333522
+47581f5558243a4423272c1f272c1f2b3322272c1f2b332249601f7b90347b9034
+7b90347b90348c98538b9033a0a03a9fa85776872d8ea0598e9f3b7c9053757b2d
+5e74296b8545555824656c265560246b8545697c2b7787465560246274444b681e
+556024556024767b4768752b47581f656c265560249e98539e9853766427778746
+4e4425383c23333522272c1f333522383c234b681e49601f47581f5e74295f7b2a
+3a44233f4e1e344d1e475832666033556024576a1f47581f576a1f5e74295e7429
+76872d49601f47581f6b852c6b852c3a4423697c2b656c26556024666b3b3f4e1e
+3335222f3c222b332249601f6b852c656c26556024657c44697c2b86874a4c5026
+656c266b852c4b681e5560245e742976872d757b2d7b90344b681e5e7429576a1f
+68752b8c9835697c2b5e7429757b2d87872c656c263335222b33222f3c223f4e1e
+656c2647581f3043213043213f4e1e86874a8b9033556024383c2324261c272c1f
+33352275704d9ea88eb1b069aea88684712f656c26697c2b68752b4c50266b852c
+8c98358b90338b90338e9f3ba0a03a8e9f3b8c983576872d68752b3f4e1e2b3322
+2f3c2247581f5e74296b852c708f3176872d76872d76872d76872d5e742949601f
+2f3c2247581f697c2b7b903476872d49601f383c23383c23272c1f2b3322333522
+3a44233f4e1e3043213f4e1e576a1f656c2687872c9f9035a0a03ab1a03d9f9835
+9f9035757b2d757b2d5558243a44235560245560243a4423383c23555824576a1f
+576a1f576a1f8c98358c983568752b697c2b68752b697c2b6b852c697c2b47581f
+344d1e344d1e47581f656c263f4e1e47581f697c2b6b852c5e7429656c2647581f
+76872d49601f3f4e1e3f4e1e5e742949601f3f4e1e4b681e7b90348c9835656c26
+49601f708f31656c266b85457b90347b90346b852c3c58225e74298c9853697c2b
+697c2b708f317d97367d97367b903460832a68752b666b3b3f4e1e47581f656c26
+6b852c576a1f576a1f49601f6b852c708f31697c2b5f7b2a5e7429656c265e7429
+304321354c313f4e323a44233944463d573b60832a567f3a3043214758326f8f52
+557f226b852c618345697c2b4b681e5558243043213043213335224758323f4e32
+354c313f4e32394446354c313c58222f3c223f4e323f4e322f3c22394446344d1e
+3a4423304321304321354c313a44232f3c223f4e323f4e1e4960324b681e576a1f
+4b681e4960324758323a44232f3c22383c23666b3b49601f344d1e5e74297c9053
+49601f4b69335e74293f4e322f3c22475832697c2b354c313f4e1e657c4447581f
+354c31576a1f697c2b3f4e322b3322576b335f7b2a4b681e576a1f576b33576b33
+8c98355f7b2a6b8545729e3460832a6b852c719732557f22557f22729e3480a03b
+76872d819f5947581f7d973680a03b49601f576a1f4973233c58222f3c22497323
+557f223d5f253c582241671b5f7b2a4b681e344d1e3d5f25576b334b681e76872d
+80a03b697c2b7c905360832a557f226b852c557f2249601f5f7b2a7d973660832a
+6b85452f3c223043213043211e241b272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f1e241b272c1f272c1f1e241b2b33221e241b1e241b1e241b272c1f272c1f
+2b33222f3c223a44232f3c225560246b852c49601f5e7429697c2b697c2b5f7b2a
+49601f3c58225e7429557f2276872d7b9034778746666033656c26766e2d86874a
+656c26887b2c8b90338c98537d973668752b5560244c50263f4e1e3a44233f4e1e
+656c26697c2b757b2d87872c7b9034757b2d697c2b697c2b68752b576a1f3f4e1e
+3f4e1e2f3c222b332230432149601f49601f556024757b2d76872d8b903376872d
+8c98358c98358c98358c98539fa8579fa8578c98538ea0598c98355f7b2a697c2b
+778746576a1f68752b697c2b5560245e74295f7b2a778746576b33576b3347581f
+3f4e1e47581f6660333a44234c5026627444576b339a91788c985366592c556024
+656c265558246660333335224e4425574f264c5026344d1e47581f30432147581f
+49601f383c232f3c222f3c223335223f4e1e5e742949601f3f4e1e3c5822576a1f
+5e74295e7429576a1f697c2b5f7b2a3a44233c58223f4e1e3f4e1e47581f47581f
+5560244c50263a4423576a1f656c264b681e47581f576a1f47581f86874a767b47
+555824556024697c2b6b852c6b852c6b852c6b852c76872d5e7429576a1f6b852c
+576a1f76872d6b852c5e742976872d666b3b5558244c502647581f5e74296b852c
+6b852c576a1f3f4e1e576a1f576a1f8b9033757b2d3f4e1e342d1f342d1f2f3c22
+3f4e1e8c9853b0b86cada17fb0b8a3957c2f6b852c76872d555824383c2368752b
+68752b87872c757b2d757b2d757b2d87872c757b2d5e742968752b3f4e1e2f3c22
+47581f6b852c60832a708f31708f3176872d7b903476872d76872d6b852c3f4e1e
+304321697c2b5f7b2a697c2b4c50263a442347581f383c2324261c2b3322304321
+4c50262f3c22344d1e547428576a1f68752b87872c9f98359f9035887b2c757b2d
+76872d5560243a44233f4e1e3a44233a442347581f3a44232b33223f4e1e68752b
+5e74297b90348ea83e8e9f3b8c98357b9034656c2655602449601f697c2b576a1f
+55602476872d76872d556024656c268e9f3b7b9034697c2b5e742947581f4b681e
+4b681e49601f49601f30432149601f5f7b2a576a1f6274446b852c8c9835656c26
+3f4e1e6f8f5276872d708f317f9753697c2b5f7b2a7b90348ea83e7f97536b852c
+60832a7b90347f975380a03b6b852c5f7b2a49601f3f4e1e2f3c22344d1e576a1f
+5e74295f7b2a6b852c6b852c576a1f4b681e5e74294b681e5e742949601f49601f
+304321354c313d4f563043212f3c2230432147581f4758322f3c22304321547443
+719753708f31576b335f7b2a6b85457b9034697c2b757c71627444627444496032
+3a44233335222b3322354c31354c312b3322272c1f262e35272c1f272c1f383c23
+3335222f3c223f4e323f4e322f3c22262e35333522262e352b3322383c232f3c22
+2a34383043214758324758323a44232f3c223d573b3d5f2547583247581f697c2b
+767b47778746697c2b576b3355602476872d76872d5560243f4e323a44233a4423
+3f4e323335222f3c222f3c223335223a442347583247581f497323576b336b8545
+6b852c5f7b2a7197536b852c719732708f31729e34729e34729e3480a03b80a03b
+5e74297b903460832a8e9f3b80a03b7d973676872d5f7b2a3c582247581f7d9736
+708f316b852c60832a5f7b2a6b852c557f223d5f25708f3171973249601f778746
+6b8545697c2b5f7b2a576a1f576a1f54742847581f5474285474285f7b2a60832a
+4b69332f3c222f3c222b332224261c1e241b1e241b24261c24261c1e241b272c1f
+24261c24261c1e241b272c1f1e241b1e241b1e241b272c1f1e241b272c1f272c1f
+2b33223a44236b852c68752b8c98358c9835576a1f47581f47581f49601f304321
+3043212f3c22344d1e47581f576a1f87872c656c26757b2d757b2d9f98359e9853
+9788348b90339f9835b0a83f8b903376872d9f98358b903387872ca0a03a8b9033
+87872c757b2d757b2d97883487872c656c26766e2d656c26766e2d5558244e4425
+3f4e1e4c5026656c2687872c87872c87872c9f9835a1a73cb0a83fa0a03a8c9835
+b2a8568e9f3b8b90338e9f3b8ea059a1a73c8c98538b903376872d697c2b6b8545
+86874a697c2b7b9034697c2b62744468752b6b852c5e74294b681e55602449601f
+656c2649601f344d1e3335223a4423666b3b4c502695885cada17f574f263f4e1e
+5558243a4423383c232f3c224c50265558245560245e7429576a1f333522344d1e
+47581f3043212b332230432147581f304321576a1f344d1e3043213f4e1e5e7429
+708f3154742854742854742849601f3c58224b681e576a1f697c2b5f7b2a5e7429
+697c2b47581f2f3c2255602449601f76872d68752b757b2d5558248b9080c2b868
+555824555824708f317d97365f7b2a6b852c76872d76872d7b903468752b8c9835
+76872d757b2d6b852c47581f6660335558244c50263335222f3c2249601f47581f
+5e74295e7429576a1f697c2b555824656c26757b2d5560243335222b33222f3c22
+3a442386874a8b905576872dc0b197c2b86887872c556024333522342d1f333522
+333522574f26604f2a4e44254c5026383c234e44255e7429708f31556024333522
+2f3c223f4e1e47581f6b852c68752b6b852c5e74296b852c6b852c697c2b4b681e
+47581f6b852c576a1f3f4e1e272c1f272c1f272c1f2b332247581f49601f5e7429
+49601f5560244b681e697c2b49601f5e7429697c2b5e7429576a1f68752b656c26
+757b2d3a4423383c23383c232f3c223a44233f4e1e3a4423383c23576a1f76872d
+7d97368e9f3b7b9034697c2b5e742968752b68752b55602468752b8b903376872d
+8c98358e9f3b8b9033757b2d7d97368c9853656c26697c2b47581f344d1e555824
+68752b697c2b708f31576a1f344d1e3c5822576b335f7b2a5e742976872d86874a
+697c2b7b90347b903476872d60832a76872d60832a708f3192a7598b903360832a
+5f7b2a708f317b903476872d76872d60832a47581f2f3c223c58223d5f255e7429
+76872d697c2b7b903476872d5e7429576a1f576a1f576a1f60832a576a1f49601f
+2f3c223944463f4e1e2f3c224e50433d573b496032475832383c232e3c443f4e1e
+4b69335474283d5f25657c44557f225f7b2a5e742968752b7c905392a7597b9034
+576b3347581f47581f3d5f25354c31304321262e35272c1f3043214b6933496032
+304321333522394446344d1e373e43272c1f272c1f272c1f342d1f2b33223f4e1e
+4b681e697c2b496032475832354c313a442349601f3d5f25304321304321475832
+4960326b854568752b3c58225e74295e7429657c44383c23272c1f2b3322272c1f
+2f3c222b33222a343847583247581f3335222f3c22576b334b681e3f4e1e47581f
+3d5f2549601f497323708f31729e34719732557f226b852c719732708f314b6933
+6b852c8ea83e719732557f2260832a3d5f253d5f25344d1e3043213f4e1e8ea83e
+708f315f7b2a60832a60832a60832a5f7b2a4b681e5e74293d5f255474287d9736
+7b903492a7597197327b90347b90344973233a4423576a1f708f31697c2b576b33
+2f3c222b33223043212a343824261c24261c24261c24261c272c1f24261c272c1f
+272c1f272c1f272c1f1e241b272c1f272c1f272c1f272c1f2b33222f3c222b3322
+2b33222f3c2255602476872d76872d8b9033697c2b6b852c5e74295560243f4e1e
+2f3c223335223f4e1e47581f66603384712f87872c9e98539f98358b90339fa056
+b1a03dbfb04dbeb751cdb85ebfb04da1a73cb1af4dbeb751cdb85ec2b868beb751
+c2b868bfb04dbfb04dbfb04db1a03db1a03d97883487872c9f9835c0a8459f9835
+a0a03ab2a856bfb04dc1b064d0c074d1b876d1b876d0c074dcc17fdcc17fcdb85e
+c2b8689fa8579fa0568b90337c90538e9f3b8b90558c9853697c2b697c2b697c2b
+6b852c68752b6b852c5f7b2a5e742956603a656c26697c2b656c264960323f4e1e
+49601f5560242f3c22383c23333522383c23383c23565838857d674e44253a4423
+3a44233335223a4423333522383c234c502668752b5e7429555824383c233a4423
+30432149601f3c58224b681e3f4e1e344d1e5e7429344d1e3f4e1e76872d6b852c
+5e7429557f22576a1f49601f3f4e1e4b681e576a1f6b852c556024576a1f3c5822
+49601f556024304321383c233f4e1e576a1f576a1f656c26574f2675704dc2b868
+8b9055556024576a1f576a1f697c2b76872d5f7b2a7b903476872d76872da0a03a
+8e9f3b757b2d76872d556024757b2d7664273f4e1e2b332233352247581f3a4423
+5e7429697c2b697c2b68752b576a1f55602447581f3f4e1e5e74293a44232f3c22
+2f3c227787468c9853697c2b9e9853b2a0538b90554436232b3322272c1f272c1f
+272c1f333522443623443623383c23383c2333352249601f76872d76872d3a4423
+383c233335223335223a4423556024656c26556024576a1f576a1f5560243a4423
+47581f6b852c697c2b576a1f3335222f3c222f3c224b681e708f316b852c60832a
+5f7b2a576a1f47581f47581f3a442330432149601f4b681e49601f5e74295f7b2a
+5e74292f3c222b3322272c1f272c1f383c2347581f576a1f656c2676872d7d9736
+8ea83e8ea83e7b90346b852c7f975376872d4c502647581f6b852c76872d697c2b
+7b9034697c2b8b903368752b576a1f576a1f47581f3f4e1e5558243a4423383c23
+3a442347581f576a1f555824344d1e697c2b6b852c6b852c6b852c7d97367d9736
+60832a6b8545576a1f7b90345f7b2a6b852c5f7b2a7197327d973677874668752b
+5f7b2a6b852c5f7b2a708f31656c265e7429576a1f3c58223c58225e74294b681e
+5e7429697c2b7b90347b90346b852c76872d6b852c5474284973235e7429576a1f
+383c2330444d3d5f25354c31354c313a44234758324758323c5822304321576b33
+60832a497323618345708f315f7b2a3c5822576b336b852c6b852c7787466b852c
+5e74294973235e74294b681e3d5f25304321354c313c5822576b334960322e3c44
+3335223a442347581f49601f4960322f3c22262e35272c1f262e35304321547428
+576b334b6933344d1e3a44232f3c223f4e1e4960323f4e1e3d573b3d5f253c5822
+576b338ea0598ea0596b85454b681e4758322f3c22333522304321496032304321
+4758323335223043215f7b2a47581f2f3c223043213f4e323f4e1e344d1e3f4e1e
+49601f3c58225f7b2a80a03b91af49719732708f317d973680a03b6b852c60832a
+76872d7d9736719732576a1f60832a3c58223d5f25557f223c5822576a1f91af49
+60832a60832a6b852c7d97367b90347d97367197324973235e742976872d80a03b
+5f7b2a5474284973233c58223c58225e74295e7429657c443f4e1e3335222b3322
+3335221e241b262e35342d1f24261c24261c24261c272c1f24261c272c1f272c1f
+272c1f272c1f272c1f2b33222b33223335222f3c223f4e1e3a442355602447581f
+4c5026656c268b90338b903387872c6b852c6b852c757b2d697c2b555824556024
+2f3c222f3c22757b2d8c9835b2a856b2a856b2a856b1b069c1b064d1b876cdb85e
+d0c074d1b876d0c074d0c074d4cb83d4cb83e0c492d4cb83e0c492d4cb83d4cb83
+e3cc97d4cb83e3cc97e3cc97e3cc97dcc17fd4cb83dcc17fd4cb83d0c074dcc17f
+dcc17fe0c492d1b876d1b876d1b876d0c074d0c074c1b064c2b868c1b064c1b064
+b2a8569fa8579e98538b9033767b4768752b6b852c76872d657c445e7429576b33
+627444697c2b657c444b681e576b3368752b576b33576a1f3f4e1e55602449601f
+4c50263f4e32383c23383c232b3322383c23383c2356603a7787463f4e1e333522
+3335223335222b33222b33223335224e44255558245558245560244c5026333522
+272c1f2b332247581f30432130432130432154742830432130432149601f76872d
+6b852c3d5f253c5822344d1e49601f3d5f2541671b4b681e344d1e576a1f47581f
+4b681e4b681e3f4e1e3f4e1e5e7429576a1f68752b5560244c5026373e438b9055
+86874a656c266b852c5e7429697c2b7b903476872d7d9736697c2b757b2d8c9835
+8c9853576a1f697c2b556024666b3b383c23342d1f3a44239f91548b9033555824
+656c26556024697c2b757b2d656c266b852c697c2b68752b8b90334c5026333522
+55582468752b7b903476872d55602476872db2a856766e2d383c233f4e1e576a1f
+3f4e1e342d1f3335224436233335224c50264c502668752b8c983568752b4c5026
+383c232b33224436233335223335222f3c223a4423383c23333522304321333522
+47581f3f4e1e383c23383c233f4e1e3a44234b681e708f316b852c6b852c6b852c
+5e7429697c2b4b681e3f4e1e3f4e1e49601f4b681e697c2b5e74296b852c5f7b2a
+47581f2b33222b33223043214c5026574f26656c2666603376872d8c983587872c
+757b2d76872d697c2b576a1f76872d76872d576a1f697c2b76872d76872d7d9736
+7b903476872d68752b576b33576a1f5f7b2a6b852c6b852c68752b656c26383c23
+2f3c22344d1e6b852c3043214b681e697c2b6b852c60832a60832a8c9835708f31
+7787467b9034708f317c90538e9f3b697c2b5f7b2a6b85457d97366b852c7b9034
+7787467787466b852c6b852c576a1f576a1f5f7b2a49601f30432147581f68752b
+4b681e5e742976872d6b852c697c2b757b2d576a1f3f4e1e344d1e547428656c26
+333642344d1e4b69333d573b3f4e323d573b4960324b69335f7b2a4b69336b8545
+6b852c567f3a657c44708f314758322e3c444b681e6b85454960324b6933547428
+5f7b2a3f4e323d5f25547428547428576b334b681e4960323c5822304321304321
+3c5822557f22708f31708f31547428354c312f3c22373e432f3c22496032576b33
+3f4e1e304321344d1e4758323f4e323d573b304321344d1e344d1e3f4e32627444
+7c9053a1af4e8ea0597b90346b854547581f3f4e1e5e74295f7b2a4b681e5e7429
+576b333f4e1e4b693360832a5f7b2a4b681e3d5f2547581f3f4e323f4e32576b33
+627444576b336b852c71973280a03b91af498ea83e80a03b80a03b729e34618345
+3c5822697c2b719732497323708f314973233f4e1e344d1e5f7b2a7d9736708f31
+576a1f708f31708f3180a03b7b90347b90347197325f7b2a80a03b7b90345e7429
+4b681e3c58223d5f25383c2355602449601f3335222b3322272c1f24261c272c1f
+262e35272c1f1e241b24261c24261c262e35262e352b3322262e352b3322333522
+2f3c223a44233043213a44233a44234e44254c5026666b3b766427757b2d887b2c
+86874a9f9035c1b064c4bf65b1af4d8b903368752b576a1f47581f4c502668752b
+697c2b6b852c76872da1a73cd4cb83d4cb83e0c492e3cc97e3cc97e3cc97e3cc97
+e3cc97e3cc97e3cc97e3cc97e3cc97e3cc97e3cc97e3cc97e3cc97e0c492dcc17f
+dcc17fd0c074cdb85ec2b868c4bf65cdb85ec1b064cdb85ed1b876cdb85ed8c291
+cdb85ecdb85ebfb04dc0a845c0a845c2b868beb751b1af4d9fa056a1a73cb2a856
+b2a8569fa0568c985376872d68752b49601f55602462744447583249603249601f
+576a1f77874647581f47581f5e742947581f6274444758322b3322576b334c5026
+3335223335223335222f3c22344d1e5e74294c50263f4e1e75704d4e44252f3c22
+3043212f3c222b33222f3c223a44237664275558243f4e1e556024555824272c1f
+2b33223335222b3322383c23333522383c23697c2b2f3c222b3322556024697c2b
+5f7b2a304321304321344d1e656c263f4e1e49601f344d1e3f4e1e3c5822344d1e
+344d1e576a1f5e74295e7429656c26556024666033383c23272c1f333522766e2d
+8b9055757b2d76872d47581f47581f556024344d1e47581f47581f68752b76872d
+8471444e44254c5026555824443623272c1f4e44258b905595885c9e9853867c4c
+757b2d68752b76872d76872d76872d7b9034656c26697c2b87872c5558243f4e1e
+576a1f87872c8c9835656c263f4e1e8b90338ea059b0b86c9fa056757b2d68752b
+6660335558244c5026656c2686874aa0a03a8b90338b9033766e2d3a4423574f26
+333522272c1f2b3322383c234c5026383c232b33223a44232b3322272c1f333522
+47581f3043213335222b33224b681e3f4e1e47581f576a1f5e74296b852c6b852c
+6b852c576a1f54742860832a5f7b2a6b852c5e7429697c2b697c2b5f7b2a5f7b2a
+4b681e2f3c225560245e74295e7429766e2d576a1f576a1f8c98358c983576872d
+757b2d576a1f556024697c2b576a1f76872d7d97367b90346b852c656c2676872d
+576a1f68752b576a1f76872d6b852c76872d5f7b2a5f7b2a5f7b2a76872d68752b
+556024383c2347581f4b681e8ea83e5f7b2a4b681e76872d7d97365e74297b9034
+7d9736778746697c2b697c2b6b852c6b852c576a1f5e74296b852c76872d778746
+68752b6b852c657c444b681e4b681e5e742954742849601f3f4e1e2f3c22556024
+5e74296b852c76872d6b852c8b903387872c55582449601f49601f557f2276872d
+2a34383d573b60832a3c58223d5f253d5f253c58225e74295e74295474283c5822
+4b6933657c44557f22576b333f4e1e354c31576b334b693349601f567f3a547428
+5f7b2a4b681e49601f6274443d5f255f7b2a576b3349601f4b69333c5822497323
+76872d76872d80a03b6b852c47581f354c31657c447c9053819f597d9736778746
+5474284960323c58223043212f3c224758324960323f4e32344d1e3f4e1e657c44
+8ea059a1af4e8c98358ea83e80a03b708f31708f316b852c47581f49601f496032
+3043213043214960326b852c708f3149601f354c313f4e1e576a1f47581f475832
+2f3c223f4e1e708f318ea83e91af498ea83e719732729e3480a03b708f31497323
+3c5822557f223d5f25497323708f314b681e304321344d1e49732376872d80a03b
+7d97365f7b2a80a03b7d9736656c264b681e76872d719732697c2b697c2b6b8545
+76872d557f225f7b2a3f4e1e656c2647581f2f3c22262e35272c1f24261c272c1f
+24261c24261c262e35272c1f272c1f342d1f2b33222f3c224e44253a44233f4e32
+574f26556024656c26556024767b478b9055b2a856c1b064b1b069c2a85ecdb85e
+cdb85ed0c074e3cc97d0c074c4bf65757b2d656c26766e2d66592c555824757b2d
+656c2687872c68752b86874a9e9853b2a856e0c492e3cc97e3cc97dcc17fdcc17f
+dcc17fd1b876dcc17fdcc17fdcc17fdcc17fd1b876d1b876d1b876d1b876d0c074
+d0c074bfb04db2a856c1b064b2a856c1b064b1a03db2a053c2b868d0c074cdb85e
+c1b064b2a856bfb04dbfb04db1af4dc2b868bfb04db1b069b1af4db1af4db1b069
+9fa0569fa0568b9033778746757b2d757b2d49601f4b681e344d1e4b69335e7429
+5e74296b852c47581f627444576a1f576b33576a1f576a1f5e74295558242f3c22
+3043215f7b2a5e74293c58223c58223c58223a44233a4423666b3b4c50262f3c22
+383c233a44234c50264c50263a44234e44254c502649601f47581f49601f3c5822
+3c5822344d1e2f3c223a44232f3c223043213f4e1e344d1e304321344d1e576a1f
+5560242f3c222b332247581f3f4e1e333522344d1e3043213c58223f4e1e3a4423
+3a4423576a1f68752b757b2d8b903355602468752b656c2647581f496032767b47
+9fa857757b2d87872c576a1f4c5026344d1e333522383c232f3c22555824656c26
+697c2b574f265558244c5026272c1f4e44258c985395885c9e9853b2a053957c2f
+757b2d757b2d757b2d8b90338b903376872d556024656c268c9835766e2d76872d
+5560248c983587872c766e2d86874a8c98358c98359fa8579fa8578c9853b1b069
+c0b8a6b2a8569fa0569e9853a0a03a9f98359f9035656c26666033342d1f342d1f
+2b3322383c233a4423757b2d656c2649601f55582486874a7787463f4e1e333522
+47581f3f4e1e2f3c22342d1f47581f5560243a44233f4e1e3a44233a442347581f
+3c582249732360832a6b852c6b852c697c2b6b852c7b9034697c2b5e7429697c2b
+3f4e1e2f3c2247581f47581f656c265560245558248c98356b852c47581f3f4e1e
+3a442368752b697c2b576a1f49601f576a1f4b681e76872d5e74296b852c68752b
+4c5026576a1f68752b6b852c76872d5f7b2a68752b6b852c5e7429697c2b697c2b
+3f4e1e33352247581f6b852c7d97368c98537b90347197536b852c76872d7f9753
+76872d697c2b5f7b2a5e74295f7b2a76872d6b852c708f3176872d708f315f7b2a
+6b852c576a1f68752b3f4e1e344d1e41671b5e742949601f47581f4b681e3a4423
+576a1f87872c7b9034576a1f8c9835887b2c47581f5560249f90358b903387872c
+2f3c22354c3141671b354c313d5f25344d1e4b69335f7b2a6f8f525e7429547428
+5e74297c905360832a5474285e74296183457787468c9853657c4477874660832a
+5474284973235f7b2a4b6933344d1e304321344d1e4b69334758323a4423576b33
+7197325f7b2a6b8545576a1f3c58223043213d5f25697c2b7f97537f97537b9034
+576a1f4b681e3d5f253c58222f3c222f3c223a4423354c313f4e3256603a576b33
+76872d92a7598ea0598ea83e92a759708f317b9034708f315f7b2a576b33344d1e
+344d1e3043212f3c22576a1f6b852c4b681e5474285e74296b852c5e7429576b33
+4b69337c90538ea83e80a03b8ea83e719732557f2249732341671b497323497323
+54742860832a708f315f7b2a6b852c708f31344d1e49732376872d5e742980a03b
+576a1f76872d6b852c80a03b5f7b2a344d1e3d5f253c58223f4e1e3a4423344d1e
+4c50263c5822576b332f3c223335223a4423272c1f24261c272c1f24261c272c1f
+272c1f24261c342d1f342d1f2a34383335223335224c5026666b3b766e2d766e2d
+87872c9f90359f9035b2a053c4bf65cdb85ed0c074d1b876d0c074c2b868ccb169
+cdb85ecdb85ed0c074cdb85eb1af4d766e2d574f26555824555824443623574f26
+5558244e44254e4425574f26766e2dc1b064d1b876d1b876dcc17fd1b876d1b876
+d1b876ccb169ccb169c2a85eccb169c0a845c0a153ccb169c0a845c2a85ed0c074
+cdb85ebfb04dbfb04db1af4dbfb04db0a83fbeb751beb751c2b868b1b069b0a83f
+b2a053b1a03db1af4da1a73cb1af4db2a053b2a856c1b064b2a8569fa857b2a856
+9e98539f98358b903377874687872c778746555824576b335e7429656c266b8545
+697c2b55602449601f576a1f47581f4b681e5e74296b852c5e7429576b333f4e1e
+49601f697c2b656c263f4e1e47581f3f4e1e47581f556024656c264c50262b3322
+272c1f2b3322333522383c23304321272c1f2b332249601f3f4e1e576a1f547428
+497323344d1e2f3c222f3c22304321344d1e3a44233043213f4e1e4b681e697c2b
+2f3c22272c1f2f3c224b681e3a44232b33223c58222f3c22333522344d1e344d1e
+47581f47581f383c23574f268c983587872c757b2d76872d87872c68752b87872c
+9e98539e98539f9035656c263a44234c50265560243a4423383c2347581f666033
+555824656c263a44233a442347581f9e98539e98538c98539f91549fa05695885c
+656c26556024757b2d8b90338c9835576a1f555824656c267b903468752b757b2d
+555824a0a03a8c9835a1af4e8e9f3b9e98538c9835a0a03a9f90359fa056aea886
+b1b069b2a8568c98358e9f3b9f98358b903384712f383c23383c232b3322342d1f
+556024757b2d76872d76872d76872d6b852c708f3176872d7b903487872c68752b
+4b681e576a1f576a1f556024344d1e3f4e1e68752b656c263a44233f4e1e697c2b
+5f7b2a6b852c60832a6b852c6b852c76872d5e74295e742949601f3043212f3c22
+2f3c223a44233f4e1e3c58224b681e3f4e1e47581f6b852c556024383c233a4423
+68752b697c2b49601f3f4e1e3f4e1e383c2347581f49601f5f7b2a68752b4c5026
+576a1f6b852c68752b3f4e1e576a1f5e742976872d76872d697c2b556024576a1f
+47581f3a44233f4e1e5e74297d97368c98537d97366b852c6b852c708f317b9034
+697c2b5e74295f7b2a6b852c6b852c5e7429708f3176872d6b852c8c98357d9736
+708f31657c445e74293f4e1e2f3c2249601f47581f344d1e576a1f54742847581f
+656c2697883476872d5e74298e9f3b84712f576a1f87872c9788349f90358b9033
+3944463d573b3d573b3d5f256183454b69334b69334b6933778746729e34708f31
+7b90346b85457b903460832a60832a6b852c7c90538c985392a75992a7598ea059
+708f3160832a6b852c60832a4973233d573b344d1e3f4e323c58223f4e1e618345
+719732557f224973234b69335e74294973233d5f253f4e3255582476872d5e7429
+49601f576b3356603a68752b4758322b3322262e352b33222f3c22344d1e5e7429
+92a7597f9753697c2b7f97537b903476872d7c90535f7b2a5474284b681e4b681e
+5e74295e7429556024697c2b7d97366b852c76872d656c26576a1f576b33547428
+7d9736729e348ea83e719732708f318ea83e557f2241671b547428547428557f22
+708f3160832a5e74293d5f2549732349601f304321576a1f60832a8c98358ea83e
+60832a4b681e41671b8ea83e557f223d5f25557f22557f22344d1e2f3c22354c31
+4b681e344d1e2f3c22262e352b3322272c1f24261c272c1f24261c24261c24261c
+272c1f272c1f272c1f272c1f342d1f3335223335224c5026757b2d9f9035978834
+b1a03db1a03dc0a845c2b868cdb85eb1af4db2a856c0a845c0a845c0a845cdb85e
+cdb85ecdb85ebfb04dbfb04dc4bf65b0a83f8c983587872c55582455582468752b
+656c26656c268b90339f9835bfb04ddcc17fccb169ccb169d1b876b09954887b2c
+ad903dc0a153c2a85ec0a153c0a153c0a153c0a153c0a845ccb169c2a85ec1b064
+c3c17ac2b868b2a856b2a0539f9835b0a83fa0a03ab2a856b1af4db1af4db0a83f
+c1b064b2a856a0a03a9e9853b0a83fa0a03aa0a03ab2a856a1a73c9f98359fa056
+9e98539f91548b9055757b2d757b2d76642747581f656c26576b33697c2b656c26
+576a1f49601f556024556024576a1f4b69334758323f4e1e4c502647581f68752b
+627444556024576a1f3f4e1e55602447581f3f4e1e47581f556024574f26333522
+2b3322272c1f333522383c23304321383c233f4e1e3f4e1e3f4e1e47581f547428
+576a1f5560243f4e1e2f3c2247581f3f4e1e2f3c222b33222f3c2247581f556024
+383c232f3c222f3c223c58223f4e1e342d1f2b3322342d1f272c1f47581f4c5026
+3a44233a44233043215e742976872d7d973676872d68752b49601f757b2d8b9033
+76872d8ea0599e9853887b2c555824656c268b9033766e2d3a44234e3d223a4423
+383c233a4423383c234c50267787468b90559e985387872c87872c9fa0569f9035
+76872d757b2d766e2d5560245558245e742976872d697c2b87872c757b2d9f9835
+8b9055b1b0699fa857a1af4e9f98359fa8579e98539e98539fa056a1a73cb1b069
+9fa056a0a03aa0a03a8e9f3b8c98359f903568752b344d1e576a1f656c26697c2b
+8c98538c9835708f3176872d76872d7b903476872d76872d7d973680a03b76872d
+68752b3f4e1e4b681e576a1f344d1e576a1f5e7429576a1f576a1f576a1f76872d
+708f3176872d60832a5560245e74295e7429576a1f3f4e1e383c233335222f3c22
+3a44233f4e1e3a4423576a1f5e742947581f576a1f68752b47581f3335223f4e1e
+555824576b335560243a44233f4e1e30432149601f49601f47581f47581f556024
+76872d76872d766e2d3a44235560248b90338e9f3b80a03b7d973676872d6b852c
+697c2b576a1f3f4e1e656c26576a1f7b90347b90345f7b2a6b85456b852c708f31
+76872d41671b708f317b9034576a1f5e742976872d76872d68752b6b85457b9034
+7787465f7b2a47581f5f7b2a757b2d5f7b2a49601f3f4e1e4973235474285e7429
+766e2d68752b576a1f697c2b87872c576a1f757b2d9fa857957c2f757b2da1a73c
+354c313f4e323a44233c58224b69333d5f25344d1e304321496032576b33547443
+5e74295f7b2a7b90346b852c6b854560832a6b852c7b90348c985392a7599fa857
+7f9753497323618345547428344d1e4960327c90537f9753657c446b8545576a1f
+7b90347b90344b681e3c58226274444b69334b69333f4e32383c23475832576b33
+4b681e49601f496032475832565838383c23342d1f2a34383043216274449fa056
+9fa8577b903492a7598ea059819f596b852c7b90345e74294b681e5e7429576b33
+6b852c6b852c5e74297787467d97365474284b69332f3c222f3c22354c314b681e
+8c98357d973680a03b71973276872d708f3180a03b7197328e9f3b7d97368ea83e
+80a03b3d5f252b33225f7b2a576b33383c232f3c222f3c22708f3176872da1a73c
+576a1f3c58225e74297b90346b852c5f7b2a708f3160832a41671b3f4e1e304321
+3c58223c58222f3c2224261c272c1f24261c24261c272c1f272c1f342d1f272c1f
+272c1f2b3322342d1f3335222b33223a44234c502655602487872c87872c978834
+b1a03dbfb04dcdb85ec1b064c2a85ebfb04dcdb85ebeb751ae993dae993dc0a845
+ccb169bfb04da1a73ca0a03ab0a83fa1a73c8b903376872d757b2d76872d766e2d
+76872d87872c757b2d9f9035a0a03ac0a8459f9835957c2f84712f66592c766e2d
+9e9853c0a845ccb169ccb169c0a153c0a845c0a845d0c074d0c074d0c074d1b876
+d0c074c1b064c2b868b1af4db1af4db1af4db0a83fb1af4db0a83fb2a856c2a85e
+c2a85eb1a03da0a03a9fa857b1af4da1a73cb2a856b0a83f9fa056b2a8569fa056
+b2a8569e98538b9033767b4768752b4c5026556024656c265e7429697c2b4c5026
+4960325e742956603a5560245e742949601f3a4423344d1e49601f576b33576a1f
+68752b656c265e74295e742947581f555824576a1f49601f3f4e329e985356603a
+272c1f272c1f272c1f33352247581f49601f47581f344d1e49601f5e7429697c2b
+6b852c7d97365e74292f3c2249601f49601f3043212b33222b33223043213f4e1e
+4c5026344d1e2f3c22344d1e47581f272c1f3335222b33222b3322344d1e656c26
+5560243f4e1e68752b656c26656c26656c2676872d8b90336b852c7b9034697c2b
+757b2d7b9034b1b069b2a053766e2d8c98359f983584712f5558244436234e4425
+3335223a4423697c2bb0b86ca0a03a86874ab2a053757b2d8b90338b903387872c
+76642768752b666033333522333522344d1e76872d76872d8c98358b9033a1a73c
+b2a856b1af4db2a0538b90339fa056a0a03a9f98359f98359fa0569f9835a0a03a
+9f9835a0a03a9f98358b9033a0a03ab1a03d76872d6b852c6b852c76872d7b9034
+7b903476872d6b852c708f3176872d7b90347d973676872d6b852c76872d3f4e1e
+576a1f47581f344d1e3d5f2547581f344d1e49601f3f4e1e3c58223f4e1e555824
+68752b576a1f3a44232b33222f3c222f3c223a4423333522272c1f2b3322304321
+3043213a4423272c1f3335224c50263f4e1e556024555824304321344d1e697c2b
+555824656c26383c23272c1f33352247581f576a1f344d1e3a4423383c2349601f
+757b2d47581f4c50262f3c223f4e1e576a1f5560245f7b2a7b90347d97368c9853
+697c2b76872d7b9034708f316b852c7d97367b90347d97368c985360832a6b852c
+5f7b2a3d5f255f7b2a7d9736576a1f49601f60832a697c2b5e74296b852c5e7429
+6b852c576a1f576a1f6b852c68752b60832a76872d576b333f4e1e49601f708f31
+757b2d656c2655602476872d9fa05687872c8b90339f915484712f9f9835a0a03a
+66603356603a3f4e323f4e324b693341671b354c31304321304321304321496032
+61834554742860832a60832a7b90345f7b2a60832a708f317197328c98538ea059
+7f9753497323576b33547443344d1e3a4423576a62757c71697c2b68752b68752b
+8ea0597197326b85454b681e3f4e1e3f4e1e576b33767b476b85458ea05976872d
+576b334b681e47581f383c232b3322333642272c1f2f3c22576b33576a1f7c9053
+b0b86c92a759a1af4e8ea05976872d6b852c5f7b2a6b852c6b852c5e742960832a
+6b85457d97365f7b2a5f7b2a5f7b2a4758323c58223f4e1e3f4e1e576a1f618345
+5f7b2a819f597b9034708f317d973660832a49601f708f31708f3147581f6b8545
+5e74293043212f3c2254742849601f2f3c22272c1f33352276872d8c9835778746
+3d5f25344d1e4b69335e74293f4e1e3a44234c50263c5822344d1e54742849601f
+344d1e657c442b3322272c1f272c1f272c1f24261c24261c24261c24261c272c1f
+272c1f262e352f3c222f3c22383c23555824576a1f6b852c9f9835ae993dbfb04d
+c1b064c0a845bfb04dccb169bfb04dccb169bfb04dc0a845b1a03dae993dcdb85e
+cdb85ecdb85ec4bf65aeb84e8e9f3b757b2d576a1f68752b9f98358e9f3b87872c
+757b2d757b2d9f98358b903387872c76872d656c26656c2668752b68752b8b9033
+9f9835c0a153c0a153c2a85ec0a845c0a153c0a845dcc17fe0c492e3cc97d4cb83
+c1b064d0c074c1b064b1af4db2a053b0a83fb2a053c2a85ebfb04dc1b064bfb04d
+c2a85eb2a856b0a83fc2b868b1af4dbfb04db1af4db1af4db2a8569fa056a0a03a
+9fa056b2a0538ea05987872c656c2668752b757b2d76872d6b852c4b681e304321
+4c502647581f344d1e3f4e1e656c26576b333f4e1e556024697c2b6b852c5e7429
+7787466b852c7787465e74293c58223a44235e7429576b33565838b1b069847144
+342d1f24261c24261c272c1f556024576a1f5e7429576a1f49601f708f3160832a
+6b852c6b852c6b852c47581f3f4e1e576a1f47581f2f3c223a4423656c26656c26
+60832a3f4e1e3a4423344d1e3a44233335222f3c22344d1e3c58224b681e576a1f
+5560245558245e742968752b556024576a1f68752b656c2668752b76872d76872d
+6b852c757b2d9fa0569e985366592c555824656c2676872d4c5026342d1f443623
+383c23666b3bc3c17ac2b8688b903386874a9fa056757b2d8c98539e985387872c
+55582487872c757b2d383c232b33222b33223a442368752b76872d8b90338c9835
+9f98358b903387872c9f9835b1b0699e98538c98359f9835a0a03aa0a03aa0a03a
+8c98359f98359f9835887b2c957c2fae993d766e2d55582447581f576a1f76872d
+7b90346b852c3f4e1e47581f5560245e74296b852c76872d7b9034697c2b47581f
+49601f49601f3f4e1e49601f92a759767b478b90336b852c656c26556024666033
+4c50264e44253f4e1e342d1f272c1f2b3322333522272c1f333522272c1f272c1f
+272c1f272c1f272c1f24261c342d1f24261c272c1f342d1f272c1f576a1f7d9736
+6b852c5558243335223335222b33222f3c2268752b3f4e1e3f4e1e49601f576a1f
+3a44233a44233f4e1e656c2655582447581f47581f697c2b76872d5560245e7429
+6b852c708f315f7b2a576a1f7d973676872d7b90347b90348c98357f97536b852c
+697c2b576a1f5f7b2a76872d55602447581f47581f5e74295e742976872d68752b
+5e74295e742960832a708f315e74298c9835757b2d5e7429697c2b7787466b852c
+76872d87872c576b336b852c8c98539f91549f9835a48a3b8b90339f9035887b2c
+3a44233f4e32394446475832547428567f3a4973234b69334b69334960327b9034
+7197326b854560832a708f316b854547581f5f7b2a6f8f52708f316b852c576a1f
+49601f5f7b2a547428567f3a3d5f254758323c5822344d1e576b335f7b2a80a03b
+708f315f7b2a5f7b2a41671b3d573b3f4e1e4c5026373e4356603a657c44576b33
+657c4449601f3043213f4e1e2f3c223335222f3c222b3322304321767b4792a759
+8ea0597d97368c98538c98538b90337c90536b852c557f2260832a5f7b2a5e7429
+7b90347b9034697c2b576a1f4b69333f4e1e2f3c222e3c44304321344d1e344d1e
+3f4e1e697c2b5e74295e74298e9f3b576a1f3f4e1e7d97364b681e3f4e1e3f4e1e
+556024656c26304321344d1e304321272c1f272c1f2b33223f4e1e767b472f3c22
+3c58223c58224b681e8c9835576a1f272c1f272c1f272c1f2b3322344d1e3a4423
+2b33223a4423272c1f24261c24261c24261c272c1f24261c24261c24261c24261c
+272c1f3335224e442547581f555824757b2d55602487872ca0a03ac0a845cdb85e
+d0c074c2a85ec2a85ed1b876ccb169bfb04dccb169c0a845cdb85eccb169bfb04d
+ccb169d1b876dcc17fcdb85ebfb04d68752b555824556024556024556024383c23
+2f3c225558245560245558243f4e1e4c502649601f656c265e74296b852c87872c
+87872cb1a03dc0a845c0a845b0a83fb1a03db1a03dcdb85ed1b876dcc17fd0c074
+c1b064c2a85ec2a85eb2a0539e9853b2a053c2a85ebfb04dccb169c0a845b2a053
+c2a85ecdb85ec4bf65bfb04db0a83fb1b069bfb04dbfb04dc2b8689fa0569fa056
+a0a03a9fa0568c9853766e2d757b2d757b2d8c98537b903487872c576a1f3a4423
+3f4e1e3f4e1e47581f3f4e1e3a44233f4e1e5f7b2a5f7b2a708f317c90537b9034
+7b9034697c2b5e7429697c2b3f4e1e576a1f778746475832666b3bc1c2aeada17f
+383c23342d1f272c1f272c1f3a442349601f4b681e3c58225e742976872d7d9736
+7197325f7b2a6b852c6b852c5f7b2a5f7b2a49601f47581f47581f656c263a4423
+576a1f576a1f3f4e1e3c582249601f3043213f4e1e3f4e1e576a1f49601f4b681e
+7b903476872d76872d576a1f3f4e1e4c50263a44235560243f4e1e656c2647581f
+576a1f576a1f697c2b8b9033867c4c3a4423574f264c50264e44252b33224c5026
+766e2d9fa857c0b8a69e9853766e2d87872c9f9154656c2687872c87872c87872c
+3f4e1e757b2d656c26333522272c1f3335223a4423383c233f4e1e697c2b8b9033
+8b90338b90339f9835b2a856b2a85687872c757b2d8e9f3b8e9f3b757b2d656c26
+656c26555824766e2d4e4425604f2a977c4f766427656c26383c23383c23576a1f
+555824556024344d1e3a442330432147581f576a1f697c2b6b852c47581f3d5f25
+4b681e576a1f6b852c7c90539fa8579fa85786874a697c2b7b90348e9f3b8c9853
+87872c656c263f4e1e3a4423333522272c1f272c1f272c1f383c2333352224261c
+24261c24261c24261c272c1f24261c24261c24261c24261c272c1f383c23627444
+666b3b383c233043212f3c223043213f4e1e49601f3f4e1e3f4e1e697c2b76872d
+4c50264e3d224e44256660335558243a4423383c235558244c5026383c234c5026
+5f7b2a576a1f4b681e656c2647581f68752b8c98357d97366b852c7c90536b852c
+697c2b68752b68752b576a1f5560244b681e4b681e47581f3f4e1e4b681e5f7b2a
+5e74298c98357d973660832a6b852c80a03b9f98359fa056757b2d87872c68752b
+76872d9e98536b852c697c2b76872d9f98358b90339f9035766e2d847144887b2c
+333522373e433a4423576b337c90534973233d5f25496032496032657c447b9034
+6b85454b681e6b854560832a4b681e4b69334b681e5e74296183454b69335f7b2a
+4b69335f7b2a708f315474433043213043214b6933576b334b69333d573b547428
+54742849601f4b69333f4e32383c232a34382f3c222f3c22373e433a4423576a1f
+576a1f4960323c58223f4e322f3c222f3c22354c313f4e1e576b336b85459fa857
+8c98357b90346b852c7d973676872d8ea0597f975354742849601f4b6933657c44
+6b8545657c447b903461834547583249601f344d1e344d1e3043214b6933333522
+4758324b69334b681e76872d80a03b5474283a44235558246274442f3c222f3c22
+383c232b33222f3c222b3322272c1f272c1f272c1f272c1f272c1f2f3c22272c1f
+576a1f3d5f25697c2b383c232b33222b3322272c1f2b332224261c24261c272c1f
+1e241b24261c24261c272c1f342d1f24261c24261c342d1f24261c272c1f342d1f
+3335224e3d22556024887b2c957c2f87872c84712f978834c0a153cdb85ec0a153
+dcc17fdcc17fdcc17fcdb85edcc17fdcc17fccb169dcc17fdcc17fdcc17fcdb85e
+cdb85edcc17fdcc17fd0c074cdb85e9f98358b9033766e2d47581f3f4e1e2b3322
+333522383c233f4e1e5558243f4e1e47581f49601f3c5822555824556024656c26
+84712fc0a845c0a845c0a845c0a845b2a856b0a83fc2a85eb0a83fb1a03dae993d
+ae993db0a83fc2a85ed1b876c2a85ecdb85ec2a85eb09954c0a153b2a856bfb04d
+d0c074bfb04db0a83fa1a73ca1a73ca1a73cb1af4db2a856b2a856a0a03a8c9853
+8c98538b903387872c7787468b903386874a7b90348b903376872d778746656c26
+49601f3f4e1e3f4e1e383c23333522304321657c445e74296b852c576b335e7429
+697c2b5f7b2a4b681e5e7429547428778746576a1f47581f56603aafb09eb1b069
+4e4425383c232b33223f4e1e68752b5e74295474284b681e697c2b4b681e4b681e
+5e742947581f49601f6b852c7b90347d9736697c2b6b852c68752b47581f576a1f
+49601f5f7b2a47581f4b681e6b852c55582447581f3f4e1e757b2d4c5026556024
+76872d76872d7b903476872d576a1f383c232b33223335223a44233a44233f4e1e
+4b681e576a1f5e7429656c2676872d87872c757b2d656c2668752b757b2d8b9033
+76872dc1b0649fa05687872c76872d8b90337b9034757b2d8b903376872d9f9035
+766e2d55602468752b3f4e1e342d1f383c23383c2349601f576a1f576a1f87872c
+8c98359f98358c98359f98358c983568752b766e2d9788349f983587872c766e2d
+574f26333522443623443623604f2a4e3d22443623333522342d1f342d1f383c23
+3335223a4423557f225e7429576a1f3f4e1e576a1f556024576a1f41671b5f7b2a
+5e7429697c2b76872d576a1f5e74298c98355560243f4e1e576b335e74296b852c
+76872d76872d757b2d68752b576a1f3f4e1e333522272c1f3f4e1e304321342d1f
+24261c24261c272c1f24261c342d1f24261c24261c24261c24261c272c1f333522
+3043213a4423656c263f4e1e3f4e1e47581f4b681e49601f4b681e6b852c656c26
+3a44233335222f3c223f4e1e4e44254e3d224e3d224c50263335223335224c5026
+656c26556024576a1f576a1f556024697c2b7787468b90336b852c6b852c6b852c
+5e74296b852c49601f697c2b6b852c576a1f4b681e4b681e49601f5e74295f7b2a
+697c2b8c98357b90345474285474286b852c8e9f3b9fa0569e98538b9033576a1f
+757b2d9fa056576a1f697c2b86874a8c9853757b2d697c2b68752b9f90359f9035
+333642373e433335223a4423576b335474433d573b3043213043213c58225f7b2a
+6b852c60832a6b852c6b852c5474284b681e4b69337787464b681e3c5822497323
+567f3a3d5f255f7b2a5e74292e3c44262e352f3c222f3c22333522304321496032
+576b334b693347581f3043213a44233c58223d573b3c582247581f4b6933657c44
+576b334b681e3d5f25344d1e344d1e3d5f256b85458ea0597c90537b90346b852c
+697c2b7c90536b852c7f97537b90346b852c76872d697c2b47581f4b681e656c26
+5e74294b69336b852c7b90346183456b852c49603249603249601f47581f2b3322
+576a1f3a4423383c23757b2d697c2b5f7b2a3a4423383c233f4e1e2b33222b3322
+2b33222f3c222f3c221e241b272c1f1e241b272c1f272c1f272c1f272c1f272c1f
+2f3c22304321354c312f3c2230432141671b49732341671b2f3c222f3c222f3c22
+272c1f24261c272c1f272c1f272c1f24261c342d1f262e35272c1f272c1f2b3322
+3a442366592c978834b1a03d9f98359f9835c0a845beb751c0a845c0a845bfb04d
+ccb169d1b876dcc17fd1b876cdb85edcc17fdcc17fd1b876dcc17fdcc17fdcc17f
+d0c074d0c074cdb85eb1a03d9f98357b90348b903387872c76872d576a1f576a1f
+697c2b76872d8c9835757b2d5e7429576a1f49601f3a44235558248b9033b2a053
+c1b064c1b064bfb04dc0a845ae993dccb169c0a845c0a845c0a845ccb169c0a845
+b2a053b1a03dc0a153c1b064d1b876c3c17ad1b876d1b876d1b876d1b876c1b064
+b1af4db0a83fb0a83fb0a83fa0a03ab1af4db1b069b1b069b2a856b1af4d8c9853
+76872d8b9033778746767b47757b2d757b2d77874676872d778746757b2d556024
+576b335e74295f7b2a3043213335223f4e1e657c4449601f5f7b2a576a1f5e7429
+68752b47583249601f697c2b576a1f49601f55602476872d5560248b9055c2b868
+77874655602447581f5e7429697c2b6b852c576a1f4b681e76872d6b852c697c2b
+576a1f47581f47581f708f315e74295e74296b852c5e7429576a1f656c2668752b
+304321697c2b68752b576a1f576a1f3a44233f4e1e5560245e7429304321697c2b
+656c26697c2b697c2b55602449601f556024383c23383c234c50262b33223a4423
+576a1f7b90346b852c6b852c757b2d7b90348c98358b903376872d76872d8e9f3b
+8c98539fa0568b903387872c76872d8b90337b903476872d8b90337b903487872c
+87872c555824574f26272c1f342d1f2b33223335225560245560243a4423556024
+757b2d8c9835a0a03a9f98358b90338b9033656c2687872c9f9035757b2d555824
+443623342d1f4436234e3d224436234e3d224e4425443623443623333522333522
+333522556024708f3176872d656c265560243a442347581f5f7b2a60832a697c2b
+4b681e708f3154742860832a6b852c6b852c76872d5e74293f4e1e49601f556024
+697c2b7b90346b852c697c2b5f7b2a6b852c47581f3f4e1e344d1e47581f333522
+342d1f24261c272c1f272c1f272c1f24261c272c1f3335222f3c223f4e1e272c1f
+47581f47581f576a1f5560245560243f4e1e697c2b4b681e757b2d656c26344d1e
+3f4e1e3f4e1e555824697c2b3f4e1e3f4e1e342d1f342d1f4436234e4425766e2d
+766e2d4e44253a44233f4e1e47581f5e74296b852c5f7b2a5f7b2a68752b68752b
+6b852c697c2b576a1f68752b7b9034576b333c582249601f3f4e1e49601f41671b
+576a1f76872d76872d3f4e1e5f7b2a708f3176872d9e985368752b656c26708f31
+49601f697c2b5f7b2a4b681e87872c9fa056757b2d5e74298b9033ab915868752b
+333522373e433a4423354c313f4e1e4b6933344d1e354c3130444d3043214b6933
+708f3160832a6b852c6f8f5271973260832a4b693354742849601f4960326b852c
+567f3a3d5f25576b333c58222b33222b3322262e353335223043213d5f253d5f25
+3c58223d5f255f7b2a576a1f557f225e74293c582249601f5e742947581f4b681e
+4b681e3d5f25496032354c313043213a44233f4e1e666b3b49601f5f7b2a8c9853
+76872d7d973680a03b91af497b903476872d6b852c6f8f527b90347c9053697c2b
+778746697c2b7787468c98538ea059576b3349601f697c2b5474284758322b3322
+4960323a4423576b3356603a3f4e1e5558242f3c223a44233a44232f3c222f3c22
+2b33222b33222f3c222b33222b3322272c1f272c1f24261c24261c24261c2b3322
+2f3c223043212f3c222f3c22344d1e49601f3c582249732341671b344d1e2f3c22
+354c31383c2324261c342d1f262e35272c1f24261c342d1f3335222f3c223a4423
+574f26887b2cae993dbfb04dbfb04dcdb85ecdb85ebfb04dc0a153c0a845ccb169
+ccb169dcc17fdcc17fd1b876cdb85ed1b876dcc17fe3cc97d0c074cdb85ed0c074
+dcc17fe0c492d4cb83b1af4d8c983576872d6b852c5e7429757b2d697c2b6b852c
+757b2d76872d76872d697c2b68752b576a1f2f3c223a4423978834957c2fb09954
+b09954ccb169b1a03d978834ae993dc0a845ccb169ccb169ccb169d1b876ccb169
+ccb169c2a85eccb169d1b876e0c492e0c492dcc17fd1b876d1b876ccb169c1b064
+c0a845c0a845c1b0649e9853b2a053c2b8689fa8579fa8579fa857a0a03a8ea059
+6b852c656c26656c2668752b68752b86874a8b9033757b2d68752b5e7429576a1f
+576b3349601f5e7429576a1f344d1e47581f697c2b49601f5f7b2a5e74297b9034
+5e742947581f47581f76872d7b9034697c2b778746576a1f576b33627444d1b890
+867c4c68752b719732708f31697c2b76872d6b852c47581f5f7b2a68752b76872d
+697c2b6b852c76872d6b852c697c2b757b2d6b852c68752b3f4e1e576a1f49601f
+55582476872d68752b47581f4c50264c5026656c266b852c5e74296b852c6b852c
+5e742949601f656c263043213335223f4e1e2b3322342d1f3a44233335224c5026
+697c2b5e74295f7b2a697c2b5f7b2a76872d6b852c76872d76872d76872d697c2b
+8ea0599f983576872d68752b68752b697c2b757b2d697c2b76872d8b90338c9835
+87872c656c264e4425333522272c1f342d1f342d1f383c23333522333522576a1f
+5558243a4423574f26555824555824757b2d66592c4e4425574f264e3d22342d1f
+342d1f4e3d22443623604f2a443623342d1f574f26272c1f44362344362324261c
+33352255602468752b4c502633352268752b55582455602476872d6b852c60832a
+6b852c6b852c697c2b5560244b681e576a1f76872d5e74295e74295f7b2a5e7429
+5e74296b852c697c2b557f226b852c5f7b2a5f7b2a576a1f344d1e333522342d1f
+272c1f24261c272c1f342d1f342d1f24261c272c1f47581f4c50263f4e1e2f3c22
+2f3c224c5026576a1f3f4e1e5560243f4e1e5474285f7b2a576a1f304321383c23
+2f3c223335223a442355582468752b555824383c234e4425556024766427766427
+574f26333522383c233a4423576a1f47581f68752b5e74296b852c7b90344b681e
+68752b6b852c68752b68752b757b2d4b681e47581f47581f3c582249601f41671b
+547428697c2b6b852c47581f49601f697c2b6b852ca0a03a757b2d576a1f697c2b
+6b852c697c2b697c2b68752b7b9034a0a03a76872d76872d9f915487872c656c26
+2f3c224758325658384b6933576b334b69334b693347581f304321344d1e496032
+5e74296b85455e7429576a1f708f314b681e4b69333c5822475832344d1e5e7429
+5f7b2a4b69335560244b69333043212b3322262e352b3322354c315f7b2a497323
+49601f5f7b2a60832a5e74295f7b2a5e7429576a1f6b852c5e7429576a1f3d5f25
+4b69333f4e32383c23262e352b33223335222b33222b3322333522576b3376872d
+8c9853a1af4e7c905368752b697c2b7d97366b852c576b335e742961834560832a
+697c2b6b852c4b681e68752b8ea059656c2649601f7787463f4e1e383c23383c23
+304321272c1f3a442333352247581f3c58223a44232b3322272c1f272c1f272c1f
+272c1f2b3322272c1f272c1f272c1f262e352b33222b3322272c1f272c1f4e4425
+555824757b2d4c50262b33222b33223335222f3c2249601f4b681e2f3c222f3c22
+344d1e2b3322272c1f2b33222b33223a44232b3322383c233a442347581f555824
+887b2c9f9035c0a845cdb85ecdb85ecdb85ecdb85ec0a845cdb85eccb169ccb169
+dcc17fdcc17fdcc17fdcc17fe0c492e3cc97e0c492e3cc97d0c074b2a856a1af4e
+b0b86ccdb85ed0c074d0c074b0a83f656c2647581f3f4e1e5560243f4e1e2f3c22
+383c23383c233a44233a44232b3322333522333522555824978834957c2fb09954
+a48954957c2f978834ae993dcdb85ebfb04dc0a153c1b064d1b876d1b876d1b876
+dcc17fccb169dcc17fd1b876dcc17fd1b890d1b890d1b890e0c492d1b876d1b890
+d0c074d1b876c1b0649e9853b2a856b1b0699f91548b90339fa056a0a03a8c9853
+7b9034697c2b7b9034757b2d87872c8b90558c985376872d757b2d697c2b576a1f
+55602447581f697c2b68752b6b852c76872d8c98357f97537d9736697c2b778746
+697c2b697c2b47581f697c2b5f7b2a6b852c8b9033576b3347581f627444c0b197
+c4a979757b2d7b90345e742949601f697c2b708f3176872d708f3177874676872d
+7b903476872d697c2b68752b576a1f757b2d576a1f576a1f5558243f4e1e3f4e1e
+68752b576b33697c2b547428657c445e742968752b76872d697c2b6b852c697c2b
+576a1f49601f3f4e1e3a4423333522272c1f272c1f272c1f342d1f2b332247581f
+5558243a4423344d1e4b681e5e742976872d697c2b7d97368c9835557f225e7429
+7b90348b9033576a1f576a1f576a1f5f7b2a6b852c76872d76872d7d97367b9034
+7b90348b9033697c2b3a4423272c1f272c1f24261c24261c24261c342d1f3f4e1e
+55582433352224261c342d1f24261c342d1f4e3d22342d1f342d1f24261c24261c
+4e3d22604f2a604f2a4e3d22342d1f342d1f342d1f24261c383c23333522342d1f
+3335223f4e1e3f4e1e342d1f2b3322656c2668752b5e742976872d708f31697c2b
+5e7429697c2b697c2b383c232b33223a4423697c2b6b852c6b852c576a1f697c2b
+5e7429697c2b697c2b5e7429697c2b576a1f5e74293a4423342d1f272c1f272c1f
+342d1f342d1f2b33224c50263a442324261c24261c342d1f342d1f272c1f342d1f
+2b3322383c234c502647581f5558243a44235474286b852c3f4e1e2b3322383c23
+2b33222b33222b33223335222b3322333522383c234e3d22443623574f263a4423
+4436233335223a44233a44233f4e1e5e74296b852c5e74294b681e5e7429576a1f
+576a1f547428697c2b76872d76872d6b852c41671b344d1e3f4e1e3043213d5f25
+5e7429697c2b5f7b2a47581f2f3c2249601f7b90348b903386874a576a1f3d5f25
+49601f6b852c697c2b697c2b7b90348c9835697c2b8c9853757b2d576a1f3d5f25
+3944463f4e324758324b6933576a1f5f7b2a6f8f52697c2b3d5f253c5822475832
+4b69337b90347d97367787466b852c6183453c5822344d1e344d593043213f4e32
+5f7b2a497323547428547443618345344d1e2b3322262e3533352249732341671b
+4960324b693349601f49601f576a1f5e74293d5f2549601f6b852c7c9053697c2b
+496032383c23383c23342d1f2b33222a3438272c1f3043213f4e3247581f6b852c
+87872c9fa056697c2b55602468752b8b90556b852c3f4e1e576b335e7429576a1f
+68752b6b852c3f4e1e666b3b86874a7787464c502647581f2f3c222b33222b3322
+3f4e1e547428576a1f697c2b5e742947581f4b69333f4e1e3043212b33222b3322
+2b3322272c1f24261c24261c272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+3f4e32656c26344d1e2b3322272c1f342d1f272c1f3f4e1e47581f3f4e1e2f3c22
+2b33222b33222f3c22383c233f4e1e4c50264c5026574f26766e2d656c2684712f
+c0a845bfb04dcdb85ebfb04dcdb85ecdb85eccb169dcc17fcdb85eccb169ccb169
+ccb169c2a85edcc17fe0c492dcc17fe0c492e0c492dcc17fe0c492c2b868a0a03a
+a1a73ca1a73ca0a03a8c98358c983587872c576a1f3f4e1e576a1f3f4e1e3a4423
+3335222f3c223335222b3322383c23576a1f656c268b90339f98359f9835766e2d
+66592c9f9154c2a85edcc17fd0c074d0c074b2a053a48a3bccb169dcc17fe0c492
+dcc17fe0c492e0c492e0c492dcc17fdcc17fe0c492d1b890dcc17fe0c492e0c492
+d8c291d8c291d0c074d1b876c2b868b2a8569e98538b90559f983586874a76872d
+8c98358b90558b90337787468b9033a0a03a86874a778746697c2b76872d76872d
+76872d7b90348c983576872d697c2b76872d697c2b7b903477874668752b6b852c
+697c2b49601f3f4e1e5e742976872d697c2b68752b576a1f344d1e565838aea886
+c0b197867c4c757b2d4b681e3c5822576a1f8c98538e9f3b9fa0569fa8578b9033
+76872d76872d757b2d47581f86874a8ea05976872d6b852c697c2b47581f767b47
+6b852c47581f576a1f576a1f3f4e1e556024344d1e656c26697c2b5e7429576a1f
+557f223c58222f3c22272c1f272c1f24261c24261c3335222f3c224e44254c5026
+3f4e1e3a44233a44233f4e1e576a1f697c2b7d97368c98358c98356b852c6b852c
+4b681e6b852c47581f49601f5e742976872d76872d6b852c697c2b7b90346b852c
+7b90348c983576872d55602424261c24261c24261c24261c24261c272c1f24261c
+272c1f24261c272c1f272c1f24261c342d1f342d1f1e241b24261c24261c24261c
+342d1f66592c84712f4436233335224e4425272c1f342d1f3a4423556024576a1f
+3f4e1e656c264c50262b332249601f6b852c68752b47581f47581f47581f383c23
+3a44235e74295e742949601f3043212b332247581f6b852c697c2b5e74295e7429
+4b681e576a1f547428697c2b60832a47581f4c5026342d1f24261c3335223a4423
+3335223335223a4423555824383c23272c1f24261c272c1f272c1f333522342d1f
+272c1f383c233f4e1e4c5026383c23383c236b852c68752b3a44232f3c222b3322
+24261c272c1f272c1f342d1f272c1f342d1f24261c333522333522443623383c23
+333522272c1f342d1f272c1f344d1e5e742949601f5e74295f7b2a49601f576a1f
+49601f49601f4b681e49601f6b852c6b852c576a1f576a1f5e742947581f3f4e1e
+4973235e74295e742976872d47581f576a1f697c2b7b90348b903360832a547428
+576a1f5e7429697c2b656c266b852c7b903476872d757b2d5560245f7b2a576a1f
+383c233f4e322f3c224960324b6933656c265f7b2a5e7429576b333c5822344d1e
+3d573b60832a7d97367787466b852c7d9736567f3a344d1e3c58223f4e1e3f4e32
+6b852c60832a47583247581f576b333a4423262e352b3322262e353d5f254b6933
+3f4e1e3c58223d5f25557f22576a1f576a1f49601f576b334c5026576a1f68752b
+3f4e1e2f3c222f3c222f3c223043213043213043214b69335f7b2a6b852c76872d
+757b2d86874a76872d68752b87872c8b90338ea0597b9034697c2b496032496032
+697c2b7b9034354c315e74297b90345e7429576b332f3c223043212f3c22333522
+49601f5f7b2a697c2b76872d757b2d697c2b76872d4b681e49601f576b3347581f
+3d5f253a44232b33222f3c222f3c22344d1e2f3c222b3322272c1f342d1f2b3322
+383c23272c1f24261c272c1f272c1f272c1f272c1f383c2347581f2f3c222f3c22
+3f4e1e3f4e1e5560243f4e1e3a4423555824766e2d87872c957c2f9f9035b0a83f
+bfb04dbfb04dae993da0a03ab1a03dc0a845ccb169dcc17fd1b876dcc17fe0c492
+dcc17fccb169dcc17fe3cc97e0c492e0c492e3cc97e3cc97e3cc97e3cc97d0c074
+b0b86ca1a73c7b90347b90348c9835a1a73c8e9f3b8c9835708f316b852c76872d
+76872d6b852c4b681e5f7b2a708f317b90348b903376872d68752b656c265e7429
+8c9835b2a856ada17fd1b890c4a979ccb1699e985384712fb09954dcc17fdcc17f
+ccb169e0c492e3cc97e0c492e0c492dcc17fccb169ccb169ccb169e0c492ccb169
+d1b890d1b890d8c291c4a979c1b064c1b064c2b8689e98538b90339e98537c9053
+7b90348c98358c98538c98357c90538c98538b903376872d5e7429576a1f7d9736
+76872d76872d7b903476872d76872d8c985376872d68752b576b33556024576b33
+5e7429496032344d1e6b852c576a1f76872d757b2d576a1f576a1f576a1f9d9981
+dcd6d69fa056576a1f49601f3c58225f7b2a656c2676872d76872d76872d68752b
+757b2d576a1f68752b5e74297787468b903376872d7b903476872d8c98538b9055
+76872d4c502647581f54742849601f576a1f49603249601f697c2b4b681e3f4e1e
+556024383c23383c23342d1f272c1f333522333522383c232f3c223043213f4e1e
+656c26576a1f576a1f3f4e1e3a4423656c267b90347d97367b9034576a1f656c26
+49601f6b852c576a1f576a1f6b852c76872d6b852c4c50264c502655602449601f
+55602447581f555824443623342d1f333522342d1f342d1f24261c24261c24261c
+24261c24261c24261c342d1f2b332244362324261c24261c24261c24261c24261c
+342d1f95885c847144342d1f3335223a44233f4e1e344d1e576a1f68752b697c2b
+576a1f697c2b47581f4c502676872d697c2b68752b5e74296b852c49601f47581f
+697c2b5f7b2a5e74294b681e2b33222f3c22344d1e697c2b697c2b47581f4b681e
+49601f576a1f5f7b2a5e742968752b3335224e4425333522342d1f333522304321
+333522333522383c23383c23342d1f24261c342d1f24261c24261c272c1f342d1f
+272c1f333522383c23383c233335223335223f4e1e383c23342d1f342d1f2b3322
+342d1f342d1f24261c342d1f342d1f24261c24261c272c1f272c1f2b3322272c1f
+272c1f24261c272c1f272c1f344d1e547428576b335f7b2a576a1f576a1f3f4e1e
+47581f344d1e697c2b49601f3d5f2554742847581f76872d8c98353a44233f4e1e
+4b681e576a1f4b6933556024576a1f49601f576a1f6b852c8c983576872d6b852c
+60832a6b852c697c2b5e7429697c2b7b90347b90345e74295e7429547428697c2b
+3f4e323944463a44235e74296274445e74295474285474285474284973236b8545
+6b852c6b852c80a03b7d973676872d7d97367c9053557f2247581f49603268752b
+77874660832a344d1e2b33223335222b33222b33222e3c4447581f60832a496032
+354c312f3c224758325e7429697c2b5f7b2a6b852c656c264960323f4e322f3c22
+3f4e324758323d573b4960325560243f4e32547443778746697c2b8c98538e9f3b
+8ea0598ea0598e9f3b8b90339fa857a0a03a8b90337b9034697c2b47581f3f4e1e
+47583247581f383c2368752b76872d56603a68752b4b69334b681e3a44232f3c22
+697c2b708f3176872d7b903476872d8b90338c983576872d757b2d3f4e1e49601f
+47581f4b681e3f4e1e49601f5e7429656c2649601f3c5822344d1e344d1e304321
+3f4e1e2f3c22342d1f24261c2b3322272c1f383c2349601f6b852c757b2d76872d
+7b9034576a1f3a4423656c26766e2d9f9035b0a83fbfb04dc0a845c0a845beb751
+bfb04db1a03d8e9f3b8b90338b90339f9035c0a845c0a845ccb169e0c492dcc17f
+d1b876dcc17fdcc17fe3cc97e0c492e3cc97e3cc97d8c291e3cc97e0c492d4cb83
+d4cb83a0a03a6b852c47581f576a1f76872d8b90338c9835697c2b68752b47581f
+3a442347581f5e7429576a1f576a1f3f4e1e76872d76872d656c2676872d76872d
+7b90347b90349e9853b2a856aea886c1b064ad903d957c2fad903de0c492e0c492
+e0c492e0c492d1b890decab4e3cc97ccb169c2a85ec4a979d1b890e0c492d1b890
+e3cc97dcc17fd1b876c1b064c1b064b2a8569fa0568b903386874a76872d8c9853
+697c2b778746697c2b6b852c8b90338c98357b90347787463f4e3247581f757b2d
+576a1f49601f757b2d5e7429576a1f6b8545757b2d627444656c26556024475832
+555824342d1f383c2368752b697c2b5e7429576a1f49601f576a1f496032666033
+cfc6b89f915468752b4b681e576a1f68752b68752b68752b697c2b5e7429656c26
+778746666b3b757b2d7b903476872d7b90345f7b2a68752b778746767b474c5026
+657c447787463f4e1e4e4425555824778746666b3b68752b697c2b3f4e1e2b3322
+3f4e1e4c50263f4e1e47581f272c1f342d1f272c1f272c1f2f3c224c502647581f
+576a1f556024556024383c23272c1f3f4e1e7d97368c983587872c76872d5e7429
+3f4e1e3f4e1e5e7429576a1f68752b76872d5560243a4423383c23383c23333522
+272c1f383c234c5026383c233f4e1e656c263a4423383c23342d1f24261c342d1f
+24261c24261c333522574f264e3d22342d1f24261c24261c24261c342d1f342d1f
+342d1f74643e604f2a342d1f4c50263f4e1e47581f697c2b6b852c697c2b697c2b
+5e7429576a1f68752b5e7429557f225e74296b852c6b852c697c2b6b852c6b852c
+6b852c5e7429556024333522272c1f3335223f4e1e68752b68752b4c5026383c23
+2b33222b33223a442347581f3f4e1e342d1f333522342d1f24261c333522272c1f
+272c1f333522383c23342d1f24261c272c1f333522342d1f272c1f2f3c223f4e1e
+272c1f272c1f272c1f2b3322333522443623443623333522342d1f342d1f342d1f
+4e4425342d1f342d1f4e3d22443623342d1f342d1f272c1f2b3322342d1f272c1f
+272c1f24261c272c1f272c1f2b3322344d1e3c58225474285e742960832a49601f
+49601f55602460832a47581f3f4e1e4b681e556024656c265558243a44233f4e1e
+3f4e1e47581f47581f55602468752b576a1f4c502647581f68752b76872d49601f
+54742876872d6b852c5e74296b852c757b2d5e742949601f3c58225f7b2a656c26
+2b33222a3438383c2356583847581f576b33576b336b8545576b336b852c5f7b2a
+567f3a708f317b90348ea0598c9835778746697c2b6b8545657c44576b33767b47
+757b2d7c905354742841671b3043212b33222f3c2249601f7f975360832a496032
+3043213a44233f4e32576b3386874a666b3b4b693356603a3a44232b33222f3c22
+3043214758322f3c22354c314960323f4e1e3c5822576b3347581f5560247c9053
+7d97367b90348c98538b90338c9853a1a73c8c98357b9034576b33657c443f4e32
+3a44233a44232a3438475832576b332b33222f3c22576a1f4b69333f4e1e49601f
+576a1f697c2b5e74295e74295e74297b90348c983576872d656c2668752b8e9f3b
+76872d697c2b68752b7b90348e9f3b8c9835708f314b681e576a1f5560245e7429
+697c2b5f7b2a3f4e1e3a4423556024304321556024757b2d8b9033beb751a1a73c
+8e9f3b8b9033757b2da0a03ab1a03db0a83fcdb85ebeb751bfb04dc0a845bfb04d
+b0a83fa1a73ca0a03a7b903476872d766e2d84712fc0a153ccb169dcc17fccb169
+dcc17fe0c492dcc17fe0c492e0c492e3cc97decab4decab4e3cc97e0c492c4bf65
+9fa0569f9835697c2b576a1f4c5026576a1f757b2d697c2b6b852c7b9034555824
+3335223335223a442347581f2f3c22383c233a44233f4e1e656c26766e2d576a1f
+576a1f87872c87872c978834d8c291e0c492c4a979c2a85ed1b890e0c492e0c492
+dcc17fe0c492d1b890dcc17fe0c492ccb169ccb169dcc17fccb169dcc17fd1b890
+e0c492d1b876c1b064b2a053d1b890d1b8769e98539fa0568c98537b9034697c2b
+76872d76872d757b2d7787468b90558b903376872d576a1f556024697c2b7d9736
+5e742960832a76872d697c2b697c2b68752b4c50263f4e1e49603247581f2b3322
+2f3c22333522383c234c5026576a1f4960323a442347581f47581f3043214c5026
+87886d9f915468752b76872d5e742968752b6b852c7b90346b852c47581f68752b
+76872d8c98538c98357d97367197327b903477874668752b576b333a4423556024
+6b85458c9853697c2b4b693355602468752b47581f383c233335222b3322272c1f
+333522556024383c2333352224261c24261c24261c383c235558243f4e1e555824
+556024576a1f656c26576a1f383c232f3c22576a1f68752b767b479e985368752b
+3f4e1e3a44235560244c5026555824656c265560245558242f3c2233352224261c
+272c1f2b33224e44254c50263f4e1e68752b5560244c5026333522342d1f3a4423
+33352244362355582466592c4e3d224e3d22342d1f24261c342d1f443623342d1f
+4436234e3d2244362333352266592c3f4e1e5e74296b852c697c2b576a1f576a1f
+47581f5f7b2a576a1f576a1f5474286b852c76872d6b852c697c2b76872d76872d
+697c2b49601f3f4e1e383c23333522333522304321576b333a4423342d1f272c1f
+272c1f272c1f2b33222b3322272c1f24261c272c1f24261c24261c1c1e19342d1f
+24261c24261c333522383c23342d1f342d1f4e44252b33222b33222f3c223a4423
+333522342d1f333522272c1f272c1f342d1f342d1f272c1f272c1f342d1f272c1f
+2b33223335224436234436234e3d22342d1f342d1f3335223a4423666b3b666b3b
+373e434436232f3c222f3c223f4e1e4b681e47581f344d1e49601f576a1f576a1f
+3d5f2549601f5f7b2a576a1f344d1e2f3c225560245560243a44233f4e1e383c23
+5e74297d973676872d7b903455602447581f656c26556024556024576a1f4b681e
+4b681e5560245e7429576a1f5f7b2a656c265e742947581f3c582260832a68752b
+3a44232a34384e5043576b33666b3b68752b7c9053819f595e74294b6933304321
+3f4e325e74297c9053666b3b4b6933778746697c2b75704d47581f475832576a1f
+6b852c7f97534973234b69335474437787467c90538c98357c9053344d1e475832
+496032657c447787468c985386874a556024475832666b3b576b3356603a56603a
+56603a3a4423383c2347583256603a383c234c50265658383a4423556024778746
+8e9f3b7c90537d97368c98357d97368c9835a1a73c8c9835778746666b3b2f3c22
+2f3c223f4e323335223f4e1e697c2b4758326274446183455f7b2a496032475832
+3a4423697c2b6b852c55582455582468752b76872d76872d6b852c76872d8c9853
+8b905586874a9fa0569fa05676872d556024656c26576a1f68752b5560243f4e1e
+3f4e1e5e7429576a1f49601f5e7429576a1f8b90338e9f3b8e9f3bb1af4da0a03a
+a1a73ca0a03a9f9835aeb84eb1af4db1af4db0a83fc0a153bfb04db1a03da1a73c
+b0a83f9f98358c98358b903387872c87872c957c2fc0a845ccb169d1b876ccb169
+e0c492dcc17fccb169dcc17fdcc17fe3cc97decab4e3cc97d8c291c0b8a6b0a83f
+76872d8c98355e74293f4e1e47581f697c2b47581f2f3c2255582476872d576a1f
+3f4e1e2f3c223f4e1e576a1f4b681e383c233335223335223a4423576a1f757b2d
+87872c8b9033b2a053d8c291d1b890dcc17fd1b876d1b890e0c492d1b890e0c492
+e0c492ccb169d1b876ccb169d1b876ccb169c0a845d1b876ccb169d1b876d1b876
+dcc17fc2a85ec0a153d1b876d0c074bfb04d9e98538c98538c98358b90338c9835
+7b903486874a7b903476872d7b90347c90536b852c7787467787467b90348c9835
+5e74296b852c6b852c5e74296b852c576a1f47581f33352247581f5e7429383c23
+2f3c223f4e1e576a1f49732360832a697c2b3f4e1e3f4e1e54742841671b3c5822
+656c2676872d76872d7b903476872d757b2d76872d8c983576872d697c2b697c2b
+8c98358e9f3b7f97537d973676872d656c26556024576a1f4b681e2f3c225e7429
+697c2b68752b618345708f31697c2b8c98357b90343f4e1e2f3c2233352224261c
+2b3322333522272c1f33352224261c272c1f4e44254e4425383c234e4425304321
+383c233f4e1e656c26766e2d3f4e1e342d1f342d1f3f4e32867c4c9a917886874a
+6660334c50264c50264e4425574f26443623383c23333522342d1f24261c24261c
+24261c3335224c5026556024656c26697c2b5560245560243f4e1e383c23556024
+656c26766e2d887b2c604f2a604f2a44362324261c24261c24261c342d1f342d1f
+443623443623342d1f342d1f55582455582447581f555824574f26383c23342d1f
+49601f697c2b4c50263f4e1e656c2647581f656c26556024576a1f6b852c68752b
+4c5026333522272c1f333522272c1f333642383c23383c232b3322272c1f272c1f
+2b3322342d1f24261c24261c24261c24261c272c1f2b33222b3322333522383c23
+383c23342d1f3f4e1e5560244c5026574f26666033383c23342d1f383c234c5026
+333522333522342d1f272c1f272c1f272c1f272c1f272c1f342d1f342d1f333522
+342d1f3335224e442544362333352224261c3335224e442556583886874a87886d
+4e50433a44233a442356603a6b8545576b3349601f3c582247581f5474285e7429
+4b681e49601f5e7429576a1f3a44233a4423656c266b852c5e742947581f3a4423
+3a4423697c2b76872d8c9835757b2d576a1f49601f49601f5e74296b852c576a1f
+5e74294b681e49601f54742876872d7b90347b9034576a1f3d5f25697c2b76872d
+354c312f3c224c502656603a5560243f4e32666033576b33576b333f4e32373e43
+33352256603a778746666b3b666b3b7787464e50433335222f3c223f4e32757c71
+8b90557b90344960324960323d5f25576b337c90537787463f4e1e2b33223f4e32
+383c234c5026574f2656603a5f61564e50432f3c223a44234758324c50263f4e1e
+565838383c233335225658384c50263336422b3322383c23383c23666b3b95885c
+b0a83f8c985392a7599fa0568c98358c98359e985376872d68752b3f4e32383c23
+2f3c224758324e50433a4423666b3b627444767b47576b3347581f3a44233a4423
+383c2368752b5560243f4e1e55602476872d666b3b4c50264c50264c5026555824
+555824766e2d86874a656c26383c233335224e44253a442366592c86874a766e2d
+76872d757b2d4c50264c50265560245560248c98358ea83e8e9f3ba1a73ca0a03a
+a1a73ca1a73cbfb04daeb84eb1af4d9f9835b1a03db1a03dc0a845b1a03da0a03a
+aeb84ea0a03a9f98359f9835a0a03a9f9835bfb04dd0c074cdb85eccb169dcc17f
+e0c492e0c492d1b890d1b890d1b890e0c492dcd6d6e0dfc6e3cc97d4cb83aeb84e
+76872d76872d68752b49601f576a1f5560245560245e74297b9034697c2b5e7429
+60832a5560245e742968752b3f4e1e3f4e1e556024656c2687872ca1a73ca1a73c
+9f9835b1af4dd0c074d0c074d1b876d1b876d1b876ccb169d1b876d1b890d1b876
+d1b876d1b876d1b876ccb169c2a85ec1b064ccb169c2a85eccb169cdb85ed1b876
+ccb169d1b876d0c074e0c492c1b064c1b0649fa0569e98537b90347c90538b9033
+7b903486874a68752b757b2d7b90348c98536b852c757b2d7b90346b852c68752b
+576a1f49601f5f7b2a757b2d757b2d576a1f344d1e2f3c22344d1e47581f2f3c22
+3f4e1e3f4e1e6b852c697c2b697c2b5f7b2a3d5f2547581f49601f49601f5f7b2a
+60832a68752b757b2da1af4e8e9f3b8b9033757b2d656c2677874668752b757b2d
+7787468b90558c98537d973686874a68752b556024778746576a1f3d5f255e7429
+7b90345e74295f7b2a557f22697c2b4b681e6b85455e742955602433352224261c
+24261c272c1f342d1f24261c342d1f2b332247581f5560243f4e1e4e4425383c23
+3335224e44254c50264c50264e44254e4425383c23342d1f4e4425857d6775704d
+66592c383c23383c23333522383c23342d1f333522272c1f272c1f24261c24261c
+272c1f272c1f2f3c22576a1f68752b76872d656c2668752b49601f4c50263f4e1e
+656c268b905574643e66592c4e3d22342d1f24261c24261c342d1f24261c342d1f
+4e3d224e3d22342d1f33352247581f4e4425272c1f342d1f4e3d22443623333522
+3043213f4e1e443623272c1f272c1f272c1f2b3322333522342d1f383c232b3322
+272c1f272c1f24261c272c1f24261c342d1f24261c24261c24261c272c1f272c1f
+333522272c1f24261c342d1f24261c342d1f2f3c2241671b41671b4b681e547428
+49601f49601f47581f576a1f576a1f5560244e44253a4423383c234c5026555824
+333522333522333522342d1f2b3322272c1f342d1f333522333522342d1f342d1f
+443623333522333522272c1f24261c342d1f574f265f6156857d67857d6786874a
+757c7175704d54605f8c9853767b47496032666b3b3f4e1e3c5822576b335e7429
+47581f3c582249601f5e74293043212b33223f4e1e697c2b6b852c708f3176872d
+2f3c22576a1f697c2b697c2b68752b5558243a4423344d1e5e742968752b68752b
+6b852c54742849601f3c58224973238c98357b903468752b3f4e1e5e7429656c26
+3944462e3c443f4e3255582456603a383c2356603a555824496032354c312f3c22
+2f3c2266603368752b56603a6660334c50262f3c22333642342d1f3335224e5043
+3a4423666b3b4960324758324758323f4e32576b33657c443a4423262e35342d1f
+262e35272c1f333522333522333522373e43342d1f272c1f24261c272c1f4c5026
+666b3b4e4425666b3b86874a75704d383c233335223a442366603395885cb2a053
+b2a0539f9035a0a03ab1a03d9e98539788348b90339e9853757b2d556024576b33
+5e74295558243f4e323a44233f4e32383c23333522262e35333522383c23272c1f
+39444686874a68752b56603a4e4425565838383c23342d1f272c1f272c1f333522
+5560248ea0597b903487872c767b474758322f3c22383c234c5026666b3b555824
+66592c383c23333522383c233a44235560248b90338b9033a1a73ca0a03aa0a03a
+9f9835a0a03ab0a83fb1af4db1af4db1a03da1a73cbeb751a0a03a9f9835a0a03a
+a0a03a8b90338e9f3ba1a73cb1af4db1af4dc0a845b1a03dae993da48a3bb09954
+d1b876e0c492e0c492e0c492e0c492e3cc97decab4e0c492d1b890c2b868b0a83f
+8e9f3b8c983576872d76872d6b852c7d97368e9f3b8ea83e6b852c576a1f5e7429
+47581f3a44233f4e1e55582476872d76872d8e9f3ba1a73ca1af4eb0a83fa0a03a
+b0a83fd0c074c2b868ccb169c4bf65cdb85ecdb85ec1b064ccb169d1b876cdb85e
+d0c074d0c074c2b868c1b064bfb04dbeb751bfb04dc1b064bfb04dccb169d1b876
+d1b876dcc17fdcc17fc3c17accb169b1af4da1a73c8c9835697c2b697c2b757b2d
+757b2d76872d68752b757b2d5e742968752b576a1f5e74297c9053656c26555824
+3a44233a442347581f576b33656c264c50265558243f4e1e344d1e2f3c223f4e1e
+3f4e1e49601f49601f565838656c26656c263f4e1e344d1e47581f47581f5e7429
+60832a5474285e74297b90348c98359e98538b9055656c26757b2d656c26767b47
+8b90559fa857778746757b2d656c26767b476b852c6b852c5474284b681e3c5822
+49601f41671b708f317d97366b852c4b681e49601f4c50264c502624261c342d1f
+24261c24261c24261c24261c24261c4436233f4e1e3f4e1e3a4423333522342d1f
+3335223f4e1e656c26576a1f3a44235560245560242f3c22272c1f4e504375704d
+666b3b4c5026333522342d1f342d1f272c1f342d1f24261c272c1f342d1f333522
+342d1f272c1f3a4423555824757b2d76872d68752b5e74295e74294b681e3d5f25
+657c4484714474643e4e3d2244362324261c24261c342d1f342d1f342d1f272c1f
+24261c342d1f272c1f383c233a44233f4e1e383c23272c1f3335224e3d22443623
+342d1f24261c24261c24261c272c1f272c1f24261c24261c24261c24261c24261c
+24261c24261c1e241b24261c1e241b24261c1e241b24261c24261c342d1f272c1f
+272c1f272c1f24261c24261c24261c2f3c2249601f5f7b2a60832a60832a697c2b
+5e7429576a1f3f4e1e49601f49601f47581f4c50264c50263f4e1e4c5026555824
+3a4423383c23383c23383c233335223335223335224e3d224e3d22333522443623
+333522342d1f272c1f272c1f342d1f272c1f857d679a917884888775704d857d67
+757c71778746767b477c90538b9055627444767b475e74293043213c5822556024
+697c2b76872d697c2b5e7429576a1f344d1e4b681e47581f576a1f7b90345f7b2a
+47581f5f7b2a708f318c9853757b2d5560243043213f4e1e3d5f253f4e1e3f4e1e
+556024344d1e3c582249601f49732380a03b8b90336b852c576a1f4b681e3f4e1e
+3335222a34383a44235658384960324b69336b852c6b852c576b33354c31373e43
+2e3c443f4e1e556024576b33666b3b576b33383c232a34383335223335224c5026
+475832576b333f4e1e4758323f4e323a4423576b3368752b383c23262e35342d1f
+272c1f342d1f3336422b33222b3322383c23342d1f262e3524261c24261c4e5043
+666b3b4c50265f615668752b666b3b373e433335224e4425666033867c4ca48954
+978834887b2c87872c957c2f957c2f84712f7664279e98538b9055656c2656603a
+657c44666b3b4c5026666033767b474c50263f4e32272c1f272c1f272c1f272c1f
+272c1f3a4423666b3b3f4e32342d1f272c1f272c1f24261c333522576b33778746
+8b9055767b47767b477787465658382b3322342d1f2b33223335224c50262f3c22
+2b3322272c1f342d1f443623766e2d957c2fb1a03d9f9835b1a03db1a03dc0a845
+9f9835b0a83fb1a03dc2b868b0a83fbfb04db0a83fb1af4db0a83fa0a03aa1af4e
+a0a03a8b9033b0a83fa1a73cb0a83fa0a03a978834978834978834ad903dc0a153
+ab9158ccb169d1b890d8c291d8c291d8c291d1b890d1b890e0c492b1b0698b9033
+7b903468752b49601f697c2b5e742968752b76872d7d9736697c2b47581f47581f
+2f3c2230432149601f8b9033a1a73ca0a03a9f98359f9835b0a83fbeb751b1af4d
+b1af4dc4bf65beb751b1a03dc0a845c1b064b1b069b1af4dbeb751beb751c2b868
+cdb85ec2b868b2a856b2a856c1b064b0b86cb0a83fb2a053c2a85ed1b876cdb85e
+c1b064c2b868c2b868c1b064beb7518ea0598b90339f9154757b2d8c98537b9034
+8b9033656c2676872d68752b576a1f5560244c50263f4e1e576a1f5558243f4e1e
+47581f3c582247581f3f4e1e4b69333a4423383c2347581f656c2647581f383c23
+272c1f4c50263f4e1e30432155602449601f49601f4b681e5e742949601f697c2b
+5f7b2a576a1f697c2b6b852c8b90338c98358ea0598b90559e98538c98538c9853
+8b90337c905376872d8c98537b9034656c26496032576a1f47581f47581f4c5026
+475832344d1e708f316b852c5f7b2a49601f4b681e3f4e1e3a442324261c272c1f
+24261c342d1f272c1f342d1f24261c342d1f333522383c232b3322333522272c1f
+3335223a44234c50265558245560247664274c5026556024333522342d1f4c5026
+5658384e4425272c1f272c1f3a44233f4e1e342d1f272c1f3a442347581f49601f
+383c232b3322344d1e656c269e9853b2a0539f9154556024757b2d7d97367b9034
+55602456583866592c342d1f342d1f24261c1c1e19342d1f24261c24261c24261c
+24261c342d1f24261c333522342d1f333522342d1f272c1f2b33223a44233a4423
+3a44232b332224261c383c2333352224261c24261c342d1f272c1f24261c24261c
+24261c24261c24261c1c1e1924261c24261c24261c24261c2b33225558243f4e1e
+333522383c23272c1f272c1f24261c2b33225e74296b852c6b852c576a1f68752b
+76872d576a1f49601f47581f47581f41671b47581f49601f47581f3f4e1e3a4423
+383c23383c23383c23383c233f4e1e4e4425574f264e4425443623383c234e3d22
+383c23443623383c23342d1f342d1f33352275704d9a917884714456583887886d
+8b90557787468b90556b85458b9033767b47576b33697c2b3f4e1e344d1e68752b
+76872d6b852c6b852c5e7429697c2b576a1f5474283d5f2549601f697c2b556024
+49601f5f7b2a6b852c6b852c656c263f4e1e2f3c2249601f344d1e2f3c222f3c22
+304321344d1e344d1e4b681e697c2b80a03b8b903376872d5f7b2a576a1f2f3c22
+2e3c44272c1f394446555824555824496032576b336b8545576b334b6933354c31
+2f3c224b6933657c444960324c50267787464758323a4423304321475832627444
+767b476b85453d5f254758323f4e1e556024778746657c443f4e1e2b332230444d
+383c233f4e324c5026574f265658383a4423262e352a3438383c233a4423373e43
+4e5043333522373e43604f2a565838333522272c1f383c234c502674643e9f9154
+9fa8578b90339f91548c98359e9853887b2c87872cae993d8b9055576b334c5026
+766e2d4c50264c5026666b3b75704d3a44233f4e3224261c24261c272c1f272c1f
+24261c342d1f4e504333352224261c272c1f24261c24261c383c238b90558b9055
+4c5026342d1f272c1f342d1f272c1f24261c272c1f1e241b1e241b272c1f24261c
+272c1f272c1f342d1f383c2366592c76642787872c957c2f978834978834a48a3b
+887b2c9788349f9035a48a3b9e9853b1a03d9f983587872c9788349f9835a0a03a
+9f98359f9835b0a83fb1af4d9f90359f90359f903595885c9e9853b09954c4a979
+c0a153c4a979ada17fc4a979c4a979b09954aea886b1b069c4a979c1b064b0a83f
+757b2d757b2d76872d47581f3f4e1e556024656c26656c263f4e1e333522383c23
+3f4e1e383c233f4e1e8b9033a1a73ca1a73cb1a03db2a053c1b064b1af4db1af4d
+a1af4ea1a73cb1af4dc0a153b2a856b1af4db2a856c2b868b1b069b2a856b1b069
+c1b064b1b069b0a83f9e9853b2a0539f98358e9f3b8ea059b2a856b1b069b2a856
+bfb04db0b86cb2a053c1b064b1af4da1a73c9e98538b90338c983576872d86874a
+8b90337c90538b903386874a778746656c2647581f475832576b3347581f344d1e
+555824576b33767b47697c2b3a442355582468752b7787467c9053656c262b3322
+4c5026697c2b6b852c576a1f3f4e1e3f4e1e556024627444576a1f576a1f68752b
+576a1f47581f757b2d8b90557b90349e98539fa0568c98538ea0598c98538ea059
+8c98538b903376872d8c9853778746767b47778746666033657c44576a1f47581f
+576b337f97537b90344b681e767b47666b3b5e742976872d383c2324261c24261c
+24261c272c1f24261c24261c272c1f272c1f3335222b33223335223a4423383c23
+2b33222f3c223f4e1e5e742968752b656c263a442355582447581f2b3322342d1f
+333522333522272c1f272c1f5560245e7429576a1f556024656c2668752b68752b
+666033576a1f767b47778746aea886c2b868ada17f9fa8578b9055767b47766e2d
+6660334e44254e3d22443623342d1f24261c24261c342d1f342d1f342d1f24261c
+443623574f264e3d22342d1f4436234e44253335223a4423383c23383c23555824
+576a1f5560244c5026656c26574f26342d1f342d1f383c23443623342d1f24261c
+342d1f24261c24261c24261c24261c24261c24261c24261c272c1f3a4423333522
+3f4e1e383c23272c1f272c1f2b332247581f76872d697c2b68752b555824656c26
+8b9033697c2b5f7b2a576a1f49601f5e74293f4e1e3f4e1e3a4423383c232b3322
+272c1f333522333522383c234c502655602466592c4e4425383c234e4425333522
+333522383c23333522342d1f342d1f3335224e4425666c5e4e5043565838657c44
+697c2b867c4c6b85457787468c98538c985376872d757b2d47581f576a1f778746
+757b2d86874a656c26576a1f3c5822576a1f49601f3c58223d5f254b681e576a1f
+708f31557f226b852c757b2d757b2d47581f344d1e576a1f47581f3f4e1e2f3c22
+383c232f3c223f4e1e576a1f5f7b2a8c98358e9f3b76872d5e742949601f333522
+3a44232e3c442f3c2256603a56603a496032475832547428576b33576b334b6933
+576b335f7b2a6b85456b854568752b657c4468752b657c444960323f4e324b6933
+5e74296b854541671b4b69334b6933627444767b476b8545618345344d1e3f4e1e
+475832576b33666b3b867c4c767b473f4e1e4c50264b6933627444556024475832
+3f4e1e4436233335224e44253a44232e3c442b33222f3c222f3c223f4e3284712f
+8c98357197328c98358c985376872d87872c8c983587872c757b2d55602456603a
+666b3b5658383a44234e4425574f26373e4333352224261c24261c272c1f272c1f
+262e354758325558243a4423262e35272c1f24261c24261c33352277874686874a
+666b3b383c23383c233a442333352224261c24261c24261c24261c272c1f272c1f
+24261c272c1f272c1f3a4423766427766e2da48a3b9f9035a48a3b978834a48a3b
+84712f978834978834957c2f978834ad903d887b2c757b2d887b2c957c2f978834
+97883487872cad903d978834887b2c84712f84714474643e857d6795885ca48954
+a48954977c4fa48954977c4fa48954977c4f977c4f9a9178977c4f9e98539f9035
+867c4c5560244e3d22333522342d1f333522443623574f26333522272c1f272c1f
+5558245560248b90339f903587872c86874a9788349f9035b2a856ae993db2a053
+9f90359f9835b1af4db1a03d9e9853b1b0699fa857b1b0699fa056b0a83fb2a856
+b2a856b2a856a1a73c9f9835b1a03d9f90359f9835b2a856c2a85eb2a856b1a03d
+b1a03db2a856ae993dc0a153b2a053b2a0539fa0568c98538c98538b903386874a
+86874a8b9055697c2b8c98538c98538b90558b9055767b4768752b3f4e1e475832
+86874a627444556024656c2668752b666b3b8b90337787466b852c556024383c23
+6b8545627444697c2b5e74293f4e32576b334c50264c50263a4423666b3b656c26
+383c23333522666033604f2a66592c86874a8ea0598b90337787469fa056778746
+76872d77874686874a8b905568752b576b33666b3b55582462744468752b656c26
+7c9053778746666b3b576b3362744486874a77874677874655582433352224261c
+272c1f3a4423272c1f24261c272c1f272c1f272c1f3335223335223a4423574f26
+47581f49601f49601f656c26656c264c50264c5026383c235560243a4423272c1f
+272c1f342d1f272c1f272c1f5e74294973235e7429697c2b76872d757b2d887b2c
+9fa056b1b0699e9853aea8869e98539fa056ada17fa0a03a86874a4e4425383c23
+4e3d22383c23342d1f272c1f342d1f24261c342d1f24261c24261c24261c24261c
+4e3d2274643e66592c84712f6660334e44254e44254e442533352224261c333522
+4e44253f4e1e556024656c2687872c757b2d555824555824555824574f26333522
+342d1f342d1f333522383c2333352233352233352224261c342d1f272c1f342d1f
+3a44234e44254c5026383c233f4e1e697c2b8b90338b903387872c757b2d757b2d
+9f98358b9033708f31697c2b4b681e576a1f576a1f3a4423304321383c232b3322
+272c1f2b3322272c1f333522333522383c234e4425574f26443623333522333522
+3335223a4423383c23333522383c23383c233f4e325658385f6156767b47666b3b
+657c448b90558c9853697c2b8e9f3b7b90346b852c7b9034767b4747581f697c2b
+8c9853778746576a1f5e74294b681e49601f3a442347581f5474285e7429576a1f
+576a1f697c2b5e74295e742968752b3a44233f4e1e3f4e1e30432149601f68752b
+342d1f272c1f3a442368752b76872d8c98358e9f3b757b2d47581f41671b3f4e1e
+383c233944462f3c223f4e1e47583249601f4b69334b69333d5f25344d1e4b6933
+5474435f7b2a7b90346b8545656c266b852c61834554742847581f49601f68752b
+6b852c708f314b69333f4e1e2e3c442b33222f3c224c5026657c445e74293d5f25
+2f3c222f3c222f3c22666b3b68752b4758324c5026475832383c23383c23373e43
+3a44234c50262e3c442f3c224758322f3c223f4e1e496032354c3147581f778746
+708f31697c2b76872d76872d76872d8b90339e985376872d666b3b3f4e1e4e4425
+3a44233f4e323a44233335222f3c223a44233a44232a34382f3c22333522272c1f
+383c2375704d56603a565838383c233a442333352224261c272c1f3335223a4423
+766e2d77874676872d8c9853666b3b383c23333522342d1f383c23666033383c23
+333522272c1f272c1f3335224e442555602487872c87872c9f98359f90359f9835
+87872c9f98359f9154b0a83f9e9853ae993da0a03a9f98358b90339f98359f9835
+8b90338b90339f9835b0a83f978834978834887b2c977c4f95885c95885cab9158
+ab91589d9981ab9158ada17fada17fa48954ab91589e98539f9154ab9158978834
+766e2d3a4423272c1f272c1f24261c24261c24261c272c1f24261c24261c333522
+757b2d87872c8b9033666b3b4e4425604f2a604f2a766427b099549f90359f9035
+957c2f957c2f97883487872c978834b2a856a0a03a9fa056757b2d9788349e9853
+9788349f98359f90359f9035957c2f978834ad903dc2a85ec0a153ae993da48a3b
+ad903dab9158957c2fa489549f91549f90359e98539f9154767b47867c4c86874a
+8b9055767b4766603356603a767b4786874a778746767b4786874a666033565838
+4c50264c502656603a656c26778746767b478b90337787468b905576872d576b33
+767b47656c2668752b767b47627444565838666b3b666033666b3b5f615666592c
+4c50264c50263f4e1e2b3322666033627444867c4c66603356603a778746778746
+86874a6b8545697c2b767b47666b3b4c5026666b3b4c502656603a778746778746
+778746666033383c23383c233a4423666b3b767b47666b3b3f4e1e342d1f24261c
+272c1f33352224261c24261c342d1f24261c24261c333522555824555824957c2f
+766e2d757b2d766e2d766e2d766e2d766e2d604f2a4e4425574f26443623342d1f
+272c1f272c1f24261c272c1f49601f6b852c697c2b697c2b7b90348b90338c9835
+8b90559fa0569fa0569e9853767b47766e2d86874a757b2d66592c342d1f333522
+342d1f24261c24261c1c1e19342d1f342d1f24261c342d1f24261c24261c24261c
+342d1f604f2a847144977c4f957c2f666033443623443623342d1f342d1f24261c
+383c23556024383c234c5026656c2687872c87872c666033656c26555824333522
+272c1f3a44234c5026383c233a44235558244e44253335223335224c5026555824
+5558247664279f9154887b2c757b2d8c98359f9835a0a03a9f9035a0a03a9f9835
+8b90338c98358e9f3b76872d656c264b681e49601f3043213f4e1e344d1e2f3c22
+2b33222f3c222f3c222f3c223335223335222f3c22383c23333522333522383c23
+3a44233f4e1e3335222b33223f4e1e47581f555824767b478b9055767b477c9053
+9e9853aea8868c98537c90537c9053757b2d697c2b76872d8e9f3b757b2d68752b
+8b903386874a5e7429576a1f76872d576a1f49601f4b681e697c2b5e742968752b
+5e7429576a1f5e7429576a1f656c263a442349601f344d1e2f3c223f4e1e576a1f
+3043212f3c22656c26697c2b76872d8e9f3b7d97366b852c576a1f3c582247581f
+383c23394446354c313f4e323c5822576b335f7b2a4b69333c58223f4e32354c31
+354c314b693376872d5f7b2a5e74296b852c576b333d5f253d573b4c5026475832
+68752b5e74293043212f3c222e3c44272c1f2a34383335223a4423576b333f4e1e
+3043212a34383f4e1e56603a4b6933576b33697c2b5560243f4e32383c23333522
+383c233a44233a4423354c3147581f344d1e4b693368752b49601f576a1f778746
+708f3176872d7d97366b852c8b9033a1a73ca0a03a697c2b576a1f3a4423333522
+3335224758322f3c223f4e32627444576b33767b47576b33475832304321333522
+2f3c225558243f4e1e3f4e1e56603a62744447581f383c232b3322383c23383c23
+383c23697c2b697c2b576a1f3f4e323a4423383c23383c2355582468752b666b3b
+767b47556024383c233a4423383c2347581f76872d76872d8c98357b90348b9033
+8b90339f98359f9835a0a03aa0a03a9f98359f9835a1a73c9f98358c98359f9835
+8b903376872d8b90339f98358c98358b903387872c887b2c887b2c978834a48954
+a48954c4a979d1b890d1b890ccb169d1b890c4a979c0b197d1b890c1b064a0a03a
+757b2d656c2647581f3a44232b3322383c233a4423556024333522272c1f272c1f
+383c234e442566603397883476872d887b2c978834978834b2a0538b90339f9035
+957c2f9788349f90359f903587872cb2a053a0a03aa0a03a87872c87872c9f9035
+9788348b90339f9035957c2f84712f957c2fa48954b09954b09954978834a48a3b
+957c2f957c2f604f2a76642784712f887b2c867c4c767b47757b2d66603366592c
+767b47767b475658384c502675704d867c4c86874a87886d767b47666033383c23
+5658384e50433f4e3268752b8b9055767b477787467664278b9055778746778746
+576a1f767b47767b47666b3b68752b767b47778746574f26574f26383c23333522
+4e4425666b3b383c23272c1f3335223a44233a4423342d1f333522666b3b767b47
+778746757b2d576a1f767b47666033555824666b3b666b3b4c502656603a666b3b
+767b4755602456603a4c50263335223335224e50434c50262f3c2224261c24261c
+24261c24261c24261c272c1f383c23342d1f24261c33352266592c84712f887b2c
+84712f978834887b2c766427887b2c887b2c766427887b2c766427574f264e3d22
+383c23333522272c1f333522656c2676872d5e74295e74297b90347b90347b9034
+87872c8b90338b905586874a6660335558244e44252f3c222b332224261c272c1f
+272c1f24261c24261c24261c24261c342d1f342d1f342d1f24261c24261c342d1f
+342d1f4436234e4425604f2a604f2a574f264436234e442544362324261c272c1f
+3f4e1e56603a3a4423383c2333352255582475704d766e2d656c26766e2d333522
+3a4423656c265560244e4425383c2347581f3a44235558243a4423555824574f26
+666033757b2db2a053b2a856ae993db0a83fa1a73ca0a03aa0a03ab0a83fb0a83f
+a0a03a9f9835a1a73c7b9034576a1f4b681e576a1f3043213f4e1e3c5822304321
+2f3c222f3c222b3322383c23304321383c233a44233043213f4e1e3f4e1e47581f
+576a1f5560243f4e1e3f4e1e576a1f576a1f7787469d99818c985386874a8b9055
+8ea0599fa0569fa0565e74298c98538b9033767b4768752b757b2d8c98538b9033
+68752b5e742968752b7f97537b9034697c2b5e74295e7429576a1f3a4423556024
+76872d697c2b697c2b576a1f49601f656c265f7b2a576a1f3a44233f4e1e757b2d
+3f4e1e3c58225e7429576a1f76872d8c98357d97366b852c49732341671b49601f
+333522373e433043214758324758324b681e4758323f4e323043213043213f4e32
+354c31657c4460832a657c445f7b2a567f3a49603230444d3043213a4423373e43
+657c444b6933344d1e344d1e4758322e3c44342d1f272c1f2a34383c5822344d1e
+304321344d1e49603241671b49601f3f4e1e47583247581f47581f3f4e1e3f4e32
+3043213a44232f3c22383c233a4423383c233f4e325560245e742976872d778746
+7b903476872d76872d767b478b90338c985376872d757b2d68752b576b332f3c22
+2f3c22383c232b33223a4423556024383c23354c3149603241671b3f4e1e3f4e32
+3a4423576a1f576b333a4423344d1e4b681e697c2b576a1f5e7429576a1f5e7429
+697c2b757b2d76872d68752b3f4e32383c233f4e1e4c50264758326660333a4423
+4c50265560243f4e1e3f4e1e4b681e47581f76872d7d97368c98358c98358c9835
+9f98358c9835a0a03aa0a03aa0a03a9f98358b90339f98359f98358b903387872c
+8e9f3b76872d8b90338b90339f9835b1a03db1a03dc0a1539f9035a48954c0a153
+c4a979e0c492ccb169c0b197c4a979d8c291d8c291c3c17ad1b890d1b8768c9835
+656c26576a1f68752b47581f3a442349601f4b681e5560243a44232b33222f3c22
+2f3c222f3c223a442376872d8c98358c98358b90339f90359fa0569f98358e9f3b
+9f98358b9033a1a73c9f98359e98539fa0569fa0569fa8578c98539e9853ae993d
+a0a03aa0a03a9f90358b90339f903587872c86874a9e9853b09954ae993d978834
+ae993dae993d9f9035ad903da48a3b957c2f86874a766e2d5558243a4423383c23
+4c5026383c23333522342d1f333522383c23604f2a333522342d1f272c1f272c1f
+3a4423333522342d1f3f4e1e4e4425555824656c26656c26656c26666b3b4e4425
+574f26766e2d86874a5658384436234e504374643e565838342d1f383c23333522
+272c1f333642342d1f24261c24261c24261c24261c272c1f333522778746778746
+857d6768752b666b3b68752b666b3b56603a767b47767b47666b3b4758324c5026
+6274446660334c502655602455602455602447581f4c5026342d1f342d1f24261c
+1c1e191c1e1924261c24261c342d1f342d1f24261c342d1f383c23604f2a4e4425
+76642776642776642766592c604f2a66592c66592c84712f887b2c766e2d666033
+604f2a333522383c233f4e1e757b2d757b2d556024656c2649601f697c2b86874a
+76872d8b90559e985386874a75704d574f26342d1f24261c24261c24261c342d1f
+24261c342d1f24261c24261c24261c342d1f342d1f342d1f1c1e1924261c24261c
+272c1f342d1f3336424436234436233335224e3d224e3d2244362324261c24261c
+333522333522342d1f24261c24261c342d1f383c23333522342d1f4e4425556024
+76872d86874a766e2d6660333a44234e4425757b2d887b2c4e44254c5026766e2d
+766e2d9fa0569f9154c2a85e9fa056b0a83fb0a83fa0a03a8e9f3ba1a73ca1a73c
+a0a03a8e9f3ba1a73c8e9f3b7d97367b9034697c2b3c582249601f576a1f3a4423
+344d1e2f3c222f3c222f3c22304321304321344d1e344d1e5e7429697c2b6b852c
+76872d76872d68752b68752b8b90339f9035a1a73cb1b069b2a8569e98539fa857
+b2a8569fa857b2a85686874a8c98539fa8577b90347b90345f7b2a68752b8b9033
+708f3168752b68752b757b2d76872d76872d697c2b68752b5558243a442349601f
+76872d5e74295e74295e74295f7b2a708f31656c26576a1f54742849601f3c5822
+3f4e1e3f4e1e576a1f47581f7b90348e9f3b8e9f3b71973276872d4973233d5f25
+333522373e43383c233a44233f4e323f4e1e3a4423373e43373e432f3c22304321
+4b693360832a547428576b335e742941671b354c31304321304321304321475832
+5474283d5f254b69334b69334960322f3c22272c1f262e352a34383d5f253d5f25
+344d1e3d5f253c58223c58223d5f254960323f4e1e47581f576a1f5e7429576b33
+3a44232a34383335222a34383335222b3322272c1f383c23475832576a1f697c2b
+5e7429757b2d656c26555824666b3b757b2d6b852c697c2b5560244b69332f3c22
+3a4423373e432b33224960325560242f3c223f4e1e4b6933475832344d1e3f4e32
+49601f4b681e576a1f556024576a1f697c2b6b852c697c2b5474285f7b2a8b9033
+757b2d767b4784712f7b90346b852c697c2b697c2b47581f576b333f4e1e3f4e1e
+3f4e1e5560243f4e1e344d1e49601f3a4423656c26697c2b8b9033a1a73c8c9835
+8e9f3b76872d87872c9f9835a0a03a9f9835a0a03a9f9835ae993d9f98359f9835
+8e9f3b8b90337b9034757b2d978834887b2ca48a3bc0a845c2a85ec0a153d1b876
+d1b890d1b890c4a979ccb169c4a979d1b890decab4d3cea2c1b0649e985387872c
+6b852c5e74295560245e74294b681e576a1f60832a76872d5e74293f4e1e47581f
+2f3c222b33223f4e1e55602476872d8b903387872c8b9033a0a03aa0a03aa0a03a
+a1a73c9fa056b2a8569f9835a0a03a9fa0569fa056b2a8569fa857b0a83fb2a053
+a1a73cb2a8569f98359f90359f98358b903387872c8b90339e9853b2a0539f9835
+b2a053b1a03d9f9835ae993d9f983587872c757b2d666b3b666b3b555824555824
+666b3b666b3b4c50263a44234e504356603a75704d4e5043383c23443623342d1f
+3f4e1e4c50262f3c2255602475704d656c26656c26556024757b2d656c26576b33
+4c5026666b3b767b47475832383c23574f266660334c5026272c1f383c23333522
+272c1f383c23342d1f1c1e1924261c24261c24261c24261c24261c3a442356603a
+3a442356603a4e44254758324e4425383c234758324e4425333522272c1f2b3322
+4c5026767b4756603a5558244e50433335224c502647581f383c23272c1f24261c
+24261c1c1e1924261c342d1f24261c24261c24261c24261c342d1f443623443623
+4e3d224e44254436234e3d22342d1f443623443623383c234e442566592c66592c
+4e44254e3d224e4425333522574f26604f2a666033767b47666033576b3386874a
+9e98539e98538b90804c50264e5043383c23272c1f24261c342d1f443623342d1f
+24261c24261c342d1f24261c24261c24261c342d1f24261c24261c24261c342d1f
+342d1f24261c333522333522342d1f3335224e3d224e4425342d1f24261c1c1e19
+24261c24261c24261c24261c24261c24261c24261c24261c24261c342d1f74643e
+666b3b574f26443623574f26574f2666592c66592c4e44254e3d22333522766427
+6660339f90359f90359788349fa056a0a03aa0a03a8e9f3b8c9835a0a03aa1a73c
+a0a03a80a03b8ea83ea1a73c8ea83e8e9f3b8c9835576a1f576a1f757b2d3f4e1e
+3f4e1e3f4e1e344d1e344d1e49601f47581f47581f5e74298c98359f9835a1a73c
+b1af4da1a73ca0a03a8c9835a1a73cb1af4db0b86cc4bf65beb751b1b069c2b868
+b2a8569fa0568c98538b90338c98358c985376872d7787465e742949601f656c26
+60832a5e742968752b656c26766e2d76872d68752b6b852c656c2649601f49601f
+4b681e60832a7b9034576a1f576a1f6b852c68752b68752b5f7b2a4b681e3d5f25
+576a1f5558243f4e1e3043215e74298c98358c98358ea83e6b852c5f7b2a557f22
+2f3c223335222e3c442f3c223f4e324960323a44232f3c222f3c22394446496032
+5f7b2a5474284b6933547428567f3a49601f3d573b4758323f4e32354c314b6933
+4b69333d5f254b681e3c58222f3c22262e35272c1f272c1f354c314b69333d5f25
+3d5f254b69334960323c582254742849601f47581f5474284b693349603247581f
+344d1e2f3c222b3322262e35272c1f262e35272c1f2b33222f3c22344d1e5e7429
+6b852c7b90344b681e47581f576a1f757b2d8b9033697c2b556024354c31304321
+47581f3d5f25304321576b33697c2b49601f49601f3f4e1e3f4e32333522272c1f
+4b681e5474285474285e74295e74296b852c6b852c697c2b576a1f49601f576b33
+47581f5558243f4e1e556024656c265e742947581f3a44233a44233f4e1e47581f
+49601f47581f2b3322272c1f333522272c1f383c23556024757b2d8b90338b9033
+76872d5e7429555824757b2d87872c9f9035b1a03db1a03db1a03dae993d9f9835
+9f98358c98358b9033757b2d76872d766e2d766e2dae993db2a053ccb169c4a979
+ccb169d1b890c4a979ccb169ccb169d8c291d1b890decab4d1b890b1af4da1a73c
+7b9034708f315f7b2a557f225e74296b852c6b852c7b90345e742949601f49601f
+3f4e1e344d1e3f4e1e3f4e1e55602455602468752b76872d8b90339f98358c9835
+9f9835b1af4dc1b064b0a83fb2a856c0a845b2a856b2a856b1af4db1b069b1af4d
+c1b064b0b86ca0a03a9e9853b0a83fa0a03aa0a03a9f9835b0a83fc1b064c2a85e
+b2a856b2a856b2a856b2a053a0a03a86874a757b2d757b2d656c2668752b767b47
+767b47656c2647581f4c5026766e2d767b47757b2d778746778746576a1f3a4423
+383c233a44234c502655602462744468752b76872d576b33697c2b62744468752b
+576b33666b3b666b3b556024576b3356603a75704d4c50264e5043333522383c23
+4e4425555824333522342d1f24261c342d1f24261c24261c24261c383c23475832
+3a4423555824383c235558244c5026574f263a44233335222b33222b33222b3322
+3f4e1e5558244c50264c50264c5026342d1f3f4e1e4c502644362324261c1c1e19
+24261c24261c24261c24261c342d1f342d1f24261c342d1f443623604f2a604f2a
+766427766427604f2a604f2a604f2a604f2a574f26766427766427766427604f2a
+4e4425333522342d1f4e44255558246660336660334e4425383c23383c234e4425
+4e5043574f26443623342d1f342d1f24261c1c1e1924261c24261c342d1f342d1f
+24261c342d1f342d1f24261c24261c24261c24261c24261c24261c1c1e19342d1f
+24261c24261c24261c24261c24261c24261c342d1f33352224261c24261c342d1f
+24261c342d1f342d1f24261c24261c24261c24261c24261c24261c24261c272c1f
+272c1f272c1f24261c24261c342d1f272c1f24261c24261c24261c24261c4e3d22
+4e3d22766e2d978834887b2c87872c9f98358e9f3ba0a03a8b9033a1a73ca0a03a
+a0a03aa0a03abeb751b0a83fb0a83f8ea83ea1a73c708f31757b2d87872c6b852c
+576a1f5e74293c582249601f54742887872c76872d8c9835b1af4daeb84ec4bf65
+c4bf65beb751beb751bfb04dbeb751cdb85ec2b868cdb85ec4bf65d0c074d0c074
+b1b069b1af4d9e98539f98359e985376872d76872d697c2b547428697c2b60832a
+5f7b2a576a1f5e7429757b2d87872c574f26556024697c2b68752b55602449601f
+49601f576a1f656c26576a1f576a1f5474285e7429656c265f7b2a3f4e1e47581f
+49601f497323576a1f54742860832a8b90337b90348ea83e708f317d973676872d
+3a4423373e43383c233c58225474283d5f2530432130444d3043214b69335f7b2a
+6b852c557f225474435f7b2a567f3a4b69333d5f254b69333c58223d573b557f22
+4b69333d573b5474283f4e1e2b332224261c342d1f262e353a44233c58223f4e32
+3c582249601f49603247581f576a1f496032344d1e49601f41671b3f4e323c5822
+47581f304321373e43272c1f342d1f2b33222f3c223043213043214b693376872d
+6b852c8b90336b852c576b33576a1f6b852c697c2b576a1f5560243f4e1e3c5822
+5e74295e7429304321556024697c2b576a1f3f4e322b33223335222b3322272c1f
+49601f576a1f5474285e7429576a1f576a1f5e742947581f4c5026344d1e3a4423
+3f4e322b33222b33223a4423383c233f4e1e383c23383c23342d1f272c1f2b3322
+333522272c1f272c1f272c1f272c1f272c1f272c1f3a442349601f3f4e1e555824
+5558243f4e1e3a44234c5026555824766e2d9788349f90359f9035ae993db1a03d
+9f98358b90338b903368752b68752b757b2d978834ae993dc0a153ccb169ccb169
+ccb169ccb169ccb169dcc17fd1b890e0c492d1b890c4a979e0c492d0c0748e9f3b
+76872d8b9033576a1f3f4e1e47581f47581f3a442347581f697c2b497323497323
+4b681e3f4e1e556024576a1f47581f3a44233a44233f4e1e576a1f757b2d8b9033
+76872d9f9035c0a153c4bf65c1b064c2a85ec2a85ec0a153c2a85ec2a85ec1b064
+c1b064c2b868b2a856c2a85eb2a053b2a053a1a73cb2a053b2a053c0a153c0a153
+c2a85ec1b064c1b064c1b064a1af4e8b90338b90558c9853757b2d76872d68752b
+68752b68752b576a1f767b47778746867c4c767b47666b3b766e2d3a44234c5026
+75704d55582447581f4c5026666b3b56603a767b475e7429767b47656c263f4e32
+56603a4758325560245560244758324c50265658384e44255658385560244c5026
+333522383c233a4423272c1f3335224e44255560244c50264e4425697c2b697c2b
+576b33666b3b666b3b767b47666b3b55602468752b666b3b55602447581f344d1e
+576b3368752b3a4423383c234c50264c50263a44232f3c22272c1f1c1e1924261c
+1c1e1924261c24261c342d1f342d1f24261c24261c342d1f574f2666603384712f
+66592c84712f76642766592c84712f766427604f2a766e2d66592c4e44254e3d22
+4e3d22342d1f342d1f383c233f4e1e766e2d6660334e4425272c1f2b3322272c1f
+3335223a4423272c1f24261c24261c342d1f24261c24261c24261c342d1f342d1f
+24261c24261c24261c24261c24261c24261c342d1f1c1e19342d1f1c1e1924261c
+24261c342d1f24261c342d1f24261c342d1f443623443623342d1f1c1e1924261c
+342d1f342d1f342d1f342d1f1c1e1924261c24261c24261c24261c342d1f342d1f
+342d1f24261c24261c342d1f272c1f24261c24261c24261c24261c24261c342d1f
+443623574f2684712f666033766e2d8b903387872c9f983587872c97883487872c
+887b2c87872cbfb04db0a83fb1af4da1a73cb1b069a1a73ca1a73c9fa056a0a03a
+8c98357b9034757b2d68752b576a1f8b9033b0a83f9fa857c4bf65c3c17ac4bf65
+c4bf65c3c17ac4bf65c4bf65c4bf65c4bf65d4cb83c4bf65c4bf65d0c074d0c074
+bfb04d8c98538c98358c98538b90339f98356b852c5560245e7429697c2b576a1f
+5e7429697c2b697c2b576a1f5560245558245560245f7b2a76872d76872d5e7429
+576a1f576b3349601f5e74295560245e742949601f5560245e74293f4e1e3f4e1e
+344d1e697c2b708f31697c2b7d97368c98357b903480a03b8ea83e8ea83e6b852c
+383c23394446383c233d573b4b69333d5f253c58223c58223c5822576b33618345
+6b852c6183455f7b2a4973234960323d5f254b69335474283d5f25354c314b6933
+4973233d5f255474283d573b342d1f262e352b33222a34382f3c223043213d5f25
+47581f3d573b3f4e1e2f3c223f4e323f4e1e3a4423344d1e3f4e1e3f4e1e496032
+3c58223f4e1e344d1e2f3c22373e433043213d5f255f7b2a4b681e60832a778746
+697c2b60832a6b85457197325474285e7429556024344d1e49603241671b576b33
+576a1f576a1f3f4e1e55602486874a576a1f3043213f4e1e2b3322272c1f2b3322
+344d1e3f4e1e3f4e1e55602447581f3f4e1e49601f3a44232b33223335222b3322
+2b33222b3322272c1f272c1f272c1f272c1f272c1f272c1f24261c24261c272c1f
+333522383c23272c1f24261c272c1f272c1f272c1f3043213f4e1e2f3c222b3322
+333522383c233a4423383c233a4423555824555824766427766e2d766e2d978834
+9f98359f903587872c87872c87872c9f9035b1a03dc2a85ec2a85ec4a979ccb169
+c4a979c0a153ccb169d1b890ccb169d1b890d8c291d1b890d1b890d1b876b1af4d
+a0a03a8e9f3b576a1f47581f3a44236b852c47581f2f3c2249601f697c2b49601f
+383c232b33223043213f4e1e3a44232b33222b3322383c23556024556024556024
+656c26757b2d87872cada17fc1b064d1b890c0a153c0a153d1b890ccb169c0b197
+d1b890c0a153c2a85eb2a053c2a85eb2a856b2a053b2a053c0a153c0a153ccb169
+c0a153b2a856c0a153d1b876b2a856a0a03a9e985387872c77874668752b757b2d
+767b47757b2d75704d76872d68752b666b3b5558243f4e3256603a3a44233a4423
+56603a576a1f576b336274443a44233f4e32576b33697c2b697c2b5560242b3322
+666b3b576b33556024556024383c233a44233a44233a4423383c23475832666033
+3335222b33224e4425383c2366592c656c26656c26556024576b3386874a778746
+778746656c26666033666b3b666b3b666033666b3b66603355602447583256603a
+697c2b4c5026565838555824333522383c23383c234e4425342d1f24261c342d1f
+24261c44362324261c1c1e1924261c24261c24261c333522383c2344362366592c
+604f2a76642766592c555824555824574f264e44254436234e3d22333522342d1f
+342d1f272c1f24261c272c1f342d1f574f26555824555824333522342d1f3f4e1e
+556024767b47666033574f2666592c342d1f24261c24261c24261c24261c24261c
+24261c24261c1c1e1924261c1c1e19342d1f342d1f24261c24261c24261c342d1f
+24261c342d1f4436234436234436234436234436234e4425342d1f342d1f1c1e19
+342d1f342d1f342d1f443623342d1f1c1e19342d1f24261c342d1f342d1f4e4425
+66592c443623342d1f604f2a342d1f272c1f342d1f342d1f24261c342d1f66592c
+574f2676872d9f9035887b2c8b90339f98358b90338c98359788349f98359f9835
+9f9835a0a03ab1af4dbfb04dbfb04db0a83fc3c17ac3c17ab1b069c2b868c3c17a
+c2b868a0a03a9f983587872c76872db2a856beb751b0b86cc4bf65d0c074c3c17a
+c2b868c4bf65c4bf65c4bf65c4bf65c4bf65d0c074d0c074c4bf65c4bf65c1b064
+bfb04d9f903587872c8b90338b90338b90338c9835697c2b757b2d757b2d5e7429
+5e7429656c26697c2b4b681e68752b5560245e74295e742976872d76872d6b852c
+778746697c2b49601f4b681e60832a697c2b76872d8b90336b852c49601f2f3c22
+383c2366603368752b6b852c80a03b8e9f3b8e9f3b8ea83e9eb74c8e9f3b697c2b
+383c23373e433335223f4e323d5f253d573b3043213944463043213f4e3249601f
+60832a60832a567f3a5474284b69333d5f254960325474284973234b693341671b
+3d5f253d5f255f7b2a3d5f252f3c222a3438354c313d573b354c313f4e1e547428
+3d5f253c5822344d1e2f3c223335222f3c222f3c222f3c223043213a4423475832
+4758323f4e1e3043212f3c222f3c223043214b6933576b334b69336b85457c9053
+6b852c6b852c5e742976872d5e742960832a5e74294b681e576b33547428547428
+576a1f576b3349601f697c2b7c90535560243f4e1e5f7b2a3043212f3c222b3322
+2f3c22272c1f2b33222f3c223f4e1e3a4423383c23342d1f24261c272c1f1e241b
+24261c24261c24261c24261c24261c24261c24261c24261c24261c272c1f2b3322
+3f4e1e5e74293a4423272c1f272c1f272c1f2b3322344d1e344d1e2b33222f3c22
+333522272c1f342d1f342d1f383c23443623383c23383c23574f26574f2666592c
+9788349f90359f90359f9835a0a03ac0a845b1a03dc0a845c2a85ec0a153c0a153
+c0a153c0a153ccb169d1b876ccb169d1b876d1b890ccb169d1b890d1b890c2b868
+b1b0697b903449601f3f4e1e3f4e1e47581f697c2b5e74295f7b2a697c2b344d1e
+272c1f2b33223043213f4e1e2f3c222f3c223a44233a4423574f26576a1f5e7429
+5e7429697c2b757b2d87872cada17fb2a053ab9158a48954c0a153d1b890d1b890
+d1b876c1b064c4a979c0b197c1b064c0a845ae993dc2a85ec2a85ec2a85ec0a153
+ccb169b2a0539f9154c0a153c1b0649fa05677874668752b697c2b76872d68752b
+68752b576a1f656c26576a1f4c50263f4e1e3a4423383c233a44233f4e1e3a4423
+3a44233a44233f4e32383c233a4423383c23383c233f4e32576b334c50262b3322
+30432147581f576b333a4423383c232f3c223a44234b681e5658383f4e1e49601f
+3c58223f4e1e556024766e2d666033656c2668752b666b3b666b3b666b3b576b33
+68752b576b334c502656603a6660334e50436274443a44234e442549601f666b3b
+666b3b4c5026342d1f2b33223335223f4e1e4e50434e4425383c23342d1f24261c
+1c1e1944362324261c342d1f24261c342d1f24261c24261c342d1f383c23383c23
+333522383c234e44255560245558243f4e1e3a4423383c23574f26333522272c1f
+272c1f24261c24261c24261c272c1f333522383c2375704d5558244c5026767b47
+77874686874a86874a75704d55582444362324261c24261c342d1f24261c342d1f
+1c1e1924261c342d1f24261c342d1f342d1f24261c342d1f24261c24261c342d1f
+342d1f342d1f4436234e3d224e44254436234436234e3d22443623342d1f24261c
+443623443623443623604f2a4e3d22342d1f342d1f342d1f4e4425604f2a84712f
+a48a3b84712f604f2a766e2d4e442566592c76642766592c604f2a4e3d2266592c
+7664279f90359f9035978834b2a053b1af4da0a03aa1a73c9f9835b1af4dbfb04d
+c0a845c2b868c2b868c2a85ec2b868c4bf65d4cb83d4cb83c4bf65c3c17ad4cb83
+d0c074c3c17ac3c17ab1b069b1b069c4bf65d0c074c2b868c3c17ad4cb83d0c074
+d0c074d0c074c4bf65c4bf65c4bf65d0c074d0c074cdb85ec2b868b0a83fb1af4d
+b2a85697883486874a8b90339fa0568c9835a0a03a8e9f3b9fa056766e2d778746
+5e742977874676872d697c2b576a1f4b681e5e74295e742949601f556024697c2b
+5560243a442355582447581f5e742976872d8b90338b903376872d4c5026333522
+2b33223335224c50265e742980a03b80a03b8e9f3b91af499eb74c8e9f3b719732
+383c23373e432f3c223f4e323d5f25354c31304321304321344d1e354c31475832
+6274445474435474285f7b2a4973233d5f254b6933567f3a697c2b547443547428
+4b69334b69334973233d5f25304321304321344d1e3c58224960324b69335f7b2a
+4973234b681e3d5f253043212e3c442b33222e3c442f3c224c502647581f556024
+496032354c31383c232e3c442a34382b3322383c232f3c223f4e1e697c2b7c9053
+708f316b852c5474286b852c5e74295e74295f7b2a576b3349601f576a1f576a1f
+576b3349601f697c2b778746697c2b49601f344d1e4973233c58222f3c222b3322
+3f4e1e2b332247581f383c23344d1e2f3c222b33222b3322272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c272c1f24261c272c1f333522
+3a44234b681e3043212b33222f3c222f3c222f3c223d5f253c58222b33222b3322
+3043212f3c22272c1f342d1f272c1f2b3322342d1f342d1f383c23383c234e3d22
+66592c87872c9f9035b1a03dbfb04dc0a153c0a153c0a153ad903dc0a153b09954
+c0a153c4a979ccb169ccb169ccb169d1b876d1b890ccb169c4a979ccb169c2a85e
+b2a856757b2d576a1f3c5822576a1f697c2b76872d6b852c54742849601f3f4e1e
+3f4e1e3f4e1e49601f4b681e4b681e47581f60832a5f7b2a4c50263f4e1e556024
+757b2d8b90339f9154ada17fada17fb2a05386874a766427a48954c0b197ccb169
+c4a979ccb169c4a979d1b890ccb169b2a856b09954b2a856c0a153ccb169ccb169
+d1b890c2a85eb099549f9154c1b064b2a0538b9033757b2d576a1f656c26576a1f
+576a1f576b33666b3b5560243f4e1e475832344d1e3f4e1e576a1f344d1e3a4423
+383c232f3c223a44233f4e1e47581f3a4423383c233335223335222b33223a4423
+2b33223f4e323a44233335223a44233f4e1e55582447581f47581f344d1e5e7429
+576a1f49601f68752b68752b757b2d7787468b9033697c2b666b3b778746767b47
+778746576b33576b33576b335558243a44234e4425383c234c5026627444666033
+627444556024304321383c233f4e325e7429697c2b697c2b4c5026342d1f24261c
+24261c24261c342d1f342d1f24261c342d1f272c1f272c1f2b33223335222b3322
+272c1f3335223a442347581f55602447581f383c234c50263a4423342d1f24261c
+24261c342d1f24261c24261c3335223335222f3c224758323f4e1e576a1f6b8545
+68752b657c4476872d75704d5558244e3d22342d1f24261c342d1f1c1e1924261c
+24261c24261c24261c24261c24261c342d1f24261c342d1f342d1f1c1e191c1e19
+342d1f604f2a66592c76642774643e4e44254e4425443623342d1f342d1f24261c
+4e3d224e442566592c66592c66592c4e3d2266592c4e4425977c4f957c2f84712f
+9788349f9035a48a3b84712f604f2a4e4425766e2d97883466592c84712f84712f
+6660339e9853b2a053c1b064c2b868c2b868c2b868cdb85ec2b868c4bf65b0a83f
+cdb85ed1b876d1b876d0c074d0c074d0c074c3c17ad4cb83d8c291d0c074d4cb83
+c3c17ad4cb83d4cb83c3c17ad4cb83d0c074c3c17ac3c17ad4cb83d0c074c3c17a
+c4bf65c2b868d0c074cdb85ecdb85ec4bf65cdb85ec2b868d1b876bfb04d9fa056
+b1a03db0a83fa0a03a87872c8c98538b90338c98358c9835a0a03a68752b556024
+576a1f576a1f697c2b576a1f5e742954742860832a576a1f556024497323757b2d
+697c2b656c267b90345e7429697c2b757b2d757b2d76872d87872c576a1f304321
+3043213f4e1e49601f5e7429708f3180a03b80a03b8ea83e91af4980a03b7d9736
+2b33222e3c442f3c223d573b3d573b344d1e354c31354c314b69333d5f25496032
+576b334973235e74294b69335f7b2a4b693349732360832a6b852c6b85457b9034
+5474283c58224b69333d5f25304321354c313d5f25576b33576b33576b33547428
+5f7b2a547428496032344d1e3043213043213f4e323f4e3256603a576b33576a1f
+47581f3f4e1e2f3c22383c23272c1f2b3322272c1f2b3322354c315e74298c9835
+7b90347b90346b852c60832a5e7429697c2b5f7b2a49601f3043213c58224b6933
+576b335560245f7b2a697c2b576b33576b333a4423344d1e3f4e323a4423272c1f
+49601f2f3c224b681e55602449601f4c50262b33222b33222b33222b3322272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c24261c24261c272c1f272c1f
+272c1f2f3c222b3322272c1f344d1e3d5f253d5f25344d1e3043212f3c222f3c22
+2b33222b332224261c272c1f24261c24261c272c1f272c1f2b33222b3322333522
+4e442566592c87872c9f9035a48a3bae993dae993dc0a153ad903dad903dc0a153
+c0a153c4a979c0a153c0a153c4a979ccb169ccb169d1b876c2a85eb2a8568b9033
+87872c76872d76872d6b852c708f316b852c5f7b2a576a1f5e74294b681e5e7429
+576a1f49601f3043213a44234b681e576a1f697c2b6b852c766e2d656c264c5026
+604f2a87872c9e9853c2a85ec1b064b2a05386874a766427b2a053ccb169d1b890
+c4a979d1b890d8c291c0b197d1b890ccb169c2a85ec0a153c4a979c1b064b09954
+c0b197c4a979c1b064b09954b2a8569fa0568b9055778746778746656c26697c2b
+68752b576b33576a1f576b33656c265e74294b681e576b3368752b576a1f3c5822
+3f4e1e304321475832556024576a1f47581f3a44232b33222f3c222b33222f3c22
+344d1e3a442347581f47581f49601f47581f383c233a44233f4e1e3f4e1e497323
+54742849601f576a1f697c2b76872d86874a778746656c26556024697c2b68752b
+656c26576b3368752b6b852c68752b4758324c50263a4423576b335658382f3c22
+475832697c2b5e742947581f6274444b69335e7429576a1f33352224261c24261c
+24261c272c1f342d1f342d1f272c1f342d1f383c23333522333522272c1f272c1f
+2b3322383c234c50264c50263a44234c50264c50263f4e1e342d1f272c1f333522
+443623342d1f24261c24261c3f4e1e3f4e1e47581f49601f576a1f68752b68752b
+68752b86874a757b2d767b474c50265558246660334e4425443623342d1f342d1f
+24261c24261c24261c24261c342d1f24261c24261c342d1f24261c24261c342d1f
+342d1f604f2a4e3d22604f2a4e3d22443623443623342d1f342d1f443623272c1f
+333522574f26604f2a766427957c2f84712fa48a3b887b2cb2a053b09954977c4f
+a48a3ba48a3ba48a3ba48a3b84712f84712f766e2d957c2f757b2d978834957c2f
+87872c9f9154b2a856c2b868c2b868c2b868c2b868d0c074d1b876d0c074c2a85e
+c4bf65cdb85ed1b876cdb85ec2b868d0c074c4bf65d0c074d4cb83d0c074c2b868
+c4bf65c4bf65d4cb83d4cb83c3c17ad0c074d4cb83d0c074d4cb83d4cb83d4cb83
+d0c074c2b868d0c074c4bf65c2b868cdb85ed0c074c1b064beb751c1b064c2b868
+b0a83fb2a856b0a83f87872c697c2b76872d757b2d68752b8b90336b852c697c2b
+5e74295e7429576a1f697c2b576a1f5474285f7b2a656c26556024576a1f5e7429
+697c2b656c2676872d757b2d555824757b2d87872c656c2687872c76872d5e7429
+697c2b76872d697c2b76872d708f318e9f3b8e9f3b91af49a1a73c8ea83e8e9f3b
+333522373e43304321344d1e3d573b344d1e3d573b3c58225474285474284b6933
+547428576b335474284b69335474284b69335e7429657c446b8545778746778746
+567f3a41671b4b69333c582230444d3043214758324960323f4e3247581f49601f
+5474285f7b2a3d5f25344d1e475832354c313f4e1e3f4e323d573b556024496032
+3f4e1e354c313a44233a44232f3c22262e35272c1f2b3322354c314960327c9053
+8e9f3b7197537b903476872d60832a5e74295e74293d5f253d5f2549601f4b6933
+656c265e742968752b4b6933344d1e47581f2f3c222f3c222f3c22383c23272c1f
+3c5822344d1e49601f547428576a1f41671b2f3c222f3c22304321272c1f272c1f
+272c1f342d1f272c1f24261c24261c342d1f24261c24261c24261c24261c24261c
+2f3c22304321344d1e272c1f2b33222f3c223043212f3c22272c1f272c1f24261c
+272c1f1e241b272c1f24261c24261c272c1f272c1f272c1f24261c272c1f342d1f
+2b3322443623766427887b2c957c2f84712f978834ad903dae993dae993dae993d
+c0a153c0a153ccb169c0a845c0a153ccb169c4a979c2a85ec2a85e9f98358b9033
+a0a03aa1a73ca0a03a8e9f3b8c9835556024344d1e2b332247581f304321333522
+333522342d1f272c1f2b3322272c1f383c23383c2366592c87872c757b2d887b2c
+84712f887b2c84712fa48954b2a053ae993d9f90359f9035b2a053c4a979c0a153
+ccb169c4a979ccb169c4a979c0b197c0a153c4a979c4a979c4a979ccb169ccb169
+c4a979c4a979c4a979c2a85eb2a0539e98539e985387872c77874676872d767b47
+697c2b68752b576a1f576a1f5f7b2a697c2b576a1f5e7429697c2b5e7429697c2b
+3d5f2549601f5e74294b681e5e742947581f3a44232b3322304321344d1e333522
+2b33222b3322576a1f5560244b693349601f3043212f3c223f4e1e3a44233f4e1e
+4b681e49601f576a1f656c26556024666b3b766e2d3f4e1e666b3b55602468752b
+657c44697c2b5e7429778746697c2b5558243f4e1e3f4e1e3f4e1e383c23333522
+3f4e323f4e1e5f7b2a47581f47581f3a44234b681e576a1f3a442324261c24261c
+24261c24261c272c1f24261c24261c342d1f3a44234e4425333522383c23342d1f
+342d1f44362347581f4e44254436234e4425383c23342d1f24261c443623565838
+74643e4e442524261c2b33223f4e1e5e74294b681e5560246b852c76872d757b2d
+7787468b905586874a86874a757b2d757b2d778746757b2d666b3b443623342d1f
+24261c342d1f24261c1c1e191c1e1924261c24261c24261c342d1f1c1e19342d1f
+342d1f443623443623342d1f342d1f443623443623333522342d1f4436234e4425
+3335224e4425766427887b2cc0a845c0a153b09954847144c2a85eae993dc0a153
+ae993dc0a153ae993dae993db099549f90359f9035ae993d9f98359f9835b09954
+9f9035b2a053ccb169c3c17ac2b868d1b876d0c074d1b876cdb85ed1b876d1b876
+c1b064d0c074bfb04dc2b868beb751cdb85ec4bf65c2b868cdb85ec4bf65beb751
+c4bf65c4bf65d4cb83d4cb83d0c074c3c17ac4bf65c3c17ac3c17ac4bf65cdb85e
+d1b876c1b064c2b868c2a85ecdb85ec4bf65c2b868beb751beb751b1af4db1af4d
+b0a83fa0a03aae993d8b9033766e2d757b2d697c2b757b2d68752b656c26656c26
+556024576a1f757b2d8c983576872d76872d576a1f656c2655602476872d576a1f
+576a1f576a1f76872d697c2b556024697c2b7b9034757b2d76872d8e9f3b68752b
+5e7429697c2b656c2660832a708f3180a03b7d97369eb74caeb84e8ea83eb1af4d
+2b3322354c31354c31354c31344d1e354c313c58224b6933567f3a4b69334b6933
+4b69335e7429576b334960324960324b6933657c44627444767b476b85455f7b2a
+4973234b69335474433d5f253f4e32304321354c313f4e323a44232f3c224b6933
+5f7b2a4b681e3c5822344d1e47581f3f4e323a44233a44233f4e1e576a1f47581f
+3f4e1e344d1e3043213f4e322b3322272c1f272c1f2b33222f3c225560246b852c
+8c98536b852c708f31697c2b6b852c5e74294973233d5f2549601f47581f49601f
+576a1f49732347581f49601f344d1e3043212b33222b33222f3c222f3c222b3322
+3f4e1e41671b49601f5f7b2a76872d3c582230432154742847581f2b3322272c1f
+3043212b3322272c1f272c1f262e3524261c24261c24261c272c1f3043212b3322
+3c5822344d1e4973233c58222b3322272c1f272c1f24261c272c1f272c1f1e241b
+24261c24261c24261c24261c24261c24261c24261c24261c24261c272c1f24261c
+2b3322342d1f443623574f26604f2a766427604f2a84712f978834ae993dad903d
+c0a153c0a153c2a85ec0a153c0a845c0a845c0a153c0a845c0a153c0a845b0a83f
+b1a03dc0a845c0a153a0a03a87872c5560243c58223043213c58223f4e1e2f3c22
+2f3c223c582249601f49601f3c5822304321333522443623887b2c766e2d87872c
+ad903db09954957c2f887b2c9f90359f98359f9835ae993dc0a153c0a153c0a153
+c0a153c0a153c0a153c4a979c4a979c4a979c4a979c0a153c4a979c4a979c4a979
+c0a153c0a153b2a053b099549e98539f91549e985387872c767b4768752b576a1f
+656c26576b33576b3368752b697c2b68752b576b3349601f576a1f576a1f6b852c
+576a1f4b681e576a1f4b681e55602447581f3a4423383c233f4e1e47581f2b3322
+24261c383c2347581f3f4e1e55602455602430432130432147581f3f4e1e3a4423
+8c9853757b2d5560245e7429576b334b681e576b33555824666b3b576a1f757b2d
+68752b767b47778746656c26666b3b47581f47581f47581f344d1e3a44232f3c22
+344d1e3a442354742860832a576a1f4b681e4758323f4e1e33352224261c342d1f
+24261c342d1f24261c24261c24261c342d1f2f3c22383c23383c233f4e1e383c23
+333522383c235558245558244e4425333522342d1f272c1f33352266603366592c
+4e5043383c2344362333352247581f47581f49601f5558243f4e1e4c5026555824
+565838576b33666033867c4c8c98539fa0569e985386874a766e2d4e4425383c23
+443623342d1f342d1f342d1f342d1f24261c24261c342d1f342d1f342d1f24261c
+24261c24261c443623342d1f342d1f4436234e44254e4425443623383c23666033
+574f26555824887b2c978834bfb04dc0a153ad903d957c2fc0a153ae993dc0a845
+c0a153c0a153c0a153c0a845c0a8459f9035ae993dae993db1a03dc0a845c2a85e
+b2a856c1b064d0c074c4bf65c1b064d1b876cdb85ecdb85ed0c074cdb85ecdb85e
+bfb04dcdb85ec0a845c1b064beb751c2b868c4bf65bfb04dc4bf65bfb04dbfb04d
+beb751bfb04dc4bf65c2b868c2b868c2b868b1b069c4bf65b0b86cc2b868b1b069
+bfb04dbfb04dbfb04dc2a85ec1b064bfb04db1af4db0a83fb2a053b1af4db0a83f
+a0a03ab0a83fa0a03a8b90337b903476872d757b2d576a1f656c26697c2b68752b
+656c26656c26656c2676872d7b903476872d697c2b697c2b6b852c68752b576a1f
+47581f49601f68752b697c2b5f7b2a76872d7b9034757b2d8c98358c9835576a1f
+47581f6b852c68752b7b90348e9f3ba1a73c8e9f3ba1af4eaeb84ea1a73ca1af4e
+3336423a4423344d1e354c31354c313043213f4e3247581f4b693347581f4b6933
+576b335e74294b69333d5f25475832475832576b33576b33627444657c44576b33
+4b69333c58224b69334960323043212f3c22354c31344d1e354c312f3c22496032
+5474284b681e4b69333f4e1e344d1e354c31344d1e475832656c26576b334b6933
+3f4e1e3f4e323a44233a4423262e352b33222b33222f3c222f3c224758325e7429
+708f3160832a697c2b6b852c697c2b49732349732349601f3c58223f4e1e47581f
+4b69335e742949601f55602447581f344d1e2f3c222b3322333522344d1e3c5822
+4b681e60832a4b681e5f7b2a60832a49601f3d5f256b852c41671b304321344d1e
+4b681e304321272c1f344d1e272c1f24261c24261c24261c49601f4973232f3c22
+344d1e30432141671b557f22344d1e24261c272c1f272c1f1e241b3043212b3322
+272c1f2b3322272c1f24261c24261c24261c24261c24261c24261c272c1f272c1f
+24261c342d1f3335224436234436235560244c5026766e2d87872cad903db09954
+c0a153b09954b09954ae993db1a03dae993dae993d9f9835b1a03dc0a153b1a03d
+ae993db2a053b1a03d87872c68752b6b852c5e74294b681e576a1f576a1f49601f
+556024697c2b5e74295f7b2a5e742949601f3a44232f3c2266603368752b957c2f
+95885cae993d9f98359f9035978834ae993d9f90359f9035ad903db09954ad903d
+ad903da48a3bad903dab9158c4a979c4a979c0a153c0a153c0a153b09954b09954
+9f98359e9853b0995487872c9f90359e985386874a757b2d68752b5e742968752b
+656c26656c26576a1f656c2668752b6b852c5e74295560243f4e1e47581f576a1f
+4b681e49601f49601f47581f47581f5560243f4e1e344d1e3f4e1e344d1e2b3322
+333522272c1f3a442330432147581f3c58222f3c223f4e1e344d1e304321666c5e
+d1b89086874a576b33697c2b576a1f656c26697c2b5560245e7429576a1f656c26
+68752b68752b656c26576b3355602449603247581f576a1f49601f3f4e1e47581f
+55602449601f576a1f557f2241671b3f4e1e304321383c23383c2324261c342d1f
+24261c272c1f342d1f272c1f272c1f272c1f24261c333522333522383c23383c23
+3f4e1e4c502647581f574f26333522342d1f2b33223f4e1e66592c847144666033
+574f263335223335222b332249601f49601f4c5026272c1f272c1f333522333522
+342d1f272c1f333522475832867c4c95885c95885c666b3b68752b576a1f555824
+4c50264e3d224e3d22342d1f342d1f24261c1c1e1924261c342d1f24261c24261c
+342d1f24261c4436233335224e3d22574f26766e2d74643e574f264e4425555824
+757b2d766e2d887b2cad903dad903dc0a153a48a3bc0a153ae993dae993dc0a845
+c0a845c0a845c0a845c0a845c0a845ae993dc0a845b1a03dc0a153b1af4dc0a845
+c1b064c1b064c2b868c2b868d0c074c1b064c2a85ec0a845bfb04dcdb85ec1b064
+b1af4dc0a153c2a85ebfb04dc2b868beb751c4bf65c2b868b1af4db1b069b0a83f
+b2a856bfb04db1a03dc2b868b2a856b1af4d9fa857b1b069b2a856b2a856b0a83f
+b2a856b0a83fb1af4db1a03db1a03db0a83fb1af4db1af4da0a03a9f9835b0a83f
+a0a03ab0a83f9f9835a0a03a8b903387872c76872d757b2d5e74295f7b2a697c2b
+76872d697c2b576a1f5e742976872d7b90347b903476872d76872d76872d576a1f
+3f4e1e576a1f697c2b656c267b90347b90348b903376872d8b90338e9f3b7b9034
+576a1f757b2d757b2d7b90349eb74c9f98358c98358c9835aeb84ea1a73ca0a03a
+2f3c22394446354c313a4423373e43394446354c31344d1e354c312f3c22496032
+4960324b693341671b4b6933344d1e3a4423576b334758324758324b69333d5f25
+4b6933354c3147581f496032344d1e4758323d573b3a4423354c312f3c223d5f25
+576b33497323557f2247581f2f3c222f3c224c5026576b33576b334b693347581f
+3f4e1e3a4423383c23383c23272c1f2a34382f3c222f3c222f3c223c5822576b33
+6b852c708f316b85457b9034697c2b576a1f5f7b2a49732341671b475832344d1e
+4758324b69333f4e1e576a1f576a1f47581f344d1e2b33222f3c223d5f2541671b
+60832a708f31557f22557f22557f22557f2241671b557f2249732341671b497323
+4973232b3322272c1f3d5f25344d1e272c1f342d1f2b3322557f2260832a557f22
+344d1e2f3c2241671b557f22344d1e2f3c22304321344d1e3043213d5f25304321
+30432149601f272c1f24261c24261c24261c24261c24261c24261c24261c272c1f
+24261c272c1f342d1f2b3322333522383c233a4423556024757b2d957c2f9f9035
+978834ae993dae993dae993dae993d9f9835ae993d9f9035978834957c2fae993d
+ae993dae993dae993d9f98358b90339f9035757b2d556024656c263f4e1e3a4423
+3a44235558245558245560243f4e1e49601f3f4e1e3043213a4423556024666033
+7664279f90359f9035ae993d9788349f90359f98359f90359f90359e98539f9035
+87872c9f9035b09954b09954ad903db09954b09954b09954b09954b2a053ae993d
+9f98359f90359f9035766e2d87872c86874a76872d757b2d757b2d697c2b697c2b
+697c2b68752b697c2b757b2d77874668752b757b2d576b3347581f47581f5f7b2a
+576a1f576a1f5f7b2a5e74294b681e5e742968752b5560243f4e1e3a4423344d1e
+3f4e1e272c1f2f3c2249601f4b681e47581f3f4e1e3f4e1e3f4e1e3043218b9080
+d8c291857d67555824576a1f697c2b697c2b5f7b2a6b852c697c2b656c26656c26
+76872d68752b697c2b5f7b2a49601f49601f3f4e1e576b3347581f30432147581f
+576b334b681e4b681e576a1f576a1f5e7429697c2b47581f4e4425272c1f24261c
+24261c342d1f272c1f272c1f24261c24261c24261c342d1f342d1f3335223a4423
+47581f47581f55582433352224261c342d1f33352268752b95885c857d67666b3b
+4436234e3d22443623333522574f26383c23383c23342d1f24261c272c1f24261c
+272c1f272c1f3335224c5026556024656c26555824555824556024576a1f666b3b
+4c5026574f264e4425443623342d1f342d1f342d1f342d1f24261c342d1f342d1f
+443623443623574f264e3d22666b3b84712f957c2f978834766427766427766427
+887b2c887b2c887b2cc0a845bfb04dc0a153ad903dccb169c0a845c0a153ae993d
+cdb85ec0a845b0a83fb0a83fb1a03dc0a845b1a03dc0a845c0a845c2b868b1a03d
+bfb04dcdb85ec1b064c1b064d0c074c1b064c0a845b1a03dc1b064c2b868c2b868
+b1af4db1a03dc1b064b2a053c1b064b1af4db1b069bfb04db1a03da0a03aa0a03a
+b0a83f9f9835978834b2a856a0a03aa1a73c8c98538e9f3b9fa0569f9835a0a03a
+9f98358c9835b0a83fa0a03a9f98358b90339f9835a1a73c8c98358e9f3bb0a83f
+a0a03aa0a03a9f98359f98358c98358b903387872c76872d697c2b60832a76872d
+60832a5e742976872d76872d6b852c76872d8c98358c98357b90348c9835697c2b
+5e742968752b68752b757b2d8b90338b90338c98358c98358b90338e9f3b8b9033
+76872d76872d697c2b87872cb1af4d8c98358b90337b9034a1af4eaeb84eb1af4d
+2b33222f3c223043212f3c223335222f3c223a44233043212f3c222f3c223f4e32
+3d5f253c58223d5f25496032354c3130432156603a49603249601f576b334b6933
+47581f3a44233d573b4758323f4e323a44233a44233043213043212f3c223a4423
+3f4e1e4758324b693341671b3043212b3322333522333642383c233f4e323f4e1e
+3043212f3c222f3c222f3c223335222f3c222b33222f3c22304321304321547428
+6b85456b852c76872d7b903460832a557f225e7429576b3349601f3c58223a4423
+3f4e323f4e1e344d1e4b681e5474284b681e4b681e344d1e3043213c582241671b
+557f22708f316b852c557f22557f2260832a557f22547428557f224973236b852c
+557f22344d1e2f3c2241671b3c58222b33222b3322344d1e708f31557f22719732
+3c5822304321497323557f223d5f2541671b49732341671b344d1e344d1e2f3c22
+344d1e3f4e1e24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c272c1f24261c342d1f3335223335224e4425656c26766e2d84712f
+978834978834ae993d9f98359f98359f9835ae993d9f9835978834978834b1a03d
+ae993dae993dae993dae993d87872c6660335558243f4e1e3a44233a44232b3322
+3335223a4423383c233335223f4e1e3f4e1e4c50264c502647581f555824556024
+84712f978834a48a3b9f9035a48a3b9788349f9035b1a03db2a053c2a85eb2a053
+9f98359f98359f9035ab9158978834ab9158ad903dab9158ad903dad903d9f9835
+b099549f98359f983576872d7b903487872c757b2d757b2d76872d757b2d68752b
+68752b68752b757b2d68752b68752b757b2d697c2b656c26576a1f49601f576a1f
+576a1f547428697c2b49601f49601f697c2b576a1f68752b47581f4c502647581f
+49601f4c5026383c23576a1f49601f5e74294973233f4e1e3f4e1e5558249ea08a
+ada17f66603347581f47581f47581f576a1f5e7429757b2d68752b576a1f666033
+656c265e74295e7429697c2b5f7b2a5e74294b681e47581f5560242f3c22344d1e
+576a1f5e7429576a1f576a1f47581f576b3349601f2f3c222f3c22342d1f24261c
+342d1f3a4423342d1f33352224261c24261c24261c272c1f342d1f3335223a4423
+4c50263a44234e4425342d1f272c1f272c1f443623666033847144666b3b4e4425
+3335224e3d224e44254e3d22333522342d1f3335222b3322342d1f24261c272c1f
+24261c24261c2b3322574f26556024656c2647581f3f4e1e3a44233a44233f4e1e
+666033666033604f2a443623443623342d1f24261c342d1f342d1f342d1f443623
+4e44254e4425766427666033766e2d887b2c978834ad903d978834957c2f84712f
+ae993d9f9035b1a03dc0a845bfb04dc0a845ae993db1a03dc0a845ae993dc0a845
+c0a845bfb04d9f9835b1a03db1a03db0a83fb0a83fb0a83fc0a845c2b868b2a856
+beb751b2a856c1b064b2a856c2b868b0a83fc2b868b1a03db1af4dbfb04dbfb04d
+b2a856b0a83fc2a85eb2a856b2a856c2b8689fa857b0a83fb2a0538c98358b9033
+9f91549f9835757b2d8b90339f98358e9f3b8b90338b90339e98537b90348c9835
+7b903476872d8e9f3b9f98357b903476872d8c98358c98358c98358c98358e9f3b
+a0a03a8b90338c98359f98358c9835a0a03a8e9f3b8b9033697c2b60832a7d9736
+5f7b2a697c2b5f7b2a76872d6b852c697c2b7b90347b90348c98358c9835a0a03a
+8b903376872d8b9033b0a83fb1af4da0a03aa0a03a9f9835a0a03aa1af4e8c9835
+87872ca0a03a8e9f3ba1a73cb0a83f9f98358ea83e8e9f3ba1af4ea1af4eaeb84e
+2a34382f3c2230444d2f3c223335222e3c443f4e32373e432b33222a3438475832
+3c58223d573b3c58224b6933475832344d1e49601f576b33576b33697c2b4b6933
+3f4e1e2f3c22354c31354c313043212e3c442b3322383c233043213043212e3c44
+342d1f2f3c22304321354c31354c31272c1f272c1f24261c2b33223f4e32344d1e
+394446383c232f3c222a3438342d1f2f3c222f3c222f3c22304321354c3141671b
+6b85457b90346b852c6b852c697c2b5e74295e742947581f354c313043213a4423
+2f3c22272c1f344d1e576a1f4b681e3f4e1e49601f3d5f2549601f47581f344d1e
+49601f5f7b2a6b852c60832a60832a6b852c41671b3c582249732349601f41671b
+4973233c5822344d1e3d5f2541671b3d5f252f3c223c5822557f22557f22719732
+41671b3d5f253d5f25708f3149601f3c58224973233c58222f3c222b3322304321
+3c5822304321272c1f24261c272c1f24261c24261c24261c24261c24261c24261c
+24261c24261c272c1f272c1f24261c272c1f2b3322443623555824666033766427
+766e2d84712f84712f84712f9f9035ad903dae993d9f90359f90359f9035ae993d
+ae993d9f98359f98359f98356b852c4c50263a44233f4e1e4b681e576a1f3f4e1e
+3f4e1e556024576a1f576a1f656c26656c26656c2668752b68752b697c2b757b2d
+887b2c978834ad903dae993da48a3b9f90359f9835bfb04dc1b064ccb169c2a85e
+b2a053b2a053ae993d9f903587872c9788349788349f9154ae993d9f91549f9835
+9e98539f98359f98359f98359f98358b903376872d757b2d76872d76872d778746
+5e7429576a1f666b3b666033576a1f757b2d5e7429656c26556024576a1f556024
+47581f344d1e5560244c502649601f576a1f576a1f5f7b2a68752b556024656c26
+576a1f3f4e1e3a442349601f4b681e4b681e4b681e47581f3a4423565838aea886
+95885c4e44254b681e47581f304321556024697c2b68752b867c4c7c9053556024
+4c502649601f576a1f656c26697c2b68752b576b334b681e656c26576b3347581f
+4b681e576b333a44234e44253f4e1e68752b3f4e1e3a44233a4423333522272c1f
+2f3c223f4e1e3a44233a4423342d1f272c1f24261c272c1f342d1f333522333522
+333522333522272c1f24261c24261c342d1f66592c604f2a604f2a5658383a4423
+383c234436234e3d22383c23272c1f342d1f342d1f2b3322342d1f342d1f24261c
+272c1f24261c383c23383c23383c235560243f4e1e4e4425383c233335223a4423
+555824766e2d66592c604f2a4436234e3d22342d1f342d1f342d1f4436234e4425
+66592c766427957c2f84712f957c2fa48a3bad903d9f9035a48a3b957c2fa48a3b
+b1a03dae993dbfb04dccb169c0a153c0a845b1a03dc0a845c0a845b1a03db0a83f
+9f9835bfb04d9f9835a1a73cb0a83fa0a03ab0a83fa0a03ab0a83fb1af4db0a83f
+8ea0599fa056b2a856c2a85eb2a856a0a03ac2b868a0a03ab2a856b2a856bfb04d
+9f9835b2a856b0a83fae993db2a856b2a8569fa0568b90339f903576872d6b852c
+757b2d757b2d757b2d757b2d697c2b697c2b697c2b5e7429757b2d5e74296b852c
+5e74294b681e757b2d76872d76872d68752b697c2b76872d7b90347b90348c9835
+8c98358b90338c98358e9f3b8e9f3b8e9f3ba0a03a8e9f3b8b90337b90347d9736
+7d97367d973676872d7b9034708f316b852c7d97367b90348c9835a0a03ab0a83f
+b1a03da0a03a9f9835beb751beb751beb751b2a8569fa056b0a83fa1af4e8e9f3b
+76872db0a83f9fa857afbf77b1af4da1a73c8ea83ea1af4ea1af4ea1af4eaeb84e
+373e432f3c222f3c222a34382b3322354c314758323043212b3322354c314b6933
+41671b3d5f253c5822576b3349603249603247583255602456603a666b3b3f4e1e
+2e3c44342d1f2f3c222f3c22383c2324261c262e35342d1f2a3438383c232b3322
+262e35342d1f333522383c23262e3524261c24261c272c1f272c1f2f3c22304321
+3f4e323a44232f3c222f3c222b3322333522354c313043212f3c223043213f4e1e
+5f7b2a7b903476872d576b33496032383c23344d1e3f4e1e3a4423304321475832
+2f3c22333522344d1e576a1f49601f3a44233a44233a44233f4e1e383c23383c23
+2f3c2249732360832a71973271973260832a49732341671b3c58223d5f253c5822
+49732341671b4973233d5f2549732341671b2f3c223d5f2554742849732360832a
+3d5f25497323497323708f313c5822344d1e344d1e344d1e2b33222b3322304321
+344d1e2f3c223a4423272c1f272c1f2b332224261c272c1f24261c24261c24261c
+24261c24261c24261c24261c24261c24261c24261c2b3322383c23383c23383c23
+574f264c50264e4425383c2366592c666033887b2c84714476642784712f84712f
+957c2f87872c8b90338b903376872d5e742949601f4b681e697c2b697c2b576a1f
+576a1f576a1f757b2d757b2d76872d87872c87872c9f9835b1a03d9f903587872c
+9f9035ae993dad903da48a3b9f90359f90359f9035b09954c0a153b2a053b2a053
+b2a856b099549f98359f98359f98358b90338b90338b90339f90359f98359f9035
+9f90358b90338b90339f98358b90338b90338b90339788348b903376872d757b2d
+68752b55602455602466603355602468752b68752b576a1f5560245560243f4e1e
+47581f3f4e1e49601f47581f3a442347581f576a1f4b681e576a1f4b681e656c26
+55602449601f3a4423576a1f4b681e576a1f5e742949601f3f4e1e656c26aea886
+6660334e44255e74293c58223f4e1e556024576a1f3a44235560245560243f4e1e
+3f4e1e3f4e1e4c50265558245560246b852c576a1f4b681e5e742986874a778746
+576a1f4e4425383c23475832383c2355602447581f576a1f5560243a4423383c23
+3a4423383c23383c23383c23272c1f342d1f342d1f333522342d1f333522333522
+342d1f272c1f342d1f24261c24261c3a4423767b475558243f4e1e3a4423555824
+383c23383c232f3c22383c232f3c223f4e1e2b3322342d1f342d1f333522342d1f
+24261c333522443623342d1f383c23574f26383c23383c23342d1f342d1f333522
+3335224e3d2274643e4e44254436234e3d22342d1f342d1f383c23443623555824
+76642787872c957c2f887b2c887b2c957c2f978834b1a03dae993da48a3b9f9835
+b0a83fc0a845c0a845bfb04db0a83fb1a03dae993dc0a845b1a03da0a03a9f9835
+9f9835a0a03a8c9835a0a03aa0a03ab1a03db0a83fb1af4d9f9835b0a83fa1a73c
+a0a03aa0a03aa1a73cb1af4d9f98359f9835b2a856b2a053a1a73c9fa056a0a03a
+8b9033a0a03a9fa0569f98359e98539e98539e9853778746757b2d767b47656c26
+68752b656c26697c2b5e74295474285f7b2a576b334b681e4b693349601f576a1f
+49601f49601f4b681e576a1f68752b576a1f5f7b2a76872d76872d76872d7b9034
+7b90347b90347d973680a03b80a03b8c98358e9f3b8c98357d97367b90347b9034
+8e9f3b7d9736708f317b90348c983576872d7b9034757b2d8c98358e9f3ba1a73c
+b2a8569f9835b1a03dc2b868beb751b2a856b0a83f9fa857aeb84eb1af4d8ea059
+7d9736b1af4db1af4dc2b868a1a73cb1af4db1af4db1af4daeb84ea1a73caeb84e
+2f3c22304321354c31373e432f3c223c58224b69333f4e322f3c224960324b6933
+4b693341671b3c58223d5f253f4e1e354c31383c233a44233a44235658382f3c22
+333522262e352b33223335222a3438272c1f262e35272c1f262e352b3322262e35
+262e352b3322333642333522342d1f24261c262e3524261c272c1f3335222f3c22
+2f3c223a44232f3c222e3c442b33223335223f4e323043213a4423344d1e49601f
+5f7b2a6b8545697c2b4b693347581f383c232f3c223043213a44232f3c223a4423
+3043212b33223f4e1e47581f49601f3a44232f3c222f3c223043212f3c224c5026
+3043213d5f25557f2260832a719732708f31497323557f22497323497323344d1e
+3c582249732341671b41671b4973233d5f252f3c22344d1e41671b557f22708f31
+41671b49732360832a708f313c58223c582241671b4973233d5f25344d1e3d5f25
+3d5f25344d1e3c58222f3c22344d1e383c23342d1f272c1f24261c24261c342d1f
+24261c24261c24261c24261c24261c24261c24261c342d1f272c1f342d1f272c1f
+24261c342d1f272c1f342d1f342d1f342d1f443623383c23443623383c234e4425
+3a44235560247b90347b90346b852c697c2b55602447581f3f4e1e555824555824
+4c502647581f656c26656c269f9835a0a03aad903db09954c0a845c0a153b0a83f
+ae993dc2a85ec0a153ae993db09954ad903da48a3bad903d9f91549e9853b09954
+b2a8569e98539f91548b90338b903387872c9f98358b90339f98359f98359f9035
+9f903597883487872c87872c87872c8c98358b90339f91548b903376872d68752b
+757b2d656c264b681e556024556024656c2668752b576a1f576a1f656c263a4423
+3f4e1e3f4e1e5560243a44233335223a442349601f3c58223c58223c582268752b
+5560243f4e1e3f4e1e68752b4b681e55602455602449601f4c5026767b47aea886
+5560243f4e1e55602447581f47581f576a1f47581f3a442349601f576a1f49601f
+55602447581f47581f3f4e1e55582468752b68752b656c264b681e4c5026627444
+5560243a44233f4e1e3f4e1e3a44234c50263a44234c5026576a1f47581f3f4e1e
+49601f383c232b3322342d1f24261c24261c272c1f333522342d1f443623383c23
+342d1f24261c24261c24261c342d1f666b3b77874668752b5560243043213f4e1e
+3335223335223a44233a44233f4e1e556024383c232b3322333522383c23443623
+272c1f3335223a4423333522342d1f333522333522342d1f24261c24261c333522
+4e3d22443623604f2a604f2a4e3d224e3d224e3d22342d1f604f2a4e4425766e2d
+68752b757b2d87872c9f9035757b2d9f90359f9835a0a03ab1a03db1a03db1a03d
+9f9835bfb04dbeb751bfb04db1a03db0a83fa1a73cb0a83fb0a83fa0a03a9f9835
+8c98358c98358c9835a0a03aa0a03aa0a03a8c9835a1af4e9f9835b1af4d9e9853
+8c98359f98359f98359fa8579f90358b9033a1a73c9f98359f98358c983576872d
+76872d8b90339e98537b903487872c76872d76872d68752b576a1f576b33547428
+576b3349601f5e7429576a1f3d5f2549732347583249601f3d5f253d5f253d5f25
+3d5f253c58223d5f253c582255602449601f576a1f5f7b2a76872d6b852c708f31
+6b852c7b90346b852c76872d708f317b903476872d8c98357b903476872d778746
+7b90347b90347b90347b90347b90348b90337d97368c98359f9835a0a03a9fa857
+b1af4da1a73cb1af4dc1b064b1b069a1a73cb2a8569fa857b0b86caeb84ea1af4e
+8ea0599fa857b1af4da1b170a1af4ea4bb7eaeb84ea1b170aeb84e9fa857a1af4e
+304321394446354c313a4423394446496032547428475832475832576b33547428
+4b69334b6933344d1e3f4e323a44232f3c222a3438342d1f2a34383a44232f3c22
+2f3c222f3c223335222e3c44383c232b33223335222b3322262e352b33222f3c22
+2b33222a34383335222b3322262e35272c1f342d1f2b3322333642304321373e43
+3043212f3c223a44233335222b33222f3c223f4e322f3c22354c313f4e32547428
+5e74295e74294960323a442347583247581f3f4e322b3322262e35342d1f2b3322
+2b3322342d1f30432147581f3a44232b33222b33222f3c222f3c222f3c22344d1e
+344d1e3c582241671b719732708f3171973260832a557f2260832a557f223d5f25
+3d5f2549732341671b41671b557f22344d1e344d1e304321497323497323557f22
+41671b49732360832a60832a41671b497323557f22497323557f22497323547428
+3d5f25344d1e344d1e3043214b681e3043212b33222b3322342d1f24261c342d1f
+272c1f24261c24261c24261c24261c24261c24261c24261c272c1f24261c24261c
+272c1f24261c24261c24261c24261c24261c272c1f24261c272c1f342d1f272c1f
+342d1f4e4425656c2655602468752b5558243f4e1e383c23342d1f342d1f4e4425
+3043213335223a44234c5026656c26978834887b2c887b2c9f9035a48954978834
+978834ae993db09954b2a053ae993d978834a48a3ba48a3b978834ad903db2a053
+b2a8569e98539f90359f90359f98358b90339f90359f90359fa0569f98359f9835
+a48a3b87872c9f903576872d9f98358b90338b90338b903387872c887b2c76872d
+757b2d68752b656c2655582468752b576a1f656c26656c26656c26576a1f3a4423
+3a44233335223f4e1e3335223335222f3c2249601f47581f41671b3f4e1e49601f
+49601f3f4e1e3f4e1e4b681e47581f49601f47581f47581f3f4e329e98539f9154
+4e3d22383c233043212f3c224c502647581f47581f41671b5f7b2a68752b576a1f
+556024576a1f576a1f47581f496032576a1f5e74294b681e4c50263a4423383c23
+3f4e1e47581f49601f3c582247581f49601f3f4e1e576a1f47581f49601f4b681e
+47581f3a44232b3322333522272c1f272c1f342d1f24261c333522333522333522
+333522272c1f272c1f3335223a442368752b68752b697c2b576a1f47581f47581f
+3a442347581f47581f3f4e1e556024576a1f576a1f383c233a44234c50263f4e1e
+3a44233a4423383c23342d1f24261c24261c24261c342d1f24261c24261c342d1f
+3335224436234e4425604f2a4436234e4425443623443623576a1f4c5026656c26
+757b2d87872c8b90339f98358b90339788349f98358c9835a0a03aa1a73c9f9835
+8e9f3bb0a83fb0a83fb1af4da0a03aa0a03aa0a03ab0a83fa0a03a9f983587872c
+87872c7b90347b90348ea83e8ea83e9f98358c98358e9f3b8c9835a1a73c8e9f3b
+8e9f3b7b90348e9f3ba0a03aa0a03a76872d8e9f3b9f90358c98358b903368752b
+7b903476872d8b903386874a6b852c656c26576a1f4b681e4b681e4b681e576b33
+4b681e49601f5560244960323c58224b69333c5822344d1e344d1e344d1e3c5822
+3c58223d5f253d5f253d5f254b681e49601f49732354742868752b697c2b6b852c
+697c2b6f8f52697c2b5f7b2a60832a6b852c6b852c7b903476872d60832a6f8f52
+6b852c6f8f5276872d76872d8c98357d97368c98358c98358ea0598c9835a0a03a
+b0b86c9fa857b2a856c4bf65a1af4e9fa8579fa8578ea059a1af4e9fa857b0b86c
+a1af4eaeb84ea1af4e9eb74c9eb74cafbf77a4bb7ea1af4e9eb74ca1af4e9fa857
+3043213a4423354c313f4e323a44234960324b69333f4e324960325e7429496032
+344d1e496032344d1e4960323a44232f3c22333522262e35333522373e432e3c44
+2f3c22354c312f3c223a4423373e432f3c22373e432f3c222b33222f3c22304321
+2f3c222f3c222a34382b3322262e35272c1f3336422b3322383c23354c313a4423
+2f3c223a44232e3c442b3322383c233a44234c50263a44233f4e323c582247581f
+47581f55602447581f2f3c223f4e3249601f4758322b33222b33222b3322272c1f
+333522262e35333522354c31333522272c1f3a4423344d1e2f3c22304321304321
+344d1e3c58223d5f2560832a557f22497323557f22557f2260832a557f2241671b
+41671b60832a49732341671b41671b344d1e344d1e344d1e30432141671b708f31
+3d5f25497323497323557f22547428497323557f223c5822557f224973235f7b2a
+344d1e3c5822344d1e30432149601f3f4e1e30432147581f2f3c222b3322333522
+272c1f24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c272c1f24261c24261c272c1f272c1f272c1f24261c24261c24261c272c1f
+272c1f383c233f4e1e4e4425576a1f3f4e1e3f4e1e2f3c222b3322383c233f4e1e
+3a44233a44233043213a442349601f76872d766e2d656c26576a1f766e2d656c26
+656c26766e2d887b2c887b2c887b2c666b3b76642776642774643e766427a48954
+97883484712f97883486874a97883497883486874a84712f867c4c957c2f867c4c
+a48a3b97883497883487872c87872c97883487872c8b903386874a87872c76872d
+87872c757b2d697c2b5560244c50265558245e742968752b4b681e5558243a4423
+3a4423383c232f3c222b33223335222f3c2247581f49601f576b334b681e4b681e
+4b681e47581f3f4e1e47581f3f4e1e49601f49601f3c582247581fa1b17095885c
+342d1f272c1f24261c342d1f342d1f383c2347581f49601f547428576a1f5e7429
+576a1f49601f576a1f49601f47581f47581f5560245560243f4e1e4c50263a4423
+3a4423556024556024344d1e3a44233f4e1e55602454742847581f49601f576a1f
+47581f3a44233f4e1e2f3c222b332233352233352224261c342d1f272c1f333522
+333522383c23272c1f3a4423556024576a1f576a1f68752b68752b49601f49601f
+3f4e1e576a1f3f4e1e3a442349601f556024576a1f55602447581f576a1f4b681e
+656c2668752b5560243a4423342d1f24261c24261c24261c342d1f24261c333522
+4436234436234e44254e4425443623574f263a44233a4423656c26656c26757b2d
+757b2d8b903387872c9f983587872c87872c8b90338c98358b9033b0a83f87872c
+a0a03aa0a03aa0a03ab1af4da0a03a9f9835a1af4ea0a03aa1a73c8e9f3b8c9835
+8c98357b90347b9034a0a03a8ea83e87872c8b90337d973676872d8b90338c9853
+8c983576872d8c98358c9835a0a03a7b90348e9f3b8c98357b9034697c2b5e7429
+76872d708f31778746697c2b697c2b4b681e47583247581f3d5f2541671b49601f
+4b681e3d5f2549601f496032344d1e41671b3d573b344d1e3c5822344d1e3c5822
+344d1e3c58223d5f253d5f253d5f2549601f4b6933547428697c2b60832a5f7b2a
+576b335f7b2a5f7b2a5f7b2a5f7b2a567f3a60832a6b854560832a697c2b60832a
+5f7b2a6b85457b90347d97367b90347f97537197328e9f3b8e9f3b8c98538b9033
+8e9f3b9fa8579fa8579fa056a0a03aa1af4eb1b069a1a73c9fa8579fa857a1af4e
+a1af4ea1b1709fa857a1af4ea1b170a4bb7e9eb74c9fa056a1af4ea1b17091af49
+354c313043213f4e323a44233f4e323d573b4b693347581f3f4e32576b33475832
+3c58223d5f25344d1e4758323c5822354c312f3c222b33222a3438342d1f2a3438
+304321344d1e344d1e3f4e323043213335223335223a44233944463d573b4e5043
+2f3c223043212f3c222b3322272c1f2b33222b33222f3c223a44233a4423354c31
+3a4423383c23333642342d1f33364233352230432133352230432149601f475832
+3a44234960323f4e1e3a44232f3c2249601f47581f2f3c223043213944462b3322
+2f3c222b33222f3c222f3c222b3322383c23344d1e304321344d1e344d1e3f4e1e
+41671b344d1e497323557f22557f2241671b497323557f2260832a497323497323
+49732360832a49732349732341671b3043213c5822344d1e2f3c223c5822719732
+41671b49732341671b5f7b2a5474284b681e49601f3c582249601f4b681e557f22
+4b681e557f224b681e41671b41671b49601f344d1e4b681e49601f3c5822304321
+272c1f262e35272c1f24261c24261c24261c1c1e19342d1f1c1e19342d1f24261c
+24261c24261c24261c272c1f24261c24261c24261c24261c24261c272c1f1e241b
+272c1f342d1f342d1f383c23576a1f3f4e1e3f4e1e344d1e333522383c2347581f
+47581f49601f49601f3f4e1e4b681e5e7429656c26757b2d697c2b697c2b576a1f
+656c2647581f766e2d656c2668752b574f26604f2a604f2a383c234e4425556024
+666033574f26574f26604f2a66592c666033574f264e44254e4425574f26604f2a
+604f2a666033766e2d766427766427766e2d766e2d757b2d87872c87872c87872c
+778746757b2d757b2d5558243f4e1e3f4e1e5558245560245558243f4e1e333522
+383c233a44232f3c223335223f4e1e3a44233f4e1e47581f5e7429576a1f576a1f
+656c264b681e49601f49601f2f3c223a44235560243f4e1e4e50439a917874643e
+342d1f272c1f24261c24261c2f3c223a4423344d1e47581f4b681e5e7429697c2b
+4b681e47581f576a1f4b681e49601f49601f4b681e49601f3f4e1e47581f49601f
+47581f656c265560243f4e1e2f3c222b33223f4e1e4c502647581f3a442349601f
+49601f49601f49601f2f3c223a44233a4423342d1f272c1f24261c24261c2b3322
+4c50263043213a44233f4e1e47581f576a1f47581f5e742968752b55602449601f
+5560245e742947581f3f4e1e3f4e1e47581f576a1f576a1f576a1f68752b576a1f
+5e7429576a1f576a1f4e442524261c342d1f342d1f24261c24261c342d1f342d1f
+383c23383c234e44253f4e1e383c234e44253a44235560245e742968752b656c26
+757b2d76872d7b90347d97367b9034757b2d76872d8b90338c98358e9f3b87872c
+8c98358e9f3ba0a03aa0a03a8e9f3b8c9835a1a73cb1af4da1a73c9f98359f9835
+8c9835a0a03a8e9f3ba1a73c8e9f3b8c98358b9033778746708f31697c2b7b9034
+76872d76872d76872d87872c8c983576872d8c98358e9f3b76872d557f2260832a
+557f2260832a697c2b697c2b5f7b2a3c58223c58223c5822344d1e4758323d5f25
+3d5f253c58223c58223c58223c58223d573b344d1e344d1e344d1e344d1e3c5822
+3c58223d5f253c58223c582249601f4b681e4b681e576b33576b335e74295e7429
+4b681e4960324973235e74295f7b2a5e74296b85456b852c5e74295f7b2a657c44
+547428708f316b85457787465f7b2a6b85457787467b90347b90348c98537b9034
+8b90338e9f3ba1a73c9fa8578c98358ea0599fa8579fa8578c98359fa0569fa857
+b1af4da1af4ea1b170a1af4ea1af4eafbf77a1b170a1af4e92a7599eb74ca1af4e
+3a44233043213944463a44234e50433a44234b69333f4e1e3c58224b69333f4e1e
+3c58224960323c58223f4e3247581f4758322f3c222f3c22354c31272c1f342d1f
+354c31354c31354c313f4e322f3c222b3322262e353944463f4e324758323f4e32
+2f3c223a44233043212f3c22262e352b33222b33222f3c223043213f4e323f4e1e
+3a44232a34382b3322342d1f262e35272c1f3335222a34383043213d5f25475832
+3f4e1e4c502649601f3f4e322f3c2247581f4c5026383c232b33223f4e32304321
+3043213a442349601f2f3c2233352247581f3f4e1e3f4e1e49601f49601f4b681e
+60832a3c582249732341671b497323497323497323557f2249732360832a497323
+4b681e6b852c41671b60832a557f223d5f2541671b3c582230432130432160832a
+5474284973233c582241671b49601f3c5822344d1e4b681e3d5f253c5822557f22
+4b681e5f7b2a49601f49601f3d5f253d5f2530432149601f49732341671b3d5f25
+2f3c22272c1f272c1f24261c24261c24261c272c1f24261c1e241b24261c342d1f
+24261c272c1f272c1f24261c24261c272c1f24261c1e241b24261c272c1f24261c
+272c1f272c1f2b33222f3c2249601f47581f3f4e1e3c58223f4e1e2f3c223f4e1e
+3a442347581f4b681e49601f49601f5474284b681e656c26697c2b6b852c576b33
+5e742955602466592c556024576a1f3f4e1e4c50263f4e1e383c23383c233a4423
+383c233a4423383c23333522333522342d1f33352224261c342d1f342d1f342d1f
+342d1f383c233a44233a44234e4425574f264c5026656c2668752b75704d757b2d
+757b2d656c26766e2d5558244c50263a44234c50265560243f4e1e3f4e1e3a4423
+3a44233f4e1e383c233a44233f4e1e3a4423383c233043213f4e1e47581f49601f
+55602455602455602447581f3043212f3c225560243f4e1e3a4423867c4c4e4425
+24261c272c1f272c1f342d1f3a44233a44233f4e1e47581f4b681e5e74295e7429
+4b681e49601f4b681e4b681e49601f49601f5560244c502647581f3f4e1e555824
+4c5026656c26574f264c50263f4e1e383c23383c232f3c225560242f3c223f4e1e
+49601f576a1f576a1f47581f3f4e1e2f3c22272c1f272c1f24261c342d1f333522
+47581f47581f49601f4b681e555824576a1f576a1f656c26656c2649601f49601f
+656c26697c2b656c26556024556024556024576a1f576a1f576a1f5e742968752b
+68752b5558243a4423342d1f272c1f342d1f342d1f342d1f342d1f4436234e3d22
+4e44253a4423383c233a44233043213a44233a44234b681e5e7429576a1f5e7429
+68752b697c2b697c2b76872d7b903476872d708f3176872d76872d8b903376872d
+76872d9f98358c9835a0a03aa0a03a7b90348e9f3ba1a73cb1af4da1a73ca1a73c
+8e9f3baeb84ea1a73c9fa857b1af4d9fa8577b9034697c2b6b854568752b697c2b
+6b852c5f7b2a5f7b2a6b852c7b903476872d697c2b76872d76872d60832a5f7b2a
+576a1f5e7429697c2b5e74294973233f4e1e344d1e344d1e344d1e4758323c5822
+3d5f25344d1e3c5822344d1e344d1e344d1e344d1e344d1e354c31344d1e3c5822
+3c58223c58223c58223c58223d5f25576b334b693349732341671b547428547428
+576b33656c264b6933576b335f7b2a5e74295e7429567f3a5f7b2a497323576a1f
+547443697c2b6b852c697c2b576b3360832a7787466b852c76872d8c98538c9835
+8b90338c98538ea0598c98357b90347d97368c98358e9f3b7d973680a03b8e9f3b
+9fa8579fa857a1af4e92a759b0b86cafbf77a1af4e9eb74c95af7a9eb74c95af7a
+2f3c222e3c442f3c22475832496032354c31576b333d5f254758324b69333d5f25
+4960324b69333d5f25344d1e344d1e4758323043212f3c22354c312a34382a3438
+3a4423304321344d1e3f4e32304321262e35342d1f383c23465864496032496065
+3043213c5822354c313335223335222f3c222b33223335222f3c222f3c22354c31
+3a44232f3c222b33222b332224261c262e35342d1f2b33223a44234960323f4e1e
+4758323f4e1e49601f47581f3f4e1e47581f3f4e1e2f3c222b3322354c31304321
+354c313f4e1e576a1f47581f3a442349601f3d5f2549601f49601f49601f49601f
+4b681e3d5f2541671b557f2249732349732349732341671b41671b557f22547428
+41671b497323344d1e557f2249732341671b41671b3c58222f3c222f3c2249601f
+3d5f25344d1e344d1e3f4e1e4b681e3043212f3c2241671b49601f344d1e557f22
+5f7b2a4b681e4b681e49601f3d5f2541671b3c582241671b4b681e497323576a1f
+47581f272c1f2b3322272c1f24261c24261c24261c24261c24261c24261c24261c
+272c1f24261c24261c24261c272c1f24261c272c1f24261c24261c24261c24261c
+24261c272c1f2f3c223f4e1e4b681e41671b49601f4b681e3f4e1e2f3c223a4423
+2b33223335223f4e1e47581f49601f576a1f576b334b681e55602468752b5f7b2a
+576a1f576a1f556024555824656c264c50263a4423383c233a44233a44233a4423
+383c23383c233335222b3322272c1f272c1f24261c24261c1e241b24261c24261c
+24261c24261c24261c342d1f3f4e1e4c50264e4425766e2d68752b766e2d68752b
+656c26656c2668752b5560245560244c50263f4e1e47581f4c502647581f3f4e1e
+47581f4c50263a44233f4e1e47581f3f4e1e383c232b3322383c233a44233f4e1e
+47581f4c502649601f3f4e1e3f4e1e3f4e1e3f4e1e3f4e1e3a44234e3d22342d1f
+24261c24261c272c1f342d1f3a4423383c232f3c223a44233a442347581f576a1f
+4b681e576a1f576a1f4b681e576a1f4b681e3a44232b33223f4e1e4c50263f4e32
+3f4e1e3f4e1e383c23383c2347581f3335223a44232f3c225560243043213f4e1e
+656c264b681e5f7b2a4b681e4c50262f3c22342d1f333522383c234436232f3c22
+47581f4b681e556024576a1f556024576a1f5e74295e7429656c26556024576a1f
+68752b76872d766e2d666033576a1f656c26576a1f55602468752b656c26656c26
+6660333a44234e4425272c1f24261c2b3322272c1f383c233a44234c5026555824
+4c50263a4423383c233a44233a44233f4e1e47581f47581f576b334b681e68752b
+576a1f5e74295f7b2a5e742976872d697c2b757b2d76872d757b2d76872d76872d
+6b852c8b903376872d8e9f3b8e9f3b9f98358ea83ea1af4ea0a03aa1a73ca1a73c
+b0a83fb1af4db1af4d9fa857b0b86c9fa0567b90346b852c7d9736576b335f7b2a
+5e74294b681e576a1f5e7429697c2b697c2b5e742960832a60832a557f22557f22
+4b681e4b681e547428576b3341671b3c5822344d1e3f4e1e304321354c31304321
+3c58223c58223c5822344d1e354c31344d1e354c31344d1e344d1e344d1e3c5822
+344d1e3d573b344d1e3c582247581f49603247581f496032496032547428576b33
+4b681e656c2649601f4b681e576b33576b33567f3a4b6933567f3a3d5f25576b33
+4b69335f7b2a68752b5474434973235e7429657c44697c2b697c2b778746778746
+7b90347b90347b90347c90536b85457b90348b90557b90347787468b90338e9f3b
+9fa8579fa8578ea05991af49b1b069a1b170b0b86c9fa857a1b170a1b170a1af4e
+383c232a34382f3c224960324b69333f4e32576b333d5f254960324960324b6933
+4b681e4b69333f4e32344d1e354c313c58223a44233043213f4e322f3c222f3c22
+344d1e3f4e324b681e4758323f4e322b3322333642373e435658383f4e323a4423
+3a44233c5822354c312b33222b33222e3c442f3c22272c1f333522373e432f3c22
+3a44232e3c443335222a3438272c1f24261c262e352b33223d573b496032344d1e
+3f4e1e47583255602447581f47581f4960323c58223f4e32304321354c313f4e1e
+49601f4c5026556024475832344d1e47581f49601f556024576a1f5e74295e7429
+547428547428497323708f31557f2249732341671b41671b3c582241671b547428
+49732341671b3c582249732341671b3c582249601f3043213043212f3c22304321
+41671b344d1e3043213043213c58223043213043213d5f25344d1e344d1e4b681e
+5f7b2a4b681e5474283c582249601f49732349732341671b49601f49601f344d1e
+2f3c22272c1f2b3322272c1f272c1f272c1f33352224261c272c1f272c1f24261c
+272c1f24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c272c1f3a44233f4e1e576a1f3c58223c58224b681e3f4e1e304321333522
+2b3322272c1f2f3c223f4e1e49601f576a1f576a1f576a1f4b681e576b335e7429
+4b681e4b681e55602447581f5560244c50264e4425333522383c23383c23383c23
+2b3322342d1f272c1f342d1f272c1f24261c24261c24261c24261c24261c24261c
+24261c24261c24261c272c1f383c233f4e1e555824656c26656c2668752b697c2b
+697c2b68752b656c26556024576a1f5558243a44233f4e1e3a44233f4e1e555824
+5560244c50263f4e1e3a44233f4e1e3a4423383c23344d1e3043213a44233a4423
+4c50265558243f4e1e383c233a4423383c233a44233a44234c502644362324261c
+24261c342d1f333522383c23383c23342d1f342d1f3335222b3322383c234b681e
+41671b3c58223f4e1e3f4e1e3a442347581f304321342d1f2b33224c5026383c23
+4e44253f4e1e342d1f3335223a4423342d1f3335223335223f4e1e3a442347581f
+576a1f555824576a1f47581f4c50264c50263f4e1e47581f3f4e1e4c50263a4423
+47581f556024576a1f556024556024574f265560245558244c50264c5026576a1f
+656c2677874687872c656c2666592c656c26766427555824576a1f576a1f656c26
+574f264c50264c5026333522342d1f342d1f3335223f4e1e4c50263a44233f4e1e
+3a44233a44233043213a44234c50264c50263f4e1e3f4e1e49603247581f576b33
+4b681e576a1f5e7429576a1f576a1f697c2b5e74296b852c76872d87872c6b852c
+68752b8c983587872ca0a03a8c98359f9835a1a73cb0a83f9fa8579fa8579fa857
+b2a8569fa056a0a03a9fa056b1af4d8ea0598b90337b90347d97365e74295f7b2a
+5474284973234b681e4b681e576a1f5e74295e74294b681e576a1f41671b4b681e
+4b681e41671b41671b49601f3c5822354c31344d1e354c312f3c22304321304321
+344d1e344d1e354c31304321344d1e344d1e354c31344d1e3d573b3043213d5f25
+344d1e4b69333d5f253c58223c58224b693347581f4b6933576a1f4b69334b6933
+49601f576b33576a1f4b6933576a1f697c2b567f3a4b681e567f3a3d5f254b681e
+547428547428576b3349732341671b567f3a547428576b335e7429778746757b2d
+757b2d7c905376872d60832a5f7b2a6b8545778746708f3160832a7c90538c9835
+8c98539fa8579fa8579eb74c92a7599fa857a4bb7e9fa857a1af4eb0b86ca1af4e
+30444d2f3c22354c314758324b69333d5f25576b334960324960324b681e4b6933
+4b69334960323c58223c58223c58224758323f4e323d573b3c5822344d1e475832
+4b69334b681e5474283d5f25354c312f3c222a34384e4425465864354c312f3c22
+354c313f4e32383c232b33222b33222b33222b33222b3322272c1f2a3438333522
+383c232f3c223043212f3c222b33222b3322342d1f383c234758323f4e1e2f3c22
+3f4e3249601f4b681e49601f47581f49603247581f3d5f253f4e1e4758323f4e1e
+5560243f4e324c50264758323f4e1e3a44235560244c5026556024697c2b60832a
+60832a60832a497323708f31557f224973234973234973233d5f25344d1e557f22
+4b681e54742841671b4973233c5822576a1f41671b344d1e3c5822344d1e304321
+576a1f344d1e3f4e1e3c5822344d1e3c58223c582249601f3043213f4e1e49601f
+5e742949601f3d5f253d5f2547581f41671b5e74294b681e4b681e3c58222f3c22
+2b3322272c1f2b3322333522272c1f24261c272c1f272c1f24261c24261c24261c
+1e241b24261c24261c272c1f1e241b272c1f24261c272c1f24261c24261c272c1f
+24261c272c1f344d1e3043213c582249601f3f4e1e3c582247581f47581f2f3c22
+2b33222f3c22344d1e3c582249601f5e74294b681e4960323f4e1e3a442349601f
+3a442347583249601f3f4e1e4c50263f4e1e383c233a4423383c23383c23383c23
+3335222b3322272c1f342d1f342d1f272c1f24261c24261c24261c24261c24261c
+24261c272c1f24261c24261c3335223a44235e7429556024656c2668752b757b2d
+697c2b68752b576a1f55582447581f4c50263a44233f4e1e383c233f4e1e47581f
+47581f3f4e1e383c233f4e1e3f4e1e344d1e4c502647581f47581f3a4423333522
+383c234c50263f4e1e383c232f3c22304321383c23383c23555824443623342d1f
+342d1f2b3322333522333522333522383c23333522333522342d1f3a44233f4e1e
+3f4e1e344d1e333522342d1f3043213f4e1e383c23272c1f272c1f4e44254c5026
+3a44232f3c22342d1f2b33222b332224261c24261c272c1f3335223a4423574f26
+3f4e1e3a44235558244c50263f4e1e55602455602455602455582447581f576a1f
+49601f556024656c266660334e44253f4e1e574f26556024383c233335224e4425
+4c502668752b9e9853887b2c555824666033757b2d555824576a1f766427656c26
+4e442547581f555824333522272c1f272c1f3335223a4423383c233a44234c5026
+3a44233043213a44233043213f4e1e3f4e1e3f4e1e344d1e3c582247581f4b6933
+4b681e49601f49601f5474285e74295e742968752b76872d76872d757b2d697c2b
+76872d8c98357b90348e9f3b8c98358e9f3b8e9f3b9fa8579fa056b1af4da0a03a
+9fa8579fa8578b90339fa857b0a83f9e98538b90337b90348b90336b8545656c26
+576a1f4b681e4b681e3d5f2549601f497323497323576a1f4b69334b693349601f
+3d5f253d5f253f4e1e3f4e1e344d1e3043213043213a44233043212f3c222f3c22
+344d1e304321344d1e304321304321354c31344d1e344d1e354c31344d1e3c5822
+3d573b41671b3d5f253c5822344d1e47583247581f49603247581f4b681e496032
+4b681e576b33576a1f556024576b335e74295e74294b693341671b3c58224b6933
+4b6933576b33576b333d5f25496032576b335474284b6933576b3376872d68752b
+7b90346b852c6274444b69335474286b852c6b852c5f7b2a5f7b2a708f317b9034
+8e9f3b92a75992a75992a75992a759a1af4ea1b17092a75991af49b0b86c91af49
+354c312f3c223f4e32475832576b334b69334b693349601f4b6933576a1f5e7429
+4b69333d5f2549603249603241671b3d5f25344d1e49603249601f496032576a1f
+5474284b69335f7b2a475832304321394446373e43373e43383c232f3c223a4423
+304321354c313335222e3c44304321262e35272c1f262e35272c1f333522333642
+2b3322373e433a4423373e432f3c22373e433a44233f4e324758323a44232f3c22
+47583247581f475832576b334b681e49603247581f47581f47581f3f4e1e354c31
+3f4e322f3c22383c233f4e323f4e1e383c234c50264c502649601f697c2b557f22
+60832a557f22497323547428557f2260832a497323557f224973233c58225f7b2a
+41671b557f22497323557f223d5f25576a1f4973233c58223c58223d5f25344d1e
+4b681e4b681e344d1e41671b3d5f2541671b41671b49601f2f3c222f3c223c5822
+576a1f4b681e3c58223c58223f4e1e3c58225474284b681e5560243f4e1e304321
+2b33222f3c223f4e1e2b3322333522272c1f24261c272c1f262e3524261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c3335223a442349601f49601f3c58224b681e5474284b681e49601f
+304321344d1e41671b49601f4b681e656c2649601f3c582230432130432147581f
+3043213335223f4e1e3f4e1e3f4e1e383c234436234e4425383c233335223f4e1e
+3a4423333522272c1f342d1f333522272c1f24261c24261c24261c342d1f342d1f
+24261c24261c24261c24261c272c1f33352255582447581f576a1f55602468752b
+68752b757b2d576a1f5560244c5026344d1e3a442347581f3a44233a44233a4423
+3f4e1e4c50262f3c2247581f3f4e1e30432149601f3f4e1e3f4e1e4c5026333522
+333522383c232f3c22333522383c233a4423383c23333522666033383c23272c1f
+333522342d1f333522342d1f3335223a44233f4e1e383c233a44233a44233f4e1e
+383c23383c23272c1f342d1f383c232f3c22342d1f272c1f333522383c23383c23
+342d1f2b3322272c1f333522383c2324261c342d1f24261c342d1f2f3c223f4e1e
+4436233335223a44234e442547581f576a1f656c26556024576a1f556024576a1f
+656c26697c2b68752b5558244e4425574f26666033555824443623333522333522
+3335224e44258b90559e9853656c26576a1f84712f555824656c2668752b656c26
+383c23574f264c50263335223335223335223335223a44232f3c22344d1e383c23
+3a44232f3c222f3c222f3c223043213f4e1e354c313043213c58223f4e1e47581f
+4b681e3d5f2549601f49601f4b681e5e7429757b2d757b2d7b903476872d76872d
+76872d7b90347b90349f98358c98359fa8579fa857a0a03a9fa857b1b0699fa056
+9f98358c98358e9f3b8c98358e9f3b9f91548b903377874676872d68752b576b33
+576b3349601f49601f3d5f254b681e3d5f2541671b576a1f3c58223d5f253c5822
+3c58223d573b2f3c22354c31344d1e354c313043213a44232f3c222f3c222f3c22
+304321304321304321304321304321304321354c313c5822344d1e354c31344d1e
+3d573b3d5f253d573b344d1e3c5822344d1e354c3149601f49601f4b69335e7429
+576a1f657c445e7429576a1f5e74295e74295f7b2a5474433d5f2547583247581f
+4b69334b681e4b69333d5f253c582247581f4b693349601f576b336b852c68752b
+6b8545697c2b5474284b6933567f3a657c445f7b2a5f7b2a6183456b852c7b9034
+92a75992a75992a75991af4995af7aa1af4ea1af4e819f598ea059a1af4ea1af4e
+4758323a44233f4e3247583249603247581f47581f4e5043496032496032576b33
+3d5f2549603247581f4b693349603247581f3c58223d5f253c5822496032576b33
+627444496032576b333d573b354c313f4e32394446342d1f2a3438354c313f4e32
+3043213043212f3c223a44233f4e323043212b3322262e35272c1f2b3322333522
+3335222b33222a3438333522333522383c233a44234758323f4e1e383c23304321
+49601f3f4e1e4c50265e742949601f4758323f4e1e49601f3f4e1e354c31383c23
+3335222b3322333522383c233a4423383c23383c233f4e1e49601f576a1f576a1f
+4973233d5f253c582241671b41671b557f22557f2249732360832a49732360832a
+557f2260832a557f22557f2241671b41671b4973233d5f25344d1e49601f3c5822
+3d5f2549732341671b41671b41671b4973234b681e3c58222f3c222f3c223a4423
+576a1f49601f3c5822344d1e3f4e1e47581f497323576a1f4b681e41671b3f4e1e
+2f3c22344d1e3c58223043212f3c22272c1f272c1f24261c342d1f24261c272c1f
+24261c272c1f24261c24261c24261c24261c24261c24261c24261c24261c24261c
+272c1f272c1f2b33224b681e54742849601f47581f576a1f576a1f4b681e49601f
+3c582249601f49601f4b681e4b681e55602447581f3f4e1e344d1e344d1e4b681e
+344d1e333522383c23344d1e3a4423383c233043213f4e1e383c23383c233f4e1e
+3f4e1e383c23342d1f2f3c223a4423342d1f342d1f342d1f342d1f24261c333522
+333522342d1f342d1f342d1f272c1f3335223f4e1e383c23555824555824656c26
+68752b5e7429656c2647581f47581f47581f55602447581f3f4e1e3f4e1e47581f
+4c50265560243a44233f4e1e49601f3f4e1e47581f3043212f3c2247581f304321
+333522333522342d1f333522333522383c234436233a4423766427383c23342d1f
+272c1f2b3322342d1f333522342d1f3a44234e44253a4423574f263a4423333522
+333522342d1f24261c272c1f2f3c223335222b3322342d1f333522333522383c23
+33352224261c272c1f304321333522272c1f2b3322272c1f272c1f383c23333522
+2b3322333522383c233f4e1e576a1f68752b576a1f556024556024556024576a1f
+76872d766e2d5560244e4425383c234c5026656c264c5026333522443623383c23
+333522383c2355582486874a757b2d66603376872d666033766427766e2d576a1f
+4c50264c50264c5026383c233335223a44232f3c222f3c223043213a44233a4423
+2f3c222f3c223043212f3c223043213a44233a44233043213f4e1e344d1e47581f
+49601f47581f49601f47581f4b681e697c2b5e742976872d87872c8b90337d9736
+76872d76872d8b90338c98358c98358c9835b2a8568e9f3b9fa8579fa857a1a73c
+a0a03a8b90338e9f3b8c983587872c8b90338b90337787467b9034656c26576b33
+576a1f47581f3c582247583247581f47581f49601f3d5f25354c31475832354c31
+3f4e323f4e1e3043213a44232f3c223a44232f3c223a44233043212f3c222f3c22
+3043212f3c22304321344d1e2a3438304321354c31354c31344d1e344d1e304321
+3d573b3c5822344d1e344d1e344d1e3a44233f4e1e49601f576b336b8545697c2b
+68752b5f7b2a697c2b49601f576a1f576b337787465e74293c58223c58223c5822
+4b681e496032496032344d1e3d5f253d5f254960323c58223d5f25576b33576b33
+6274445e74294b69334b6933618345557f22708f3161834560832a6183457d9736
+80a03ba1af4e92a7598e9f3b8ea0598ea05992a7598c9835819f5991af499fa857
+4758323f4e323d573b4758324758323f4e323f4e323f4e324c5026475832475832
+3c58224b69333c58224960323d5f2547581f4960324960323d573b3c5822576b33
+6274444b69334b69334960324e50432f3c223a44232f3c22354c313f4e32304321
+3a4423304321304321354c313c58223043212f3c22333522262e353336422a3438
+272c1f2b33222f3c222b33222a3438342d1f2f3c223f4e32344d1e333522304321
+3f4e32344d1e475832576b334b681e4960323f4e1e4758324c502647581f3f4e32
+342d1f3335222f3c22383c234c50263a4423333522383c2347581f47581f47581f
+3f4e1e344d1e3043213d5f253d5f2541671b41671b497323557f22557f225f7b2a
+60832a60832a708f3160832a4973233d5f254973234b681e41671b41671b3d5f25
+4b681e4b681e4973234b681e3d5f254973234b681e3c58222f3c222f3c222f3c22
+4b681e49601f4973233c582249601f49601f4973234b681e4b681e4973233d5f25
+344d1e47581f3d5f25344d1e2f3c22342d1f272c1f272c1f333522272c1f272c1f
+272c1f2f3c22272c1f24261c24261c24261c24261c24261c24261c272c1f24261c
+342d1f272c1f2f3c22576a1f4b681e49601f3c58224b681e576a1f49601f49601f
+49601f49601f3c582249601f47581f5558243f4e1e3d5f253c58223c582249601f
+344d1e3335223a44233a44233a44233a44233a44233f4e1e383c233a44233a4423
+4c50263a4423342d1f3335223a44233335222b33222b3322342d1f272c1f342d1f
+272c1f272c1f2f3c223335222b3322333522383c2333352247581f556024656c26
+576a1f656c26576a1f656c26576a1f576a1f576a1f5560243f4e1e47581f47581f
+49601f49601f4c50263f4e1e47581f4c50263f4e1e4c50263043214e44252f3c22
+333522383c23272c1f272c1f3335223335223335224c5026767b47443623342d1f
+342d1f2b3322272c1f342d1f342d1f383c23383c233f4e1e4e4425333522272c1f
+342d1f272c1f342d1f272c1f2b33222b3322383c232b33222b33223335224c5026
+304321342d1f272c1f3a4423333522272c1f383c232b33223335222f3c22342d1f
+2b3322383c233a442347581f5e742947581f5560245558244c50264c5026666033
+86874a556024556024383c23383c233335224e3d22383c233335224e44254e4425
+4e44254e4425383c234e4425574f2676642768752b766427556024766e2d656c26
+4c50263f4e1e3f4e1e3f4e1e2f3c22344d1e3a44232f3c222f3c222f3c22304321
+2f3c222b33222b33222f3c222b33222f3c222f3c22304321344d1e344d1e344d1e
+3d5f253f4e1e3c582247581f4b681e697c2b60832a5e74296b852c87872c708f31
+6b852c7b90348b90338b9033a0a03a9f9835a1af4e9fa0569fa056b1af4d9fa857
+9e98538e9f3b8c985376872d76872d9e98538b90337c9053697c2b576b33576a1f
+49603249601f3f4e1e3d5f25475832344d1e3d573b3f4e1e3a44233f4e32304321
+354c313043212f3c223a44232f3c222f3c222b33223335222f3c222f3c22304321
+30444d2b33223043212f3c222b33222a3438344d1e344d1e354c31354c31304321
+3f4e323c5822344d1e3d573b354c312f3c223a44233f4e323c58225474286b8545
+757b2d576b335f7b2a576a1f4b6933576a1f5e74294b69333c58223c58223c5822
+3d5f253c58223d573b3c58223f4e323d5f253d5f2547581f47581f4b681e497323
+41671b4b69334b693341671b6b85455f7b2a6f8f527787465f7b2a6b85457c9053
+8ea0598c983592a7597d97367f975392a75992a7597d97368c98538ea0598ea059
+3f4e323a44234c5026354c313f4e323c58223a44233f4e32354c313f4e32304321
+354c313d5f254960323d5f2547581f4960323d5f253f4e1e3f4e323f4e32475832
+4758324758324960324b69333f4e323043213043212f3c22344d1e3c5822304321
+2e3c443a44232f3c223f4e32344d1e3d573b3a44232b3322262e35342d1f262e35
+272c1f2a3438383c232a3438342d1f262e35383c233f4e323a44232e3c44304321
+3f4e322f3c224b69335e742949601f3f4e323f4e1e47583247581f354c313f4e32
+2f3c22383c23383c2333352247581f4c50263335222f3c224960323f4e1e3f4e1e
+344d1e3a44233c58223d5f2541671b41671b41671b41671b54742860832a557f22
+557f22708f3160832a60832a547428547428576a1f4b681e4b681e4b681e4b681e
+41671b49732349601f4b681e3d5f2541671b41671b344d1e3043213043213f4e1e
+49601f3d5f25576a1f49732354742841671b49601f3d5f254b681e547428497323
+4b681e41671b3c58223c58222f3c22272c1f3335222b3322333522272c1f333522
+2b33223a4423272c1f272c1f24261c24261c24261c24261c24261c24261c272c1f
+272c1f2b33222f3c2247581f47581f3f4e1e344d1e576a1f3c582247581f47581f
+47581f49601f47581f3f4e1e383c234c5026344d1e3c582230432147581f3f4e1e
+3f4e1e3335223a44233f4e1e383c23383c233a44233a4423383c233a44233a4423
+4c50263043212b3322342d1f3335222f3c223335223a4423333522272c1f272c1f
+272c1f272c1f342d1f333522383c232f3c22383c233335223f4e1e556024576a1f
+656c26576a1f576a1f5e74295e7429697c2b5e742955602449601f47581f4b681e
+4b681e55602455602449601f344d1e47581f49601f47581f3f4e1e3a4423333522
+383c23383c23272c1f272c1f342d1f383c23383c2374643e86874a342d1f272c1f
+333522272c1f342d1f272c1f333522443623443623574f263f4e1e24261c272c1f
+272c1f3335223043212f3c223335222b33223f4e1e272c1f272c1f2f3c2247581f
+3f4e1e333522342d1f304321333522272c1f383c23333522333522383c232f3c22
+3335223a44234c50264c50265558243f4e1e3f4e1e3a4423383c23383c23555824
+757b2d574f265560243a44233a4423383c23333522342d1f3335224c50264c5026
+555824383c23443623333522333522666b3b757b2d656c26766427757b2d666033
+4c50263a44233f4e1e3f4e1e344d1e344d1e3043212f3c222b33222f3c222f3c22
+2f3c222f3c222f3c222b33222b33222f3c22304321304321344d1e3043213f4e1e
+3c5822344d1e3c58223d5f25576a1f5f7b2a697c2b576a1f76872d6b852c76872d
+697c2b76872d8b903387872c8c98359fa8579e98539fa8578c98539fa0569fa056
+8e9f3ba0a03a8e9f3b6b852c6b852c8c983576872d778746757b2d656c26475832
+4c50264758323c58223d573b3f4e1e3f4e1e3f4e32344d1e354c313043212f3c22
+3a44232f3c223335222b3322333522383c232b33222a34382b33222a3438304321
+2f3c222f3c222a34383043212b33222a3438304321344d1e344d1e304321354c31
+344d1e344d1e3c58223043213a44232f3c222f3c223043214c50264b681e757b2d
+68752b697c2b5e74295560245560243d5f254b69334b6933344d1e354c31304321
+3c5822344d1e354c31344d1e344d1e3f4e1e4960323c58223c58224758324b6933
+4b693341671b4b69334b69336b85456b852c7b90346b852c697c2b7b90347b9034
+a1b1707b9034819f597d97367b903480a03b92a7598e9f3b7b90348e9f3b7d9736
+3f4e322f3c223f4e323a44233f4e323d573b3a44233f4e323a44233f4e322f3c22
+4758323d5f254960323f4e1e3c582249601f3c58223f4e32344d1e3f4e323f4e32
+354c313f4e32496032496032304321354c31354c312f3c223043213d573b354c31
+3a44233a4423383c233a4423354c31354c31304321373e432b33222b33222b3322
+333522373e43383c232f3c22342d1f262e35272c1f2f3c223f4e32383c232f3c22
+2f3c223a44235e742949603249601f3d573b3f4e1e3f4e1e3f4e323f4e323f4e32
+2f3c222f3c222b33222f3c2247581f3c5822354c313a442347581f3a4423383c23
+3335222b3322304321344d1e3d5f2541671b49732341671b4b681e557f225f7b2a
+5474286b852c557f22547428547428547428557f2241671b4b681e547428497323
+5474284b681e49601f41671b41671b4b681e49601f344d1e344d1e3c58223c5822
+4b681e3c582241671b4b681e5e74294b681e41671b3c5822576a1f547428497323
+54742849601f3d5f2541671b2f3c222b33223335222f3c223a44232b3322304321
+3f4e1e3f4e1e333522272c1f272c1f24261c24261c24261c24261c272c1f342d1f
+2b33222b33222b33222f3c22383c233f4e1e3f4e1e49732349601f3c58223f4e1e
+3f4e1e3f4e1e3f4e1e3043212b33224436232f3c223f4e1e2f3c223a44233a4423
+3a44233335222f3c223a4423333522333522443623383c23383c233a4423383c23
+383c233a4423383c23272c1f2b33223335223335223335222f3c22383c23342d1f
+24261c24261c24261c2b3322383c233f4e1e383c23342d1f3a4423556024576a1f
+576a1f68752b5e742968752b697c2b757b2d697c2b656c2655602447581f556024
+55602449601f55582449601f3f4e1e47581f49601f47581f3f4e1e3f4e1e383c23
+383c23383c233335222b33223335224e44253a4423767b47766e2d333522272c1f
+342d1f2b3322342d1f24261c342d1f333522383c234c50263f4e1e342d1f24261c
+272c1f333522383c233a44233335223335224c5026272c1f3335224c502649601f
+4b681e3a44232f3c222f3c223f4e1e333522383c232b33223335223a4423304321
+383c233f4e1e3f4e1e4c50264c50264c50263f4e1e4e44253335224e442586874a
+666b3b3a4423576a1f3a44233a44233f4e1e2b33222f3c223335224c5026556024
+666033333522383c23333522333522574f2674643e666033766427697c2b66592c
+3f4e1e3f4e1e3f4e1e4c5026344d1e3f4e1e3043212f3c222f3c222b33222f3c22
+2b33222b33222b33222b33222b33222b33222f3c222f3c22304321304321304321
+344d1e344d1e3f4e1e4b681e697c2b6b852c697c2b5e742976872d6b852c6b852c
+60832a6b852c8c98358b90338e9f3b8c98538b90338c98357b90348c98539f9035
+9e9853a0a03a86874a6b852c76872d8c98357b903476872d766e2d656c26556024
+47581f4960323f4e1e3c5822354c31354c313043212f3c223a44232f3c222f3c22
+2f3c222f3c222b33222b33223335222b3322272c1f3335222f3c222b3322304321
+2a34382f3c222f3c222f3c222b33222b33222f3c22304321354c31344d1e304321
+354c31354c313043213043212f3c222f3c222f3c22304321344d1e47581f757b2d
+766e2d576a1f5e7429576a1f475832344d1e3d5f253c5822354c31304321304321
+344d1e3c5822304321304321354c313f4e1e3c58223c582247583247581f3d5f25
+49603249601f576b334b69336b852c60832a7c90537787465e74298b90558c9853
+92a75976872d8ea05980a03b6b85458e9f3b8ea0598ea05976872d92a75980a03b
+3a44233043215f61563a44233d573b354c312f3c223f4e1e354c313f4e32304321
+3d5f2549601f4b69333d5f254758324960323f4e1e3f4e323c5822354c31354c31
+3a4423354c313d5f253f4e322e3c442b3322333522262e35342d1f3a4423354c31
+3a4423383c232e3c443335222f3c222f3c223a44233944462f3c222a34382f3c22
+3a44233a44232f3c22333642262e3524261c24261c333522383c232f3c223a4423
+3c582247581f4b681e4960323f4e1e354c313f4e1e3a44233a44233a44233f4e1e
+3a44232f3c222f3c222b33223f4e1e3f4e1e3f4e1e47581f3f4e1e3a44232b3322
+2b3322272c1f333522383c233f4e1e47581f3d5f2549601f49601f547428576a1f
+4b681e5f7b2a576a1f41671b576a1f497323576a1f4b681e49601f497323547428
+547428557f2241671b4b681e5474284b681e3d5f253c5822344d1e49601f5f7b2a
+576a1f3c58223c58224b681e5f7b2a497323576a1f49601f5e7429497323576a1f
+54742841671b3c58223d5f252f3c222f3c223f4e1e3d5f2549601f30432149601f
+47581f3f4e1e2f3c22342d1f24261c24261c24261c272c1f24261c272c1f272c1f
+3335222f3c2224261c2b33222f3c224c5026344d1e4b681e576a1f49601f49601f
+3f4e1e3f4e1e47581f344d1e2f3c223335222f3c222f3c22383c23304321383c23
+333522383c23333522383c23333522333522383c23383c23383c233a4423333522
+342d1f3335222b3322272c1f342d1f2b3322272c1f272c1f383c232f3c222f3c22
+272c1f24261c272c1f24261c2b33223f4e1e3a44232b33223a4423576a1f5e7429
+656c26576a1f5e742968752b68752b6b852c68752b5e7429576a1f5560244c5026
+47581f47581f47581f4c50263f4e1e47581f49601f5560243a44233f4e1e304321
+2f3c22383c233f4e1e333522383c234c50263a442375704d656c263335222b3322
+333522272c1f24261c24261c333522333522333522383c23383c23342d1f24261c
+272c1f342d1f2b3322333522333522272c1f3f4e1e2b33223335223f4e1e4b681e
+49601f3f4e1e3a44232f3c223a44233043213a44233043213a44233a4423383c23
+383c234c50263335224c50263f4e1e4e44253f4e1e555824383c23666033ada17f
+656c264e44255558243f4e1e3f4e1e5558243f4e1e47581f3f4e1e555824766e2d
+766e2d4436234436233335224c5026333522333522555824666033666b3b555824
+4e44253a44233a4423344d1e344d1e344d1e3043212f3c222b33222b33222f3c22
+2b3322272c1f2b33222b33222b3322272c1f2b33222f3c222f3c222f3c222f3c22
+3043213043213c5822576a1f76872d5e7429557f2260832a6b852c708f31708f31
+76872d6b852c8b90337b90349fa0568e9f3b7b903477874676872d76872d76872d
+7b90348b9033757b2d76872d60832a7d97366b85456b852c576b33576b3349601f
+354c313f4e32354c313043213043213043213043212f3c223043212f3c222b3322
+2f3c222b33222b33222b3322272c1f272c1f2b33222b33222a34382f3c222b3322
+2b33222f3c222a34382f3c222f3c222b33222f3c22354c31354c31344d1e2f3c22
+3043213043213043213043213043212f3c223a4423304321354c3149601f697c2b
+68752b556024576b33576a1f47581f3c5822344d1e354c313043213043212e3c44
+344d1e354c31304321304321304321354c313c58223f4e1e3c58223c58223f4e32
+354c314c5026576b335560246f8f5260832a7d973677874676872d7787467b9034
+8c98537b90347b90347d973660832a7b90348ea83e8ea05976872d80a03b7d9736
+3a4423304321576b334e4425475832354c312f3c22475832354c313c58223a4423
+3d573b47581f3d5f253d5f253d5f2549601f3c58223a44233f4e32354c312f3c22
+2f3c223a4423354c31333522342d1f272c1f262e35272c1f262e353a4423344d1e
+304321383c23333522342d1f3335222e3c442f3c223a44233a44233944463a4423
+354c313a44233a4423342d1f272c1f333642262e35342d1f2a34382f3c22475832
+496032576b335560244960323a4423354c313043213a44233a44232f3c223f4e32
+3a44233043212f3c222b3322383c23383c233a44234c5026344d1e3a4423383c23
+2f3c222b33222b33223a4423383c233a442349601f3f4e1e55602449601f555824
+47581f49601f47581f3c582247581f41671b4b681e4b681e47581f4b681e557f22
+5e742960832a5474285f7b2a557f224b681e49732341671b41671b54742860832a
+5f7b2a4b681e3c58224b681e557f22557f22547428576a1f5f7b2a4b681e4b681e
+54742849601f3c5822344d1e30432130432147581f47581f49601f3a442347581f
+3f4e1e333522272c1f272c1f272c1f272c1f342d1f272c1f342d1f2b3322272c1f
+3335222b3322342d1f272c1f2f3c223c58223f4e1e576a1f576a1f576a1f4b681e
+4b681e49601f4b681e41671b49601f47581f344d1e383c233a44233a4423383c23
+2f3c223a44232f3c223a4423333522304321383c23383c233335223a4423333522
+342d1f272c1f342d1f272c1f342d1f333522342d1f272c1f342d1f2b3322333522
+272c1f24261c24261c24261c272c1f383c232f3c222f3c223f4e1e5e74295f7b2a
+576a1f576a1f576a1f697c2b68752b757b2d68752b656c26576a1f49601f3f4e1e
+4c502649601f3f4e1e3f4e1e3f4e1e4c502647581f5558243a44233a4423383c23
+3a44233a44233f4e1e3a4423383c234c502647581f766e2d4c5026383c232f3c22
+333522272c1f342d1f272c1f342d1f333522333522333522383c23333522333522
+272c1f24261c272c1f342d1f3335222b33223f4e1e2b33222f3c2247581f556024
+47581f344d1e3a44233a44232f3c223a4423344d1e4c50263f4e1e3f4e1e3a4423
+3a44233a4423333522383c234c50264e44253f4e1e55602444362375704d9e9853
+574f26383c234c502655602447581f576a1f555824576a1f5560245560248b9033
+767b473a4423574f26383c235558244e3d22342d1f383c2366592c574f263a4423
+3a44232f3c223043213043212f3c22344d1e2f3c222b33222b33222f3c222b3322
+2b33222b33222b3322272c1f2b3322272c1f2b33222f3c222b33222f3c222b3322
+2f3c22304321344d1e4b681e68752b547428547428497323557f22708f3176872d
+5f7b2a557f226b852c76872d8c98536b852c757b2d7b9034697c2b5f7b2a697c2b
+6b852c6b852c6b852c8b90335f7b2a6b852c6b852c5e7429576b3349601f3f4e1e
+3f4e1e3f4e323043213043213a44232f3c222f3c222f3c223043212f3c22272c1f
+3335222b33222b33222b3322272c1f2b3322272c1f2b33222b33222f3c22272c1f
+2f3c222f3c222b33222f3c222a34382b33222b33223043213043213043212f3c22
+3043213043213043213043212f3c22304321354c31304321344d1e3f4e1e5e7429
+576a1f47581f49601f475832496032344d1e304321304321354c312f3c222f3c22
+304321344d1e354c31304321383c233043213d5f253d573b354c313c5822344d1e
+3a442347581f5e7429757b2d7c90537b90347b903486874a86874a757b2d76872d
+8c98536b852c6b852c77874660832a6b852c8ea05980a03b76872d8ea0597b9034
+394446304321576b3356603a3f4e323f4e323a44234758323f4e32475832344d1e
+3f4e324b693349603247583249603249601f3f4e324c50263f4e323a4423304321
+2f3c22373e433a44232b3322272c1f272c1f262e35272c1f2b332247581f3c5822
+304321373e432b33222b33223335223043213043212f3c223a4423354c31383c23
+3a44233f4e323a4423333642342d1f272c1f262e352b3322383c232f3c223f4e32
+3c58224b693349603247581f47581f3f4e323a44233a44233a4423383c233a4423
+3f4e323f4e1e3a44232f3c222f3c22383c23383c233a442347581f3a4423383c23
+383c232b33222b33223a44232b33223335223f4e1e3a442349601f47581f3f4e1e
+3a442349601f3f4e1e47581f3c58223f4e1e47581f49601f3c582241671b4b681e
+557f225f7b2a5f7b2a60832a60832a547428557f224b681e3d5f2554742860832a
+5e7429557f2241671b4b681e5f7b2a5f7b2a4b681e41671b54742849601f41671b
+576a1f41671b49601f41671b344d1e344d1e47581f49601f47581f2f3c22383c23
+2f3c222b3322272c1f24261c342d1f272c1f272c1f342d1f272c1f272c1f333522
+2b3322272c1f272c1f2b3322344d1e49601f4b681e4b681e49601f49601f6b852c
+576a1f4b681e576a1f5e7429576a1f4b681e3f4e1e3a44233a44233f4e1e2f3c22
+272c1f3f4e1e3f4e1e3a44232f3c22383c23333522342d1f272c1f383c232f3c22
+342d1f272c1f2b33222b33222b33223335222b3322272c1f272c1f272c1f333522
+24261c24261c24261c272c1f272c1f333522333522383c233f4e1e5e7429757b2d
+68752b656c266b852c68752b68752b68752b656c26576a1f556024576a1f304321
+3f4e1e47581f4c50264c50264c50263f4e1e4c50263f4e1e4c50263a44233f4e1e
+3f4e1e4e44253f4e1e3f4e1e3f4e1e47581f56603a555824383c23383c232f3c22
+383c23333522272c1f333522333522342d1f333522383c232b3322342d1f383c23
+333522272c1f342d1f2b33222b33223335223f4e1e304321333522344d1e47581f
+4c50263043213f4e1e3f4e1e3a4423383c233a44233f4e1e3f4e1e4c50263f4e1e
+4c5026383c23333522383c23383c23383c23383c234c50263f4e32766e2d666033
+383c233a442349601f47581f49601f556024555824576a1f666033656c2686874a
+656c2647581f5558243a44234e4425383c23333522272c1f342d1f3335222b3322
+3335223043213043213043212b33223043213043212b33222b33222f3c222b3322
+2b3322272c1f2b3322272c1f2b33222b3322272c1f2b3322304321272c1f2f3c22
+2f3c223043213c5822576a1f5e7429547428557f225f7b2a60832a5474285e7429
+557f225f7b2a697c2b6b852c697c2b5474285f7b2a697c2b5474285e7429576a1f
+576a1f576a1f697c2b708f3160832a60832a5474285474283d5f25475832344d1e
+304321354c313043212f3c223043212f3c222f3c22262e352b33222b33222b3322
+2b33222b3322262e352f3c222b33222b33222b33222b33222b33222b33222b3322
+2f3c22272c1f2b33222f3c222f3c221e241b2b33222f3c222f3c223043212b3322
+2f3c222b33222a3438304321344d1e3043213a44233043213c5822344d1e576b33
+49601f3f4e1e49601f556024344d1e354c313043212f3c223043213043212f3c22
+3043213d573b354c313043212f3c223043214b69333c58223043213c58223c5822
+383c23496032576a1f757b2d76872d7b90347d973676872d68752b68752b697c2b
+8c98535f7b2a697c2b708f31708f316b852c92a7598b903376872d7d973660832a
+3a44233f4e3256603a576b334758323d573b3f4e1e3f4e323f4e1e4960323f4e32
+3c58224b693355602447581f475832344d1e3f4e32383c232b33222b3322394446
+2f3c222b3322262e35272c1f24261c262e35272c1f262e352f3c2249601f3d5f25
+3c58222f3c222b33222e3c442f3c223a4423304321373e43383c23373e43383c23
+383c234c5026383c23333642342d1f262e35443623262e352b3322383c233a4423
+3f4e1e4758324758323f4e1e4c50263c58223f4e323a44233a44233335222f3c22
+3f4e323f4e1e3a44233a4423383c233a4423383c2333352247581f3f4e1e333522
+2f3c22333522272c1f2b3322272c1f272c1f2b33222b3322344d1e4c5026333522
+2f3c2249601f49601f47581f49601f304321344d1e3f4e1e3f4e1e47581f547428
+576a1f5474285474285f7b2a5474284b681e4973235474284b681e49601f41671b
+576a1f6b852c49601f49601f41671b49732347581f3c582241671b3c58223c5822
+4b681e4973234b681e4973233c58223f4e1e47581f49601f4c50262b33222b3322
+272c1f272c1f272c1f24261c272c1f2b3322272c1f2b3322333522333522383c23
+342d1f272c1f272c1f2b33223f4e1e49601f49601f4c5026344d1e49601f757b2d
+576a1f4b681e576a1f5474284b681e576a1f47581f3a44233f4e1e3f4e1e383c23
+2f3c223a44233f4e1e3a4423333522383c232f3c22342d1f2b3322383c23344d1e
+3335223335223335222b3322272c1f383c23383c23342d1f272c1f272c1f333522
+272c1f272c1f24261c272c1f272c1f2b33223335223a44233f4e1e47581f576a1f
+576a1f656c2676872d68752b5e742968752b656c26576a1f576a1f666b3b3a4423
+3f4e1e383c233f4e1e3f4e1e47581f3f4e1e4e44253a44233f4e1e3a44233f4e1e
+3f4e1e3a44234c50264c502649601f55602455602447581f383c233f4e1e3a4423
+2f3c223335222b3322383c232f3c22272c1f333522383c232f3c223a44233f4e1e
+383c232f3c22383c233335223a44233a44233f4e1e3043213a4423344d1e3f4e1e
+47581f3a44233f4e1e47581f3f4e1e383c233f4e1e4e44253a44234e4425383c23
+383c233335223335223a44234c5026383c234e44254c50264c502666592c443623
+4e44253f4e1e5560243f4e1e47581f49601f5558244b681e5558243f4e1e576a1f
+47581f47581f5558243f4e1e4c5026574f26443623272c1f342d1f3335222f3c22
+2f3c222f3c223043213043212b33222f3c223043212b33222b33222f3c222b3322
+2b3322272c1f2b33222b33222b33222b33221e241b2f3c223043212b33222f3c22
+2f3c223c58223d5f25576a1f697c2b497323557f225f7b2a557f22557f2249601f
+5f7b2a60832a5e7429576a1f4b681e547428576a1f657c444b681e4b681e49601f
+4b681e576a1f5474285e74297b9034697c2b4b681e4b681e3d5f253c5822344d1e
+3f4e322f3c223043212e3c442b33222b33222f3c222b33222b3322262e35272c1f
+2b33222b3322272c1f2b33221e241b2b3322272c1f272c1f272c1f2b3322272c1f
+2f3c222b3322272c1f2b3322262e35272c1f262e352f3c223043212f3c222b3322
+2f3c222b33222f3c22344d1e344d1e344d1e344d1e3f4e1e49601f344d1e547428
+4b681e2f3c223f4e1e475832344d1e354c312f3c223043213043212f3c222b3322
+3043213d573b354c313f4e323a44232f3c223d5f253f4e32354c3147583241671b
+4c502649601f49601f666b3b757b2d77874676872d76872d68752b5e7429576b33
+697c2b5474286183456b852c708f316b854580a03b7c9053757b2d7b90345f7b2a
+3f4e323f4e324c50265658384758324960324960323f4e323f4e324758323f4e1e
+4758324960323f4e323f4e1e4758322f3c22383c232f3c223336422b3322304321
+2f3c22262e35272c1f262e35272c1f272c1f272c1f2f3c222b33224758324b6933
+4758323a4423333522383c232f3c222a34383335222f3c223a44233043212e3c44
+3043213f4e323a4423333522342d1f262e35333522272c1f272c1f373e43354c31
+3f4e1e47581f4758323f4e1e354c313f4e323a44234758322f3c22333522333522
+383c233a44233a44233f4e1e4e44253a44232f3c222f3c224c50263a44233a4423
+2b332224261c272c1f24261c1e241b24261c24261c272c1f2f3c224c5026333522
+3a442349601f3d5f253f4e1e3f4e1e3f4e1e47581f344d1e3c5822304321576a1f
+41671b3f4e1e4b681e576a1f4b681e49732349732354742841671b4b681e49601f
+4b681e5474283c582247581f49601f4973233c582249601f5474284973234b681e
+576a1f557f225f7b2a4b681e4b681e47581f47581f49601f3a4423272c1f2b3322
+333522272c1f24261c272c1f272c1f272c1f2b3322342d1f2b33222b33222b3322
+383c2324261c272c1f2f3c223f4e1e3f4e1e47581f344d1e3043214c5026697c2b
+576a1f49601f49601f576a1f49601f576a1f47581f3a44233a44233f4e1e3a4423
+3043213f4e1e3f4e1e3f4e1e3043213a44233335222b3322342d1f3043213f4e1e
+383c232b33223335223335222f3c222f3c222f3c222f3c22333522333522333522
+272c1f272c1f342d1f272c1f272c1f3335223335223f4e1e4c50263f4e1e574f26
+3f4e1e4c5026656c2668752b68752b576a1f556024556024576a1f5560243f4e1e
+3f4e1e383c23383c233a442347581f3f4e1e3a4423383c233a44233a44233f4e1e
+47581f3a44233f4e1e47581f556024556024576a1f5560243f4e1e47581f3a4423
+3f4e1e3a4423383c233f4e1e3a44232b3322333522344d1e3f4e1e4c50264c5026
+2f3c223f4e1e4c5026344d1e3f4e1e3f4e1e3a4423383c233f4e1e3a44233f4e1e
+4c50263a4423344d1e49601f47581f3a44233f4e1e3f4e1e4c50264c5026333522
+342d1f3335223335224e3d223f4e1e4c5026383c234c50265560244c50262b3322
+3a44233f4e1e49601f4c50263c58223f4e1e55602447581f4c50263a44234c5026
+3f4e1e47581f47581f3a44234c50264e4425383c23342d1f272c1f2f3c222f3c22
+3043213043212b33222f3c222b33223043212b33222b33222f3c222b33222b3322
+2b33222b33222b33222b33222b33222b33222b33222f3c222b3322304321304321
+2f3c223c582241671b576a1f60832a557f22557f22497323557f22497323576a1f
+5f7b2a557f2249732341671b497323557f22576b33576b333d5f253d5f2547581f
+4b681e4b681e3c5822557f2260832a5474285e74293d5f25344d1e3043213f4e1e
+354c313043213043212b33222b33222b33222f3c222b332224261c2b33221e241b
+2b3322272c1f2b33222b3322272c1f272c1f272c1f1e241b2b3322272c1f272c1f
+2f3c222b33222b3322272c1f2b3322272c1f272c1f2f3c222f3c222b3322272c1f
+2b33222f3c222f3c223c5822344d1e344d1e3a4423304321344d1e344d1e49601f
+47581f2f3c223043213f4e1e304321344d1e2f3c222e3c443043213043212f3c22
+304321344d1e354c31354c312f3c223043213d5f25344d1e354c31576b33496032
+3f4e1e4758323c582249601f68752b68752b656c26767b47656c264b693347581f
+4b6933547428567f3a5f7b2a697c2b708f316f8f526b852c5e742976872d497323
+3f4e324758324960324758323f4e1e4960324758323043213f4e323f4e323a4423
+3f4e32496032354c313f4e1e3d573b3043212f3c22383c233043212f3c22394446
+333522262e35272c1f24261c272c1f342d1f2a34382a34382f3c223f4e1e41671b
+3c58223043212f3c223335222b3322272c1f333522383c233f4e323a44233a4423
+3f4e32496032354c31333522272c1f262e35342d1f3336422b3322373e433f4e1e
+3a44233f4e324c50263f4e1e3a44233f4e323f4e1e4c50263335222b3322333522
+3335223a4423383c233f4e1e3a4423383c23383c232b33223f4e1e2f3c223f4e1e
+2b332224261c24261c272c1f1e241b24261c24261c24261c383c2347581f304321
+3f4e1e49601f47581f3f4e1e344d1e3a44233f4e1e3c58223c5822304321556024
+49601f2f3c224b681e41671b49601f47581f3f4e1e3f4e1e47581f4b681e4b681e
+4b681e49601f344d1e47581f3c58224b681e41671b41671b54742854742841671b
+4b681e54742854742841671b4b681e47581f3a4423383c23272c1f272c1f2b3322
+2f3c22272c1f272c1f24261c272c1f272c1f272c1f2b3322342d1f272c1f333522
+383c23272c1f272c1f3335223a44233a4423383c233a44233f4e1e49601f697c2b
+55582447581f49601f576a1f47581f47581f4c50263f4e1e3a44233f4e1e3f4e1e
+3a44233a44233a44234e44253a4423383c232b33222b33222b33223a4423383c23
+383c233335222b33222b33223335222f3c22383c23383c232b3322342d1f342d1f
+342d1f272c1f272c1f2b33222b3322333522383c233f4e1e4c5026383c233a4423
+3a44233a4423556024576a1f68752b576a1f47581f47581f576a1f576a1f47581f
+4c5026383c23383c233a44234c50263f4e1e3a44233a4423383c233a44233a4423
+4e4425383c233f4e1e3a4423555824556024656c265560243f4e1e4c50263f4e1e
+3f4e1e3f4e1e3f4e1e3f4e1e4c50263a44233f4e1e47581f576a1f55602447581f
+3a44233f4e1e47581f3f4e1e4b681e576a1f3f4e1e2f3c223f4e1e3a442349601f
+47581f4c50263f4e1e55582455602455582455582447581f4c50263f4e1e333522
+342d1f333522383c233f4e1e55602447581f383c23555824656c263f4e1e2f3c22
+3a44234c5026383c23383c233f4e1e3f4e1e3f4e1e47581f3043213f4e1e3a4423
+3f4e1e55582447581f304321383c23383c23383c23272c1f272c1f272c1f333522
+3335222b3322272c1f2b33222b33222f3c222b33222f3c222b33222b33222b3322
+272c1f2f3c222b33222b33222b3322272c1f2b33222b33222f3c22344d1e304321
+344d1e41671b5f7b2a576a1f60832a697c2b547428547428557f2249732341671b
+4b681e4b681e4b681e4b681e41671b41671b4b6933576b3347581f344d1e344d1e
+3d5f2549601f3c58224b681e4973234b681e41671b3c58223d573b344d1e354c31
+3043212f3c222a34382b33222b3322272c1f2b3322272c1f272c1f24261c1e241b
+2b3322272c1f272c1f2b3322272c1f272c1f272c1f272c1f24261c272c1f272c1f
+2f3c222b33222b3322272c1f2b33222b3322272c1f262e353043212b3322272c1f
+2b3322304321304321344d1e344d1e354c312f3c222f3c22304321344d1e3a4423
+3f4e1e2b3322383c23383c232f3c22354c313043212f3c223043212a3438304321
+2f3c22344d1e3043213f4e323a44233a4423496032344d1e49601f49603241671b
+3d5f25576b3347581f475832666b3b49601f5560244b69334b693349601f496032
+49603254742854742860832a5e7429697c2b547428576b335560246b8545576a1f
+3f4e3256603a4758324758323f4e325560244758322f3c22354c313a44232f3c22
+3a44233a44233a4423354c31344d1e354c313f4e323f4e323d573b344d1e3a4423
+2a3438342d1f262e35262e35272c1f262e35342d1f2a34383335223a4423475832
+3d5f25304321333522262e35262e35342d1f262e35272c1f383c233a4423354c31
+4c50264960323f4e1e373e43342d1f342d1f272c1f3335222b33222f3c223f4e32
+3a44233f4e1e3d573b3f4e1e3f4e1e47583247581f3a4423333522272c1f333522
+342d1f383c233a44234e4425383c23383c232f3c222f3c223f4e1e3a44233a4423
+342d1f24261c24261c24261c24261c24261c24261c272c1f3f4e1e4c50262f3c22
+344d1e3c5822344d1e3a4423304321344d1e3f4e1e4b681e3f4e1e333522333522
+2b33223335223f4e1e47581f49601f3f4e1e3f4e1e30432149601f3d5f2549601f
+4b681e49601f30432147581f3f4e1e41671b4b681e576a1f576a1f47581f49601f
+49601f49601f4b681e49601f4b681e3a44233335222b33222b3322272c1f342d1f
+3335222b3322272c1f2b3322333522272c1f272c1f272c1f272c1f333522333522
+383c23272c1f272c1f272c1f383c233a44232f3c224c502649601f576a1f757b2d
+55582447581f47581f5560243f4e1e3f4e1e3f4e1e3f4e1e3f4e1e3f4e1e3f4e1e
+383c232f3c222f3c223a44233f4e1e383c23342d1f333522333522443623383c23
+2f3c223335222b3322342d1f333522333522383c23383c233335222b33222b3322
+333522383c23333522383c23333522333522383c233f4e1e3f4e1e3a44233a4423
+3335224c5026576a1f656c2668752b55602449601f4c502647581f55602447581f
+47581f304321333522383c2347581f4c50263f4e1e4c50263f4e1e3a4423383c23
+383c233a44234c5026383c233f4e1e55602468752b576a1f5558243f4e1e49601f
+3f4e1e47581f47581f47581f47581f5560243f4e1e49601f4b681e49601f4c5026
+344d1e47581f5e742968752b576a1f5e742947581f3a442347581f30432147581f
+4b681e47581f3f4e1e55602455602455602455582447581f4c5026383c23383c23
+333522383c23383c23383c235558244e44254c502686874a666033383c233a4423
+3a44233f4e1e383c233043213f4e1e47581f49601f5560244c50264c50263f4e1e
+3a442347581f3a44232b33222f3c223a4423383c23272c1f24261c272c1f272c1f
+272c1f2b3322272c1f1e241b272c1f272c1f2b3322272c1f272c1f2f3c222f3c22
+2b33222b33222b33222b33222b33222b3322272c1f2b33222f3c22344d1e344d1e
+3c58225e74295e74295e74296b852c6b852c41671b49732349601f41671b49601f
+49601f47581f3c58223c58223d5f253c58223c58223d5f253c58223c5822304321
+344d1e3c58223c58223d5f2541671b41671b3c5822344d1e344d1e344d1e304321
+354c312f3c222f3c222b3322262e35262e352b3322272c1f2b33222b3322272c1f
+272c1f272c1f272c1f2b33222b33221e241b272c1f1e241b272c1f272c1f272c1f
+272c1f2b3322272c1f272c1f2b33221e241b2f3c22262e352f3c222f3c22272c1f
+272c1f344d1e344d1e3d5f25344d1e2f3c222f3c222f3c222f3c222f3c22304321
+2b3322333522272c1f3043212f3c22344d1e3043213043213043213043212f3c22
+2b3322354c31344d1e3f4e32475832383c233d573b49601f4758323c5822576b33
+3d5f255560245558243c5822576a1f3f4e1e4c50264960324b693347581f49601f
+3d5f25576b33657c445e7429697c2b576b334b681e576a1f4b681e5e7429576b33
+3a44233f4e323a44233a44233f4e324758323f4e322f3c223a4423373e432f3c22
+3043213f4e323f4e32354c313f4e1e3043213a44233f4e3255602447581f354c31
+2b3322272c1f24261c262e35272c1f2a3438272c1f2b3322262e353335223a4423
+3f4e32354c313335222b3322262e35272c1f3335223335222a34383a44233f4e32
+4c502647581f3f4e1e3a44232a34383335222a3438383c233043212f3c224c5026
+4c50264c502647581f4758323f4e1e47581f47581f3f4e1e333522272c1f333522
+272c1f3335223f4e1e4c5026383c23333522383c233335223a44233a44232f3c22
+272c1f24261c272c1f272c1f24261c24261c24261c2b3322383c233a44232f3c22
+2f3c2247581f344d1e383c233043213043212f3c2249601f3f4e1e272c1f342d1f
+2b33222f3c223043213c5822344d1e344d1e3f4e1e2f3c2247581f344d1e47581f
+3f4e1e49601f3043213f4e1e3f4e1e49601f49601f3f4e1e49601f3f4e1e49601f
+3f4e1e3c58223a4423344d1e3f4e1e2f3c22383c232b33223335222b33222b3322
+2b3322272c1f24261c2f3c22383c23272c1f272c1f2b3322333522333522333522
+383c232b33222b33222b33223a4423383c232f3c225560244b681e576a1f68752b
+5558243f4e1e49601f576a1f3f4e1e3f4e1e3a44233a44233f4e1e3f4e1e383c23
+3335223335223a44233a44233f4e1e2f3c22272c1f383c23383c23383c23333522
+2f3c223335222b3322333522342d1f333522383c233a4423333522272c1f2b3322
+2b3322383c233335222f3c22333522342d1f2f3c223a44234e4425383c23383c23
+2f3c223f4e1e556024576a1f68752b576a1f5560243f4e1e4c502647581f47581f
+3f4e1e3a4423383c23383c234c50264c502649601f47581f3f4e1e3f4e1e3f4e1e
+383c233a44234c5026383c233a442355602477874655602447581f555824556024
+3f4e1e49601f55602455602447581f556024576a1f556024576a1f49601f4c5026
+3f4e1e3f4e1e576a1f697c2b656c2668752b49601f47581f5558243a4423556024
+576a1f47581f555824555824555824576a1f5558244c50264c5026333522383c23
+3335223a4423383c233335223f4e1e383c23574f26867c4c5560244e44253a4423
+383c233a44233f4e1e3c582247581f49601f576a1f68752b576a1f4c50263f4e1e
+3a44234c50263a4423342d1f3a44233a44233a44232f3c22272c1f2b3322272c1f
+272c1f272c1f272c1f272c1f272c1f1e241b2b33222b3322272c1f272c1f2f3c22
+2b33222b3322272c1f2b33222b3322272c1f2b33222f3c22304321344d1e3d5f25
+3c5822697c2b76872d76872d7b90346b852c576a1f4b681e3d5f2549601f4b681e
+49601f3f4e1e344d1e3c582249601f3c58223c58223c58223f4e1e344d1e3a4423
+344d1e304321344d1e3c58223d5f25344d1e3c5822304321344d1e344d1e354c31
+2f3c222b33222b33222b33222b3322272c1f2b3322272c1f1e241b272c1f1e241b
+2b33221e241b272c1f272c1f272c1f272c1f1e241b272c1f1e241b2b33221e241b
+272c1f272c1f304321262e352b33221e241b2b33222b33222f3c222f3c22272c1f
+2b3322344d1e3c5822344d1e344d1e2f3c222f3c222b33222b33222f3c222f3c22
+2b33222b3322272c1f2f3c222b3322304321304321304321304321304321304321
+2a34382f3c22344d1e3c58224e5043383c233f4e1e4960324b69333c5822475832
+3f4e1e565838475832344d1e4c50263f4e1e3f4e1e3c58224b69333d5f25475832
+4b69335e7429657c44576a1f556024555824496032576b3341671b4b6933547428
+3a4423383c233336423a44233a44233f4e323f4e322f3c222e3c44333522262e35
+2f3c22354c313f4e1e3f4e1e475832354c313a44233f4e324b693347581f383c23
+2a3438262e35262e35272c1f342d1f262e352b33222b3322333522262e35383c23
+3f4e323a44232f3c22262e352b33222f3c223a44233944462b3322342d1f2f3c22
+2f3c223a44233a44232f3c222f3c223335222f3c223f4e323a44232e3c443f4e32
+3d5f2549601f3d5f2547581f47581f3f4e324c50263a4423383c232b3322333522
+2b3322333522344d1e3f4e1e3a4423342d1f3a44233f4e1e3a44233a44232f3c22
+333522272c1f2b3322383c23342d1f24261c272c1f3335222f3c222f3c22272c1f
+342d1f3f4e1e3a44233043213a44233f4e1e3f4e1e4b681e3f4e1e304321304321
+3043213f4e1e3a442347581f3043213a44233043212f3c22344d1e2f3c2249601f
+3043213f4e1e30432147581f3f4e1e47581f49601f47581f47581f3a4423304321
+2f3c223a44232f3c22383c233a44232f3c224c50262f3c222f3c222b3322333522
+342d1f272c1f272c1f342d1f2f3c22272c1f272c1f2b33222e3c44383c23383c23
+333522383c23342d1f2b33224e44252f3c22383c2355582447581f4c5026656c26
+4c50263f4e1e5560245560243f4e1e3f4e1e4c50263a44233a44233a4423333522
+3335222b3322383c233a44233a4423383c23333522333522383c23333522333522
+383c233335223335222b33222b33223335223a44233a44232b33222b3322272c1f
+333522383c233043213a44233043212b33223335223a44233a44233a44233a4423
+3a44234c5026556024576a1f68752b656c26576a1f47581f3f4e1e3f4e1e47581f
+4c50263f4e1e383c23383c233f4e1e3f4e1e49601f4b681e5560245560243f4e1e
+3a44233f4e1e4c50263f4e1e3a442355602486874a55602447581f47581f556024
+47581f47581f576a1f4b681e5560244b681e556024556024576a1f49601f49601f
+49601f55602447581f656c26556024656c26556024555824576a1f3f4e1e555824
+656c264c50264c50264c50264e4425574f263f4e1e3f4e1e3f4e1e383c233f4e1e
+383c23333522333522333522383c23443623666b3b766e2d3a4423383c23383c23
+344d1e3043213f4e1e4c502649601f47581f556024757b2d68752b3f4e1e3c5822
+3043214c50263043213f4e1e3f4e1e3a4423344d1e3f4e1e344d1e344d1e272c1f
+272c1f2b3322272c1f2b3322272c1f272c1f24261c1e241b272c1f272c1f24261c
+24261c1e241b272c1f2b3322272c1f272c1f272c1f272c1f2f3c223043213f4e1e
+47581f656c26757b2d757b2d87872c5e742949601f3d5f253f4e1e344d1e49601f
+49601f304321344d1e3c58223f4e1e344d1e344d1e3c5822344d1e344d1e304321
+2f3c22344d1e344d1e344d1e344d1e344d1e344d1e304321344d1e3f4e1e344d1e
+2f3c222f3c222b3322272c1f272c1f2b33221e241b2b33222b33222b33221e241b
+272c1f272c1f272c1f272c1f2b3322272c1f24261c272c1f1e241b272c1f272c1f
+272c1f272c1f2b33222b3322272c1f272c1f2f3c22272c1f2f3c22304321272c1f
+2f3c22344d1e3c58223c58223043212b33222f3c222b33222b33222f3c22272c1f
+2f3c222b33222b33222f3c222f3c222f3c222a34383043213043213043212b3322
+2f3c22304321344d1e344d1e3f4e1e304321344d1e3d5f255558243f4e323f4e1e
+475832556024344d1e3d573b3043213a44233f4e323f4e1e4960324b69334b6933
+4b693362744468752b49601f3f4e1e4e50435474284b69334b69335f7b2a656c26
+383c23373e433335223f4e323a44233f4e32354c31383c233a44232b3322333522
+2f3c22354c31354c31344d1e4758323f4e1e3a44233f4e32576b333c5822373e43
+2b33223335222a34382b3322373e432b3322383c23304321383c23262e352b3322
+2f3c223a44233043212a3438342d1f2f3c223f4e322f3c222f3c222a3438342d1f
+2a3438383c233a4423373e43333522262e352f3c2239444633352233352254605f
+576b33547443576b333f4e1e47581f3c58223f4e323a4423383c23272c1f333522
+272c1f2f3c223f4e1e3a44233f4e1e383c233f4e1e3a44233335223335222f3c22
+2b332224261c2f3c223a4423333522383c23344d1e4c5026304321333522272c1f
+3335222f3c223a4423344d1e3f4e1e47581f47581f576a1f3c582247581f344d1e
+3a44233f4e1e344d1e344d1e49601f344d1e344d1e344d1e3f4e1e2f3c223f4e1e
+3d5f253f4e1e3f4e1e49601f49601f49601f49601f47581f47581f3a4423333522
+3335222b33222b33222f3c222f3c223f4e1e47581f3f4e1e3a4423383c23333522
+272c1f272c1f272c1f272c1f2b3322272c1f272c1f3335222f3c222b3322373e43
+333522383c233335222f3c223f4e1e383c23383c2355582447581f3a4423656c26
+3f4e1e3a44235560245560243f4e1e3f4e1e3a44233a4423383c23383c23333522
+342d1f2b3322383c23383c233a4423383c233335222f3c223a44234e4425383c23
+383c23333522333522383c232f3c22383c23383c23333522342d1f272c1f272c1f
+2b3322333522383c233a44233a4423383c23333522383c233a44233a44233f4e1e
+5558243f4e1e555824576a1f68752b576a1f55602447581f3f4e1e4c502647581f
+4c50263f4e1e383c233a44233f4e1e3a442347581f4b681e47581f47581f47581f
+3f4e1e47581f5558243f4e1e3f4e1e767b478b90555558243f4e1e3c582247581f
+3f4e1e3f4e1e55602449601f47581f3f4e1e3f4e1e4c502655602447581f49601f
+47581f47581f3f4e1e4c50263a4423656c26576a1f5558244c5026383c233a4423
+47581f3f4e1e3f4e1e3f4e1e3043213a44234436234436234e4425443623383c23
+443623342d1f333522333522383c23666033766e2d4436232f3c22304321304321
+3a44233f4e1e3f4e1e5558243a44233f4e1e3a4423574f26666b3b3a442347581f
+344d1e3f4e1e3f4e1e3a4423344d1e3a44233043213c58223c5822344d1e272c1f
+272c1f272c1f2b33222b3322272c1f2b3322272c1f272c1f1e241b272c1f272c1f
+272c1f272c1f1e241b272c1f272c1f272c1f272c1f2b33223335222b3322383c23
+4e4425574f26604f2a556024766427576a1f3f4e1e344d1e3a4423383c233a4423
+383c2330432130432147581f344d1e344d1e3c5822344d1e344d1e304321304321
+344d1e2f3c22304321304321344d1e304321304321304321304321354c31344d1e
+2f3c222b33222f3c22272c1f2b3322272c1f2b3322272c1f1e241b272c1f24261c
+272c1f1e241b272c1f272c1f272c1f272c1f272c1f24261c1e241b272c1f272c1f
+1e241b2b33221e241b272c1f272c1f262e352b33222b3322344d1e344d1e24261c
+272c1f2f3c22304321344d1e3043212f3c222b33222b33222b33222f3c222b3322
+2b33222b3322272c1f2b33222f3c222f3c222f3c222f3c222f3c223043212b3322
+304321344d1e2f3c22304321354c313043213c5822344d1e3f4e1e304321344d1e
+3d5f25475832344d1e3c58223043212f3c223f4e1e3f4e1e4960323d5f254b6933
+576b33656c26576b3347581f3a44233f4e1e4b693341671b3d5f255e74295e7429
+3336423335222e3c444758323a44233a44233a4423373e43333522262e352a3438
+354c313043213335222f3c223f4e323f4e1e3f4e1e475832496032344d1e354c31
+333522383c23383c23333522383c23383c233a44233f4e32383c23272c1f333522
+2f3c223944463a4423262e352b33223043213a44233f4e323a4423383c232f3c22
+3335222b3322383c23333522333522262e352b33223335222a34382b332254605f
+576b33576b33576b3349601f3f4e1e47581f3f4e1e383c23383c23304321304321
+383c233f4e1e3a44233a44233f4e1e2f3c22383c233f4e1e2f3c222f3c222f3c22
+272c1f272c1f3a44233f4e1e2f3c222f3c223f4e1e3c58223a44232f3c222b3322
+383c23383c233f4e1e3f4e1e47581f49601f49601f41671b4b681e4b681e47581f
+344d1e344d1e3f4e1e344d1e576a1f49601f47581f3f4e1e3c58222f3c22344d1e
+47581f3a4423344d1e49601f3d5f253f4e1e3f4e1e344d1e3a44232b3322272c1f
+2b3322272c1f3043213f4e1e3f4e1e3f4e1e3f4e1e344d1e4c50263043212f3c22
+2b3322272c1f272c1f24261c272c1f272c1f272c1f2f3c22383c232b33223a4423
+2b3322373e43342d1f3335223a44233a44233335224c50263a44233a4423555824
+4c50263f4e1e4c50265558243f4e1e3f4e1e2f3c22383c23383c232f3c222f3c22
+2b3322383c23383c23383c233a44232f3c223a4423383c233f4e1e3f4e1e2f3c22
+383c232f3c222b33222b3322383c233a44233a44233a44232f3c22383c232b3322
+2b33223335222f3c223a4423383c233a4423383c233a44233f4e1e3f4e1e3f4e1e
+4c50264c50264c502655602468752b656c26656c2655602447581f4c5026555824
+3f4e1e3f4e1e3f4e1e3f4e1e383c233f4e1e47581f49601f49601f5560244c5026
+3f4e1e3f4e1e4c50263f4e1e3f4e1e857d679e98535558243f4e1e3a442347581f
+47581f3f4e1e3f4e1e4c50263f4e1e383c233f4e1e3a44233a44233f4e1e3a4423
+47581f4c5026333522333522383c235558245558243f4e1e383c23272c1f342d1f
+3a44233335223335223335223335223a4423383c233a4423333522333522333522
+272c1f342d1f383c23333522574f26857d67555824333522342d1f3043213a4423
+3043213a44233f4e1e4c50263335222f3c223335223335223a4423344d1e47581f
+3f4e1e3f4e1e47581f344d1e383c233a44233a4423344d1e4c5026304321304321
+2b33222b3322272c1f2b3322272c1f272c1f2b332224261c272c1f24261c24261c
+272c1f1e241b272c1f272c1f272c1f272c1f272c1f272c1f2b33223335222f3c22
+3a44233f4e1e4c5026555824656c264e4425383c233a4423383c233335222b3322
+2b3322333522383c234c50263a4423344d1e344d1e3c58223043213043212f3c22
+2f3c222f3c222b33223043213043213043213043213043212f3c22354c312f3c22
+2b33222b33222f3c22272c1f2b33222b33222b33222b332224261c272c1f272c1f
+272c1f1e241b272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f1e241b272c1f272c1f2f3c22272c1f2f3c22344d1e2b3322
+2b33222b3322344d1e344d1e3043212b3322272c1f272c1f272c1f2f3c22272c1f
+2b3322272c1f262e352b33222b33222a34382b33222f3c223043212f3c222f3c22
+3043213043212a34382f3c223043213c58223c5822354c31304321354c312f3c22
+354c313f4e1e2f3c22354c312f3c222f3c223a44234758324960323d5f2541671b
+576b3354744349601f49601f3a4423354c314b69333c58224b6933547428576a1f
+383c2333352233352256603a4c50263a44233f4e32333522333522342d1f333522
+394446304321333642383c23354c313f4e1e3c58223f4e1e3c5822304321394446
+2f3c222e3c443335222e3c443a44233a44233f4e323f4e323a44232b3322394446
+344d1e3a4423354c313335222b33223043213a44233a44233a44233944462f3c22
+333522342d1f3335222f3c222b3322272c1f2f3c22333522262e352b33223f4e32
+576a625e742949603249601f576b33496032354c313a44233a44233043212f3c22
+383c233f4e1e3a44233a442347581f3a4423383c233a4423383c232f3c22333522
+24261c272c1f3a442347581f3f4e1e4c50263f4e1e47581f3f4e1e2f3c222b3322
+3f4e1e3a44233f4e1e3a44234c502649601f49601f41671b3f4e1e3f4e1e3a4423
+3f4e1e3f4e1e2f3c222f3c2247581f4b681e49601f47581f47581f304321344d1e
+49601f3f4e1e3f4e1e4b681e47581f3f4e1e3f4e1e304321383c23342d1f272c1f
+2f3c222b332230432147581f3f4e1e47581f4c5026344d1e47581f3f4e1e333522
+272c1f272c1f272c1f272c1f342d1f272c1f272c1f3043212f3c222f3c223a4423
+3335223335223335223335223a44233043213335224c50264c5026556024556024
+574f263f4e1e3a44234c50263f4e1e3f4e1e3f4e1e383c234e44253a44233a4423
+3a4423383c23383c233a4423383c233a44233a4423383c234c50264c50263a4423
+383c23383c23383c232b3322383c233a4423383c233a4423333522383c23333522
+2f3c222f3c223a44232f3c22383c233f4e1e3a44233a44234e44254c50263a4423
+3a4423383c233f4e1e47581f656c2668752b576a1f55602449601f4c502647581f
+4c50263a44233f4e1e3f4e1e3a44233f4e1e49601f49601f49601f49601f47581f
+5558244c5026574f263f4e1e3a442386874aada17f4c5026383c23383c23344d1e
+344d1e3043213a4423304321383c23383c233f4e1e383c23333522383c23333522
+383c233a4423333522342d1f3335223a4423383c23443623333522272c1f342d1f
+2f3c223335223335222b3322342d1f2f3c22383c23383c23272c1f272c1f272c1f
+24261c272c1f383c233a44236660335658384e44253a44233335223043213f4e1e
+3a44233a44233a442347581f3f4e1e3a44232f3c22333522383c233f4e1e47581f
+47581f2f3c223a44233a44233043212f3c22344d1e3f4e1e344d1e383c233a4423
+3335222b33222b3322272c1f272c1f272c1f272c1f272c1f272c1f24261c24261c
+272c1f24261c24261c24261c24261c24261c24261c272c1f2b3322272c1f383c23
+3335223f4e1e3a44234c502647581f3a44233335223a44232f3c22333522333522
+272c1f3335223335223a44233335222f3c223043213a44232f3c222f3c222f3c22
+2b33222b33222b33222b33223043212f3c223043212f3c222f3c223043212b3322
+2b3322272c1f2b33222f3c222f3c222b33222f3c22272c1f2b33221e241b2b3322
+24261c2b33221e241b2b3322272c1f1e241b24261c24261c272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f2b3322272c1f2b3322344d1e2f3c22
+2b33222b33223043212f3c222b3322272c1f272c1f272c1f272c1f2f3c22272c1f
+2b3322272c1f2b33222f3c222b33222f3c222f3c222f3c223043212f3c222b3322
+304321354c312b33222f3c22344d1e344d1e3d573b3043212b3322344d1e2b3322
+3043212f3c223043212f3c223043212b33223a44235560243f4e323d5f254b6933
+4b693349601f47581f344d1e3a44233f4e1e49601f3d5f25576b335e7429656c26
+2a34382b33222a3438576b3356603a3f4e323a44232a34382a34382a3438342d1f
+2e3c443335222b33223335223f4e32475832475832344d1e47581f344d1e354c31
+2b33222f3c22333522383c233f4e323a44234c50263f4e32383c232f3c222f3c22
+3f4e323f4e1e3a44232f3c22373e433a4423333642383c232f3c223335222f3c22
+333642272c1f2b33222f3c223335222e3c442f3c222f3c222e3c44304321496032
+60847163747149603247583249601f49601f3f4e1e2f3c223a44233043213a4423
+383c233f4e1e383c233f4e1e5558243f4e1e2f3c223a4423344d1e383c232f3c22
+2b33222f3c223f4e1e47581f47581f47581f47581f47581f3f4e1e383c23333522
+3a44233a44233a44233a44232f3c2249601f49601f3c58223f4e1e2f3c22333522
+3f4e1e49601f2b33223a442349601f47581f47581f3c58223f4e1e47581f49601f
+49601f3f4e1e344d1e4b681e49601f3f4e1e3f4e1e3a44232b33222b3322272c1f
+2f3c223043213f4e1e3f4e1e47581f47581f556024555824555824383c23333522
+272c1f272c1f24261c24261c272c1f24261c2b33223f4e323f4e323a44233f4e32
+3335223335223335222f3c223f4e1e3f4e1e304321475832556024656c26666033
+5560245560243a442347581f4e44254c50263f4e1e3f4e1e47581f3a44233a4423
+3a44233f4e1e3f4e1e3a44233a44233a44234e44253a44233a44233f4e1e3a4423
+3a4423333522272c1f333522333522383c233a44233335223a4423383c232f3c22
+3a4423383c232f3c22383c23383c233a44234e4425383c233f4e1e3f4e1e3f4e1e
+3a4423383c234c5026556024656c26576a1f55602447581f5558243f4e1e3f4e1e
+3f4e1e3a44233a44233a4423383c233f4e1e47581f49601f47581f47581f47581f
+47581f3f4e1e4c50263f4e1e344d1e857d67ada17f574f263043212f3c222f3c22
+3a44232b3322383c23383c23333522383c234e4425383c233335222b3322342d1f
+2f3c22383c23342d1f2b33223335223335223335222f3c22342d1f24261c272c1f
+344d1e333522272c1f272c1f272c1f383c23342d1f2b3322342d1f24261c333522
+272c1f24261c383c23574f2674643e4e4425333522383c232f3c223f4e1e344d1e
+3a44234e4425383c233f4e1e5558243a4423383c233043212f3c223043214c5026
+3a44232f3c222f3c222f3c22383c233335223f4e1e3a44233a44233f4e1e3f4e1e
+2f3c223335222b3322272c1f272c1f272c1f24261c272c1f1e241b272c1f272c1f
+24261c272c1f272c1f24261c272c1f272c1f24261c272c1f272c1f272c1f333522
+333522383c233f4e1e3a442347581f3f4e1e2f3c222b33222b33222f3c222f3c22
+2b3322333522342d1f3335222b3322342d1f2b33222b33222f3c22272c1f2b3322
+272c1f2b33222b33222b33222b33222b33222b33222f3c222f3c222b33222f3c22
+272c1f2b33222b33222b33222b33222f3c222b33222b3322272c1f272c1f272c1f
+272c1f1e241b272c1f272c1f2b332224261c272c1f2b332224261c272c1f272c1f
+272c1f272c1f24261c272c1f1e241b2b33222b33222b33222b33222f3c222f3c22
+2b33222b33222b33222b33222f3c22272c1f2b3322272c1f272c1f2b33221e241b
+2f3c22272c1f2b33222b33222b33222f3c223043213043212f3c223043212f3c22
+2f3c222f3c222b33222b3322344d1e354c31344d1e2f3c222b33222f3c222f3c22
+2f3c223043213043212f3c223043212b33222f3c223f4e32344d1e41671b3d5f25
+49603247581f3c58223f4e1e3f4e1e354c313d5f253d5f253d5f2549601f627444
+383c23342d1f33364255602456603a3f4e1e4e44253336422b33223335222b3322
+373e433335222b3322383c233f4e32475832475832354c313f4e323f4e323a4423
+3944463043213a4423383c234e50433f4e1e3336423335222b3322342d1f2f3c22
+383c234e50433f4e1e2f3c223043212f3c223335223335223335222e3c442b3322
+342d1f272c1f342d1f373e43333522383c233043212f3c222f3c2230432154605f
+75889b77877262744456603a576b33556024354c313f4e323a44233043213a4423
+3335223a4423383c233a44234c50263a44233a44233a44233f4e1e3f4e1e2f3c22
+2f3c223043213f4e1e47581f5558244c50264c50264c50264c5026304321383c23
+333522333522272c1f2b3322383c234b681e49601f47581f344d1e2f3c22383c23
+3a44234c502633352230432149601f49601f49601f3d5f2547581f47581f49601f
+47581f3f4e1e47581f576a1f49601f3f4e1e3043212f3c22383c23272c1f2f3c22
+3f4e1e2f3c2247581f576a1f49601f4b681e47581f4c50263f4e1e2f3c22342d1f
+342d1f272c1f342d1f24261c2b3322272c1f3335224e5043354c313f4e323a4423
+2f3c22383c2333352233352247581f354c3130432147583256603a56603a4c5026
+4e44254c50263a44233f4e1e3a44233a44233f4e1e4c502647581f3f4e1e383c23
+383c234c50264c50263f4e1e3a4423383c233a4423383c23383c233a4423383c23
+3f4e1e33352224261c24261c3335223335222f3c223335223a44233a44233a4423
+3f4e1e3f4e1e3a44233043213a44233f4e1e383c232f3c223f4e1e3f4e1e3a4423
+3a44233a442349601f4b693355602455602447581f3f4e1e4c50264c50263f4e1e
+3a44233335223a4423304321383c232f3c223f4e1e3a44233f4e1e3a44233f4e1e
+49601f3f4e1e3f4e1e3c58223f4e1e77874695885c4c50262f3c222f3c222f3c22
+3335222b33223335222b33223335223a44233a4423383c23333522272c1f272c1f
+333522333522342d1f2b3322333522342d1f342d1f2b3322272c1f24261c272c1f
+383c23383c23272c1f24261c24261c2b332224261c272c1f272c1f24261c272c1f
+342d1f24261c383c23666b3b6660333335222b33223a44233a442347581f3a4423
+3a44233a44232f3c2249601f576a1f4c50263f4e1e3a44233043212f3c22383c23
+3335222b33223335222b33222b33222f3c223f4e1e3a44233a44233f4e1e555824
+383c23342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f24261c24261c272c1f24261c342d1f272c1f272c1f2b3322
+2b33223335223043213a44233f4e1e47581f3043213043212b33223a44232f3c22
+2f3c222f3c223335223335223335222b3322272c1f342d1f272c1f272c1f272c1f
+2b33222b33222b33222b332224261c2b3322272c1f2b33222b33222b33222b3322
+272c1f2b33222b3322272c1f272c1f2b33222b3322272c1f272c1f272c1f272c1f
+2b3322272c1f272c1f2b3322272c1f272c1f272c1f24261c24261c272c1f24261c
+2b3322272c1f272c1f24261c272c1f2b33222b33222b33222f3c222f3c22304321
+272c1f2b33222b3322272c1f2b3322272c1f272c1f1e241b272c1f2f3c222b3322
+2f3c222b33222f3c222b3322272c1f2b33223043213043212a34382b3322262e35
+2f3c223043212b3322262e35344d1e2f3c222f3c222f3c222b33222f3c22262e35
+2f3c222f3c222f3c222f3c22344d1e2f3c222b3322344d1e344d1e3d5f253c5822
+4960324c5026304321344d1e3f4e1e3043213d5f253f4e1e3c5822475832556024
+3335222a3438383c2355602456603a3f4e323a44232e3c44342d1f2a3438333522
+342d1f3336422b3322373e433a442347581f344d1e3a44233944463a44232f3c22
+354c313f4e1e3f4e32354c314c50263a44233335222a3438342d1f262e352b3322
+383c233a4423383c23383c23373e432b3322272c1f342d1f3335223335222b3322
+2a3438342d1f2b33222f3c223335222a34382f3c2230432130444d3043214b6865
+7090818da0b66b8673576b3362744449601f3a4423344d1e3f4e1e3a4423383c23
+383c233a44232f3c223a44234c50263f4e1e3f4e1e3f4e1e3a44234e44253a4423
+2f3c22383c233a44233a442347581f3f4e1e4c5026383c233f4e1e3f4e1e333522
+342d1f24261c24261c24261c3043213f4e1e344d1e49601f47581f3f4e1e47581f
+3f4e1e3f4e1e3a44233a44233f4e1e3f4e1e47581f49601f3d5f2547581f556024
+2f3c222b3322383c2347581f47581f556024344d1e3f4e1e3a44232f3c223a4423
+3f4e1e33352247581f55602447581f3f4e1e3f4e1e3335223335223335222f3c22
+2b33222b3322272c1f272c1f342d1f2b33222b3322333642383c233f4e323a4423
+2f3c223043212f3c223a442349603256603a344d1e4758324758323f4e1e4c5026
+383c23383c233a44234436233f4e1e3a44233a44233f4e1e5558243a4423383c23
+3a44233f4e1e47581f47581f3a4423383c23333522342d1f333522333522383c23
+3a4423342d1f24261c24261c342d1f383c23272c1f333522383c23383c23383c23
+3f4e1e3f4e1e3a4423383c233a4423383c233a4423383c233a44234e4425333522
+3335223a4423556024656c26576a1f5560244c50263a44234c50263f4e1e3f4e1e
+3a4423383c233f4e1e3a44232b33223a44233a4423383c23383c23383c23333522
+3f4e1e3a44233f4e1e5558244b69338b9055767b473a4423344d1e3a44232f3c22
+2b33222b33222b3322383c233043213f4e1e383c233f4e1e272c1f342d1f342d1f
+2b33222b3322333522342d1f272c1f272c1f342d1f24261c24261c24261c24261c
+2b3322333522342d1f24261c272c1f24261c272c1f272c1f272c1f272c1f333522
+2f3c223335223a442395885c556024383c233335223f4e1e3f4e1e5560244c5026
+3a44233a442333352247581f576a1f3f4e1e3a4423344d1e383c233a4423304321
+2b3322342d1f333522272c1f383c23383c233a4423344d1e3a44233a44233f4e1e
+2f3c22272c1f272c1f272c1f272c1f24261c24261c272c1f24261c24261c272c1f
+24261c24261c24261c272c1f24261c24261c272c1f272c1f272c1f272c1f272c1f
+272c1f2f3c222f3c22344d1e3f4e1e344d1e3043213f4e1e304321304321383c23
+3043213043212f3c222f3c222f3c223335222b33222b33222b3322272c1f1e241b
+24261c272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f1e241b272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c24261c
+272c1f1e241b272c1f2b33222b33221e241b272c1f24261c272c1f272c1f272c1f
+272c1f272c1f24261c272c1f272c1f272c1f2b33222b33222f3c222f3c222f3c22
+272c1f2b33222b33222b33222b33222b3322272c1f272c1f272c1f272c1f2b3322
+2f3c222b3322272c1f3043212f3c22304321344d1e344d1e2f3c222b33222f3c22
+262e352f3c222f3c22262e353043213043212f3c222b33222b33222f3c222b3322
+2f3c222f3c222a34382f3c22354c312f3c222b33223043213d573b3c58223d5f25
+3f4e1e3d573b344d1e344d1e4c50263043213c58223c5822344d1e344d1e3f4e32
+2f3c222a34383f4e32576b33576b33565838383c23333522262e352b33222a3438
+2b33223335222a3438373e433a4423496032354c313a44232f3c22383c23383c23
+4c50263a44234e44253f4e1e4758323a4423342d1f2b332224261c262e35342d1f
+2b3322373e433335222b3322333522342d1f2a34382b33223336423335222b3322
+3335222f3c222a34382f3c223335222b33222a34383a44233043213d4f56496065
+6886a6757c71576a626b8673657c444758323f4e1e3f4e323a44233f4e1e3a4423
+3a44233335223335223335223a4423383c23383c234c50263a4423383c234e4425
+383c234e4425383c233335224c50263f4e1e4c5026342d1f333522333522342d1f
+272c1f24261c24261c24261c383c23383c232f3c2249601f47581f55602449601f
+4c50265558245558244c5026383c233335223a442355582447581f49601f556024
+33352224261c2b33223f4e1e4c502647581f344d1e3f4e1e3043213a442347581f
+47581f383c234c50263f4e1e4c50263a44234c50262b3322272c1f333522333522
+3335222b3322272c1f2b3322272c1f394446354c312f3c223a4423354c31354c31
+3f4e32354c31304321496065576b3356603a3f4e1e4c50264c50263f4e1e4c5026
+3335223335223a44233335223a44233a44233043213f4e1e3f4e323a4423383c23
+3a44233f4e1e5558243f4e1e3a44233a4423383c23333522333522383c23383c23
+3a4423342d1f333522272c1f342d1f333522342d1f333522333522333522383c23
+3a44233f4e1e3f4e1e2f3c223043213a44232f3c222f3c223a4423383c23333522
+3335223a44233f4e1e576a1f656c26576a1f47581f4c502647581f3f4e1e4c5026
+3f4e1e3a44233f4e1e3a44232f3c222f3c222f3c222b33222b3322342d1f333522
+383c233a4423383c234c502655602486874a75704d3335223335222f3c222b3322
+342d1f342d1f272c1f2b33224c50263f4e1e3a44233a44233335222b3322383c23
+2f3c222b33223043212b332224261c3335222b3322272c1f272c1f272c1f24261c
+272c1f272c1f2b3322272c1f24261c24261c1c1e1924261c2b33223335222b3322
+2f3c222f3c22555824ada17f5558243f4e1e2f3c224c50263f4e1e3f4e1e49601f
+3f4e1e3a4423333522383c236660334c50263a44232b3322272c1f3043213a4423
+2f3c22342d1f342d1f2b33223043213a4423304321344d1e3a44233a44232f3c22
+3a44232b33222b33222b332224261c272c1f24261c272c1f272c1f272c1f272c1f
+272c1f24261c24261c272c1f24261c24261c24261c272c1f272c1f272c1f272c1f
+272c1f2f3c22383c233a442347581f3c5822304321344d1e3043213043212f3c22
+304321344d1e304321383c233043212f3c222b33222b3322272c1f272c1f272c1f
+272c1f272c1f2b3322272c1f272c1f2b332224261c272c1f272c1f272c1f272c1f
+272c1f1e241b272c1f24261c24261c272c1f272c1f24261c24261c1e241b1e241b
+1e241b272c1f272c1f272c1f272c1f1e241b272c1f1e241b24261c24261c24261c
+272c1f272c1f272c1f1e241b272c1f272c1f272c1f272c1f342d1f333522333522
+2b3322272c1f272c1f272c1f272c1f2b3322272c1f272c1f1e241b2f3c222b3322
+2b3322272c1f2f3c222f3c222b33222a3438344d1e344d1e3043212b3322272c1f
+2b33222f3c222f3c222b33222f3c222a34383043212a3438262e352b33222a3438
+2f3c22304321262e352b33222f3c222f3c222b3322304321344d1e354c31344d1e
+3f4e1e354c312f3c22354c313a4423304321344d1e3d573b344d1e344d1e3a4423
+3a4423333522383c2366603356603a56603a3a44232e3c443335223336422b3322
+373e433a44232f3c22383c233f4e3247581f354c313a44233043213a44233a4423
+3f4e323f4e1e3f4e323f4e324758323a4423333642342d1f262e35272c1f262e35
+3335222f3c222a3438342d1f2a34382b3322272c1f2b33222f3c22333522333642
+2f3c223a4423383c233335223043213335222b3322373e434b6865667c74667c74
+667c74496065465864778772657c444758323f4e1e3f4e1e4758323f4e323f4e1e
+4c5026333522342d1f383c23383c233335223a44233a4423304321383c23333522
+272c1f342d1f3335223335223a4423383c23333522272c1f33352233352224261c
+24261c24261c24261c24261c272c1f272c1f3335224c502647581f3f4e1e555824
+3a44235558245558244e44253a4423333522383c233f4e1e4c502649601f4c5026
+272c1f272c1f272c1f333522304321383c233a44233a44233a44234c50264b681e
+576a1f3f4e1e3f4e1e47581f3f4e1e3f4e1e3a4423333522333522304321333522
+2b33222b3322272c1f272c1f272c1f3f4e324e50434960323f4e324c50263f4e32
+3f4e323f4e323a44234658645658384758323f4e323f4e3256603a4c502647581f
+4436233335223a44232f3c223a44233a44233a44233f4e1e4e44253a4423333522
+3a44233f4e1e3f4e1e3f4e1e383c23383c23333522333522383c233335223a4423
+383c23342d1f272c1f342d1f2b3322383c233f4e1e383c23383c23333522383c23
+3a4423383c233a44233f4e1e3a4423383c23383c233043213a44232f3c222f3c22
+3a44234c5026475832576b33627444576a1f47581f47581f49601f47581f47581f
+344d1e3a442347581f304321383c233a44232f3c22272c1f342d1f272c1f272c1f
+3335223335223a442355602456583887886d4c5026342d1f272c1f333522333522
+272c1f272c1f2b33222f3c223043212f3c223043213a4423272c1f272c1f2f3c22
+2b33222b33222b33222b3322272c1f2b3322304321383c23272c1f24261c272c1f
+24261c272c1f333522333522272c1f342d1f272c1f342d1f342d1f333522383c23
+3a442333352275704d9d99815558245560243a44233f4e1e3f4e1e3f4e1e47581f
+4c50263a44232b33222f3c2247581f3f4e1e3043212b3322272c1f2f3c22304321
+272c1f272c1f272c1f272c1f3a4423344d1e383c233a44232f3c223a44232f3c22
+3a44232b3322272c1f272c1f2b3322272c1f342d1f2b3322272c1f272c1f272c1f
+24261c24261c24261c272c1f272c1f342d1f272c1f272c1f272c1f24261c2b3322
+272c1f2b33223335223043213f4e1e47581f344d1e344d1e3f4e1e344d1e304321
+344d1e3f4e1e344d1e3f4e1e3043212f3c222b33222b33222b3322272c1f272c1f
+2b33222b33221e241b2b33222b33222b33222b3322272c1f272c1f272c1f24261c
+24261c24261c24261c1e241b272c1f24261c24261c24261c24261c24261c24261c
+272c1f272c1f1e241b24261c24261c24261c1e241b24261c24261c24261c272c1f
+272c1f272c1f24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f24261c272c1f1e241b272c1f272c1f1e241b272c1f272c1f
+2b3322272c1f2b33223043212b33222f3c22344d1e304321344d1e2f3c222b3322
+272c1f272c1f2b33222b33222a34382f3c222f3c222f3c222b3322272c1f262e35
+2b33222f3c222b33222b33222f3c222f3c222b33222b3322304321354c31344d1e
+304321383c232f3c223a4423354c313043213d5f253c58223043212f3c222f3c22
+3f4e323a44233a4423576b3356603a4758324c5026383c23373e432b33222f3c22
+3f4e32475832354c31383c234c50263f4e323f4e323f4e323a44233f4e323a4423
+3f4e323a4423383c233f4e324758323335222b3322342d1f262e35272c1f272c1f
+373e433a44232f3c22272c1f3335222b3322262e352b33222e3c44333522333522
+383c23394446383c233335223a4423383c232b3322333522465864667c747a91a8
+7a91a8637471465864667c744b69334758324c502647581f55582447581f475832
+3f4e1e3a4423333522383c23333522342d1f2b3322383c23383c23333522333522
+2b3322272c1f3335224436233a4423333522342d1f24261c272c1f342d1f24261c
+24261c24261c24261c24261c342d1f272c1f272c1f383c23383c23383c233a4423
+3335223a4423383c233a4423383c232f3c223335222f3c22383c233a4423383c23
+342d1f24261c272c1f383c233335223335223a44232f3c222f3c223f4e1e556024
+47581f3f4e1e383c234c5026383c233f4e1e3f4e1e2f3c223043213f4e1e2f3c22
+2b332224261c272c1f272c1f272c1f2f3c224658645474433d573b47583256603a
+4e50433f4e323a44234758324758324758324758323f4e3247583247583247581f
+3f4e1e3a44234e44252f3c2256603a4b6933496032576a1f565838383c23383c23
+383c234e44254c50263a4423333522342d1f2b3322383c23383c23333522383c23
+383c23333522333522342d1f2b33223a442356603a3f4e1e2f3c222f3c22383c23
+383c23383c23383c233043213a44232f3c223a44233f4e1e3a4423383c23344d1e
+344d1e47581f496032576b336274444960323f4e1e47581f47581f47581f4c5026
+344d1e3f4e1e556024344d1e3043213a44232f3c222f3c222b3322272c1f272c1f
+2b33222b33223f4e1e4758325658388b9080383c23272c1f24261c342d1f272c1f
+272c1f2b33222b33223335222f3c223335222f3c222f3c222b33223a44233f4e32
+2f3c222b3322272c1f2b3322272c1f272c1f2b3322383c23333522272c1f383c23
+272c1f272c1f2b3322383c23383c233335223335222b3322272c1f272c1f342d1f
+2b33222b3322666b3baea8865558245560243f4e1e3f4e1e3f4e1e3f4e1e47581f
+4c5026383c23272c1f272c1f333522383c233043213043213335223043212f3c22
+2b3322272c1f2f3c222f3c223f4e1e3a4423383c23383c23383c23304321333522
+344d1e33352224261c272c1f3043212b33223335223a4423383c23342d1f272c1f
+272c1f24261c24261c24261c272c1f24261c24261c2b33222b3322272c1f2b3322
+2b33222b33223335223f4e1e3f4e1e3f4e1e3f4e1e3c5822344d1e3c582247581f
+3f4e1e3f4e1e344d1e3c58223f4e1e3043213043212f3c222f3c222b3322272c1f
+2b33222b3322272c1f2f3c222b33222b33222f3c22272c1f342d1f272c1f24261c
+24261c272c1f272c1f24261c272c1f24261c24261c272c1f24261c1e241b1e241b
+1e241b272c1f24261c24261c24261c24261c24261c1e241b1e241b24261c1e241b
+1e241b24261c24261c24261c24261c272c1f272c1f272c1f24261c272c1f272c1f
+24261c24261c272c1f24261c272c1f1e241b272c1f24261c24261c272c1f272c1f
+2b33221e241b2b33223043212f3c222f3c223d5f25354c31344d1e2b33222b3322
+272c1f2f3c22272c1f2b33222b33222f3c22262e352f3c22272c1f272c1f272c1f
+2b33223043212b3322272c1f2a34383043212a34382b33222f3c22354c31354c31
+3043212b33222b33223a44232f3c222f3c22344d1e3c58223043212b33222b3322
+3f4e323944463a44235658386660333f4e323a44233f4e323a4423373e432f3c22
+3f4e32475832373e433a44233f4e3247581f354c313a44233a44233a4423373e43
+3f4e323a4423383c23383c233a4423333522262e35262e3524261c272c1f342d1f
+3a44233f4e322f3c22383c232e3c44333522383c23383c23383c232f3c22342d1f
+272c1f3335223336423335223944463a4423272c1f2a34384658646075908b919f
+8a99ab7a91a87d9082576a6247583256603a4b6933556024496032556024496032
+47581f383c23383c23383c232b3322342d1f3335222b33222b3322333522443623
+333522333522383c23333522333522383c23342d1f24261c24261c24261c24261c
+24261c1c1e1924261c24261c24261c24261c24261c272c1f272c1f24261c342d1f
+3335223a4423383c23383c23383c23342d1f333522333522342d1f3a4423383c23
+333522272c1f272c1f4c50263a44232f3c223f4e1e3c58223f4e1e555824556024
+4c50262f3c223335222f3c22383c233f4e1e2f3c22344d1e3f4e1e3c5822304321
+2b3322272c1f272c1f2b33223f4e32354c313d573b666c5e4658644b693356603a
+5658383f4e323f4e324b686549603247581f47583249603249603249603256603a
+6374713f4e322f3c22383c235f6156757c7156603a4758324c5026383c233a4423
+3a44233a44234c50263f4e1e3335222b3322272c1f333522383c23333522333522
+333522342d1f3335223335222f3c22383c2354605f6274444758323f4e1e3a4423
+2b33222f3c222f3c223a44233f4e1e2f3c223f4e324960323f4e1e3a44233a4423
+3a44233f4e32576b33666c5e576b3349601f3f4e1e47581f4c50263f4e1e3f4e1e
+3a44233a442347581f3a44234c50263a4423304321383c232f3c22272c1f2f3c22
+2b3322383c234c50263a44234e3d229a9178574f2624261c24261c272c1f272c1f
+272c1f3335223043212b33222b33222b33223335223a44232b3322383c23475832
+3f4e1e3335223335222f3c22383c23272c1f2b33222f3c222f3c222b3322333522
+2b33222b3322333522333522333522342d1f2b3322272c1f24261c1e241b24261c
+24261c342d1f9a9178ada17f4c50263f4e1e3f4e1e3f4e1e3f4e1e383c23304321
+47581f383c23272c1f272c1f2b33223335223a44233043213a44233a442347581f
+383c232b3322304321344d1e3043212f3c22383c23383c233a44233a44232f3c22
+3a4423272c1f272c1f272c1f3043212f3c222f3c223a4423344d1e33352224261c
+24261c24261c272c1f24261c24261c272c1f272c1f272c1f2b33222b33222b3322
+2b33222f3c222f3c223a4423344d1e3c5822344d1e344d1e3f4e1e344d1e47581f
+47581f3c582247581f49601f47581f2f3c22304321344d1e3043212b3322272c1f
+2f3c22272c1f2b33222f3c222f3c222b3322333522272c1f272c1f342d1f272c1f
+272c1f24261c272c1f342d1f24261c24261c24261c24261c24261c24261c272c1f
+24261c24261c24261c24261c24261c24261c24261c24261c1c1e1924261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c272c1f24261c272c1f
+24261c24261c24261c1e241b24261c24261c24261c1e241b1e241b272c1f1e241b
+2b33221e241b272c1f2f3c22262e352f3c223d5f25344d1e2f3c222f3c22272c1f
+272c1f272c1f272c1f272c1f2f3c222b33222b33222b3322272c1f272c1f272c1f
+2b33223043212f3c22272c1f2f3c222f3c222b33222b3322262e35304321344d1e
+3043212b33223335222f3c222b33222f3c222f3c22344d1e3043212b3322333522
+4c50263f4e323f4e325658385658383f4e323a44233f4e323f4e32383c23333522
+3f4e324c50263a44233a44234c50263f4e323a44234758323f4e324c50263f4e32
+3a4423354c313a44232e3c44383c233335222a3438342d1f262e35262e352b3322
+3a44233a44233a44232b33223335223335222f3c222f3c22383c232b3322272c1f
+272c1f272c1f342d1f2b33222f3c22383c233335223335223944464960656886a6
+819fb79fb0bb92a8b657737647583254605f4b693349603247581f55602447581f
+47581f3a4423333522333522272c1f272c1f3335223335223335222b3322333522
+383c233a4423383c233335223335222b3322272c1f342d1f24261c342d1f1c1e19
+24261c342d1f24261c24261c24261c1c1e1924261c24261c24261c24261c24261c
+342d1f383c23342d1f24261c333522333522272c1f342d1f342d1f3a44233a4423
+383c2333352233352247581f344d1e3a4423383c234b681e3f4e1e3f4e1e576a1f
+3f4e1e3a44233a44232f3c222b3322383c23383c233f4e1e47581f47581f344d1e
+2f3c22272c1f2b33222f3c224658643f4e323f4e324758323d573b637471576a62
+56583847583249603256603a576a6247583256603a627444576a62576a62666c5e
+576a623a44233043213a44233f4e3254605f637471576b333f4e32383c23383c23
+3a44233a44233f4e1e4c50263335222b3322342d1f2b33222f3c22333522383c23
+3335222b33222f3c22383c232f3c22383c233f4e32666c5e666c5e666c5e47581f
+383c233a44233a44232f3c223a44233a442354605f576b334758323a44233a4423
+3f4e323f4e327787725f61564960324758323f4e1e3c58223f4e1e383c233a4423
+3a4423383c233a4423383c233f4e1e3a44233a44233a4423304321333522333522
+2b33223a4423383c233a44235f6156c0b197574f262b3322272c1f2b3322272c1f
+2f3c222b3322304321333522383c233335222f3c223043213a44233f4e1e4c5026
+344d1e3a44232f3c222f3c222f3c222b332224261c383c233335222b3322272c1f
+272c1f2b33222b33223335223335223335223a442324261c1e241b24261c1c1e19
+272c1f383c23ada17fc4a9794c502647581f3f4e1e3f4e1e3f4e1e3a44232f3c22
+47581f383c232b33222f3c2230432130432147581f344d1e3f4e1e3f4e1e3f4e1e
+3a44232b3322344d1e3a44233f4e1e3a44233a4423383c233f4e1e4e44252f3c22
+2f3c22272c1f2f3c22304321344d1e344d1e3f4e1e3a44233a4423342d1f272c1f
+24261c24261c24261c342d1f24261c272c1f272c1f2b33222f3c222b33222f3c22
+383c232f3c222f3c223a44233a442347581f3f4e1e344d1e49601f3f4e1e3c5822
+3c582249601f49601f49601f5560243f4e1e3a44233f4e1e344d1e2b33222f3c22
+2f3c222f3c222f3c223043212f3c222f3c222f3c222b33222b3322342d1f272c1f
+272c1f272c1f24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c24261c24261c1c1e1924261c24261c24261c24261c
+24261c24261c24261c24261c24261c272c1f24261c24261c272c1f24261c342d1f
+24261c24261c24261c24261c24261c24261c272c1f24261c24261c272c1f1e241b
+272c1f24261c24261c2b33222b33222b3322344d1e344d1e2f3c222b3322272c1f
+2b33222b3322272c1f272c1f3043212b3322272c1f2f3c22272c1f272c1f1e241b
+2b33222f3c222f3c22272c1f2b33223043212f3c222b33222b3322304321304321
+3043212f3c222b33222f3c222b33222b33222f3c22344d1e3043212b33222b3322
+3a44234e50433f4e1e4758324c50263a44234e44254c50264c5026333522333642
+4e44254c50263a44233a44233a4423383c233a44233f4e323f4e323f4e323a4423
+3a44233a44233a4423383c233a4423272c1f342d1f2e3c44342d1f262e35383c23
+2f3c223a4423383c23333522333522333642333522333522373e43333522272c1f
+272c1f24261c2b3322373e433335222b33222f3c222f3c222f3c223a4423465864
+6886a69ea9b49fb0bb6b86736b8673667c746274445560244758324c50264b6933
+4c50263a4423383c232b33222b3322383c232f3c223335222f3c223335223a4423
+4c5026383c23333522333522272c1f272c1f342d1f342d1f342d1f342d1f24261c
+24261c342d1f272c1f342d1f1c1e19342d1f1c1e1924261c24261c24261c24261c
+24261c383c23272c1f342d1f342d1f272c1f3335222f3c22333522383c233a4423
+3a44232f3c222f3c223f4e1e3c5822333522333522383c233043213a442347581f
+3f4e1e3f4e1e3f4e1e3a44232b33223a44232f3c223f4e1e354c313043213f4e1e
+2f3c222b33222b33222f3c22475832496065576a6254605f496032576b3354605f
+4758324b68656374717787726b8673778772757c71778772667c747787727d9082
+6374714758324758323a44233f4e1e637471637471576a625658382b3322333522
+2f3c222b33223f4e1e344d1e383c232b3322272c1f333522383c23272c1f443623
+2b33223335223335223a4423354c312f3c22383c234960656b8673709081576b33
+56603a3f4e1e3a4423344d1e344d1e2f3c22576a62667c744758323f4e323a4423
+3a44233f4e326374713d573b3a44233f4e1e47581f3a44233a4423304321333522
+383c232b3322383c232b33224c50263f4e1e3a44233a44233a4423304321333522
+383c23383c23383c23342d1f857d67c0b8a6574f26383c232f3c222b3322272c1f
+2b33223043212f3c222f3c22333522333522333522333522383c233f4e1e3f4e1e
+3f4e1e47581f2f3c222f3c223a4423333522272c1f383c23272c1f272c1f272c1f
+272c1f2f3c22333522272c1f272c1f2f3c22344d1e2b332224261c1c1e1924261c
+272c1f4e5043ada17f86874a3a44233a44233a44233a44233a44233043212f3c22
+47581f3043212f3c22383c232f3c223a44234c50263a44234c50264c50263a4423
+3f4e1e3f4e1e3a44233a44233a44234c5026333522333522383c23304321333522
+3335223043212f3c223f4e1e3f4e1e3a44233a442333352233352224261c1c1e19
+24261c24261c342d1f272c1f342d1f2f3c222f3c222b33223a44232f3c222f3c22
+304321383c23383c232f3c223a442356603a3f4e1e3f4e1e47583249601f47581f
+49601f556024576a1f576a1f49601f5558244c502647581f344d1e2f3c22344d1e
+3043212f3c222f3c223c5822344d1e2f3c222f3c223043212b33222b3322342d1f
+272c1f272c1f272c1f272c1f272c1f24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c24261c1c1e1924261c
+24261c1e241b24261c24261c24261c24261c24261c24261c24261c342d1f24261c
+24261c24261c24261c24261c272c1f24261c24261c24261c24261c1e241b272c1f
+272c1f24261c1e241b2b33222b33222a3438304321344d1e3043212b3322272c1f
+2b33222b3322272c1f272c1f2f3c22304321272c1f2b3322272c1f262e351e241b
+2b33222b33223043212b33222b3322344d1e2f3c222b33222a3438304321344d1e
+2f3c22272c1f2f3c222b3322272c1f2b3322304321344d1e3043212f3c222b3322
+3f4e324c50263a44234c50264e50433a4423373e433a44233f4e32373e43383c23
+3a44233944464e44253f4e324e4425383c233a44234c502647583247581f3f4e32
+3f4e324e44253a4423373e43373e432f3c222b3322333522272c1f272c1f262e35
+383c233944463a4423383c232a34383335223335223335222f3c22342d1f272c1f
+342d1f272c1f333522373e434436232b3322342d1f342d1f383c233a44233f4e32
+46586475889b9ea9b492a8b694afb98ea089597c754758324758323f4e1e555824
+3f4e1e3a4423383c23383c23383c23333522333522383c23383c233335223a4423
+3f4e1e383c23333522272c1f333522333522333522272c1f342d1f33352224261c
+24261c342d1f342d1f24261c24261c342d1f342d1f24261c24261c342d1f24261c
+272c1f383c23383c232f3c223335222b33223a4423383c233335223335223f4e1e
+3f4e1e3f4e1e3043213a44233c58222f3c22342d1f272c1f2f3c223f4e1e47581f
+47581f3043213f4e1e3f4e1e344d1e3f4e1e3a44233f4e323a44233a4423344d1e
+2f3c223043212b33222b3322354c3163747170908177877275889b63747154605f
+565838576a6263747184888781a0898b9080778772778772667c747787727d9082
+667c744c50264758323a44233f4e32757c71666c5e475832373e43272c1f2b3322
+3f4e1e3a44233a44233a44233a4423383c232b3322383c23383c23342d1f272c1f
+272c1f272c1f333522383c23344d1e3a4423475832475832666c5e778772667c74
+666b3b5658384c50263f4e1e3f4e322f3c225f6156576a62475832666c5e475832
+3a44235658384758323f4e32354c315558243f4e1e344d1e3a44232b3322272c1f
+342d1f2b3322272c1f2b33224c50264c50264758323a44233a44233f4e1e333522
+383c23383c232f3c222b332287886dcfc6b86660332f3c223a44232f3c22272c1f
+2b33223f4e1e3043212f3c223a44232f3c22272c1f2b33222f3c223a44233a4423
+3f4e1e3f4e1e2f3c222f3c22344d1e3f4e1e2f3c223f4e1e272c1f272c1f24261c
+272c1f342d1f342d1f272c1f272c1f2b33222f3c22342d1f24261c24261c272c1f
+383c235558249a917874643e3a4423383c232f3c223043212f3c223a44233f4e1e
+5560242f3c222f3c223043212b33222b33223335223335223a4423383c23383c23
+383c232f3c223a44233a4423383c233a4423333522342d1f3a44234e4425272c1f
+2b33223043213043213f4e1e47581f3a44232b3322342d1f272c1f24261c24261c
+24261c272c1f3a44232b33222b33223335223335222b33223a44232f3c22344d1e
+3f4e1e2b3322383c23383c232f3c2255582447583255602455582466603347581f
+496032556024556024556024556024576a1f47581f4b69333c5822304321304321
+344d1e3a4423304321344d1e3f4e1e344d1e2f3c222f3c222f3c222b3322272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c24261c272c1f24261c24261c24261c272c1f24261c
+342d1f24261c342d1f24261c24261c24261c1e241b24261c24261c24261c24261c
+272c1f272c1f24261c2b3322272c1f2f3c222f3c223043212b33222b3322272c1f
+272c1f272c1f2b3322272c1f3043213043212b33222f3c22272c1f272c1f1e241b
+2b33222b33223043212b3322304321344d1e3043212f3c222b3322344d1e3c5822
+3043212a34382b3322262e352b3322272c1f2f3c223c58223043212f3c22272c1f
+3a44233a44232f3c223f4e324c5026383c23383c23383c233a4423383c23394446
+383c233944463a44234e50433a44234e50433335223f4e32496032475832475832
+3f4e323a44233f4e1e2f3c22333522373e43333522333642342d1f272c1f342d1f
+3335223944463a44233335223335222b33222b3322333522383c232a3438342d1f
+262e3524261c342d1f383c233a44233335223336422b33223336423043213f4e32
+3d573b75889b8a99ab92a8b6a3b8bc94afb9657c444c50263f4e323a4423475832
+47581f3a4423383c23354c312f3c22333522383c23383c23383c23383c233a4423
+3a4423333522333522342d1f3335222f3c22333522342d1f333522443623272c1f
+272c1f24261c342d1f24261c24261c24261c342d1f24261c24261c24261c342d1f
+342d1f4e4425383c233335223335222b3322383c23383c232f3c222f3c22383c23
+3f4e1e304321383c233043213f4e1e3043212b33223335223a44233f4e1e47581f
+47581f3a44233a4423344d1e3f4e1e3f4e1e383c23383c233a44233f4e1e3a4423
+3f4e323f4e322f3c222b3322354c31666c5e8da0b68a99ab8b98828a99ab6b8673
+637471576a62667c747d98b18a99ab7d98b18488877d908275889b667c74778772
+7d90824b68654c50263f4e324b68657d908254605f2b33223335222f3c222f3c22
+3a44233a442347581f3f4e1e2b33223335222f3c223a44232f3c22333522272c1f
+272c1f272c1f342d1f3335223a4423394446576a62496065496065556c84778772
+778772667c7463747156603a4758323f4e32496032757c71637471757c71666c5e
+475832576a62757c7163747156603a49601f3f4e1e3f4e1e3f4e1e333522272c1f
+272c1f272c1f272c1f2b332246586456603a4c50263a4423383c234c5026383c23
+333522383c232b33223335229a9178aea886574f26383c2347581f2f3c222b3322
+2b33223a44233f4e1e47581f47581f3043213a44232b3322272c1f383c23383c23
+3a44233a44232f3c22342d1f383c232f3c223a44232f3c22272c1f272c1f272c1f
+2b33222f3c22272c1f272c1f272c1f2b3322272c1f272c1f24261c333522342d1f
+4e44254c502686874a7664273f4e1e3f4e1e2f3c223a44233a4423333522383c23
+383c23272c1f24261c272c1f24261c24261c272c1f272c1f342d1f272c1f342d1f
+2b3322342d1f2f3c223f4e1e383c23383c23383c232b33223a44233f4e1e333522
+272c1f383c233a44233a44233a4423383c23333522342d1f1c1e1924261c24261c
+272c1f2b3322383c233043212f3c222b3322342d1f2b33223a4423383c233a4423
+383c23342d1f3335223335224e44253f4e324e442555582455582466592c4c5026
+555824555824556024666b3b576a1f666b3b55602455602449601f383c233f4e1e
+5558243f4e1e3043213c582247581f4c50262f3c22383c232f3c22333522342d1f
+342d1f272c1f272c1f342d1f24261c24261c342d1f24261c24261c24261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c24261c24261c24261c24261c272c1f342d1f24261c
+24261c24261c272c1f342d1f272c1f24261c24261c24261c24261c24261c272c1f
+1e241b1e241b1e241b272c1f272c1f272c1f2b33222f3c222b3322272c1f272c1f
+272c1f272c1f272c1f2b33222f3c222f3c222f3c222b3322272c1f272c1f272c1f
+262e352f3c22344d1e30432130432141671b344d1e3043212f3c22354c3141671b
+2f3c222f3c222b3322272c1f2b3322272c1f2b3322344d1e3043212f3c222b3322
+4c5026394446383c233f4e323a4423373e43383c23383c233944463a4423443623
+333642333522383c233944464e50434c5026383c233f4e3249606554605f3f4e32
+3a44233a44233a44232f3c222f3c22383c233a44232b3322272c1f262e35272c1f
+333522383c23373e43383c23333522333522333522373e433335222b3322342d1f
+262e35272c1f333522373e433a4423383c232b33222e3c442f3c22354c31344d59
+496065556c847a91a88da0b69fb0bb9da1ab6374713f4e1e3f4e323f4e3247581f
+5558243a4423383c233a44232f3c223335223a44233a4423383c23383c233a4423
+383c232f3c22383c23272c1f3335223a44233335222b33222b3322333522342d1f
+2b3322272c1f342d1f24261c342d1f1c1e19342d1f1c1e19342d1f24261c24261c
+272c1f3335222b3322333522272c1f2b3322333522383c23333522333522333522
+3f4e1e2f3c223335222f3c223f4e1e3043212f3c222b3322383c233a44233f4e1e
+3f4e1e3a44232f3c223f4e1e3a44233f4e1e3335222f3c22354c314c50263a4423
+4c50264c5026373e4354605f4b68654658647d90828a99ab819fb78da0b6778772
+6374716374716b86738a99ab8a99ab8b988275889b7d90828a99ab9fb0bb9ea9b4
+7d9082576a6256603a565838577376637471354c312f3c223335222f3c222f3c22
+2f3c223a44233f4e1e3a44232b33223a44233d4f563043212f3c222b3322272c1f
+272c1f24261c272c1f2f3c223f4e323f4e32637471778772757c71757c7175889b
+8b90808b90806b8673666b3b576a6256583854605f778772757c71857d675f6156
+56603a757c717d908277877263747155602447581f3a44233f4e1e2f3c22333522
+342d1f272c1f272c1f2f3c22757c718b98825f61562f3c223f4e324e50432e3c44
+2f3c223335222b3322373e438b9080aea8864e4425383c233f4e1e2f3c22304321
+2b3322383c233f4e1e3f4e1e47581f3f4e1e344d1e304321304321304321344d1e
+2f3c223a44233a44232f3c222f3c223335222f3c223a4423383c233335222b3322
+272c1f2f3c22272c1f24261c2b33222b3322272c1f24261c272c1f3a4423342d1f
+2b332256603a857d674c50264c50263a4423383c23333522333522272c1f272c1f
+342d1f24261c1c1e1924261c24261c24261c24261c272c1f272c1f272c1f24261c
+342d1f24261c24261c333522333522383c23383c233335223043213f4e1e3a4423
+3a4423383c234e44253a44233a44232f3c22383c23272c1f24261c24261c24261c
+272c1f2b33222f3c222f3c22304321272c1f3335222b3322383c233a4423333522
+2b3322272c1f4436233335224e3d224e50434e44254c5026574f26574f264c5026
+3f4e32666033556024666b3b666033556024666b3b5560245560244c50264c5026
+49601f4c5026344d1e41671b47581f576a1f3f4e1e3f4e1e344d1e383c232b3322
+342d1f272c1f272c1f272c1f272c1f272c1f272c1f24261c342d1f24261c24261c
+24261c1c1e19342d1f24261c24261c24261c24261c24261c1c1e1924261c24261c
+24261c342d1f24261c24261c24261c24261c342d1f24261c342d1f272c1f24261c
+272c1f24261c272c1f272c1f272c1f24261c24261c24261c24261c24261c24261c
+272c1f24261c272c1f272c1f2b3322272c1f2b33222f3c222f3c22272c1f2b3322
+272c1f272c1f272c1f272c1f2b33223043212b33222f3c22272c1f1e241b2b3322
+2b33222f3c22344d1e30432130432149732341671b304321304321354c313d5f25
+3043212b3322272c1f272c1f2f3c222b33222b3322344d1e3043212b3322272c1f
+4758323a44232a34384e44253f4e32443623373e43383c233944463a4423373e43
+2f3c22373e43383c233f4e324e50434c50263a44233a44234b686554605f3f4e32
+3944463a4423383c233335223a44232f3c22373e43342d1f24261c342d1f272c1f
+333522383c23333522333642383c23333522383c23383c23333642342d1f262e35
+342d1f342d1f333522383c233336423335222b3322373e43465864637471576a62
+597c75556c84556c8475889b9ea9b48da0b66b86733f4e323f4e323f4e1e475832
+4758323a44233a44233a4423383c23383c23383c23383c232f3c223a4423383c23
+383c233335222b3322342d1f342d1f2b3322333522383c23333522383c23344d1e
+2b33222b33222f3c22342d1f24261c24261c24261c24261c24261c24261c24261c
+24261c383c23272c1f2b33222b33222b33223043212b3322272c1f272c1f272c1f
+2f3c223043212b33223335223335223f4e1e344d1e2b33222f3c22333522383c23
+3a44233a44233335223a44233a44233a44233a44233a44233f4e1e3f4e323f4e32
+3d4f563f4e1e383c23475832576a624658646b86738b919f8da0b69da1ab848887
+576a6263747175889b9ea9b47d98b18b919f75889b8a99ab8da0b6aeb0bda3b8bc
+75889b576a6254605f475832576a625773763f4e323a44232b33223335222f3c22
+3043213043214c50263f4e1e3335222b33222f3c22394446383c23333522272c1f
+342d1f272c1f2b33222b3322394446373e4346586475889b8da0b675889b75889b
+7d90829da1ab8b9882637471666c5e576b3354605f8488878b9080667c7454605f
+666c5e75889b8ea0898b9882666c5e49603247581f383c233f4e1e383c232b3322
+2b3322272c1f272c1f2e3c44757c718a99ab5658382f3c223f4e324e5043383c23
+3f4e322b33222b3322383c239d9981867c4c3335223a44233f4e1e3043213f4e1e
+2b33222b33223a44233f4e1e47581f4c502647581f3a4423383c233043214e4425
+3f4e1e304321344d1e3a44233043212f3c22383c233f4e1e344d1e3f4e1e304321
+272c1f2f3c22333522272c1f2b33222b3322333522272c1f24261c272c1f272c1f
+272c1f75704d867c4c333522333522383c232b3322342d1f272c1f24261c24261c
+1c1e1924261c24261c24261c1e241b24261c272c1f24261c272c1f272c1f342d1f
+33352224261c24261c1e241b272c1f383c23383c232f3c223043212f3c223f4e1e
+4b681e2f3c223a44233a4423383c23333522333522272c1f24261c24261c24261c
+272c1f2f3c223a44233043212f3c22272c1f3335223335222f3c223335222b3322
+4436233335224436233335224e44256660334e44254e44254e3d22333522443623
+4e3d225558244c502666592c556024555824666033574f265558244c50263f4e1e
+5560245560243f4e1e55602455602455602447581f3a44233f4e1e2f3c222b3322
+272c1f272c1f272c1f342d1f24261c24261c24261c24261c272c1f24261c24261c
+24261c24261c24261c342d1f1c1e1924261c24261c24261c24261c24261c24261c
+1c1e1924261c24261c24261c24261c24261c24261c24261c272c1f272c1f24261c
+24261c272c1f272c1f272c1f24261c24261c24261c24261c272c1f24261c272c1f
+24261c24261c24261c272c1f3043212b33221e241b2b33222b33222b33221e241b
+272c1f2b33221e241b2b33222b33223043212f3c222f3c22272c1f272c1f272c1f
+272c1f304321344d1e344d1e30432149732341671b344d1e304321304321344d1e
+3043212b33222b33222b33222f3c22272c1f272c1f344d1e3043212f3c222b3322
+3f4e324c5026383c234e50433a44234436233a4423373e43383c233a4423394446
+394446383c23373e434e44254758324c50263a44233a44233f4e324e50433f4e32
+354c313f4e32383c23383c233a4423383c233a442333352224261c262e35262e35
+2b33223335223335223335223335223335223a4423383c23333522272c1f333522
+2a3438342d1f342d1f3335223335223335222b3322373e4354605f576a62626e8c
+556c84637471627d997a91a892a8b68da0b6778772666c5e667c74657c44576b33
+4758323a44232f3c22383c23333522333522383c23383c233a44233f4e1e3a4423
+3335222b33222b3322272c1f24261c272c1f2b3322383c232f3c22383c233a4423
+2b33222b3322304321333522272c1f24261c24261c342d1f24261c24261c24261c
+24261c272c1f24261c272c1f272c1f3043213a44232b3322272c1f342d1f24261c
+383c232f3c223335222b33223335223f4e1e344d1e3335223a44233a4423383c23
+3335223a4423383c233a44233a44233a44233a44234c50263a44233a44233a4423
+4e50433f4e322f3c2249606592a8b67d90827a91a88b919f8ea08975889b757c71
+576a62576a627d90829ea9b48da0b69da1ab8488878da0b692a8b69fb0bb8da0b6
+75889b637471576a625658384960656084714b68653a44232f3c223335223d4f56
+3a44232f3c224c5026354c313335222b3322272c1f2b3322333522333522272c1f
+272c1f24261c272c1f373e433f4e322e3c4430444d6374719ea9b49da1ab848887
+8a99ab9da1ab9fb0bb8b9080848887757c717787727d90827d9082778772667c74
+4b6933757c719ea9b48ea0894b68653f4e1e3f4e1e2f3c222f3c22333522333522
+342d1f272c1f2b3322272c1f465864757c715f61562f3c223a44233a4423373e43
+4e50433043212f3c222f3c22aba9a674643e342d1f30432147581f3a44233a4423
+3a442333352233352230432147581f3a44233f4e1e3043213a44233f4e1e3a4423
+4c50263a442347581f3f4e1e383c23383c233f4e1e4c50262f3c223f4e1e2f3c22
+2b33222b33222f3c222b33223043212f3c222f3c222b33222b3322272c1f272c1f
+2b33229a9178666033342d1f272c1f333522272c1f272c1f272c1f24261c24261c
+24261c1c1e191c1e1924261c1c1e1924261c342d1f342d1f3a4423272c1f272c1f
+272c1f24261c24261c24261c24261c383c233a4423333522383c23333522383c23
+576b33383c2347581f4c50263335222b3322272c1f24261c24261c24261c24261c
+272c1f2f3c22383c23304321383c232f3c223a44233043213a44232b332224261c
+3335223335224e4425383c2366603356603a4e44253a4423443623342d1f2b3322
+383c234e4425383c23574f26574f265558246660333f4e1e574f264e44253a4423
+66603366603355582455582447581f5558243f4e1e4c50263f4e32383c232f3c22
+342d1f272c1f272c1f272c1f342d1f342d1f24261c272c1f24261c342d1f24261c
+342d1f24261c24261c24261c24261c24261c24261c342d1f24261c342d1f24261c
+342d1f24261c24261c24261c24261c24261c24261c24261c272c1f272c1f272c1f
+24261c272c1f272c1f24261c272c1f24261c24261c272c1f24261c24261c272c1f
+272c1f272c1f24261c272c1f272c1f272c1f2b3322272c1f272c1f2b33222b3322
+272c1f272c1f272c1f272c1f2b3322304321272c1f2f3c222b33222b3322272c1f
+2f3c223043213c5822344d1e3043214973233d5f25344d1e304321383c23344d1e
+3043212b33222b33222b33222b3322272c1f2b3322344d1e3043212f3c222b3322
+4c50263f4e32383c234e44254e50433a44233a4423383c23373e433a44233f4e32
+3a44232f3c22383c233f4e32574f264758324c50263a44233f4e324758323a4423
+3a44233a44232f3c222e3c44383c23383c23333642262e35342d1f272c1f2b3322
+3335222b33222a34383335222a3438383c23383c23383c233335222a3438342d1f
+342d1f333522373e43333522272c1f3335222b33222a34384e504349606575889b
+7d98b17d98b18da0b68a99ab92a8b6819fb7667c746b86737090816b8673576b33
+475832383c23383c23383c233335223335223335223335223a44233a4423383c23
+333522333522272c1f272c1f272c1f342d1f272c1f3335222f3c223a44232f3c22
+2b3322272c1f383c23304321333522342d1f24261c24261c24261c342d1f24261c
+24261c342d1f272c1f383c232f3c223a44233a44233a4423272c1f2b3322272c1f
+2f3c222f3c222f3c222b33223043213f4e1e3a44233a4423383c2347581f3a4423
+2b33223a44233f4e323f4e32383c233335223f4e32354c313a4423383c23383c23
+3f4e324758323a44234960658da0b692a8b692a8b68da0b69da1ab667c74667c74
+576a626374718b919f92a8b69fb0bb9ea9b48a99ab9ea9b49fb0bb9ea9b48a99ab
+8da0b68a99ab637471576a624960657787726374713043212f3c223043214b6865
+4960653a4423354c313a44232f3c22333522272c1f2b33223043212f3c222b3322
+272c1f24261c272c1f394446354c3130444d373e43576a628a99ab9fb0bb9ea9b4
+8a99ab9ea9b49ea9b48a99ab8b90807787728b919f9da1ab9da1ab8b9882848887
+6374718a99ab9da1ab666c5e5658384c50263f4e1e3335223335222f3c22333522
+2b3322272c1f2b33222b332239444654605f666c5e383c233a44233335223a4423
+3944462f3c222a34384c50269ea08a5658383335223a44233f4e1e3f4e1e47581f
+47581f3f4e1e3043212f3c223d5f25344d1e3f4e1e3a44233a4423383c233a4423
+47581f3043215558244e44253f4e1e3a442347581f3a4423383c23383c23272c1f
+272c1f3043213043212b33223043213043213043212b33222f3c222b3322272c1f
+342d1f857d674e442524261c24261c272c1f272c1f342d1f24261c24261c1c1e19
+24261c24261c24261c1c1e1924261c272c1f272c1f2b3322333522342d1f24261c
+24261c24261c1c1e191e241b24261c272c1f383c23272c1f333522272c1f2b3322
+333522342d1f4c50263a4423342d1f24261c3335222b3322342d1f24261c333522
+2f3c222f3c222f3c22383c232f3c222f3c223a4423383c233043212b3322383c23
+272c1f3335223335224436234e50436660334e4425383c23443623272c1f443623
+443623333522383c233f4e1e574f26574f264e4425333522383c23383c233f4e1e
+66592c5558243f4e1e3f4e1e4e44254758324c5026555824383c233a44232f3c22
+333522272c1f342d1f24261c342d1f272c1f272c1f342d1f342d1f272c1f272c1f
+272c1f24261c24261c342d1f24261c1c1e1924261c1e241b24261c24261c24261c
+24261c24261c24261c1c1e1924261c272c1f24261c24261c272c1f24261c24261c
+24261c342d1f272c1f342d1f24261c272c1f272c1f272c1f24261c272c1f24261c
+24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322272c1f1e241b
+2b3322272c1f1e241b272c1f2b3322344d1e2b33222b33222f3c22272c1f272c1f
+304321344d1e3d5f253c5822344d1e41671b41671b344d1e3a44232f3c22304321
+3043212f3c222b33222f3c222b33222b3322272c1f344d1e2f3c223043212b3322
+4c50264e50433a44233a44233944463a44234e50433a44234c5026394446475832
+5658383944463a44234c502656603a4758324e50433a44233a44233a44233a4423
+3a44233a4423383c23383c232f3c223a4423333522333522272c1f24261c333642
+3335223335222b3322333522333522383c23373e43383c233335222b33222a3438
+272c1f383c23383c23333522272c1f373e4330432130444d2f3c2246586475889b
+92a8b67a91a87d98b17d98b192a8b681a089627d9975889b7d98b1778772577376
+475832383c232f3c222b33223335223335222b33222b33222f3c223a44232f3c22
+2f3c222b3322333522272c1f272c1f272c1f272c1f2b33222f3c22383c232b3322
+2b33222f3c22383c233043212f3c2224261c24261c342d1f24261c342d1f272c1f
+2b3322383c233335222f3c22304321344d1e3043212f3c222b33222b33222b3322
+2b33222f3c222f3c222f3c222f3c223f4e1e344d1e3f4e1e383c234c5026304321
+2f3c223a44233f4e1e4c50263a44233a4423383c23383c233a44233f4e1e3a4423
+3f4e324758323f4e323f4e327d98b19ea9b49fb0bb94afb98da0b68a99ab8b919f
+6b867375889b7a91a89da1ab9fb0bb9ea9b48a99ab9ea9b4a3b8bc9ea9b48a99ab
+8da0b692a8b677877263747163747175889b5773764960654b6865627d996b8673
+576a62383c233f4e1e3a44232f3c222f3c22272c1f2b33223043213043212f3c22
+2b3322272c1f272c1f2a34383d4f565773766b8673576a627a91a89ea9b49ea9b4
+9da1ab9ea9b4aeb0bd9ea9b49d99818b919faba9a6aeb0bdaba9a69ea9b49d9981
+757c718a99ab9d998163747154605f3a44233a4423383c232b3322333522333522
+272c1f2b3322272c1f2b33223a442354605f666c5e3a4423354c312b3322383c23
+3a44232f3c22383c235f6156ada17f4e5043342d1f2f3c22383c233a44233a4423
+3f4e1e4c50263f4e1e3335223f4e1e344d1e3043213f4e1e3f4e1e3f4e1e383c23
+49601f3f4e1e3a4423383c233f4e1e3f4e1e3f4e1e2f3c22383c23333522272c1f
+272c1f3a44233f4e1e3a44232b33223043213043212f3c222b332224261c272c1f
+2b332275704d4e442524261c24261c342d1f24261c33352224261c24261c24261c
+24261c1c1e1924261c24261c24261c383c23383c23333522272c1f272c1f272c1f
+24261c24261c1c1e1924261c24261c272c1f383c23272c1f24261c1e241b24261c
+24261c1e241b333522333522272c1f24261c2b33223043212f3c22272c1f2f3c22
+3043213043212f3c222f3c222f3c223a4423304321383c232f3c222f3c22383c23
+2b3322342d1f342d1f24261c443623666033574f26443623272c1f342d1f2b3322
+342d1f3335223335224e442547581f4c5026383c234e44253335223335223a4423
+4c50264e44253a4423383c23574f263a44233a44234c50263a4423383c23383c23
+2f3c223335222b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f342d1f
+272c1f342d1f24261c24261c272c1f24261c24261c24261c24261c272c1f24261c
+24261c342d1f24261c342d1f24261c272c1f272c1f272c1f272c1f24261c24261c
+24261c272c1f24261c272c1f272c1f24261c24261c342d1f24261c272c1f272c1f
+272c1f24261c272c1f272c1f272c1f24261c272c1f272c1f2b33222b3322272c1f
+272c1f1e241b2b3322272c1f2b33223043213043212b3322304321304321272c1f
+3043213d5f253d5f253d5f253043213d5f2541671b344d1e3a44233335222f3c22
+2b33222f3c22272c1f2b33222b33222b3322272c1f2f3c222b33222f3c222b3322
+4758324c50263a4423373e43383c233f4e323f4e32574f264e504347583254605f
+5f61563f4e323f4e323f4e325558244c50265658383944463a44233f4e323a4423
+3a4423383c23373e43383c232a34383a4423333642342d1f272c1f342d1f262e35
+383c23383c23333642333522333642333522383c23383c23333522342d1f333522
+333522373e43383c23333522262e35394446354c313d4f56354c312e3c44465864
+75889b75889b8da0b694afb99fb0bb8a99ab7d98b19fb0bb9fb0bb92a88d597c75
+3d573b3043212f3c223f4e323944462f3c22272c1f2b33222f3c223a44233a4423
+3335222b33222f3c2224261c24261c272c1f272c1f272c1f3335222f3c222b3322
+2b3322383c233a4423344d1e333522342d1f272c1f272c1f272c1f2b3322272c1f
+272c1f272c1f272c1f333522383c233f4e1e3a44232b33223335222f3c222f3c22
+2b33222f3c223043212f3c22344d1e3a44233a44233a4423344d1e344d1e3a4423
+3a44234c50264c50263f4e1e2f3c223a44233a4423333522383c234e44253f4e32
+3a44234758323f4e32354c31627d998a99ab9ea9b49ea9b48da0b68a99ab8a99ab
+75889b7d98b18da0b692a8b69fb0bb9ea9b48da0b69fb0bbaeb0bd9ea9b48a99ab
+8da0b68a99ab577376667c74667c7475889b667c74597c7575889b667c74577376
+3d4f563a44233f4e32344d1e304321354c313043213a44233d573b3f4e1e2f3c22
+2b33222b33222b33222b33223944466886a68b919f607590757c719ea9b4aeb0bd
+9ea9b4aba9a6aeb0bd9ea9b49da1ab8b919f9da1abaeb0bdaeb0bd9ea9b49da1ab
+7787728a99ab8a99ab757c7154605f3a44232f3c222b3322272c1f3335222f3c22
+2b3322272c1f2b33223944463f4e323a44233f4e32383c233f4e323335223f4e32
+54605f2f3c224e5043767b479a9178383c23272c1f3335222f3c223a4423344d1e
+47581f3f4e1e47581f344d1e3a44233f4e1e3a44233a44233a44233f4e1e3a4423
+47581f4c50264e44253a44233a4423383c23383c232b3322333522272c1f24261c
+272c1f2b33222f3c222b33223335222f3c223a44232b33222b33222b33222b3322
+304321565838443623342d1f272c1f272c1f272c1f24261c24261c24261c342d1f
+24261c24261c24261c24261c24261c383c23333522383c233a4423383c23342d1f
+1c1e191c1e191c1e1924261c24261c342d1f272c1f272c1f1e241b1c1e191e241b
+24261c24261c2b33222f3c222f3c22272c1f272c1f3043212f3c22272c1f333522
+3f4e1e344d1e344d1e3043213a44233a4423383c233335222f3c22344d1e344d1e
+3335222b33222b332224261c4e3d22666c5e4e3d22333522342d1f24261c272c1f
+272c1f342d1f383c233043214e3d224e44253a44234c50262b33223335223f4e1e
+3a44233a44233a4423383c23383c234e44253a4423344d1e3a4423383c23383c23
+3335222f3c222f3c22342d1f272c1f272c1f24261c272c1f272c1f24261c272c1f
+333522272c1f272c1f272c1f342d1f24261c24261c24261c342d1f24261c24261c
+24261c24261c24261c24261c24261c24261c24261c272c1f272c1f272c1f24261c
+272c1f272c1f272c1f342d1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2b3322272c1f2b33223043213043212f3c223043212f3c222f3c22
+2f3c223c58223d5f253d5f253c58223c58223d5f253043213043212f3c222f3c22
+2b33222b33222b33222b3322272c1f2b33222b33222b33222f3c222b33222b3322
+3f4e324e4425383c23333642383c233a44233f4e324e50434758324e50435f6156
+56603a3f4e324e50434c50264c50264c50264c50263a44233944464c50264e4425
+3944463a4423383c23383c233335222f3c223a4423342d1f262e35272c1f342d1f
+2a34383335223335222f3c22383c232b33223335222a3438333522262e35342d1f
+342d1f383c23383c23333522262e353d4f563f4e32354c3130432130444d354c31
+576a62626e8c7a91a892a8b69fb0bb92a8b692a8b69fb0bb94afb97d98b1577376
+3c5822354c313944463d573b354c31333522272c1f2b33222f3c22383c23383c23
+272c1f272c1f272c1f342d1f272c1f272c1f24261c272c1f2b3322272c1f24261c
+272c1f2b33223335223a44232f3c22342d1f272c1f24261c272c1f24261c272c1f
+272c1f272c1f342d1f383c233a44233f4e1e3f4e1e2f3c222b33222f3c22304321
+272c1f2b33222f3c22344d1e3f4e1e344d1e3a44233a44234c50263f4e1e344d1e
+3f4e324960324758324c5026383c233a44233a44233a44233043213f4e1e3f4e32
+3f4e3256603a5658384658648488878a99ab92a8b69fb0bb8da0b68da0b68da0b6
+75889b8da0b694afb99ea9b49ea9b49ea9b492a8b69ea9b49fb0bb9fb0bb92a8b6
+92a8b68a99ab597c75667c7475889b627d998a99ab819fb77a91a8576a62465864
+3944462f3c223f4e323a44233a44233a44232f3c223f4e324b6865496032354c31
+3a44232f3c222f3c22272c1f383c2354605f7a91a88488877a91a88da0b6aeb0bd
+aeb0bdaeb0bdaeb0bd9ea9b49da1ab8a99ab9da1abaeb0bdaeb0bdaeb0bd9da1ab
+9a91788488878b90808488875658383a4423333522272c1f2b3322342d1f2b3322
+342d1f272c1f2b332254605f5658382e3c443a44233944463f4e322f3c224e5043
+3f4e323d4f56666b3b75704d666b3b342d1f24261c3335223a44233a44233a4423
+344d1e344d1e3f4e1e3a44233a442347581f3f4e1e383c23344d1e49601f3f4e1e
+3f4e1e3a4423333522383c232f3c222b3322272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2b3322272c1f342d1f2b33222f3c222f3c223335222f3c222b3322
+3a44233a44232b3322342d1f272c1f272c1f24261c24261c24261c24261c342d1f
+24261c24261c1c1e19342d1f24261c383c23333522383c23383c233a4423333522
+24261c24261c24261c24261c342d1f2b3322272c1f24261c1c1e191c1e19272c1f
+2b3322272c1f3043213043213a44232b3322272c1f383c233f4e1e2f3c22333522
+3335223a44233f4e1e3a4423344d1e3a44233a442347581f4c50263a44233f4e1e
+3043212f3c222b3322272c1f3a44235f6156342d1f342d1f33352224261c24261c
+272c1f342d1f333522383c233335224e4425383c233a4423383c23333522333522
+3335223335223335223335222b33223a44233a44233a4423383c23383c232f3c22
+3335222b33222b3322342d1f272c1f272c1f342d1f24261c24261c24261c342d1f
+342d1f272c1f24261c342d1f272c1f333522272c1f24261c342d1f272c1f24261c
+342d1f24261c272c1f24261c272c1f272c1f24261c272c1f342d1f272c1f24261c
+24261c272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f342d1f272c1f
+383c23272c1f272c1f272c1f24261c24261c24261c24261c272c1f2b3322272c1f
+272c1f272c1f2b33222b3322272c1f304321344d1e2b33223043213043212f3c22
+2b3322344d1e3c58223d5f25344d1e304321344d1e3043212f3c222b33222f3c22
+272c1f2b3322272c1f333522272c1f272c1f272c1f2b33222b33222b33222b3322
+4e44253f4e323a4423333642373e43354c3147583254605f6374716b867375889b
+6b8673576a624960325658384e50433f4e325658383a4423373e433f4e323a4423
+3a4423383c23394446333522262e35383c23373e43333522342d1f262e35272c1f
+333522373e43333522383c23373e432b33223335222f3c223335222b3322272c1f
+262e35333522333642342d1f272c1f373e433d4f5654605f4b68654b686530444d
+3d4f564b68657a91a89ea9b494afb992a8b694afb99fb0bb9fb0bb8ea0894b6865
+3f4e3254605f667c7475889b4658643335222f3c222b3322383c23383c23333522
+272c1f272c1f333522272c1f272c1f333522272c1f272c1f24261c272c1f1e241b
+272c1f272c1f2b33222f3c222f3c222f3c22272c1f272c1f1e241b24261c24261c
+272c1f272c1f272c1f342d1f2f3c223a4423383c23344d1e3043212f3c222f3c22
+383c232f3c223335223a44233f4e1e3a44234c50263f4e1e47581f496032496032
+6274446b86735560243f4e323a44233a44234c50263a44233a44234c50264c5026
+3944463d573b47583254605f6f8fae7d98b18da0b69ea9b49ea9b48da0b68b919f
+75889b8da0b69ea9b492a8b69fb0bb9fb0bb9ea9b492a8b69ea9b49ea9b492a8b6
+92a8b67d98b175889b7d98b17d98b18da0b692a8b692a8b67d90824658643a4423
+2b33222f3c222f3c222b3322304321344d1e3043213f4e32576a6254605f3a4423
+3a44233335222f3c222e3c442f3c2254605f8da0b69ea9b49da1ab9da1ab9ea9b4
+aeb0bdaeb0bdaba9a6aeb0bdaba9a69ea9b4aeb0bdaeb0bdaeb0bdaeb0bdafb9bc
+8b919f857d67637471757c71565838373e43333522272c1f272c1f2b33222b3322
+2b33222b33222b332254605f3f4e32373e433a44233944463f4e323a4423496032
+30432163747163747175704d5f6156342d1f272c1f272c1f3a44233043213a4423
+3f4e1e3a44233a44234c50264c5026574f263f4e1e3f4e1e4c50265560243a4423
+3a44232b3322272c1f2f3c2233352233352224261c24261c272c1f342d1f272c1f
+272c1f24261c24261c272c1f272c1f272c1f2f3c222f3c222b33223335222b3322
+4758324e5043272c1f333522272c1f272c1f1e241b24261c24261c272c1f272c1f
+24261c24261c24261c24261c272c1f383c232f3c222f3c223a4423383c23342d1f
+24261c24261c342d1f2f3c22333522383c23342d1f24261c24261c24261c2b3322
+33352224261c3335223335222b33222f3c222b3322272c1f3335223043213a4423
+2b33222b33222f3c223043213a442347581f47581f5560245558245558243a4423
+3f4e1e3a4423383c23272c1f3a442374643e574f26383c23342d1f272c1f24261c
+24261c272c1f4e3d22383c23383c23383c233a4423383c233335222f3c222f3c22
+333522272c1f2b33222f3c22333522383c23383c23333522383c23383c23383c23
+333522272c1f2b33222b3322333522272c1f24261c24261c24261c24261c272c1f
+333642272c1f272c1f272c1f383c23383c23383c23272c1f342d1f272c1f272c1f
+262e35342d1f272c1f272c1f272c1f342d1f342d1f272c1f272c1f272c1f272c1f
+272c1f24261c272c1f272c1f272c1f272c1f272c1f2b33222b3322272c1f2b3322
+33352224261c272c1f33352224261c24261c272c1f272c1f24261c272c1f342d1f
+272c1f24261c272c1f272c1f272c1f344d1e344d1e2f3c222f3c22304321344d1e
+2b33223043213043213043213043213335222f3c222f3c222f3c222b33222b3322
+2f3c22272c1f333522272c1f342d1f272c1f272c1f2b33222b33222b3322272c1f
+3944463a44233f4e322e3c443944464b6865597c75667c747a91a88a99ab7d98b1
+7d908263747156603a56603a4758324c50264e50433a44234c50263f4e324e5043
+4658643a4423383c23383c233335223a4423383c232a3438342d1f262e35342d1f
+2b33222f3c22333522383c23383c23333522383c232a3438333522342d1f272c1f
+24261c3335223335223335222b33222a343830444d4561856886a66b86734b6865
+496065556c8460759092a8b694afb994afb994afb99fb0bb94afb96886a64b6865
+597c757090817a91a8597c753944462b33222e3c442f3c222f3c222f3c22333522
+272c1f272c1f2b3322272c1f272c1f33352224261c272c1f24261c24261c1e241b
+272c1f24261c342d1f2f3c22383c23333522272c1f272c1f24261c24261c24261c
+272c1f3335222b3322342d1f272c1f272c1f342d1f383c233f4e1e383c232b3322
+3f4e1e3a4423272c1f2f3c223a44233a44233a44234c50263f4e1e475832576a62
+6374716374714758324c50263f4e1e3a44233f4e32354c313a44233f4e1e4c5026
+39444649603249606554605f7e98828da0b68da0b69ea9b49fb0bb8a99ab8a99ab
+7a91a88a99ab9ea9b49ea9b492a8b69fb0bb9ea9b49fb0bb94afb99ea9b49ea9b4
+9ea9b492a8b67d98b18da0b68da0b692a8b692a8b67a91a86075903d4f56304321
+2f3c22383c232f3c223335222f3c22354c313f4e323043214960654b69333f4e32
+3f4e323a44233043212f3c223043214658648a99ababa9a6aeb0bd9ea9b4aeb0bd
+aeb0bdaeb0bdaeb0bdaeb0bdaeb0bd9ea9b4aeb0bdaeb0bdaeb0bdaeb0bdaeb0bd
+9ea08a757c715f61565f61563f4e323336423335222b33222b3322333522333522
+272c1f272c1f2b33224758324e5043373e43354c3154605f54605f354c3154605f
+3f4e32666c5e666b3b5f6156666b3b342d1f272c1f272c1f383c232f3c222f3c22
+3a4423344d1e3a44233a4423344d1e3a44233f4e1e304321383c233f4e1e333522
+383c23272c1f272c1f272c1f272c1f272c1f24261c1e241b24261c272c1f272c1f
+272c1f24261c1e241b342d1f272c1f24261c272c1f3335222f3c22272c1f2b3322
+3a44233a44233335222b33222b3322383c23333522342d1f272c1f2b33222b3322
+272c1f24261c24261c24261c342d1f383c232b3322383c233a44233a4423342d1f
+24261c342d1f333522333522333522333522383c23342d1f24261c24261c2f3c22
+3f4e1e2b33222b33222b33222f3c222b33222b3322272c1f272c1f383c233f4e32
+2b33222b3322333522333522383c234c5026576a1f576b336660333f4e1e383c23
+383c233a4423383c232b33222b33223f4e32443623333522272c1f24261c24261c
+24261c24261c342d1f333522333522383c233a4423272c1f272c1f333522344d1e
+2f3c222b33222f3c222b3322333522383c23383c233335222f3c223a4423304321
+333522272c1f342d1f272c1f333522333522333522333522342d1f2b3322272c1f
+333522342d1f3335223335222f3c222b3322333522272c1f272c1f272c1f333522
+2f3c222b3322272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f272c1f
+272c1f272c1f272c1f24261c272c1f272c1f342d1f272c1f3335222b3322333522
+2b3322272c1f272c1f33352224261c1e241b272c1f24261c24261c272c1f24261c
+272c1f272c1f2b33222b3322272c1f3043213f4e1e2b33223335222b3322383c23
+2b33223a44232b33223043213a44233335222b3322333522333522333522342d1f
+2b33222b33222b3322272c1f342d1f272c1f272c1f2b3322333522272c1f2b3322
+373e433a44234e4425394446576a62667c7475889b6f8fae8a99ab8da0b68da0b6
+7d98b1667c7456603a47583247581f4758324c50264e50433a44233f4e32496032
+5658383944462f3c22333642333522383c23383c232b3322262e35272c1f262e35
+2b33222f3c222f3c223a4423373e432f3c22383c23262e35272c1f262e3524261c
+272c1f2b33222b33223944462b332230444d4960656374714a6a8d6886a67d98b1
+7e98825d83a4627d998da0b692a8b69fb0bb9fb0bb94afb98a99ab667c746886a6
+8da0b694afb992a8b6577376304321342d1f2f3c222f3c22272c1f342d1f2b3322
+272c1f272c1f272c1f272c1f272c1f333522272c1f272c1f24261c272c1f24261c
+24261c24261c272c1f2b3322383c232f3c22342d1f272c1f342d1f24261c24261c
+272c1f333522272c1f342d1f24261c272c1f272c1f342d1f3335224e4425333522
+3a44233a4423333522383c233a44233a44233a44233a44233f4e324b6933666c5e
+8a99ab667c744758323f4e323f4e323f4e323f4e323a44233944463a44233a4423
+354c31576a62597c754b68656f8fae9fb0bb9ea9b492a8b69ea9b48da0b68da0b6
+8a99ab8da0b692a8b69fb0bb9fb0bb92a8b692a8b69ea9b49ea9b49fb0bb9ea9b4
+92a8b68a99ab8b919f8da0b692a8b68da0b692a8b675889b576a623d573b465864
+3043213043212f3c222b3322304321354c313f4e324b68653f4e323944462e3c44
+3f4e323f4e3254605f496065304321465864848887aeb0bdaeb0bdaeb0bdaeb0bd
+aeb0bdaeb0bd9ea9b4aeb0bdaeb0bd9da1ab9fb0bb9ea9b49ea9b4aeb0bd9ea9b4
+848887637471757c713a4423333522333522272c1f2f3c222f3c222f3c222b3322
+2b33222b33222b3322373e433f4e32576a6263747163747154605f3a4423565838
+2f3c225f61565f6156666c5e666b3b272c1f272c1f272c1f2b33222b3322333522
+2b33222b33222f3c22383c233f4e1e3a4423383c23383c233a4423383c232b3322
+333522272c1f1e241b2b332233352224261c272c1f24261c24261c272c1f272c1f
+272c1f24261c272c1f272c1f24261c24261c272c1f1e241b342d1f272c1f272c1f
+4e50434e44253f4e322a34382b33222a3438262e352f3c222f3c223a44233f4e32
+2f3c22333522333522333522333522383c232f3c222b3322383c23333522342d1f
+272c1f272c1f333522333522383c232f3c2233352233352224261c24261c2f3c22
+3a4423272c1f2b33222b33222f3c22272c1f1e241b24261c272c1f3335223a4423
+2b3322333522333522333522272c1f383c2356603a5658384c5026383c23333522
+2b3322342d1f272c1f342d1f2b33222b3322342d1f24261c24261c24261c1c1e19
+24261c24261c272c1f333522342d1f272c1f3a4423333522333522383c233a4423
+2f3c222b33223335222f3c222b33222b33222f3c222f3c22383c23383c23383c23
+2b33222b33222b33222b33222f3c223335222b33223335222b3322272c1f342d1f
+272c1f2b33222b33222f3c22272c1f342d1f3336423a44233335222b3322333522
+2f3c222f3c222b3322272c1f272c1f272c1f272c1f3335222b3322272c1f2b3322
+272c1f272c1f272c1f272c1f342d1f272c1f262e35342d1f272c1f272c1f333522
+2b3322333522272c1f342d1f24261c24261c342d1f24261c272c1f24261c24261c
+272c1f24261c2b33222b3322272c1f2b33222f3c22272c1f272c1f342d1f2b3322
+272c1f2b33222b3322333522383c23342d1f272c1f342d1f272c1f272c1f2b3322
+2b33222b3322272c1f2b3322272c1f24261c272c1f2b3322272c1f2b3322272c1f
+3a44233f4e324e50433d573b60759075889b7a91a87d98b18da0b692a8b69ea9b4
+7d98b177877249603256603a4758324c50264c50263f4e324e44253f4e3254605f
+3f4e322f3c22333522333642333522333642383c233335222b3322333642342d1f
+272c1f2a34383043213f4e322f3c22333522333522342d1f342d1f262e35272c1f
+2a34383336422b33222e3c442a3438465864496065607590496065607590819fb7
+92a8b6819fb77d98b19fb0bb92a8b694afb992a8b69fb0bb7d98b17d98b18da0b6
+92a8b68da0b675889b3d573b2f3c22333522373e432b3322272c1f272c1f333522
+272c1f342d1f272c1f272c1f272c1f333522333522333522342d1f333522342d1f
+33352224261c272c1f333522383c232f3c22342d1f272c1f342d1f342d1f342d1f
+3335224c5026333522342d1f272c1f272c1f272c1f342d1f342d1f333522333522
+383c233a4423383c233a44233f4e1e383c233f4e1e3f4e323f4e32496032496065
+667c74667c74576a6247581f3f4e323a4423383c232f3c22383c233a44233a4423
+465864667c746b8673627d997a91a88da0b69ea9b492a8b69ea9b492a8b68da0b6
+8da0b69ea9b492a8b692a8b69ea9b49ea9b49ea9b492a8b692a8b69ea9b49ea9b4
+92a8b68da0b68b919f8a99ab92a8b68da0b675889b577376556c84577376597c75
+577376354c313043212f3c223a4423354c3147583254605f3d573b3043212f3c22
+47583254605f6374717d90823c586f496065757c719ea9b4aeb0bdaeb0bdaeb0bd
+aeb0bdaeb0bdaeb0bdaeb0bd9ea9b49da1ab9ea9b49fb0bb9fb0bb9da1ab9d9981
+848887757c7187886d54605f2f3c222b3322272c1f383c233a44232f3c222f3c22
+2f3c222b33223335222f3c223944466374718b919f778772667c743d4f5654605f
+5658384e504344362375704d666c5e3335222b3322272c1f342d1f272c1f342d1f
+272c1f2b3322383c23333522304321383c23333522272c1f272c1f2b3322272c1f
+272c1f2b3322272c1f333522272c1f342d1f272c1f272c1f272c1f333522272c1f
+272c1f24261c342d1f272c1f1c1e191e241b24261c24261c272c1f272c1f272c1f
+383c233944465658382e3c444758324960653043213d573b3d573b54605f3a4423
+2f3c222f3c22304321383c232f3c222f3c223043212f3c222f3c22272c1f272c1f
+272c1f272c1f3335222b3322342d1f272c1f333522342d1f1c1e1924261c342d1f
+2b3322272c1f272c1f2b33222f3c2224261c24261c24261c333522342d1f333522
+3335222b33223335222b3322272c1f342d1f2b3322333522272c1f342d1f24261c
+272c1f24261c342d1f3335222b3322272c1f272c1f24261c24261c342d1f24261c
+24261c24261c272c1f383c23272c1f272c1f2f3c223a4423333522333522333522
+3335222f3c22272c1f3335223335222f3c222b3322304321383c23383c232f3c22
+272c1f2b33222f3c222f3c22304321383c232f3c223335222f3c222b33222f3c22
+2b33222b3322383c233a4423272c1f272c1f342d1f2b33222f3c223335222f3c22
+2f3c223043212b3322272c1f383c232b3322272c1f272c1f272c1f3335222f3c22
+272c1f342d1f272c1f24261c24261c272c1f272c1f2b3322272c1f2b3322333522
+342d1f3335222b3322342d1f272c1f24261c272c1f24261c24261c24261c24261c
+24261c24261c342d1f272c1f272c1f2b33222f3c22272c1f272c1f272c1f272c1f
+272c1f272c1f342d1f342d1f272c1f272c1f272c1f342d1f342d1f272c1f272c1f
+272c1f272c1f342d1f272c1f272c1f272c1f272c1f2b3322342d1f272c1f272c1f
+373e433f4e323f4e323c586f60759075889b7a91a88a99ab92a8b692a8b68da0b6
+7d98b16b8673666b3b5658384758325658383f4e324e5043576a62475832465864
+354c312f3c22333522383c232b3322383c23373e43333522342d1f2b33222b3322
+272c1f2b33223a4423383c232f3c22383c232a34382b33222b3322262e35272c1f
+3335222f3c222b33223335222e3c443d4f565773766886a6537499556c847d98b1
+9fb0bb92a8b692a8b692a8b692a8b69ea9b49ea9b492a8b68da0b68a99ab8da0b6
+92a8b6819fb7577376344d592f3c222f3c22333522272c1f262e35272c1f272c1f
+272c1f2b33222b3322272c1f2b33222f3c22383c23383c232b3322383c23383c23
+342d1f24261c24261c333522333522333522272c1f3335222b3322342d1f272c1f
+333522383c23342d1f333522342d1f272c1f272c1f24261c24261c333522333522
+3335223a4423383c23383c233a44233a44234e44253a4423465864576a6254605f
+576a6263747154605f47583256603a3f4e1e3a4423394446354c31394446496032
+496065667c747d98b18a99ab8a99ab92a8b692a8b69ea9b492a8b69ea9b48da0b6
+8a99ab8da0b69ea9b49da1ab92a8b69ea9b492a8b69ea9b492a8b69ea9b48da0b6
+9ea9b492a8b68da0b68da0b68da0b68da0b675889b6b86736f8fae667c74577376
+666c5e3944463335223a442354605f354c31496065819fb775889b344d592f3c22
+4e504354605f576a6277877249606546586475889b9ea9b4aeb0bdc0b8a6aeb0bd
+aeb0bdaeb0bdaeb0bd9ea9b49ea9b492a8b69ea9b49ea9b49ea9b49ea9b48da0b6
+778772757c715f61563f4e323f4e32383c232f3c223a44233a44233a44232f3c22
+2f3c222f3c222f3c22354c314e5043666c5e8b919f7a91a8667c74496065576a62
+4e5043373e43333642666c5e574f262f3c22333522342d1f2b33223335222b3322
+1e241b272c1f272c1f2b3322333522272c1f272c1f24261c272c1f2b3322272c1f
+272c1f2b3322272c1f2b33222b33223335222b33222b3322342d1f33352224261c
+24261c24261c33352233352224261c1c1e191c1e191e241b24261c24261c272c1f
+4e4425333642565838354c313d4f5646586454605f4b6865354c31344d1e3a4423
+304321304321304321383c232f3c223a4423383c23333522383c2333352224261c
+342d1f3335223043212b33222b3322272c1f272c1f272c1f24261c24261c24261c
+272c1f1e241b272c1f272c1f342d1f272c1f1c1e19272c1f2b3322342d1f333522
+2b3322262e35333522333522342d1f272c1f24261c24261c24261c342d1f24261c
+24261c24261c1e241b24261c272c1f2b332224261c24261c24261c24261c24261c
+24261c24261c342d1f33352233352224261c333522383c232f3c222b3322333522
+2f3c22383c232f3c222f3c223043213a4423383c233a4423304321333522333522
+3f4e1e3f4e1e344d1e3f4e1e3a44233a4423383c233043212f3c22344d1e2f3c22
+3335222b33223a4423627444272c1f2f3c222b33222b33222b33222b33222f3c22
+3335222b33223a4423383c232b3322342d1f272c1f3335222b33222b3322342d1f
+2b3322272c1f272c1f272c1f272c1f272c1f2b3322272c1f3335222b33222f3c22
+2b33222f3c222b3322272c1f272c1f24261c24261c24261c24261c24261c24261c
+24261c24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f342d1f
+272c1f272c1f272c1f272c1f342d1f24261c272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f342d1f272c1f24261c333522333522342d1f272c1f272c1f272c1f
+2f3c223f4e323d4f564960656f8fae8a99ab92a8b692a8b68da0b68da0b68da0b6
+75889b6b8673576a624960324e50434758323f4e324758324b686547583254605f
+3f4e32354c312a34383335222a34383335222f3c22333522262e352b3322333642
+24261c272c1f2b3322383c232f3c222b33222b3322262e352b3322262e352b3322
+2b33222f3c222b33223335222e3c443944464658644a6a8d556c84626e8c7a91a8
+8da0b692a8b692a8b69ea9b492a8b692a8b694afb992a8b6819fb792a8b692a8b6
+92a8b67d98b14960653043212a34383043212f3c222b3322272c1f2b3322333522
+342d1f272c1f383c23272c1f342d1f2f3c223a4423383c23333522383c23383c23
+333522342d1f342d1f3335222b3322342d1f24261c333522383c2333352224261c
+333522333522272c1f342d1f272c1f24261c272c1f272c1f24261c342d1f342d1f
+342d1f2b3322383c233a4423565838354c31394446383c234e50436374714b6865
+4b68656b867375889b576a62576a624758324758323f4e323f4e323d4f563d573b
+4b686575889b8b919f92a8b68da0b69da1ab92a8b69ea9b492a8b692a8b69ea9b4
+8da0b68da0b69ea9b492a8b692a8b69ea9b492a8b69ea9b48da0b69fb0bb8da0b6
+9ea9b492a8b68da0b69ea9b48da0b68a99ab7a91a86886a6627d99556c84496065
+496065354c313043212f3c223f4e323f4e324b68657e98827d90824960653f4e32
+354c314e5043465864627d997d98b175889b8b919f9da1abaeb0bdaeb0bdaeb0bd
+aeb0bdaeb0bd9ea9b49ea9b49ea9b492a8b692a8b69ea9b49ea9b49da1ab9da1ab
+9da1ab778772666b3b565838666c5e5f61563a44233043213a4423383c23333522
+3335222f3c22383c233a44233a442354605f757c7175889b6374714b686554605f
+383c23333642333522757c714e50432f3c223043212f3c223a44233043212f3c22
+272c1f272c1f24261c342d1f342d1f1e241b272c1f2b33222b3322333522272c1f
+272c1f272c1f272c1f24261c2b33222b33223335222b3322333522333522272c1f
+24261c24261c342d1f342d1f24261c24261c1c1e1924261c24261c272c1f2b3322
+3a4423272c1f2a34383d4f566374713d4f564658644960653f4e1e354c313a4423
+2f3c223a44232f3c22383c232f3c223043213a4423383c23333522333522272c1f
+342d1f2f3c222f3c2224261c272c1f24261c24261c272c1f24261c272c1f1e241b
+1c1e191e241b1e241b24261c272c1f272c1f1c1e19342d1f2b33222f3c222b3322
+272c1f272c1f342d1f2b3322272c1f272c1f24261c24261c24261c33352224261c
+342d1f1c1e1924261c1e241b24261c333522342d1f24261c24261c342d1f24261c
+24261c24261c272c1f272c1f342d1f24261c272c1f2b3322383c23272c1f2f3c22
+3335222b33222b33223a44233a44233a4423383c234e44253a44232f3c222f3c22
+4c50264c50264c50263a4423383c23383c232b33222b3322342d1f383c232f3c22
+3335222b33223335223f4e1e2b3322383c23342d1f272c1f272c1f2b33222b3322
+2b3322272c1f333522333522272c1f2b33222b33222b33222b33222f3c222b3322
+272c1f2b3322272c1f272c1f272c1f342d1f333522272c1f2b3322333522383c23
+2f3c223a44232f3c22272c1f272c1f24261c24261c24261c342d1f24261c24261c
+24261c24261c24261c24261c24261c272c1f272c1f272c1f272c1f24261c24261c
+272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f272c1f
+24261c272c1f272c1f342d1f272c1f3335222b3322333522272c1f342d1f272c1f
+373e433f4e324960654960656886a67a91a87d98b1819fb792a8b692a8b67a91a8
+7a91a8608471576a6254605f49603254605f576a626374716b8673667c74465864
+3d4f564e5043373e433335222b33222f3c223335222e3c44342d1f342d1f272c1f
+24261c262e3524261c262e353335222a3438342d1f2b33222b3322262e35272c1f
+2f3c222b33222e3c442b33223335222a34382a3438344d594658644a6a8d7a91a8
+92a8b692a8b692a8b692a8b692a8b694afb99ea9b492a8b68da0b692a8b692a8b6
+92a8b67d98b14960653043212e3c44383c23333522333522272c1f2b33222b3322
+3335222b3322333522272c1f272c1f272c1f333522333522342d1f2e3c44383c23
+2b3322333522333522383c23262e35272c1f272c1f342d1f333522272c1f272c1f
+272c1f342d1f272c1f272c1f272c1f272c1f24261c342d1f24261c272c1f272c1f
+272c1f24261c2a34383335223f4e323a442354605f3d573b54605f576b33577376
+63747175889b6374714960654e50433944463944463d4f564e50433d4f563c5072
+54605f627d998a99ab92a8b69ea9b492a8b692a8b692a8b68da0b692a8b68da0b6
+8a99ab8da0b692a8b68da0b692a8b692a8b692a8b68da0b692a8b68da0b69ea9b4
+8da0b68da0b68da0b692a8b692a8b6819fb78da0b675889b75889b576a62456185
+667c743944463a44232f3c223944463f4e324960656886a66b86733d573b3d4f56
+354c31465864465864576a627a91a88a99ab8a99ab9da1abaeb0bdaeb0bdaeb0bd
+aeb0bd9da1ab9ea9b49da1ab8da0b69ea9b48da0b69ea9b49ea9b49ea9b49da1ab
+9ea9b4848887576a625658387787728b98823f4e323a44233a44233a4423333522
+2f3c223335223a44233a442330444d496065637471576a626374714b68654e5043
+383c233336422b3322666c5e5658382f3c223a4423383c232f3c222f3c22383c23
+2f3c223a4423272c1f24261c2b3322272c1f272c1f2f3c222b33222b33222b3322
+2b3322272c1f24261c24261c272c1f2b33222b3322383c23272c1f333522272c1f
+1e241b272c1f272c1f24261c24261c1c1e1924261c24261c24261c24261c333522
+333522272c1f272c1f373e43576a624658643043213f4e32383c232b3322333522
+383c23383c232b33223335222f3c22383c232f3c223335222f3c222b3322272c1f
+272c1f3335222f3c22272c1f272c1f24261c24261c24261c24261c24261c24261c
+1c1e1924261c24261c272c1f24261c272c1f2b33222f3c222f3c222f3c22333522
+2b33222b33222b33222b3322342d1f342d1f272c1f24261c342d1f342d1f342d1f
+342d1f24261c24261c24261c24261c24261c272c1f24261c24261c342d1f24261c
+24261c1c1e1924261c24261c1e241b24261c24261c333522272c1f272c1f2b3322
+2b332224261c272c1f342d1f383c23383c23383c23383c233f4e1e3a44232f3c22
+333522383c23333522333522333522333522272c1f24261c24261c342d1f272c1f
+3335222b3322272c1f3335222b3322272c1f272c1f3335222f3c223043212b3322
+342d1f333522272c1f383c23272c1f333522272c1f2b33222b33222b3322272c1f
+342d1f272c1f2b3322272c1f272c1f2b3322342d1f2b3322272c1f333522383c23
+333522333522272c1f272c1f333522342d1f24261c272c1f24261c272c1f24261c
+24261c24261c24261c272c1f272c1f272c1f342d1f24261c272c1f272c1f24261c
+272c1f272c1f2b3322272c1f342d1f342d1f272c1f272c1f272c1f342d1f272c1f
+272c1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+373e433f4e324960653d573b627d9975889b8da0b6819fb792a8b692a8b68da0b6
+7d98b16f8fae667c74667c74709081778772667c7463747175889b5d83a44b6865
+5773764658642f3c222b3322383c232a34383335222e3c44272c1f262e35262e35
+24261c262e35272c1f342d1f2a34383335222b33222a3438272c1f272c1f24261c
+2a34382b33223335222a34382b33222e3c442e3c443d4f563c50723c5072607590
+7d98b18da0b694afb992a8b692a8b692a8b68da0b692a8b692a8b692a8b692a8b6
+92a8b6819fb74960653043213335223335222a3438333522272c1f2b33222b3322
+2b33222b3322383c2324261c272c1f2b3322333522333522342d1f333522383c23
+333522272c1f2b3322383c23342d1f272c1f272c1f24261c342d1f272c1f342d1f
+272c1f342d1f272c1f342d1f342d1f342d1f24261c272c1f24261c24261c1e241b
+272c1f24261c272c1f333522394446373e434e5043496065637471576a626b8673
+7d98b1667c7454605f4960653f4e324e50433f4e323944463f4e323f4e32344d59
+4658646886a675889b8da0b68da0b68da0b69ea9b492a8b69da1ab8da0b692a8b6
+8da0b68da0b68da0b692a8b68da0b68da0b692a8b68da0b692a8b68da0b68da0b6
+9ea9b492a8b69da1ab92a8b692a8b68da0b68a99ab7a91a875889b4658643d4f56
+465864354c313a44233335222f3c22383c23354c31556c84597c754b6865496065
+3d573b6374714658644960657a91a87a91a88a99ab9ea9b4aba9a6aeb0bd9ea9b4
+9ea9b49ea9b48da0b69ea9b49ea9b492a8b69ea9b49ea9b492a8b69da1ab8da0b6
+8da0b67d9082576a623f4e328b919f9d99815f6156383c23383c23383c23333522
+333522333522354c313a44233944464b6865556c84556c84666c5e54605f3f4e32
+3336422e3c443f4e32666c5e4e50433f4e322f3c223335222f3c222f3c22373e43
+344d59565838272c1f24261c2f3c22272c1f272c1f2f3c22272c1f2b33222f3c22
+2b33221e241b272c1f272c1f24261c272c1f2b3322333522272c1f342d1f342d1f
+272c1f24261c24261c1c1e1924261c24261c24261c24261c24261c24261c383c23
+33352224261c272c1f2e3c443d4f56465864354c312f3c22333522333522333522
+2b33222b33222b33222b33222f3c222f3c222b3322333522383c23333522272c1f
+342d1f33352233352224261c24261c24261c24261c24261c24261c24261c24261c
+1c1e19272c1f3335222f3c223335222f3c22304321304321304321344d1e2f3c22
+3043213a4423304321272c1f272c1f24261c24261c24261c33352233352224261c
+342d1f24261c24261c24261c24261c24261c24261c24261c272c1f24261c24261c
+24261c24261c24261c24261c24261c1e241b1e241b272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f383c2333352233352233352224261c
+1e241b24261c1e241b24261c24261c24261c342d1f272c1f272c1f24261c24261c
+272c1f272c1f2b3322272c1f342d1f2b3322272c1f2f3c22304321304321344d1e
+383c232b3322272c1f3a44232b3322333522272c1f2b33222f3c222b33222b3322
+2b33222b33222b3322272c1f272c1f2b3322272c1f2b3322383c23333522272c1f
+272c1f2b33222f3c222b3322272c1f272c1f24261c24261c342d1f24261c24261c
+24261c24261c24261c24261c24261c24261c272c1f24261c24261c24261c342d1f
+342d1f272c1f2b33222b3322272c1f342d1f272c1f272c1f272c1f24261c272c1f
+272c1f272c1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+2f3c224960654b68654658644b68656886a6819fb78da0b6819fb78da0b68da0b6
+8a99ab709081597c756374716886a67090816886a675889b7090816886a6577376
+556c844b6865373e43333522333642333522333522333522262e35342d1f24261c
+272c1f333642262e35272c1f2b33222a3438333522342d1f2a3438272c1f262e35
+2b33222b33222e3c44342d1f2b332230444d30444d2e3c443c586f3c5072556c84
+75889b8da0b68da0b68da0b692a8b68da0b692a8b692a8b68da0b692a8b692a8b6
+92a8b67d98b14960653043212a34382b33222f3c222f3c22333522333522333522
+3335222b33222f3c22342d1f272c1f333522342d1f3335223335222b33222b3322
+383c23272c1f24261c3335222b332224261c342d1f24261c24261c272c1f24261c
+272c1f2b33222b33222b33222b33222b3322272c1f24261c24261c333642342d1f
+24261c24261c272c1f272c1f383c233335222a3438576a627a91a8627d99757c71
+8b919f627d996374714960653944464658643d4f563a442330444d4e50433d4f56
+46586475889b8a99ab8da0b692a8b692a8b68da0b68da0b68da0b68da0b69da1ab
+8da0b68da0b692a8b68da0b692a8b68da0b68da0b692a8b692a8b692a8b692a8b6
+8da0b692a8b68da0b68da0b68da0b68da0b67d98b175889b626e8c3d4f56344d59
+4960654b6865354c312a34382f3c222e3c443f4e324960656b8673667c74577376
+4658645773766b86736f8fae556c848b919f92a8b68da0b69ea9b49da1ab9ea9b4
+9ea9b48da0b69ea9b49da1ab8da0b69ea9b48da0b68da0b68a99ab8a99ab8a99ab
+8a99ab7a91a85658383944466374718b919f4658642f3c223a4423383c232b3322
+2f3c222f3c22383c232f3c222f3c22565838465864576a62667c74666c5e3f4e32
+272c1f373e43666c5e5f61563a44232f3c222b3322383c233335222b3322262e35
+272c1f262e35272c1f272c1f2f3c222b3322272c1f2b33222b3322272c1f2f3c22
+344d1e272c1f272c1f24261c1e241b24261c1e241b24261c272c1f272c1f2b3322
+2b3322272c1f24261c24261c24261c272c1f342d1f272c1f272c1f272c1f3a4423
+383c23272c1f2f3c222f3c222e3c443f4e3254605f2f3c222b33222f3c222b3322
+2b33223335223335222b33223335222f3c22333522272c1f2b33222f3c22342d1f
+2b3322342d1f272c1f24261c24261c24261c24261c24261c24261c24261c24261c
+272c1f2b33222b33222f3c22304321344d1e3043213a44233043213a44233a4423
+3a44233f4e323a44232f3c22272c1f24261c24261c24261c333522383c23342d1f
+24261c342d1f1c1e1924261c24261c24261c342d1f272c1f342d1f342d1f24261c
+24261c24261c24261c24261c24261c24261c24261c24261c342d1f24261c24261c
+342d1f24261c24261c24261c24261c24261c272c1f342d1f1c1e191c1e1924261c
+1c1e1924261c24261c24261c24261c24261c272c1f24261c24261c272c1f272c1f
+342d1f272c1f272c1f24261c24261c272c1f24261c2f3c223043213f4e1e3f4e1e
+2f3c22333522333522333522342d1f3335222b33223335222f3c22272c1f2b3322
+342d1f383c23272c1f272c1f272c1f272c1f272c1f342d1f272c1f342d1f272c1f
+342d1f33352233352233352224261c272c1f342d1f272c1f272c1f24261c24261c
+24261c24261c272c1f24261c272c1f272c1f24261c342d1f24261c24261c272c1f
+272c1f272c1f272c1f2b3322272c1f2b3322333522272c1f272c1f342d1f272c1f
+272c1f272c1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+373e434b6865576a623d4f564658646075906f8fae8da0b68da0b68da0b68da0b6
+8a99ab7a91a86886a66b86737a91a87d98b17a91a875889b7d98b175889b7197b4
+597c75556c843f4e322e3c44383c232b33222a3438342d1f272c1f262e35262e35
+272c1f2b3322262e35272c1f262e35262e352a3438333522272c1f262e352b3322
+2f3c222b33223335222b33222a3438344d593d4f5630444d344d59496065627d99
+7a91a88da0b692a8b692a8b692a8b6819fb78da0b68da0b692a8b692a8b692a8b6
+92a8b6819fb754605f3944462b33222b33222f3c222f3c222b33223335222b3322
+2b33222b33222b3322272c1f272c1f3335222b3322333522333522333522383c23
+383c232b3322272c1f333522333522272c1f24261c272c1f24261c342d1f272c1f
+272c1f342d1f2b3322272c1f272c1f272c1f272c1f342d1f262e35342d1f342d1f
+24261c24261c333522262e353a44233944463d4f563c5072848887819fb775889b
+75889b6886a6819fb77e98823d573b4b6865576a624960653d4f56475832465864
+556c8475889b8da0b68da0b68da0b692a8b692a8b68da0b68da0b68da0b68a99ab
+8da0b68da0b68da0b68da0b692a8b68da0b68da0b68da0b68da0b68da0b68da0b6
+8da0b692a8b68da0b68da0b69fb0bb8da0b67a91a86886a6577376667c74709081
+5d83a44960654e5043496065354c31354c31394446496065627d996886a66b8673
+556c84627d996886a66f8fae627d997a91a88da0b692a8b69da1ab9da1ab9da1ab
+9ea9b48da0b692a8b68da0b68da0b69da1ab9da1ab8da0b67a91a875889b8b919f
+75889b667c74565838394446666c5e75889b6374713a4423496032373e434e4425
+3a4423383c233a4423383c232e3c4449606554605f637471667c74667c7454605f
+2a34383f4e323a4423373e43333642272c1f272c1f262e35342d1f272c1f272c1f
+272c1f24261c1e241b272c1f3335222b3322272c1f2b33222f3c222b33222b3322
+3a4423272c1f342d1f24261c24261c24261c24261c1c1e191e241b272c1f2b3322
+333522333522333522342d1f24261c342d1f333522342d1f24261c272c1f383c23
+333522272c1f342d1f2a34382f3c223d4f564960653043212b33222f3c222f3c22
+3043212f3c222b33223335222f3c222f3c222f3c222b33222b33222f3c222f3c22
+333522272c1f272c1f1e241b24261c1c1e1924261c342d1f342d1f272c1f333522
+2b33222f3c222f3c222b33223335222f3c222f3c223a44233a44233f4e1e344d1e
+2f3c223a44232f3c22272c1f272c1f342d1f272c1f24261c342d1f555824333522
+24261c24261c24261c1c1e19342d1f272c1f333522342d1f272c1f272c1f342d1f
+24261c24261c24261c24261c24261c24261c272c1f24261c24261c272c1f333522
+272c1f272c1f24261c24261c1c1e1924261c24261c24261c24261c1c1e191c1e19
+1c1e1924261c24261c24261c24261c24261c24261c24261c24261c2b3322272c1f
+342d1f272c1f272c1f272c1f24261c24261c272c1f2b33223043213043213a4423
+3f4e1e3a4423373e43333522272c1f3335222b33222f3c22333522272c1f2b3322
+2b3322333522333522272c1f333522333522272c1f272c1f2b3322272c1f2b3322
+2b3322272c1f272c1f342d1f272c1f2b3322262e35272c1f272c1f24261c342d1f
+24261c24261c342d1f24261c272c1f272c1f24261c342d1f24261c24261c342d1f
+3335222b3322272c1f2f3c22272c1f342d1f333522272c1f272c1f272c1f24261c
+272c1f272c1f272c1f342d1f342d1f272c1f24261c272c1f342d1f272c1f272c1f
+2e3c44496065576a623d4f563d4f56496065627d997d98b18da0b6819fb7819fb7
+819fb77d98b17a91a87a91a8819fb7819fb77a91a87d98b17d98b17d98b17197b4
+75889b608471344d592f3c22373e432b3322333642262e3524261c272c1f24261c
+272c1f342d1f262e35272c1f272c1f272c1f2b3322272c1f272c1f272c1f2e3c44
+3944463335222e3c44272c1f373e434658643c586f354c3141678a556c84537499
+6f8fae92a8b692a8b6819fb78da0b692a8b692a8b692a8b692a8b692a8b692a8b6
+8da0b67e98823d4f563d573b354c312f3c2230444d2f3c222b3322333522342d1f
+2f3c22342d1f333522333522333522383c232b3322383c23383c232b3322333522
+333522342d1f272c1f342d1f333642342d1f342d1f24261c272c1f24261c24261c
+24261c272c1f272c1f272c1f272c1f342d1f272c1f272c1f272c1f272c1f262e35
+24261c24261c24261c272c1f2f3c22496065608471465864626e8c8a99ab75889b
+667c7460759075889b75889b496065667c74577376667c74556c84496065627d99
+75889b8da0b68da0b68da0b68da0b68da0b68da0b692a8b692a8b68a99ab7a91a8
+8da0b68da0b692a8b692a8b68da0b68da0b68da0b68da0b68da0b68da0b68da0b6
+92a8b68da0b692a8b68da0b68da0b68da0b67a91a86b8673627d99627d99709081
+627d994658643d573b4960653d573b3c586f496065627d997a91a875889b75889b
+54605f576a626374717d98b1819fb77d98b18da0b68da0b68da0b68da0b68da0b6
+8da0b68da0b68da0b68da0b68da0b68da0b68da0b68a99ab6075906886a675889b
+75889b637471475832373e43576a62626e8c6374714758323f4e323a44234c5026
+373e433f4e323a44233a44232f3c223f4e324658646374715f61564658643f4e32
+373e43333642333522383c23394446333522272c1f2b33222b3322272c1f24261c
+272c1f272c1f24261c272c1f333522272c1f2b33222b33222f3c22272c1f333522
+2f3c222b3322272c1f24261c272c1f272c1f1e241b2b3322342d1f2b3322383c23
+383c233a4423333522383c2324261c2b3322272c1f2b3322272c1f342d1f3f4e32
+2b3322272c1f2b3322272c1f272c1f2b33223043212f3c223335222b33222b3322
+2b33222f3c222b3322344d1e3c5822344d1e3c58223d573b354c313f4e323f4e32
+2f3c22342d1f24261c24261c24261c272c1f272c1f272c1f3335222b3322333522
+2f3c222f3c223a44233335222b33222b3322272c1f304321304321344d1e3a4423
+344d1e3a4423383c23383c232b3322333522272c1f24261c272c1f3f4e1e443623
+24261c342d1f24261c24261c342d1f342d1f333522342d1f272c1f342d1f342d1f
+342d1f24261c24261c24261c24261c24261c24261c24261c272c1f272c1f333522
+272c1f342d1f24261c24261c24261c24261c1c1e1924261c1c1e1924261c1c1e19
+24261c1c1e1924261c1c1e1924261c1c1e1924261c24261c1e241b24261c1e241b
+272c1f24261c333522272c1f24261c272c1f24261c272c1f383c233a44233a4423
+383c23383c233335222f3c222f3c222f3c222f3c223a4423333522333522272c1f
+3335222f3c222b3322342d1f2b3322272c1f272c1f272c1f272c1f383c23272c1f
+342d1f2b3322272c1f3335222b3322333522342d1f333642272c1f24261c24261c
+272c1f24261c24261c24261c272c1f272c1f24261c272c1f24261c272c1f333522
+2b3322272c1f272c1f2b33222b33222b33222b3322342d1f24261c272c1f342d1f
+342d1f272c1f272c1f2b3322272c1f24261c272c1f272c1f272c1f272c1f2b3322
+373e43344e6f3c586f354c313d4f56496065627d9975889b7d98b1819fb78da0b6
+819fb77d98b17d98b17d98b1819fb78da0b68a99ab7d98b18da0b6819fb77a91a8
+627d994b6865344d59304321373e432b33222a3438272c1f262e35262e3524261c
+262e35262e35333522262e35272c1f342d1f2a34382b3322262e35272c1f394446
+304321373e43373e43272c1f373e4330444d344d593c5072577376537499587ca0
+6886a6819fb792a8b692a8b68da0b692a8b68da0b692a8b6819fb78da0b692a8b6
+8da0b66886a6577376576a62354c31304321354c312f3c222f3c222e3c442b3322
+2f3c222b3322333522333522342d1f3335223335223335223335222b3322333522
+3335222b33222b3322333522333522272c1f342d1f272c1f24261c272c1f24261c
+272c1f342d1f2b3322272c1f2b3322272c1f272c1f24261c262e3524261c342d1f
+24261c24261c262e35272c1f342d1f3d4f56627d99556c84556c848a99ab75889b
+7a91a86886a67d98b1667c74577376627d99556c846886a66b86734b6865637471
+6075908a99ab8da0b68da0b67d98b192a8b6819fb78a99ab8da0b68da0b67a91a8
+8a99ab8da0b68da0b68da0b68da0b68da0b68da0b68da0b68da0b68da0b68da0b6
+819fb78da0b692a8b68a99ab8da0b68a99ab8a99ab6f8fae7a91a88a99ab8da0b6
+75889b3d4f563d4f56496065496065587ca07a91a87d98b18da0b67a91a8637471
+3d4f56556c84667c747a91a88a99ab7a91a88da0b68da0b68da0b68da0b68da0b6
+8da0b68da0b68da0b68a99ab8a99ab8da0b68da0b68da0b6757c71496065607590
+576a623d4f5656583830444d3d573b4658646374714658643f4e32383c233a4423
+3a4423383c23383c233a44233a4423383c233944465f61564e5043344d59394446
+373e433a44232f3c222f3c222f3c223335223335222f3c22272c1f272c1f272c1f
+2b33222b33222b332224261c2b33222b33222f3c222f3c222b33222b3322272c1f
+2f3c222b3322333522272c1f272c1f272c1f24261c3335222b33222b33222f3c22
+383c233a44233a4423342d1f272c1f333522272c1f272c1f2b3322272c1f383c23
+383c233335223335222b3322272c1f2f3c222b33222f3c22383c232b33222b3322
+2b33222b33223043214b6865608471627d996886a67197b4709081608471778772
+354c312a34382b3322383c232b33223043212f3c222b33222b3322333522342d1f
+2b33222b33223a44232f3c222f3c222f3c223335222b3322383c233f4e1e383c23
+2f3c22383c23383c23383c233043213a4423333522333522342d1f3a4423342d1f
+342d1f24261c24261c24261c342d1f383c23383c23342d1f333522383c23342d1f
+272c1f24261c24261c272c1f272c1f272c1f24261c24261c24261c342d1f342d1f
+272c1f342d1f24261c342d1f1c1e1924261c24261c24261c24261c24261c24261c
+24261c1c1e1924261c24261c24261c1c1e1924261c24261c24261c24261c24261c
+24261c272c1f333522383c23272c1f383c233335222b3322383c23383c23383c23
+2b33223335222b3322304321354c312f3c222f3c222f3c22333522383c232b3322
+2f3c223335222f3c22272c1f272c1f272c1f333522333522333522333522272c1f
+2b3322272c1f272c1f342d1f2b3322262e35272c1f272c1f262e3524261c24261c
+272c1f24261c24261c24261c272c1f272c1f24261c342d1f24261c272c1f272c1f
+333522272c1f272c1f2b3322262e35272c1f272c1f342d1f262e35272c1f272c1f
+272c1f272c1f272c1f272c1f33352224261c24261c272c1f272c1f272c1f342d1f
+373e433c586f3c50723d4f56394446344d596075907a91a8819fb7819fb7819fb7
+819fb7819fb77d98b1819fb78da0b6819fb7819fb78da0b6819fb78da0b67d98b1
+7a91a86f8fae3d5f252f3c22373e432b3322333522262e35262e35272c1f272c1f
+272c1f272c1f342d1f2a34382b3322272c1f2b3322342d1f272c1f272c1f2e3c44
+344d592e3c443335223335222a3438344d594b6865344e6f4b68656886a66886a6
+6f8fae8da0b68da0b68da0b6819fb78da0b6819fb792a8b692a8b68da0b68da0b6
+8a99ab6886a65773765773763d4f563f4e323944463a44232b3322383c23333522
+2f3c222b33223335222b33222b3322333522383c23383c233335222b3322333522
+333522272c1f272c1f2b33222b3322272c1f333522342d1f272c1f342d1f272c1f
+342d1f272c1f2b3322333522272c1f342d1f24261c24261c4e3d22272c1f262e35
+272c1f24261c24261c262e35272c1f3f4e327a91a87d98b16075907d98b18a99ab
+8a99ab8a99ab75889b627d99576a6254605f556c8475889b6f8fae6075906f8fae
+7a91a88da0b68da0b6819fb77d98b18da0b6819fb77d98b18da0b68a99ab75889b
+8a99ab8a99ab819fb78da0b68da0b68a99ab8da0b68da0b68da0b6819fb78a99ab
+8da0b6819fb78a99ab7d98b1819fb78a99ab7d98b17a91a86886a67a91a88a99ab
+667c743d4f563944464b68656374717a91a8819fb78da0b68a99ab7a91a875889b
+54605f627d996886a67a91a88a99ab8da0b68a99ab8da0b68da0b68da0b68da0b6
+8da0b68da0b68a99ab8a99ab8a99ab8da0b67a91a86886a67a91a8667c74576a62
+54605f3944463d4f562f3c223944463c5072496065666c5e383c232f3c22383c23
+383c23304321383c23373e433a4423383c23373e4354605f4658643944463a4423
+2a3438394446373e433a44233f4e3230444d3a4423373e43262e352b33222a3438
+3a4423304321354c312b3322272c1f2b3322383c232f3c222f3c222b33222b3322
+2f3c222b33222b332224261c24261c24261c272c1f272c1f3335222f3c22333522
+4436233f4e1e383c23272c1f3335223335222b3322272c1f2b3322333522383c23
+3335222f3c223a44232b33222b33223335222f3c223a4423383c23272c1f1e241b
+3043213d573b57737675889b7090817a91a875889b7a91a8607590556c846b8673
+3d4f564960654960655773765773766b86735773762f3c222b33223f4e323d573b
+3944463d4f564758323f4e323335223a44232f3c222f3c222b3322383c23383c23
+3335223a44232b33222f3c223335223a44232f3c22383c23383c23383c23333522
+24261c342d1f24261c24261c342d1f2b3322342d1f2b3322383c232b3322333522
+342d1f24261c24261c342d1f333522342d1f24261c24261c24261c3335222f3c22
+24261c272c1f342d1f1c1e1924261c24261c1c1e1924261c24261c1c1e191c1e19
+1c1e1924261c1c1e191c1e1924261c24261c24261c24261c24261c24261c24261c
+24261c24261c272c1f2b3322342d1f272c1f3a4423333522383c233335222b3322
+272c1f3335222f3c222f3c22383c233335222b33223043212f3c223a44232b3322
+2f3c222b33222b33222b33222b3322333522383c232b33222b33222b3322272c1f
+342d1f272c1f2b33222b33223335222b3322262e35342d1f24261c342d1f24261c
+24261c24261c24261c272c1f262e35272c1f24261c262e3524261c262e35342d1f
+272c1f2b33222b3322272c1f262e35333522272c1f262e35342d1f24261c342d1f
+272c1f272c1f272c1f342d1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f
+3336423944463c50723d4f56344d593c586f5773766886a66f8fae7d98b1819fb7
+819fb77d98b17d98b1819fb7819fb7819fb7819fb7819fb7819fb78da0b67197b4
+6f8fae6886a63c586f3043212e3c442f3c222b3322342d1f272c1f262e3524261c
+262e35262e35342d1f2a34382b3322262e352b33222b3322262e352b33222e3c44
+354c312e3c442a34382b332230444d344d593d4f56344d593c507254605f627d99
+7d98b192a8b692a8b68da0b68da0b68da0b6819fb78da0b6819fb792a8b692a8b6
+7d98b16886a6597c754a6a8d3f4e32354c313d573b3d4f562f3c222b3322333522
+342d1f2b3322333522342d1f2b3322333522383c232f3c22342d1f2b33222b3322
+3335222b3322272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f2b33222b3322342d1f333522262e35262e3524261c342d1f
+342d1f262e3524261c262e352b3322394446667c747d98b17d98b1819fb77d98b1
+627d997a91a875889b627d9954605f3d4f566075907a91a87d98b17a91a87d98b1
+8a99ab8da0b68da0b67d98b16886a68a99ab7d98b17d98b18da0b67d98b1627d99
+8a99ab8da0b6819fb7819fb78da0b68da0b6819fb78da0b6819fb77d98b18b919f
+819fb78da0b67a91a88a99ab8da0b68a99ab7a91a87d98b18a99ab7a91a8627d99
+54605f4960653d4f56465864344d596075908a99ab8a99ab7d98b1627d995d83a4
+576a6275889b6886a67a91a88a99ab8da0b68a99ab8da0b68a99ab8da0b68a99ab
+8da0b68a99ab8da0b68da0b67d98b17d98b175889b627d997a91a8607590496065
+54605f394446354c312f3c22354c31354c313d4f564658643a44233944463f4e32
+3335222f3c223335223a44233f4e323a44233a4423373e433a44233944462f3c22
+2b3322373e432f3c222f3c224658643f4e322f3c22373e432b332230444d304321
+2e3c442f3c222f3c222b33222f3c222f3c22383c232f3c222f3c222b3322333522
+2f3c22272c1f272c1f24261c272c1f24261c342d1f2b33223335222f3c222f3c22
+342d1f33352244362324261c383c233a44232f3c22272c1f2f3c222b33222b3322
+3335222f3c222f3c222b33222b3322383c232f3c22373e432f3c22272c1f2b3322
+354c313d5f7a577376627d996075907d98b16b86737d98b14960653d4f56607590
+3d4f565773764b6865556c84576a62556c843d573b354c312e3c446b86736b8673
+3c586f4b6865576a624960653a4423383c232f3c22333522333522333522333522
+2b33222f3c222b33223a44233335223f4e1e3a4423383c23383c23383c23342d1f
+24261c342d1f24261c24261c24261c2b3322342d1f2a34383336422b33222b3322
+342d1f24261c24261c342d1f2f3c22333522272c1f24261c24261c24261c342d1f
+24261c24261c24261c24261c1c1e1924261c24261c24261c1c1e1924261c1c1e19
+1c1e1924261c1c1e1924261c24261c24261c24261c24261c342d1f24261c24261c
+24261c24261c24261c272c1f1e241b24261c272c1f272c1f4e4425333522333522
+272c1f2b3322342d1f272c1f2b3322272c1f342d1f2f3c222f3c222f3c222f3c22
+2f3c222b33223335223335222b3322272c1f333522272c1f342d1f2b3322272c1f
+272c1f272c1f2f3c223335222b3322342d1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f24261c262e35342d1f272c1f24261c24261c272c1f272c1f24261c
+342d1f272c1f262e35272c1f272c1f333522342d1f272c1f272c1f262e352b3322
+272c1f342d1f2b3322272c1f272c1f272c1f272c1f24261c272c1f272c1f272c1f
+2a34383336423d4f56344d5930444d3c586f556c84627d997a91a8819fb77d98b1
+819fb7819fb7819fb7819fb7819fb7819fb7819fb7819fb7819fb792a8b67d98b1
+7d98b1577376344d593043213043212a34382a3438262e35272c1f262e35262e35
+24261c272c1f2b33222b33222f3c222b3322262e35272c1f262e35272c1f2b3322
+3944463335222b33222e3c4446586446586430444d3944463d4f56456185607590
+7d98b17d98b1819fb78da0b68da0b6819fb78da0b6819fb78da0b6819fb78da0b6
+8b919f627d996b86736886a6597c754b68654960653f4e32333522333522272c1f
+2b3322342d1f2b33222b3322272c1f2f3c22383c233335222b3322272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f24261c24261c272c1f272c1f24261c272c1f
+24261c24261c272c1f272c1f272c1f2b33222b3322342d1f262e35342d1f333642
+24261c342d1f2b33222b33222f3c2230444d576a626886a67d98b18a99ab7a91a8
+627d99627d9975889b75889b4b68653d4f56667c746886a67d98b17a91a88a99ab
+7d98b18a99ab819fb77d98b16075907d98b17a91a87a91a8819fb77a91a86886a6
+7d98b17d98b1819fb78a99ab8da0b68a99ab7a91a87d98b17d98b16f8fae7d98b1
+8b919f7a91a87a91a88a99ab819fb7819fb775889b7d98b18a99ab627d99607590
+4658643d4f563944463d4f56344d596075908a99ab8a99ab8a99ab627d99627d99
+627d997a91a87a91a87a91a88da0b68a99ab7d98b18a99ab7d98b18a99ab819fb7
+7d98b18a99ab7d98b17d98b18a99ab627d99627d99667c746374716374713d4f56
+3f4e32354c31354c312e3c444658643944463d4f563f4e323a44233a44233a4423
+383c232b33223335223f4e32556c844e50433f4e322a34382e3c4430444d304321
+342d1f3944462f3c222f3c224960653d4f562f3c22373e432f3c223d4f5630444d
+2b33222f3c222f3c22333522344d1e2f3c223a44232f3c222f3c22272c1f272c1f
+333522272c1f272c1f272c1f272c1f342d1f272c1f342d1f383c23333522333522
+272c1f333522383c232b3322383c232f3c22383c232b33223335222b3322272c1f
+383c23383c23333522272c1f272c1f342d1f333522394446354c312b3322272c1f
+2a343830444d607590607590667c746075907a91a87a91a83d4f563d4f56394446
+354c31577376556c84465864465864576a623c5072354c313d4f56627d99667c74
+5d83a47a91a8627d9954605f3d4f563a4423383c232f3c223a4423342d1f2b3322
+3335222f3c222b33222b33222b33223335223a44232f3c22383c23383c23342d1f
+342d1f24261c24261c24261c272c1f262e35342d1f272c1f333522272c1f333522
+2b3322272c1f272c1f272c1f333522272c1f272c1f272c1f24261c24261c24261c
+24261c272c1f24261c24261c342d1f24261c24261c1c1e1924261c24261c1c1e19
+1c1e19342d1f1c1e1924261c1c1e19342d1f24261c24261c24261c24261c1c1e19
+24261c24261c272c1f342d1f24261c24261c24261c1e241b2b3322383c23333522
+2b33222b3322272c1f272c1f342d1f272c1f2b3322333522333522272c1f333522
+2f3c222f3c222e3c443a44232b3322333522333522333522342d1f272c1f272c1f
+272c1f342d1f2b33223335222b33222b33222b3322272c1f262e35342d1f272c1f
+272c1f24261c272c1f272c1f2a3438342d1f272c1f342d1f24261c272c1f262e35
+342d1f272c1f272c1f262e352b33222b3322262e35272c1f272c1f272c1f342d1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+2a34382a34382e3c443d4f56344d594561855d83a46886a66f8fae7d98b17d98b1
+7197b47197b4819fb7819fb7819fb77d98b1819fb7819fb77d98b1819fb7819fb7
+6f8fae4b68653d573b4960653043212a34382b3322262e35272c1f342d1f262e35
+342d1f262e35262e352b33222a34382f3c222b33222b3322272c1f272c1f2a3438
+2f3c22333522342d1f2a3438373e43394446394446344d59394446496065626e8c
+587ca07a91a88da0b6819fb78da0b6819fb7819fb7819fb78a99ab819fb7819fb7
+7a91a875889b75889b537499556c84597c753f4e322e3c442b3322272c1f272c1f
+272c1f2b33222f3c222b3322272c1f383c23333522333522272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f333522342d1f272c1f1e241b1e241b1e241b24261c
+24261c24261c24261c342d1f2b3322272c1f272c1f342d1f272c1f2b3322333522
+2b33222e3c44354c312e3c44272c1f3043213d4f56556c847d98b17a91a8626e8c
+6886a66f8fae6f8fae627d993d4f563c5072627d997a91a87a91a87a91a88da0b6
+7a91a88a99ab819fb77a91a86075907d98b17a91a87d98b17a91a86886a66886a6
+7d98b17d98b18a99ab7d98b18a99ab8a99ab627d997a91a87a91a86f8fae75889b
+7a91a87a91a87d98b18a99ab8a99ab8a99ab627d998a99ab8a99ab75889b6886a6
+556c84496065344d594960654960655374997a91a87d98b17a91a875889b75889b
+6886a67a91a88a99ab8a99ab819fb78a99ab8a99ab8a99ab819fb78a99ab8a99ab
+819fb78a99ab75889b7d98b18a99ab75889b6075906886a663747154605f394446
+394446383c23354c313043214b68653043213944463944463043213f4e323f4e32
+383c232b33222b3322344d59597c754e50433f4e322b33222e3c44304321344d59
+2a343849606530444d2b33223f4e323f4e32262e352b33222a3438272c1f272c1f
+2b3322272c1f383c23333522383c233335223335222b33222f3c222b332224261c
+272c1f272c1f24261c24261c272c1f272c1f272c1f2b3322333522383c23333522
+272c1f342d1f2b33223335223a44232f3c223a4423272c1f383c232f3c222b3322
+3335222b3322342d1f272c1f272c1f272c1f2b33222e3c442f3c222e3c44272c1f
+2b3322344d594b6865607590576a6249606575889b7a91a8394446373e43394446
+373e4346586454605f3336422a3438576a624b6865354c31465864496065556c84
+576a62496065556c84394446373e433944462f3c22354c31354c312b33222b3322
+2b33222f3c222f3c22272c1f2f3c223335223336422f3c224e44252e3c44342d1f
+2b3322342d1f342d1f24261c24261c272c1f333522272c1f333522333642383c23
+383c23342d1f272c1f342d1f342d1f272c1f272c1f24261c24261c24261c24261c
+24261c24261c342d1f1c1e1924261c1c1e1924261c24261c1c1e19342d1f1c1e19
+24261c1c1e191c1e191c1e1924261c24261c24261c24261c1c1e1924261c24261c
+24261c24261c333522342d1f24261c24261c24261c24261c272c1f272c1f342d1f
+2b33222b3322272c1f272c1f2f3c22333522383c23373e432b33222b3322333522
+3944463335223335222f3c222f3c222f3c223335223335222b3322272c1f342d1f
+272c1f2b3322272c1f333522272c1f272c1f2b3322272c1f2b3322272c1f342d1f
+262e35272c1f24261c342d1f262e35342d1f262e35272c1f272c1f24261c342d1f
+262e35342d1f272c1f272c1f272c1f342d1f272c1f272c1f262e352b3322272c1f
+24261c272c1f272c1f272c1f24261c272c1f272c1f24261c24261c272c1f272c1f
+373e43262e3530444d3c586f3d4f564b68655d83a47d98b17197b47d98b17d98b1
+819fb7819fb77d98b17d98b17d98b1819fb7819fb7819fb7819fb77d98b17d98b1
+6f8fae4561853d573b3d4f562f3c222b3322333522272c1f262e352b3322262e35
+272c1f272c1f272c1f272c1f2f3c222f3c222a3438272c1f2e3c442b3322333522
+3336422a3438272c1f333522344d593d5f7a344d5949606530444d3d5f7a627d99
+4a6a8d6886a67d98b1819fb77d98b1819fb78a99ab819fb7819fb7819fb77d98b1
+7d98b17a91a87d98b175889b6f8fae6b867330444d2b33222b3322333522272c1f
+2b33223d4f56576a62394446272c1f383c233335222b332233352224261c24261c
+272c1f272c1f272c1f272c1f2b33222f3c22272c1f24261c24261c272c1f24261c
+24261c342d1f272c1f272c1f24261c272c1f272c1f272c1f262e35342d1f333522
+2b33222f3c224658644960652f3c2230444d496065556c848a99ab627d99465864
+6886a66886a6627d99576a6230444d3d5f7a6075907a91a8627d997a91a87d98b1
+7a91a88a99ab7a91a86886a654605f75889b6886a675889b75889b6075906f8fae
+75889b7a91a87d98b18a99ab7a91a87a91a860759075889b75889b75889b607590
+6f8fae75889b7a91a8819fb77d98b17d98b16886a67d98b17d98b16f8fae7a91a8
+587ca0637471496065597c7560759075889b6886a66886a67a91a8709081607590
+75889b627d997d98b17d98b18a99ab7a91a87a91a8819fb77d98b17d98b17d98b1
+8a99ab7d98b175889b7d98b17d98b1627d99556c8463747175889b496032373e43
+3a44232f3c222f3c222f3c224658643336423f4e322e3c44383c23394446373e43
+383c233335222f3c22394446667c744e504330444d2f3c222e3c44344d5954605f
+272c1f3d4f563d4f563944463d4f56394446272c1f24261c272c1f272c1f272c1f
+272c1f383c232b33223335222f3c223a44232b3322272c1f272c1f2f3c22272c1f
+24261c24261c342d1f272c1f272c1f272c1f2b3322333522272c1f272c1f342d1f
+2b33222b33223335222b33223a44232f3c22383c232b33222f3c22383c23272c1f
+333522272c1f272c1f272c1f272c1f1e241b333522383c232b3322272c1f272c1f
+30444d394446556c846075904658642a343854605f576a622e3c44272c1f342d1f
+272c1f333522394446262e35272c1f33364230444d354c31304321373e43496065
+4960653d4f56556c84373e43373e43394446344d59576a62667c743f4e322b3322
+3335222b33222f3c222f3c22342d1f272c1f2b33223335223a4423333522272c1f
+2b33222b3322272c1f24261c24261c272c1f272c1f2b3322333522373e43333522
+333522272c1f272c1f272c1f272c1f272c1f24261c24261c333522373e432a3438
+24261c24261c24261c24261c24261c342d1f24261c24261c1c1e1924261c24261c
+1c1e1924261c1c1e1924261c24261c1c1e1924261c24261c24261c24261c24261c
+24261c272c1f2b3322272c1f272c1f333522272c1f342d1f24261c272c1f272c1f
+342d1f2b3322272c1f272c1f333522262e35383c23333522342d1f272c1f2b3322
+2f3c222b33222b3322373e432f3c223043212b3322383c23272c1f2b33222b3322
+2b3322272c1f2b33222b33222b33222a34382b3322272c1f272c1f272c1f2b3322
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f262e35
+272c1f333522272c1f272c1f272c1f2b3322342d1f272c1f24261c272c1f272c1f
+272c1f272c1f272c1f24261c272c1f24261c272c1f24261c24261c272c1f2b3322
+2f3c223336422e3c44344d594561854a6a8d6886a67d98b17d98b17d98b17d98b1
+7197b47d98b17d98b17d98b1819fb77d98b17197b47d98b1819fb77d98b17d98b1
+6886a6627d994b6865354c31394446262e35342d1f2b3322272c1f272c1f342d1f
+272c1f262e35272c1f272c1f2a34382b33222f3c222b33223f4e322e3c442f3c22
+2f3c22373e432b33222a34382e3c443d4f56344d59354c312e3c4449606575889b
+5d83a46f8fae7d98b1819fb77d98b17d98b17d98b18a99ab7d98b1819fb78da0b6
+7d98b17d98b17d98b17d98b16f8fae4b68652e3c442b33222a34382b3322262e35
+2b33223d4f56667c743944462b3322383c232b3322272c1f342d1f24261c24261c
+24261c24261c24261c24261c333522383c232b3322272c1f2f3c223f4e32383c23
+2b3322272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f2b33222b3322
+2b33223335223944464b68652e3c442e3c44496065556c84819fb7627d9941678a
+75889b60759075889b4960653944464960654a6a8d7a91a875889b75889b6886a6
+8a99ab7d98b1627d9975889b45618575889b626e8c627d996886a6627d996886a6
+6075907a91a87a91a87d98b17a91a86886a66886a6627d996886a675889b75889b
+607590627d997d98b17d98b18b919f7a91a875889b7d98b175889b7d98b16f8fae
+7a91a863747154605f627d995773766886a675889b75889b6f8fae6886a6556c84
+60759060759075889b7d98b17d98b17a91a87a91a87d98b17d98b17d98b17a91a8
+7d98b16886a6627d997d98b175889b75889b3c5072556c8475889b4960652f3c22
+3336423335222a34383944462f3c222b3322373e432f3c223a4423383c232b3322
+342d1f2a3438342d1f2a3438556c84373e435773763f4e322e3c443d573b496065
+2a34382f3c22354c31373e432b3322272c1f24261c24261c272c1f24261c272c1f
+272c1f333522272c1f272c1f3335223f4e1e2f3c22272c1f272c1f2b3322272c1f
+272c1f272c1f2b3322272c1f272c1f272c1f272c1f333522272c1f272c1f24261c
+272c1f3335222b3322272c1f272c1f2b33222b3322272c1f2b3322272c1f272c1f
+2b3322383c23272c1f24261c24261c272c1f262e352a3438272c1f272c1f272c1f
+354c31394446465864576a623944462a343839444654605f2e3c442b33222b3322
+272c1f272c1f272c1f272c1f24261c3335222a3438394446383c233336423d4f56
+344d593d4f56556c8430444d2b332230444d3d4f563c586f6374713d573b344d59
+3043212f3c223043212f3c222b33222b33222b33222b33222b3322262e35342d1f
+272c1f272c1f272c1f24261c272c1f272c1f24261c333522342d1f333522342d1f
+272c1f24261c24261c272c1f272c1f24261c342d1f1c1e19342d1f2e3c44304321
+373e4324261c1c1e1924261c24261c1c1e1924261c342d1f24261c24261c1c1e19
+1c1e19342d1f1c1e191c1e1924261c24261c24261c1c1e1924261c24261c24261c
+24261c24261c342d1f342d1f272c1f383c23383c23272c1f24261c272c1f272c1f
+272c1f2b33222b33222b3322272c1f24261c342d1f2a3438333522272c1f272c1f
+2b3322272c1f272c1f2b3322272c1f3043212f3c22333522342d1f2b3322272c1f
+272c1f272c1f2b33222b33222b33222b3322272c1f272c1f272c1f272c1f262e35
+342d1f272c1f272c1f272c1f272c1f272c1f262e3524261c262e35272c1f272c1f
+272c1f272c1f342d1f262e35272c1f272c1f272c1f342d1f272c1f272c1f342d1f
+272c1f272c1f272c1f24261c342d1f24261c342d1f272c1f272c1f24261c272c1f
+2e3c442b33222e3c44344e6f4658644a6a8d6f8fae7197b47197b47d98b17d98b1
+7d98b17197b47d98b17d98b17197b4819fb7819fb77197b47d98b1819fb77d98b1
+627d99587ca0496065344d59354c313335222a3438342d1f2a34382b33222a3438
+342d1f262e3524261c272c1f272c1f2e3c44354c312e3c44272c1f2e3c443c586f
+354c312a3438333522342d1f262e353944463c5072344d5930444d3c586f587ca0
+627d996886a67197b47d98b18a99ab819fb77d98b17d98b17d98b17d98b17d98b1
+7d98b17d98b17d98b17d98b16b86734658643043212f3c2230444d3043212f3c22
+4658644658644b6865373e43272c1f272c1f3335222b3322272c1f272c1f24261c
+272c1f24261c24261c24261c272c1f333522272c1f272c1f2e3c444e44253a4423
+383c232f3c22272c1f24261c272c1f24261c272c1f272c1f272c1f342d1f333522
+272c1f262e352f3c224960653d5f7a2e3c443c586f5374996886a649606541678a
+75889b627d996886a63c586f30444d4b68654a6a8d6f8fae627d99556c84627d99
+7d98b17a91a86075906886a654605f7a91a8627d99626e8c75889b60759075889b
+556c8475889b627d997d98b17a91a8627d9975889b607590626e8c626e8c626e8c
+6075906f8fae8b919f6f8fae6f8fae627d996f8fae7a91a875889b75889b637471
+6075903c50724b6865607590456185627d996f8fae6f8fae75889b607590626e8c
+60759075889b7a91a87d98b17d98b16075907d98b18a99ab7d98b17a91a86f8fae
+7d98b175889b627d996886a675889b627d9954605f456185709081597c75304321
+2f3c22272c1f2f3c223043212f3c222f3c223335222e3c443335223335222b3322
+2b3322272c1f2b3322373e434960652a34384658642e3c442a34382a34382e3c44
+272c1f2e3c44394446394446342d1f2b332224261c272c1f24261c1e241b24261c
+272c1f272c1f272c1f2b3322272c1f383c232f3c22272c1f272c1f272c1f24261c
+272c1f272c1f3335222b3322272c1f272c1f2b3322272c1f342d1f24261c272c1f
+333522272c1f272c1f24261c272c1f342d1f272c1f272c1f272c1f2b33222b3322
+373e432b3322272c1f272c1f272c1f2b3322272c1f2b3322272c1f272c1f262e35
+2a34382b332230444d30444d333642333522373e43344d592b33222b3322394446
+24261c342d1f24261c24261c24261c1e241b24261c383c23272c1f342d1f2e3c44
+3336423d4f564b6865344d592b3322373e43344d59344d59344d59607590537499
+3d573b2e3c44373e43373e43272c1f2b3322272c1f272c1f342d1f24261c272c1f
+272c1f272c1f272c1f24261c24261c272c1f272c1f272c1f3335222a34382b3322
+24261c24261c272c1f272c1f272c1f272c1f33352224261c2b3322344d593d4f56
+39444624261c342d1f1c1e19342d1f24261c24261c24261c24261c342d1f24261c
+1c1e1924261c24261c1c1e1924261c1c1e1924261c1c1e19342d1f342d1f24261c
+24261c24261c272c1f272c1f272c1f2b3322383c23272c1f272c1f24261c272c1f
+2b33222b3322272c1f3335222b3322272c1f272c1f2b3322262e35272c1f272c1f
+2a3438272c1f272c1f272c1f272c1f2a3438333522342d1f2a3438333522272c1f
+2b332224261c272c1f333522272c1f272c1f333522272c1f272c1f342d1f262e35
+342d1f272c1f272c1f272c1f272c1f342d1f272c1f342d1f342d1f272c1f272c1f
+24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f
+342d1f24261c24261c24261c272c1f272c1f272c1f24261c24261c272c1f272c1f
+373e432e3c443d4f564a6a8d556c845374996886a67a91a86f8fae7d98b17197b4
+7d98b17197b47197b47d98b17197b47d98b1819fb77197b4819fb77197b47d98b1
+5773764a6a8d4b6865496065354c312e3c442f3c22272c1f2a3438272c1f262e35
+2b33222b3322272c1f262e3524261c2a34382e3c442f3c222b3322394446354c31
+30444d2a34383335223335222a34382e3c443d4f563c586f344d593d5f7a587ca0
+7a91a87a91a87197b47d98b17d98b17d98b17d98b17d98b17d98b17d98b17d98b1
+819fb77d98b17d98b17d98b1627d993c586f354c313d4f564960652e3c442f3c22
+576a623d4f563d4f562f3c22272c1f2b3322342d1f272c1f272c1f24261c24261c
+24261c24261c1e241b24261c342d1f2a3438272c1f272c1f333522333522342d1f
+272c1f2b3322333522272c1f272c1f272c1f272c1f24261c262e35262e35333522
+272c1f272c1f262e353d573b4b68653043213d4f565773765773763d4f5641678a
+6886a6627d99556c844960653d4f56556c84607590627d99556c843c586f6886a6
+6886a6607590607590556c844658648b919f6075904a6a8d6886a6626e8c607590
+456185627d9975889b627d99627d99626e8c7a91a854605f556c84626e8c465864
+627d996f8fae8b919f6886a675889b556c846886a675889b627d9975889b626e8c
+556c843d4f563c5072627d994b6865607590627d9975889b6886a6537499607590
+60759075889b75889b7d98b17a91a86075906f8fae7d98b18b919f627d99627d99
+7d98b1627d99627d99627d9975889b456185556c84496065627d99597c7530444d
+2a34382b33222e3c443043212e3c442b3322262e35272c1f272c1f2a34382f3c22
+2e3c443335223043213d4f563d4f562f3c223944463335222b3322342d1f2b3322
+2b33223944462f3c22394446272c1f2b33221e241b272c1f24261c272c1f272c1f
+333522272c1f272c1f2b3322342d1f272c1f272c1f24261c272c1f272c1f272c1f
+333522272c1f3335222b3322272c1f3335222b332224261c24261c24261c2b3322
+2b3322272c1f272c1f24261c24261c272c1f272c1f24261c1e241b2b3322272c1f
+272c1f272c1f24261c1e241b272c1f262e35272c1f2b3322272c1f262e352b3322
+373e43272c1f2a34382f3c222a3438262e3533352230444d2b3322262e35333522
+272c1f272c1f24261c24261c24261c1e241b24261c272c1f272c1f272c1f2b3322
+272c1f2e3c443c586f3d4f562b33222e3c443d573b3c586f3c586f4960654b6865
+4b6865344d593a44232b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322272c1f333522
+272c1f24261c24261c272c1f342d1f272c1f333522272c1f394446354c31373e43
+342d1f24261c24261c24261c24261c262e3524261c24261c24261c24261c24261c
+1c1e1924261c1c1e19342d1f1c1e1924261c24261c24261c342d1f24261c24261c
+24261c24261c272c1f342d1f272c1f2b33223335222b3322333522272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f2b3322342d1f3335223335222a3438304321
+2e3c442b3322272c1f272c1f2b33222b33222b33222b33222b3322383c23272c1f
+2b3322272c1f272c1f272c1f2b3322272c1f2b3322333522272c1f272c1f272c1f
+272c1f272c1f272c1f342d1f272c1f262e35272c1f272c1f24261c262e35342d1f
+262e35272c1f272c1f24261c342d1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c272c1f272c1f24261c272c1f272c1f
+30432130444d3c586f597c75587ca041678a6886a66f8fae7a91a87197b47197b4
+7197b47197b47197b47d98b17d98b17197b47197b47d98b17d98b17d98b17d98b1
+6886a6587ca0577376496065354c312f3c222e3c443335223335222b3322262e35
+333522262e35272c1f24261c272c1f2f3c223d4f563043212b33222e3c44344d59
+2e3c442f3c22373e432a34383335222b332230444d4658643c586f597c756f8fae
+7197b47d98b17197b47d98b17a91a87d98b17d98b17d98b17a91a87d98b1819fb7
+7d98b17d98b17d98b17d98b17a91a8627d99587ca0597c754b686530444d2b3322
+4658643d573b3f4e322e3c442b3322342d1f2b3322262e35272c1f24261c24261c
+272c1f24261c1e241b24261c272c1f342d1f272c1f24261c333522342d1f272c1f
+24261c272c1f272c1f342d1f24261c272c1f272c1f272c1f272c1f333522383c23
+2b33222b33221e241b2a34385773764b6865465864626e8c556c84344d59496065
+626e8c627d994658643c586f3d5f7a5773766886a6627d9954605f3c507275889b
+6886a6607590627d994561853c5072627d9954605f556c84556c8446586454605f
+3c5072626e8c626e8c54605f54605f46586475889b465864465864626e8c54605f
+60759075889b75889b626e8c75889b556c84627d996075906075906886a6627d99
+4b68653d4f56637471556c846075906075906075906886a6577376537499456185
+626e8c6886a675889b7a91a8627d996886a66f8fae7a91a87a91a875889b627d99
+75889b537499626e8c627d99607590496065607590465864627d99556c84354c31
+2e3c442f3c222e3c443d573b2f3c22272c1f272c1f272c1f2b33222a3438304321
+2e3c4439444647583230444d3d4f562a34383944462a3438272c1f272c1f272c1f
+2e3c443f4e322a34382b3322272c1f272c1f2b33222b33222e3c442b33222f3c22
+2b33223335222f3c22272c1f2b33222b3322272c1f24261c272c1f272c1f24261c
+2b3322272c1f2b3322272c1f272c1f383c232b3322272c1f24261c272c1f24261c
+272c1f342d1f24261c24261c24261c3335221e241b272c1f272c1f2b3322272c1f
+272c1f24261c24261c272c1f272c1f2b3322262e35272c1f272c1f272c1f2f3c22
+2b3322272c1f2f3c222a3438272c1f3335222a3438333642272c1f272c1f272c1f
+272c1f272c1f24261c24261c24261c24261c24261c24261c24261c272c1f262e35
+272c1f272c1f2e3c443d4f56272c1f2a343830444d3d573b3d4f5641678a3d4f56
+4960653d4f5630444d2b3322272c1f24261c272c1f333522272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f
+272c1f24261c272c1f272c1f272c1f272c1f2f3c222b33223f4e32373e43333642
+262e35262e3524261c24261c24261c24261c342d1f24261c24261c24261c24261c
+24261c1c1e191c1e1924261c24261c342d1f24261c443623333522342d1f24261c
+24261c24261c3335222b33222b3322272c1f24261c333522383c23272c1f2b3322
+342d1f272c1f24261c342d1f272c1f2e3c442b33222a34382e3c44304321344d59
+3043212f3c2230444d354c312a34382b33222b3322272c1f272c1f383c23333522
+342d1f272c1f2b3322342d1f272c1f2b3322272c1f2b3322272c1f342d1f262e35
+24261c272c1f272c1f272c1f272c1f342d1f24261c272c1f272c1f272c1f272c1f
+272c1f24261c272c1f272c1f272c1f272c1f342d1f272c1f272c1f2b3322272c1f
+272c1f24261c272c1f24261c272c1f272c1f272c1f24261c272c1f272c1f272c1f
+344d59344d593d5f7a5d83a4627d99537499627d997197b47a91a86f8fae7d98b1
+7197b47d98b17197b47a91a87d98b17d98b17d98b17197b47d98b17d98b17d98b1
+6886a6576a624b68654b68653d5f7a4b68653d573b373e432b3322333522272c1f
+2a3438342d1f272c1f262e35262e352e3c444960654658642b33222e3c443d4f56
+354c312e3c442b33222b33222e3c443944462e3c444960654a6a8d627d996f8fae
+7197b47d98b17197b47197b47d98b17197b47d98b17197b47d98b17d98b1819fb7
+7197b47d98b17d98b17197b47d98b16f8fae587ca0597c754960652e3c442b3322
+2a34382f3c222a3438272c1f272c1f272c1f333522272c1f272c1f24261c24261c
+24261c24261c1e241b272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f
+24261c24261c24261c272c1f342d1f24261c272c1f4e5043333522272c1f3a4423
+2b33222b3322272c1f2a3438556c844b68654658644960653c586f3c586f3d5f7a
+556c84556c843d4f56373e43344d593d4f56667c74626e8c46586445618575889b
+607590456185626e8c46586446586460759054605f626e8c3c507246586454605f
+3c507246586454605f3c507254605f4561858b919f4658643944462e3c44394446
+626e8c75889b626e8c607590626e8c4561856075906075906886a64a6a8d6b8673
+3c586f3c586f627d99607590556c843c5072556c84607590465864537499577376
+4a6a8d6075906886a67a91a8627d997a91a86886a66f8fae75889b6f8fae607590
+6886a66075903c5072556c84626e8c3c586f556c84344d59576a623d4f562e3c44
+2f3c222b3322272c1f3944462e3c44272c1f1e241b272c1f272c1f262e35394446
+3043213944462e3c443944463043212a3438373e432b3322272c1f1e241b2b3322
+262e353d4f56383c23262e3524261c272c1f2f3c222b33222a3438272c1f272c1f
+2b33222b332233352224261c272c1f272c1f272c1f24261c272c1f272c1f272c1f
+272c1f342d1f272c1f272c1f2b3322342d1f272c1f24261c24261c24261c24261c
+272c1f272c1f272c1f272c1f1e241b2b3322272c1f272c1f1e241b272c1f272c1f
+24261c24261c1e241b272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e35
+2f3c222a3438354c312a3438272c1f272c1f272c1f272c1f24261c24261c272c1f
+272c1f272c1f24261c24261c24261c24261c24261c272c1f24261c342d1f272c1f
+24261c272c1f272c1f262e35272c1f262e353336423336422e3c444658643f4e32
+3d4f563944462e3c442b33222b332224261c24261c272c1f272c1f24261c2b3322
+2b3322272c1f272c1f24261c24261c272c1f24261c272c1f272c1f272c1f272c1f
+272c1f342d1f272c1f24261c272c1f272c1f2f3c222b33222b3322272c1f262e35
+272c1f272c1f24261c24261c1c1e1924261c24261c24261c342d1f24261c24261c
+1c1e1924261c24261c24261c24261c24261c24261c443623383c23383c23342d1f
+342d1f383c232b3322272c1f272c1f272c1f272c1f2f3c223a44232b33222f3c22
+2b3322272c1f272c1f24261c272c1f2a3438272c1f2b33222b33222e3c442f3c22
+30444d344d593d573b4b68652f3c222f3c22262e352b33222f3c222e3c442b3322
+272c1f272c1f2b3322272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f
+272c1f342d1f24261c24261c262e35272c1f24261c262e35272c1f272c1f24261c
+272c1f24261c24261c272c1f262e35272c1f272c1f272c1f272c1f272c1f342d1f
+272c1f272c1f24261c272c1f24261c24261c272c1f272c1f24261c272c1f24261c
+3d4f56344d594561855d83a46886a66886a66886a66f8fae6f8fae7a91a86f8fae
+7197b47197b47a91a87d98b17197b47d98b17197b47d98b17d98b17197b4819fb7
+6886a6496065556c846b8673577376576a623d573b394446333522262e35272c1f
+272c1f2a343824261c272c1f24261c30444d4b68654658642e3c443d573b4b6865
+30444d2a3438342d1f272c1f2b33222a34382e3c443c586f556c846886a66f8fae
+7197b47a91a87197b46f8fae6f8fae7d98b17197b47a91a87d98b17197b47197b4
+7d98b17197b47197b47197b47197b46886a6587ca05773763d5f7a2f3c22262e35
+272c1f272c1f272c1f24261c272c1f2b3322333522272c1f262e3524261c24261c
+24261c24261c24261c262e35272c1f24261c272c1f24261c342d1f333642272c1f
+342d1f272c1f272c1f24261c262e35272c1f272c1f24261c24261c262e35383c23
+272c1f2f3c22262e3530444d556c8454605f3c50723d4f56344d593d4f56456185
+4658644658643d4f562e3c443944464658643d4f56465864373e43607590607590
+54605f626e8c626e8c46586454605f54605f465864373e433944463c5072394446
+4658643c50723944463c50724e5043465864627d9946586430444d2e3c44373e43
+3c5072626e8c4561856f8fae60759054605f456185556c846886a654605f627d99
+3d4f56465864667c746075903d4f56394446607590626e8c456185456185607590
+607590607590607590627d99556c84627d99627d997a91a87197b475889b607590
+6886a660759046586454605f496065556c844b68653d4f5639444639444630444d
+2f3c222e3c44272c1f2b33222a3438262e35272c1f272c1f2f3c222b3322344d59
+3f4e323f4e322b33222f3c223d4f562a34382b3322262e35272c1f272c1f2b3322
+272c1f373e43262e35272c1f272c1f272c1f2a3438272c1f272c1f1e241b24261c
+272c1f272c1f272c1f24261c272c1f272c1f24261c24261c272c1f24261c272c1f
+2b3322272c1f272c1f272c1f272c1f272c1f272c1f24261c24261c1e241b24261c
+1e241b272c1f24261c1e241b1e241b2b332224261c1e241b24261c1e241b1e241b
+24261c1e241b272c1f262e35272c1f272c1f1e241b272c1f272c1f24261c24261c
+262e352e3c443c586f333522262e35272c1f272c1f272c1f24261c24261c272c1f
+272c1f342d1f24261c24261c24261c24261c24261c272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f24261c272c1f272c1f2b3322342d1f3d4f56394446
+2e3c442f3c222a34382b33222b332224261c342d1f272c1f272c1f272c1f272c1f
+24261c272c1f272c1f24261c24261c24261c24261c272c1f2b3322342d1f272c1f
+24261c272c1f272c1f272c1f24261c262e352b3322272c1f262e35272c1f272c1f
+272c1f342d1f24261c24261c1c1e1924261c262e3524261c24261c24261c342d1f
+342d1f24261c24261c24261c24261c24261c272c1f272c1f272c1f342d1f272c1f
+272c1f383c23333522272c1f272c1f272c1f272c1f2b3322344d1e2f3c222f3c22
+272c1f2b3322272c1f3335222b332230444d2f3c2224261c2b33222b33222e3c44
+2f3c22262e352e3c442a34382f3c222b3322272c1f2b3322333522342d1f333522
+24261c24261c342d1f2b3322333522272c1f272c1f272c1f272c1f342d1f272c1f
+272c1f262e35272c1f24261c272c1f342d1f272c1f342d1f24261c342d1f272c1f
+24261c272c1f24261c272c1f272c1f24261c272c1f24261c272c1f272c1f272c1f
+272c1f272c1f272c1f24261c24261c272c1f24261c272c1f272c1f272c1f272c1f
+3d573b4a6a8d627d996f8fae6f8fae6f8fae6f8fae7197b46f8fae7a91a87d98b1
+6f8fae7d98b17197b47a91a87d98b17d98b17d98b17197b47d98b17d98b17d98b1
+7d98b1587ca06886a66f8fae597c75556c84475832394446333642333522272c1f
+272c1f262e35272c1f342d1f24261c262e35373e433f4e32333642344d59496065
+3043212a3438262e352e3c44304321344d592e3c443c50724a6a8d627d997a91a8
+7197b47d98b17197b47d98b17197b46f8fae7197b47a91a87a91a87a91a87197b4
+7d98b17197b47d98b17197b47d98b17197b46886a6354c312e3c44354c31354c31
+3944462b3322262e35342d1f24261c272c1f333522272c1f342d1f24261c262e35
+24261c24261c24261c272c1f2b3322262e35272c1f272c1f24261c2b3322272c1f
+2b3322272c1f272c1f272c1f272c1f3335222f3c22272c1f24261c272c1f2e3c44
+2b33222f3c222f3c223d573b496065373e4339444639444630444d3d4f56465864
+4561853d4f563944462a34383d4f56344d5939444654605f2e3c44456185626e8c
+3c586f556c844561853c50724658643c50723944463336423d4f5639444630444d
+4658643d4f56394446373e433944464658643c50724658642a343830444d30444d
+3c507254605f4a6a8d627d995f61564561853c5072626e8c607590456185607590
+3d4f56465864627d9954605f3c507230444d6075904b68653c586f4960656886a6
+556c8445618560759045618554605f6886a675889b75889b6f8fae6886a6626e8c
+556c844561854561856075904658643d4f56344d592e3c443335223944462b3322
+2a34382f3c22262e35272c1f2b3322272c1f262e3524261c333642333522394446
+3944464e50432f3c222e3c443d573b2e3c44272c1f1e241b2b33221e241b262e35
+272c1f272c1f2f3c222b33222b33222b3322262e352b33222e3c441e241b272c1f
+2b33222b3322333522272c1f272c1f33352224261c24261c272c1f272c1f272c1f
+342d1f272c1f272c1f272c1f2b3322272c1f272c1f24261c24261c24261c272c1f
+1e241b24261c272c1f24261c24261c272c1f272c1f1e241b24261c1e241b24261c
+24261c272c1f272c1f2f3c22272c1f272c1f272c1f24261c262e35272c1f2b3322
+2b33222e3c44354c312e3c442b332230444d354c31333642272c1f24261c333522
+262e35272c1f24261c272c1f24261c272c1f272c1f24261c272c1f2b3322272c1f
+24261c272c1f24261c272c1f272c1f262e35272c1f272c1f272c1f2a34382f3c22
+2a3438272c1f2e3c44262e352b3322272c1f333642272c1f272c1f272c1f272c1f
+342d1f272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f2b3322272c1f
+24261c272c1f272c1f2b332224261c272c1f342d1f2b3322272c1f272c1f272c1f
+272c1f272c1f24261c24261c24261c24261c24261c272c1f272c1f342d1f262e35
+44362324261c24261c342d1f24261c24261c342d1f24261c24261c24261c24261c
+24261c342d1f272c1f272c1f272c1f24261c272c1f272c1f2f3c223335222b3322
+2b33222f3c222b3322272c1f2a34382b33222e3c442b33222b3322272c1f2f3c22
+2f3c22262e352b3322262e353043212e3c4424261c272c1f2b3322272c1f272c1f
+272c1f272c1f2b33222b3322272c1f272c1f272c1f272c1f24261c272c1f272c1f
+272c1f272c1f272c1f24261c272c1f24261c272c1f262e3524261c24261c24261c
+272c1f272c1f24261c342d1f272c1f24261c272c1f24261c24261c24261c24261c
+24261c272c1f342d1f24261c24261c24261c272c1f24261c272c1f272c1f272c1f
+465864496065587ca06886a66886a66886a66f8fae6f8fae7a91a87a91a87a91a8
+7197b46f8fae7d98b17197b46f8fae6f8fae7a91a87d98b17a91a87197b47d98b1
+7197b47a91a87197b47d98b1597c7554605f394446383c23333642262e35342d1f
+24261c342d1f272c1f262e35272c1f272c1f2b3322354c312f3c222e3c443d4f56
+354c31383c23272c1f2e3c442e3c443d4f5630444d344d594561856886a66f8fae
+7197b46f8fae6f8fae6f8fae6f8fae7197b47197b46f8fae6f8fae7197b47a91a8
+7a91a87197b47197b47a91a87197b47197b45d83a4373e432b332230444d2e3c44
+2e3c44272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e3524261c
+262e3524261c24261c272c1f272c1f2b33222b332224261c272c1f272c1f272c1f
+24261c342d1f272c1f272c1f272c1f3043213d4f562a3438272c1f272c1f2f3c22
+2b33222f3c222a3438344d59354c312a3438262e35354c312a3438344e6f576a62
+3c50722e3c44394446262e354658643944463c50723d4f56333642344e6f556c84
+344d59556c843c5072465864465864394446333642333642262e353d4f56333642
+3d4f563944462a3438262e354e50433c507230444d465864262e353944463c586f
+3944463c5072456185556c84465864344d59394446456185626e8c456185556c84
+30444d465864626e8c3d4f5630444d3c5072626e8c3c50723d5f7a3c586f6886a6
+46586454605f456185556c84607590627d9975889b6886a6627d996886a6456185
+3c50724658644a6a8d627d99354c31394446373e432b33222a34382f3c22262e35
+2f3c22262e351e241b262e35272c1f272c1f2b3322272c1f2a34382a343830444d
+3f4e32373e432a34382f3c222e3c442b3322272c1f272c1f24261c1e241b272c1f
+2b3322262e353a4423272c1f262e352b3322272c1f2b33221e241b272c1f24261c
+272c1f2b3322272c1f1e241b272c1f2b332224261c272c1f272c1f272c1f1e241b
+272c1f272c1f24261c342d1f342d1f24261c24261c24261c24261c1e241b1e241b
+272c1f1e241b24261c24261c1e241b272c1f1e241b1e241b1e241b272c1f272c1f
+1e241b24261c24261c2e3c44272c1f24261c24261c1e241b272c1f1e241b2b3322
+262e35272c1f2e3c44262e35272c1f30444d2e3c442b3322342d1f262e35272c1f
+2b3322272c1f24261c1e241b24261c24261c24261c2b3322272c1f24261c272c1f
+272c1f272c1f33352224261c272c1f1e241b24261c272c1f272c1f272c1f262e35
+272c1f2b332230432130444d373e43272c1f2f3c22272c1f24261c272c1f272c1f
+272c1f342d1f272c1f24261c24261c24261c24261c272c1f2b3322272c1f272c1f
+272c1f272c1f272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f262e35
+342d1f24261c272c1f24261c24261c24261c24261c24261c24261c342d1f333642
+33364224261c272c1f342d1f24261c272c1f272c1f272c1f272c1f24261c24261c
+24261c272c1f272c1f272c1f2b33221e241b272c1f272c1f272c1f272c1f342d1f
+333522272c1f272c1f272c1f3335222b33222b33222e3c442b3322262e352b3322
+2f3c22272c1f272c1f262e35272c1f2b3322262e352b3322272c1f2b33222f3c22
+2b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e3524261c272c1f
+24261c262e35272c1f272c1f24261c272c1f24261c24261c262e35272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c24261c24261c272c1f24261c
+272c1f24261c272c1f342d1f272c1f342d1f24261c272c1f24261c272c1f272c1f
+4658644b68656886a66f8fae6f8fae6f8fae6f8fae6f8fae7197b47a91a86f8fae
+7d98b16f8fae6f8fae7197b46f8fae6f8fae6f8fae7a91a86f8fae7197b46f8fae
+7d98b17a91a87197b45d83a43c586f354c313944462f3c222b33222b3322262e35
+272c1f262e35342d1f333642262e35342d1f2e3c443d4f5630444d3d4f56465864
+2e3c443335223335222a34382f3c223c5072344d593c586f3c586f627d9975889b
+7197b47197b47197b46f8fae6f8fae6f8fae6f8fae6f8fae6f8fae6f8fae6f8fae
+6f8fae75889b7a91a86f8fae6f8fae6f8fae597c75344d592e3c444b68653d4f56
+304321272c1f272c1f24261c272c1f24261c342d1f272c1f272c1f272c1f24261c
+24261c1e241b1e241b272c1f24261c272c1f272c1f24261c24261c272c1f272c1f
+272c1f272c1f2b3322272c1f272c1f2f3c223f4e322b332224261c272c1f262e35
+2e3c44354c3130444d4b68654960652a3438262e3530444d2a34383d573b496065
+30444d373e433944462b332230444d2e3c44465864373e432a3438344d59607590
+2e3c444a6a8d30444d54605f3d4f56373e432a343824261c262e353d4f562a3438
+3d4f56373e43262e352a3438344d5930444d30444d496065262e35394446344d59
+39444630444d45618546586449606530444d3336424658646886a6456185577376
+30444d344d5954605f2e3c44344d593d4f5654605f3d4f5649606530444d496065
+344e6f3c5072394446627d99627d996075906886a6627d99627d99607590456185
+4b68653c507254605f626e8c344d592e3c44354c312a34382a34382e3c44272c1f
+2b3322262e35272c1f272c1f1e241b262e351e241b272c1f2b33222e3c44373e43
+3d4f563043212b3322272c1f272c1f272c1f272c1f1e241b272c1f1e241b1e241b
+272c1f272c1f3a4423272c1f272c1f262e35272c1f272c1f1e241b272c1f1e241b
+272c1f2b3322272c1f24261c24261c272c1f1e241b1e241b272c1f272c1f272c1f
+272c1f272c1f24261c272c1f272c1f272c1f24261c24261c342d1f1e241b1e241b
+1e241b2b3322272c1f24261c1e241b24261c24261c1e241b1e241b272c1f24261c
+1e241b1e241b272c1f2b3322272c1f24261c272c1f1e241b272c1f1e241b2b3322
+262e351e241b2f3c22262e35272c1f30444d354c312a343824261c262e35272c1f
+272c1f24261c24261c1e241b24261c272c1f272c1f33352224261c272c1f24261c
+24261c1e241b342d1f24261c24261c272c1f24261c24261c262e35342d1f24261c
+1e241b262e352f3c223043212e3c44272c1f2b3322272c1f24261c272c1f24261c
+272c1f2b3322272c1f24261c272c1f24261c272c1f24261c272c1f24261c272c1f
+24261c24261c272c1f24261c2b3322272c1f272c1f272c1f272c1f272c1f272c1f
+2a343824261c262e3524261c24261c24261c24261c24261c272c1f262e35272c1f
+24261c272c1f24261c272c1f272c1f342d1f272c1f24261c272c1f24261c24261c
+24261c24261c272c1f24261c272c1f24261c24261c24261c272c1f2b3322272c1f
+272c1f2b3322272c1f2b33222b33222b3322272c1f2b33222f3c22272c1f272c1f
+2a34382b33222b3322272c1f272c1f272c1f2b3322262e35272c1f2b33222b3322
+2b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c24261c272c1f
+24261c262e3524261c272c1f24261c24261c262e3524261c24261c24261c272c1f
+24261c272c1f1e241b272c1f24261c272c1f24261c24261c24261c24261c24261c
+342d1f24261c24261c24261c272c1f24261c272c1f272c1f272c1f342d1f272c1f
+4b6865556c846886a67197b46f8fae6886a67a91a86f8fae6f8fae6f8fae6f8fae
+6886a66f8fae6f8fae6f8fae6f8fae6f8fae6f8fae6f8fae7197b46f8fae6f8fae
+6f8fae6f8fae6f8fae5773765773764658643a4423373e43262e35342d1f262e35
+24261c272c1f262e35272c1f2a3438262e3530444d4960652e3c443c5072577376
+354c312e3c443335223944463336423c50724b68654a6a8d556c84587ca06f8fae
+6f8fae7197b46f8fae6f8fae6f8fae6f8fae6f8fae6f8fae627d996f8fae7197b4
+6f8fae6f8fae6f8fae6f8fae7197b46f8fae5d83a4354c313d5f7a6886a6496065
+2e3c44262e3524261c342d1f24261c272c1f2b3322272c1f272c1f272c1f24261c
+24261c1e241b1c1e191e241b272c1f342d1f24261c24261c272c1f272c1f272c1f
+24261c272c1f272c1f2f3c222b3322262e353043212b3322262e35272c1f333522
+30444d4960653c586f577376344d592f3c222a343830444d2e3c44344d592e3c44
+2a34383335222e3c442a343830444d3944462a34383944462a3438465864556c84
+3944463c5072344e6f4658642e3c442a3438262e351e241b2a34383c586f30444d
+30444d3d4f561e241b2e3c444960653c50723336423d4f561e241b333642344d59
+262e35373e434658642e3c443d4f562e3c443944464960656886a6465864556c84
+344d5930444d344d592a34383d4f563d4f56344e6f30444d3c50724658643c5072
+3944463336423944464a6a8d6886a653749975889b6075904a6a8d627d99556c84
+556c843d4f563c586f5374993d4f562e3c44354c312f3c22272c1f262e35272c1f
+1e241b272c1f2b3322272c1f24261c1e241b272c1f2b3322272c1f2b33222e3c44
+344d592f3c222a3438272c1f272c1f272c1f1e241b272c1f1e241b1e241b272c1f
+272c1f24261c272c1f1e241b2b33222b3322272c1f272c1f24261c24261c24261c
+272c1f24261c24261c24261c24261c272c1f24261c24261c24261c272c1f272c1f
+272c1f272c1f24261c342d1f272c1f24261c342d1f272c1f24261c24261c1e241b
+272c1f24261c1e241b24261c24261c24261c272c1f1c1e191e241b24261c1e241b
+1e241b1e241b1e241b272c1f24261c1e241b1e241b272c1f1e241b272c1f1e241b
+272c1f262e352a3438272c1f24261c2a34382e3c44272c1f272c1f24261c24261c
+1e241b272c1f24261c24261c272c1f24261c342d1f262e35272c1f24261c1e241b
+272c1f272c1f272c1f24261c24261c1e241b262e35272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f272c1f262e35272c1f24261c272c1f24261c272c1f
+272c1f33352224261c272c1f1e241b24261c1e241b272c1f24261c272c1f24261c
+272c1f272c1f272c1f2b3322272c1f272c1f24261c272c1f24261c272c1f342d1f
+342d1f24261c24261c342d1f24261c24261c24261c24261c24261c272c1f24261c
+272c1f272c1f342d1f272c1f272c1f272c1f272c1f342d1f272c1f24261c24261c
+24261c24261c24261c2b3322272c1f272c1f24261c272c1f272c1f272c1f272c1f
+272c1f272c1f2b33222b3322262e352b3322272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f2b33222b33221e241b1e241b272c1f2b33222b3322272c1f2b3322
+272c1f272c1f272c1f272c1f24261c33352224261c24261c272c1f272c1f24261c
+272c1f24261c24261c24261c272c1f272c1f272c1f262e3524261c24261c272c1f
+272c1f24261c272c1f272c1f24261c342d1f24261c24261c342d1f272c1f272c1f
+1e241b272c1f272c1f342d1f272c1f272c1f24261c272c1f272c1f272c1f2b3322
+5374995374995d83a47197b47a91a86f8fae6f8fae6f8fae6f8fae6f8fae6886a6
+6f8fae6f8fae6f8fae6f8fae75889b6f8fae7a91a86f8fae6f8fae6f8fae6f8fae
+7197b47a91a87a91a86f8fae49606530444d2e3c443a44232a34382b3322262e35
+342d1f262e35272c1f2e3c443043212b332230444d41678a5773763d5f7a537499
+4b68653043212a3438394446383c23465864537499587ca05374995d83a46f8fae
+6886a66f8fae6f8fae6f8fae6f8fae6f8fae6f8fae6f8fae587ca06f8fae6f8fae
+6f8fae7197b46f8fae6f8fae7a91a86886a65773763c5072577376587ca03d4f56
+2b33222b332224261c272c1f24261c24261c342d1f24261c24261c342d1f262e35
+24261c24261c1e241b1e241b272c1f342d1f272c1f24261c333522272c1f272c1f
+272c1f272c1f272c1f2b33222b3322272c1f2f3c22272c1f2b3322272c1f2b3322
+2f3c2230444d4960654960652e3c442f3c221e241b2f3c222e3c44344d592b3322
+24261c3336422b33222e3c4430444d3944462a34382a34382e3c44556c84465864
+3944464960653d4f563944462a3438262e35262e351e241b2e3c442e3c442e3c44
+262e352e3c44272c1f2a3438344d59373e4330444d2e3c44272c1f272c1f30444d
+272c1f2a34383944462e3c442e3c442e3c4430444d3c5072626e8c2e3c44496065
+2a34383d4f56373e4330444d30444d3d4f562e3c4446586430444d4658643c5072
+373e43373e433c50724561856886a65374996886a6627d99456185627d99556c84
+556c842e3c44465864556c843c586f2e3c442e3c443d4f562b3322262e35272c1f
+272c1f272c1f1e241b1e241b272c1f1e241b1e241b272c1f272c1f2b3322394446
+465864354c312b3322272c1f272c1f2b3322272c1f1e241b1e241b272c1f1e241b
+272c1f24261c272c1f272c1f1e241b2b3322272c1f272c1f272c1f2b33221e241b
+24261c272c1f272c1f24261c272c1f272c1f24261c1e241b24261c272c1f272c1f
+272c1f272c1f272c1f272c1f24261c272c1f342d1f24261c272c1f272c1f24261c
+272c1f1e241b1e241b1e241b24261c24261c24261c1e241b1e241b24261c24261c
+1e241b272c1f24261c1e241b24261c24261c24261c272c1f272c1f272c1f24261c
+262e35272c1f262e35262e35272c1f2a343830444d272c1f24261c272c1f24261c
+24261c272c1f272c1f24261c24261c24261c272c1f24261c272c1f24261c24261c
+24261c24261c2a3438272c1f272c1f24261c1e241b1e241b24261c1e241b262e35
+272c1f1e241b24261c272c1f272c1f24261c272c1f24261c272c1f272c1f24261c
+272c1f272c1f272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f24261c
+272c1f272c1f272c1f333522272c1f272c1f24261c342d1f272c1f272c1f272c1f
+262e35272c1f272c1f262e35272c1f24261c24261c24261c342d1f272c1f24261c
+342d1f2b3322272c1f272c1f2b3322272c1f272c1f333522272c1f24261c24261c
+24261c272c1f24261c2b3322272c1f272c1f24261c272c1f272c1f2b332224261c
+272c1f2b33222b33222b33222f3c222b3322272c1f262e35333522262e35272c1f
+2b3322272c1f2b3322272c1f2b3322272c1f1e241b262e352b3322342d1f2b3322
+272c1f272c1f272c1f272c1f272c1f262e35342d1f24261c272c1f272c1f342d1f
+262e3524261c24261c24261c24261c24261c342d1f24261c272c1f24261c272c1f
+342d1f272c1f272c1f24261c272c1f24261c342d1f24261c24261c24261c24261c
+24261c24261c272c1f272c1f272c1f272c1f24261c342d1f272c1f272c1f272c1f
+5374996075906886a66886a66886a66886a66f8fae6886a66886a66f8fae6f8fae
+6886a66f8fae6886a66f8fae6f8fae6886a66f8fae6f8fae6f8fae6886a66f8fae
+6f8fae6886a66f8fae6b86733d5f7a30444d354c31354c312a3438342d1f24261c
+262e35272c1f272c1f394446344d5930444d5773766f8fae5d83a4627d99556c84
+6075903f4e322e3c44344d59373e433d4f56587ca06f8fae5d83a46f8fae6f8fae
+6f8fae6f8fae6f8fae6f8fae6886a66886a66f8fae6886a6587ca06f8fae6f8fae
+6f8fae6f8fae6f8fae6f8fae6f8fae6886a641678a4a6a8d5d83a449606530444d
+272c1f272c1f272c1f272c1f24261c272c1f262e35272c1f2a343833352224261c
+272c1f1e241b1e241b1e241b272c1f272c1f24261c272c1f24261c272c1f272c1f
+272c1f272c1f272c1f2b3322272c1f2b33223335222a34382b3322272c1f2b3322
+2a34383c586f4b6865354c31262e35262e35272c1f272c1f373e43262e3524261c
+272c1f262e35272c1f2b332230432130444d262e35272c1f3336423d4f56373e43
+3d4f56556c8430444d2a34382b33221e241b272c1f1e241b1e241b272c1f262e35
+2b33222e3c4424261c2b332230444d2e3c443d4f562a3438272c1f272c1f2a3438
+272c1f262e352a34382a34382e3c44272c1f2a34383d4f563d4f5630444d394446
+262e353336422e3c442e3c44344d592e3c442e3c44373e433336423d4f5630444d
+344d592a343846586446586460759041678a6075906886a64561854b6865456185
+45618530444d4658643c5072344d5930444d354c31354c31272c1f272c1f272c1f
+2b33221e241b272c1f272c1f1e241b24261c1e241b2b33222b33222b3322262e35
+465864373e432b3322272c1f272c1f272c1f24261c24261c1e241b1e241b272c1f
+1e241b24261c1e241b1e241b272c1f2b3322272c1f272c1f1e241b272c1f272c1f
+24261c272c1f24261c24261c272c1f1e241b272c1f24261c272c1f24261c272c1f
+272c1f272c1f272c1f24261c24261c24261c24261c272c1f272c1f24261c1e241b
+1e241b1e241b1e241b1e241b24261c1c1e1924261c1c1e1924261c24261c1c1e19
+1e241b1e241b24261c24261c24261c24261c1e241b1e241b272c1f1e241b2b3322
+262e35272c1f262e35272c1f1e241b272c1f272c1f1e241b1c1e1924261c272c1f
+24261c24261c24261c1e241b24261c1e241b24261c24261c24261c272c1f262e35
+272c1f272c1f272c1f24261c272c1f24261c24261c24261c272c1f272c1f262e35
+272c1f262e3524261c24261c272c1f24261c24261c24261c24261c24261c24261c
+272c1f342d1f272c1f272c1f24261c272c1f1e241b272c1f272c1f24261c24261c
+1e241b272c1f262e352b3322272c1f24261c2b3322272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f262e3524261c24261c272c1f272c1f272c1f24261c272c1f
+2b3322272c1f272c1f272c1f272c1f272c1f33352233352224261c24261c24261c
+272c1f24261c272c1f272c1f333522272c1f272c1f272c1f24261c272c1f2b3322
+272c1f272c1f272c1f262e352b33222a3438272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f2b3322262e352b3322272c1f272c1f272c1f272c1f2b3322262e35
+24261c24261c272c1f272c1f24261c272c1f272c1f24261c262e3524261c272c1f
+24261c24261c272c1f272c1f272c1f272c1f24261c24261c24261c24261c262e35
+342d1f272c1f24261c24261c272c1f24261c24261c24261c342d1f24261c272c1f
+24261c24261c24261c24261c342d1f24261c272c1f272c1f272c1f272c1f272c1f
+6886a65d83a46886a66f8fae5d83a46886a66886a66886a66886a66886a66886a6
+6886a66f8fae6886a66f8fae6f8fae6886a66886a66f8fae6886a66f8fae6886a6
+6f8fae6886a66f8fae5d83a43d5f7a344d593d4f563d573b2a34382a3438272c1f
+272c1f262e35272c1f2e3c442f3c222e3c444a6a8d6886a66f8fae5d83a4556c84
+54605f4e4425394446394446373e433d4f566886a66f8fae6f8fae6f8fae5d83a4
+6f8fae6886a66f8fae6886a66f8fae6886a66f8fae6f8fae587ca06886a66f8fae
+6f8fae6f8fae6886a66f8fae6f8fae5d83a46886a675889b41678a30444d30444d
+2b3322272c1f333522272c1f272c1f272c1f272c1f272c1f333522262e3524261c
+24261c24261c24261c1e241b24261c24261c24261c272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f2b3322272c1f262e352f3c222b33222f3c22262e352b3322
+2a34383d4f56344d592e3c442b3322272c1f262e35272c1f2b3322272c1f24261c
+262e35272c1f262e35272c1f2e3c44373e43272c1f272c1f2a3438373e432a3438
+3d4f563336422a3438262e352b3322262e351e241b1e241b1e241b262e352b3322
+2a3438272c1f1e241b2e3c4430444d2e3c44344d59262e351e241b272c1f394446
+1e241b2e3c442a3438262e352b33221e241b262e35373e43344d593d4f56333642
+272c1f272c1f262e35262e35344d592a343830444d262e352a3438394446333642
+3d4f56373e433944463d4f56556c843d5f7a626e8c6f8fae556c844a6a8d3c5072
+46586430444d3c586f4b68653c5072354c31344d59304321262e35272c1f1e241b
+1e241b272c1f1e241b24261c1e241b1e241b272c1f1e241b262e352f3c22272c1f
+2e3c44373e43272c1f272c1f272c1f272c1f272c1f1e241b1e241b1e241b272c1f
+1e241b24261c24261c24261c1e241b272c1f2b3322272c1f1e241b272c1f1e241b
+24261c24261c1e241b1e241b272c1f24261c272c1f24261c272c1f24261c272c1f
+272c1f1e241b24261c24261c24261c24261c1e241b272c1f1e241b1e241b1e241b
+1e241b1c1e191e241b24261c24261c1c1e191c1e1924261c24261c24261c1c1e19
+1e241b1e241b24261c1e241b24261c24261c1e241b272c1f1e241b272c1f1e241b
+272c1f272c1f272c1f1e241b1e241b24261c272c1f272c1f24261c24261c24261c
+1e241b24261c24261c24261c1e241b24261c24261c1e241b24261c24261c24261c
+272c1f24261c272c1f24261c1e241b272c1f24261c1e241b24261c1e241b262e35
+1e241b262e35262e3524261c24261c272c1f24261c24261c24261c24261c24261c
+24261c272c1f24261c342d1f1e241b272c1f272c1f272c1f342d1f24261c272c1f
+24261c272c1f272c1f272c1f24261c24261c2b3322272c1f272c1f24261c272c1f
+272c1f272c1f272c1f272c1f1e241b1e241b24261c24261c272c1f24261c272c1f
+272c1f33352224261c2b3322272c1f272c1f342d1f342d1f24261c24261c24261c
+342d1f24261c24261c272c1f33352224261c272c1f272c1f272c1f2b3322272c1f
+2b3322272c1f272c1f1e241b2b33222b3322272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f2b33221e241b2f3c221e241b1e241b262e35272c1f2b3322272c1f
+272c1f272c1f272c1f24261c24261c272c1f24261c272c1f272c1f24261c272c1f
+24261c342d1f1e241b272c1f24261c24261c24261c272c1f342d1f24261c262e35
+272c1f272c1f24261c24261c24261c24261c24261c24261c262e35342d1f24261c
+24261c272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f272c1f272c1f
+5d83a45d83a46f8fae5d83a46886a66f8fae6886a65d83a46886a66886a65d83a4
+6886a65d83a46886a65d83a46886a66886a66886a66886a66886a66886a66886a6
+6f8fae6886a66886a66886a64b68653d5f7a344d59344d592a3438262e35262e35
+272c1f272c1f262e35272c1f2a343830444d3d5f7a587ca06f8fae5d83a44a6a8d
+496065394446373e433c586f30444d344e6f6886a66f8fae5d83a46f8fae6f8fae
+6886a66f8fae5d83a46f8fae6886a66f8fae6f8fae6886a6587ca06886a66886a6
+6f8fae6886a66886a66f8fae6886a66886a66f8fae6886a64960653c586f354c31
+2b33222e3c44394446333642272c1f272c1f272c1f272c1f262e35272c1f262e35
+24261c24261c1e241b1e241b24261c24261c1e241b1e241b272c1f272c1f2b3322
+2b3322272c1f2b3322272c1f24261c1e241b272c1f2a3438354c31272c1f2a3438
+2f3c223d4f562e3c442b3322262e35272c1f272c1f2b33222a3438272c1f1e241b
+24261c24261c24261c262e35262e352a34381e241b262e35344d592a3438262e35
+3d4f562a34382b332230444d2b33221e241b1e241b262e351e241b262e35262e35
+2b3322262e351e241b2a34383d573b2a3438394446272c1f262e351e241b30444d
+1e241b272c1f2e3c441e241b1e241b1e241b2e3c442a3438373e4330444d262e35
+272c1f272c1f2a3438272c1f2a3438262e352b3322262e352a3438373e43262e35
+2a34382e3c442e3c44344e6f30444d4a6a8d556c846886a66075903d5f7a496065
+344d593d4f562e3c4449606530444d2a34382a34382a3438272c1f262e35272c1f
+1e241b2b33222b33221e241b1e241b1e241b1e241b272c1f1e241b2e3c44272c1f
+333522262e35272c1f272c1f24261c24261c24261c24261c1e241b1e241b1e241b
+24261c1e241b1e241b272c1f1e241b1e241b2b33222b3322272c1f24261c24261c
+24261c24261c272c1f24261c24261c272c1f1e241b24261c1e241b24261c272c1f
+24261c24261c24261c1e241b1e241b24261c1e241b24261c24261c24261c1e241b
+1e241b1e241b24261c24261c1c1e191c1e191e241b1c1e1924261c24261c1c1e19
+1e241b24261c24261c24261c1e241b1e241b272c1f272c1f1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b272c1f24261c24261c24261c24261c24261c1c1e19
+1c1e1924261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c272c1f272c1f1e241b272c1f24261c262e3524261c272c1f1e241b24261c
+24261c272c1f272c1f24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c272c1f24261c1e241b272c1f1e241b272c1f24261c24261c
+272c1f272c1f272c1f2a3438272c1f24261c272c1f272c1f1e241b272c1f272c1f
+272c1f2b3322272c1f272c1f24261c24261c24261c342d1f272c1f24261c24261c
+272c1f272c1f272c1f272c1f272c1f3335222b3322272c1f24261c272c1f272c1f
+272c1f272c1f272c1f272c1f24261c272c1f272c1f1e241b272c1f272c1f2b3322
+272c1f272c1f2b3322262e35262e35272c1f272c1f272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f262e35272c1f272c1f1e241b272c1f272c1f272c1f
+272c1f24261c24261c272c1f272c1f272c1f24261c24261c262e3524261c24261c
+272c1f262e3524261c24261c24261c272c1f24261c24261c24261c272c1f272c1f
+24261c24261c24261c272c1f342d1f272c1f24261c24261c24261c24261c24261c
+24261c24261c24261c24261c342d1f272c1f272c1f342d1f272c1f272c1f342d1f
+5d83a45d83a45d83a45d83a45d83a45d83a46886a65d83a45d83a46886a66f8fae
+6886a65d83a45d83a47197b45d83a46f8fae5d83a46886a66886a66886a66886a6
+6886a66f8fae6886a66886a65d83a4496065304321333642272c1f272c1f24261c
+262e352b33222a3438262e352e3c443d4f564b68656886a66f8fae6886a6537499
+5773763d4f563944463d5f7a496065344d594a6a8d6f8fae5d83a46f8fae5d83a4
+6f8fae6f8fae6886a66f8fae6886a65d83a46886a66886a6587ca0587ca06886a6
+6f8fae6886a66886a66f8fae6f8fae6886a66f8fae6886a63d5f7a49606530444d
+2e3c442f3c222e3c442b3322272c1f262e35272c1f272c1f272c1f272c1f24261c
+24261c24261c1c1e1924261c262e3524261c272c1f24261c272c1f2b33222b3322
+272c1f272c1f272c1f262e352b3322272c1f262e352f3c222f3c22262e35272c1f
+2e3c442e3c442b3322272c1f272c1f1e241b262e35272c1f2a34382b3322272c1f
+272c1f272c1f1e241b272c1f24261c272c1f1e241b272c1f344d59262e35333642
+2a34383336421e241b2e3c44272c1f1e241b1e241b272c1f1e241b262e35272c1f
+1e241b272c1f1e241b262e3530444d2e3c443336421e241b272c1f1e241b2a3438
+2b33221e241b262e35272c1f262e35262e352a3438262e352e3c44272c1f272c1f
+272c1f2a3438262e351e241b2a3438262e35262e35262e352a3438262e352a3438
+2e3c44272c1f2a3438373e4330444d5374993c586f556c84556c84456185465864
+2e3c442e3c442a34383944462e3c44262e35262e352b3322272c1f2b33221e241b
+272c1f262e35272c1f1e241b24261c1e241b1e241b1e241b1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f24261c24261c1e241b1e241b1e241b1e241b
+1e241b1e241b272c1f1e241b272c1f272c1f2f3c221e241b1e241b24261c1e241b
+24261c1e241b24261c1e241b24261c24261c24261c24261c1e241b1c1e19272c1f
+24261c24261c1c1e1924261c1e241b1e241b24261c24261c1e241b1e241b1c1e19
+1e241b1c1e191e241b1e241b24261c1c1e1924261c1c1e191e241b24261c1c1e19
+24261c1e241b24261c1c1e1924261c24261c24261c1e241b1e241b1e241b272c1f
+272c1f1e241b1e241b1e241b24261c1e241b24261c272c1f24261c24261c24261c
+24261c24261c272c1f24261c1c1e191c1e1924261c24261c1c1e1924261c24261c
+24261c24261c272c1f1e241b1e241b24261c24261c272c1f24261c24261c272c1f
+272c1f24261c272c1f24261c24261c24261c272c1f24261c272c1f24261c24261c
+272c1f272c1f272c1f24261c272c1f24261c272c1f24261c272c1f24261c272c1f
+24261c272c1f262e352b3322262e351e241b2b3322272c1f272c1f1e241b272c1f
+24261c262e35272c1f272c1f24261c24261c262e35262e3524261c24261c24261c
+272c1f2b3322272c1f272c1f272c1f2b3322342d1f272c1f272c1f24261c272c1f
+272c1f272c1f24261c24261c272c1f272c1f272c1f272c1f272c1f2b33222b3322
+272c1f272c1f2b33222b3322272c1f1e241b272c1f272c1f262e35272c1f262e35
+24261c272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f262e351e241b
+272c1f272c1f272c1f24261c24261c272c1f272c1f24261c272c1f24261c272c1f
+272c1f24261c24261c262e3524261c24261c24261c342d1f1c1e1924261c24261c
+272c1f272c1f24261c272c1f272c1f272c1f24261c24261c272c1f24261c24261c
+24261c342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+5d83a45d83a45d83a45d83a45d83a45d83a46886a65d83a46886a65d83a45d83a4
+5d83a46f8fae5d83a45d83a45d83a46886a65d83a45d83a46f8fae6886a66f8fae
+6f8fae5d83a46f8fae6886a6556c844960652e3c442a34382b33222a3438262e35
+272c1f2a34382b332230444d2f3c2230444d3d5f7a587ca05d83a46886a6537499
+627d99344d5930444d4b6865587ca0344d593d5f7a5d83a46f8fae5d83a45d83a4
+5d83a46f8fae5d83a46886a66886a66886a6587ca06886a65d83a4587ca06886a6
+5d83a46f8fae587ca05d83a45d83a46f8fae6886a66886a6587ca03c586f304321
+30444d344d593d4f56373e43272c1f30444d272c1f262e35272c1f24261c24261c
+272c1f24261c1c1e191c1e1924261c24261c272c1f272c1f272c1f2b3322262e35
+2b3322262e35272c1f272c1f272c1f272c1f272c1f272c1f262e35272c1f272c1f
+2f3c222a3438272c1f272c1f262e35272c1f2a3438272c1f2b3322262e351e241b
+24261c24261c272c1f272c1f262e3524261c272c1f272c1f2e3c44262e352f3c22
+262e35272c1f272c1f1e241b262e351e241b1e241b1e241b1e241b272c1f262e35
+1e241b262e3524261c1e241b2e3c443336422a3438272c1f1e241b272c1f2b3322
+2a34381e241b262e351e241b1e241b1e241b272c1f262e352a3438272c1f1e241b
+272c1f262e35262e35262e352a34382a34381e241b262e352e3c442e3c442e3c44
+3d4f56262e352a34382e3c44344e6f556c844a6a8d556c844a6a8d456185344e6f
+2e3c442a34382a34382e3c441e241b2b3322272c1f272c1f262e351e241b272c1f
+1e241b272c1f262e35272c1f1e241b1e241b1e241b1e241b272c1f272c1f272c1f
+1e241b2b3322272c1f272c1f24261c272c1f1e241b1e241b1e241b1e241b24261c
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b24261c24261c1e241b
+24261c1e241b24261c24261c272c1f1e241b1c1e1924261c24261c24261c24261c
+24261c24261c24261c1c1e1924261c1e241b1e241b1e241b24261c1c1e191c1e19
+1c1e191e241b1c1e1924261c1c1e191c1e191c1e1924261c1e241b1c1e191c1e19
+24261c1c1e191e241b1e241b1e241b1e241b272c1f1e241b24261c1e241b1e241b
+1e241b272c1f1e241b24261c24261c1e241b24261c1e241b24261c342d1f1c1e19
+342d1f24261c24261c24261c24261c342d1f24261c24261c262e3524261c272c1f
+272c1f272c1f1e241b272c1f272c1f24261c272c1f24261c24261c24261c24261c
+272c1f1e241b24261c24261c262e3524261c24261c272c1f342d1f24261c24261c
+24261c342d1f272c1f24261c272c1f272c1f272c1f272c1f24261c272c1f262e35
+262e352b33222b33222b3322272c1f272c1f272c1f272c1f272c1f272c1f1e241b
+2b3322272c1f333522272c1f272c1f1e241b342d1f272c1f24261c272c1f24261c
+272c1f272c1f272c1f2b3322272c1f342d1f272c1f272c1f24261c24261c24261c
+24261c24261c272c1f24261c272c1f272c1f2b33222b3322272c1f272c1f2b3322
+2b3322272c1f2b3322272c1f262e35262e351e241b272c1f272c1f262e35272c1f
+272c1f272c1f272c1f272c1f272c1f1e241b272c1f1e241b272c1f2b3322262e35
+24261c272c1f272c1f272c1f24261c24261c24261c24261c272c1f262e35272c1f
+262e35272c1f272c1f24261c342d1f272c1f342d1f24261c24261c272c1f24261c
+24261c24261c24261c24261c24261c342d1f24261c24261c24261c342d1f24261c
+24261c24261c24261c24261c342d1f272c1f272c1f272c1f272c1f272c1f272c1f
+5d83a45d83a46886a65d83a46886a65d83a45d83a45d83a46f8fae5d83a45d83a4
+5d83a45d83a46f8fae5d83a46886a66886a66f8fae6886a66f8fae6886a66f8fae
+6f8fae6886a66886a66f8fae587ca03d4f56304321344d59354c312f3c222a3438
+272c1f272c1f33364230444d344d592f3c224960655d83a46886a65d83a4587ca0
+597c753d4f56344e6f4561855374993d5f7a3c586f5d83a46886a66886a66f8fae
+5d83a46f8fae5d83a46f8fae5d83a45d83a45d83a46886a65d83a4587ca06886a6
+6886a65d83a4587ca06f8fae5d83a45d83a45d83a46886a6587ca0344d592e3c44
+3c586f3d5f7a344d592f3c22272c1f2e3c441e241b272c1f272c1f24261c24261c
+24261c24261c24261c1e241b1e241b24261c272c1f272c1f272c1f272c1f272c1f
+262e352b33222b3322272c1f262e35272c1f2a34382a3438272c1f1e241b272c1f
+262e352b3322262e351e241b2b33221e241b262e35272c1f272c1f342d1f272c1f
+272c1f24261c2a3438262e352e3c4424261c262e35272c1f2b33222a34382e3c44
+1e241b272c1f1e241b1e241b262e35272c1f272c1f1e241b1c1e191e241b262e35
+1e241b1e241b1e241b24261c262e352b33221e241b1e241b1e241b262e35272c1f
+272c1f272c1f1e241b272c1f1e241b272c1f1e241b1e241b333642272c1f1e241b
+262e35272c1f272c1f1e241b262e35262e35272c1f1e241b2e3c442a3438262e35
+2a34381e241b2a34383c586f3c586f3c5072456185556c844561854658642e3c44
+30444d30444d272c1f2f3c22272c1f1e241b262e35272c1f272c1f1e241b272c1f
+1e241b272c1f272c1f1e241b272c1f1e241b1e241b1e241b1e241b2a34382b3322
+1e241b272c1f1e241b272c1f1e241b272c1f1e241b24261c24261c24261c24261c
+1e241b1e241b24261c1e241b262e351e241b262e35272c1f1e241b1e241b24261c
+1e241b272c1f1e241b1e241b1e241b24261c1e241b1e241b24261c24261c24261c
+24261c272c1f24261c24261c1e241b1e241b1c1e1924261c24261c1e241b1c1e19
+1e241b1e241b1e241b1e241b24261c1c1e191c1e191c1e191c1e1924261c1c1e19
+1e241b24261c1e241b1e241b1c1e19262e3524261c1e241b24261c1e241b24261c
+1e241b1e241b1e241b24261c24261c1e241b262e35262e351e241b262e352a3438
+2b3322272c1f24261c24261c24261c24261c24261c24261c24261c24261c262e35
+24261c272c1f272c1f1e241b1e241b24261c272c1f1e241b24261c24261c24261c
+272c1f1e241b24261c272c1f272c1f272c1f24261c262e35262e35262e35272c1f
+24261c262e35272c1f272c1f262e35272c1f1e241b1e241b1e241b272c1f272c1f
+262e35272c1f2a34382b3322272c1f272c1f272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f262e35272c1f272c1f272c1f272c1f272c1f272c1f1e241b24261c
+272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f24261c272c1f272c1f
+272c1f24261c24261c272c1f272c1f272c1f2b33222f3c222f3c222b3322262e35
+2b3322272c1f2b33222b33222b3322262e35272c1f272c1f272c1f2b332224261c
+2b3322272c1f1e241b272c1f1e241b272c1f272c1f272c1f24261c2b332224261c
+24261c24261c24261c272c1f24261c272c1f262e3524261c342d1f262e35272c1f
+272c1f272c1f24261c24261c24261c24261c24261c262e35342d1f24261c342d1f
+24261c272c1f24261c342d1f272c1f24261c24261c24261c24261c24261c24261c
+24261c24261c24261c272c1f272c1f24261c342d1f272c1f272c1f272c1f24261c
+6886a65d83a46f8fae587ca0587ca06f8fae5d83a45d83a45d83a46886a65d83a4
+6f8fae5d83a45d83a46f8fae6f8fae6886a66f8fae6886a66886a66886a66f8fae
+6886a66886a66886a66886a6587ca04b6865354c313d573b3d4f5630444d2b3322
+272c1f2b33222f3c22344d593c586f2e3c443c586f5d83a46f8fae5d83a45d83a4
+5d83a44b6865344d5941678a556c84587ca03c586f6886a65d83a46886a65d83a4
+5d83a45d83a46886a65d83a46886a6587ca0587ca05d83a46886a65374995d83a4
+6886a65d83a45d83a46886a66886a6587ca0627d996886a66886a6344d593d573b
+41678a5374994b68652a34382b33222b3322272c1f2b3322272c1f262e3524261c
+24261c24261c24261c272c1f24261c1e241b272c1f272c1f1e241b262e35304321
+2b3322262e352b33221e241b2b3322262e352f3c222b33222b3322272c1f2b3322
+262e352b3322262e351e241b272c1f2b33221e241b272c1f272c1f24261c262e35
+1e241b272c1f272c1f2b3322272c1f24261c2a34381e241b272c1f272c1f262e35
+1e241b262e351e241b1e241b272c1f1e241b1c1e19262e351e241b1e241b272c1f
+1e241b262e35262e351c1e19272c1f262e3524261c272c1f1e241b1e241b1e241b
+262e351e241b1e241b1e241b1e241b1e241b2a34381e241b262e352a34381e241b
+262e351e241b1e241b1e241b262e35262e35262e351e241b2a34382a34382a3438
+1e241b262e352e3c4430444d30444d344e6f3c50724658643c586f30444d2a3438
+30444d344d591e241b2f3c22262e35272c1f1e241b1e241b1e241b272c1f1e241b
+1e241b272c1f1e241b1e241b24261c1e241b1e241b1e241b272c1f2b33222b3322
+1e241b1e241b1e241b24261c24261c1e241b1e241b1e241b24261c1e241b24261c
+1c1e191e241b1e241b272c1f272c1f1e241b272c1f1e241b1e241b24261c1e241b
+1e241b1e241b1e241b1e241b24261c1e241b1e241b24261c1e241b24261c1e241b
+1e241b24261c24261c1e241b24261c1c1e191e241b1e241b1e241b1c1e191e241b
+1c1e191e241b1e241b24261c1c1e191c1e191c1e191e241b24261c1c1e191c1e19
+24261c1e241b24261c24261c24261c33352224261c24261c1c1e1924261c24261c
+272c1f272c1f1e241b1c1e1924261c24261c2a3438272c1f272c1f1e241b262e35
+262e3524261c24261c24261c24261c342d1f272c1f24261c24261c24261c24261c
+272c1f272c1f1e241b272c1f272c1f1e241b262e3524261c24261c24261c24261c
+1e241b272c1f1e241b24261c2b3322262e35272c1f272c1f2b3322262e35272c1f
+24261c272c1f272c1f272c1f272c1f272c1f262e351e241b24261c272c1f272c1f
+1e241b262e352b3322272c1f2b3322272c1f272c1f272c1f272c1f262e351e241b
+272c1f24261c2b3322272c1f272c1f272c1f24261c24261c24261c24261c24261c
+24261c272c1f272c1f2b33222b33222b3322272c1f24261c24261c272c1f272c1f
+342d1f272c1f24261c24261c272c1f272c1f2f3c222f3c222b33222b33222b3322
+2b33222b3322272c1f2b33221e241b2b3322262e35272c1f262e352b33221e241b
+272c1f1e241b272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f24261c
+272c1f24261c272c1f24261c272c1f24261c24261c262e35272c1f2b3322272c1f
+24261c24261c272c1f24261c24261c24261c24261c24261c24261c272c1f272c1f
+24261c24261c262e35272c1f24261c342d1f24261c24261c24261c24261c24261c
+24261c24261c342d1f24261c272c1f272c1f24261c272c1f272c1f272c1f272c1f
+587ca05d83a45d83a46886a6587ca05d83a45d83a45d83a45d83a45d83a46886a6
+5d83a46886a65d83a45d83a46886a66f8fae6886a66886a66886a66f8fae6886a6
+6886a66f8fae6886a66886a6627d994b6865344d59344d593d573b30444d272c1f
+262e352e3c442e3c44354c3141678a3d5f7a587ca05d83a46886a65d83a4587ca0
+456185344d5930444d344d593c586f5374995d83a45d83a46f8fae6886a65d83a4
+5d83a46886a6587ca05d83a4537499537499587ca05d83a45d83a4537499587ca0
+6886a65374996886a66886a6627d995374994a6a8d6886a6597c7530444d3d5f7a
+4a6a8d4b68653c586f2a34382f3c222a34381e241b272c1f272c1f272c1f272c1f
+24261c24261c24261c1e241b24261c262e35272c1f272c1f2a3438272c1f2b3322
+2f3c222b33222b3322272c1f262e352b3322262e35272c1f262e35272c1f272c1f
+2b3322272c1f2b33221e241b272c1f272c1f1e241b262e352b33222b3322262e35
+272c1f1e241b272c1f1e241b1e241b24261c262e35272c1f1e241b2e3c44262e35
+1e241b272c1f1e241b1e241b1e241b272c1f1e241b272c1f1e241b1e241b262e35
+1e241b1e241b1e241b1e241b262e351e241b1e241b262e351e241b1e241b1e241b
+272c1f2b33221e241b272c1f1e241b1e241b272c1f1e241b1e241b272c1f272c1f
+272c1f1e241b1e241b1e241b1e241b272c1f262e35272c1f2a3438262e35262e35
+1e241b2e3c4430444d2e3c4430444d344d5930444d3944463944462e3c4430444d
+30444d30444d1e241b262e35272c1f1e241b272c1f272c1f1e241b272c1f1e241b
+1e241b1e241b262e351e241b24261c1e241b1c1e191e241b1e241b2a3438262e35
+24261c272c1f24261c1e241b1e241b272c1f1e241b1e241b1e241b24261c1e241b
+24261c1e241b1e241b272c1f262e351e241b1e241b1e241b1e241b1e241b1e241b
+272c1f24261c1e241b1e241b24261c24261c24261c24261c24261c1e241b24261c
+24261c1e241b24261c24261c1e241b24261c1c1e1924261c1e241b1c1e191e241b
+1c1e191e241b1e241b1e241b1c1e191c1e1924261c24261c1e241b1c1e191c1e19
+24261c24261c1e241b1e241b24261c262e351e241b1e241b1e241b1e241b24261c
+1e241b272c1f262e3524261c24261c1e241b373e431e241b272c1f262e3524261c
+24261c24261c272c1f24261c24261c24261c24261c24261c24261c272c1f24261c
+1e241b272c1f272c1f1e241b272c1f272c1f272c1f24261c272c1f262e35272c1f
+1e241b272c1f272c1f1e241b272c1f272c1f272c1f272c1f2b3322272c1f262e35
+272c1f24261c262e35272c1f272c1f272c1f1e241b1e241b272c1f272c1f272c1f
+1e241b272c1f262e351e241b2b3322272c1f1e241b262e351e241b2b3322262e35
+272c1f272c1f262e35272c1f272c1f272c1f1e241b272c1f272c1f24261c24261c
+1e241b272c1f272c1f2b3322272c1f333522272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f342d1f272c1f2b33222f3c222b3322262e35272c1f
+2b33222b3322262e352b3322262e35262e352b33221e241b2b33221e241b2b3322
+272c1f272c1f272c1f272c1f1e241b1e241b24261c272c1f24261c272c1f272c1f
+24261c24261c272c1f24261c24261c272c1f272c1f24261c272c1f24261c272c1f
+24261c24261c342d1f262e3524261c24261c342d1f272c1f24261c24261c342d1f
+24261c24261c24261c342d1f272c1f24261c24261c24261c24261c342d1f272c1f
+342d1f24261c272c1f342d1f342d1f272c1f24261c272c1f272c1f272c1f272c1f
+6886a6587ca05d83a4587ca05d83a45d83a4627d995d83a45d83a45d83a45d83a4
+5d83a46886a66886a65d83a46886a66886a66886a66886a66886a6627d99627d99
+6886a65d83a46886a66886a6627d995d83a44a6a8d41678a4960653d4f5630444d
+2b3322344d5941678a4b68655d83a45d83a45d83a46886a65d83a46886a65d83a4
+587ca03d5f7a3c50723d4f563d5f7a587ca05d83a45d83a4587ca06886a65d83a4
+5d83a45d83a45d83a45d83a4537499587ca0587ca05d83a4587ca04a6a8d6886a6
+6886a6587ca06886a65d83a4537499587ca04a6a8d6886a64a6a8d344e6f556c84
+5374993d5f7a3043212a34382a34382b3322272c1f272c1f262e35262e35272c1f
+262e3524261c272c1f1e241b272c1f342d1f272c1f2b33222b33221e241b2b3322
+2e3c442b33221e241b272c1f2b33221e241b2b33221e241b272c1f262e351e241b
+262e352b3322262e351e241b24261c272c1f1e241b1e241b272c1f3944461e241b
+2b3322262e35272c1f262e35272c1f24261c272c1f1e241b1e241b262e351e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b2a34381e241b1e241b272c1f24261c272c1f1e241b1e241b272c1f1e241b
+1e241b272c1f1e241b1e241b1e241b1e241b262e351e241b1e241b262e351e241b
+272c1f272c1f1e241b1e241b1e241b1e241b1e241b262e35272c1f1e241b1e241b
+1e241b2a34382e3c442e3c443c50722e3c443c50723944463944462a3438344e6f
+30444d30444d1e241b272c1f272c1f1e241b1e241b1e241b1e241b2b33221e241b
+1e241b1e241b272c1f1e241b1e241b24261c1e241b1c1e19272c1f3335222b3322
+24261c1e241b1e241b24261c1e241b1e241b24261c1c1e191e241b1e241b1e241b
+1e241b1c1e191e241b1e241b272c1f1e241b1e241b272c1f272c1f1e241b1e241b
+24261c1e241b1e241b272c1f24261c1e241b24261c24261c24261c24261c24261c
+1e241b24261c1c1e191e241b1e241b24261c1c1e191c1e1924261c1c1e191c1e19
+1c1e191e241b1c1e191c1e1924261c1c1e191c1e1924261c1e241b24261c1c1e19
+1c1e191e241b24261c1e241b1e241b1e241b24261c24261c1e241b1c1e19272c1f
+1e241b1e241b272c1f272c1f1e241b24261c262e351e241b24261c24261c24261c
+24261c272c1f262e3524261c24261c272c1f262e3524261c24261c24261c24261c
+262e35272c1f1e241b1e241b1e241b272c1f1e241b1e241b24261c24261c262e35
+1e241b1e241b1e241b1e241b262e35272c1f2f3c22272c1f272c1f272c1f262e35
+272c1f1e241b2b3322262e35272c1f272c1f24261c272c1f262e3524261c262e35
+2b33222b3322262e35272c1f2b33222b3322262e352b3322262e35272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c2b332224261c24261c24261c
+24261c272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f24261c2f3c221e241b272c1f2b33222b33222f3c222b3322
+272c1f2f3c222b3322272c1f272c1f262e35272c1f272c1f272c1f272c1f1e241b
+272c1f24261c1e241b24261c24261c272c1f272c1f272c1f24261c24261c1e241b
+272c1f24261c24261c24261c272c1f24261c24261c24261c272c1f262e35262e35
+272c1f24261c24261c24261c24261c24261c24261c342d1f24261c24261c24261c
+24261c24261c24261c24261c342d1f24261c272c1f342d1f24261c272c1f24261c
+24261c24261c24261c24261c272c1f272c1f272c1f342d1f272c1f272c1f272c1f
+587ca0627d996886a65d83a4587ca06886a6587ca06886a6627d996886a6627d99
+6886a66886a65d83a45d83a45d83a46886a66886a6627d996886a6627d99627d99
+627d995d83a4587ca0587ca0627d996886a65d83a45d83a44b6865344d59354c31
+2e3c4430444d354c31344e6f5374995374995374995d83a45d83a45d83a45d83a4
+587ca0597c753d5f7a3c586f41678a5d83a45d83a45d83a45d83a45d83a4587ca0
+627d995d83a4607590587ca0537499537499537499587ca05374994a6a8d587ca0
+627d995d83a46886a66886a65374996886a64a6a8d556c8441678a344d59537499
+556c84344d592e3c442a3438262e35262e35272c1f272c1f272c1f342d1f24261c
+1e241b272c1f1e241b272c1f24261c2b3322272c1f272c1f272c1f262e35262e35
+2f3c222b33221e241b262e35272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f2b3322272c1f24261c24261c272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f1e241b24261c24261c1e241b24261c24261c1e241b1e241b272c1f272c1f
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b
+1e241b262e351e241b1e241b1e241b272c1f24261c24261c1e241b1e241b1e241b
+1e241b272c1f1e241b1e241b1c1e191c1e191e241b1e241b272c1f1e241b1e241b
+1e241b272c1f1e241b1e241b1e241b272c1f1e241b262e351e241b1e241b262e35
+1e241b30444d2a3438262e353c50722e3c44344e6f2e3c44262e353336422a3438
+30444d2e3c44272c1f272c1f262e351e241b272c1f1e241b262e35272c1f1e241b
+272c1f1e241b1e241b1e241b1c1e191c1e191e241b1e241b1e241b2a34381e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b24261c1e241b24261c
+1e241b1e241b1e241b1e241b272c1f1e241b1e241b2b33221e241b1e241b1e241b
+1e241b1e241b1e241b24261c24261c1e241b24261c1e241b1e241b24261c24261c
+1e241b24261c1c1e191c1e191c1e1924261c1e241b1e241b24261c1c1e191c1e19
+1c1e191e241b1e241b1e241b24261c1c1e1924261c1c1e191e241b1e241b24261c
+24261c1c1e1924261c1e241b24261c1e241b1e241b1c1e191e241b1e241b1e241b
+272c1f1e241b1e241b1e241b1e241b1e241b272c1f24261c24261c24261c24261c
+24261c24261c24261c24261c262e3524261c24261c24261c24261c24261c24261c
+272c1f272c1f1e241b1e241b1e241b1e241b24261c1e241b24261c272c1f272c1f
+272c1f262e351e241b1e241b1e241b272c1f2a34382b33221e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f272c1f272c1f
+272c1f2b33221e241b2b3322272c1f272c1f272c1f272c1f272c1f262e35272c1f
+1e241b272c1f272c1f1e241b272c1f2b332224261c272c1f272c1f272c1f24261c
+272c1f1e241b272c1f2b3322272c1f272c1f272c1f24261c272c1f272c1f272c1f
+24261c272c1f272c1f24261c2f3c22272c1f1e241b2b33222b33222b33222b3322
+262e352b3322272c1f272c1f1e241b262e351e241b272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f1e241b1e241b1e241b272c1f24261c272c1f24261c
+272c1f24261c272c1f24261c24261c272c1f24261c24261c272c1f272c1f24261c
+24261c24261c24261c24261c342d1f24261c24261c24261c272c1f342d1f24261c
+342d1f24261c24261c24261c24261c24261c24261c342d1f24261c272c1f342d1f
+272c1f24261c272c1f24261c342d1f272c1f24261c342d1f272c1f272c1f272c1f
+5d83a45d83a4587ca0587ca05d83a46886a6587ca0587ca05d83a4587ca06886a6
+607590627d995d83a46886a6587ca0627d99587ca06886a6627d99537499537499
+587ca0587ca05d83a45d83a4587ca06886a65d83a45d83a441678a3d5f7a30444d
+2e3c442e3c44344d5941678a587ca05d83a4587ca05d83a4587ca05d83a4587ca0
+5d83a45773763d5f7a3d4f564a6a8d5374995d83a4587ca05d83a4587ca05d83a4
+5d83a4537499537499587ca0537499537499587ca05d83a44a6a8d537499607590
+6075905d83a45d83a4537499537499587ca04561854a6a8d3d5f7a344e6f4b6865
+41678a30444d3043212b3322272c1f272c1f272c1f272c1f2b3322262e35272c1f
+1e241b272c1f1e241b1e241b262e351e241b272c1f262e35272c1f272c1f1e241b
+272c1f2b33221e241b1e241b1e241b2b3322262e351e241b262e35272c1f2b3322
+272c1f342d1f24261c1e241b272c1f1e241b1e241b1e241b272c1f262e351e241b
+272c1f262e351e241b272c1f24261c24261c272c1f1e241b1e241b262e35272c1f
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b
+1e241b1c1e191e241b1c1e191e241b272c1f1c1e191c1e191c1e191c1e191e241b
+1e241b1e241b1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b262e351e241b1e241b2a3438
+1e241b344d592e3c442a34383c50722e3c442e3c44394446262e35262e35262e35
+344d592a34381e241b272c1f2b33221e241b1e241b1e241b2b3322262e351e241b
+1c1e191c1e191e241b1e241b1e241b1c1e191c1e191c1e191c1e192b33221e241b
+1e241b1e241b272c1f24261c1e241b1c1e1924261c1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1c1e191e241b24261c24261c24261c1e241b24261c24261c24261c1e241b
+1c1e1924261c24261c24261c24261c24261c24261c1c1e191c1e191c1e191c1e19
+1c1e191c1e191c1e191c1e191c1e1924261c1e241b1e241b1c1e191e241b1c1e19
+24261c24261c1c1e191e241b1e241b24261c24261c1e241b1e241b1e241b1e241b
+272c1f1e241b272c1f272c1f1e241b24261c1e241b24261c24261c24261c24261c
+1e241b24261c272c1f24261c272c1f24261c24261c24261c24261c272c1f1e241b
+1e241b272c1f1e241b1e241b272c1f24261c24261c1e241b272c1f1e241b1e241b
+2b3322272c1f1e241b272c1f2b3322262e352a34382b3322262e352b3322272c1f
+1e241b2b3322272c1f272c1f2b3322272c1f1e241b272c1f272c1f272c1f2b3322
+272c1f272c1f272c1f1e241b2b3322272c1f2b33221e241b272c1f272c1f2b3322
+2b3322272c1f1e241b272c1f24261c272c1f272c1f1e241b272c1f1e241b24261c
+1e241b272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c
+272c1f24261c272c1f272c1f262e351e241b272c1f2b33222b33222b3322272c1f
+2b3322272c1f272c1f272c1f272c1f2b3322272c1f1e241b272c1f1e241b272c1f
+1e241b272c1f24261c24261c272c1f24261c24261c272c1f24261c24261c24261c
+272c1f24261c24261c272c1f24261c24261c272c1f272c1f342d1f272c1f272c1f
+272c1f24261c24261c24261c262e35272c1f24261c24261c24261c24261c272c1f
+24261c24261c272c1f342d1f272c1f272c1f272c1f272c1f24261c272c1f24261c
+24261c24261c272c1f342d1f272c1f24261c272c1f272c1f272c1f272c1f272c1f
+587ca05d83a45d83a45d83a4587ca06886a6587ca06886a6627d99587ca0587ca0
+627d99627d99587ca0587ca0627d99587ca0587ca0627d99587ca0587ca0587ca0
+587ca0587ca06886a6587ca0627d995d83a4587ca05d83a45773763d5f7a354c31
+2f3c2230444d3d573b3c586f587ca0587ca05d83a46886a6587ca05d83a45d83a4
+587ca0587ca03c586f3c5072587ca0587ca0587ca0587ca0587ca0587ca0587ca0
+5d83a4587ca05374994a6a8d587ca0537499537499587ca0537499587ca0537499
+607590627d99587ca0556c84627d995374993c507241678a3c586f3c586f3c586f
+4a6a8d344d592f3c22262e35272c1f272c1f262e352b3322272c1f272c1f272c1f
+1e241b1e241b262e351e241b272c1f262e35272c1f272c1f2b3322262e35272c1f
+2b3322262e351e241b272c1f1e241b272c1f2b33221e241b272c1f272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f1e241b1e241b1e241b272c1f1e241b272c1f
+342d1f272c1f1e241b24261c1e241b24261c1e241b1e241b1e241b272c1f1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1c1e191c1e191e241b1e241b1c1e19
+1c1e191c1e191e241b1c1e191e241b1e241b1c1e191c1e191c1e191e241b1c1e19
+1e241b1e241b1e241b1e241b1c1e191e241b1e241b1c1e191e241b1e241b1c1e19
+1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b262e352f3c22
+1e241b2a34382e3c44262e353c586f2e3c442e3c4430444d2a3438262e352e3c44
+344d59262e351e241b272c1f1e241b1e241b1e241b1e241b2f3c221e241b1c1e19
+1c1e191c1e191e241b1c1e191e241b1c1e191c1e191c1e191c1e192b33221e241b
+1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b24261c1c1e191c1e19
+272c1f272c1f1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b24261c24261c24261c24261c1e241b1c1e191c1e191e241b24261c
+1c1e191c1e191c1e191c1e191e241b1e241b24261c1e241b1c1e191c1e191c1e19
+1e241b1c1e191e241b1c1e191c1e191c1e1924261c1e241b1c1e1924261c1e241b
+1c1e1924261c1e241b1c1e191e241b24261c1e241b1e241b1c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b24261c24261c1e241b24261c24261c24261c
+24261c262e35272c1f272c1f262e35272c1f1e241b1e241b24261c272c1f272c1f
+272c1f1e241b272c1f1e241b272c1f1e241b1e241b1e241b272c1f272c1f1e241b
+2b3322272c1f272c1f1e241b2b33222b3322272c1f2b33221e241b2b33221e241b
+272c1f2b3322272c1f1e241b272c1f272c1f1e241b272c1f272c1f272c1f272c1f
+272c1f262e352b3322272c1f272c1f2b3322272c1f272c1f1e241b1e241b272c1f
+272c1f272c1f1e241b272c1f272c1f24261c24261c24261c272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f272c1f342d1f24261c272c1f24261c272c1f24261c
+24261c24261c272c1f272c1f2b33222b3322272c1f272c1f2b33222b33221e241b
+1e241b2b3322272c1f272c1f1e241b272c1f272c1f272c1f1e241b1e241b272c1f
+1e241b24261c24261c24261c24261c24261c24261c24261c272c1f24261c24261c
+262e3524261c24261c272c1f24261c24261c1e241b272c1f272c1f272c1f24261c
+272c1f24261c24261c24261c24261c342d1f24261c24261c24261c24261c342d1f
+24261c24261c272c1f24261c24261c342d1f24261c272c1f24261c24261c342d1f
+24261c24261c24261c272c1f342d1f24261c272c1f342d1f272c1f272c1f272c1f
+627d99627d99587ca05d83a4587ca0587ca0587ca0587ca0587ca0627d99627d99
+587ca05d83a4587ca05d83a45d83a4587ca0587ca0587ca0587ca0587ca05d83a4
+537499627d99587ca05d83a4587ca0627d99587ca05d83a44a6a8d3d5f7a344d59
+2e3c442e3c443c586f3d5f7a537499627d99587ca0587ca0587ca0587ca0587ca0
+5d83a4537499344d593c5072587ca0587ca0587ca05d83a45374994a6a8d537499
+5d83a45374995374995374995d83a44a6a8d587ca04a6a8d537499587ca0537499
+607590537499537499456185627d993c50723c586f3d5f7a3c586f3c586f3c586f
+4a6a8d30444d2f3c22262e35272c1f272c1f2b332233352224261c272c1f272c1f
+1e241b272c1f2b33221e241b272c1f262e35272c1f1e241b2b33222b3322262e35
+272c1f272c1f272c1f1e241b2b33221e241b272c1f1e241b272c1f272c1f272c1f
+262e35272c1f24261c262e351e241b272c1f1e241b272c1f272c1f1e241b262e35
+24261c1e241b272c1f272c1f1e241b24261c1e241b1e241b1e241b1e241b1e241b
+272c1f1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b1c1e191e241b
+1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1c1e191c1e191e241b
+1c1e191e241b1e241b1e241b1c1e191e241b1c1e191e241b1e241b1e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1e241b262e351e241b1e241b1e241b262e35
+1e241b2a34382b33221e241b2e3c442a3438262e352e3c442a34382e3c442a3438
+30444d262e35272c1f1e241b1e241b1e241b1e241b272c1f1e241b272c1f1e241b
+1e241b1e241b1c1e191c1e191c1e191c1e191c1e191c1e191e241b1e241b1e241b
+1c1e191e241b1c1e191e241b24261c1c1e191e241b1e241b1e241b1e241b1c1e19
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e191e241b1e241b272c1f24261c1c1e1924261c1e241b1c1e191c1e1924261c
+1e241b24261c1c1e191e241b1c1e191e241b1e241b1c1e191e241b1c1e191c1e19
+1c1e1924261c1c1e191c1e191e241b1c1e191e241b1e241b1c1e191e241b1c1e19
+24261c24261c1c1e19272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b262e351e241b24261c24261c24261c1c1e19262e351e241b
+24261c262e35272c1f272c1f272c1f24261c24261c1e241b24261c272c1f1e241b
+1e241b272c1f1e241b272c1f272c1f272c1f24261c1e241b1e241b1e241b272c1f
+1e241b2f3c22272c1f272c1f272c1f272c1f2f3c22272c1f272c1f272c1f272c1f
+272c1f2f3c22272c1f2b3322262e35262e352b33221e241b272c1f1e241b272c1f
+272c1f2b332224261c272c1f272c1f272c1f272c1f272c1f2b3322272c1f272c1f
+272c1f1e241b272c1f1e241b272c1f272c1f272c1f272c1f24261c272c1f24261c
+24261c272c1f24261c272c1f272c1f272c1f24261c24261c24261c272c1f272c1f
+272c1f1e241b1e241b1e241b272c1f272c1f1e241b2b33222b33222b3322272c1f
+272c1f272c1f272c1f2b3322272c1f1e241b1e241b24261c1e241b24261c24261c
+24261c1e241b24261c272c1f1e241b24261c24261c262e3524261c24261c24261c
+24261c272c1f24261c24261c24261c272c1f24261c272c1f272c1f272c1f272c1f
+24261c342d1f24261c24261c24261c24261c24261c24261c24261c342d1f24261c
+24261c24261c24261c262e35272c1f24261c24261c342d1f272c1f272c1f272c1f
+24261c272c1f272c1f342d1f272c1f24261c24261c272c1f272c1f272c1f272c1f
+587ca0587ca0587ca05d83a4587ca05d83a4587ca0627d99587ca0587ca0627d99
+587ca05d83a4587ca0627d99587ca0587ca05d83a4587ca0537499587ca05d83a4
+537499537499627d99587ca0587ca05d83a4587ca05d83a453749941678a41678a
+344d5930444d4a6a8d597c75537499537499587ca05d83a4587ca0587ca0587ca0
+587ca041678a344d59344e6f5374995d83a4587ca0537499587ca041678a537499
+587ca05374994a6a8d537499587ca041678a587ca041678a587ca0587ca0537499
+627d996075904a6a8d4a6a8d537499344e6f3c50723c586f344e6f30444d344d59
+4b686530444d2f3c22272c1f1e241b2a34382a3438272c1f272c1f272c1f262e35
+1e241b272c1f272c1f272c1f272c1f2b3322272c1f1e241b262e352b33221e241b
+272c1f1e241b272c1f272c1f272c1f1e241b1e241b1e241b1e241b262e35272c1f
+272c1f24261c272c1f272c1f1e241b1e241b272c1f1e241b1e241b272c1f1e241b
+1e241b1e241b1e241b24261c1e241b24261c1e241b1e241b1e241b1e241b272c1f
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191c1e19
+1e241b1c1e191e241b1e241b1c1e191c1e191c1e191c1e191c1e191c1e191e241b
+1c1e191c1e191e241b1e241b1c1e191c1e191c1e191c1e191e241b1e241b1e241b
+1e241b1c1e191e241b1e241b1e241b1c1e191c1e191e241b1c1e19272c1f272c1f
+1c1e191e241b272c1f272c1f262e35262e35262e35262e351e241b2a3438262e35
+344d59262e351e241b1e241b272c1f2a34381e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1c1e191c1e191c1e191c1e191c1e191c1e191c1e1924261c1c1e19
+1c1e191e241b1c1e191e241b24261c1e241b1c1e191e241b1e241b1e241b1c1e19
+272c1f1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e1924261c1e241b272c1f24261c24261c1e241b1e241b1e241b1c1e1924261c
+1e241b24261c1c1e191c1e191c1e191e241b24261c1e241b1c1e191c1e191c1e19
+1c1e191e241b24261c1c1e191c1e191c1e1924261c1c1e191e241b24261c1c1e19
+1c1e1924261c1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b
+1c1e191e241b272c1f272c1f1e241b1e241b24261c24261c24261c342d1f24261c
+262e3524261c272c1f262e3524261c24261c24261c1e241b272c1f272c1f272c1f
+24261c24261c1e241b24261c24261c272c1f1e241b272c1f2b3322272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f262e35272c1f1e241b2b33222b33221e241b
+1e241b2b3322262e35272c1f272c1f272c1f272c1f272c1f1e241b2b3322272c1f
+272c1f272c1f1e241b272c1f272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f1e241b272c1f1e241b272c1f272c1f1e241b1e241b1e241b24261c272c1f
+24261c24261c272c1f24261c24261c272c1f272c1f272c1f24261c272c1f24261c
+272c1f24261c1e241b1e241b272c1f272c1f272c1f272c1f272c1f272c1f2f3c22
+1e241b272c1f272c1f272c1f1e241b272c1f272c1f272c1f24261c24261c24261c
+24261c24261c1e241b24261c1e241b24261c24261c272c1f24261c272c1f24261c
+24261c272c1f24261c24261c24261c272c1f24261c24261c272c1f342d1f272c1f
+272c1f24261c272c1f24261c342d1f24261c342d1f24261c24261c24261c272c1f
+342d1f272c1f272c1f272c1f272c1f24261c262e3524261c24261c342d1f272c1f
+24261c24261c272c1f272c1f272c1f24261c272c1f272c1f24261c272c1f272c1f
+627d99587ca0627d99587ca05d83a4537499587ca0587ca0627d99587ca0587ca0
+5d83a4587ca0537499587ca0587ca0587ca0587ca0537499537499587ca0587ca0
+587ca0537499537499587ca05d83a4587ca0587ca0537499587ca05d83a44a6a8d
+344d59344d594a6a8d41678a4a6a8d537499587ca0587ca0537499587ca0537499
+587ca05374995374994a6a8d5d83a4587ca05d83a45374995374993c586f537499
+587ca053749941678a4a6a8d5374994a6a8d627d99456185627d99607590456185
+587ca0587ca0344e6f4a6a8d45618530444d344d5930444d3c586f344d59344d59
+30444d2e3c442a3438272c1f272c1f2e3c442f3c22262e35272c1f1e241b1e241b
+272c1f1e241b1e241b2f3c221e241b272c1f2b33221e241b2b33221e241b272c1f
+1e241b1e241b1e241b1e241b272c1f1e241b272c1f272c1f1e241b272c1f24261c
+24261c24261c1e241b272c1f24261c1e241b1e241b272c1f1e241b1e241b1e241b
+24261c1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b1c1e19
+1c1e191e241b1e241b1c1e191e241b1e241b1c1e191c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b262e35262e35262e351e241b2a34382a34382a3438262e35262e35
+30444d262e351e241b1e241b1e241b2e3c44272c1f2b33221e241b24261c1e241b
+1e241b1c1e191c1e191c1e191c1e191e241b1c1e191e241b1e241b1e241b1e241b
+1e241b1e241b1e241b24261c24261c1c1e191e241b1e241b1e241b1e241b1c1e19
+1e241b1c1e191e241b1c1e191e241b272c1f1e241b1e241b1e241b1e241b1c1e19
+1c1e1924261c24261c1e241b1e241b24261c1c1e191c1e1924261c24261c24261c
+24261c24261c1c1e1924261c24261c1e241b1c1e1924261c1e241b24261c1c1e19
+1c1e191c1e1924261c24261c1e241b1e241b1e241b1e241b1e241b24261c1e241b
+24261c1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b1c1e19
+1e241b1e241b272c1f1e241b24261c24261c24261c24261c24261c24261c24261c
+272c1f24261c24261c342d1f272c1f24261c1e241b1e241b272c1f1e241b272c1f
+1e241b24261c272c1f272c1f272c1f24261c24261c24261c2b33221e241b272c1f
+1e241b272c1f272c1f272c1f1e241b262e35272c1f1e241b272c1f1e241b2b3322
+1e241b2b33222f3c221e241b272c1f272c1f262e35272c1f272c1f272c1f1e241b
+272c1f2b33221e241b272c1f1e241b272c1f272c1f272c1f272c1f272c1f272c1f
+1e241b272c1f272c1f1e241b24261c272c1f24261c24261c24261c24261c1e241b
+272c1f272c1f272c1f272c1f272c1f24261c272c1f24261c272c1f272c1f272c1f
+24261c24261c1e241b272c1f272c1f1e241b272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f272c1f24261c1e241b24261c1e241b24261c272c1f
+272c1f24261c24261c1e241b24261c24261c24261c24261c272c1f24261c272c1f
+272c1f342d1f24261c272c1f24261c272c1f342d1f272c1f272c1f1e241b262e35
+342d1f272c1f272c1f262e3524261c24261c272c1f342d1f24261c272c1f24261c
+24261c24261c272c1f24261c24261c24261c272c1f272c1f24261c272c1f342d1f
+272c1f24261c272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+587ca0587ca0627d99537499587ca0607590587ca0587ca0537499537499587ca0
+587ca0587ca0537499537499587ca0537499537499456185537499537499537499
+5374995374995374994a6a8d587ca0587ca0587ca0537499587ca0587ca041678a
+344d593c586f537499587ca04a6a8d537499537499587ca0537499537499537499
+587ca05374994a6a8d4a6a8d537499587ca0587ca0537499537499344e6f456185
+587ca05374993c586f4a6a8d537499537499537499456185587ca04a6a8d41678a
+587ca0456185344e6f3d5f7a3d5f7a344e6f2e3c442e3c443c586f344d5930444d
+354c312f3c222a34382a3438262e352f3c222a343824261c2b3322272c1f1e241b
+272c1f1e241b1e241b262e351e241b262e35272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2b3322272c1f1e241b1e241b1e241b272c1f1e241b262e35272c1f
+272c1f24261c272c1f24261c272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b24261c1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1c1e191c1e191e241b1c1e191e241b1c1e19
+1c1e191e241b1e241b1e241b1c1e191e241b1c1e191c1e191c1e191c1e191e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b
+1e241b262e35272c1f262e352a34382a3438262e3530444d262e35262e352e3c44
+2e3c442a3438272c1f1e241b1e241b262e351e241b1e241b1e241b272c1f1e241b
+2b33221c1e191c1e191e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b
+1c1e191e241b1e241b24261c1e241b1c1e1924261c1c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b24261c
+1c1e19272c1f1e241b1e241b24261c1e241b24261c1c1e191e241b24261c1e241b
+24261c24261c1e241b24261c1c1e1924261c1e241b1c1e191c1e1924261c1c1e19
+24261c24261c24261c1c1e191c1e191c1e191e241b1e241b1e241b1e241b1e241b
+1e241b1e241b24261c1e241b1e241b262e351e241b1e241b1c1e191e241b24261c
+1e241b1e241b262e351e241b24261c24261c24261c24261c24261c262e35272c1f
+24261c272c1f272c1f272c1f272c1f24261c24261c24261c272c1f1e241b272c1f
+272c1f24261c272c1f24261c2b33221e241b262e35272c1f2b33222b3322272c1f
+272c1f272c1f272c1f272c1f2b3322262e351e241b272c1f1e241b272c1f272c1f
+272c1f272c1f2b3322272c1f272c1f2b3322272c1f272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f
+272c1f272c1f1e241b272c1f1e241b24261c24261c272c1f24261c272c1f1e241b
+24261c272c1f272c1f272c1f272c1f24261c272c1f272c1f24261c24261c272c1f
+272c1f24261c24261c272c1f1e241b272c1f272c1f1e241b272c1f272c1f272c1f
+272c1f272c1f272c1f1e241b1e241b272c1f272c1f24261c24261c24261c24261c
+272c1f24261c272c1f24261c272c1f24261c272c1f24261c262e3524261c24261c
+272c1f272c1f24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f24261c272c1f24261c24261c24261c24261c24261c24261c272c1f
+24261c24261c272c1f272c1f24261c342d1f333642272c1f24261c333522272c1f
+342d1f272c1f272c1f272c1f342d1f272c1f342d1f272c1f272c1f272c1f272c1f
+587ca0607590587ca0587ca0587ca0537499587ca0607590587ca0587ca0537499
+587ca0587ca0537499587ca0537499587ca0537499456185537499587ca0587ca0
+587ca0587ca041678a3d5f7a41678a537499587ca041678a587ca05d83a4537499
+344d593c586f5374995374995374994a6a8d4a6a8d4a6a8d5374994a6a8d537499
+587ca05374994a6a8d4a6a8d587ca0587ca0587ca0587ca05374993c586f4a6a8d
+587ca04a6a8d3c50724a6a8d5374995374994561854a6a8d587ca04a6a8d41678a
+556c84344e6f3d5f7a344e6f3d5f7a344d592e3c44262e353d5f7a344d592e3c44
+30444d2f3c222e3c44304321262e352a3438354c312b3322272c1f1e241b1e241b
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e351e241b
+1e241b272c1f1e241b1e241b272c1f1e241b1e241b272c1f262e35272c1f1e241b
+262e3524261c272c1f1e241b24261c1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e191e241b1e241b1e241b1c1e191c1e191c1e191e241b1c1e191e241b1e241b
+1c1e191c1e191c1e191c1e191c1e191c1e191c1e191c1e191c1e191e241b1c1e19
+1e241b1e241b1e241b1c1e191e241b1e241b1e241b1c1e191c1e191e241b1c1e19
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e19262e351e241b1e241b
+1e241b272c1f1e241b272c1f2a34382a3438272c1f2a34381e241b262e35344d59
+272c1f262e35272c1f1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b
+1e241b1c1e191c1e191e241b1e241b1e241b1c1e191c1e191c1e191e241b1e241b
+1e241b1c1e191e241b24261c1c1e1924261c1e241b24261c1e241b1e241b1c1e19
+1e241b1e241b1e241b1c1e191c1e191e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b24261c24261c1e241b1c1e191c1e191e241b1c1e1924261c
+1e241b1c1e191c1e1924261c1e241b24261c1c1e191c1e1924261c1c1e191c1e19
+1c1e191c1e1924261c1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b24261c1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b262e351e241b1e241b272c1f24261c24261c24261c272c1f262e3524261c
+24261c1e241b24261c272c1f272c1f24261c1c1e19272c1f272c1f272c1f262e35
+272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f2b3322262e351e241b
+272c1f272c1f272c1f272c1f1e241b2b3322272c1f272c1f1e241b272c1f1e241b
+272c1f272c1f2b33222b3322272c1f1e241b2b3322272c1f272c1f272c1f272c1f
+272c1f1e241b272c1f272c1f1e241b1e241b272c1f272c1f272c1f272c1f1e241b
+272c1f272c1f1e241b1e241b272c1f272c1f272c1f1e241b2f3c2233352224261c
+272c1f272c1f24261c272c1f272c1f272c1f24261c272c1f272c1f24261c1e241b
+24261c1e241b1e241b1e241b272c1f1e241b272c1f1e241b272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f1e241b24261c1e241b272c1f24261c24261c1e241b
+24261c24261c24261c24261c1e241b1e241b24261c272c1f24261c272c1f1e241b
+1e241b24261c272c1f1e241b272c1f272c1f2b3322262e352b3322272c1f24261c
+262e35342d1f272c1f272c1f272c1f24261c272c1f24261c342d1f272c1f24261c
+272c1f272c1f24261c24261c272c1f24261c272c1f24261c272c1f272c1f342d1f
+24261c24261c272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f24261c
+587ca0587ca0537499537499537499537499537499537499537499537499537499
+537499587ca05374995374995374995374994a6a8d4a6a8d4a6a8d537499537499
+537499587ca0537499344e6f5374995374995374994a6a8d537499587ca0537499
+30444d3d5f7a53749941678a456185456185587ca04a6a8d587ca041678a4a6a8d
+587ca0587ca0537499556c84587ca0587ca0537499587ca04a6a8d456185456185
+587ca04a6a8d30444d4a6a8d4a6a8d4a6a8d3d5f7a41678a5374994a6a8d456185
+4a6a8d3d5f7a456185344d59344e6f344d592a34382a3438344d5930444d1e241b
+2e3c442b33222a343830444d262e352b3322304321262e35272c1f272c1f272c1f
+1e241b272c1f272c1f1e241b272c1f1e241b272c1f1e241b1e241b272c1f272c1f
+1e241b1e241b1e241b1e241b262e351e241b272c1f1e241b1e241b272c1f24261c
+24261c1e241b1e241b1e241b24261c1e241b262e351e241b24261c24261c1e241b
+262e3524261c1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1c1e191c1e191e241b1c1e191e241b1e241b
+1c1e191c1e191c1e191e241b1e241b1c1e191c1e191c1e191c1e191c1e191e241b
+1e241b1e241b1e241b1c1e191e241b1c1e191e241b1c1e191c1e191c1e191e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b262e351e241b2a34382f3c221e241b2a3438262e352a343830444d
+262e352b3322272c1f1e241b262e351e241b262e351e241b1c1e191e241b272c1f
+1e241b1e241b1c1e191c1e191e241b1c1e191c1e191c1e191c1e191e241b1c1e19
+1e241b1e241b1c1e191e241b1e241b1e241b1e241b1c1e191e241b1c1e191c1e19
+1e241b1e241b1e241b1c1e191e241b1c1e191e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b24261c1e241b1e241b24261c1c1e191c1e191c1e191e241b
+24261c1e241b1c1e191c1e191c1e1924261c1c1e191c1e191e241b24261c1c1e19
+1c1e191c1e191e241b1c1e191c1e1924261c1e241b1e241b272c1f1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+272c1f272c1f1e241b1e241b1e241b24261c24261c24261c24261c24261c24261c
+24261c24261c24261c24261c272c1f272c1f24261c272c1f1e241b272c1f272c1f
+1e241b272c1f272c1f24261c272c1f1e241b272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f272c1f272c1f1e241b2b3322272c1f1e241b272c1f272c1f1e241b
+272c1f1e241b272c1f1e241b2b3322272c1f272c1f272c1f272c1f1e241b272c1f
+1e241b1e241b272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f1e241b1e241b272c1f272c1f1e241b272c1f1e241b4758323f4e321e241b
+1e241b272c1f24261c272c1f1e241b24261c24261c24261c272c1f272c1f1e241b
+272c1f24261c272c1f272c1f1e241b1e241b1e241b272c1f272c1f1e241b1e241b
+272c1f1e241b1e241b272c1f1e241b24261c24261c1e241b1e241b272c1f272c1f
+272c1f24261c24261c1e241b24261c24261c24261c272c1f24261c272c1f24261c
+24261c272c1f272c1f1e241b272c1f272c1f272c1f272c1f262e35272c1f24261c
+24261c272c1f272c1f272c1f272c1f272c1f342d1f262e35272c1f272c1f24261c
+342d1f24261c272c1f272c1f272c1f24261c272c1f272c1f24261c272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+537499537499537499537499537499537499537499537499537499537499537499
+537499537499537499587ca05374995374994a6a8d41678a4a6a8d41678a537499
+53749953749941678a344e6f53749953749941678a41678a53749953749941678a
+2e3c44344e6f41678a45618545618541678a53749941678a4a6a8d456185537499
+587ca0587ca04a6a8d537499537499537499587ca05374993d5f7a3d5f7a456185
+587ca041678a30444d5374994a6a8d4a6a8d4a6a8d4a6a8d4a6a8d4658643c5072
+3c50723d5f7a3c586f30444d30444d3d5f7a2a3438354c31344d592a3438272c1f
+2f3c222a34382f3c22262e352a34382f3c22262e351e241b1e241b1e241b272c1f
+272c1f1e241b272c1f1e241b272c1f272c1f272c1f1e241b2b33221e241b1e241b
+1e241b272c1f1e241b1e241b1e241b1e241b24261c1e241b24261c1e241b1e241b
+24261c1c1e1924261c1e241b1e241b24261c24261c1e241b1e241b1e241b1c1e19
+1e241b24261c1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1c1e191c1e191e241b1e241b1e241b1e241b
+1e241b1e241b1c1e191c1e191e241b1c1e191c1e191c1e191c1e191c1e191e241b
+262e351e241b1c1e191c1e191e241b1e241b1c1e191e241b1e241b1c1e191e241b
+1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b272c1f1e241b262e351e241b1e241b2b33221e241b262e352f3c22
+1e241b1e241b262e351e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1c1e191e241b1c1e191e241b1e241b1c1e191c1e191c1e191c1e19
+1c1e191c1e1924261c24261c1c1e191c1e191c1e191e241b1e241b1e241b1e241b
+1c1e191e241b1e241b1c1e191e241b24261c1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1c1e1924261c1c1e1924261c1c1e191c1e191c1e1924261c24261c
+1c1e191c1e191e241b24261c1e241b1c1e191c1e1924261c1e241b1e241b1c1e19
+1c1e191c1e191e241b1c1e1924261c1e241b1e241b1e241b1e241b1e241b1c1e19
+24261c1e241b1e241b1c1e191e241b1e241b1e241b24261c1e241b24261c1e241b
+1e241b272c1f1e241b272c1f1e241b24261c24261c24261c24261c24261c24261c
+24261c24261c24261c262e35272c1f24261c262e35272c1f262e351e241b2b3322
+272c1f262e3524261c272c1f262e35272c1f262e351e241b272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f1e241b272c1f272c1f1e241b2b33222b33221e241b
+272c1f1e241b2b33221e241b1e241b2b3322272c1f272c1f272c1f272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f
+1e241b272c1f1e241b1e241b272c1f1e241b272c1f24261c272c1f272c1f272c1f
+24261c272c1f24261c272c1f272c1f24261c24261c272c1f272c1f1e241b272c1f
+24261c1e241b1e241b272c1f1e241b2b33221e241b272c1f1e241b272c1f272c1f
+272c1f1e241b272c1f1e241b272c1f24261c24261c272c1f24261c24261c24261c
+1e241b24261c24261c24261c24261c272c1f24261c1e241b262e3524261c24261c
+24261c24261c272c1f272c1f1e241b272c1f272c1f2b33222b33222b3322262e35
+262e35272c1f342d1f373e43342d1f24261c262e35342d1f24261c24261c24261c
+262e35272c1f272c1f272c1f24261c272c1f24261c272c1f272c1f272c1f333522
+24261c24261c272c1f342d1f272c1f24261c272c1f272c1f272c1f272c1f272c1f
+537499537499587ca053749953749953749941678a5374994a6a8d537499537499
+5374995374995374994a6a8d5374994561855374994561854a6a8d41678a4a6a8d
+53749953749941678a30444d41678a53749941678a41678a53749953749941678a
+344e6f4a6a8d4a6a8d3c586f3d5f7a3d5f7a4a6a8d3d5f7a5374993d5f7a537499
+537499587ca04a6a8d6075905374993d5f7a4561855374993c586f45618541678a
+5374993d5f7a30444d41678a3d5f7a4561855374994a6a8d41678a344e6f456185
+30444d3c586f3c586f344e6f2e3c443d5f7a262e35344d593043212a3438262e35
+2f3c222a34382a3438262e351e241b2f3c22272c1f1e241b272c1f272c1f272c1f
+1e241b1e241b272c1f272c1f1e241b272c1f1e241b272c1f272c1f1e241b1e241b
+1e241b272c1f1e241b1e241b272c1f1e241b1e241b272c1f1e241b24261c24261c
+272c1f1c1e191c1e1924261c1e241b1e241b1e241b1e241b1e241b1e241b24261c
+262e351e241b1c1e191e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1c1e191e241b1c1e191c1e191c1e191c1e19
+1c1e191e241b1c1e191c1e191e241b1e241b1c1e191c1e191c1e191e241b1e241b
+272c1f272c1f1e241b1e241b1e241b1c1e191e241b1c1e191c1e191e241b1e241b
+1e241b1c1e191c1e191e241b1c1e191c1e191e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b262e351e241b1e241b262e35272c1f1e241b262e35
+1e241b272c1f1e241b272c1f1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1e241b1e241b1c1e191c1e191c1e191e241b1c1e191c1e191c1e191c1e191c1e19
+1e241b1c1e191c1e1924261c1c1e1924261c1c1e191c1e191e241b1c1e191e241b
+1e241b1e241b1e241b1c1e191c1e191e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b24261c24261c1c1e1924261c1e241b1c1e1924261c1c1e1924261c
+24261c1c1e191c1e191c1e1924261c1c1e191c1e191c1e191c1e1924261c1c1e19
+1c1e191c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+272c1f272c1f1e241b1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b
+272c1f272c1f1e241b1e241b1e241b1e241b24261c1e241b24261c262e3524261c
+272c1f24261c24261c272c1f272c1f272c1f272c1f2b33222b3322272c1f262e35
+1e241b2b33221e241b2b33222b33222b33221e241b1e241b2b33221e241b272c1f
+272c1f1e241b272c1f272c1f1e241b272c1f272c1f1e241b272c1f272c1f272c1f
+1e241b272c1f272c1f272c1f2b3322272c1f1e241b2b33221e241b2b3322272c1f
+272c1f2b33221e241b272c1f1e241b272c1f272c1f272c1f1e241b272c1f272c1f
+272c1f1e241b272c1f1e241b1e241b272c1f1e241b1e241b24261c24261c272c1f
+272c1f272c1f1e241b24261c272c1f24261c272c1f24261c272c1f272c1f1e241b
+272c1f24261c24261c272c1f1e241b272c1f1e241b272c1f1e241b272c1f1e241b
+272c1f1e241b1e241b1e241b24261c1e241b24261c24261c24261c272c1f24261c
+24261c272c1f24261c373e4324261c272c1f272c1f24261c24261c24261c24261c
+24261c24261c272c1f272c1f1e241b272c1f272c1f272c1f342d1f272c1f342d1f
+272c1f272c1f272c1f333522262e35272c1f272c1f272c1f272c1f24261c272c1f
+24261c272c1f272c1f272c1f272c1f272c1f342d1f272c1f272c1f24261c272c1f
+24261c24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c
+5374995374994a6a8d5374995374995374994561854561854a6a8d4a6a8d4a6a8d
+5374994a6a8d5374995374994a6a8d45618553749941678a4a6a8d41678a41678a
+4a6a8d537499344e6f30444d4a6a8d41678a3d5f7a4a6a8d4a6a8d4a6a8d4a6a8d
+3c586f5374993d5f7a3d5f7a4561853d5f7a41678a3c586f3d5f7a3d5f7a587ca0
+4a6a8d4a6a8d4a6a8d537499556c844561854561854a6a8d3d5f7a4561853d5f7a
+4a6a8d344e6f3336423c50723c586f4561854a6a8d41678a456185344e6f3d5f7a
+2e3c44344e6f3d5f7a30444d344d59344d59262e3530444d2e3c442f3c222a3438
+2a34382a34382b3322272c1f2a34382a34381e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b272c1f24261c1e241b
+1e241b24261c262e351e241b1e241b272c1f1e241b1e241b24261c24261c1e241b
+24261c24261c24261c1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1e241b1e241b1c1e191c1e191e241b1c1e191e241b1c1e191c1e191e241b1e241b
+1e241b1c1e191c1e191c1e191e241b24261c1e241b1e241b1c1e191c1e191e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1c1e191c1e191c1e191e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b272c1f262e351e241b272c1f
+262e35272c1f1e241b1e241b24261c1e241b1e241b1e241b1c1e19272c1f1e241b
+1c1e191e241b1e241b1e241b24261c24261c1c1e191c1e191c1e191e241b1c1e19
+1c1e191e241b24261c1c1e191c1e191e241b1c1e191e241b1e241b1e241b1e241b
+1c1e191c1e191e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b
+1e241b24261c1c1e1924261c1e241b24261c24261c1c1e191c1e191c1e191e241b
+1c1e191c1e191c1e1924261c1c1e1924261c1e241b1c1e1924261c1c1e191e241b
+24261c1c1e191e241b1e241b1c1e191e241b1e241b272c1f1e241b1e241b1e241b
+1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b
+1e241b272c1f272c1f1e241b24261c24261c24261c1c1e19272c1f24261c1e241b
+272c1f272c1f1e241b272c1f272c1f272c1f272c1f2b3322272c1f272c1f2b3322
+262e35272c1f1e241b2b33221e241b272c1f272c1f1e241b272c1f272c1f272c1f
+2b3322272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b2b33221e241b
+272c1f272c1f272c1f272c1f2f3c221e241b2b3322272c1f272c1f272c1f1e241b
+1e241b272c1f1e241b272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f
+1e241b1e241b272c1f1e241b1e241b1e241b24261c24261c24261c1e241b24261c
+272c1f24261c24261c24261c24261c24261c24261c24261c1e241b24261c24261c
+24261c24261c272c1f24261c272c1f1e241b272c1f1e241b272c1f1e241b1e241b
+272c1f272c1f272c1f272c1f24261c24261c1e241b24261c24261c272c1f24261c
+272c1f333642373e43272c1f24261c24261c272c1f272c1f24261c24261c272c1f
+24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f2b3322272c1f262e35
+24261c262e35342d1f272c1f24261c342d1f272c1f272c1f272c1f342d1f24261c
+24261c24261c272c1f342d1f272c1f272c1f24261c272c1f342d1f24261c342d1f
+272c1f24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+4a6a8d5374994a6a8d5374995374994a6a8d4a6a8d4561854a6a8d4a6a8d537499
+4a6a8d4a6a8d4561854a6a8d41678a4561855374993d5f7a4561853d5f7a3d5f7a
+4a6a8d41678a344e6f30444d41678a344e6f45618541678a4a6a8d5374993c586f
+30444d41678a3d5f7a3c586f3d5f7a3d5f7a4561853d5f7a45618541678a537499
+3d5f7a3c586f4a6a8d537499456185344e6f3d5f7a41678a4561853c586f456185
+3c586f3c586f2e3c4430444d30444d3d5f7a5374993d5f7a3d4f563c586f30444d
+2e3c4430444d344e6f262e353c586f2a34382a343830444d2a34382a34382b3322
+2f3c22262e35272c1f272c1f262e352b33221e241b272c1f1e241b1e241b1e241b
+1e241b1e241b272c1f1e241b272c1f1e241b272c1f272c1f2b3322272c1f272c1f
+272c1f272c1f1e241b1e241b1e241b272c1f1e241b1e241b1e241b24261c1e241b
+1e241b24261c24261c1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+24261c1e241b1e241b1c1e191e241b24261c24261c24261c1c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1c1e191e241b1c1e191e241b1e241b1c1e19
+1e241b1c1e191c1e191c1e191e241b24261c1c1e191e241b1e241b1c1e191e241b
+1e241b24261c2b33221e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1c1e191c1e191e241b1e241b1e241b1e241b1e241b262e351e241b1e241b1e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b262e35
+2b33221e241b272c1f1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1c1e191e241b1e241b1e241b1e241b1c1e191c1e191c1e191e241b1e241b
+1e241b1c1e1924261c24261c1c1e191e241b1e241b1e241b1e241b1c1e191c1e19
+1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1c1e1924261c24261c1e241b24261c24261c24261c1c1e191c1e19
+1c1e191c1e191c1e1924261c1e241b1c1e191e241b1c1e191e241b1c1e1924261c
+1e241b1c1e191e241b1e241b1c1e191e241b1e241b1e241b272c1f1c1e191e241b
+272c1f272c1f1e241b24261c1e241b24261c1e241b1e241b1e241b1e241b272c1f
+1e241b1e241b1e241b1e241b1e241b24261c1e241b24261c262e35272c1f272c1f
+1e241b24261c272c1f272c1f262e35272c1f272c1f2b33222b33221e241b272c1f
+2b3322272c1f1e241b2b33221e241b272c1f1e241b272c1f272c1f1e241b272c1f
+272c1f1e241b272c1f272c1f272c1f272c1f1e241b272c1f272c1f1e241b2b3322
+2b33221e241b272c1f1e241b2b3322272c1f1e241b272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f1e241b1e241b272c1f
+272c1f1e241b272c1f1e241b24261c24261c1e241b272c1f24261c24261c1e241b
+24261c272c1f24261c24261c272c1f24261c272c1f272c1f1e241b272c1f272c1f
+1e241b272c1f24261c24261c272c1f1e241b24261c1e241b2b33221e241b272c1f
+24261c1e241b1e241b24261c24261c272c1f272c1f272c1f1e241b1e241b1e241b
+24261c24261c24261c24261c24261c24261c24261c272c1f24261c24261c24261c
+24261c2b3322272c1f272c1f272c1f272c1f272c1f272c1f342d1f342d1f272c1f
+24261c262e35342d1f262e35272c1f262e3524261c24261c272c1f262e35342d1f
+262e3524261c272c1f24261c272c1f24261c272c1f272c1f262e3524261c342d1f
+272c1f24261c342d1f24261c272c1f272c1f272c1f272c1f24261c272c1f24261c
+4a6a8d5374994a6a8d4a6a8d5374994a6a8d4a6a8d41678a45618541678a456185
+53749941678a41678a45618541678a41678a5374993c586f3c586f456185344e6f
+456185344e6f30444d3c586f4a6a8d3c586f3d5f7a41678a41678a3d5f7a30444d
+3c586f4a6a8d344e6f3c5072344e6f45618541678a45618541678a41678a456185
+3d5f7a4a6a8d4a6a8d4a6a8d4561853c5072344e6f41678a3c586f3d5f7a3d5f7a
+30444d344e6f2a34382e3c4430444d41678a556c843c50723944462e3c44344e6f
+2a343830444d30444d344d59344d591e241b262e352b3322262e35272c1f262e35
+2b3322262e35272c1f1e241b262e352b3322272c1f1e241b272c1f1e241b272c1f
+24261c1e241b272c1f272c1f1e241b272c1f1e241b24261c272c1f1e241b1e241b
+1e241b1e241b272c1f1e241b272c1f1e241b1e241b24261c1e241b1e241b1e241b
+24261c24261c24261c1e241b1e241b1e241b1e241b1e241b262e351e241b1e241b
+24261c1e241b1e241b1e241b1e241b1e241b262e351e241b1e241b1e241b262e35
+1e241b1e241b1c1e191c1e191e241b1e241b1c1e191e241b1e241b1e241b1e241b
+1e241b1c1e191c1e191c1e191e241b272c1f1c1e191c1e191c1e191e241b1e241b
+1e241b1e241b1e241b272c1f1e241b1e241b1e241b1c1e191e241b1e241b1e241b
+1c1e191e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1c1e191e241b1e241b1e241b272c1f1e241b1e241b272c1f
+1e241b272c1f1e241b1e241b24261c1e241b272c1f272c1f1e241b1e241b1e241b
+1c1e191e241b1e241b1e241b1e241b1e241b1c1e191e241b1c1e191e241b1c1e19
+1c1e191c1e191c1e1924261c1e241b1e241b1e241b1c1e191c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f24261c1e241b24261c
+24261c24261c24261c1c1e1924261c24261c1e241b1c1e1924261c1e241b24261c
+1e241b24261c1e241b24261c24261c1c1e191e241b1e241b1c1e191e241b24261c
+24261c1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e19
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b272c1f
+1e241b272c1f1e241b1e241b24261c24261c24261c24261c272c1f1e241b1e241b
+272c1f272c1f1e241b2b33222b3322272c1f1e241b2b33222f3c22272c1f272c1f
+272c1f272c1f1e241b2b3322272c1f272c1f1e241b272c1f272c1f272c1f2f3c22
+2b33221e241b1e241b272c1f272c1f272c1f1e241b272c1f272c1f272c1f272c1f
+2b3322272c1f272c1f2b3322272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f1e241b1e241b
+272c1f24261c1e241b1e241b272c1f24261c24261c24261c24261c272c1f272c1f
+272c1f24261c24261c24261c24261c24261c24261c272c1f24261c272c1f24261c
+24261c24261c272c1f1e241b24261c272c1f1e241b24261c1e241b24261c24261c
+272c1f24261c1e241b272c1f1e241b24261c1e241b272c1f24261c24261c272c1f
+24261c24261c272c1f24261c24261c24261c262e35342d1f272c1f272c1f24261c
+24261c24261c272c1f24261c272c1f272c1f272c1f272c1f2b3322333522262e35
+272c1f272c1f262e35342d1f342d1f272c1f342d1f262e35342d1f262e35272c1f
+24261c272c1f24261c272c1f262e35342d1f272c1f24261c272c1f272c1f24261c
+342d1f24261c272c1f272c1f272c1f272c1f342d1f272c1f272c1f24261c272c1f
+41678a4a6a8d4a6a8d5374994a6a8d53749945618545618541678a456185456185
+4a6a8d41678a3c586f4a6a8d45618541678a4a6a8d344e6f4561853c586f30444d
+344e6f30444d344e6f344e6f3c586f30444d30444d4561853c586f344e6f344e6f
+3d5f7a3d5f7a344e6f3c507230444d4561853c586f3d5f7a45618541678a3d5f7a
+45618541678a456185456185456185344d5930444d4a6a8d3c50723c586f3c5072
+344e6f344d592e3c442e3c442e3c444a6a8d4658643336422e3c44262e35344e6f
+262e352e3c442e3c44344e6f30444d262e352a34382a34382b3322272c1f272c1f
+2b33221e241b2b3322272c1f2b33222b33221e241b1e241b272c1f1e241b272c1f
+272c1f1e241b272c1f272c1f272c1f272c1f1e241b272c1f272c1f24261c272c1f
+24261c1e241b272c1f1e241b1e241b1e241b272c1f1e241b24261c24261c1e241b
+1e241b24261c1e241b24261c1e241b24261c1e241b262e351e241b1c1e191e241b
+1e241b1e241b1e241b24261c24261c24261c1e241b1c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1c1e191c1e191e241b1e241b1c1e19
+1e241b1e241b1c1e191c1e191e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b1c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1c1e19272c1f1e241b1e241b272c1f
+1e241b272c1f1e241b1e241b2b33221e241b1e241b24261c1e241b2b33221e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b24261c1c1e1924261c1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e19
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b1e241b
+1e241b1e241b24261c1c1e1924261c24261c1e241b1c1e191e241b24261c1c1e19
+24261c24261c1e241b1c1e1924261c1c1e1924261c24261c24261c1c1e1924261c
+1e241b1c1e1924261c1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b
+1e241b272c1f272c1f1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b
+1e241b272c1f24261c1e241b24261c24261c24261c272c1f272c1f272c1f1e241b
+1e241b272c1f1e241b2b3322272c1f262e35272c1f262e352f3c22262e35272c1f
+2f3c22272c1f1e241b272c1f272c1f1e241b272c1f272c1f1e241b1e241b2b3322
+272c1f272c1f272c1f272c1f272c1f1e241b272c1f1e241b272c1f272c1f272c1f
+272c1f2b3322272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+272c1f2b3322272c1f272c1f272c1f1e241b272c1f272c1f272c1f272c1f1e241b
+272c1f272c1f272c1f1e241b272c1f1e241b272c1f24261c1e241b24261c24261c
+272c1f24261c272c1f24261c272c1f24261c272c1f272c1f272c1f24261c24261c
+1e241b24261c1e241b272c1f272c1f24261c272c1f272c1f272c1f24261c1e241b
+272c1f24261c1e241b24261c24261c272c1f24261c272c1f24261c1e241b272c1f
+272c1f24261c272c1f24261c24261c24261c24261c272c1f24261c272c1f272c1f
+24261c272c1f272c1f272c1f272c1f272c1f24261c24261c272c1f342d1f262e35
+272c1f24261c272c1f262e35272c1f262e35272c1f342d1f272c1f342d1f342d1f
+262e35272c1f24261c342d1f272c1f272c1f272c1f272c1f24261c24261c262e35
+272c1f342d1f272c1f342d1f272c1f24261c342d1f272c1f342d1f272c1f272c1f
+4a6a8d41678a41678a4a6a8d4a6a8d53749941678a3d5f7a41678a41678a41678a
+5374994a6a8d3c50724a6a8d3d5f7a4a6a8d4a6a8d344e6f4a6a8d3c50722e3c44
+30444d3336423c50723c5072344e6f333642373e433c5072344e6f30444d344e6f
+344e6f45618530444d344e6f344e6f456185344e6f4561854561854a6a8d344e6f
+41678a4561854658643d5f7a3c586f30444d3c586f4a6a8d344e6f344e6f344d59
+344e6f30444d30444d262e352e3c4441678a30444d262e35262e352e3c4430444d
+262e352e3c4430444d2e3c44262e35262e352a34382a34382a3438272c1f2a3438
+2b3322272c1f272c1f1e241b2b33222f3c22272c1f1e241b1e241b272c1f1e241b
+1e241b1e241b1e241b1e241b272c1f1e241b272c1f24261c1e241b1e241b24261c
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b262e351e241b1e241b1c1e19
+1c1e191e241b272c1f1e241b262e351e241b24261c1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b24261c24261c1e241b1e241b1e241b1c1e19262e35
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b
+24261c1c1e191e241b1c1e191e241b1e241b1c1e191c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b262e351e241b1c1e191e241b1c1e191e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b272c1f
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b262e35
+272c1f272c1f272c1f1e241b272c1f1e241b272c1f1e241b2b33222b33221e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1c1e19272c1f24261c1c1e191c1e19
+1c1e191c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b272c1f1e241b1e241b24261c
+1e241b1e241b24261c24261c1e241b1c1e1924261c1e241b1e241b1e241b272c1f
+24261c24261c1c1e1924261c1e241b24261c24261c1e241b1c1e191e241b24261c
+1c1e1924261c1e241b272c1f24261c1e241b1e241b1e241b1e241b272c1f1e241b
+272c1f1e241b24261c24261c1e241b272c1f272c1f272c1f1e241b2b33222b3322
+1e241b24261c1e241b24261c1e241b24261c24261c1e241b1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f2b33221e241b2e3c443043212b3322272c1f
+2b3322272c1f1e241b272c1f272c1f1e241b1e241b272c1f272c1f272c1f272c1f
+272c1f272c1f1e241b2b33221e241b272c1f272c1f272c1f272c1f272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f2b3322272c1f272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b272c1f24261c24261c
+24261c1e241b272c1f272c1f24261c1e241b24261c272c1f272c1f1e241b272c1f
+272c1f272c1f1e241b24261c272c1f272c1f24261c1e241b24261c24261c272c1f
+272c1f24261c1e241b272c1f1e241b24261c272c1f1e241b272c1f272c1f24261c
+24261c24261c272c1f24261c272c1f24261c272c1f24261c272c1f272c1f24261c
+24261c272c1f24261c262e35342d1f272c1f24261c272c1f24261c272c1f24261c
+272c1f272c1f24261c24261c342d1f272c1f24261c272c1f262e352b3322272c1f
+272c1f272c1f272c1f33352224261c342d1f262e35272c1f272c1f262e35262e35
+272c1f272c1f24261c262e3524261c272c1f342d1f272c1f262e35342d1f272c1f
+342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f
+4a6a8d41678a4561854a6a8d4a6a8d41678a4561853c586f3d5f7a456185456185
+41678a4561853c50724a6a8d344e6f4561853c5072344e6f3c586f2a343830444d
+30444d3336423c586f3c5072333642373e4330444d2e3c443c586f30444d344e6f
+344e6f3d5f7a2e3c442e3c44344e6f344e6f3c507241678a3d5f7a3c50723c586f
+4561853c586f3c5072456185344e6f2e3c44344e6f3d5f7a30444d373e43333642
+2a3438262e3530444d262e352e3c443c50722e3c442a3438262e35344d59262e35
+262e352e3c442a34382e3c44262e35272c1f2a34382b33221e241b262e352b3322
+272c1f272c1f1e241b272c1f272c1f1e241b272c1f272c1f1e241b1e241b272c1f
+272c1f1e241b272c1f1e241b272c1f1e241b1e241b1e241b24261c24261c1e241b
+272c1f1e241b1e241b1e241b1e241b1e241b1e241b24261c24261c1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b24261c24261c24261c24261c1e241b1e241b
+24261c24261c1e241b1e241b24261c1e241b1e241b1c1e191e241b1c1e191e241b
+1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e19
+24261c24261c1e241b1c1e191c1e191e241b1e241b1c1e191e241b272c1f1e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b1c1e191e241b
+1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f
+2b33221e241b1e241b1e241b272c1f1e241b1e241b1e241b272c1f1e241b1e241b
+1e241b1e241b1e241b272c1f1e241b1e241b1e241b24261c1e241b1e241b1e241b
+24261c1c1e191c1e1924261c24261c1c1e191e241b1c1e191e241b1e241b1e241b
+1e241b24261c1e241b1e241b272c1f1e241b272c1f272c1f272c1f1e241b1e241b
+24261c1e241b1e241b1e241b1e241b1c1e1924261c1c1e191e241b1e241b1e241b
+1e241b1c1e191c1e1924261c1e241b1e241b1e241b1e241b1c1e191c1e1924261c
+1c1e1924261c24261c1e241b1e241b1e241b24261c24261c1e241b272c1f1e241b
+1e241b272c1f1e241b24261c1e241b24261c1e241b272c1f1e241b1e241b272c1f
+1e241b272c1f1e241b24261c24261c24261c272c1f272c1f1e241b272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f1e241b2b3322272c1f2b3322262e351e241b
+2f3c221e241b272c1f1e241b272c1f1e241b1e241b1e241b272c1f1e241b272c1f
+272c1f1e241b1e241b272c1f1e241b272c1f1e241b272c1f1e241b272c1f272c1f
+2b3322272c1f272c1f272c1f272c1f2b33221e241b272c1f1e241b272c1f1e241b
+272c1f272c1f272c1f2b3322272c1f272c1f1e241b272c1f272c1f1e241b272c1f
+272c1f1e241b272c1f272c1f1e241b272c1f1e241b1e241b272c1f24261c24261c
+24261c272c1f24261c24261c24261c272c1f272c1f272c1f24261c24261c1e241b
+1e241b272c1f272c1f24261c272c1f1e241b24261c24261c1e241b272c1f1e241b
+272c1f24261c272c1f24261c24261c24261c1e241b24261c24261c272c1f24261c
+272c1f24261c272c1f2b3322262e35272c1f24261c272c1f24261c272c1f24261c
+272c1f272c1f272c1f24261c272c1f342d1f272c1f24261c272c1f2b33222b3322
+272c1f342d1f272c1f262e35272c1f272c1f272c1f24261c272c1f272c1f272c1f
+342d1f262e3524261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f
+4a6a8d4561853d5f7a4a6a8d4a6a8d4a6a8d456185344e6f4561853d5f7a4a6a8d
+4a6a8d3c586f3c507245618530444d344e6f2a3438344e6f344e6f2e3c442e3c44
+2e3c44333642394446344e6f30444d262e353336422e3c44344e6f2e3c44344e6f
+344e6f344e6f262e3533364230444d373e433c586f45618530444d344e6f344e6f
+3d5f7a344e6f3c586f41678a30444d2a3438344e6f45618530444d2e3c442a3438
+262e35262e35262e35262e35262e352e3c442e3c44262e352a343830444d2a3438
+1e241b30444d262e35272c1f1e241b2b3322262e352b33221e241b1e241b2b3322
+262e35272c1f262e351e241b272c1f272c1f1e241b1e241b272c1f1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b24261c1e241b24261c
+24261c24261c272c1f1e241b1e241b1e241b272c1f1e241b1e241b24261c1c1e19
+1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b24261c1e241b1e241b
+1e241b24261c1e241b1e241b1e241b1c1e1924261c1e241b1c1e191e241b272c1f
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b24261c
+1c1e1924261c1c1e191e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1c1e19
+1e241b1e241b1e241b272c1f1e241b272c1f1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b2b3322
+1e241b272c1f1e241b272c1f272c1f2b33221e241b2b33221e241b272c1f1e241b
+1e241b1e241b272c1f24261c1e241b1e241b1e241b24261c24261c1c1e1924261c
+1c1e191e241b1e241b1c1e191c1e191c1e191e241b1e241b1e241b1e241b1e241b
+24261c24261c1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b
+1e241b24261c1e241b24261c24261c1e241b1e241b24261c1e241b24261c1e241b
+1c1e1924261c1c1e1924261c1c1e1924261c1e241b1e241b24261c24261c24261c
+1e241b24261c24261c1e241b24261c272c1f1e241b272c1f1e241b2b33221e241b
+272c1f272c1f1e241b24261c1e241b1e241b272c1f1e241b272c1f1e241b24261c
+1e241b1e241b1e241b1e241b1e241b1e241b272c1f272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f2f3c22272c1f272c1f
+2b33221e241b272c1f1e241b272c1f272c1f1e241b272c1f272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f272c1f1e241b272c1f272c1f1e241b272c1f1e241b
+272c1f2b3322272c1f272c1f272c1f272c1f1e241b272c1f1e241b272c1f1e241b
+272c1f272c1f1e241b272c1f272c1f1e241b272c1f272c1f24261c24261c272c1f
+272c1f272c1f1e241b272c1f24261c24261c272c1f272c1f1e241b272c1f1e241b
+272c1f24261c272c1f24261c24261c1e241b272c1f24261c24261c1e241b272c1f
+24261c24261c1e241b272c1f272c1f1e241b1e241b272c1f272c1f24261c272c1f
+24261c24261c1e241b272c1f272c1f24261c272c1f1e241b24261c24261c24261c
+24261c272c1f272c1f342d1f24261c24261c272c1f272c1f272c1f272c1f24261c
+24261c24261c272c1f24261c24261c272c1f272c1f272c1f272c1f272c1f2a3438
+262e35272c1f342d1f262e35342d1f272c1f342d1f342d1f272c1f342d1f262e35
+342d1f342d1f272c1f272c1f272c1f342d1f272c1f272c1f272c1f272c1f2b3322
+272c1f24261c333522272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f
+4561854561853c586f41678a41678a4a6a8d456185344e6f4561853c50724a6a8d
+4a6a8d3c586f3c50723d5f7a30444d3c50722e3c443d5f7a344e6f30444d2a3438
+2a34382a34383336423336422e3c44262e352a343830444d344e6f2e3c442e3c44
+2e3c4430444d2a34382a343830444d2e3c443c586f3c586f373e432e3c443c586f
+344e6f2e3c4441678a3c50722e3c443336422e3c44344e6f2e3c442a34382e3c44
+1e241b262e35262e35262e35272c1f262e3530444d262e35262e352e3c442a3438
+2a34382e3c441e241b262e35262e352b33221e241b262e35272c1f272c1f272c1f
+2b3322272c1f272c1f272c1f1e241b2b33221e241b1e241b1e241b1e241b272c1f
+1e241b1e241b262e35272c1f1e241b24261c1e241b1c1e1924261c1e241b1c1e19
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b24261c1e241b
+272c1f1e241b1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b24261c
+24261c1e241b1e241b1e241b1c1e191c1e191e241b24261c1c1e191e241b24261c
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1c1e191c1e191c1e191c1e191e241b1c1e191c1e191e241b1e241b1c1e191e241b
+1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b272c1f
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b2b3322272c1f1e241b272c1f
+1e241b1e241b272c1f2f3c22272c1f1e241b1e241b2b3322272c1f1e241b1e241b
+1e241b272c1f1e241b1e241b24261c1e241b1e241b24261c24261c1e241b24261c
+24261c1c1e1924261c1e241b24261c1c1e191e241b1e241b1e241b1e241b24261c
+272c1f1e241b1e241b1e241b1e241b272c1f1e241b1e241b272c1f1e241b24261c
+1e241b1e241b1c1e191e241b24261c24261c1e241b1e241b1e241b1e241b1e241b
+24261c24261c1e241b24261c1e241b24261c24261c1e241b1e241b24261c1e241b
+24261c1e241b24261c272c1f1e241b24261c1e241b272c1f1e241b1e241b1e241b
+1e241b272c1f272c1f24261c272c1f1e241b272c1f1e241b1e241b272c1f272c1f
+1e241b272c1f24261c1e241b272c1f24261c272c1f24261c1e241b272c1f272c1f
+2b3322272c1f272c1f272c1f272c1f1e241b2b3322272c1f262e35272c1f272c1f
+272c1f272c1f272c1f1e241b272c1f272c1f1e241b272c1f1e241b1e241b272c1f
+1e241b272c1f272c1f1e241b272c1f1e241b1e241b272c1f272c1f272c1f272c1f
+272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f272c1f1e241b272c1f24261c272c1f24261c272c1f272c1f
+272c1f1e241b24261c24261c24261c1e241b24261c272c1f1e241b272c1f24261c
+1e241b24261c1e241b272c1f272c1f272c1f272c1f24261c272c1f272c1f24261c
+272c1f24261c1e241b1e241b272c1f272c1f24261c24261c24261c24261c272c1f
+24261c24261c272c1f1e241b272c1f272c1f24261c272c1f272c1f24261c24261c
+24261c1e241b272c1f272c1f272c1f24261c342d1f272c1f24261c342d1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+272c1f2b3322342d1f2b3322262e352b3322262e35272c1f262e35272c1f262e35
+272c1f24261c272c1f342d1f262e35272c1f272c1f272c1f272c1f272c1f342d1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f342d1f24261c272c1f272c1f
+3c50724561854561853c50724a6a8d41678a45618530444d4561853c5072456185
+41678a3c5072344e6f344e6f373e43373e432e3c44344e6f30444d30444d2e3c44
+262e352a34382e3c443336422e3c44262e352a343830444d30444d2e3c442a3438
+2e3c4430444d262e352e3c44344e6f344e6f3c50723336423336422e3c443d5f7a
+333642344e6f41678a2e3c442e3c442e3c442e3c4430444d2a3438262e352e3c44
+262e35272c1f272c1f262e351e241b2e3c442e3c44262e35262e35262e352e3c44
+2a34382b3322262e35272c1f262e352a3438272c1f1e241b272c1f272c1f1e241b
+1e241b272c1f1e241b272c1f1e241b272c1f1e241b272c1f1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b272c1f1e241b1e241b24261c1e241b1e241b1e241b
+1e241b24261c1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b24261c1e241b24261c1e241b1e241b1e241b
+24261c1e241b1e241b1c1e1924261c1c1e1924261c1c1e191c1e191e241b272c1f
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1c1e191c1e191c1e19
+1e241b24261c1e241b1e241b1e241b1e241b1c1e191c1e191c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b
+1e241b1e241b1c1e191e241b272c1f1e241b1e241b1e241b24261c1e241b1e241b
+272c1f1e241b1e241b1e241b1e241b262e35272c1f272c1f1e241b2b3322272c1f
+1e241b1e241b272c1f272c1f272c1f272c1f1e241b272c1f272c1f2b33221e241b
+1e241b272c1f1e241b1e241b272c1f1e241b1e241b1e241b24261c24261c1c1e19
+24261c1e241b24261c1e241b1e241b24261c24261c1e241b1e241b1e241b24261c
+1e241b24261c1e241b1e241b1e241b1e241b272c1f272c1f272c1f1e241b24261c
+1e241b1e241b1e241b24261c24261c272c1f1e241b1c1e191e241b24261c1e241b
+1e241b1e241b24261c24261c1e241b1e241b1e241b1e241b1e241b24261c1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b272c1f272c1f1e241b
+272c1f1e241b1e241b24261c1e241b1e241b1e241b272c1f1e241b1e241b272c1f
+1e241b24261c1e241b24261c1e241b1e241b24261c1e241b1e241b272c1f1e241b
+272c1f2f3c221e241b272c1f272c1f272c1f1e241b2f3c22272c1f272c1f272c1f
+272c1f1e241b272c1f272c1f1e241b1e241b272c1f272c1f272c1f1e241b272c1f
+272c1f1e241b1e241b272c1f272c1f1e241b1e241b1e241b272c1f1e241b272c1f
+272c1f2b3322272c1f272c1f272c1f1e241b272c1f1e241b272c1f272c1f1e241b
+272c1f1e241b272c1f1e241b272c1f24261c272c1f272c1f272c1f24261c24261c
+24261c272c1f24261c24261c24261c24261c272c1f24261c24261c24261c272c1f
+24261c24261c24261c24261c24261c1e241b24261c24261c24261c24261c24261c
+24261c272c1f1e241b24261c1e241b272c1f1e241b272c1f24261c272c1f24261c
+24261c272c1f24261c24261c24261c24261c24261c24261c24261c272c1f272c1f
+272c1f1e241b272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f24261c
+24261c24261c272c1f272c1f272c1f272c1f2b3322272c1f272c1f272c1f272c1f
+262e35272c1f2b3322272c1f342d1f272c1f342d1f272c1f272c1f342d1f272c1f
+272c1f342d1f262e35272c1f342d1f272c1f24261c272c1f272c1f262e352b3322
+342d1f24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f24261c272c1f
+344e6f3c50723c50723c507245618541678a3c586f2e3c4441678a3c50723c5072
+3c50723c586f344e6f2e3c44373e432a3438344e6f30444d2e3c4430444d262e35
+1e241b2e3c4430444d2a3438262e35262e352a3438344e6f2e3c44262e352e3c44
+2e3c44262e352a34382a343830444d344e6f30444d262e352a3438344e6f3c586f
+2a34383c586f41678a2a34382a34382e3c442a3438262e35262e352a34382e3c44
+262e351e241b262e35262e35262e3530444d262e351e241b262e35262e35262e35
+262e352b3322272c1f1e241b272c1f2b3322272c1f272c1f1e241b1e241b272c1f
+1e241b1e241b272c1f1e241b24261c272c1f1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b24261c24261c1e241b1e241b24261c1e241b1c1e19
+24261c1e241b24261c1e241b1e241b1e241b1e241b1e241b24261c1e241b24261c
+24261c1e241b272c1f1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b
+1e241b1e241b24261c1c1e191c1e191e241b24261c1c1e191e241b1e241b1e241b
+262e351e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b1e241b1c1e19
+1c1e191e241b24261c1c1e191e241b1e241b1e241b1e241b1e241b1e241b272c1f
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b
+1e241b272c1f1e241b1e241b1e241b272c1f1e241b1e241b1e241b24261c1e241b
+272c1f24261c1e241b1e241b1e241b1e241b272c1f1e241b1e241b2b33221e241b
+272c1f1e241b2b33221e241b272c1f1e241b2b3322272c1f272c1f1e241b272c1f
+1e241b1e241b1e241b1e241b24261c1e241b1e241b1e241b272c1f1e241b1c1e19
+24261c24261c24261c1e241b1c1e191e241b24261c1e241b1e241b1e241b24261c
+24261c1c1e191e241b1e241b1e241b1e241b272c1f272c1f1e241b1e241b1e241b
+1e241b272c1f24261c24261c24261c24261c1e241b1e241b24261c1e241b1e241b
+24261c1e241b24261c1c1e1924261c1c1e1924261c24261c24261c24261c1e241b
+24261c24261c1e241b24261c1e241b1e241b1e241b272c1f1e241b272c1f1e241b
+272c1f24261c24261c24261c1e241b24261c1e241b1e241b272c1f1e241b1e241b
+1e241b24261c272c1f24261c1e241b272c1f272c1f24261c1e241b272c1f1e241b
+272c1f272c1f272c1f2b3322272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+2b33221e241b272c1f272c1f272c1f1e241b272c1f1e241b272c1f1e241b1e241b
+272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b272c1f272c1f1e241b
+1e241b272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f272c1f1e241b272c1f24261c272c1f1e241b272c1f
+24261c272c1f24261c272c1f272c1f1e241b24261c24261c24261c24261c24261c
+272c1f24261c24261c24261c272c1f24261c272c1f24261c272c1f24261c1e241b
+272c1f272c1f1e241b272c1f24261c24261c24261c272c1f24261c24261c24261c
+24261c272c1f24261c1e241b24261c272c1f272c1f24261c272c1f1e241b24261c
+24261c24261c272c1f272c1f24261c24261c24261c272c1f24261c272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e352b3322272c1f
+272c1f272c1f262e352b33222b3322262e35272c1f272c1f24261c262e35342d1f
+262e35342d1f272c1f262e35272c1f342d1f24261c272c1f342d1f272c1f2b3322
+272c1f24261c272c1f272c1f342d1f272c1f24261c272c1f272c1f24261c272c1f
+3c50723c5072344e6f3c50723c586f4561853c586f2e3c4441678a3c586f3c5072
+3c50723c50723c50722a34382e3c442a3438344e6f30444d2a34382a34381e241b
+262e3530444d2e3c442a34382a3438262e352a3438344e6f2a3438262e35262e35
+2a34382e3c44262e35262e353336422e3c442e3c442a3438262e35344e6f344e6f
+262e353c586f3c586f262e352e3c442e3c44262e352a3438272c1f262e35262e35
+2a34381e241b262e352e3c441e241b30444d262e35262e351e241b1e241b2a3438
+262e351e241b272c1f262e352b3322262e351e241b1e241b272c1f272c1f272c1f
+262e35272c1f272c1f1e241b1e241b272c1f1e241b262e351e241b1e241b272c1f
+1e241b1e241b1e241b24261c24261c24261c24261c24261c24261c24261c1e241b
+1e241b24261c1e241b1e241b1e241b1c1e1924261c1c1e191c1e191c1e191c1e19
+24261c24261c1e241b272c1f1e241b1e241b24261c1c1e191e241b1c1e191c1e19
+24261c1c1e191c1e1924261c1c1e191c1e1924261c24261c1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b272c1f1e241b1e241b1c1e191c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f24261c24261c24261c1e241b1e241b
+272c1f1e241b1e241b1e241b1e241b272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f1e241b1e241b1e241b1e241b272c1f272c1f1e241b272c1f1e241b
+272c1f1e241b1e241b272c1f1e241b1e241b1e241b24261c24261c24261c24261c
+1c1e191e241b24261c1e241b24261c1e241b1e241b272c1f1e241b1e241b1e241b
+24261c24261c1e241b1e241b1e241b1e241b272c1f272c1f1e241b24261c1e241b
+272c1f1e241b24261c1e241b272c1f24261c1e241b24261c24261c24261c24261c
+24261c24261c1c1e1924261c24261c24261c1e241b1e241b1e241b272c1f1e241b
+1e241b272c1f1e241b2b3322272c1f1e241b272c1f272c1f1e241b272c1f1e241b
+1e241b24261c1e241b272c1f24261c24261c1e241b1e241b1e241b2b33221e241b
+24261c1e241b1e241b1e241b272c1f1e241b24261c24261c1e241b272c1f1e241b
+272c1f272c1f272c1f272c1f2b3322272c1f2b3322272c1f272c1f1e241b272c1f
+272c1f1e241b1e241b272c1f1e241b1e241b272c1f272c1f1e241b272c1f272c1f
+272c1f1e241b272c1f272c1f1e241b2b33221e241b1e241b272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f1e241b272c1f1e241b272c1f272c1f
+272c1f24261c272c1f24261c272c1f272c1f272c1f272c1f24261c24261c1e241b
+272c1f24261c272c1f24261c1e241b272c1f1e241b272c1f24261c24261c24261c
+24261c272c1f24261c24261c24261c272c1f272c1f1e241b272c1f24261c272c1f
+24261c272c1f272c1f24261c1e241b272c1f1e241b24261c272c1f272c1f24261c
+272c1f24261c1e241b272c1f24261c24261c24261c24261c272c1f24261c24261c
+272c1f272c1f272c1f24261c272c1f24261c24261c24261c272c1f272c1f24261c
+272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f342d1f342d1f272c1f262e35342d1f342d1f272c1f262e35
+272c1f262e35272c1f342d1f272c1f342d1f272c1f24261c272c1f2b3322342d1f
+272c1f342d1f272c1f272c1f272c1f272c1f272c1f24261c272c1f24261c272c1f
+3c5072344e6f3c5072456185344e6f4561853c5072344e6f4561853d5f7a344e6f
+3c50723c5072344e6f30444d2e3c442e3c4430444d2a3438262e35262e35262e35
+262e3530444d262e352e3c442a3438262e352a343830444d262e35262e352a3438
+262e352e3c44262e35262e352a34383944462a3438262e35262e352e3c44333642
+2a343845618530444d262e352e3c442a3438262e3524261c262e3530444d262e35
+272c1f1e241b2a3438262e351e241b2a34381e241b262e351e241b262e35272c1f
+272c1f272c1f262e35272c1f272c1f1e241b1e241b262e351e241b2b33221e241b
+272c1f1e241b262e351e241b272c1f1e241b1e241b272c1f1e241b1e241b1e241b
+1e241b1e241b1e241b24261c24261c1e241b24261c1c1e1924261c1e241b24261c
+24261c1e241b24261c1e241b1e241b24261c24261c24261c24261c24261c1c1e19
+24261c24261c24261c1e241b1e241b1e241b24261c1e241b24261c1e241b1e241b
+1e241b1c1e191c1e1924261c1c1e1924261c24261c1e241b1e241b24261c1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b1c1e191c1e191c1e19
+1e241b1e241b1c1e191e241b1e241b1e241b1e241b1e241b1e241b24261c24261c
+272c1f1e241b272c1f1e241b1e241b1e241b1e241b1e241b2b33221e241b272c1f
+1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b1e241b
+24261c1e241b1e241b1e241b1e241b1e241b272c1f1e241b24261c272c1f24261c
+24261c272c1f1e241b24261c2b3322272c1f272c1f2b3322272c1f1e241b272c1f
+1e241b1e241b272c1f1e241b24261c1e241b1e241b272c1f272c1f1c1e191e241b
+24261c24261c24261c1e241b24261c1e241b1e241b24261c1e241b1e241b1e241b
+24261c1e241b24261c1e241b272c1f1e241b272c1f1e241b272c1f1e241b24261c
+24261c24261c24261c1e241b272c1f1e241b1e241b24261c1e241b1e241b24261c
+24261c24261c24261c24261c1e241b272c1f1e241b1e241b1e241b24261c24261c
+1e241b1e241b272c1f2b3322272c1f1e241b272c1f272c1f1e241b1e241b272c1f
+1e241b272c1f24261c1e241b272c1f24261c24261c1e241b1e241b1e241b272c1f
+272c1f24261c272c1f24261c1e241b272c1f24261c1e241b24261c24261c272c1f
+1e241b272c1f272c1f2f3c22272c1f2b33222b3322272c1f272c1f272c1f272c1f
+1e241b272c1f1e241b1e241b272c1f272c1f1e241b272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f272c1f1e241b24261c272c1f272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f1e241b2b3322272c1f272c1f
+272c1f272c1f1e241b24261c24261c272c1f24261c272c1f272c1f24261c24261c
+272c1f24261c24261c272c1f1e241b272c1f272c1f272c1f272c1f272c1f24261c
+24261c24261c24261c24261c24261c24261c272c1f1e241b24261c24261c24261c
+272c1f1e241b272c1f24261c24261c24261c24261c24261c24261c24261c24261c
+24261c272c1f272c1f272c1f272c1f24261c1e241b24261c1e241b272c1f24261c
+24261c272c1f272c1f24261c272c1f24261c24261c24261c24261c272c1f272c1f
+272c1f272c1f272c1f24261c272c1f272c1f342d1f272c1f272c1f272c1f342d1f
+272c1f272c1f262e352b3322272c1f333522272c1f2b3322262e35342d1f262e35
+342d1f272c1f272c1f272c1f262e35272c1f333522262e35272c1f262e35342d1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f342d1f272c1f
+344e6f33364230444d3c586f344e6f3c586f344e6f30444d456185344e6f344e6f
+344e6f3944463c50723c586f30444d2e3c4430444d2a3438262e35262e35262e35
+2a34382a3438262e35333642262e3524261c262e35262e35262e351e241b2e3c44
+262e352e3c441e241b2a34382e3c4439444633364224261c262e352e3c44262e35
+30444d3c586f2e3c442e3c442a3438262e35272c1f272c1f272c1f262e352a3438
+1e241b272c1f262e351e241b1e241b2a34382a34382a34381e241b262e351e241b
+262e35272c1f1e241b272c1f262e351e241b272c1f262e351e241b272c1f1e241b
+272c1f1e241b272c1f1e241b24261c272c1f272c1f1e241b1e241b1e241b1e241b
+24261c1e241b1e241b1e241b1e241b24261c24261c24261c1c1e1924261c1e241b
+24261c1e241b1e241b1e241b24261c1e241b24261c1c1e191e241b24261c1e241b
+24261c24261c24261c1e241b1e241b1e241b272c1f1e241b1e241b1c1e191e241b
+24261c24261c1c1e1924261c1e241b24261c1c1e191e241b1c1e191e241b1e241b
+1e241b1e241b1e241b1e241b1e241b272c1f1e241b1c1e191e241b1e241b1e241b
+1e241b24261c1e241b1e241b24261c1e241b1e241b1e241b24261c1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b272c1f24261c
+1e241b272c1f1e241b1e241b1e241b1e241b272c1f24261c272c1f272c1f2b3322
+1e241b272c1f1e241b272c1f2b3322272c1f272c1f1e241b2b3322272c1f272c1f
+1e241b272c1f272c1f2b332224261c1e241b1e241b1e241b24261c24261c24261c
+1c1e191e241b24261c24261c24261c24261c24261c24261c272c1f1e241b1e241b
+24261c24261c24261c1e241b272c1f272c1f272c1f1e241b272c1f1e241b272c1f
+272c1f24261c272c1f24261c24261c24261c1e241b1e241b24261c24261c24261c
+24261c24261c24261c272c1f1e241b1e241b1e241b24261c1e241b272c1f272c1f
+1e241b1e241b272c1f272c1f272c1f272c1f1e241b272c1f1e241b1e241b1e241b
+24261c24261c272c1f24261c1e241b272c1f1e241b272c1f1e241b272c1f24261c
+1e241b1e241b272c1f272c1f272c1f272c1f1e241b272c1f1e241b1e241b272c1f
+272c1f272c1f272c1f272c1f2b3322272c1f272c1f2b3322272c1f272c1f2b3322
+1e241b272c1f1e241b272c1f272c1f272c1f272c1f272c1f1e241b272c1f272c1f
+272c1f1e241b272c1f1e241b2b33221e241b272c1f1e241b272c1f272c1f272c1f
+272c1f272c1f272c1f2b3322272c1f272c1f2b3322272c1f272c1f272c1f1e241b
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f1e241b
+2b332224261c272c1f272c1f272c1f1e241b24261c272c1f24261c272c1f272c1f
+24261c24261c24261c24261c1e241b272c1f272c1f272c1f272c1f272c1f272c1f
+24261c272c1f272c1f272c1f24261c24261c24261c24261c24261c24261c24261c
+272c1f1e241b272c1f24261c24261c272c1f272c1f24261c24261c24261c272c1f
+272c1f272c1f24261c24261c24261c272c1f272c1f24261c272c1f24261c24261c
+24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e35
+262e35342d1f272c1f262e35342d1f272c1f2b33222b3322342d1f2b3322342d1f
+262e35342d1f2b3322342d1f2b33222b3322262e35262e35342d1f272c1f262e35
+272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f
+30444d333642373e433c586f373e433c50722e3c44344e6f4561853c586f344e6f
+2e3c443336422e3c443c586f2e3c4430444d344e6f262e35262e35272c1f262e35
+2e3c442a3438262e35262e35262e35262e35333642262e352a3438262e352e3c44
+262e352a3438262e35262e352e3c442a3438262e35262e35262e35262e35262e35
+2e3c442e3c44262e3530444d2e3c441e241b262e351e241b272c1f262e352e3c44
+272c1f1e241b2b33221e241b262e35304321262e352a34382a34382f3c22272c1f
+1e241b262e35272c1f272c1f1e241b272c1f1e241b272c1f262e35262e351e241b
+262e35272c1f272c1f1e241b2b33221e241b1e241b1e241b1e241b1e241b1e241b
+1e241b1e241b1e241b1c1e1924261c1e241b262e3524261c1c1e191c1e1924261c
+24261c24261c1e241b1e241b24261c24261c24261c1e241b1e241b24261c24261c
+24261c24261c1e241b1e241b1e241b1e241b24261c262e351e241b1e241b1e241b
+1c1e1924261c24261c1c1e1924261c272c1f24261c24261c1e241b24261c272c1f
+1e241b1e241b1e241b1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b
+1e241b24261c1e241b1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b
+1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b272c1f1e241b1e241b
+24261c1e241b1e241b2b3322272c1f1e241b1e241b24261c1e241b24261c24261c
+1e241b272c1f1e241b1e241b1e241b1e241b272c1f1e241b2b3322272c1f1e241b
+272c1f272c1f1e241b272c1f2b3322272c1f1e241b2b3322272c1f272c1f272c1f
+272c1f2b33221e241b272c1f272c1f272c1f24261c272c1f272c1f24261c24261c
+24261c1e241b24261c24261c24261c24261c272c1f1e241b1e241b1e241b24261c
+24261c272c1f272c1f272c1f272c1f1e241b272c1f272c1f1e241b272c1f1e241b
+1e241b272c1f272c1f24261c272c1f272c1f24261c24261c24261c24261c272c1f
+24261c24261c24261c24261c24261c1e241b24261c1e241b272c1f1e241b272c1f
+1e241b2b3322272c1f1e241b1e241b1e241b272c1f272c1f272c1f272c1f1e241b
+2b33221e241b272c1f1e241b24261c272c1f24261c272c1f272c1f1e241b272c1f
+1e241b24261c24261c24261c272c1f272c1f24261c1e241b24261c272c1f272c1f
+1e241b272c1f2b3322272c1f2f3c222b3322272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f1e241b272c1f272c1f2b3322272c1f1e241b272c1f1e241b272c1f
+1e241b272c1f272c1f1e241b1e241b272c1f1e241b272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f2b33222b3322272c1f
+272c1f24261c272c1f24261c24261c24261c272c1f2b332224261c272c1f272c1f
+272c1f24261c272c1f1e241b272c1f272c1f24261c272c1f272c1f24261c24261c
+24261c272c1f272c1f272c1f24261c24261c24261c272c1f272c1f1e241b272c1f
+272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f24261c24261c24261c
+272c1f272c1f272c1f272c1f24261c272c1f1e241b272c1f24261c24261c1e241b
+24261c272c1f24261c24261c272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f262e35272c1f272c1f
+272c1f272c1f272c1f342d1f272c1f272c1f2a3438333522262e352b3322272c1f
+2b33222a3438262e352b3322272c1f342d1f342d1f262e35342d1f262e35272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+373e43333642344e6f3c586f3c507230444d2a3438344e6f3c586f3c507230444d
+3336422e3c442a3438344e6f2a34382e3c4430444d24261c2b3322272c1f262e35
+30444d262e35262e35262e35272c1f262e35262e35272c1f262e35262e352a3438
+2a3438262e35262e352a34382e3c44262e35262e3524261c262e35262e35262e35
+2a3438262e352e3c442e3c44262e35262e351e241b272c1f272c1f272c1f262e35
+272c1f272c1f262e351e241b262e352a34381e241b272c1f262e352a3438272c1f
+262e35272c1f262e351e241b272c1f272c1f272c1f272c1f1e241b272c1f272c1f
+1e241b272c1f272c1f1e241b272c1f1e241b272c1f1e241b1e241b24261c1e241b
+24261c1c1e1924261c24261c1e241b24261c24261c24261c24261c1c1e1924261c
+24261c1e241b272c1f24261c1e241b24261c24261c1c1e1924261c24261c24261c
+24261c272c1f1e241b1e241b24261c24261c1e241b1e241b1e241b24261c24261c
+24261c1c1e1924261c24261c24261c1c1e1924261c1e241b1e241b1e241b1e241b
+272c1f1e241b1e241b1e241b1e241b1e241b24261c1e241b1e241b1e241b1e241b
+272c1f1e241b1e241b1e241b272c1f1e241b1e241b1e241b272c1f1e241b272c1f
+1e241b1e241b1e241b1e241b272c1f1e241b1e241b1e241b1e241b1e241b24261c
+1e241b1e241b1e241b1e241b272c1f24261c24261c272c1f1e241b272c1f1e241b
+1e241b272c1f1e241b272c1f272c1f1e241b272c1f272c1f272c1f272c1f24261c
+1e241b272c1f272c1f1e241b2b3322272c1f272c1f272c1f272c1f2b3322272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f272c1f
+24261c272c1f24261c24261c272c1f1e241b24261c1e241b272c1f272c1f1e241b
+272c1f2b33221e241b272c1f272c1f272c1f2b33221e241b24261c272c1f24261c
+24261c272c1f24261c1e241b272c1f272c1f24261c1e241b24261c24261c24261c
+24261c272c1f24261c272c1f1e241b1e241b272c1f272c1f1e241b272c1f1e241b
+272c1f1e241b272c1f272c1f272c1f1e241b1e241b272c1f1e241b272c1f272c1f
+24261c24261c24261c272c1f1e241b272c1f272c1f1e241b1e241b272c1f272c1f
+1e241b272c1f272c1f2b332224261c272c1f24261c272c1f1e241b1e241b272c1f
+272c1f2b3322272c1f272c1f272c1f262e352b33222b3322272c1f272c1f2b3322
+272c1f272c1f2b33221e241b272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2b3322272c1f272c1f1e241b272c1f2b33221e241b272c1f272c1f
+272c1f2b3322272c1f272c1f272c1f272c1f2b33221e241b272c1f2b3322272c1f
+2b3322272c1f1e241b2b33222b3322272c1f2b3322272c1f272c1f272c1f24261c
+272c1f272c1f272c1f272c1f272c1f24261c272c1f272c1f272c1f272c1f272c1f
+24261c24261c24261c24261c272c1f24261c272c1f272c1f24261c272c1f24261c
+272c1f272c1f24261c24261c272c1f24261c24261c24261c272c1f24261c24261c
+24261c24261c24261c272c1f24261c272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c24261c272c1f272c1f262e35
+272c1f272c1f272c1f272c1f262e35342d1f262e3524261c342d1f342d1f272c1f
+342d1f342d1f262e35333522272c1f342d1f272c1f262e35333522272c1f2b3322
+2b3322272c1f333522262e353335222b33222b33222b3322272c1f2b3322342d1f
+2b3322342d1f272c1f342d1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+30444d262e352e3c443c586f3c507230444d2a3438344e6f3c5072344e6f2e3c44
+2a343830444d262e3530444d262e352e3c442e3c44262e35262e35272c1f262e35
+30444d2a3438272c1f262e35262e35272c1f262e35272c1f262e35262e352a3438
+262e35262e352a3438262e352a34382a34382a3438262e35262e35262e352a3438
+262e352a34382a34382a3438262e35262e35272c1f1e241b272c1f272c1f2b3322
+262e35272c1f272c1f1e241b2a34382e3c441e241b272c1f262e35272c1f1e241b
+262e352b3322272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b272c1f
+272c1f1e241b1e241b272c1f272c1f1e241b262e351e241b24261c1e241b24261c
+262e351c1e1924261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c1c1e1924261c24261c24261c24261c24261c24261c1c1e1924261c24261c
+24261c24261c24261c24261c1e241b1e241b24261c1e241b24261c24261c24261c
+24261c24261c24261c1c1e1924261c24261c1c1e1924261c24261c1e241b1e241b
+1e241b24261c24261c1e241b272c1f272c1f1e241b1e241b272c1f272c1f1e241b
+24261c24261c24261c24261c272c1f24261c24261c1e241b24261c24261c1e241b
+272c1f1e241b272c1f1e241b1e241b1e241b272c1f1e241b1e241b24261c272c1f
+272c1f1e241b1e241b272c1f1e241b272c1f1e241b272c1f1e241b24261c24261c
+1e241b1e241b1e241b1e241b272c1f1e241b24261c2b3322272c1f272c1f24261c
+272c1f2b3322272c1f272c1f2f3c222b33222b3322272c1f272c1f272c1f272c1f
+272c1f1e241b2b3322272c1f2b3322272c1f272c1f24261c272c1f1e241b272c1f
+272c1f272c1f272c1f24261c272c1f24261c2b33222b33221e241b1e241b272c1f
+1e241b272c1f272c1f1e241b2b33221e241b272c1f272c1f272c1f272c1f2b3322
+1e241b1e241b272c1f24261c272c1f24261c24261c272c1f24261c272c1f24261c
+24261c24261c24261c272c1f272c1f272c1f24261c24261c2b332224261c2b3322
+272c1f272c1f272c1f272c1f1e241b272c1f272c1f272c1f1e241b272c1f272c1f
+272c1f272c1f272c1f272c1f24261c24261c24261c272c1f24261c272c1f272c1f
+272c1f272c1f1e241b2b332224261c272c1f1e241b272c1f272c1f272c1f272c1f
+1e241b2b3322272c1f272c1f2b33222f3c22272c1f2b33222b3322272c1f272c1f
+272c1f272c1f272c1f2b33222f3c222f3c22272c1f1e241b262e35272c1f272c1f
+272c1f1e241b2b3322272c1f272c1f272c1f272c1f1e241b2b3322272c1f272c1f
+2b3322272c1f2b33222b3322262e35272c1f272c1f262e352b33222b3322272c1f
+2b33222b33222b33222b33222b3322272c1f272c1f2b3322272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f342d1f272c1f272c1f272c1f272c1f2b3322
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f272c1f
+272c1f272c1f2b3322333522272c1f272c1f272c1f272c1f272c1f272c1f2b3322
+272c1f2b3322342d1f272c1f342d1f342d1f262e35272c1f333642272c1f342d1f
+262e35272c1f262e35272c1f2b33222b33222a34382b3322262e352a34382b3322
+2a34382b3322262e353335222a34382b33222b3322262e352b33223336422b3322
+2e3c442b33222b33222a34383335222e3c442b33223335222b33222e3c442f3c22
+2a34382f3c222a34383335222b3322342d1f2b3322272c1f2b33222b33222b3322
+2e3c442e3c44344e6f3c50723c50722e3c44333642344e6f3c507230444d333642
+373e433336422a34382a34382e3c44373e432e3c44342d1f2b3322272c1f272c1f
+2e3c44333522262e35333522272c1f272c1f262e35272c1f262e35262e352a3438
+262e35262e352a3438272c1f262e35262e3530444d2a3438262e35262e352a3438
+2a3438262e35262e352e3c442e3c441e241b272c1f272c1f262e35262e352b3322
+262e35272c1f262e35272c1f2b33222e3c44262e351e241b262e35262e35272c1f
+262e35262e351e241b272c1f2b3322262e35272c1f2b3322272c1f272c1f1e241b
+272c1f262e35272c1f2a3438272c1f262e3524261c262e3524261c262e3524261c
+24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c24261c
+24261c24261c24261c333642272c1f24261c24261c24261c24261c272c1f24261c
+342d1f262e3524261c24261c262e35272c1f262e3524261c24261c24261c24261c
+24261c24261c24261c262e3524261c24261c24261c24261c24261c24261c24261c
+262e3524261c272c1f262e351e241b1e241b272c1f272c1f24261c272c1f272c1f
+272c1f24261c1e241b272c1f272c1f272c1f272c1f24261c272c1f2b3322272c1f
+2b3322272c1f262e352b33221e241b1e241b272c1f272c1f1e241b272c1f272c1f
+1e241b2b3322272c1f272c1f272c1f24261c272c1f272c1f272c1f1e241b2b3322
+272c1f2b33222b33221e241b272c1f272c1f2b33222b33222b33222b33222b3322
+2b3322272c1f272c1f272c1f2f3c222b3322272c1f2b33222b33222b33222b3322
+272c1f272c1f262e352f3c222b33222b33222b3322272c1f2b33222b3322262e35
+2b33222b3322272c1f272c1f272c1f2b33222b33222b33222b3322272c1f2b3322
+2b33222b33222b3322262e352b3322262e352f3c222b33222b3322272c1f2b3322
+2b33222b33222f3c222b33222b33222b3322272c1f272c1f272c1f272c1f342d1f
+272c1f272c1f2b33222f3c22272c1f272c1f2b33222b33222b33222f3c22262e35
+2b33222b33222b3322272c1f2b3322272c1f2b33222b33222b33222b33222b3322
+2b3322272c1f2b3322272c1f2b33222b33222b33222b33222b33222b33222b3322
+2f3c222b33222b33222b33222b33222b33222b33222b33222b3322272c1f2f3c22
+2b33222f3c222f3c222b33222f3c222f3c222f3c222f3c223043212b33222f3c22
+2f3c222b33222a34382f3c222a34382a34382f3c222b33222b33222b33222f3c22
+2f3c222b33222f3c222f3c222f3c222f3c222f3c222b33222f3c222f3c222f3c22
+2f3c222a34382f3c222f3c222f3c222f3c223043212f3c222f3c222f3c222f3c22
+2f3c222b33222e3c443043212f3c222f3c222f3c222e3c442f3c222a34382f3c22
+2e3c44333522373e432b33222f3c222f3c22373e433335223335223a44232f3c22
+2f3c222e3c442f3c222f3c222e3c443043212f3c222e3c44383c232e3c44373e43
+383c232f3c22373e432f3c222e3c442f3c22383c23373e432f3c22373e432f3c22
+373e43383c23373e433a4423373e433043213944463043213043212f3c22304321
+30432130444d354c313a442330444d3a44233944463043213a442330444d304321
+354c31354c313a44233944463944463944463f4e323a44233f4e32354c31354c31
+354c313a44233944463f4e323f4e32354c313f4e32394446354c313d573b3f4e32
+3944463f4e323d4f563f4e324e50433f4e323f4e324e50433d4f563f4e324e5043
+4658644c502646586447583249606546586456583849603254605f49603254605f
+2e3c4430444d30444d373e4339444639444630444d3c50723c50723944462e3c44
+344d592a34382e3c442e3c4430444d373e432e3c443336422e3c44333522333642
+2e3c442e3c442b33222e3c443336422b33222e3c442b33222e3c442b33222f3c22
+2b33222a34382f3c222a34382e3c442b33223944462a34382a34382a34382e3c44
+30444d2f3c222a34383336422f3c222a34382a34382b33222a34382f3c222e3c44
+2f3c222e3c442f3c222f3c222f3c222f3c222f3c222a34382f3c222b33222f3c22
+2f3c222e3c442f3c222a34383043212a34382b33222a3438373e432a34382b3322
+2a3438383c232e3c442f3c222b33222b3322262e352b3322373e43342d1f262e35
+2a34383336422a34382e3c442a34382e3c442a34383336422a3438262e35333642
+2a34382a3438333522333642333522333642373e433335223336422e3c442a3438
+373e43333642342d1f3336423335222a34382a34382e3c442e3c442a3438333642
+3336423336423335223336423335222e3c443336422e3c44333642333642333642
+3335223336422a34382e3c442f3c222e3c442a3438373e43373e432f3c22373e43
+2f3c222f3c22373e432f3c22373e432f3c223043212e3c443043212e3c442f3c22
+3043213043213043212f3c22304321373e433a442330432139444630432130444d
+30432130432139444630432130444d3a442330444d3944463a4423304321304321
+304321394446304321304321354c313944463f4e323d4f564c5026354c313d4f56
+354c31354c31354c31354c313d573b354c31354c313d573b354c31354c31354c31
+3d573b354c31354c313d573b3f4e323d4f563f4e32354c313d4f563f4e323f4e32
+3d4f564758323d4f563f4e323f4e324658644960324e50433d573b3d573b3d573b
+3d573b4960654758323d573b4960654758324960324960654b6933496065475832
+4960324658644b69334b686556603a4b693354605f4b686556603a4b686556603a
+576a62576a6256603a576a625474434b6865576a624b69334b6865576b33547443
+576a62576a62547443666c5e547443637471627444547443576a62547443637471
+627444666c5e637471627444637471627444637471627444667c74657c44597c75
+667c74657c44637471757c71667c74657c44667c746b86736b8673757c71778772
+667c747787726b86737787726b86737787727787726b8673709081709081709081
+7d90827090817d90827d90827d90827787727e98827d90827d90827d90827d9082
+7e98827d90827d90827e98828b988281a0898b988281a0897e98828b988281a089
+81a0897e988281a08981a08981a08981a08981a0898ea08992a88d8ea08992a8b6
+92a88d9ea08a9ea88e92a88d92a8b692a88d9ea88e92a8b69ea88e9ea88e9ea88e
+a0b09fa0b09fafb09e9ea88ea0b09fa0b09fa0b09fa3b7a4afb09eb0b8a3aeb0bd
+afb09eafb09ea3b7a4b0b8a3afb9bcb0b8a3afb9bcb0b8a3afb9bcb0b8a3afb9bc
+afb9bcafc0abb8c1afb8c1afb8c1afb8c3c6b8c1afb8c1afb8c3c6b8c1afb8c1af
+c0cbb8b8c3c6c0cbb8c0cbb8c0cbb8c0cbb8c0cbb8bacdd9cccdccbacdd9cccdcc
+c0cbb8cccdcccdd5decccdccd4dcd0cdd5decccdccd4dcd0cdd5decdd5decccdcc
+cdd5decdd5ded4dcd0d4dcd0d4dcd0d4dcd0d2dee6d4dcd0d4dcd0dcd6d6d4dcd0
+dfe1e6dfe1e6d4dcd0dfe1e6dfe1e6d2dee6dfe1e6d4dcd0dfe1e6e0e6e8dfe1e6
+dfe1e6e0dfc6e0e6e8e0e6e8ebeae7e0e6e8dfe1e6e0e6e8ebeae7f0f1e3ebeae7
+f0f1e3f0f1e3f0f1e3ebeae7f0f1e3f0f1e3f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9
+757c71757c71757c71757c71757c71857d67757c7184888775889b848887757c71
+8488877787727787728488877d908284888777877284888777877284888787886d
+8488878b90808b908087886d8b90808b90808488878b90808b90808b919f778772
+8b90808b98828b919f8b90808b919f8b98829da1ab8b98828b98828b98828ea089
+9ea08a8a99ab8ea0898a99ab8ea0899ea08a9da1ab8ea0899ea08a8ea0899ea08a
+9da1ab9ea88e9ea9b48ea0899da1ab9da1ab9da1ab92a88d92a88d9ea9b49ea88e
+92a8b69ea88e92a88d94afa19ea88ea0b09fa0b09fa0b09fa0b09fa0b09fa0b09f
+a0b09f9ea88eafb09e9ea9b4aba9a6a0b09fafb09ea0b09fafb09ea0b09fb0b8a3
+afb09ea0b09fafb09eb0b8a3b0b8a3afb09eb0b8a3afb09eafb09eb0b8a3afb09e
+afb09eafb09eb0b8a3b0b8a3afb09eb0b8a3b0b8a3afb9bcb0b8a3b8c1afb0b8a3
+b8c1afb8c1afb8c1afb8c1afb8c1afc1c2aec1c2aec1c2aec1c2aecfc6b8b8c1af
+c1c2aec1c2aec1c2aeb8c1afb8c1afc1c2aec1c2aec1c2aec1c2aec1c2aec1c4c7
+c1c4c7c1c4c7cfc6b8c1c4c7c0cbb8cfc6b8cccdccc0cbb8cccdcccccdccc0cbb8
+cccdcccccdcccccdccc0cbb8c1d4e2cccdcccccdcccdd5dec5dae4c0cbb8cdd5de
+cdd5decdd5decdd5dec5dae4cccdcccdd5decdd5ded4dcd0c5dae4d4dcd0d4dcd0
+d4dcd0d2dee6d4dcd0cdd5ded4dcd0d4dcd0d4dcd0d9e6ead4dcd0d2dee6d4dcd0
+d4dcd0d9e6ead9e6eae0e6e8d9e6eae0dfc6e0e6e8e0e6e8e0e6e8ebeae7f0f1e3
+e0e6e8e0e6e8ebeae7ebeae7f0f1e3e0e6e8f0f1e3d9e6eaf0f1e3f0f1e3f0f1e3
+f0f1e3ebeae7ebeae7ebeae7f0f1e3f0f1e3ebeae7f0f1e3ebeae7f0f1e3f0f1e3
+f0f1e3f0f1e3f0f1e3f5f7e9f0f1e3f0f1e3f0f1e3f5f7e9f0f1e3f0f1e3f5f7e9
+f5f7e9f0f1e3f5f7e9f5f7e9f0f1e3f5f7e9f5f7e9f5f7e9f5f7e9f0f1e3f5f7e9
+f0f1e3f5f7e9f0f1e3f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9
+f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9f5f7e9fdfdf4f5f7e9f5f7e9f5f7e9f5f7e9
+fdfdf4f5f7e9fdfdf4f5f7e9fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4f5f7e9
+f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4
+fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4fdfdf4f5f7e9fdfdf4fdfdf4fdfdf4fdfdf4
+end
+grestore
+showpage
+%%Trailer
+%%Pages: 1
+%%EOF
diff --git a/systems/doc/pdftex/samplepdftex/pic.jpg b/systems/doc/pdftex/samplepdftex/pic.jpg
new file mode 100644
index 0000000000..4ae57de469
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic.jpg
Binary files differ
diff --git a/systems/doc/pdftex/samplepdftex/pic.mps b/systems/doc/pdftex/samplepdftex/pic.mps
new file mode 100644
index 0000000000..d44fbb6eb5
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic.mps
@@ -0,0 +1,22 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -2 -2 403 252
+%%Creator: MetaPost
+%%CreationDate: 1999.09.25:1723
+%%Pages: 1
+%%EndProlog
+%%Page: 1 1
+ 0 0.6 0 setrgbcolor 0 4 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+gsave newpath 400.00008 0 moveto
+388.05362 20.69193 369.76968 36.62247 350.00008 50 curveto
+236.22455 126.98863 70.53836 127.82376 0.00008 250 curveto
+-1 1 scale stroke grestore
+ 0 2 dtransform truncate idtransform setlinewidth pop
+gsave newpath 350.00008 50 moveto
+309.8453 199.85959 97.68582 152.31425 0.00008 250 curveto
+-1 1 scale stroke grestore
+gsave newpath 350.00008 50 moveto
+195.84702 50 37.96687 108.30608 0.00008 250 curveto
+-1 1 scale stroke grestore
+showpage
+%%EOF
diff --git a/systems/doc/pdftex/samplepdftex/pic.pdf b/systems/doc/pdftex/samplepdftex/pic.pdf
new file mode 100644
index 0000000000..4f20d12a6d
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic.pdf
Binary files differ
diff --git a/systems/doc/pdftex/samplepdftex/pic.png b/systems/doc/pdftex/samplepdftex/pic.png
new file mode 100644
index 0000000000..d1b0a2e57c
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic.png
Binary files differ
diff --git a/systems/doc/pdftex/samplepdftex/pic16.png b/systems/doc/pdftex/samplepdftex/pic16.png
new file mode 100644
index 0000000000..2ba28d80cd
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/pic16.png
Binary files differ
diff --git a/systems/doc/pdftex/samplepdftex/rgb.icc b/systems/doc/pdftex/samplepdftex/rgb.icc
new file mode 100644
index 0000000000..d9c712f690
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/rgb.icc
Binary files differ
diff --git a/systems/doc/pdftex/samplepdftex/samplepdf.0 b/systems/doc/pdftex/samplepdftex/samplepdf.0
new file mode 100644
index 0000000000..9622d8d13f
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/samplepdf.0
@@ -0,0 +1,24 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -2 -2 403 252
+%%HiResBoundingBox: -1.99992 -2 402.00008 252
+%%Creator: MetaPost 0.901
+%%CreationDate: 2005.06.23:1538
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0.6 0 setrgbcolor 0 4 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+gsave newpath 400.00008 0 moveto
+388.05362 20.69193 369.76968 36.62247 350.00008 50 curveto
+236.22455 126.98863 70.53836 127.82376 0.00008 250 curveto
+-1 1 scale stroke grestore
+ 0 2 dtransform truncate idtransform setlinewidth pop
+gsave newpath 350.00008 50 moveto
+309.8453 199.85959 97.68582 152.31425 0.00008 250 curveto
+-1 1 scale stroke grestore
+gsave newpath 350.00008 50 moveto
+195.84702 50 37.96687 108.30608 0.00008 250 curveto
+-1 1 scale stroke grestore
+showpage
+%%EOF
diff --git a/systems/doc/pdftex/samplepdftex/samplepdf.1 b/systems/doc/pdftex/samplepdftex/samplepdf.1
new file mode 100644
index 0000000000..bf4ae64862
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/samplepdf.1
@@ -0,0 +1,24 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -21 30 403 260
+%%HiResBoundingBox: -20.46147 30.30342 402.00014 259.24388
+%%Creator: MetaPost 0.901
+%%CreationDate: 2005.06.23:1538
+%%Pages: 1
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+ 0 0 0.6 setrgbcolor 0 4.00002 dtransform truncate idtransform setlinewidth pop
+ [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit
+gsave newpath -18.46147 32.30774 moveto
+5.43059 32.09502 28.438 39.7596 50.00014 50.0003 curveto
+174.0918 108.93628 258.92859 251.25786 400.00014 250.00183 curveto
+[0.50769 0.86154 0.86154 -0.50769 0 0] concat stroke grestore
+ 0 2 dtransform truncate idtransform setlinewidth pop
+gsave newpath 50.00014 50.0003 moveto
+199.49663 8.51305 266.24567 215.4356 400.00014 250.00183 curveto
+[0.50769 0.86154 0.86154 -0.50769 0 0] concat stroke grestore
+gsave newpath 50.00014 50.0003 moveto
+128.26218 182.8096 258.64954 289.2285 400.00014 250.00183 curveto
+[0.50769 0.86154 0.86154 -0.50769 0 0] concat stroke grestore
+showpage
+%%EOF
diff --git a/systems/doc/pdftex/samplepdftex/samplepdf.tex b/systems/doc/pdftex/samplepdftex/samplepdf.tex
new file mode 100644
index 0000000000..8b1f69faf3
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/samplepdf.tex
@@ -0,0 +1,1295 @@
+% $Id: samplepdf.tex 749 2016-04-26 23:03:45Z karl $
+% (This samplepdf.tex file is public domain.)
+%
+% This example shows how to use pdfTeX primitives. High-level macros are
+% provided by macros packages like LaTeX or ConTeXt. We present basic
+% set of commands, extended with some more sophisticated issues (like MP
+% to PDF conversion). All the functionality other than provided by
+% pdfTeX itself is commented by default. Please follow the code below
+% and uncomment fragments you want.
+
+% Many new features has been implemented since the first release of pdfTeX. To
+% make this sample version independent, we use compatibility sections.
+
+\def\ifversion#1.#2#3#4 {% 1.20, 1.30.0 ...
+ \ifnum\pdftexversion<#1#2#3
+ \notsupported
+ \else
+ \supported
+ \fi}
+
+% to trick \if..\fi balancing
+% \def\otherwise{\else}
+% \def\endif{\fi}
+
+\def\supported{\expandafter\iftrue}
+\def\notsupported{\expandafter\iffalse}
+
+\def\feature#1.#2#3#4#{\dofeature{#1#2#3}{#1.#2#3#4}}
+\long\def\dofeature#1#2#3#4\endfeature{%
+ \ifnum#1>\pdftexversion
+ #3 not supported by this version of \pdfTeX.\par
+ \else#4\fi}
+
+\def\pdfTeX{pdf\TeX}
+\def\cs#1{{\tt\string#1}}
+\def\newpage{\null\vfill\eject}
+
+\parindent=0pt
+
+\input pdfcolor.tex % simple macros to use color with pdftex;
+ % color names derived from dvicolor.tex
+
+% Unless mentioned explicitly, the default values of new parameters
+% are: 1) zero for integer/dimension parameters; 2) empty for tokens
+% parameters.
+
+% In previous versions of pdfTeX, integer parameters took their corresponding
+% values from pdftex.cfg config file. Starting from pdfTeX 1.20, the config file
+% id not read at all. All the parameters are specified in TeX code, optionally
+% dumped into format file.
+
+\pdfoutput=1 % positive value turns on PDF output;
+ % this parameter can not be changed after the pdf
+ % output has been opened
+
+\pdfcompresslevel=0 % compression level for text and image; allowed
+ % values are 0..9;
+ % 0 = no compression
+ % 1 = fastest compression
+ % 9 = best compression
+ % 2..8 = something between
+ % numbers out of range will be fixed to the most
+ % closed allowed value. Recommended value for most
+ % cases is 6 or 7.
+
+\ifversion 1.40.0
+ \pdfobjcompresslevel=0 % having pdfTeX 1.40.0 or higher and PDF 1.5 or higher,
+ % we can also control non-stream compression level. See
+ % pdfTeX manual for details.
+\fi
+
+\pdfdecimaldigits=3 % number of digits after decimal point for real
+ % number in pdf output; the larger value the
+ % better accuracy but also larger output size;
+ % allowed range of values is 0..4
+
+%\pdfmovechars=2 % 1 turns on moving lower chars 0..32 to higher
+ % slots for fonts with last char code < 128,
+ % 2 or larger even for fonts with last char code > 127
+ % (rather obsolete)
+
+\pdfpkresolution=300 % resolution for bitmap (PK) fonts; allowed values
+ % are 72..1200, default is 600
+
+\pdfuniqueresname=0 % positive value turns on prepending unique
+ % prefix for each named resources
+ % pdftex-0.14[ef] has a bug with this feature
+ % turned on
+
+% dimension parameters
+
+\pdfhorigin=1in % horizontal origin (offset);
+ % for common purposes it is advised to use
+ % \hoffset
+
+\pdfvorigin=1in % vertical origin (offset); similar to \pdfhorigin,
+ % advised to use \voffset
+
+
+\pdfpagewidth=8.5in % paper size of the pdf output (letter in this case)
+\pdfpageheight=11in
+
+\pdflinkmargin=1pt % margin added to dimensions of link (see below)
+
+\pdfdestmargin=10pt % margin added to dimensions of destination (see
+ % below)
+
+\pdfthreadmargin=1em % margin added to dimensions of bead in article thread
+ % (see below)
+
+% tokens registers
+
+\pdfpagesattr={/MyPageAttribute /MyValue}
+ % optional attributes for the root Pages object;
+ % all pages inherit these attributes
+
+\pdfpageattr={/MyPagesAttribute /MyValue}
+ % optional attributes for individual pages;
+ % attributes specified here overwrite any
+ % attributes given by `\pdfpagesattr' (see PDF spec for details)
+
+\pdfpageresources{/MyPageResourceAttribute /MyValue}
+ % optional page resources dict content
+
+% And some more parameters that need special care.
+
+\ifversion 1.30.0 \else
+ \let\pdfforcepagebox\pdfoptionalwaysusepdfpagebox
+\fi
+
+\pdfforcepagebox=0 % a page box of PDF inclusions to be used
+ % as a clipping area. Here we use default (CropBox)
+ % \pdfforcepagebox is a shortened synonym of
+ % obsolete \pdfoptionalwaysusepdfpagebox.
+
+\ifversion 1.30.0 \else
+ \let\pdfminorversion\pdfoptionpdfminorversion
+\fi
+
+\pdfminorversion=5 % version of created PDF files and allowed PDF inclusions.
+ % The default value is 4 that is enough in most cases (PDF 1.4).
+ % However, some pdfTeX features presented here requires
+ % PDF 1.5. Starting from pdfTeX 1.30.0, the command is called
+ % \pdfminorversion.
+
+
+
+\ifversion 1.30.0 \else
+ \let\pdfinclusionerrorlevel\pdfoptionpdfinclusionerrorlevel
+\fi
+
+\pdfinclusionerrorlevel=0 % If the version of included PDF is greater than
+ % the one being typeset, by default an error is issued.
+ % If \pdfinclusionerrorlevel is set to one, warning only
+ % (synonym of obsolete \pdfoptionpdfinclusionerrorlevel).
+
+\ifversion 1.30.0
+\pdfimagehicolor=1 % enables 16-bit colors for PNG inclusions;
+ % defaults to 1 if \pdfminorversion>=5,
+\pdfimageapplygamma=1 % enables gamma correction for PNG inclusions,
+\pdfgamma=1000 % sets pdfTeX `device gamma,'
+\pdfimagegamma=2200 % sets image gamma, if can't be taken from the image itself.
+\fi % (see below for details).
+
+% Version of pdftex can be accessed via \pdftexversion and \pdftexrevision.
+
+This is version \the\pdftexversion\ (revision \pdftexrevision) of \pdfTeX.
+
+% Version of created PDF (and the highest allowed version of PDF inclusions)
+% can be controlled with \pdfminorversion. In pdfTeX versions below 1.30.0, the
+% primitive was called \pdfoptionpdfminorversion.
+
+This file is PDF version 1.\the\pdfminorversion.
+\bigskip
+
+% Font resource in the pdf output has the form
+% "/F<number> <object number> 0 R", where <number> is accessible via
+% \pdffontname and <object number> via \pdffontobjnum.
+
+Font \fontname\font\ has resource name tag
+\pdffontname\font\ and object number \pdffontobjnum\font\ in the PDF output.
+Font size is \pdffontsize\font.\par
+
+\feature 1.30.0 {Disabling ligatures}
+
+Ligatures: ffont, fint, flint\par
+{\font\noli=cmr10 at\pdffontsize\font
+ \pdfnoligatures\noli No ligatures: ffont, fint, flint}
+\bigskip
+
+\endfeature
+
+% \pdfincludechars can be used to ensure certain characters to be
+% included in the font file. Normally only used characters are
+% included (subset is created).
+
+\pdfincludechars\font{ABCDEF}
+
+% pdfTeX ignores \special's text if \pdfoutput is set, unless they have
+% prefix "pdf:" or "PDF:" (in this case the prefix is not written out, of
+% course). \pdfliteral is intended to replace \special in pdf output mode.
+
+Changing color can be done by inserting `raw' PDF code, like
+\pdfliteral direct {0 1 1 0 k} % switch color to cmyk red
+this.
+
+\special{PDF:0 g} % switch color back to black; \special can be
+ % used with prefix "pdf:" or "PDF:", optionally appended with
+ % "direct:"
+ % A `direct' keyword is optional; it ensures that what one
+ % types into \pdfliteral is inserted literally indeed.
+ % Otherwise pdfTeX moves the space origin to the place after
+ % the last types item on the page, inserts the user code and
+ % restores its internal position. It's recommended to use \pdfliteral
+ % instead of \special
+
+A simple picture:
+\pdfliteral {q 1 j 0 1 0 rg 0 0 1 RG 0 0 10 10 re B Q}
+
+% pdfTeX keeps the origin point of coordinates in the lower-left corner of the
+% page (native PDF space origin). \pdfliteral used without `direct' keyword
+% moves this position temporarily to the point user probably expect; current
+% position on the page. That is why the rectangle above appears in-line.
+% Drawing anything relative to the page origin is a bit problematic. In most
+% cases, one can't simply say `\pdfliteral direct {q <paiting operators> Q}'.
+% That is because q..Q operators can't appear inside BT..ET blocks.
+%
+% Starting from pdfTeX 1.30.0, another \pdfliteral modifier can be used instead
+% of `direct'. If the keyword is `page', pdfTeX closes internal text block with `ET'
+% before putting the literal content; like with `direct', without translation.
+
+\feature 1.30.0 {\cs\pdfliteral{ \tt page} keyword}
+...and now look at the lower-left corner of the page.\par
+\pdfliteral page {q 1 j 0 1 0 rg 0 0 1 RG 0 0 10 10 re B Q}
+\pdfliteral page {q -1 0 0 1 612 0 cm .5 g}\hfill Do you like that?\pdfliteral page {Q}
+\endfeature
+
+% Every page in PDF document has its own graphic state, automatically restored
+% by the viever application. In example, unless set explicitly, text colour at
+% the beginning of the every page is always black, regardless the text color at
+% the end of the previous page. This may be a little bit confusing for those
+% who get used to dvi output and color macros based on Postscript specials. In
+% the case of PDF, passing text colour (as well as any other graphic
+% properties) between pages requires much more care. Since normally we don't
+% know where TeX is going to break tyhe page, one probably need to use \mark(s)
+% register(s) for page-wise graphic stack, as it is in pdfcolor.tex macro input above.
+
+\feature 1.40.0 {Graphic stack}
+\def\pdfsetcolor#1{}% disable generic color support of pdfcolor.tex
+
+% pdfTeX 1.40.0 introduces graphic stack support. \pdfcolorstackinit primitive
+% introduces new graphic stack and returns its number. Here we create a
+% page-wise color stack with black as an initial stack value. \pdfcolorstack
+% command operates on graphic stacks.
+
+\chardef\Color=\pdfcolorstackinit page direct{0 g}
+default color,
+\pdfcolorstack\Color set{1 1 0 0 k}
+some new default
+\pdfcolorstack\Color push{0 1 1 0 k}
+red,
+\pdfcolorstack\Color push{1 0 1 0 k}
+green,
+\vfill\eject
+still green,
+\pdfcolorstack\Color pop
+red again,
+\pdfcolorstack\Color pop
+default again,
+\pdfcolorstack\Color set{0 g}
+back to black.
+
+\endfeature
+
+\bigskip
+
+% User-defined object can be inserted into the pdf output by \pdfobj. The
+% object is written out as specified, apart from case when \pdfobj is used with
+% "stream" option. An object created by \pdfobj is held in memory and will
+% not be written to the pdf output, unless 1) the object is referenced by
+% saying \pdfrefobj <object number>; or 2) \pdfobj is preceded by
+% \immediate. The object number of the last object created by \pdfobj is
+% accessible via \pdflastobj
+
+\pdfobj{(Hello)} % the simplest case: a string "Hello"
+\pdfrefobj \pdflastobj % mark the object to be written out; it can be
+ % understood as a reference to the object
+
+% Note, that the object you type must comply the syntax of one of PDF data
+% types (dictionary, array, string, stream, number, ...). The object created
+% with `\pdfobj{Hello}' is incorrect and may lead to parser crash. This issue
+% may not be noticed until one try to refer to the object anyhow or compress it
+% using non-zero \pdfobjectstreams.
+
+\immediate \pdfobj stream % create the object as a stream a write it to
+ {Hello} % the pdf output immediately
+
+\pdfobj stream % create the object as a stream with
+ attr {/MyStreamAttribute /MyValue} % additional attributes
+ {Hello}
+\pdfrefobj \pdflastobj
+
+\pdfobj file {obj.dat} % read the object contents from file obj.dat
+\pdfrefobj \pdflastobj
+
+\pdfobj stream % read the stream contents from file obj.dat
+ file {obj.dat}
+\pdfrefobj \pdflastobj
+
+\pdfobj stream % read the stream contents from file obj.dat
+ attr {/MyStreamAttribute /MyValue} % with additional attributes
+ file {obj.dat}
+\pdfrefobj \pdflastobj
+
+% \pdflastobj is always global, as all others \pdflast* read-only integers (see
+% below). PDF object numbers are unique within the document. One may notice, that
+% if \pdfobj is preceded by \immediate, \pdflastobj seems to return subsequent
+% values (i.e 5,6,7,8...). Since \pdfobj is not the only command that creates PDF
+% objects, one can't simply assume, that if current \pdflastobj returns 5, the
+% next one will always return 6. Thus, pdfTeX provides a forward-referencing
+% mechanism (introduced in pdfTeX 1.20).
+
+\feature 1.20 {Forward object referencing}
+
+\pdfobj reserveobjnum
+We have an access to PDF object numbers, even before defining those objects.
+\pdfobj useobjnum\pdflastobj {(This is object number \the\pdflastobj)}
+\pdfrefobj\pdflastobj
+
+\endfeature
+
+% TeX boxes can be written into so-called XObject form, which is very
+% similar to a normal page in the pdf output. Additional data can be
+% inserted to the XObject form dictionary itself as well as the Resource
+% dictionary of the XObject form
+
+\setbox0=\hbox{This is a box saved as a XObject form}
+\pdfxform
+ attr {/MyXObjectFormAttribute /MyValue}
+ resources {/MyXObjectFormResourceAttribute /MyValue}
+ 0
+
+% Similarly to \pdfobj, the object created by \pdfxform is held in memory
+% and is not written to the pdf output, unless 1) the object is referenced
+% by saying \pdfrefxform <object number>; or 2) \pdfxform is preceded by
+% \immediate. The object number of the last XObject form created
+% by \pdfxform is accessible via \pdflastxform. Note that
+% \immediate\pdfxform does not typeset anything; it just ensures that the
+% XObject form is written out to the output. To display the form, it is
+% necessary to say \pdfrefxform <object number> in the intended place.
+% Another point is that \pdfrefxform acts similarly rather to rules than to
+% boxes concerning dimensions and space setting. It's highly recommended to
+% wrap \pdfrefxform by a box in order to ensure spacing will be correct.
+
+\hbox{\pdfrefxform \pdflastxform}
+
+% Similarly to \pdflastobj, \pdflastxform returns the PDF object number assigned
+% for XObject form just created. pdfTeX also provides \pdfxformname primitive, that
+% returns a resource name identifier of the XObject written to PDF output with given
+% object number.
+
+XObject above has been written as object \the\pdflastxform.
+
+\feature 1.30.0 {Access to XObject names}
+
+Its resource name tag is \pdfxformname\pdflastxform\
+({\tt/Fm\pdfxformname\pdflastxform\ \the\pdflastxform\space 0 R}
+entry in page resources dictionary).
+
+\endfeature
+
+\bigskip
+
+% Thanks to Taco Hoekwater pdfTeX 1.30.0 and higher provides precise time
+% measuring mechanism. \pdfelapsedtime primitive returns the time elapsed from
+% the current run start. Time is measured in `scaled seconds' meaning that 65536
+% scaled seconds is 1 second. There is also \pdfresettimer primitive that causes
+% zeroing the internal clock.
+
+{\catcode`\p=12 \catcode`\t=12 \gdef\WITHOUTPT#1pt{#1}}
+ \def\withoutpt#1{\expandafter\WITHOUTPT#1} % returns float-like string
+
+\feature 1.30.0 {Precise timer}
+
+\dimen0=\pdfelapsedtime sp
+\pdfresettimer
+It took \withoutpt\the\dimen0 \ seconds to typeset the whole stuff above.
+To typeset the last two sentences it took \the\pdfelapsedtime\ `scaled seconds'
+(1s/65536).
+\bigskip
+
+\endfeature
+
+% Taco Hoekwater has also implemented random number support (introduced in 1.30.0)
+
+\feature 1.30.0 {Random numbers}
+
+Random seed initialized to \the\pdfrandomseed.
+\pdfsetrandomseed\dimen0 % just saved elapsed time
+We may change it, lets say to \the\pdfrandomseed.\par
+
+10 uniformly distributed random numbers [0..100]:
+\count100=0 \loop
+ \pdfuniformdeviate101
+ \advance\count100 by1
+ \ifnum\count100<10,
+\repeat.\par
+
+10 normally distributed random numbers:
+
+\count100=0 \loop
+ \dimen0=\pdfnormaldeviate sp
+ $\withoutpt\the\dimen0$%
+ \advance\count100 by1
+ \ifnum\count100<10,
+\repeat.\par
+
+\bigskip
+
+\endfeature
+
+% Starting from pdfTeX 1.30.0, there is an expandable string comparison in pdfTeX.
+% You can compare two strings lexicographically using \pdfstrcmp{<str1>}{<str2>}.
+% The command returns -1, 0, or 1 as a comparison result.
+% Both strings are expanded before being compared.
+% \feature 1.30.0 {String comparison}
+% \pdfstrcmp{a}{aa} returns -1 since 'a'<'aa'
+% \pdfstrcmp{aa}{aa} returns 0 since 'aa'='aa'
+% \pdfstrcmp{aaa}{abc} returns -1 since 'aaa'<'abc'
+% \pdfstrcmp{abc}{ABC} returns 1 since 'aaa'>'ABC'
+% \endfeature
+% This is still experimental, as well as regex support.
+
+% Starting from version 1.40.0 there are two handy primitives for absolute
+% values comparison. This is e-TeX however...
+% \feature 1.40.0 {Absolute \cs\if's}\fi\endfeature
+
+% Thanks to Heiko Oberdiek, starting from pdfTeX 1.30.0 a set of expandable
+% string handlers are available. \pdfescapestring converts its parameter into a
+% form readable for PDF interpreters, escaping those characters that can be used
+% in PDF string objects without quotation. Similarly, \pdfescapename converts its
+% argument into PDF name, replacing special PDF characters with their hexadecimal
+% representation preceded by `#'. \pdfescapehex takes an ASCII code of each
+% character of its argument and converts this number into hexadecimal form. Last
+% but not least, \pdfunescapehex treats each pair of characters as a hexadecimal
+% number and returns an ASCII characters of given codes. All those commands
+% expand their arguments before applying conversion.
+
+\feature 1.30.0 {PDF string handling}
+
+\def\sometext{Some text/(1)}
+If there is a text `{\tt\sometext}',\par
+in PDF string one should use {\tt(\pdfescapestring{\sometext}},\par
+and in PDF name it would be {\tt/\pdfescapename {\sometext}}.\par
+In hex form it looks like {\tt<\pdfescapehex{\sometext}>},\par
+but you can always reverse it to get {\tt\pdfunescapehex{\pdfescapehex{\sometext}}}.
+\bigskip
+
+\endfeature
+
+% Also handling external files has been greatly improved. Starting from pdfTeX 1.30.0
+% you can check external files modification date, file size and even md5 check sum.
+
+\feature 1.30.0 {External file handling}
+
+The source of this document is {\tt\pdffilesize{\jobname}} bytes long. Last modification date
+is {\tt\pdffilemoddate{\jobname}}. The md5 sum is {\tt\pdfmdfivesum{\jobname}}.
+Bytes 7 to 13 of the source are hex {\tt\pdffiledump offset 7 length 7{\jobname}}
+(string `\pdfunescapehex{\pdffiledump offset 7 length 7 {\jobname}}').
+
+\endfeature
+
+% \pdfsavepos saves coordinates of the current position (basepoint) on the page
+% relative to lower-left corner. \pdflastxpos and \pdflastypos are available
+% while shipping out the page. Both are integers; the position is expressed in
+% scaled points. Starting from pdfTeX 1.40.0, availavle also in DVI mode.
+
+\pdfsavepos
+\write16{Position: X=\number\pdflastxpos sp, Y=\number\pdflastypos sp.}
+
+\newpage
+
+% pdfTeX 1.20 and higher allows to get the object number of already typeset page
+
+\feature 1.20 {Page object reference}
+
+The previous page has been written as object \pdfpageref1.
+
+\endfeature
+
+% Images can be included with pdftex using \pdfximage. Supported formats
+% are determined by file name extension:
+% .pdf/.PDF: PDF
+% .png/.PNG: PNG
+% .jpg/.JPG/.jpeg/.JPEG: JPEG
+%
+% Sorry, TIFF files are no longer supported.
+%
+% pdfTeX itself does not support EPS and Postscript codes at all, but
+% it is possible to include Metapost output. EPS files can be converted to
+% PDF for use with pdfTeX. See below for further info about using Metapost
+% and EPS.
+
+\pdfximage {pic.pdf} % read image pic.pdf (search for it in TEXINPUTS path)
+
+% It also possible to select which page to include. Pages are numbered from
+% 1. Out-of-range values are fixed to 1 and bitmapped images have always 1
+% page. To include let's say the 2nd page of a pdf image, one can use
+% \pdfximage page 2 {file.pdf}
+
+% Similarly to \pdfobj, the image created by \pdfximage is held in memory
+% and is not written to the pdf output, unless 1) the image is referenced
+% by saying \pdfrefximage <object number>; or 2) \pdfximage is preceded by
+% \immediate. The object number of the last image created by \pdfximage is
+% accessible via \pdflastximage. Note that \immediate\pdfximage does not
+% typeset anything; it just ensures that the image is written out to the
+% output. To display the image, it is necessary to say
+% \pdfrefximage <object number> in the intended place. Another point is
+% \pdfrefximage act similarly rather to rules than to boxes concerning
+% dimensions and space setting. In order to make images act as boxes
+% (concerning dimensions and spacing), it's necessary to wrap them into a
+% box.
+
+\hbox{\pdfrefximage \pdflastximage}
+
+% Since a pdf image may have more than 1 page, the number of the last image
+% opened by \pdfximage is accessible via \pdflastximagepages
+
+The last image has \the\pdflastximagepages\ page(s).
+
+% The dimensions of the image can be also controlled via <rule spec>. The
+% default values are zero for depth and `running' for height and width. If
+% all of them are given, the image will be scaled to fit the specified
+% values. If some of them (but not all) are given, the rest will be set to
+% a value corresponding to the remaining ones so as to make the image size
+% to yield the same proportion of width : (height + depth) as the original
+% image size, where depth is treated as zero. If none of them is given then
+% the image will take its natural size. An image inserted at its natural
+% size often has a resolution of \pdfimageresolution (or 72 if
+% \pdfimageresolution is set to zero) given in dots per inch in the output
+% file, but some images may contain data specifying the image resolution,
+% and in such a case the image will be scaled to the original resolution.
+% The dimension of the image can be accessed by enclosing the \pdfrefximage
+% command to a box and checking the dimensions of the box.
+
+\pdfximage width 6cm {pic.pdf} % set the image width and keep the
+\pdfrefximage \pdflastximage % `nature' proportion width : height
+
+\pdfximage height 4cm {pic.png} % set the image height and keep the
+ % `nature' proportion width : height
+
+\edef\MyImg{\the\pdflastximage} % save the image number for later reuse
+\pdfrefximage\MyImg
+
+\pdfximage width 6cm height 4cm % set both image width and height; the
+ {pic.jpg} % final proportion width : height may be
+ % different from the `nature' one
+
+\pdfimageresolution=72 % to open an image at 72 dpi
+\pdfximage {pic.pdf}
+\setbox0=\hbox{\pdfrefximage\pdflastximage} % get dimensions of the image
+ % in order to include the image
+ % at a specific resolution
+\dimen0=.06\wd0 % calculate the image width at 1200 dpi (0.06 = 72/1200)
+\pdfximage % include the image at resolution 1200 dpi
+ width \dimen0 {pic.pdf} % by setting image width to the calculated value
+\pdfrefximage \pdflastximage
+
+% While working with bitmap graphic it might be more convenient to operate on
+% pixels rather then dimension units. Starting from version 1.30.0, pdfTeX offers
+% a special, scalable unit called `px'. The real value associated with `px' is controlled
+% via \pdfpxdimen primitive. It used to be a count register defaulted to 65536 (1pt = 1px).
+% Starting from pdfTeX 1.40.0, \pdfpxdimen is a true dimen defaulted to 1bp, that implies
+% 72dpi resolution.
+
+
+\feature 1.30.0 {Scalable {\tt px} unit}
+
+\ifversion 1.40.0
+ \pdfpxdimen=0.06bp % 1200dpi -> 72/1200
+\else
+ \pdfpxdimen=3946 % 1200dpi -> 72*65781/1200
+\fi
+
+640 pixels in 1200dpi makes \dimen0=640px \the\dimen0.
+
+\endfeature
+
+
+% ... Be aware of rounding error significant for large resolutions
+% 1200 pixels in 1200dpi makes \dimen0=1200px \the\dimen0. -> 72.25342pt < 72.27
+
+\newpage
+
+% While embedding PDF image one may decide which area of the image (mediabox,
+% cropbox, bleedbox, trimbox or artbox) should be treated as a final (visible)
+% bounding box. There is \pdfoptionalwaysusepdfpagebox parameter that specifies
+% the default behaviour (1 for mediabox, 2 for cropbox, 3 for bleedbox, 4 for
+% trimbox and 5 for artbox). For sake of backward compatibility, if set to 0
+% cropbox is used. Starting from pdfTeX 1.30.0, a synonym \pdfforcepagebox is
+% used. One may also override the default settings by providing page box
+% specification in \pdfximage syntax. In example, \pdfximage trimbox {<file>}
+% causes clipping the image to the trimbox area. Obviously, those settings take an
+% effect only if the desired box page is defined in the image being included.
+% According to PDF spec, PDF page boxes act as follows:
+% mediabox % the entire page area (the only one always present)
+% cropbox % the visible page area (defaults to mediabox)
+% bleedbox % the page area with trimming margins (defaults to cropbox)
+% trimbox % the page area without bleeds (defaults to cropbox)
+% artbox % the logical page content (defaults to cropbox)
+
+% pdfTeX takes care about version of included PDF images. By default, an error is
+% issued if this version is newer than the PDF being created (controlled by
+% \pdfminorversion). If the \pdfoptionpdfinclusionerrorlevel is set to 0, only
+% warning is issued. Starting pdfTeX 1.30.0 \pdfinclusionerrorlevel synonym is used
+% instead.
+
+% Thanks to Taco Hoekwater pdfTeX 1.30.0 and higher provides advanced PNG
+% inclusions handling. Nonzero \pdfimagehicolor parameter enables embedding
+% of PNG images with 16 bit wide color channels at their full color resolution.
+% This functionality is automatically disabled if \pdfminorversion<5, and automatically
+% enabled if \pdfminorversion>=5
+% Another primitive -- \pdfimageapplygamma -- enables gamma correction of embedded
+% PNG files on the base of two parameters:
+% \pdfgamma % device gamma for pdfTex
+% \pdfimagegamma % image gamma (used if one can't be derived from the image)
+% Both values are integers measured in promile (1000 = gamma 1.0)
+% All the parameters of gamma correction have to be set before any data
+% is written to the PDF output; thus we put them at the very beginning of this sample.
+
+% \ifx\undefined\quitvmode % primitive `\leavevmode' introduced in pdfTeX 1.30.0
+% \let\quitvmode\leavevmode
+% \fi
+
+\pdfximage width8cm {pic16.png}%
+\pdfrefximage\pdflastximage
+The image had originally 16 bits-per-channel.
+
+\feature 1.21 {Image color depth info}
+Embedded one has \the\pdflastximagecolordepth\ bits-per-channel;
+\endfeature
+
+\feature 1.30.0 {16-bit color mode for PNG inclusions}
+the image has been read in 16-bit color resolution.
+\endfeature
+
+\feature 1.30.0 {Gamma correction}
+Try out different gamma parameters. % we have to set them before any data
+\endfeature % is written to the output
+
+\bigskip
+
+% From pdfTeX 1.21 \pdfximage command can be followed by `colorspace <objnum>',
+% where <objnum> is a number of user-defined color space object. Simply speaking,
+% we may instructs the viewer, how the image should be rendered. However, this
+% works only for JPEGs. Here we perform some sort of `color management' by
+% applying a color profile to the JPEG image.
+
+% Be aware; this is viewer dependent.
+
+\feature 1.21 {User-defined image color space hook}
+
+\immediate\pdfobj
+ stream
+ attr {/N 3 /Alternate /DeviceRGB}
+ file {rgb.icc} % color profile
+
+\immediate\pdfobj{[/ICCBased \the\pdflastobj\space 0 R]}
+
+\edef\objnum{\the\pdflastobj}
+
+\pdfximage width 8cm colorspace\objnum {pic.jpg}
+\pdfrefximage\pdflastximage
+The image is calibrated with ICC profile.
+
+\immediate\pdfobj
+ stream attr
+ {/FunctionType 4
+ /Domain [0 1 0 1 0 1]
+ /Range [0 1 0 1 0 1]}{{exch pop exch pop 0 exch 0 exch}}
+
+\immediate\pdfobj % don't treat it serious %)
+ {[/DeviceN [/Red /Green /Blue] /DeviceRGB \the\pdflastobj\space 0 R]}
+
+\edef\objnum{\the\pdflastobj}
+
+\pdfximage width8cm colorspace\objnum {pic.jpg}
+\pdfrefximage\pdflastximage
+Hacked image color space.
+
+\endfeature
+
+% Thanks to Hans Hagen, pictures created by Metapost can be used directly with
+% pdftex. The following files come from ConTeXt distribution. Another
+% place to get them is http://www.tug.org/applications/pdftex/, where
+% is also possible to get the latest driver file for using LaTeX graphicx
+% package with pdftex.
+
+\input supp-mis.tex % supp-mis.tex is loaded by supp-pdf.tex
+\input supp-pdf.tex % automatically, so the above line could be left
+ % out (it's given here to make clear what all files
+ % are needed to use \convertMPtoPDF)
+
+% the figure cmr10.103 was created by running Metapost on cmr10.mf
+
+%\convertMPtoPDF {filename} {x scale} {y scale}
+%\convertMPtoPDF{cmr10.103}{1}{1}
+\newpage
+
+% It is possible to have Metapost code inside the tex sources and call
+% Metapost to generate the figure before calling \convertMPtoPDF.
+
+% define some contants that will be used in the Metapost code
+\def\pointA{(50, 50)}
+\def\pointB{(400, 250)}
+
+\newwrite\mpfile % temporary file for metapost code
+\immediate\openout\mpfile = \jobname.mp
+
+\immediate \write \mpfile {%
+prologues := 1;
+def drawleaf(expr A, B, C) =
+ pickup pencircle scaled 4bp;
+ draw (0, 0) {dir 60} .. A .. {dir 60} B withcolor C;
+ pickup pencircle scaled 2bp;
+ draw A {dir 75} .. {dir 45} B withcolor C;
+ draw A {right} .. {dir 75} B withcolor C;
+enddef;
+beginfig(0);
+ drawleaf(\pointA, \pointB, .6green);
+ d := .5 xpart \pointB;
+ currentpicture := currentpicture reflectedabout ((d, 0), (d, 1));
+endfig;
+beginfig(1);
+ drawleaf(\pointA, \pointB, .6blue);
+ currentpicture := currentpicture reflectedabout (\pointA, \pointB);
+endfig;
+end;
+}
+\immediate \closeout \mpfile % close the file before running Metapost
+
+% Now we call Metapost to generate the ps output; this is system-dependent
+% and has been tested for web2c only. It is necessary to have
+%
+% shell_escape = t
+%
+% in texmf.cnf in order to run it.
+%
+% Starting from pdfTeX 1.21a, one may test if this option is enabled using
+% \ifeof condition (distribution dependent):
+
+\feature 1.21 {Shell escape detection (via \cs{ifeof})}
+Shell escape (via \cs{ifeof}) seems to be
+\ifeof18 disabled\else enabled\fi.
+\endfeature
+
+% ...pdfTeX 1.30.0 introduces its own primitive integer flag
+
+\feature 1.30.0 {Shell escape detection (via \cs\pdfshellescape)}
+Shell escape (via \cs\pdfshellescape) seems to be
+\ifnum\pdfshellescape=2 enabled (restricted)\fi%
+\ifnum\pdfshellescape=1 enabled\fi%
+\ifnum\pdfshellescape=0 disabled\fi.
+\endfeature
+
+% Uncomment line below, if Metapost is available on your system (should be!)
+% \immediate \write 18 {mpost \jobname.mp} % call Metapost on \jobname.mp
+\convertMPtoPDF{\jobname.0}{1}{1}
+\convertMPtoPDF{\jobname.1}{1}{1}
+
+\newpage
+
+% EPS pictures cannot be inserted directly by pdfTeX, but it's possible to
+% convert them to PDF using a Postscript-to-PDF converter, like
+% Ghostscript. The below example calls epstopdf (available
+% from http://www.tug.org/applications/pdftex), which preprocess the EPS
+% and afterwards uses Ghostscript to convert to PDF.
+
+% Uncomment line below, if there is epstopdf utility available in your system
+
+%\immediate \write 18 {epstopdf --outfile=tmp.pdf cmr10.103} % call epstopdf
+\pdfximage height \vsize {tmp.pdf} % insert the PDF converted from EPS
+\topskip=0pt
+\pdfrefximage \pdflastximage
+\newpage
+
+% some text to try using threads
+
+\def\text{%
+Ah! perhaps a burning match might be some good, if she could draw it from
+the bundle and strike it against the wall, just to warm her fingers. She
+drew one out---"scratch!" how it sputtered as it burnt! It gave a warm,
+bright light, like a little candle, as she held her hand over it. It was
+really a wonderful light. It seemed to the little girl that she was sitting
+by a large iron stove, with polished brass feet and a brass ornament. How
+the fire burned! and seemed so beautifully warm that the child stretched
+out her feet as if to warm them, when, lo! the flame of the match went out,
+the stove vanished, and she had only the remains of the half-burnt match in
+her hand.
+
+ She rubbed another match on the wall. It burst into a flame, and
+where its light fell upon the wall it became as transparent as a veil,
+and she could see into the room. The table was covered with a snowy
+white table-cloth, on which stood a splendid dinner service, and a
+steaming roast goose, stuffed with apples and dried plums. And what
+was still more wonderful, the goose jumped down from the dish and
+waddled across the floor, with a knife and fork in its breast, to
+the little girl. Then the match went out, and there remained nothing
+but the thick, damp, cold wall before her.
+
+ She lighted another match, and then she found herself sitting
+under a beautiful Christmas-tree. It was larger and more beautifully
+decorated than the one which she had seen through the glass door at
+the rich merchant's. Thousands of tapers were burning upon the green
+branches, and colored pictures, like those she had seen in the
+show-windows, looked down upon it all. The little one stretched out
+her hand towards them, and the match went out.
+
+ The Christmas lights rose higher and higher, till they looked to
+her like the stars in the sky. Then she saw a star fall, leaving
+behind it a bright streak of fire. "Some one is dying," thought the
+little girl, for her old grandmother, the only one who had ever
+loved her, and who was now dead, had told her that when a star
+falls, a soul was going up to God.
+
+ She again rubbed a match on the wall, and the light shone round
+her; in the brightness stood her old grandmother, clear and shining,
+yet mild and loving in her appearance. "Grandmother," cried the little
+one, "O take me with you; I know you will go away when the match burns
+out; you will vanish like the warm stove, the roast goose, and the
+large, glorious Christmas-tree." And she made haste to light the whole
+bundle of matches, for she wished to keep her grandmother there. And
+the matches glowed with a light that was brighter than the noon-day,
+and her grandmother had never appeared so large or so beautiful. She
+took the little girl in her arms, and they both flew upwards in
+brightness and joy far above the earth, where there was neither cold
+nor hunger nor pain, for they were with God.
+}
+
+\pdfannot % generic annotation
+ %
+ width 10cm % the dimension of the annotation can be controlled
+ height 0cm % via <rule spec>; if some of dimensions in
+ depth 4cm % <rule spec> is not given, the corresponding
+ % value of the parent box will be used.
+{ %
+ /Subtype /Text % text annotation
+ % /Open true % if given then the text annotation will be opened
+ % by default
+ /Contents % text contents
+ (This text is from THE LITTLE MATCH-SELLER by Hans Christian
+ Andersen)
+}
+
+\def\colsep{\qquad} % column separator
+\setbox0=\vbox{%
+ \baselineskip=1.2em plus 1pt minus 1pt
+ \hsize=2in
+ \tolerance=1000
+ \rightskip=0pt plus 1em
+ \hfuzz=1em
+ \parskip=\baselineskip
+ \null % will use \vsplit to remove this null box and
+ % insert \splittopskip glue to top of the
+ % first column. I don't know how to make the
+ % first column have the same height as other
+ % columns so have to use this trick to ensure
+ % that all columns will have \splittopskip glue
+ % properly inserted at the top
+ \text
+ \vfil}
+
+\setbox1=\vsplit0 to 0pt % remove the null box and insert \splittopskip glue
+\setbox3=\copy0 % make a copy of box0 for later use
+
+% Using thread by explicit determination which boxes will belong to a thread
+
+\setbox2=\hbox{}
+\loop
+ \setbox1=\vsplit0 to .75\vsize
+ \setbox2=\hbox{\unhbox2 \vtop{%
+ \pdfthread % add a bead to the thread with id=`num 1' (given
+ % below)
+ % <rule spec> % dimensions of the bead can be controlled
+ % via <rule spec>; if some of dimensions in
+ % <rule spec> is not given, the corresponding
+ % value of the parent box will be used. If
+ % \pdfthreadmargin is not zero then its value
+ % will be added to the margins of the bead
+ %
+ % additional attributes of thread
+ attr {/I <</Title (THE LITTLE MATCH-SELLER by Hans Christian)>>}
+ %
+ % identifier specification (exactly one of the
+ % following must be specified):
+ %
+ num 1 % num identifier (must be positive), or
+ % name {thread1} % name identifier; \pdfthread with the same id
+ % will be joined together. Attributes of the
+ % final thread is the last one if any was
+ % given.
+ \unvbox1}\colsep}
+\ifdim \ht0 > 0pt \repeat
+\box2
+
+\newpage
+
+% Using thread by automatic determination which boxes will belong to a
+% thread; \pdfstartthread has the same syntax as \pdfthread, apart that it
+% must be followed by a \pdfendthread. \pdfstartthread and the
+% corresponding \pdfendthread must end up in vboxes with the same
+% nesting level; all vboxes between them with the same nesting level will
+% be added into the thread. Note that during output routine if there are
+% other newly created boxes which have the same nesting level as vboxes
+% containing \pdfstartthread and \pdfendthread, they will be also added
+% into the thread, which is probably not what we want. To avoid such
+% unconsidered behaviour, it's often enough to wrap the box that shouldn't
+% belong to the thread by another box to change the nesting level.
+
+\setbox0=\vbox{%
+ \pdfstartthread
+ attr {/I <</Title (THE LITTLE MATCH-SELLER by Hans Christian)>>}%
+ name {thread2}%
+ \unvbox3
+ \pdfendthread
+}
+\setbox2=\hbox{}
+\loop
+ \setbox1=\vsplit0 to .75\vsize
+ \setbox2=\hbox{\unhbox2 \vtop{\unvbox1}\colsep}
+\ifdim \ht0 > 0pt \repeat
+\box2
+
+\newpage
+
+\pdfdest % destination for link and outlines
+ %
+ % identifier specification (exactly one of the
+ % following must be specified):
+ %
+ num 1 % num identifier (must be positive), or
+ % name {dest1} % name identifier. Must be unique in one document
+ %
+ % appearance of destination (exactly one of the
+ % following must be specified):
+ %
+ fit % fit whole page in window
+ % fith % fit whole width of page
+ % fitv % fit whole height of page
+ % fitb % fit whole "Bounding Box" page
+ % fitbh % fit whole width of "Bounding Box" of page
+ % fitbv % fit whole height of "Bounding Box" of page
+ % fitr <rule spec> % fit the rectangle specified by <rule spec>; if
+ % some of dimensions in <rule spec> is not given,
+ % the corresponding value of the parent box will be
+ % used. If \pdfdestmargin is not zero then its
+ % value will be added to the margins of the
+ % rectangle
+ % xyz % goto the current position
+
+This is a page containing destination `num 1'
+
+\newpage
+
+% \pdfstartlink and \pdfendlink are similar to \pdfstartthread and
+% \pdfendthread, but they must end up in hboxes instead of vboxes
+
+\leftline{This is a link to destination
+\pdfstartlink % start a link
+ %
+ height 10pt % dimensions of the link can be controlled
+ depth 3pt % via <rule spec>; if some of dimensions in
+ % <rule spec> is not given, the corresponding
+ % value of the parent box will be used. If
+ % \pdflinkmargin is not zero then its value
+ % will be added to the margins of the link
+ %
+ attr{/C [0.9 0 0] % additional attributes of link
+ /Border [0 0 2]} %
+ %
+ % action specification (exactly one of the
+ % following must be specified):
+ %
+ goto % goto action
+ %
+ % file{file.pdf} % optional file specification; can be used only with
+ % `goto' action or `thread' action (see below). If
+ % action identifier is name then there should be a
+ % destination or a thread with same name identifier
+ % in the file; if action identifier is number then it
+ % means page number for `goto' action (in this case it
+ % will take effect as `fitb' specification) and index
+ % number of thread for `thread' action (the first
+ % thread in a document has index number 0)
+ %
+ % goto action identifier (exactly one of the following
+ % must be specified):
+ %
+ num 1 % goto destination with num identifier
+ % name{dest1} % goto destination with name identifier
+ % page 1 {/Fit} % goto page 1 and fit the whole page
+ %
+ %
+ % thread % thread action; start to read a thread
+ %
+ %file{file.pdf} % optional file specification
+ %
+ % thread action type (exactly one of the following
+ % must be specified):
+ %
+ % num 1 % read thread with num identifier id=`num 1'
+ % name{thread2} % read thread with name identifier id=`name{thread2}'
+ %
+ %
+ % user{ % user-defined action; a URI action can be specified
+ % % as below
+ % /Subtype /Link
+ % /A <<
+ % /Type /Action
+ % /S /URI
+ % /URI (http://www.tug.org/)
+ % >>}
+`num 1'%
+\pdfendlink % end of link; if \pdfstartlink and
+ % \pdfendlink end up in different hboxes (in this
+ % case the boxes must have the same box nesting
+ % level), all hboxes between them will be treated
+ % as part of the link. Line breaks and even page
+ % breaks are allowed between \pdfstartlink and
+ % \pdfendlink
+}
+
+\feature 1.40.0 {Last link object}
+The link is object \the\pdflastlink.
+\endfeature
+
+% more link examples
+
+\leftline{%
+ This is a link to the
+ \pdfstartlink
+ goto
+ page 1 {/FitB}% % goto the 1st page and fit the page BBox in the
+ % window
+ first page%
+ \pdfendlink}
+
+\leftline{%
+ This is a link to the
+ \pdfstartlink
+ thread num 1 % read the thread `num 1'
+ thread `num 1'%
+ \pdfendlink}
+
+\leftline{%
+ This is a link to
+ \pdfstartlink
+ attr{ /Border [0 0 0]} % make the bbox of the link invisible
+ user {% % a named action (undocumented in PDF spec)
+ /Subtype /Link
+ /A <<
+ /S /Named
+ /N /GoBack
+ >>}%
+ \Cyan the previous view\Black % color text inside the link
+ \pdfendlink}
+
+\leftline{%
+ This is a link to
+ \pdfstartlink user{%
+ /Subtype /Link
+ /A <<
+ /Type /Action
+ /S /URI
+ /URI (http://www.fi.muni.cz/)
+ >>}%
+ \Red our faculty\Black
+ \pdfendlink}
+
+{\hsize2in \raggedright \noindent
+ This is an example of
+ \pdfstartlink
+ attr{ /Border [0 0 0]} % make the bbox of the link invisible
+ goto page 1 {/FitB}%
+ \Red multiple line link. Make sure that the link and
+ its end must be in horizontal mode and the parent boxes must have the
+ same box nesting level.\Black
+ \pdfendlink
+ A common mistake here is using \cs{\pdfstartlink} at the
+ beginning of the text without \cs{\indent}, \cs{\noindent}
+ or \cs{\leavevmode}, so \cs{\pdfstartlink}
+ will end up in vertical mode and cause an error.
+ \par}
+
+% A sound or movie annotation can be created as below. Using such kinds of
+% annotation or Java script causes the pdf output to be system-dependent.
+% More info about this topic can be found in PDF spec.
+
+% \leftline{%
+% \pdfannot width 4in height 0in depth 3in {%
+% /Subtype /Movie
+% /Movie << /F (MovieFile.mov) >>}
+% An example of movie annotation}
+
+% \leftline{%
+% \pdfannot width 0in height 0in depth 0in {%
+% /Subtype /Sound
+% /Sound << /F (SoundFile.wav) >>}
+% An example of sound annotation}
+
+% \leftline{%
+% \pdfannot width 0in height 0in depth 0in {%
+% /Subtype /Movie
+% /Movie << /F (SoundFile.wav) >>}
+% Sound can be also embedded using Movie annotation}
+
+% outlines (bookmarks):
+\pdfoutline % outline entry specification
+ %
+ goto num 1 % action specification. This is the same as the action
+ % specification of `\pdfstartlink'
+ %
+ count 3 % number of direct subentries of this entry, 0 if this
+ % entry has no subentries (in this case it may be
+ % omitted). If after `count' follows an negative number
+ % then all subentries will be closed and the absolute
+ % value of this number specifies the number of
+ % direct subentries (see the following entries)
+ %
+ {Outline 1} % text contents of outline entry
+
+ \pdfoutline goto num 1 count -2{Outline 1.1}
+ \pdfoutline goto num 1 {Outline 1.1.1}
+ \pdfoutline goto num 1 {Outline 1.1.2}
+ \pdfoutline goto num 1 {Outline 1.2}
+ \pdfoutline goto num 1 {Outline 1.3}
+\pdfoutline goto page 1 {/Fit} {Outline 2}
+
+\newpage
+
+% Transformations are done by changing transformation matrices. See PDF spec for
+% more details how to use it. Generally, a transformation matrix is given as six
+% real numbers followed by operator `cm'. Before doing any transformation we must
+% store current graphic state (by operator `q') and restore it (by operator `Q')
+% after transformation. `q' and `Q' operators acts more or less like `gsave' and
+% `grestore' in Postscript. See examples below. Make sure that *no spacing*
+% can be produced during transformation and afterwards we must adjust spacing `by
+% hand'.
+
+\font\f=cmb10 at 50pt
+\setbox0=\hbox{\f Rotated text}
+\setbox1=\hbox{\f Scaled text}
+\setbox2=\hbox{\f Skewed text}
+
+\newdimen\d
+\newbox\tmpbox
+\def\avoidboxdimen#1{%
+ \setbox\tmpbox=\hbox{\box#1}%
+ \wd\tmpbox=0pt
+ \ht\tmpbox=0pt
+ \dp\tmpbox=0pt
+ \box\tmpbox}
+
+\hrule
+
+% rotation by `t' degrees counterclockwise is specified as
+% `cos(t) sin(t) -sin(t) cos(t) 0 0'.
+\vskip\wd0
+\leftline{\hskip\ht0\hskip\dp0%
+\pdfliteral{q 0 1 -1 0 0 0 cm}%
+\avoidboxdimen 0
+\pdfliteral{Q}}
+
+\hrule
+
+% scaling is specified as `Sx 0 0 Sy 0 0'
+\d=\ht1 \advance\d by \dp1
+\vskip3\d
+\pdfliteral{q 2 0 0 3 0 0 cm}%
+\avoidboxdimen 1
+\pdfliteral{Q}%
+
+\hrule
+
+% skewing x-axis by `u' degrees and y-axis by `v' degrees is specified as
+% `1 tan(u) tan(v) 1 0 0'.
+\d=\ht2 \advance\d by \dp2
+\vskip\d
+\d=0.57735\wd2 %tan(30) = 0.57735
+\pdfliteral{q 1 -0.57735 0 1 0 0 cm}%
+\avoidboxdimen 2
+\pdfliteral{Q}
+\vskip\d
+
+% For better understaing \pdfliteral rules, play with the transformations above using
+% `direct' and `page' modifiers. Expect surprises, including corrupted output...
+
+% One may already notice that any transformation applied to text or some other
+% page graphic object do not affect active rectangles of links and other
+% annotations. This is because those rectangles are kept in PDF as a different
+% structure then the page content. pdfTeX is not aware of any transformation
+% shown above (\pdfliteral content is not analyzed anyhow), so any annotation
+% related to the box being transformed remains untouched.
+
+% Check it out:
+% \pdfliteral{q 0.87 -0.5 0.5 0.87 0 0 cm}
+% \setbox0\hbox{\f\pdfstartlink goto page \pageno{/FitH}Link\pdfendlink}
+% \avoidboxdimen0
+% \pdfliteral{Q}
+
+% pdfTeX 1.40.0 comes with three extra primitives that fixes this problem.
+% \pdfsetmatrix primitive inserts first four numbers of the afine
+% transformation matrix into the page content stream and updates annotations
+% accordingly. \pdfsave saves the current matrix, \pdfrestore restores the
+% previously saved matrix.
+\hrule height 0pt depth 0pt width 0pt
+\bigskip
+
+\feature 1.40.0 {Saving/restoring transformation matrix}
+
+\setbox0\hbox{\f\pdfstartlink goto page \pageno{/FitH}Link\pdfendlink}
+\pdfsave
+\pdfsetmatrix{0.87 -0.5 0.5 0.87}
+\avoidboxdimen0
+\pdfrestore
+
+\endfeature
+
+% To have a smoothly readable PDF output one may use a newline character to
+% separate entries written directly do PDF code. No matter for the viewer.
+
+\def\n{^^J}
+
+% If the file is modified are released oftenly (as this one) it might be convenient to
+% keep trace of modification time. In pdfTeX 1.30.0 there is a
+% \pdfcreationdate that returns a date of the file being created.
+% Date is formated in PDF way.
+
+\ifversion 1.30.0 \else
+
+\count100=\time
+\divide\count100 by60
+\edef\pdfcreationdate{\ifnum\count100<10 0\fi\the\count100} % hours
+\multiply\count100 by-60
+\advance\count100 by\time
+\edef\pdfcreationdate{%
+ \pdfcreationdate
+ \ifnum\count100<10 0\fi\the\count100 00} % minutes (seconds zeroed)
+\edef\pdfcreationdate{%
+ D:\the\year
+ \ifnum\month<10 0\fi\the\month
+ \ifnum\day<10 0\fi\the\day
+ \pdfcreationdate} % time zone discarded
+
+\fi
+
+\pdfinfo{% % Info dictionary of PDF output;
+ % all keys are optional.
+ /Author (Han The Thanh)
+ \n/CreationDate (D:20001212000000) % (D:YYYYMMDDhhmmss)
+ % YYYY year
+ % MM month
+ % DD day
+ % hh hour
+ % mm minutes
+ % ss seconds
+ %
+ % default: the actual date
+ %
+ \n/ModDate (\pdfcreationdate) % ModDate is similar
+ \n/Creator (TeX) % default: "TeX"
+ \n/Producer (pdfTeX) % default: "pdfTeX" + pdftex version
+ \n/Title (samplepdf.pdf) %
+ \n/Subject (Example) %
+ \n/Keywords (PDF TeX) %
+}
+
+\pdfcatalog{ % Catalog dictionary of PDF output.
+ /PageMode /UseOutlines %
+ /URI (http://www.fi.muni.cz/) %
+% pdfscreen-like setting might look like:
+% /PageMode /none
+% /ViewerPreferences <<
+% /HideToolbar true
+% /HideMenubar true
+% /HideWindowUI true
+% /FitWindow true
+% /CenterWindow true
+% >>
+}
+openaction goto page 1 {/Fit} % the action to be activated when
+ % opening the document; this is the
+ % same as <action spec> for links
+ % and outlines
+\end
diff --git a/systems/doc/pdftex/samplepdftex/supp-mis.tex b/systems/doc/pdftex/samplepdftex/supp-mis.tex
new file mode 100644
index 0000000000..ab089a297e
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/supp-mis.tex
@@ -0,0 +1,695 @@
+%D \module
+%D [ file=supp-mis,
+%D version=2004.10.26, % 1997.01.04,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Missing (For Generic Use),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Some support modules are more or less independant. This
+%D module, which is not part of plain \CONTEXT, provides the
+%D missing macros and declarations of registers.
+
+\ifx \undefined \writestatus \else \expandafter \endinput \fi
+
+%D Because \LATEX\ has no safe package loading mechanism, we
+%D need to take care of possible interference.
+
+\def\StartLatexHack
+ {\edef\StopLatexHack
+ {\catcode`\noexpand/=\the\catcode`/
+ \catcode`\noexpand:=\the\catcode`:
+ \catcode`\noexpand;=\the\catcode`;
+ \catcode`\noexpand"=\the\catcode`"
+ \catcode`\noexpand<=\the\catcode`<
+ \catcode`\noexpand>=\the\catcode`>}%
+ \catcode`/=12 \catcode`:=12 \catcode`;=12
+ \catcode`"=12 \catcode`<=12 \catcode`>=12 }
+
+%D This hack is needed especially for \LATEX\ users who use
+%D the Babel package. The Germans have active \type {"}'s, the
+%D Poles have \type {/}, while the French have \type {:} and
+%D \type {;} defines as command (thanks to Daniel Flipo for
+%D pointing that out and testing). Potentially active \type
+%D {?}'s and \type {!}'s are less dangerous since they are
+%D handled by the \type {\protect} and \type {\unprotect}
+%D macros.
+
+\StartLatexHack
+
+%D \macros
+%D {ifnocontextobject}
+%D
+%D First we take care of redundant defining. The next set of
+%D macros are a bit complicated by the fact that Plain
+%D \TEX\ defines the \type{\new}||macros as being outer.
+%D Furthermore nested \type{\if}'s can get us into
+%D trouble.
+
+\def\definecontextobject
+ {\iftrue}
+
+\def\gobblecontextobject
+ {\setbox0\hbox
+ \bgroup
+ \long\def\gobblecontextobject##1\fi{\egroup}%
+ \expandafter\gobblecontextobject\string}
+
+\long\def\ifnocontextobject#1\do
+ {\ifx#1\undefined
+ \expandafter\definecontextobject
+ \else
+ %\writestatus{system}{beware of conflicting \string#1}%
+ \expandafter\gobblecontextobject
+ \fi}
+
+%D \macros
+%D {beginETEX,beginTEX}
+%D
+%D Outside \CONTEXT\ we will not be \ETEX||aware.
+
+\long\def\beginETEX #1\endETEX {}
+\long\def\beginOMEGA#1\endOMEGA{}
+
+\let\beginTEX\relax \let\endTEX\relax
+
+%D \macros
+%D {writestatus}
+%D
+%D We start each module with a message. Normally the output is
+%D formatted, but here we keep things simple.
+
+\ifnocontextobject \writestatus \do
+
+ \def\writestatus#1#2%
+ {\immediate\write16{#1 : #2}}
+
+\fi
+
+%D Let's see if it works.
+
+\writestatus{loading}{Context Support Macros / Miscellaneous (2004.10.26)}
+
+%D \macros
+%D {protect,unprotect}
+%D
+%D Next we present a poor mans alternative for \type{\protect}
+%D and \type{\unprotect}, two commands that enable us to use
+%D the characters \type{@}, \type{!} and \type{?} in macro
+%D names.
+
+\ifnocontextobject \protect \do
+
+ \let\protect\relax
+
+\fi
+
+\newcount\protectiondepth
+
+\ifnocontextobject \unprotect \do
+
+ \def\unprotect
+ {\advance\protectiondepth 1
+ \ifnum\protectiondepth=1
+ \let\normalprotect=\protect
+ \def\protect
+ {\ifnum\protectiondepth>0
+ \advance\protectiondepth -1
+ \ifnum\protectiondepth=0
+ \doprotect
+ \let\protect=\normalprotect
+ \fi
+ \fi}
+ \edef\doprotect
+ {\catcode`\noexpand @=\the\catcode`@\relax
+ \catcode`\noexpand !=\the\catcode`!\relax
+ \catcode`\noexpand ?=\the\catcode`?\relax}
+ \catcode`@=11
+ \catcode`!=11
+ \catcode`?=11
+ \fi}
+
+\fi
+
+%D We start using this one it at once.
+
+\unprotect
+
+%D \macros
+%D {scratch...,if...,next...}
+%D
+%D We need some scratch registers. Users are free to use them,
+%D but can never be sure of their value once another macro is
+%D called. We only allocate things when they are yet
+%D undefined. This way we can't mess up other macro packages,
+%D but of course previous definitions can mess up our modules.
+
+\ifnocontextobject \donetrue \do \newif\ifdone \fi
+
+% no time now, will do a better test later (based on dimendef)
+
+\def\!!stringa{plain} \ifx\!!stringa\fmtname \donetrue \else
+\def\!!stringa{babel-plain} \ifx\!!stringa\fmtname \donetrue \else
+ \donefalse \fi \fi
+
+\ifdone
+ % plain defines some 15 dimens, so we need to define a few
+ % dummies in order to get out of the scratch area
+ \newdimen\scratchdimen % 16
+ \newdimen\scratchdimen % 17
+ \newdimen\scratchdimen % 18
+ \newdimen\scratchdimen % 19
+ \newdimen\scratchdimen % 20
+ \newdimen\scratchdimen % 21
+\fi
+
+\ifnocontextobject \scratchcounter \do \newcount \scratchcounter \fi
+\ifnocontextobject \scratchtoks \do \newtoks \scratchtoks \fi
+\ifnocontextobject \scratchdimen \do \newdimen \scratchdimen \fi
+\ifnocontextobject \scratchskip \do \newskip \scratchskip \fi
+\ifnocontextobject \scratchmuskip \do \newmuskip \scratchmuskip \fi
+\ifnocontextobject \scratchbox \do \newbox \scratchbox \fi
+\ifnocontextobject \scratchread \do \newread \scratchread \fi
+\ifnocontextobject \scratchwrite \do \newwrite \scratchwrite \fi
+
+%D Watch out, in the past we ran into troubles with \type {\onepoint}
+%D (and others) mening something different in \LATEX\ then here. In
+%D such situations clashes are bound to happen. For this reason the
+%D assignments are no inside the test. We try to catch those situations
+%D but we cannot keep ahead of teh future.
+
+\ifnocontextobject \zeropoint \do \newdimen \zeropoint \zeropoint = 0pt \fi % else problems with dimen12
+\ifnocontextobject \onepoint \do \newdimen \onepoint \onepoint = 1pt \fi
+\ifnocontextobject \onebasepoint \do \newdimen \onebasepoint \onebasepoint = 1bp \fi
+\ifnocontextobject \zerocount \do \chardef \zerocount = 0 \fi
+\ifnocontextobject \plusone \do \chardef \plusone = 1 \fi
+\ifnocontextobject \minusone \do \newcount \minusone \minusone = -1 \fi
+\ifnocontextobject \thousandpoint \do \newdimen \thousandpoint \thousandpoint = 1000pt \fi
+\ifnocontextobject \onerealpoint \do \newdimen \onerealpoint \onerealpoint = 1pt \fi % latex has a funny \onepoint
+
+\ifnocontextobject \emptytoks \do \newtoks \emptytoks \fi
+\ifnocontextobject \nextbox \do \newbox \nextbox \fi
+\ifnocontextobject \nextdepth \do \newdimen \nextdepth \fi
+
+\ifnocontextobject \CONTEXTtrue \do \newif\ifCONTEXT \fi
+\ifnocontextobject \eightbitcharacterstrue \do \newif\ifeightbitcharacters \fi
+\ifnocontextobject \MPdrawingdonetrue \do \newif\ifMPdrawingdone \fi
+
+\ifnocontextobject \ifzeropt \do \let\ifzeropt\ifcase \fi
+
+%D \macros
+%D {@@...}
+%D
+%D We use symbolic name for \CATCODES. They can only be used
+%D when we are in unprotected state.
+
+\ifnocontextobject \@@escape \do \chardef\@@escape = 0 \fi
+\ifnocontextobject \@@begingroup \do \chardef\@@begingroup = 1 \fi
+\ifnocontextobject \@@endgroup \do \chardef\@@endgroup = 2 \fi
+\ifnocontextobject \@@endofline \do \chardef\@@endofline = 5 \fi
+\ifnocontextobject \@@ignore \do \chardef\@@ignore = 9 \fi
+\ifnocontextobject \@@space \do \chardef\@@space = 10 \fi
+\ifnocontextobject \@@letter \do \chardef\@@letter = 11 \fi
+\ifnocontextobject \@@other \do \chardef\@@other = 12 \fi
+\ifnocontextobject \@@active \do \chardef\@@active = 13 \fi
+\ifnocontextobject \@@comment \do \chardef\@@comment = 14 \fi
+
+\def\s!sp{sp}
+\def\s!pt{pt}
+\def\s!bp{bp}
+
+%D \macros
+%D {@EA,expanded,expandoneargafter,expandtwoargsafter}
+%D
+%D Also needed:
+
+\let\@EA=\expandafter \let\@@expanded\empty
+
+\def\expanded#1%
+ {\long\xdef\@@expanded{\noexpand#1}\@@expanded}
+
+\def\expandoneargafter#1#2%
+ {\@EA#1\@EA{#2}}
+
+\def\expandtwoargsafter#1#2#3%
+ {\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA{#3}}
+
+\def\@EAEAEA{\@EA\@EA\@EA}
+
+%D \macros
+%D {everyline,EveryLine,EveryPar}
+%D
+%D In \CONTEXT\ we use \type{\everypar} for special purposes
+%D and provide \type{\EveryPar} as an alternative. The same
+%D goes for \type{\everyline} and \type{\EveryLine}.
+
+\ifnocontextobject \everyline \do \newtoks\everyline \fi
+\ifnocontextobject \EveryPar \do \let\EveryPar =\everypar \fi
+\ifnocontextobject \EveryLine \do \let\EveryLine=\everyline \fi
+
+%D \macros
+%D {globallet}
+
+\def\globallet{\global\let}
+
+%D \macros
+%D {!!...}
+%D
+%D We reserve ourselves some scratch strings (i.e. macros)
+%D and some more counters.
+
+\ifnocontextobject \!!stringa \do \def\!!stringa {} \fi
+\ifnocontextobject \!!stringb \do \def\!!stringb {} \fi
+\ifnocontextobject \!!stringc \do \def\!!stringc {} \fi
+\ifnocontextobject \!!stringd \do \def\!!stringd {} \fi
+
+\ifnocontextobject \!!counta \do \newcount\!!counta {} \fi
+\ifnocontextobject \!!countb \do \newcount\!!countb {} \fi
+
+%D \macros
+%D {!!...}
+%D
+%D The next set of definitions speed up processing a bit.
+%D Furthermore it saves memory.
+
+\ifnocontextobject \!!zeropoint \do \def\!!zeropoint {0pt} \fi
+\ifnocontextobject \!!zerocount \do \def\!!zerocount {0} \fi
+\ifnocontextobject \!!tenthousand \do \def\!!tenthousand {10000} \fi
+
+\ifnocontextobject \!!width \do \def\!!width {width} \fi
+\ifnocontextobject \!!height \do \def\!!height {height} \fi
+\ifnocontextobject \!!depth \do \def\!!depth {depth} \fi
+
+\ifnocontextobject \!!plus \do \def\!!plus {plus} \fi
+\ifnocontextobject \!!minus \do \def\!!minus {minus} \fi
+\ifnocontextobject \!!to \do \def\!!to {to} \fi
+
+%D \macros
+%D {smashbox}
+%D
+%D The system modules offer a range of smashing macros, of
+%D which we only copied \type{\smashbox}.
+
+\ifnocontextobject \smashbox \do
+
+ \def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\fi
+
+%D \macros
+%D {dowithnextbox}
+%D
+%D Also without further comment, we introduce a macro that
+%D gets the next box and does something usefull with it.
+%D Because the \type{\afterassignment} is executed inside the
+%D box, we have to use a \type{\aftergroup} too.
+
+\ifnocontextobject \dowithnextbox \do
+
+ \def\dowithnextbox#1%
+ {\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+ \def\dododowithnextbox%
+ {\aftergroup\dodowithnextbox}
+
+\fi
+
+%D \macros
+%D {setvalue,setevalue,setxvalue,,setgvalue,
+%D getvalue,
+%D letvalue,letgvalue}
+%D
+%D The next two macros expand their argument to
+%D \type{\argument}. The first one is used to define macro's
+%D the second one executes them.
+
+\ifnocontextobject \setvalue \do
+
+ \def\setvalue #1{\expandafter\def\csname#1\endcsname}
+ \def\setevalue#1{\expandafter\edef\csname#1\endcsname}
+ \def\setgvalue#1{\expandafter\gdef\csname#1\endcsname}
+ \def\setxvalue#1{\expandafter\xdef\csname#1\endcsname}
+ \def\getvalue #1{\csname#1\endcsname}
+ \def\letvalue #1{\expandafter\let\csname#1\endcsname}
+ \def\letgvalue#1{\global\expandafter\let\csname#1\endcsname}
+\fi
+
+%D \macros
+%D {unexpanded}
+%D
+%D The next command can be used as prefixed for commands that
+%D need protection during tests and writing to files. This
+%D is a very \CONTEXT\ specific one.
+
+\ifnocontextobject \unexpanded \do
+
+ \let\unexpanded\relax
+
+\fi
+
+%D \macros
+%D {convertargument}
+%D
+%D The original one offers a bit more, like global assignment, the
+%D the next implementation is however a bit more byte saving.
+
+\ifnocontextobject \convertargument \do
+
+ \def\doconvertargument#1>{}
+
+ \long\def\convertargument#1\to#2%
+ {\long\def\convertedargument{#1}%
+ \edef#2{\expandafter\doconvertargument\meaning\convertedargument}}
+
+\fi
+
+%D \macros
+%D {forgetall}
+%D
+%D Sometimes we have to disable interference of whatever kind
+%D of skips and mechanisms. The next macro resets some.
+
+\ifnocontextobject \forgetall \do
+
+ \def\forgetall
+ {\parskip\zeropoint
+ \leftskip\zeropoint
+ \parindent\zeropoint
+ \everypar{}}
+
+\fi
+
+%D \macros
+%D {withoutpt,
+%D ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D \TEX\ lacks some real datastructure. We can however use
+%D \DIMENSIONS. This kind of trickery is needed when we want
+%D \TEX\ to communicate with the outside world (by means of
+%D \type{\specials}).
+
+\ifnocontextobject \withoutpt \do
+
+ {\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+ \def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+ \def\ScaledPointsToBigPoints#1#2%
+ {\scratchdimen=#1sp\relax
+ \scratchdimen=.996264\scratchdimen
+ \edef#2{\withoutpt{\the\scratchdimen}}}
+
+ \def\ScaledPointsToWholeBigPoints#1#2%
+ {\scratchdimen=#1sp
+ \scratchdimen=.996264\scratchdimen
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by 32768
+ \divide\scratchcounter by 65536
+ \edef#2{\the\scratchcounter}}
+
+\fi
+
+%D \macros
+%D {doprocessfile}
+%D
+%D This macro takes three arguments: the file number, the
+%D filename and a macro that handles the content of a read
+%D line.
+
+\newif\iffileprocessed
+
+\ifnocontextobject \doprocessfile \do
+
+ \def\doprocessfile#1#2#3%
+ {\openin#1=#2\relax
+ \ifeof#1%
+ \fileprocessedfalse
+ \closein#1\relax
+ \else
+ \fileprocessedtrue
+ \gdef\dofinishfile%
+ {\closein#1\relax
+ \global\let\doprocessline\relax}%
+ \gdef\doprocessline%
+ {\ifeof#1%
+ \dofinishfile
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \expandafter\doprocessline
+ \fi}%
+ \expandafter\doprocessline
+ \fi}
+
+\fi
+
+%D \macros
+%D {uncatcodespecials}
+%D
+%D This one is taken from the \TEX\ book. The \CONTEXT\
+%D alternative is a bit different, but we hope this one works
+%D here.
+
+\ifx\dospecials\undefined
+
+ \def\dospecials
+ {\do\ \do\\\do\{\do\}\do\$%
+ \do\#\do\^\do\_\do\&\do\%%
+ \do\~\do\^^A\do\^^K}
+
+\fi
+
+\ifnocontextobject \uncatcodespecials \do
+
+ \def\uncatcodespecials
+ {\def\do##1{\catcode`##1=12 }\dospecials
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+\fi
+
+\ifnocontextobject \setnaturalcatcodes \do
+
+\def\setnaturalcatcodes
+ {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other
+ \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other
+ \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other
+ \catcode`\*=\@@other \catcode`\/=\@@other
+ \catcode`\-=\@@other \catcode`+=\@@other
+ \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other
+ \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other
+ \catcode`\:=\@@other \catcode`\;=\@@other
+ \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other
+ \catcode`\(=\@@other \catcode`\)=\@@other
+ \catcode`\{=\@@other \catcode`\}=\@@other
+ \catcode`\\=\@@other \catcode`\%=\@@other }
+
+\fi
+
+%D \macros
+%D {doglobal}
+%D
+%D Some \CONTEXT\ low level macros can have a \type{\doglobal}
+%D prefix. Let's just forget about that here:
+
+\ifnocontextobject \doglobal \do \let\doglobal\relax \fi
+
+%D The next obscure one is needed in the generic verbatim
+%D environment. When we end up with more of these, it's time
+%D to load the module \type{syst-gen}.
+
+\ifnocontextobject \doifincsnameelse \do
+
+ \def\dodoifincsnameelse#1#2%
+ {\def\dododoifincsnameelse##1#1##2##3\war%
+ {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ \expandafter\dododoifincsnameelse#2#1@@\war}
+
+ \long\def\doifincsnameelse#1#2#3#4%
+ {\edef\@@instring{#1}%
+ \expandafter\dodoifincsnameelse\expandafter{\@@instring}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\fi
+
+%D \macros
+%D {dostepwiserecurse, dorecurse, doloop, exitloop}
+%D
+%D The next loop macro is a real weak one, and does not offer
+%D the full \CONTEXT\ functionality, let alone nesting, but
+%D for simple purposes, its behaviour is acceptable.
+
+\newcount\recursecounter
+
+\def\dostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\ifnum#2<#1\relax\else\dodostepwiserecurse{#1}{#2}{#3}{#4}\fi}
+
+\def\dodostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\recursecounter=#1\relax
+ \loop
+ \edef\recurselevel{\the\recursecounter}%
+ #4\relax
+ \ifnum\recursecounter<#2\relax
+ \advance\recursecounter by #3\relax
+ \repeat}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse{1}{#1}{1}}
+
+\def\doloop
+ {\dostepwiserecurse{1}{\maxdimen}{1}}
+
+\def\exitloop
+ {\recursecounter=\maxdimen}
+
+%D \macros
+%D {ifundefined,doifdefined,doifundefined,
+%D doifdefinedelse,doifundefinedelse}
+%D
+%D These alteratives are not robust but suitable for simple
+%D usage. The official ones are a bit faster.
+
+\ifnocontextobject \doifdefined \do
+
+ \def\ifundefined#1%
+ {\expandafter\ifx\csname#1\endcsname\relax}
+
+ \def\doifdefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#3\else#2\fi}
+
+ \def\doifundefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\else#3\fi}
+
+ \def\doifdefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax\else#2\fi}
+
+ \def\doifundefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\fi}
+
+\fi
+
+%D \macros
+%D {doifinstringelse}
+%D
+%D It seems like we end up with more and more macros here.
+%D Sigh.
+
+\ifnocontextobject \doifinstringelse \do
+
+ \def\p!doifinstringelse#1#2%
+ {\def\pp!doifinstringelse##1#1##2##3\war%
+ {\csname if\if##2@fals\else tru\fi e\endcsname}%
+ \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}}
+
+ \long\def\doifinstringelse#1#2#3#4%
+ {\edef\@@@instring{#1}%
+ \@EA\p!doifinstringelse\@EA{\@@@instring}{#2}#3\else#4\fi}
+
+\fi
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D We don't support rounding outside \CONTEXT. Sorry.
+
+\def\twodigitrounding#1{#1}
+
+%D \macros
+%D {lineheight}
+%D
+%D In \CONTEXT\ we have \type{\lineheight}, which in many
+%D cases matches \type {\baselineskip}.
+
+\ifnocontextobject \lineheight \do
+
+ \def\lineheight{\baselineskip}
+
+\fi
+
+%D \macros
+%D {dohandletokens}
+%D
+%D The following macro is the simplified version, but good
+%D enough for day to day hacks.
+%D
+%D \starttyping
+%D \dohandletokens some text\with\somemacro
+%D \stoptyping
+
+\ifnocontextobject \dohandletokens \do
+
+\def\dodohandletokens
+ {\ifx\next\end \else
+ \docommando{\next}%
+ \expandafter\dohandletokens
+ \fi}
+
+\def\dohandletokens
+ {\afterassignment\dodohandletokens\let\next= }
+
+\long\def\handletokens#1\with#2%
+ {\let\docommando=#2%
+ \dohandletokens#1\end}
+
+\fi
+
+%D Very reduced:
+
+\long\def\appendtoks#1\to#2%
+ {\scratchtoks{#1}\expanded{#2{\the#2\the\scratchtoks}}}
+
+%D Well, also handy.
+
+\def\doiffileelse#1#2#3%
+ {\immediate\openin\scratchread=#1\relax
+ \ifeof\scratchread
+ \def\next{#3}%
+ \else
+ \def\next{#2}%
+ \fi
+ \immediate\closein\scratchread
+ \next}
+
+%D New.
+
+\let\donothing\empty
+
+%D Also new:
+
+\def\letempty #1{\let#1\empty}
+\def\globalletempty#1{\global\let#1\empty}
+
+\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
+\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+
+%D Sigh
+
+\def\settrue #1{\chardef#1\zerocount}
+\def\setfalse#1{\chardef#1\plusone}
+
+\let\newconditional = \setfalse
+\let\ifconditional = \ifcase
+
+%D That's it. Please forget this junk and take a look at how
+%D it should be done.
+
+\StopLatexHack \protect \endinput
diff --git a/systems/doc/pdftex/samplepdftex/supp-pdf.tex b/systems/doc/pdftex/samplepdftex/supp-pdf.tex
new file mode 100644
index 0000000000..184cfb8158
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/supp-pdf.tex
@@ -0,0 +1,2191 @@
+%D \module
+%D [ file=supp-pdf,
+%D version=2004.12.16,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D These macros are written as generic as possible. Some
+%D general support macro's are loaded from a small module
+%D especially made for non \CONTEXT\ use. In this module I
+%D use a matrix transformation macro written by Tanmoy
+%D Bhattacharya. Thanks to extensive testing by Sebastian
+%D Ratz I was able to complete this module within reasonable
+%D time. This module has support for \METAPOST\ extensions
+%D built in.
+%D
+%D Daniel H. Luecking came up with a better (more precise)
+%D transformation method. You can recognize his comment by
+%D his initials. (We keep the old code around because it's a
+%D nice illustration on how a module like this evolves.)
+
+% Beware, we cannot use \zeropoint here since it may be
+% defined in the range \dimen 0 - 20 which we happen to use
+% as scratch registers; inside context we may consider
+% using dedicated registers.
+
+% fails: ( ) vect10 9.96265 fshow % \040\040\040\040
+%
+% some optimizations are possible, but we need to be generic
+
+%D First we take care of non||\CONTEXT\ use (newlines needed,
+%D expandafter not -).
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\ifx \undefined \convertMPtoPDF \else \expandafter \endinput \fi
+
+\ifx \undefined \StartLatexHack \else \StartLatexHack \fi
+
+%D This module handles some \PDF\ conversion and insertions
+%D topics. By default, the macros use the \PDFTEX\ primitive
+%D \type{\pdfliteral} when available. Since \PDFTEX\ is now the
+%D default engine for \TEX\ distributions, we need a more complex
+%D test.
+
+\writestatus{loading}{Context Support Macros / PDF (2004.03.26)}
+
+\unprotect
+
+\ifx\PDFcode\undefined
+ \ifx\pdfliteral\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifx\pdfoutput\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifcase\pdfoutput
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else % pdftex as well as in pdf mode
+ \let\PDFcode\pdfliteral
+ \fi\fi\fi
+\else
+ % we probably use context
+\fi
+
+%D First we define a handy constant:
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D {pdfimage,pdfimages,pdfclippedimage}
+%D
+%D Starting with pdftex version 14, images are included more
+%D natural to the form embedding. This enables alternative
+%D images to be embedded.
+%D
+%D \starttyping
+%D \pdfimage <optional dimensions> {file}
+%D \pdfimages <optional dimensions> {high res file} {low res file}
+%D \stoptyping
+%D
+%D The first one replaces the pre||version||14 original,
+%D while the latter provides alternative images.
+%D
+%D The next macro is dedicated to Maarten Gelderman, who
+%D needed to paste prepared \PDF\ pages into conference
+%D proceedings.
+%D
+%D \starttyping
+%D \pdfclippedimage <optional dimensions> {file} {l} {r} {t} {b}
+%D \stoptyping
+
+% \ifx\pdftexversion\undefined % no \m!systems for the sake of latex
+% \writestatus{systems}{Why not use pdf(e)TeX binaries?}
+% \protect
+% \expandafter\endinput
+% \fi
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \def\pdfimage#1#%
+ {\dopdfimage{#1}}
+
+ \def\dopdfimage#1#2%
+ {\immediate\pdfximage#1{#2}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfimages#1#%
+ {\dopdfimages{#1}}
+
+ \def\dopdfimages#1#2#3%
+ {\immediate\pdfximage#1{#2}%
+ \immediate\pdfobj
+ {[ << /Image \the\pdflastximage\space0 R
+ /DefaultForPrinting true >> ]}%
+ \immediate\pdfximage#1
+ attr {/Alternates \the\pdflastobj\space0 R}{#3}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfclippedimage#1#% specs {file}{left}{right}{top}{bottom}
+ {\dopdfclippedimage{#1}}
+
+ \def\dopdfclippedimage#1#2#3#4#5#6%
+ {\bgroup
+ \pdfximage#1{#2}%
+ \setbox\scratchbox\hbox
+ {\pdfrefximage\pdflastximage}%
+ \hsize\wd\scratchbox
+ \advance\hsize -#3
+ \advance\hsize -#4
+ \vsize\ht\scratchbox
+ \advance\vsize -#5
+ \advance\vsize -#6
+ \setbox\scratchbox\vbox to \vsize
+ {\vskip-#5\hbox to \hsize{\hskip-#3\box\scratchbox\hss}}%
+ \pdfxform\scratchbox
+ \pdfrefxform\pdflastxform
+ \egroup}
+
+\fi \fi
+
+%D If you want to save a few hash entries, you may prefer the
+%D less readable alternatives, like:
+%D
+%D \starttyping
+%D \def\pdfimage#1#% This one is less readable but needs no additional
+%D {\bgroup % hash entry for the second stage macro.
+%D \def\pdfimage##1%
+%D {\immediate\pdfximage##1{#2}%
+%D \pdfrefximage\pdflastximage\egroup}}
+%D \stoptyping
+
+%D For old times sake we provide a few aliases. These will be
+%D removed some day.
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \let\pdfform =\pdfxform
+ \let\pdflastform=\pdflastxform
+ \let\pdfrefform =\pdfrefxform
+
+\fi \fi
+
+%D \macros
+%D {convertPDFtoPDF}
+%D
+%D \PDFTEX\ supports verbatim inclusion of \PDF\ code. The
+%D following macro takes care of inserting externally defined
+%D illustrations in \PDF\ format. According to a suggestion
+%D Tanmoy Bhattacharya posted to the \PDFTEX\ mailing list, we
+%D first skip lines until \type{stream} is reached and then
+%D copy lines until \type{endstream} is encountered. This
+%D scheme only works with vectorized graphics in which no
+%D indirect references to objects are used. Bitmaps also don't
+%D work. Interpreting their specifications is beyond the
+%D current implementation.
+%D
+%D \starttyping
+%D \convertPDFtoPDF
+%D {filename}
+%D {x scale} {y scale}
+%D {x offset } {y offset}
+%D {width} {height}
+%D \stoptyping
+%D
+%D When the scales are set to~1, the last last four values
+%D are the same as the bounding box, e.g.
+%D
+%D \starttyping
+%D \convertPDFtoPDF{mp-pra-1.pdf} {1} {1}{-1bp}{-1bp}{398bp}{398bp}
+%D \convertPDFtoPDF{mp-pra-1.pdf}{.5}{.5} {0bp} {0bp}{199bp}{199bp}
+%D \stoptyping
+%D
+%D Keep in mind, that this kind of copying only works for
+%D pure and valid pdf code (without fonts).
+
+%D The scanning and copying is straightforward and quite fast.
+%D To speed up things we use two constants.
+
+\def\@@PDFstream@@ {stream}
+\def\@@PDFendstream@@ {endstream}
+
+%D \macros
+%D {PDFmediaboxprefered}
+%D
+%D If needed, the macros can scan for the mediabox that
+%D specifies the dimensions and offsets of the graphic. When
+%D we say:
+%D
+%D \starttyping
+%D \PDFmediaboxpreferedtrue
+%D \stoptyping
+%D
+%D the mediabox present in the file superseded the user
+%D specified, already scaled and calculated offset and
+%D dimensions. Beware: the user supplied values are not the
+%D bounding box ones!
+
+%D This code has become obsolete.
+
+% \newif\ifPDFmediaboxprefered
+
+\def\setPDFboundingbox#1#2#3#4#5#6%
+ {\dimen0=#1\dimen0=#5\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFxoffset
+ \dimen0=#3\dimen0=#5\dimen0
+ \xdef\PDFwidth{\the\dimen0}%
+ \dimen0=#2\dimen0=#6\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFyoffset
+ \dimen0=#4\dimen0=#6\dimen0
+ \xdef\PDFheight{\the\dimen0}%
+ \global\let\PDFxoffset\PDFxoffset
+ \global\let\PDFyoffset\PDFyoffset}
+
+\def\setPDFmediabox#1[#2 #3 #4 #5]#6\done
+ {\dimen2=#2bp\dimen2=-\dimen2 % \dimen2=-#2bp also works since tex handles --
+ \dimen4=#3bp\dimen4=-\dimen4 % \dimen4=-#3bp also works since tex handles --
+ \dimen6=#4bp\advance\dimen6 \dimen2
+ \dimen8=#5bp\advance\dimen8 \dimen4
+ \setPDFboundingbox{\dimen2}{\dimen4}{\dimen6}{\dimen8}\PDFxscale\PDFyscale}
+
+% \def\checkPDFmediabox#1/MediaBox#2#3\done
+% {\ifx#2\relax \else
+% \message{mediabox}%
+% \setPDFmediabox#2#3\done
+% \fi}
+
+%D We use the general macro \type{\doprocessfile} and feed this
+%D with a line handling macro that changes it's behavior when
+%D the stream operators are encountered.
+
+% \def\handlePDFline
+% {\ifx\@@PDFstream@@\fileline
+% \let\doprocessPDFline\copyPDFobject
+% \startPDFtoPDF
+% \else\ifPDFmediaboxprefered
+% \expandafter\checkPDFmediabox\fileline/MediaBox\relax\done
+% \fi\fi}
+
+% \def\copyPDFobject
+% {\ifx\@@PDFendstream@@\fileline
+% \ifPDFmediaboxprefered
+% \let\doprocessPDFline\findPDFmediabox
+% \else
+% \let\doprocessPDFline\relax
+% \fi
+% \else
+% \advance\scratchcounter 1
+% \PDFcode{\fileline}%
+% \fi}
+
+% \def\findPDFmediabox
+% {\expandafter\checkPDFmediabox\fileline/MediaBox\relax\done}
+
+%D The main conversion macro wraps the \PDF\ codes in a box
+%D that is output as an object. The graphics are embedded
+%D in~\type{q} and~\type{Q} and are scaled and positioned using
+%D one transform call (\type{cm}). This saves some additional
+%D scaling.
+
+%D \starttyping
+%D \def\startPDFtoPDF%
+%D {\setbox0=\vbox\bgroup
+%D \message{[PDF to PDF \PDFfilename}%
+%D \forgetall
+%D \scratchcounter=0
+%D \let\stopPDFtoPDF=\dostopPDFtoPDF}
+%D
+%D \def\dostopPDFtoPDF%
+%D {\ifnum\scratchcounter<0 \scratchcounter=1 \fi
+%D \message{(\the\scratchcounter\space lines)]}%
+%D \egroup
+%D \wd0=\PDFwidth
+%D \vbox to \PDFheight
+%D {\forgetall
+%D \vfill
+%D \PDFcode{q}%
+%D \PDFcode{1 0 0 1 \PDFxoffset\space \PDFyoffset\space cm}%
+%D \PDFcode{\PDFxscale\space 0 0 \PDFyscale\space 0 0 cm}%
+%D \box0
+%D \PDFcode{Q}}}
+%D
+%D \def\stopPDFtoPDF%
+%D {\message{[PDF to PDF \PDFfilename\space not found]}}
+%D
+%D \def\convertPDFtoPDF#1#2#3#4#5#6#7%
+%D {\bgroup
+%D \def\PDFfilename{#1}%
+%D \def\PDFxscale {#2}%
+%D \def\PDFyscale {#3}%
+%D \setPDFboundingbox{#4}{#5}{#6}{#7}{1}{1}%
+%D \uncatcodespecials
+%D \endlinechar=-1
+%D \let\doprocessPDFline=\handlePDFline
+%D \doprocessfile\scratchread\PDFfilename\doprocessPDFline
+%D \stopPDFtoPDF
+%D \egroup}
+
+\def\convertPDFtoPDF#1#2#3#4#5#6#7%
+ {\message{[PDF to PDF use \string\PDFcode instead]}%
+ \vbox{use the direct method instead}}
+
+%D \macros
+%D {dogetPDFmediabox}
+%D
+%D The next macro can be used to find the mediabox of a \PDF\
+%D illustration.
+%D
+%D \starttyping
+%D \dogetPDFmediabox
+%D {filename}
+%D {new dimen}{new dimen}{new dimen}{new dimen}
+%D \stoptyping
+%D
+%D Beware of dimen clashes: this macro uses the 5~default
+%D scratch registers! When no file or mediabox is found, the
+%D dimensions are zeroed.
+
+\def\dogetPDFmediabox#1#2#3#4#5%
+ {\bgroup
+ \def\PDFxscale{1}%
+ \def\PDFyscale{1}%
+ \uncatcodespecials
+ \endlinechar\minusone
+ \def\checkPDFtypepage##1/Type /Page##2##3\done%
+ {\ifx##2\relax
+ \else\if##2s% accept /Page and /Pages
+ \let\doprocessPDFline\findPDFmediabox
+ \else
+ \let\doprocessPDFline\findPDFmediabox
+ \fi\fi}%
+ \def\findPDFtypepage
+ {\expandafter\checkPDFtypepage\fileline/Type /Page\relax\done}%
+ \def\checkPDFmediabox##1/MediaBox##2##3\done%
+ {\ifx##2\relax \else
+ \setPDFmediabox##2##3\done
+ \fileprocessedtrue
+ \fi}%
+ \def\findPDFmediabox
+ {\expandafter\checkPDFmediabox\fileline/MediaBox\relax\done}%
+ \let\doprocessPDFline\findPDFtypepage
+ \doprocessfile\scratchread{#1}\doprocessPDFline
+ \egroup
+ \ifx\PDFxoffset\undefined
+ #2\zeropoint
+ #3\zeropoint
+ #4\zeropoint
+ #5\zeropoint
+ \else
+ #2=\PDFxoffset\onebasepoint
+ #3=\PDFyoffset\onebasepoint
+ #4=\PDFwidth
+ #5=\PDFheight
+ \fi}
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. Because we want to test as fast as possible, we
+%D first define the \POSTSCRIPT\ operators that \METAPOST\
+%D uses. We don't define irrelevant ones, because these are
+%D skipped anyway.
+
+%D The converter can be made a bit faster by replacing the
+%D two test macros (the ones with the many \type {\if's}) by
+%D a call to named branch macros (something \typ {\getvalue
+%D {xPSmoveto}}. For everyday documents with relatively
+%D small graphics the gain in speed can be neglected.
+
+\def \PScurveto {curveto}
+\def \PSlineto {lineto}
+\def \PSmoveto {moveto}
+\def \PSshowpage {showpage}
+\def \PSnewpath {newpath}
+\def \PSfshow {fshow}
+\def \PSclosepath {closepath}
+\def \PSfill {fill}
+\def \PSstroke {stroke}
+\def \PSclip {clip}
+\def \PSrlineto {rlineto}
+\def \PSsetlinejoin {setlinejoin}
+\def \PSsetlinecap {setlinecap}
+\def \PSsetmiterlimit {setmiterlimit}
+\def \PSsetgray {setgray}
+\def \PSsetrgbcolor {setrgbcolor}
+\def \PSsetcmykcolor {setcmykcolor}
+\def \PSsetdash {setdash}
+\def \PSgsave {gsave}
+\def \PSgrestore {grestore}
+\def \PStranslate {translate}
+\def \PSscale {scale}
+\def \PSconcat {concat}
+\def \PSdtransform {dtransform}
+\def \PSsetlinewidth {setlinewidth}
+\def \PSpop {pop}
+
+\def \PSnfont {nfont} % was needed for TUG98 proceedings
+\def \PSspecial {special} % extensions to MetaPost
+
+%D A previous version set \type {%} to ignore, which
+%D simplified the following definitions. At the start of
+%D conversion the percent character was made active again.
+%D Because the whole graphic is one paragraph (there are no
+%D empty lines) this does not give the desired effect. This
+%D went unnoticed untill Scott Pakin sent me a test file
+%D percent characters in a string. So, from now on we have
+%D to prefix the following strings with percentages.
+
+\edef \PSBoundingBox {\letterpercent\letterpercent BoundingBox:}
+\edef \PSHiResBoundingBox {\letterpercent\letterpercent HiResBoundingBox:}
+\edef \PSExactBoundingBox {\letterpercent\letterpercent ExactBoundingBox:}
+\edef \PSMetaPostSpecial {\letterpercent\letterpercent MetaPostSpecial:}
+\edef \PSMetaPostSpecials {\letterpercent\letterpercent MetaPostSpecials:}
+\edef \PSPage {\letterpercent\letterpercent Page:}
+
+%D By the way, the \type {setcmykcolor} operator is not
+%D output by \METAPOST\ but can result from converting the
+%D \cap{RGB} color specifications, as implemented in
+%D \type{supp-mps}.
+
+%D In \POSTSCRIPT\ arguments precede the operators. Due to the
+%D fact that in some translations we need access to those
+%D arguments, and also because sometimes we have to skip them,
+%D we stack them up. The stack is one||dimensional for non path
+%D operators and two||dimensional for operators inside a path.
+%D This is because we have to save the whole path for
+%D (optional) postprocessing. Values are pushed onto the stack
+%D by:
+%D
+%D \starttyping
+%D \setMPargument {value}
+%D \stoptyping
+%D
+%D They can be retrieved by the short named macros:
+%D
+%D \starttyping
+%D \gMPa {number}
+%D \gMPs {number}
+%D \stoptyping
+%D
+%D When scanning a path specification, we also save the
+%D operator, using
+%D
+%D \starttyping
+%D \setMPkeyword {n}
+%D \stoptyping
+%D
+%D The path drawing operators are coded for speed: \type{clip},
+%D \type{stroke}, \type{fill} and \type{fillstroke} become
+%D 1, 2, 3 and~4.
+%D
+%D When processing the path this code can be retrieved
+%D using
+%D
+%D \starttyping
+%D \getMPkeyword % {n}
+%D \stoptyping
+%D
+%D When setting an argument, the exact position on the stack
+%D depends on the current value of the \COUNTERS\
+%D \type{\nofMPsegments} and \type{\nofMParguments}.
+
+\newcount\nofMPsegments
+\newcount\nofMParguments
+
+%D These variables hold the coordinates. The argument part of
+%D the stack is reset by:
+%D
+%D \starttyping
+%D \resetMPstack
+%D \stoptyping
+%D
+%D We use the prefix \type{@@MP} to keep the stack from
+%D conflicting with existing macros. To speed up things a bit
+%D more, we use the constant \type{\@@MP}.
+
+\def\@@MP{@@MP}
+
+\def\setMPargument% #1%
+ {\advance\nofMParguments \plusone
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} % {#1}
+
+\def\letMPargument
+ {\advance\nofMParguments \plusone
+ \expandafter\let
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname}
+
+\def\setMPsequence#1 %
+ {\advance\nofMParguments \plusone
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{#1}%
+ \handleMPsequence}
+
+\def\gMPa#1%
+ {\csname\@@MP0\number#1\endcsname}
+
+\def\gMPs#1%
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}
+
+\def\dogMPa#1%
+ {\@EAEAEA\do\csname\@@MP0\number#1\endcsname}
+
+\def\setMPkeyword#1 %
+ {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
+ \advance\nofMPsegments \plusone
+ \nofMParguments\zerocount}
+
+\def\getMPkeyword% #1%
+ {\csname\@@MP\the\nofMPsegments0\endcsname} % {\csname\@@MP#10\endcsname}
+
+%D When we reset the stack, we can assume that all further
+%D comment is to be ignored and handled in strings.
+%D By redefining the reset macro after the first call, we
+%D save some run time. Only use this macro after all
+%D comments are processed and use the simple alternative
+%D when dealing with comments.
+
+\def\doresetMPstack
+ {\nofMParguments\zerocount}
+
+\def\resetMPstack
+ {\let\handleMPgraphic\handleMPendgraphic
+ \let\resetMPstack\doresetMPstack
+ \resetMPstack}
+
+%D The arguments are saved with the preceding command
+%D \type{\do}. By default this command expands to nothing, but
+%D when we deal with strings it's used to strip off the
+%D \type{(} and \type{)}.
+%D
+%D Strings are kind of tricky, because characters can be
+%D passed verbatim \type{(hello)}, by octal number
+%D \type{(\005)} or as command \type{(\()}. We therefore
+%D cannot simply ignore \type{(} and \type{)}, the way we do
+%D with \type{[} and \type{]}. Another complication is that
+%D strings may contain characters that normally have a
+%D special meaning in \TEX, like \type{$} and \type{{}}.
+%D
+%D A previous solution made \type{\} an active character and
+%D let it look ahead for a number or characters. We had to
+%D abandon this scheme because of the need for verbatim
+%D support. The next solution involved some \CATCODE\
+%D trickery but works well.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+\bgroup
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\ignoreMPspecials|
+ B\let%\letterpercent|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\setnaturalcatcodes
+ \catcode`\\=\@@escape
+ \catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \lccode`\-=0 | latex sets this to `\-
+ \lccode`\%=`\% | otherwise it's seen as a number
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D We use the comment symbol as a sort of trigger. Beware!
+%D The whole graphic is seen as on eparagraph, which means
+%D that we cannot change the catcodes in between.
+
+\bgroup
+\catcode`\%=\@@active
+\gdef\startMPscanning{\let%=\startMPconversion}
+\egroup
+
+%D In earlier versions we used the sequence
+%D
+%D \starttyping
+%D \expandafter\handleMPsequence\input filename\relax
+%D \stoptyping
+%D
+%D Persistent problems in \LATEX\ however forced us to use a
+%D different scheme. Every \POSTSCRIPT\ file starts with a
+%D \type{%}, so we temporary make this an active character
+%D that starts the scanning and redefines itself. (The problem
+%D originates in the redefinition by \LATEX\ of the
+%D \type{\input} primitive.)
+
+\def\startMPconversion
+ {\ignoreMPspecials
+ \handleMPsequence}
+
+%D Here comes the main loop. Most arguments are numbers. This
+%D means that they can be recognized by their \type{\lccode}.
+%D This method saves a lot of processing time. We could
+%D speed up the conversion by handling the \type{path}
+%D seperately.
+
+\def\@EAEAEA{\expandafter\expandafter\expandafter} % to be sure
+
+\def\dohandleMPsequence#1%
+ {\ifdone
+ \ifcase\lccode`#1\relax
+ \@EAEAEA\dohandleMPsequenceA
+ \else
+ \@EAEAEA\dohandleMPsequenceB
+ \fi
+ \else
+ \@EA\dohandleMPsequenceC
+ \fi#1}
+
+%\def\dohandleMPsequenceA#1 %
+% {\setMPargument{#1}%
+% \handleMPsequence}
+
+\let\dohandleMPsequenceA\setMPsequence
+
+\def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \ifx\somestring\PSmoveto
+ \edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \PDFcode{\!MPgMPa1 \!MPgMPa2 m}%
+ \resetMPstack
+ \else\ifx\somestring\PSnewpath
+ \let\handleMPsequence\handleMPpath
+ \else\ifx\somestring\PSgsave
+ \PDFcode{q}%
+ \resetMPstack
+ \else\ifx\somestring\PSgrestore
+ \PDFcode{Q}%
+ \resetMPstack
+ \else\ifx\somestring\PSdtransform % == setlinewidth
+ \let\handleMPsequence\handleMPdtransform
+ % after that we will encounter more tokens until setlinewidth+pop
+ % or pop+setlinewidth which we catch next; we explicitly need to
+ % reset the stack since [] n setdash may follow; a more clever
+ % approach would be to read on till the condition is met, but it's
+ % the only pop / setlinewidth we will encounter so ...
+ \else\ifx\somestring\PSsetlinewidth
+ % already handled in dtransform
+ \resetMPstack
+ \else\ifx\somestring\PSpop
+ % already handled in dtransform
+ \resetMPstack
+ \else\ifx\somestring\PSconcat
+ \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetrgbcolor
+ \handleMPrgbcolor
+ \resetMPstack
+ \else\ifx\somestring\PSsetcmykcolor
+ \handleMPcmykcolor
+ \resetMPstack
+ \else\ifx\somestring\PSsetgray
+ \handleMPgraycolor
+ \resetMPstack
+ \else\ifx\somestring\PStranslate
+ \PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetdash
+ \handleMPsetdash
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinejoin
+ \PDFcode{\gMPa1 j}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetmiterlimit
+ \PDFcode{\gMPa1 M}%
+ \resetMPstack
+ \else\ifx\somestring\PSfshow
+ \PDFcode{n}%
+ \handleMPfshow
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinecap
+ \PDFcode{\gMPa1 J}%
+ \resetMPstack
+ \else\ifx\somestring\PSrlineto
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPstack
+ \else\ifx\somestring\PSscale
+ \PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSspecial
+ \handleMPspecialcommand
+ \resetMPstack
+ \else
+ \handleMPgraphic% {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \handleMPsequence}
+
+\def\dohandleMPsequenceC#1 %
+ {\edef\somestring{#1}%
+ \handleMPgraphic % {#1}%
+ \handleMPsequence}
+
+%D Since colors are not sensitive to transformations, they
+%D are sometimes used for signaling. Therefore, we handle them
+%D separately. The next macro can be redefined if needed.
+
+\def\handleMPrgbcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}}
+
+\def\handleMPcmykcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}}
+
+\def\handleMPgraycolor
+ {\PDFcode{\!MPgMPa1 g
+ \!MPgMPa1 G}}
+
+\def\handleMPspotcolor
+ {\PDFcode{0 g
+ 0 G}}
+
+%D Beginning and ending the graphics is taken care of by the
+%D macro \type{\handleMPgraphic}, which is redefined when
+%D the first graphics operator is met.
+
+\def\handleMPendgraphic % #1%
+ {\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi}
+
+\def\handleMPbegingraphic % #1%
+ {\ifx\somestring\PSBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox1}%
+ \else\ifx\somestring\PSHiResBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox2}%
+ \else\ifx\somestring\PSExactBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox3}%
+ \else\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSPage
+ \let\handleMPsequence\handleMPpage
+ \else\ifx\somestring\PSMetaPostSpecials
+ \let\handleMPsequence\handleMPspecialscomment
+ \else\ifx\somestring\PSMetaPostSpecial
+ \let\handleMPsequence\handleMPspecialcomment
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi\fi\fi\fi\fi\fi}
+
+\let\handleMPgraphic=\handleMPbegingraphic
+
+%D We check for three kind of bounding boxes: the normal one
+%D and two high precision ones:
+%D
+%D \starttyping
+%D BoundingBox: llx lly ucx ucy
+%D HiResBoundingBox: llx lly ucx ucy
+%D ExactBoundingBox: llx lly ucx ucy
+%D \stoptyping
+%D
+%D The original as well as the recalculated dimensions are
+%D saved for later use.
+
+\newif\ifskipemptyMPgraphic \skipemptyMPgraphicfalse
+
+\chardef\currentMPboundingbox=0
+
+\def\handleMPboundingbox#1#2 #3 #4 #5
+ {\ifnum#1>\currentMPboundingbox
+ \xdef\MPllx{#2}\xdef\MPlly{#3}%
+ \xdef\MPurx{#4}\xdef\MPury{#5}%
+ \dimen0=#2\onepoint
+ \dimen0=-\MPxscale\dimen0
+ \dimen2=#3\onepoint
+ \dimen2=-\MPyscale\dimen2
+ \xdef\MPxoffset{\withoutpt\the\dimen0}%
+ \xdef\MPyoffset{\withoutpt\the\dimen2}%
+ \dimen0=#2\onebasepoint
+ \dimen0=-\dimen0
+ \dimen2=#3\onebasepoint
+ \dimen2=-\dimen2
+ \advance\dimen0 #4\onebasepoint
+ \dimen0=\MPxscale\dimen0
+ \xdef\MPwidth{\the\dimen0}%
+ \advance\dimen2 #5\onebasepoint
+ \xdef\MPyshift{\the\dimen2}% unscaled
+ \dimen2=\MPyscale\dimen2
+ \xdef\MPheight{\the\dimen2}%
+ \chardef\currentMPboundingbox#1\relax
+ \fi
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \let\next\handleMPsequence
+ \ifskipemptyMPgraphic
+ \ifdim\MPheight=\zeropoint\relax\ifdim\MPwidth=\zeropoint\relax
+ \def\next{\endinput\finishMPgraphic}%
+ \fi\fi
+ \fi
+ \next}
+
+%D Unless defined otherwise, we simply ignore specialcomments.
+
+\def\handleMPspecialcomment
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+\let\handleMPspecialscomment\handleMPspecialcomment
+
+%D We use the \type{page} comment as a signal that
+%D stackbuilding can be started.
+
+\def\handleMPpage #1 #2
+ {\doresetMPstack
+ \donetrue
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D The same applies to the special extensions.
+
+\def\handleMPspecialcommand
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D \METAPOST\ draws its dots by moving to a location and
+%D invoking \type{0 0 rlineto}. This operator is not
+%D available in \PDF. Our solution is straightforward: we draw
+%D a line from $(current\_x, current\_y)$ to itself. This
+%D means that the arguments of the preceding \type{moveto} have
+%D to be saved.
+
+\def\lastMPmoveX{0}
+\def\lastMPmoveY{0}
+
+%D These saved coordinates are also used when we handle the
+%D texts. Text handling proved to be a bit of a nuisance, but
+%D finally I saw the light. It proved that we also had to
+%D take care of \type{(split arguments)}.
+
+\def\setMPfshowfont#1#2%
+ {\font\temp=#1\space at #2\relax\temp}
+
+\let\MPfshowcommand\empty
+
+\def\dohandleMPfshow
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\obeyMPspecials
+ \edef\size{\gMPa\nofMParguments}%
+ \ifx\size\PSnfont % round font size (to pt)
+ \advance\nofMParguments \minusone
+ \expandafter\scratchdimen\gMPa\nofMParguments\onepoint\relax
+ \ifdim\scratchdimen<\onepoint
+ \def\size{1pt}%
+ \else
+ \advance\scratchdimen .5\onepoint
+ \def\size##1.##2\relax{\def\size{##1pt}}%
+ \expandafter\size\the\scratchdimen\relax
+ \fi
+ \else
+ \edef\size{\size bp}%
+ \fi
+ \advance\nofMParguments \minusone
+ %\font\temp=\gMPa\nofMParguments\space at \size
+ \let\temp\relax % to be sure
+ \setMPfshowfont{\gMPa\nofMParguments}\size
+ \advance\nofMParguments \minusone
+ \temp
+ \MPfshowcommand
+ {\ifnum\nofMParguments=\plusone
+ \def\do(##1){##1}%
+ \dogMPa1%
+ \else
+ % we need to catch ( a ) (a a a) (\123 \123 \123) etc
+ \scratchcounter\plusone
+ \def\dodo##1% Andreas Fieger's bug: (\304...)
+ {\edef\!!stringa{##1\empty\empty}% and another one: ( 11) -> \ifx 11
+ \ifx\!!stringa\MPspacechar\MPspacechar\else\expandafter##1\fi}%
+ \def\do(##1{\dodo{##1}}%
+ \dogMPa\scratchcounter\MPspacechar
+ \let\do\relax
+ \loop
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\nofMParguments\relax
+ \gMPa\scratchcounter\MPspacechar
+ \repeat
+ \def\do##1){\dodo{##1}}%
+ \dogMPa\scratchcounter
+ \fi
+ \unskip}}%
+ %
+ % this fails in some versions of pdftex
+ %
+ % \dimen0=\lastMPmoveY bp
+ % \advance\dimen0 by \ht0
+ % \ScaledPointsToBigPoints{\number\dimen0}\lastMPmoveY
+ % \PDFcode{n q 1 0 0 1 \lastMPmoveX\space\lastMPmoveY\space cm}%
+ % \dimen0=\ht0
+ % \advance\dimen0 by \dp0
+ % \box0
+ % \vskip-\dimen0
+ % \PDFcode{Q}%
+ % \egroup}
+ %
+ \setbox\scratchbox\hbox
+ {\hskip\lastMPmoveX\onebasepoint\raise\lastMPmoveY\onebasepoint\box\scratchbox}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+\let\handleMPfshow\dohandleMPfshow % so we can overload this one later
+
+%D You could consider the following definition to be the most
+%D natural one.
+
+% \def\MPspacechar{\space} % normal case
+
+\def\MPspacechar{\char32\relax} % old solution does not work with math
+
+%D However, the following implementation is more robust, since
+%D some fonts have funny visible spaces in the space slot. This
+%D gives a mismatch between the space that \METAPOST\ took into
+%D account and the \quote {natural} space. This only happens in
+%D labels, since \type {btex}||\type {etex} thingies don't have
+%D spaces. This phenomena showed up when preparing the
+%D \METAFUN\ manual, where Palatino fonts are used. We can
+%D safely assume that \METAPOST\ considers \type {\char32} to
+%D be the space.
+
+\def\MPspacechar{\setbox\scratchbox\hbox{\char32}\kern\wd\scratchbox}
+
+%D Well, this does not work with math fonts, so:
+
+\def\MPspacechar{\char32\relax}
+
+%D Most operators are just converted and keep their
+%D arguments. Dashes however need a bit different treatment,
+%D otherwise \PDF\ viewers complain loudly. Another
+%D complication is that one argument comes after the \type{]}.
+%D When reading the data, we simply ignore the array boundary
+%D characters. We save ourselves some redundant newlines and
+%D at the same time keep the output readable by packing the
+%D literals.
+
+\def\handleMPsetdash
+ {\bgroup
+ \def\somestring{[}%
+ \scratchcounter\plusone
+ \loop
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa\scratchcounter}%
+ \advance\scratchcounter \plusone
+ \repeat
+ \edef\somestring{\somestring]\gMPa\scratchcounter\space d}%
+ \PDFcode{\somestring}%
+ \egroup}
+
+%D The \type{setlinewidth} commands looks a bit complicated. There are
+%D two alternatives, that result in a similar look in both
+%D $x$- and $y$-dorection. As John Hobby says:
+%D
+%D \startnarrower \switchtobodyfont[ss]
+%D \starttyping
+%D x 0 dtransform exch truncate exch idtransform pop setlinewidth
+%D 0 y dtransform truncate idtransform setlinewidth pop
+%D \stoptyping
+%D
+%D These are just fancy versions of \type{x setlinewidth} and
+%D \type{y setlinewidth}. The \type{x 0 ...} form is used if
+%D the path is {\em primarily vertical}. It rounds the width
+%D so that vertical lines come out an integer number of pixels
+%D wide in device space. The \type{0 y ...} form does the same
+%D for paths that are {\em primarily horizontal}. The reason
+%D why I did this is Knuth insists on getting exactly the
+%D widths \TEX\ intends for the horizontal and vertical rules
+%D in \type{btex...etex} output. (Note that PostScript scan
+%D conversion rules cause a horizontal or vertical line of
+%D integer width $n$ in device space to come out $n+1$ pixels
+%D wide, regardless of the phase relative to the pixel grid.)
+%D \stopnarrower
+%D
+%D The common operator in these sequences is \type{dtransform},
+%D so we can use this one to trigger setting the linewidth.
+
+\def\handleMPdtransform
+ {\ifdim\gMPa1\onepoint>\zeropoint
+ \PDFcode{\gMPa1 w}%
+ \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}%
+ \else
+ \PDFcode{\gMPa2 w}%
+ \def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \next}
+
+%D The most complicated command is \type{concat}. \METAPOST\
+%D applies this operator to \type{stroke}. At that moment the
+%D points set by \type{curveto} and \type{moveto}, are already
+%D fixed. In \PDF\ however the \type{cm} operator affects the
+%D points as well as the pen (stroke). Like more \PDF\
+%D operators, \type{cm} is defined in a bit ambiguous way.
+%D The only save route for non||circular penshapes, is saving
+%D the path, recalculating the points and applying the
+%D transformation matrix in such a way that we can be sure
+%D that its behavior is well defined. This comes down to
+%D inverting the path and applying \type{cm} to that path as
+%D well as the pen. This all means that we have to save the
+%D path.
+
+%D In \METAPOST\ there are three ways to handle a path $p$:
+%D
+%D \starttyping
+%D draw p; fill p; filldraw p;
+%D \stoptyping
+%D
+%D The last case outputs a \type{gsave fill grestore} before
+%D \type{stroke}. Handling the path outside the main loops
+%D saves about 40\% run time.\footnoot{We can save some more by
+%D following the \METAPOST\ output routine, but for the moment
+%D we keep things simple.} Switching between the main loop and
+%D the path loop is done by means of the recursely called
+%D macro \type{\handleMPsequence}.
+
+\def\handleMPpath
+ {\chardef\finiMPpath0
+ \let\closeMPpath\relax
+ \let\flushMPpath\flushnormalMPpath
+ \resetMPstack
+ \nofMPsegments\plusone
+ \let\handleMPsequence\dohandleMPpath
+ \dohandleMPpath}
+
+%D Most paths are drawn with simple round pens. Therefore we've
+%D split up the routine in two.
+
+\def\flushnormalMPsegment
+ {\ifcase\getMPkeyword\relax
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 l}%
+ \or
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}%
+ \or
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \or
+ \edef\lastMPmoveX{\gMPs1}% evt \!MP here
+ \edef\lastMPmoveY{\gMPs2}%
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}%
+ \fi}
+
+\def\flushconcatMPsegment
+ {\ifcase\getMPkeyword\relax
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l}%
+ \or
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \doMPconcat{\gMPs3}\c{\gMPs4}\d%
+ \doMPconcat{\gMPs5}\e{\gMPs6}\f%
+ \PDFcode{\!MP\a\space\!MP\b\space
+ \!MP\c\space\!MP\d\space
+ \!MP\e\space\!MP\f\space c}%
+ \or
+ \bgroup
+ \noMPtranslate
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l S}%
+ \egroup
+ \or
+ \edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space m}%
+ \fi}
+
+% \def\flushnormalMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments\plusone
+% \loop
+% \flushnormalMPsegment
+% \advance\nofMPsegments \plusone
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% \def\flushconcatMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments\plusone
+% \loop
+% \flushconcatMPsegment
+% \advance\nofMPsegments \plusone
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% an alternative is presented below: (no \def assignment)
+
+\def\doflushsomeMPpath
+ {\dodoflushsomeMPpath
+ \advance\nofMPsegments \plusone
+ \ifnum\nofMPsegments<\scratchcounter
+ \expandafter\doflushsomeMPpath
+ \fi}
+
+\def\flushsomeMPpath
+ {\scratchcounter\nofMPsegments
+ \nofMPsegments\plusone
+ \doflushsomeMPpath}
+
+\def\flushnormalMPpath{\let\dodoflushsomeMPpath\flushnormalMPsegment\flushsomeMPpath}
+
+%OLD \def\flushconcatMPpath{\let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%NEW pre-calculate 1/D so it needn't be repeated for each control point.
+
+\def\flushconcatMPpath
+ {\MPreciprocaldeterminant
+ \let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%D The transformation of the coordinates is handled by one of
+%D the macros Tanmoy posted to the \PDFTEX\ mailing list.
+%D I rewrote and optimized the original macro to suit the other
+%D macros in this module.
+%D
+%D \starttyping
+%D \doMPconcat {x position} \xresult {y position} \yresult
+%D \stoptyping
+%D
+%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto
+%D \type{\dimen10} only once per path, we save over 20\% run
+%D time. Some more speed was gained by removing some parameter
+%D passing. These macros can be optimized a bit more by using
+%D more constants. There is however not much need for further
+%D optimization because penshapes usually are round and
+%D therefore need no transformation. Nevertheless we move the
+%D factor to the outer level and use a bit different \type{pt}
+%D removal macro. Although the values represent base points,
+%D we converted them to pure points, simply because those can
+%D be converted back.
+
+%OLD \mathchardef\MPconcatfactor=256 % beware don't remove spaces before it
+
+%OLD \def\doMPreducedimen#1
+%OLD {\count0\MPconcatfactor
+%OLD \advance\dimen#1 \ifdim\dimen#1>\zeropoint .5\else -.5\fi\count0
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD % too inaccurate (see old pragma logo)
+%OLD
+%OLD \def\doMPreducedimen#1
+%OLD {\count0=\MPconcatfactor
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD \def\doMPreducedimen#1
+%OLD {\advance\dimen#1 \ifdim\dimen#1>\zeropoint .5\else -.5\fi\MPconcatfactor
+%OLD \divide\dimen#1 \MPconcatfactor}
+
+%D The transformation code is rewritten by Daniel H. Luecking who
+%D describes his patch as follows:
+%D
+%D We would like to divide 1 by $X4, but all divisions are integer so
+%D for accuracy we want to convert to large integers and make sure the
+%D integer quotient has as many significant digits as possible. Thus we
+%D need to replace $1/X$ with $M/N$ where $N$ is as large as possible
+%D and $M/N$ is as large as possible. Also for simplicity $M$ should be
+%D a power of 2. So we make $M = 2^{30}$ \footnote{$2^{31} - 1$ is the
+%D largest legal integer. Using it (and simply ignoring the inaccuracy
+%D caused by $-1$) turns out to be at least as accurate in all cases,
+%D and more accurate in some.} (largest legal power of 2) and adjust
+%D $X4 downward (if necessary) to the the range $1-2^{16}$. This gives
+%D at least 15 significant binary digits, (almost as accurate as
+%D \METAPOST\ for numbers near 1) or almost 5 significant figures
+%D (decimal).
+
+\newcount\MPscratchCnt
+\newdimen\MPscratchDim % will be assigned global
+
+\def\MPadjustdimen % sets \MPscratchDim and \MPscratchCnt
+ {\MPscratchCnt\zerocount
+ \doMPadjustdimen}
+
+\def\doMPadjustdimen
+ {\ifdim\MPscratchDim>\onepoint
+ \divide\MPscratchDim 2
+ \advance\MPscratchCnt \plusone
+ \expandafter\doMPadjustdimen
+ \fi}
+
+%OLD \def\doMPexpanddimen#1
+%OLD {\multiply\dimen#1 \MPconcatfactor\relax}
+
+%D DHL: When viewed as an integer, $1 \hbox{pt}=2^{16}$ so $2^{32}/X$
+%D is the right way to do $(1 \hbox{pt})/(X \hbox{pt})$ and get the
+%D answer in points. But we are limited to $2^{30}/X$. However, we
+%D actually do $[ 2^{30} / (X/2^K) ]*2^{2-K}$ where $K$ is the number
+%D of halvings it takes to bring $X4 below $1 \hbox{pt}$. If $K$ is 0
+%D or 1 we readjust by multiplying by 4 or 2, otherwise by halving
+%D $(K-2)$ times \type {\MPscratchCnt} holds the value of $K$ from
+%D \type {\MPadjustdimen}.
+
+\def\MPreadjustdimen % acts on \MPscratchDim and MPscratchCnt
+ {\ifcase\MPscratchCnt
+ \multiply\MPscratchDim 4
+ \or
+ \multiply\MPscratchDim 2
+ \else
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\doMPreadjustdimen
+ {\ifnum\MPscratchCnt > 2
+ \divide\MPscratchDim 2
+ \advance\MPscratchCnt \minusone
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\MPreciprocaldeterminant
+ {\MPscratchDim\withoutpt\the\dimen0 \dimen6 % s_x*s_y
+ \advance\MPscratchDim - \withoutpt\the\dimen2 \dimen4 % s_x*s_y - r_x*r_y
+ \ifdim\MPscratchDim<\zeropoint % we need a positive dimension
+ \MPscratchDim-\MPscratchDim % for \MPadjustdimen
+ \doMPreciprocal
+ \MPscratchDim-\MPscratchDim
+ \else
+ \doMPreciprocal
+ \fi}
+
+\newcount\MPnumerator \MPnumerator = 1073741824 % 2^{30}
+
+% todo: dimexpr
+
+\def\doMPreciprocal % replace \MPscratchDim with its reciprocal
+ {\ifdim\MPscratchDim=\onepoint \else
+ \MPadjustdimen
+ \scratchcounter\MPnumerator
+ \divide\scratchcounter\MPscratchDim
+ \MPscratchDim1\scratchcounter % 1 needed !
+ \MPreadjustdimen
+ \fi}
+
+%OLD \def\presetMPconcat
+%OLD {\dimen 0=\gMPs1\onepoint \doMPreducedimen 0 % r_x
+%OLD \dimen 2=\gMPs2\onepoint \doMPreducedimen 2 % s_x
+%OLD \dimen 4=\gMPs3\onepoint \doMPreducedimen 4 % s_y
+%OLD \dimen 6=\gMPs4\onepoint \doMPreducedimen 6 % r_y
+%OLD \dimen 8=\gMPs5\onepoint \doMPreducedimen 8 % t_x
+%OLD \dimen10=\gMPs6\onepoint \doMPreducedimen10 } % t_y
+%OLD
+%OLD \def\presetMPscale
+%OLD {\dimen 0=\gMPs1\onepoint \doMPreducedimen 0
+%OLD \dimen 2 \zeropoint
+%OLD \dimen 4 \zeropoint
+%OLD \dimen 6=\gMPs2\onepoint \doMPreducedimen 6
+%OLD \dimen 8 \zeropoint
+%OLD \dimen10 \zeropoint}
+
+\def\presetMPconcat
+ {\dimen 0=\gMPs1\onepoint % s_x
+ \dimen 2=\gMPs2\onepoint % r_x
+ \dimen 4=\gMPs3\onepoint % r_y
+ \dimen 6=\gMPs4\onepoint % s_y
+ \dimen 8=\gMPs5\onepoint % t_x
+ \dimen10=\gMPs6\onepoint} % t_y
+
+\def\presetMPscale
+ {\dimen 0=\gMPs1\onepoint
+ \dimen 2 \zeropoint
+ \dimen 4 \zeropoint
+ \dimen 6=\gMPs2\onepoint
+ \dimen 8 \zeropoint
+ \dimen10 \zeropoint}
+
+\def\noMPtranslate % use this one grouped
+ {\dimen 8 \zeropoint % t_x
+ \dimen10 \zeropoint} % t_y
+
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+
+%D The following optimization resulted from some tests by
+%D and email exchanges with Sanjoy Mahajan.
+%D
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D %\ifdim\dimen16>1pt % oeps, can be < 1pt too
+%D \ifdim\dimen16=1pt \else
+%D \ifdim\dimen16>\MPconcatfactor pt
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D \else
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+%D \fi
+%D \fi
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+%D
+%D But, this one is still too inaccurate, so we now have:
+
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1pt % p_x
+% \dimen14=#3pt % p_y
+% %
+% % we should test for >-1024 too, but for the moment take the gamble
+% \chardef\MPfactor1\ifdim\dimen12<1024pt \ifdim\dimen14<1024pt 6\fi\fi
+% %
+% \multiply\dimen12 \MPfactor
+% \multiply\dimen14 \MPfactor
+% %
+% \doMPreducedimen12
+% \doMPreducedimen14
+% %
+% \dimen16 \dimen 0
+% \multiply \dimen16 \dimen 6
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 4
+% \advance \dimen16 -\dimen20
+% %
+% \dimen18 \dimen12
+% \multiply \dimen18 \dimen 6
+% \dimen20 \dimen14
+% \multiply \dimen20 \dimen 4
+% \advance \dimen18 -\dimen20
+% \dimen20 \dimen 4
+% \multiply \dimen20 \dimen10
+% \advance \dimen18 \dimen20
+% \dimen20 \dimen 6
+% \multiply \dimen20 \dimen 8
+% \advance \dimen18 -\dimen20
+% %
+% \multiply \dimen12 -\dimen 2
+% \multiply \dimen14 \dimen 0
+% \advance \dimen12 \dimen14
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 8
+% \advance \dimen12 \dimen20
+% \dimen20 \dimen 0
+% \multiply \dimen20 \dimen10
+% \advance \dimen12 -\dimen20
+% %
+% \ifdim\dimen16=1pt \else
+% \ifdim\dimen16>\MPconcatfactor pt
+% \doMPreducedimen16
+% \divide \dimen18 \dimen16 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12
+% \else
+% \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+% \fi
+% \fi
+% %
+% \divide\dimen18 \MPfactor
+% \divide\dimen12 \MPfactor
+% %
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+
+%D We cannot use \type {\beginETEX} here since in plain we
+%D get \type {\outer} problems, sigh.
+
+%OLD \beginTEX
+%OLD
+%OLD \def\MPcriteriumA {512pt} % scale
+%OLD \def\MPcriteriumB {2pt} % scale
+%OLD
+%OLD \endTEX
+%OLD
+%OLD \ifx\MPcriteriumA\undefined
+%OLD
+%OLD \newdimen\MPcriteriumA \MPcriteriumA=512pt
+%OLD \newdimen\MPcriteriumB \MPcriteriumB= 2pt
+%OLD
+%OLD \fi
+
+%OLD \def\doMPconcat#1#2#3#4%
+%OLD {\dimen12=#1pt % p_x
+%OLD \dimen14=#3pt % p_y
+%OLD %
+%OLD \chardef\MPfactor\zerocount
+%OLD \ifdim\dimen4<\MPcriteriumB\ifdim\dimen4>-\MPcriteriumB
+%OLD \ifdim\dimen6<\MPcriteriumB\ifdim\dimen6>-\MPcriteriumB
+%OLD \ifdim\dimen8<\MPcriteriumB\ifdim\dimen8>-\MPcriteriumB
+%OLD \ifdim\dimen10<\MPcriteriumB\ifdim\dimen10>-\MPcriteriumB
+%OLD \chardef\MPfactor\plusone
+%OLD \fi\fi
+%OLD \fi\fi
+%OLD \fi\fi
+%OLD \fi\fi
+%OLD \ifcase\MPfactor % spurious 0 removed
+%OLD \chardef\MPfactor\plusone
+%OLD \ifdim\dimen12<\MPcriteriumA\ifdim\dimen12>-\MPcriteriumA
+%OLD \ifdim\dimen14<\MPcriteriumA\ifdim\dimen14>-\MPcriteriumA
+%OLD \chardef\MPfactor16
+%OLD \fi\fi
+%OLD \fi\fi
+%OLD \fi
+%OLD %
+%OLD \multiply\dimen12 \MPfactor
+%OLD \multiply\dimen14 \MPfactor
+%OLD %
+%OLD \doMPreducedimen12
+%OLD \doMPreducedimen14
+%OLD %
+%OLD \dimen16 \dimen 0
+%OLD \multiply \dimen16 \dimen 6
+%OLD \dimen20 \dimen 2
+%OLD \multiply \dimen20 \dimen 4
+%OLD \advance \dimen16 -\dimen20
+%OLD %
+%OLD \dimen18 \dimen12
+%OLD \multiply \dimen18 \dimen 6
+%OLD \dimen20 \dimen14
+%OLD \multiply \dimen20 \dimen 4
+%OLD \advance \dimen18 -\dimen20
+%OLD \dimen20 \dimen 4
+%OLD \multiply \dimen20 \dimen10
+%OLD \advance \dimen18 \dimen20
+%OLD \dimen20 \dimen 6
+%OLD \multiply \dimen20 \dimen 8
+%OLD \advance \dimen18 -\dimen20
+%OLD %
+%OLD \multiply \dimen12 -\dimen 2
+%OLD \multiply \dimen14 \dimen 0
+%OLD \advance \dimen12 \dimen14
+%OLD \dimen20 \dimen 2
+%OLD \multiply \dimen20 \dimen 8
+%OLD \advance \dimen12 \dimen20
+%OLD \dimen20 \dimen 0
+%OLD \multiply \dimen20 \dimen10
+%OLD \advance \dimen12 -\dimen20
+%OLD %
+%OLD \ifdim\dimen16=\onepoint \else
+%OLD \ifdim\dimen16>\MPconcatfactor \onepoint \relax
+%OLD \doMPreducedimen16
+%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18
+%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12
+%OLD \else
+%OLD \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+%OLD \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+%OLD \fi
+%OLD \fi
+%OLD %
+%OLD \divide\dimen18 \MPfactor
+%OLD \divide\dimen12 \MPfactor
+%OLD %
+%OLD \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%OLD \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+
+%D DHL: Ideally, $r_x$, $r_y$, $s_x4, $s_y$ should be in macros, not
+%D dimensions (they are scalar quantities after all, not lengths). I
+%D suppose the authors decided to do calculations with integer
+%D arithmetic instead of using real factors because it's faster.
+%D However, the actual macros test slower, possibly because I've
+%D omitted three nested loops. In my test files, my approach is more
+%D accurate. It is also far simpler and overflow does not seem to be a
+%D significant concern. The scale factors written by Metapost are (?)
+%D always $<=1$ (it scales coordinates internally) and coordinates are
+%D always likely to be less than \type {\maxdimen}.
+%D
+%D If this should ever cause problems, the scale factors can be reduced.
+
+\def\doMPconcat#1#2#3#4%
+ {\dimen12=#1pt % p_x % #1\onepoint
+ \dimen14=#3pt % p_y % #3\onepoint
+ \advance\dimen12 -\dimen8 % p_x - t_x
+ \advance\dimen14 -\dimen10 % p_y - t_y
+ \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+ \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+ \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+ \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+ % \MPscratchDim contains precomputed 1/D:
+ \dimen18=\withoutpt\the\MPscratchDim \dimen18
+ \dimen14=\withoutpt\the\MPscratchDim \dimen14
+ \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+ \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+
+%D One reason for Daniel to write this patch was that at small sizes
+%D the accuracy was less than optimal. Here is a test that demonstrates
+%D that his alternative is pretty good:
+%D
+%D \startlinecorrection
+%D \startMPcode
+%D for i = 5cm,1cm,5mm,1mm,.5mm,.1mm,.01mm :
+%D draw fullcircle scaled i withpen pencircle xscaled (i/10) yscaled (i/20) rotated 45 ;
+%D endfor ;
+%D \stopMPcode
+%D \stoplinecorrection
+
+%D The following explanation of the conversion process was
+%D posted to the \PDFTEX\ mailing list by Tanmoy. The original
+%D macro was part of a set of macro's that included sinus and
+%D cosinus calculations as well as scaling and translating. The
+%D \METAPOST\ to \PDF\ conversion however only needs
+%D transformation.
+
+%M \start \switchtobodyfont [ss]
+
+%D Given a point $(U_x, U_y)$ in user coordinates, the business
+%D of \POSTSCRIPT\ is to convert it to device space. Let us say
+%D that the device space coordinates are $(D_x, D_y)$. Then, in
+%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of
+%D $(U_x, U_y)$ in matrix notation, either as
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr}
+%D \pmatrix{s_x&r_x&0\cr
+%D r_y&s_y&0\cr
+%D t_x&t_y&1\cr}
+%D \stopformula
+%D
+%D or
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D both of which is a shorthand for the same set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D D_x = s_x U_x + r_y U_y + t_x
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D D_y = r_x U_x + s_y U_y + t_y
+%D \stopformula
+%D
+%D which define what is called an `affine transformation'.
+%D
+%D \POSTSCRIPT\ represents the `transformation matrix' as a
+%D six element matrix instead of a $3\times 3$ array because
+%D three of the elements are always~0, 0 and~1. Thus the above
+%D transformation is written in postscript as $[s_x\, r_x\,
+%D r_y\, s_y\, t_x\, t_y]$. However, when doing any
+%D calculations, it is useful to go back to the original
+%D matrix notation (whichever: I will use the second) and
+%D continue from there.
+%D
+%D As an example, if the current transformation matrix is
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b
+%D c d e f] concat}, this means:
+%D
+%D \startnarrower
+%D Take the user space coordinates and transform them to an
+%D intermediate set of coordinates using array $[a\, b\, c\, d\,
+%D e\, f]$ as the transformation matrix.
+%D
+%D Take the intermediate set of coordinates and change them to
+%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$
+%D as the transformation matrix.
+%D \stopnarrower
+%D
+%D Well, what is the net effect? In matrix notation, it is
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr
+%D b&d&f\cr
+%D 0&0&1\cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{I_x\cr
+%D I_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where $(I_x, I_y)$ is the intermediate coordinate.
+%D
+%D Now, the beauty of the matrix notation is that when there is
+%D a chain of such matrix equations, one can always compose
+%D them into one matrix equation using the standard matrix
+%D composition law. The composite matrix from two matrices can
+%D be derived very easily: the element in the $i$\high{th}
+%D horizontal row and $j$\high{th} vertical column is
+%D calculated by`multiplying' the $i$\high{th} row of the first
+%D matrix and the $j$\high{th} column of the second matrix (and
+%D summing over the elements). Thus, in the above:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &0 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D with
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {s_x^\prime & = s_x a + r_y b \cr
+%D r_x^\prime & = r_x a + s_y b \cr
+%D r_y^\prime & = s_x c + r_y d \cr
+%D s_y^\prime & = r_x c + s_y d \cr
+%D t_x^\prime & = s_x e + r_y f + t_x \cr
+%D t_y^\prime & = r_x e + s_y f + t_y \cr}
+%D \stopformula
+
+%D In fact, the same rule is true not only when one is going
+%D from user coordinates to device coordinates, but whenever
+%D one is composing two `transformations' together
+%D (transformations are `associative'). Note that the formula
+%D is not symmetric: you have to keep track of which
+%D transformation existed before (i.e.\ the equivalent of
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was
+%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\,
+%D e\, f]$). Note also that the language can be rather
+%D confusing: the one specified later `acts earlier',
+%D converting the user space coordinates to intermediate
+%D coordinates, which are then acted upon by the pre||existing
+%D transformation. The important point is that order of
+%D transformation matrices cannot be flipped (transformations
+%D are not `commutative').
+%D
+%D Now what does it mean to move a transformation matrix
+%D before a drawing? What it means is that given a point
+%D $(P_x, P_y)$ we need a different set of coordinates
+%D $(P_x^\prime, P_y^\prime)$ such that if the transformation
+%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x,
+%D P_y)$. That is we need to solve the set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x^\prime\cr
+%D P_y^\prime\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D Again matrix notation comes in handy (i.e. someone has
+%D already solved the problem for us): we need the inverse
+%D transformation matrix. The inverse transformation matrix can
+%D be calculated very easily:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} =
+%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x\cr
+%D P_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where, the inverse transformation matrix is given by
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {D & = s_x s_y - r_x r_y \cr
+%D s_x^\prime & = s_y / D \cr
+%D s_y^\prime & = s_x / D \cr
+%D r_x^\prime & = - r_x / D \cr
+%D r_y^\prime & = - r_y / D \cr
+%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr
+%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr}
+%D \stopformula
+%D
+%D And you can see that when expanded out, this does
+%D give the formulas:
+%D
+%D \placeformula
+%D \startformula
+%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over
+%D { s_x s_y-r_x r_y } }
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformula
+%D
+%D The code works by representing a real number by converting
+%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would
+%D be represented as 2.3pt for example. In this scheme,
+%D multiplying two numbers involves multiplying the \DIMENSION\
+%D registers and dividing by 65536. Accuracy demands that the
+%D division be done as late as possible, but overflow
+%D considerations need early division.
+%D
+%D Division involves dividing the two \DIMENSION\ registers and
+%D multiplying the result by 65536. Again, accuracy would
+%D demand that the numerator be multiplied (and|/|or the
+%D denominator divided) early: but that can lead to overflow
+%D which needs to be avoided.
+%D
+%D If nothing is known about the numbers to start with (in
+%D concat), I have chosen to divide the 65536 as a 256 in each
+%D operand. However, in the series calculating the sine and
+%D cosine, I know that the terms are small (because I never
+%D have an angle greater than 45 degrees), so I chose to
+%D apportion the factor in a different way.
+
+%M \stop
+
+%D The path is output using the values saved on the stack. If
+%D needed, all coordinates are recalculated.
+
+\def\finishMPpath
+ {\PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\fi}}
+
+\def\processMPpath
+ {\checkMPpath
+ \ifcase\nofMPsegments\else
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments\zerocount
+ \handleMPsequence}
+
+%D The following \METAPOST\ code is quite valid but, when
+%D processed and converted to \PDF, will make a file
+%D unprintable on a Hewlett Packard printer (from Acrobat
+%D $v<=5$). Who is to blame, the driver of the OS layer in
+%D between, is hard to determine, so we add an additional
+%D check.
+%D
+%D \starttyping
+%D clip currentpicture to origin -- cycle ;
+%D setbounds currentpicture to fullsquare scaled 5cm ;
+%D \stoptyping
+
+\def\checkMPpath
+ {\ifcase\finiMPpath
+ \ifnum\nofMPsegments<3 % n is one ahead
+ \message{omitting zero clip path}%
+ \nofMPsegments\zerocount
+ \fi
+ \fi}
+
+%D In \PDF\ the \type{cm} operator must precede the path
+%D specification. We therefore can output the \type{cm} at
+%D the moment we encounter it.
+
+\def\handleMPpathconcat
+ {\presetMPconcat
+ \PDFcode{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}%
+ \resetMPstack}
+
+\def\handleMPpathscale
+ {\presetMPscale
+ \PDFcode{\gMPs1 0 0 \gMPs2 0 0 cm}%
+ \resetMPstack}
+
+%D This macro interprets the path and saves it as compact as
+%D possible.
+
+\def\dohandleMPpath#1%
+ {\ifcase\lccode`#1\relax
+ \@EA\dohandleMPpathA
+ \else
+ \@EA\dohandleMPpathB
+ \fi#1}
+
+%\def\dohandleMPpathA#1 %
+% {\setMPargument{#1}%
+% \handleMPsequence}
+
+\let\dohandleMPpathA\setMPsequence
+
+\def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \ifx\somestring\PSlineto
+ \setMPkeyword0
+ \else\ifx\somestring\PScurveto
+ \setMPkeyword1
+ \else\ifx\somestring\PSrlineto
+ \setMPkeyword2
+ \else\ifx\somestring\PSmoveto
+ \setMPkeyword3
+ \else\ifx\somestring\PSclip
+ % \chardef\finiMPpath0 % already
+ \let\handleMPsequence\processMPpath
+ \else\ifx\somestring\PSgsave
+ \chardef\finiMPpath3
+ \else\ifx\somestring\PSgrestore
+ \else\ifx\somestring\PSfill
+ \ifcase\finiMPpath
+ \chardef\finiMPpath2
+ \let\handleMPsequence\processMPpath
+ \fi
+ \else\ifx\somestring\PSstroke
+ \ifcase\finiMPpath
+ \chardef\finiMPpath1
+ \fi
+ \let\handleMPsequence\processMPpath
+ \else\ifx\somestring\PSclosepath
+ \def\closeMPpath{\PDFcode{h}}%
+ \else\ifx\somestring\PSconcat
+ \let\flushMPpath\flushconcatMPpath
+ \handleMPpathconcat
+ \else\ifx\somestring\PSscale
+ \let\flushMPpath\flushconcatMPpath
+ \handleMPpathscale
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \handleMPsequence}
+
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never \NC don't use an object \NC\NR
+%D \NC 1 \NC always \NC always use an object \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject\undefined \chardef\makeMPintoPDFobject=0 \fi
+
+\def\lastPDFMPobject{0}
+
+%D The additional code needed can be made available in the
+%D (global) macro \type {\currentPDFresources}.
+
+\let\currentPDFresources\empty
+
+\newtoks\everyMPtoPDFconversion
+
+\def\convertMPtoPDF % #1#2#3%
+ {\bgroup
+ \ifx\pdfdecimaldigits\undefined\else \pdfdecimaldigits=5 \fi % new
+ \setbox\scratchbox\vbox\bgroup
+ \forgetall
+ \offinterlineskip
+ \startMPresources
+ \doprocessMPtoPDFfile} %
+
+%D The next one is kind of private and probably will become obsolete):
+
+\def\processMPtoPDFfile % file xscale yscale
+ {\bgroup
+ \let\finishMPgraphic\egroup
+ \doprocessMPtoPDFfile}
+
+\def\doprocessMPtoPDFfile#1#2#3% file xscale yscale
+ {% the following line is needed for latex where onepoint is not
+ % onepoint but a number (maxdimen); some day i'll make a latex
+ % variant of this file so that i no longer have to deal with such
+ % issues; then i'll also speed up this module using a few context
+ % tricks
+ %
+ \let\onepoint\onerealpoint
+ %
+ \setMPspecials
+ \the\everyMPtoPDFconversion
+ \catcode`\^^M=\@@endofline
+ \startMPscanning
+ \let\do\empty
+ \xdef\MPxscale{#2}%
+ \xdef\MPyscale{#3}%
+ \xdef\MPxoffset{0}%
+ \xdef\MPyoffset{0}%
+ \xdef\MPyshift{\zeropoint}%
+ \donefalse
+ \let\handleMPsequence\dohandleMPsequence
+ \message{[MP to PDF]}% was: [MP to PDF #1] but there is a (#1) anyway
+ \input#1\relax}
+
+% strange rounding/clip in pdftex/viewer
+%
+% \def\finishMPgraphic
+% {\stopMPresources
+% \egroup
+% \ifx\pdftexversion\undefined\else\ifnum\pdftexversion<14 % for the moment
+% \chardef\makeMPintoPDFobject=0
+% \fi\fi
+% \ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+% \chardef\makeMPintoPDFobject=1
+% \fi\fi
+% \setbox\scratchbox=\vbox
+% {\forgetall
+% \hbox
+% {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space \MPxoffset\space \MPyoffset\space cm}%
+% \lower\MPyshift\box\scratchbox % unscaled shift
+% \PDFcode{Q}}}%
+% \ht\scratchbox\MPheight
+% \wd\scratchbox\MPwidth
+% \dp\scratchbox\zeropoint
+% \ifcase\makeMPintoPDFobject
+% \box\scratchbox
+% \or
+% \immediate\pdfxform resources{\currentPDFresources}\scratchbox
+% \xdef\lastPDFMPobject{\the\pdflastxform}%
+% \pdfrefxform\lastPDFMPobject
+% \global\let\currentPDFresources\empty
+% \else
+% \box\scratchbox
+% \fi
+% \egroup}
+%
+% funny clip in viewer
+%
+% \setbox\scratchbox=\vbox
+% {\forgetall
+% \dimen0=\MPllx bp
+% \dimen2=\MPlly bp
+% \setbox\scratchbox=\hbox{\hskip-\dimen0\raise-\dimen2\box\scratchbox}%
+% \ht\scratchbox=\zeropoint
+% \dp\scratchbox=\zeropoint
+% \wd\scratchbox=\zeropoint
+% \hbox
+% {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space 0 0 cm}%
+% \lower\MPshift\box\scratchbox
+% \PDFcode{Q}}}%
+
+% \let\PDFMPformoffset\zeropoint
+
+\def\PDFMPformoffset
+ {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi}
+
+\def\finishMPgraphic
+ {\stopMPresources
+ \egroup
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \hbox
+ {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space \MPxoffset\space \MPyoffset\space cm}%
+ \lower\MPyshift\box\scratchbox % unscaled shift
+ \PDFcode{Q}}}%
+ \ht\scratchbox\MPheight
+ \wd\scratchbox\MPwidth
+ \dp\scratchbox\zeropoint\relax
+ \dopackageMPgraphic\scratchbox
+ \egroup
+ \endinput}
+
+%D Alternative for \PDFTEX. We cannot come up with something more contexy
+%D because this module is also used in \LATEX.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+ {%\ifx\pdfxform\undefined
+ % \chardef\makeMPintoPDFobject\zerocount % no pdftex at all
+ %\else\ifx\pdftexversion\undefined
+ % \chardef\makeMPintoPDFobject\zerocount % no pdftex at all
+ %\else\ifnum\pdftexversion<14
+ % \chardef\makeMPintoPDFobject\zerocount % no resource support
+ %\else
+ % % keep the default value
+ %\fi\fi\fi
+ \ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+ % an existing value of 2 signals object support (set elsewhere)
+ \chardef\makeMPintoPDFobject\plusone
+ \fi\fi
+ \ifcase\makeMPintoPDFobject
+ \box#1%
+ \or
+ \scratchdimen\PDFMPformoffset\relax
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \setbox#1\vbox spread 2\scratchdimen
+ {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+ \fi
+ \setMPPDFobject{\currentPDFresources}{#1}%
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \vbox to \MPheight
+ {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+ \else
+ \getMPPDFobject
+ \fi
+ \global\let\currentPDFresources\empty
+ \else
+ \box#1%
+ \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\ifx\pdfxform\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifx\pdftexversion\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifnum\pdftexversion<14
+ \def\getMPPDFobject{\box#2}%
+ \else
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}%
+ \fi\fi\fi}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+%D
+%D Here are a few hooks for \CONTEXT\ specific things.
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D \macros
+%D {twodigitMPoutput}
+%D
+%D We can limit the precision to two digits after the comma
+%D by saying:
+%D
+%D \starttyping
+%D \twodigitMPoutput
+%D \stoptyping
+%D
+%D This option only works in \CONTEXT\ combined with \ETEX.
+
+\def\twodigitMPoutput
+ {\let\!MP \twodigitrounding
+ \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}%
+ \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}}
+
+\let\!MP \empty
+\let\!MPgMPa\gMPa
+\let\!MPgMPs\gMPs
+
+%D This kind of conversion is possible because \METAPOST\
+%D does all the calculations. Converting other \POSTSCRIPT\
+%D files would drive both me and \TEX\ crazy.
+
+\ifx\undefined\StopLatexHack \else \StopLatexHack \fi
+
+\protect \endinput
diff --git a/systems/doc/pdftex/samplepdftex/tmp.pdf b/systems/doc/pdftex/samplepdftex/tmp.pdf
new file mode 100644
index 0000000000..3ce979ebf0
--- /dev/null
+++ b/systems/doc/pdftex/samplepdftex/tmp.pdf
Binary files differ
diff --git a/systems/doc/pdftex/tests/01-fake-interword-space/Makefile b/systems/doc/pdftex/tests/01-fake-interword-space/Makefile
new file mode 100644
index 0000000000..f565355eab
--- /dev/null
+++ b/systems/doc/pdftex/tests/01-fake-interword-space/Makefile
@@ -0,0 +1,7 @@
+# Public domain.
+
+test:
+ ../../source/build-pdftex/texk/web2c/pdftex -ini fake-interword-space.tex
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.pfb b/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.pfb
new file mode 100644
index 0000000000..46390162be
--- /dev/null
+++ b/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.pfb
Binary files differ
diff --git a/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.tfm b/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.tfm
new file mode 100644
index 0000000000..fc0719e1a5
--- /dev/null
+++ b/systems/doc/pdftex/tests/01-fake-interword-space/dummy-space.tfm
Binary files differ
diff --git a/systems/doc/pdftex/tests/01-fake-interword-space/fake-interword-space.tex b/systems/doc/pdftex/tests/01-fake-interword-space/fake-interword-space.tex
new file mode 100644
index 0000000000..09d7bff39f
--- /dev/null
+++ b/systems/doc/pdftex/tests/01-fake-interword-space/fake-interword-space.tex
@@ -0,0 +1,34 @@
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+
+\pdfmapline{+dummy-space <dummy-space.pfb}
+\pdfglyphtounicode{space}{0020}
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+Text with no interword spaces.
+
+\pdfinterwordspaceon
+
+Switch to text with faked interword spaces.
+
+\pdfinterwordspaceoff
+
+Back to text with no interword \pdffakespace spaces.
+
+% Test of \pdffakespace in vertical mode
+\pdffakespace
+
+% Test of \pdffakespace in math mode
+$a\pdffakespace b$
+
+Back to text with no interword \pdffakespace\pdffakespace spaces.
+
+% Test of \pdffakespace in vertical mode
+\pdffakespace
+\pdffakespace
+
+% Test of \pdffakespace in math mode
+$a\pdffakespace \pdffakespace b$
+\bye
diff --git a/systems/doc/pdftex/tests/02-pdfmatch/Makefile b/systems/doc/pdftex/tests/02-pdfmatch/Makefile
new file mode 100644
index 0000000000..06943375d0
--- /dev/null
+++ b/systems/doc/pdftex/tests/02-pdfmatch/Makefile
@@ -0,0 +1,10 @@
+# $Id: Makefile 758 2016-06-12 16:54:10Z karl $
+# Public domain.
+
+include ../Common.mak
+
+testpdfmatch:
+ $(prog) test-pdfmatch.tex
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/02-pdfmatch/test-pdfmatch.tex b/systems/doc/pdftex/tests/02-pdfmatch/test-pdfmatch.tex
new file mode 100644
index 0000000000..f6d55fe587
--- /dev/null
+++ b/systems/doc/pdftex/tests/02-pdfmatch/test-pdfmatch.tex
@@ -0,0 +1,22 @@
+% $Id: test-pdfmatch.tex 759 2016-06-12 18:11:28Z karl $
+% This file public domain. Bug report of \pdflastmatch crash:
+% http://tug.org/pipermail/tex-live/2016-June/038664.html
+%
+\catcode`\{=1 \catcode`\}=2 \catcode`^=7 \newlinechar=`^^J
+%
+\message{^^Jpdflastmatch0 before any match: \pdflastmatch0}
+\message{^^J}%
+%
+\message{^^Jmatch a to b: \pdfmatch{a}{b}}
+\message{^^J}%
+\message{pdflastmatch0: \pdflastmatch0}
+\message{^^J}%
+%
+\message{^^Jmatch example: \pdfmatch subcount 3 {ab(cd)*ef(gh)(ij)}{abefghij}}
+\message{^^J}%
+\message{pdflastmatch0 (0->abefghij): \pdflastmatch0 ^^J}
+\message{pdflastmatch1 (-1->): \pdflastmatch1 ^^J}
+\message{pdflastmatch2 (4->gh): \pdflastmatch2 ^^J}
+\message{pdflastmatch3 (-1->): \pdflastmatch3}
+\message{^^J}%
+\end
diff --git a/systems/doc/pdftex/tests/03-deterministic-output/Makefile b/systems/doc/pdftex/tests/03-deterministic-output/Makefile
new file mode 100644
index 0000000000..0f7177f77e
--- /dev/null
+++ b/systems/doc/pdftex/tests/03-deterministic-output/Makefile
@@ -0,0 +1,48 @@
+# $Id: Makefile 772 2017-03-16 22:58:04Z karl $
+# Public domain.
+
+include ../Common.mak
+
+test1:
+ $(prog) test-no-date-id.tex
+
+test2:
+ $(prog) test-fixed-date-id.tex
+
+testprim:
+ SOURCE_DATE_EPOCH=120 FORCE_SOURCE_DATE=1 \
+ $(prog) test-prim.tex
+
+test = test-SOURCE_DATE_EPOCH
+# test invalid settings of the envvar.
+test3-invalid:
+ -SOURCE_DATE_EPOCH=" " $(prog) $(test).tex
+ -SOURCE_DATE_EPOCH=abc123 $(prog) $(test).tex
+ -SOURCE_DATE_EPOCH=0.0 $(prog) $(test).tex
+ -SOURCE_DATE_EPOCH=-1 $(prog) $(test).tex
+ -SOURCE_DATE_EPOCH=123abc $(prog) $(test).tex
+ -SOURCE_DATE_EPOCH=994399281551439928155 $(prog) $(test).tex
+
+test3-orig.pdf:
+ $(prog) $(test).tex && mv $(test).pdf $@
+
+# test valid settings of the envvar.
+test3-valid: test3-orig.pdf test3-repro.pdf
+ SOURCE_DATE_EPOCH=0 $(prog) $(test).tex
+ SOURCE_DATE_EPOCH="" $(prog) $(test).tex # same as 0
+ -$(diff) $< $(test).pdf # shows differences
+ SOURCE_DATE_EPOCH=11 $(prog) $(test).tex
+ $(diff) test3-repro.pdf $(test).pdf # should be identical
+# SOURCE_DATE_EPOCH=1439928155 $(prog) $(test).tex
+
+# make an original with nonzero time for checking.
+test3-repro.pdf: force
+ SOURCE_DATE_EPOCH=11 $(prog) $(test).tex && mv $(test).pdf $@
+force:
+
+clean:
+ $(clean)
+
+fmt:
+ $(prog) \*pdflatex.ini
+ $(prog) \*pdfetex.ini
diff --git a/systems/doc/pdftex/tests/03-deterministic-output/test-SOURCE_DATE_EPOCH.tex b/systems/doc/pdftex/tests/03-deterministic-output/test-SOURCE_DATE_EPOCH.tex
new file mode 100644
index 0000000000..bc037ea01c
--- /dev/null
+++ b/systems/doc/pdftex/tests/03-deterministic-output/test-SOURCE_DATE_EPOCH.tex
@@ -0,0 +1,10 @@
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+abc
+\eject
+def
+\bye
diff --git a/systems/doc/pdftex/tests/03-deterministic-output/test-fixed-date-id.tex b/systems/doc/pdftex/tests/03-deterministic-output/test-fixed-date-id.tex
new file mode 100644
index 0000000000..933ed1b5f5
--- /dev/null
+++ b/systems/doc/pdftex/tests/03-deterministic-output/test-fixed-date-id.tex
@@ -0,0 +1,16 @@
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+\pdfinfo{%
+ /ModDate (D:20150813230402+02'00')
+ /CreationDate (D:20150813230402+02'00')
+}
+\pdftrailerid{test-fixed-date-id.tex:20150813230402+02'00'}
+
+abc
+\eject
+def
+\bye
diff --git a/systems/doc/pdftex/tests/03-deterministic-output/test-no-date-id.tex b/systems/doc/pdftex/tests/03-deterministic-output/test-no-date-id.tex
new file mode 100644
index 0000000000..c8ebf176f4
--- /dev/null
+++ b/systems/doc/pdftex/tests/03-deterministic-output/test-no-date-id.tex
@@ -0,0 +1,13 @@
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+\pdfinfoomitdate=1
+\pdftrailerid{}
+
+abc
+\eject
+def
+\bye
diff --git a/systems/doc/pdftex/tests/03-deterministic-output/test-prim.tex b/systems/doc/pdftex/tests/03-deterministic-output/test-prim.tex
new file mode 100644
index 0000000000..c00641ed4f
--- /dev/null
+++ b/systems/doc/pdftex/tests/03-deterministic-output/test-prim.tex
@@ -0,0 +1,11 @@
+% $Id: test-prim.tex 762 2016-07-05 17:44:56Z karl $
+% See the testprim: target in ./Makefile for the invocation.
+
+\catcode`\{ = 1
+\catcode`\} = 2
+
+\ifnum\year=1970 \else \errmessage{year is \the\year, not 1970}\fi
+\ifnum\month=1 \else \errmessage{month is \the\month, not 1}\fi
+\ifnum\day=1 \else \errmessage{day is \the\day, not 1}\fi
+\ifnum\time=2 \else \errmessage{time is \the\time, not 2}\fi
+\end
diff --git a/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/Makefile b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/Makefile
new file mode 100644
index 0000000000..554a361248
--- /dev/null
+++ b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/Makefile
@@ -0,0 +1,40 @@
+# $Id: Makefile 772 2017-03-16 22:58:04Z karl $
+# Public domain.
+
+include ../Common.mak
+
+all: abc-diff testptex-diff testdate-diff testtrailer-diff
+
+abc abc.pdf:
+ $(env) $(prog) '\pdfsuppressptexinfo=1\input' abc.tex </dev/null
+
+abc-orig.pdf:
+ $(env) $(prog) abc.tex </dev/null && mv abc.pdf $@
+abc-diff: abc-orig.pdf abc.pdf
+ -$(diff) $^ # /PTEX.Fullbanner should be gone
+
+testptex = test-pdfsuppressptexinfo
+$(testptex)-orig.pdf: $(testptex).tex abc.pdf
+ $(env) $(prog) $(testptex).tex </dev/null \
+ && mv $(testptex).pdf $(testptex)-orig.pdf
+$(testptex).pdf: $(testptex).tex abc.pdf Makefile
+ $(env) $(prog) '\pdfsuppressptexinfo=-1\input' $(testptex).tex \
+ </dev/null
+testptex-diff: $(testptex)-orig.pdf $(testptex).pdf
+ -$(diff) $^ # all /PTEX.* should be gone
+
+# these are also tested in ../03-deterministic-output, but can try them here.
+testdate = test-pdfinfoomitdate
+$(testdate).pdf: $(testdate).tex abc.pdf
+ $(env) $(prog) $(testdate).tex </dev/null
+testdate-diff: $(testptex)-orig.pdf $(testdate).pdf
+ -$(diff) $^ # /CreationDate, /ModDate should be gone
+
+testtrailer = test-pdftrailer
+$(testtrailer).pdf: $(testtrailer).tex abc.pdf
+ $(env) $(prog) $(testtrailer).tex </dev/null
+testtrailer-diff: $(testptex)-orig.pdf $(testtrailer).pdf
+ -$(diff) $^ # new /mytrlrkey, dates+id should be different
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/abc.tex b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/abc.tex
new file mode 100644
index 0000000000..045ccbcd2f
--- /dev/null
+++ b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/abc.tex
@@ -0,0 +1,10 @@
+% $Id: abc.tex 737 2016-03-21 22:54:16Z karl $
+% Public domain.
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+abc
+\bye
diff --git a/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfinfoomitdate.tex b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfinfoomitdate.tex
new file mode 100644
index 0000000000..dfd30ceb99
--- /dev/null
+++ b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfinfoomitdate.tex
@@ -0,0 +1,4 @@
+% $Id: test-pdfinfoomitdate.tex 737 2016-03-21 22:54:16Z karl $
+% Public domain.
+\pdfinfoomitdate = 1
+\input test-pdfsuppressptexinfo
diff --git a/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfsuppressptexinfo.tex b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfsuppressptexinfo.tex
new file mode 100644
index 0000000000..fac5e30b80
--- /dev/null
+++ b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdfsuppressptexinfo.tex
@@ -0,0 +1,18 @@
+% $Id: test-pdfsuppressptexinfo.tex 740 2016-04-23 15:08:37Z karl $
+% Public domain.
+\input plain.tex
+\input pdftexconfig.tex
+\input pdftexmagfix.tex
+\pdfcompresslevel=0
+\pdfobjcompresslevel=0
+
+% \pdfsuppressptexinfo=-1
+% \pdfsuppressptexinfo=15
+% \pdfsuppressptexinfo=8
+% \pdfsuppressptexinfo=4
+% \pdfsuppressptexinfo=2
+% \pdfsuppressptexinfo=1
+
+\pdfximage{abc.pdf}
+\hbox{\pdfrefximage\pdflastximage}
+\bye
diff --git a/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdftrailer.tex b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdftrailer.tex
new file mode 100644
index 0000000000..119292229a
--- /dev/null
+++ b/systems/doc/pdftex/tests/04-pdfsuppressptexinfo/test-pdftrailer.tex
@@ -0,0 +1,6 @@
+% $Id: test-pdftrailer.tex 737 2016-03-21 22:54:16Z karl $
+% Public domain.
+\pdfoutput=1 \catcode`\{=1 \catcode`\}=2
+\pdftrailer {/mytrlrkey /mytrlrval}
+\pdftrailerid {} % seed for trailer id
+\input test-pdfsuppressptexinfo
diff --git a/systems/doc/pdftex/tests/05-mediabox/Makefile b/systems/doc/pdftex/tests/05-mediabox/Makefile
new file mode 100644
index 0000000000..6f45b14cac
--- /dev/null
+++ b/systems/doc/pdftex/tests/05-mediabox/Makefile
@@ -0,0 +1,18 @@
+# $Id: Makefile 772 2017-03-16 22:58:04Z karl $
+# Public domain.
+
+include ../Common.mak
+
+default: test-normal test-omit-mediabox
+
+test-normal:
+ $(prog) test-normal.tex
+ grep -q /MediaBox.*314 test-normal.pdf
+
+test-omit-mediabox:
+ $(prog) test-omit-mediabox.tex
+ grep -q /MediaBox.*271 test-omit-mediabox.pdf # should be there
+ ! grep -q /MediaBox.*314 test-omit-mediabox.pdf # should not
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/05-mediabox/test-normal.tex b/systems/doc/pdftex/tests/05-mediabox/test-normal.tex
new file mode 100644
index 0000000000..f054485556
--- /dev/null
+++ b/systems/doc/pdftex/tests/05-mediabox/test-normal.tex
@@ -0,0 +1,7 @@
+% $Id: test-normal.tex 772 2017-03-16 22:58:04Z karl $
+% Public domain.
+
+\pdfoutput=1
+\pdfpagewidth=314bp
+\pdfpageheight=315bp
+X.\end
diff --git a/systems/doc/pdftex/tests/05-mediabox/test-omit-mediabox.tex b/systems/doc/pdftex/tests/05-mediabox/test-omit-mediabox.tex
new file mode 100644
index 0000000000..93eb60dbc1
--- /dev/null
+++ b/systems/doc/pdftex/tests/05-mediabox/test-omit-mediabox.tex
@@ -0,0 +1,8 @@
+% $Id: test-omit-mediabox.tex 772 2017-03-16 22:58:04Z karl $
+% Public domain.
+
+\pdfoutput=1 \catcode`\{=1 \catcode`\}=2
+\pdfpagewidth=314bp
+\pdfpageheight=315bp
+\pdfpageattr{/MediaBox [ 0 1 271 272 ]}
+X.\end
diff --git a/systems/doc/pdftex/tests/06-pkmap/Makefile b/systems/doc/pdftex/tests/06-pkmap/Makefile
new file mode 100644
index 0000000000..853ec0eb2b
--- /dev/null
+++ b/systems/doc/pdftex/tests/06-pkmap/Makefile
@@ -0,0 +1,24 @@
+# $Id: Makefile 777 2017-04-20 23:08:32Z karl $
+# Public domain.
+
+include ../Common.mak
+
+default: test-pkmap
+
+test-pkenc: # cmr10.3600pk - not used
+ $(prog) test-pkmap.tex
+#
+# should work when and if patch is applied:
+# grep -q /ffi test-pkenc.pdf # should end up with this encoded char
+# grep -a ToUnicode test-pkenc.pdf
+#
+# dev convenience:
+# pdffonts test-big.pdf
+# pdftotext test-big.pdf -
+
+cmr10.3600pk:
+ mf-nowin '\mode:=ljfour;mag:=6;input cmr10'
+ gftopk cmr10.3600gf
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/06-pkmap/cmb10.72pk b/systems/doc/pdftex/tests/06-pkmap/cmb10.72pk
new file mode 100644
index 0000000000..9de73dcd0f
--- /dev/null
+++ b/systems/doc/pdftex/tests/06-pkmap/cmb10.72pk
Binary files differ
diff --git a/systems/doc/pdftex/tests/06-pkmap/cmr10.72pk b/systems/doc/pdftex/tests/06-pkmap/cmr10.72pk
new file mode 100644
index 0000000000..35ed3e2158
--- /dev/null
+++ b/systems/doc/pdftex/tests/06-pkmap/cmr10.72pk
Binary files differ
diff --git a/systems/doc/pdftex/tests/06-pkmap/prepatch.pdf b/systems/doc/pdftex/tests/06-pkmap/prepatch.pdf
new file mode 100644
index 0000000000..07617bdba2
--- /dev/null
+++ b/systems/doc/pdftex/tests/06-pkmap/prepatch.pdf
Binary files differ
diff --git a/systems/doc/pdftex/tests/06-pkmap/test-pkmap.tex b/systems/doc/pdftex/tests/06-pkmap/test-pkmap.tex
new file mode 100644
index 0000000000..f78d7c095d
--- /dev/null
+++ b/systems/doc/pdftex/tests/06-pkmap/test-pkmap.tex
@@ -0,0 +1,37 @@
+% $Id: test-pkmap.tex 777 2017-04-20 23:08:32Z karl $
+% Public domain.
+% Test map files with bitmap (i.e., Type 3) fonts.
+
+% A thread starting here:
+% http://tug.org/pipermail/pdftex/2016-July/009064.html
+% and continuing here (and more):
+% http://tug.org/pipermail/pdftex/2016-August/009065.html
+% discusses a patch for supporting an encoding file with Type 3.
+% The patch has not yet been installed.
+%
+% For comparison, the PDF made before the patch was applied is saved
+% here as prepatch.pdf.
+%
+% The default PK resolution is 72, so we made cmb10.72pk in this directory.
+% (mf-nowin '\mode:=mactrue; input cmb10' && gftopk cmb10.72gf)
+% (mf-nowin '\mode:=mactrue; input cmr10' && gftopk cmr10.72gf)
+%
+\pdfoutput=1 \catcode`\{=1 \catcode`\}=2
+\hsize=6pc \parfillskip=0pt plus1fil \vsize=6in \lineskip=1pc
+\pdfcompresslevel=0 \pdfobjcompresslevel=0
+
+\pdfglyphtounicode{ffi}{0066 0066 0069} %no need for all: \input glyphtounicode
+\pdfgentounicode=1
+
+\pdfmapline{cmr10}% type3 map without encoding - no ToUnicode, no /ffi.
+\font\cmr=cmr10 \noindent \cmr ffi
+
+% if we install the patch.
+%\pdfmapline{cmb10 <7t.enc}% type3 map with encoding
+%\font\cmb=cmb10 \noindent \cmb ffi
+
+% geometrically-scaled tfm: the Type 3 should be scaled (resulting in
+% blocky blown-up bits), instead of using a separately-generated
+% cmr10.360pk (50*72/10).
+\font\big = cmr10 at 50pt \big big
+\end
diff --git a/systems/doc/pdftex/tests/07-mapwarn/Makefile b/systems/doc/pdftex/tests/07-mapwarn/Makefile
new file mode 100644
index 0000000000..6e40de9242
--- /dev/null
+++ b/systems/doc/pdftex/tests/07-mapwarn/Makefile
@@ -0,0 +1,12 @@
+# $Id: Makefile 777 2017-04-20 23:08:32Z karl $
+# Public domain.
+
+include ../Common.mak
+
+default: test-mapwarn
+
+test-mapwarn:
+ $(prog) test-mapwarn.tex; test $$? = 1 # pdftex should exit 1
+
+clean:
+ $(clean)
diff --git a/systems/doc/pdftex/tests/07-mapwarn/test-mapwarn.tex b/systems/doc/pdftex/tests/07-mapwarn/test-mapwarn.tex
new file mode 100644
index 0000000000..7088ab2a8a
--- /dev/null
+++ b/systems/doc/pdftex/tests/07-mapwarn/test-mapwarn.tex
@@ -0,0 +1,18 @@
+% $Id: test-mapwarn.tex 777 2017-04-20 23:08:32Z karl $
+% Public domain.
+% Ensure that various invalid map lines don't cause a crash.
+% The last line aborts due to a (detected) buffer overflow.
+
+\pdfoutput=1 \catcode`\{=1 \catcode`\}=2
+\catcode`\^=7 \newlinechar=`\^^J
+
+% all but the first should cause warnings.
+\message{empty^^J}\pdfmapline{}
+\message{just <^^J}\pdfmapline{<}
+\message{justtfm<^^J}\pdfmapline{cmb10x1<}
+\message{justtfm <^^J}\pdfmapline{cmb10x2 <}
+\message{justtfm < ^^J}\pdfmapline{cmb10x3 < }
+\message{notfm slant^^J}\pdfmapline{" 167 SlantFont " <foo.pfb
+\message{notfm extend^^J}\pdfmapline{" 167 ExtendFont " <bar.pfb}
+\pdfmapline{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
+\end
diff --git a/systems/doc/pdftex/tests/Common.mak b/systems/doc/pdftex/tests/Common.mak
new file mode 100644
index 0000000000..04e3afd2c1
--- /dev/null
+++ b/systems/doc/pdftex/tests/Common.mak
@@ -0,0 +1,34 @@
+# $Id: Common.mak 777 2017-04-20 23:08:32Z karl $
+# Public domain.
+
+# Common Makefile definitions to run pdftex from test hierarchy,
+# but use support files from an installation.
+
+tl = /usr/local/texlive-rel
+tl_dist = $(tl)/texmf-dist
+#
+plain = $(tl_dist)/tex/plain/base
+plain_config = $(tl_dist)/tex/plain/config
+generic_config = $(tl)/texmf-config/tex/generic/config
+generic_hyphen = $(tl_dist)/tex/generic/hyphen
+#
+tfm_cm = $(tl_dist)/fonts/tfm/public/cm
+tfm_knuth = $(tl_dist)/fonts/tfm/public/knuth-lib
+t1_cm = $(tl_dist)/fonts/type1/public/amsfonts/cm
+#
+env = TEXINPUTS=.:$(plain):$(plain_config):$(generic_config):$(generic_hyphen)\
+ TEXFONTS=.:$(tfm_cm):$(tfm_knuth):$(t1_cm) \
+ TEXFONTMAPS=$(tl_dist)/fonts/map/pdftex/updmap \
+ ENCFONTS=$(tl_dist)/fonts/enc/dvips/base \
+ MKTEXTFM=0 \
+ MKTEXPK=0 \
+ KPATHSEA_WARNING=0
+
+diff = diff --text -c0
+
+pdftex = ../../source/build-pdftex/texk/web2c/pdftex
+pdftex = $(W)/texk/web2c/pdftex
+prog = $(env) $(pdftex) -ini -interaction=nonstopmode
+
+# can't make the clean: target here since then it would be the default.
+clean = rm -f *.log *.pdf *.fmt *.aux
diff --git a/systems/doc/xetex/NEWS b/systems/doc/xetex/NEWS
new file mode 100644
index 0000000000..aec8a2fcb4
--- /dev/null
+++ b/systems/doc/xetex/NEWS
@@ -0,0 +1,207 @@
+==============================================================
+XeTeX 0.99992 was released 2015
+==============================================================
+
+XeTeX:
+* Various image handling fixes by Akira Kakuto.
+* Fix off-by-one error in display of \every... token registers, thanks to Bruno
+ Le Floch.
+* The XDV opcodes have been simplified slightly. The DVI id have been bumped to
+ 6 to reflect this.
+* XeTeX now looks for the xdvipdfmx binary installed next to it and no longer
+ requires that it is installed in the system PATH (this was previously done
+ only on Windows).
+
+==============================================================
+XeTeX 0.99991 was released 20140614
+==============================================================
+
+XeTeX:
+* Drop build date from “--version” output.
+* Drop Mac-specific image loading code, as it makes little sense after we
+ dropped xdv2pdf. Supported image formats are the same on all platforms now.
+* Fix OpenType math cut-ins support which was not always working properly.
+* Avoid Unicode compatibility decomposition fallback for characters not
+ supported by the font as it often result in loss of essential characteristics
+ (like using regular Latin characters in place of missing math fraktur ones).
+ Non compatibility decomposition and composition fallback is still supported.
+* For hybrid OpenType/Graphite fonts, we now prefer using OpenType for
+ compatibility with pre-0.9999 XeTeX.
+* Fix many memory leaks when using AAT fonts on Mac.
+* The “language” font option when loading Graphite fonts in now treated as a
+ BCP 47 language tag not and OpenType one.
+* Various Unicode fixes for Windows console (thanks to TANAKA Takuji).
+* Respect vertical glyph positioning with AAT fonts (fixes, for example,
+ rendering of the new Arabic fonts in Mac OS X 10.9).
+
+==============================================================
+XeTeX 0.9999.3 was released 20130528
+==============================================================
+
+XeTeX:
+* Fix bug with extensible accents resulting in invalid glyph id some times.
+* Fix alternate index in multiple alternates features to be start from zero
+ like pre-0.9999 XeTeX.
+* Document multiple alternates syntax in the reference documentation.
+
+==============================================================
+XeTeX 0.9999.2 was released 20130406
+==============================================================
+
+XeTeX:
+* Fix regression in \XeTeXOT* primitives with fonts where the number of
+ languages in a given script is not the same in both GSUB and GPOS tables.
+
+* Add a workaround for a bug in clang headers to allow building with it on Mac.
+
+* Fix regression in loading PNG files on Mac.
+
+* Fix multiple regression with vertical text layout.
+
+* Update to HarfBuzz 0.9.15 fixing a couple of regressions with Arabic non
+ spacing marks and Hangul jamo.
+
+* Various build fixes for third party libraries.
+
+* XeTeX reference is now included in the release tarball.
+
+xdvipdfmx:
+* Speed up inclusion of eps figures by Tsuchimura Nobuyuki.
+
+==============================================================
+XeTeX 0.9999.1 was released 20130322
+==============================================================
+
+XeTeX:
+* Fix loading font files on PPC Mac OS 10.5 (and potentially other versions of
+ Mac).
+
+* Fix handling of ‘script’ and ‘language’ font options to be treated again as
+ OpenType not ISO tags, so that passing version 2 Indic script tags works
+ (though this is generally not needed as HarfBuzz will always use version 2
+ shaping if the font has it, regardless of the tag used).
+
+* Fix loading JPEG images that do not specify a resolution.
+
+* When printing multi-byte characters to log or terminal avoid inserting new
+ lines in the middle of the characters, and count the characters not the bytes
+ when calculating line length.
+
+* Update to HarfBuzz 0.9.14, a couple of Indic and Hangul shaping bugs.
+
+xdvipdfmx:
+* Speed up calculating glyph widths in native font.
+
+* Don’t crash when /tmp is full.
+
+==============================================================
+XeTeX 0.9999.0 was released 20130311
+==============================================================
+
+* Port OpenType layout from ICU LayoutEngine to HarfBuzz.
+ HarfBuzz is actively maintained and generally have much wider support for
+ OpenType spec, the switch fixes a number of OpenType bugs:
+ - Support version 2 OpenType Indic specs.
+ - Many other Indic OpenType bugs, and support for the latest additions to
+ OpenType spec.
+ - Incorrect application of contextual features.
+ - Incorrect kerning in fonts that has both old “kern” table and new GPOS
+ “kern” feature.
+ - Allow suppressing Latin ligatures with ZWNJ.
+ - Support for variation selectors.
+ - Support for user-specified features with complex scripts.
+
+* Port Graphite layout to from SilGraphite to HarfBuzz and Graphite2. Which
+ provides a more robust Graphite support and also fixes a number of Graphite
+ bugs.
+
+* Port AAT font layout and font searching on Mac from the deprecated ATS/ATSUI
+ to Core Text, and image support on Mac from QuickTime to ImageIO framework.
+ XeTeX can be finally built on 64-bit Mac! Work contributed by Jiang Jiang.
+
+* Add “/OT” font variant, similar to “/ICU” which is now deprecated.
+
+* Add a “shaper” font option to specify HarfBuzz shapers (for testing).
+
+* Guess script from input string if no one is given in the font definition,
+ instead of defaulting to Latin.
+
+* Support 4-letter tags for Graphite features.
+
+* Fix applying negative delta glyph advance to the last glyph in the run, fixes
+ issues with “halt” and “vhal” features.
+
+* Use \U prefix for extended math primitives, allowing XeTeX and LuaTeX to use
+ the same names for Unicode math primitives supported by both engines. The old
+ \XeTeX* primitives have been deprecated and will be removed in the future.
+
+* Support OpenType math cut ins.
+
+* Fix “\show” and “\meaning” of “\Umathchar” to a print a form that is legal
+ input.
+
+* Fix italic correction to not depend on space factor being zero for OpenType
+ fonts.
+
+* Fix sporadic shifting of extensible accents.
+
+* Fix typesetting XeTeX’s WEB code, in addition to various slight improvements.
+
+* Prefer TrueType/OpenType over Type1 fonts with the same font name.
+
+* Support input pipes, in line with other engines.
+
+* Drop support for using “()” as font names quotes since it was causing file
+ names with parenthesis not to be found.
+
+* Fix “\show” with characters outside BMP.
+
+* Print the actual character instead of hex code for characters outside BMP
+ with “\show”, “\meaning”, “\showlists” and missing char log messages.
+
+* Fix letterspacing if zero width glyphs.
+
+* Try to get cap and x height from OS/2 table first.
+
+* Reject bitmap only fonts.
+
+* Include build date in “--version” output.
+
+==============================================================
+XeTeX 0.9998 was released 20120708
+==============================================================
+
+* Fix mismatch between fonts loaded by XeTeX and xdvipdfmx when multiple
+ versions of the font exist.
+
+* Fix “\the\textfont” with families > 15
+
+* Extend “\fam” to accept family number up to 255.
+
+* Fix build on Mac OS 10.7
+
+OpenType math:
+
+* Fix displacement of big operator's limits when “DisplayOperatorMinHeight” is
+ higher than the size of the big operator.
+
+* Fix too wide accents over accentees that has sub/superscript.
+
+* Support extensible accents for “\overbrace” etc.
+
+* Always take math constants from current font, fixes multiple math discrepancies.
+
+* Honor relevant math constants when positioning sub/superscripts.
+
+* Honor “AccentBaseHeight” when placing accents.
+
+* Support “fixed” and “bottom” keywords in “\XeTeXmathaccent” for non growing
+ and bottom accents, respectively.
+
+* Fix horizontal placement of of accents over single letters to honor their top
+ accent position value.
+
+* Fix vertical placement of sub/superscripts of single letters to not be
+ treated as non-single letters.
+
+* Support proper positioning of nested accents.
diff --git a/systems/doc/xetex/README b/systems/doc/xetex/README
new file mode 100644
index 0000000000..35af46b298
--- /dev/null
+++ b/systems/doc/xetex/README
@@ -0,0 +1,15 @@
+$Id: README 37058 2015-04-26 18:13:32Z karl $
+
+XeTeX is an extension of Donald Knuth's TeX, originally and primarily
+written by Jonathan Kew. It natively supports UTF-8 Unicode input and
+TrueType and OpenType fonts, mainly via external third-party libraries.
+(Run xetex --version to see a list of the principal ones.)
+
+XeTeX's user-level output is a PDF file; it does not support standard
+DVI output.
+
+The XeTeX home page: http://tug.org/xetex
+The CTAN Catalogue entry: http://ctan.org/pkg/xetex
+
+(This tiny README file is public domain, originally written by
+Karl Berry, 2015.)
diff --git a/systems/doc/xetex/XeTeX-notes.pdf b/systems/doc/xetex/XeTeX-notes.pdf
new file mode 100644
index 0000000000..370b5e090f
--- /dev/null
+++ b/systems/doc/xetex/XeTeX-notes.pdf
Binary files differ
diff --git a/systems/doc/xetex/XeTeX-notes.tex b/systems/doc/xetex/XeTeX-notes.tex
new file mode 100644
index 0000000000..d25b596af2
--- /dev/null
+++ b/systems/doc/xetex/XeTeX-notes.tex
@@ -0,0 +1,336 @@
+%!TEX TS-program = xelatex
+%!TEX encoding = UTF-8 Unicode
+
+%% Note that the Optical Sizes section uses the Brioso Pro Opticals family for examples;
+%% the file will typeset without them installed, but will not display the samples in their true faces
+
+\documentclass[a4paper]{article}
+
+\usepackage[dvipdfm,colorlinks=true]{hyperref}
+\usepackage{euler}
+\usepackage{fontspec}
+
+\sloppy
+
+\setromanfont[Numbers=Uppercase]{Hoefler Text}
+\setmonofont[Scale=0.95,Ligatures=NoCommon]{Courier}
+{\tt \global\hyphenchar\font = -1 } % prevent hyphenation in commands etc
+\frenchspacing
+
+\renewcommand{\baselinestretch}{1.1}
+
+% Version of the XeTeX logo that doesn't depend on Ǝ being available in the font
+% NB: not suitable for use in italic!
+% Requires XeTeX 0.7 or later
+\def\reflect#1{{\setbox0=\hbox{#1}\rlap{\kern0.5\wd0
+ \special{x:gsave}\special{x:scale -1 1}}\box0 \special{x:grestore}}}
+\def\XeTeX{\leavevmode
+ \setbox0=\hbox{X\lower.5ex\hbox{\kern-.15em\reflect{E}}\kern-.1667em \TeX}%
+ \dp0=0pt\ht0=0pt\box0 }
+
+\def\eTeX{$\varepsilon$-\TeX}
+\def\TeXgX{\TeX\lower.5ex\hbox{\kern-.15em G}\kern-.25em X}
+
+\catcode`\|=\active
+\def|{\bgroup \tt \def\do##1{\catcode`##1=12 }\dospecials\catcode`\-=12 \verb}
+\def\verb#1|{#1\egroup}
+\begin{document}
+
+\title{About \XeTeX}
+\author{Jonathan Kew}
+\date{17 October 2005}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+\XeTeX\footnote{Normally pronounced as if it were written {\em zee-\TeX}.} is an adaptation for Mac OS~X of the \TeX\ typesetting system developed by Professor Donald E. Knuth of Stanford University. If you are not familiar with \TeX, you will need to obtain and study the definitive manual for the system, Knuth's {\em The \TeX book} (published by Addison Wesley), or one of the many other works on \TeX, before you will be able to do much with \XeTeX. The following brief notes discuss only the specific details of the \XeTeX\ system, and in particular the ways it differs from standard \TeX; much of what follows will make little sense without prior familiarity with \TeX.
+
+The \XeTeX\ web site, where the latest information and downloads can be found, is at \url{http://scripts.sil.org/xetex}.
+
+Questions and comments concerning \XeTeX\ may be sent to the author at the email address \url{mailto:nrsi@sil.org}, or raised on the \XeTeX\ mailing list, hosted by the \TeX\ Users Group. This is a good place to find information and help, as documentation is currently very limited. See \url{http://tug.org/mailman/listinfo/xetex} for details.
+
+\XeTeX\ is copyright ©1994-2005 by SIL International. It is a successor to the \TeXgX\ program that was developed for earlier versions of Mac OS, using the now-obsolete QuickDraw GX technology.
+
+\section{Unicode support}
+
+While \TeX\ is an 8-bit system, processing text encoded as a stream of single bytes, and accessing fonts using single-byte character indexes, \XeTeX\ is designed to work with Unicode text. The fundamental "characters" that \XeTeX\ works with are 16-bit codes that are assumed to represent the UTF-16 encoding form of Unicode (so characters in Planes 1–16 are represented as surrogate pairs, two \XeTeX\ code units each).
+
+The most common form of Unicode text used with \XeTeX\ is UTF-8; this is also the encoding form used for all text output files (the |.log| file and any |\write| output). \XeTeX\ reads UTF-8 input files and converts the byte sequences into Unicode character codes automatically ({\em without} the use of additional \TeX\ macros such as the \LaTeX\ |inputenc| package). It will also automatically read files using UTF-16, should this be necessary.
+
+Because \XeTeX\ works with UTF-16 code units, \TeX\ commands that deal with character codes, such as |\char|, |\catcode|, |\lccode|, etc., have been extended to handle 16-bit values (up to 65535, or |"FFFF|). Note that it is {\em not} possible to assign individual character properties such as |\catcode| to non-Plane 0 Unicode characters, because these are treated as a pair of surrogate codes; however, there is probably little reason to need to do this. Supplementary-plane characters can still be treated as normal text to be typeset.
+
+It is also possible for \XeTeX\ to convert external files in non-Unicode encodings into its internal Unicode representation as they are read; see section~\ref{sec:encoding} below.
+
+\section{Font access}
+
+The second main feature of \XeTeX\ that sets it apart from \TeX\ is the ability to easily use Unicode-compliant fonts and work with both Mac OS~X's advanced typographic services (AAT: Apple Advanced Typography) and OpenType layout features. In general, any font installed in the operating system's various Library/Fonts folders is directly available for use in a \XeTeX\ document; there is no need for |.tfm| files as used by standard \TeX.
+
+This brings great flexibility in font use; any font available on the Mac OS~X system can immediately be used in \XeTeX, including whatever "smart" AAT or OpenType features it may offer. However, documents which use such "native" OS~X fonts will typically not be portable to standard \TeX\ systems, and even if |.tfm| files for the "same" fonts are available on another system the results will almost certainly not be identical. (\XeTeX\ was created primarily to typeset text in complex non-Roman scripts, implemented using AAT or OpenType fonts, and for this purpose it works well; many "normal" \TeX\ jobs may be better done with a standard version of \TeX.)
+
+To provide this flexibility, \XeTeX\ reinterprets \TeX's |\font| command slightly. When a |\font| command is read, it attempts to locate an installed font in Mac OS~X with the given name. If one is found, then this font will be used in either ATSUI or OpenType mode, making use of layout features that may be included in the AAT/OT font tables, and without reference to any |.tfm| file. (Note that because such font names may include spaces or other characters that would not normally be considered part of a filename by \TeX, they can be quoted by enclosing them in single quotes, double quotes, or parentheses.)
+
+In order to provide some compatibility with the "standard" fonts of the \TeX\ world, such as Computer Modern, \XeTeX\ can also read |.tfm| files, and when using a font for which a |.tfm| file is present it should normally provide the same results as any standard \TeX. In particular, math mode requires the use of |.tfm|-based fonts.
+
+If no installed font is found for a |\font| declaration, \XeTeX\ will attempt to load a |.tfm| file and perform standard |.tfm|-based typesetting with this font. Note that for the font to actually be visible in the final output, it must be available as a |.pfb| or |.otf| file where the |xdv2pdf| tool can find it, based on the |dvips.map| font map file and |texmf.cnf| path settings, or else installed as a regular font in OS~X.
+
+Note that a document may freely mix the use of |.tfm|-based, AAT, and OpenType fonts.
+
+\subsection{AAT fonts}
+
+\XeTeX\ can take advantage of most advanced features of AAT fonts, such as contextual variants, complex ligatures, alternate swash forms, variation fonts, etc.
+
+To allow access to the advanced features of AAT fonts, the "font name" in a |\font| declaration for a non-|.tfm|-based font may include additional information. The font name specified should be the full name of a font, as seen by AAT (this may sometimes differ from the name in most Font menus). It may be enclosed in quotes (this also applies to file names, such as in |\input| commands); this allows names to include spaces and other "special" characters. In ATSUI typesetting mode, \XeTeX\ will automatically use the default features of an AAT font; this may include automatic ligatures, contextual swash forms, and so on.
+
+To control the exact set of features used, a |\font| command may include feature settings after the font name. To do this, you add a colon after the font name, and then a semicolon-separated list of {\em <feature>=<setting>} pairs. To turn {\em off} a feature that is enabled by default, put an exclamation mark ("not", in various programming languages) before the setting name. The allowable features and settings are font-dependent; the Typography palette in applications such as TextEdit lets you see what features any given font supports, or the file |AAT-info.tex| shows how \XeTeX\ itself can determine the available features. In the same way, {\em <variation>=<value>} pairs may be used to control the style of variation fonts such as Skia. (All this is easier illustrated than described; look in the |FontSamples.tex| file to see how it works.)
+
+\subsection{OpenType fonts}
+
+Starting with release 0.8, \XeTeX\ includes (preliminary) support for complex layout features in OpenType fonts. This support is based on code from the ICU (International Components for Unicode) library.\footnote{ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2003 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.}
+The OpenType feature support is currently incomplete, and the \TeX\ macro interface as well as details of the internal implementation are liable to change in future releases. See the OpenType sample files provided (in the Sample Files archive) for hints on how to work with OpenType fonts in \XeTeX.
+
+\subsection{Font style options}
+
+Any installed font may be accessed by using its full name (the "display name" as shown by Font Book, for example) in a |\font| command. However, it is also possible to access the bold and italic faces within a font family without giving their precise names; if the modifiers |/B| and/or |/I| are added to the name of the regular font, \XeTeX\ will find and load the associated bold or italic style (if available). Similarly, |/BI| (or |/B/I|) will load the bold-italic style.
+
+This feature makes it simpler to load the basic styles of a font family, without having to know the exact names in advance. For example:
+
+\def\extractfontname"#1"#2\relax{\edef\testa{#1}}
+\def\checkfont#1#2{% #1 is the font-selecting command, #2 is the expected name
+ \ifx#1\nullfont \message{Font "#2" not available!}\rm \else \edef\testb{\detokenize{#2}}%
+ \let\x=#1\x \edef\testa{\fontname\x}\expandafter\extractfontname\testa\relax
+% \ifx\testa\testb\else\errmessage{Loaded font "\testa", expected "\testb"!}\fi
+ \fi}
+\def\showfont#1#2{\tt #1&
+ \edef\INT{\the\interactionmode}\interactionmode=0
+ \font\x=#1 \interactionmode=\INT \relax \checkfont{\x}{#2}#2\cr}
+
+\def\showfont#1#2{\tt #1&\font\x=#1 \relax \x \fontname\x\cr}
+
+\begin{quote}
+\begin{tabular}{ll}
+\em Name specified&\em Font used\cr
+\showfont{"Palatino/B"}{Palatino Bold}
+\showfont{"Times Roman/B"}{Times Bold}
+\showfont{"Times Roman/I"}{Times Italic}
+\showfont{"Hoefler Text/BI"}{Hoefler Text Black Italic}
+\end{tabular}
+\end{quote}
+
+Of course, in the case of families with additional weights (light, book, semibold, bold, ultra, etc.) it is still necessary to use full names to select the exact face desired from among all those available; the |/B| modifier will simply find whatever ATS considers to be the default bold face.
+
+\subsection{Optical sizes}
+
+With release 0.94 of \XeTeX, there is built-in support for optically-sized faces in font families, such as some of the Adobe Pro fonts. If a font family has optically-sized faces, with the OpenType |size| feature tag associating them, then \XeTeX\ will, by default, load the most appropriate face for the font size requested. Thus, with the Brioso Pro Opticals installed:
+
+\begin{quote}
+\begin{tabular}{ll}
+\em Name and size requested&\em Font used\cr
+\showfont{"Brioso Pro" at 7pt}{BriosoPro-Capt}
+\showfont{"Brioso Pro" at 11pt}{Brioso Pro}
+\showfont{"Brioso Pro" at 16pt}{BriosoPro-Subh}
+\end{tabular}
+\end{quote}
+
+It is possible to override this behavior by adding a |/S=#| modifier to the font name, where |#| is a specific optical size (in points). This will load the face appropriate to the given optical size, regardless of the actual size to which the font is being scaled. A size of 0 may be used to disable optical sizing altogether, simply loading the named font. Thus:
+
+\begin{quote}
+\begin{tabular}{ll}
+\em Name and size requested&\em Font used\cr
+\showfont{"Brioso Pro/S=7" at 9pt}{BriosoPro-Capt}
+\showfont{"Brioso Pro/S=10" at 9pt}{BriosoPro-Regular}
+\showfont{"Brioso Pro/S=18" at 9pt}{BriosoPro-Subh}
+\showfont{"Brioso Pro/S=36" at 9pt}{BriosoPro-Disp}
+\showfont{"Brioso Pro Subhead" at 9pt}{BriosoPro-Capt}
+\showfont{"Brioso Pro Subhead/S=0" at 9pt}{BriosoPro-Subh}
+\end{tabular}
+\end{quote}
+
+(Incidentally, this also illustrates that some fonts may be known by multiple names; "Brioso Pro" is also called "BriosoPro-Regular", for example, and "Brioso Pro Subhead" is also "BriosoPro-Subh". This seems to occur primarily with OpenType CFF fonts, where Apple Type Services apparently sees the PostScript font name as well as the "full" name. \XeTeX\ will accept either form.)
+
+\section{Output}
+
+Because \XeTeX\ is so closely tied to the AAT font machinery, the concept of a DVI (device-independent) output file is not very useful—a typeset \XeTeX\ document is inherently system-specific. If any \XeTeX\ features (AAT fonts or graphics inclusion; see below) are used, the source document will not work on a standard \TeX\ system.
+
+\XeTeX\ is implemented as a command-line tool, |xetex|, similar to standard Unix-based \TeX\ tools. The |xetex| tool writes a form of "extended DVI" (|.xdv|) data to describe the typeset pages. A separate tool, |xdv2pdf|, can read this |.xdv| data and convert it to PDF, which may then be viewed or printed on any platform.
+
+By default, |xetex| automatically executes |xdv2pdf| and pipes its |.xdv| output to the converter; therefore, in effect the default output format is PDF. It is possible to suppress the conversion and generate an |.xdv| file instead by specifying the |-no-pdf| option to |xetex|. This is generally much faster, as the PDF generation process is relatively slow; but the |.xdv| file cannot be directly viewed or printed. However, when multiple typesetting runs are required (such as with \LaTeX\ and similar formats), it is more efficient to specify |-no-pdf| for all runs except the last.
+
+\subsection{\texttt{\char`\\special} commands}
+
+\subsubsection{Color}
+
+The |xdv2pdf| driver supports several |\special|s to allow color to be used in \XeTeX\ documents. These are:
+{\obeylines \parskip0pt \parindent2\parindent
+ |\special{x:textcolor=|{\em color}|}|
+ |\special{x:textcolorpush}|
+ |\special{x:textcolorpop}|
+ |\special{x:rulecolor=|{\em color}|}|
+ |\special{x:rulecolorpush}|
+ |\special{x:rulecolorpop}|\par}\noindent
+where {\em color} is an RGB color value expressed as 6 hexadecimal digits. If the color value is omitted, the color is reset to the default (which may not be black, in the case of ATSUI fonts, as |color=|{\em color} is a possible option in the |\font| command). The |push| and |pop| forms of the |\special|s allow color settings to be saved and restored using a simple stack mechanism, which may be simpler than explicitly restoring the previous color after a local change.
+
+Beginning with release 0.7, color values may also be given as RGBA values with 8 hexadecimal digits, thus allowing transparency effects.
+
+The |xdv2pdf| driver also supports a set of color |\special|s based on those used in drivers such as |dvips| and |dvipdfm|. These begin with the keyword |color|, followed by any of a number of color commands:
+{\obeylines \parskip0pt \parindent2\parindent
+ |\special{color push}|
+ |\special{color pop}|
+ |\special{color rgb| {\em R G B}|}|
+ |\special{color cmyk| {\em C M Y K}|}|
+ |\special{color hls| {\em H L S}|}|
+ |\special{color hsv| {\em H S V}|}|
+ |\special{color hsb| {\em H S B}|}|
+ |\special{color gray| {\em Gray}|}|
+ |\special{color |{\em colorname}|}|\par}\noindent
+The color value can be expressed according to a number of different color models, with one, three, or four values in the range 0.0–1.0, or one of the predefined color names known to the |dvips| driver can be given. In addition, any of these can be followed by the keyword |alpha| and an alpha-channel value in the range 0.0–1.0, for transparency. These |\special| commands set the color for both text and rules together.
+
+\subsubsection{Hyperlinks and outlines}
+
+While \XeTeX\ does not support the PDF-specific extensions of pdf\TeX, some PDF features can be accessed via |\special|s similar to those used by the |dvipdfm| driver. When it generates a PDF file, |xdv2pdf| writes an auxiliary file with the extension |.marks| that contains a record of all |\special| commands that begin with the text |pdf:|. Each such |\special| is written with information on its exact location (page number and ({\em x, y}) coordinates). A Perl script |xdv2pdf_mergemarks| is then automatically executed, and has the opportunity to integrate information from the marks file into the main PDF document.
+
+The |xdv2pdf_mergemarks| script attempts to handle the |\special|s used by the |dvipdfm| driver to implement document outlines (bookmarks) and some kinds of hyperlinks, to support the \LaTeX\ |hyperref| package with the |dvipdfm| output option. The |.marks| file is deleted after processing; to retain it for inspection or further processing, modify the script to remove the |unlink| command.
+
+\subsubsection{Transforms and other effects}
+
+The |xdv2pdf| driver also supports |\special|s for modifying the transformation matrix used in producing the PDF output. This allows rotation, reflection, scaling and skewing of arbitrary \TeX\ output. The available commands are:
+{\obeylines \parskip0pt \parindent2\parindent
+ |\special{x:gsave}|
+ |\special{x:grestore}|
+ |\special{x:scale |{\em X Y}|}|
+ |\special{x:rotate |{\em D}|}|
+ |\special{x:shadow(|{\em X}|,|{\em Y}|),|{\em blur}|}|
+ |\special{x:colorshadow(|{\em X}|,|{\em Y}|),|{\em blur}|,|{\em color}|}|
+ |\special{x:backgroundcolor=|{\em color}|}|\par}\noindent
+The |transforms.tex| sample file demonstrates use of most of these |\special|s.
+
+\section{\TeX\ language extensions}
+
+\subsection[Identifying the XeTeX version]{Identifying the \XeTeX\ version}
+
+\ifx\XeTeXversion\undefined \def\XeTeXversion{0} \def\XeTeXrevision{.[unknown pre-0.5]} \fi
+There are several additions to the \TeX\ language in \XeTeX.
+Beginning with release 0.5, there are commands |\XeTeXversion| (a number) and |\XeTeXrevision| (a string, beginning with a period) that make it possible for a document to detect which version of the |xetex| processor is running. (This document was typeset using \XeTeX\ version \number\XeTeXversion\XeTeXrevision.)
+
+\boldmath
+\subsection{\eTeX\ features}
+\unboldmath
+
+\XeTeX\ includes the TeX--XeT extension from \eTeX, which provides the |\beginL|, |\endL|, |\beginR|, and |\endR| primitives to control bidirectional typesetting (for Arabic, Hebrew, and similar languages). Note that \XeTeX\ is also affected by the inherent directionality of Unicode characters; therefore, it is not actually necessary to use |\beginR...\endR| around a word in an Arabic font, for example, to have it appear correctly. However, these commands are required for the overall layout of right-to-left or bidirectional paragraphs to work properly. (Note that |\TeXXeTstate=1| is required to enable these commands.)
+
+Other \eTeX\ features such as additional registers (beyond 255) and primitives are also available in \XeTeX; see the documentation of \eTeX\ for details. A short reference manual can be found at \url{http://www.staff.uni-mainz.de/knappen/etex_ref.html}.
+
+\subsection{Graphics support}
+
+To support graphics inclusion, \XeTeX\ provides the |\XeTeXpicfile| command. Normally, in other \TeX\ systems, this is done with the |\special| command. However, |\XeTeXpicfile| offers the advantage that \XeTeX\ can determine the size of the picture, and thus macros can be written to fit the picture to a certain space or create the needed space for the picture, bypassing the manual picture-measuring process otherwise needed. Specifically, |\XeTeXpicfile| is used as follows:\hfil\break\indent\indent
+ |\XeTeXpicfile <filename> [options]|\hfil\break
+where {\em<filename>} is the name (full pathname, or relative to the main document) of a graphics file. Most graphic file formats are supported (using QuickTime's Graphic Importer facility).
+
+The [options] in the |\XeTeXpicfile| command use the following keywords:{\obeylines \parskip0pt \parindent2\parindent
+ |width| <dimen>
+ |height| <dimen>
+ |scaled| <scalefactor>
+ |xscaled| <scalefactor>
+ |yscaled| <scalefactor>
+ |rotated| <degrees>\par}\noindent
+Scaling and rotation operations are executed in the order specified. If one of |width| or |height|, but not the other, is specified at any stage, the other dimension is scaled in proportion. If both absolute size and |scaled| are used at the same stage in the transformation sequence, not separated by a rotation, the size is set as requested and the scale factor is ignored.
+
+The final result of a |\XeTeXpicfile| command is an object which can be included in the text being typeset just like a character, albeit usually a rather large one. It could be thought of as a box, though it cannot be unboxed. It can, however, be put inside a normal \TeX\ box register, and in fact this is often desirable. After saying, for example,\hfil\break
+\indent\indent |\box0=\hbox{\XeTeXpicfile "my-pic.jpg"|\hfil\break
+\indent\indent\indent\indent |scaled 750 rotated 45}|\hfil\break
+you can find the dimensions of the graphic by examining the width and height of box 0. (The depth will always be zero.) Your macros can then arrange to place the picture suitably on the page. (See the |PicFileSample.tex| file.)
+
+There is also a |\XeTeXpdffile| command. This is similar to |\XeTeXpicfile|, but recognizes an additional option:{\obeylines\parskip0pt\parindent2\parindent
+ |page| <number>\par}\noindent
+This specifies the page to be included from the PDF file (default is the first page). Negative numbers can be used to indicate pages relative to the end of the file; thus |page -2| means the second to last page. The |page| option, if used, must be specified as the {\em first} keyword after the filename, before any transformations.
+
+Note that PDF files can also be included by the |\XeTeXpicfile| command, but this has two significant drawbacks: they will be rendered as lower-resolution graphics, and only the first page is available.
+
+In versions before 0.5, these commands were named |\picfile| and |\pdffile| respectively, and were always enabled. Beginning with release 0.5 of \XeTeX, the command names have been changed to reduce the likelihood of clashes with names used in macro packages or other extensions. In addition, these commands (like other \eTeX\ extensions) are only available when the \XeTeX\ engine is running in “extended” mode (activated by an initial |*| when the format file is created). Note that the format files included with \XeTeX\ have extended mode active, so these commands will normally be available.
+
+For use with \LaTeX, there is a "driver" file |xetex.def| that maps features from the standard |graphics| packages onto these \XeTeX\ primitives.
+
+\subsection{Font information primitives}
+New in \XeTeX\ 0.7 are a set of commands that allow authors or macro writers to query AAT fonts to determine the available font features, their names, and default settings. Pending real documentation, see the sample file |AAT-info.tex|, which uses these commands to generate a page listing the features supported by a given font. There is also a |\XeTeXglyph| command that allows an arbitrary glyph, identified by glyph ID number, to be rendered from any AAT font.
+
+Similarly, release 0.84 and later includes commands that can determine the available script, language, and feature tags in OpenType fonts. These are illustrated by the |OpenTypeInfo.tex| sample file, which iterates over and prints all the tags supported by a given font.
+
+\subsection{Input encodings}
+\label{sec:encoding}
+
+Although \XeTeX\ is designed as a Unicode-based system, and access to standard OS X fonts is via Unicode character code values, it is possible to use input text files in other legacy encodings. By default, \XeTeX\ examines each input file and reads it as either UTF-16 (if a UTF-16 Byte Order Mark is found, or if the presence of null byte values makes the text look like UTF-16 data), or else as UTF-8. Plain ASCII text is of course also valid UTF-8, so this can be read equally well with no further work.
+
+However, if the input text is 8-bit data in an encoding such as Mac OS Roman, ISO Latin 1, etc., it will not be read correctly in this way; byte codes above 127 will be taken as beginning UTF-8 sequences, not as individual codes in their own right. And because this happens at the file-reading level, it is not possible to reinterpret the codes at the \TeX\ macro level, as is done with legacy packages such as |inputenc| for \LaTeX.
+
+To overcome this, and allow existing 8-bit text to be read without requiring conversion to Unicode before running \XeTeX, it is possible to switch the input encoding using:
+{\obeylines \parskip0pt \parindent2\parindent
+ |\XeTeXinputencoding "|{\em charset-name}|"|\par}\noindent
+(introduced in release 0.9). The {\em charset-name} here is the name of a character set recognized by the ICU library; see \url{http://www.iana.org/assignments/character-sets} for a large registry of names. Most of the expected forms such as |"mac"| (Mac OS Roman), |"cp1252"| (Windows codepage 1252, Western European), |"shift-jis"| (e.g., for Japanese), and many other codepage names and numbers should be recognized.
+
+In addition, there is a special "encoding" called |"bytes"| which can be used for legacy support. After |\XeTeXinputencoding "bytes"|, the byte values 0–255 will be mapped directly to the internal \XeTeX\ character codes 0–255. This will not generally be correct Unicode, but it should allow existing \TeX\ macro packages that expect this range of character codes to be used for further interpretation.
+
+The |\XeTeXinputencoding| command changes the interpretation of the {\em current input file} only; to be exact, it affects how text is read from the file, beginning at the {\em following} line. For a legacy-encoded file to be read correctly, the appropriate encoding command should be included near the beginning, with only standard ASCII characters preceding it.
+
+An additional command |\XeTeXdefaultencoding| works similarly, except that instead of changing the mapping used to read the {\em current} input file, it changes the {\em initial} mode that will be used for newly-opened files. This includes files opened with |\openin| as well as |\input|. The default behavior may be restored with |\XeTeXdefaultencoding "auto"|.
+
+\subsection{Line-breaking without spaces}
+
+Normally, \TeX\ will only break lines at inter-word spaces, or according to its hyphenation rules. A new feature introduced in \XeTeX\ version 0.91 is support for line-breaking in scripts such as Chinese that are written without inter-word spaces. Additional line-break positions in such scripts will be found if a {\em line-break locale} is specified (the rules may differ between locales). The \XeTeX\ primitives used are:%
+{\obeylines \parskip0pt \parindent2\parindent
+ |\XeTeXlinebreaklocale| |"|{\em locale-id}|"|
+ |\XeTeXlinebreakskip =| {\em glue-specification}
+ |\XeTeXlinebreakpenalty =| {\em integer}\par}\noindent
+The locale ID is a POSIX standard identifier recognized by the ICU library; for example, |en_US| for the US English locale, or |th_TH| for Thai, or |zh_HK| for Hong Kong Chinese. Most locales simply use the default Unicode line-break rules based on character properties, so in practice even |\XeTeXlinebreaklocale "en"| is sufficient for East Asian line-breaking to work. Note that Thai, however, has additional rules that will only be activated if a Thai locale is specified.
+
+The parameters |\XeTeXlinebreakskip| and |\XeTeXlinebreakpenalty| (both zero by default) control what happens at the locale-dependent intercharacter line-break locations. A typical |\XeTeXlinebreakpenalty| setting might be 100, so that there is a slight preference for line-breaks at spaces if possible. If the text is to be justified (and there are no "real" spaces available for stretching), then |\XeTeXlinebreakskip| should be given some stretchability; for example, |\XeTeXlinebreakskip=0pt plus 1pt|.
+
+|\XeTeXlinebreaklocale| is a global setting, not affected by \TeX's grouping. To disable such line-breaking and revert to standard \TeX\ behavior, set the locale to an empty string: |\XeTeXlinebreaklocale ""|.
+
+\section{Limitations}
+The marriage of \TeX\ and ATSUI is not without its problems; a few issues are mentioned here, though there are doubtless many others to be encountered. This is a "work in progress" and many features may change in future versions.
+
+Versions of \XeTeX\ before version 0.3 (like all versions of the earlier \TeXgX), did not support automatic hyphenation when using AAT-based fonts. This feature is now operational, using the standard \TeX\ hyphenation algorithm. (Note, however, that non-English hyphenation tables will need to be converted to Unicode before they can be used.) This means that version 0.3 is liable to format paragraphs differently from earlier versions, even when using the exact same fonts, unless hyphenation is suppressed using \TeX\ commands.
+
+Math typesetting works as expected, but as math symbol and extension fonts must have additional metric information, math mode can only be expected to work with |.tfm|-based fonts. There has been further discussion of these issues on the \href{http://tug.org/mailman/listinfo/xetex}{\XeTeX\ mailing list}.
+
+Currently, line breaking and hbox construction in \XeTeX\ with non-|.tfm| fonts is based on the width of each word, measured individually by ATSUI. This means that it is not perfect in cases where the width of a word changes significantly depending whether it is at a line end or in the middle of a line. We have not found this to be a serious problem in actual practice, but this would depend on the characteristics of the fonts used and the kind of material being typeset. In general, \XeTeX’s output is best when \TeX\ is able to pass relatively long runs of text, rather than individual characters or words, along to ATSUI for output, so that ATSUI's spacing and justification can work with enough text at a time.
+
+For standard \TeX\ documents using only |.tfm|-based fonts, \XeTeX\ should provide the same results as a standard version of \TeX. However, it will normally be considerably slower than a standard \TeX, so it is not particularly recommended unless you will be using its special features—in particular, the AAT capabilities. For completely standard \TeX\ documents, a standard \TeX\ implementation such as teTeX will be more efficient.
+
+\end{document}
+