summaryrefslogtreecommitdiff
path: root/dviware/ln03
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/ln03')
-rw-r--r--dviware/ln03/readme30
-rw-r--r--dviware/ln03/rmcs/00readme.txt206
-rw-r--r--dviware/ln03/rmcs/changebar.sty667
-rw-r--r--dviware/ln03/rmcs/cli.for495
-rw-r--r--dviware/ln03/rmcs/descrip.mms117
-rw-r--r--dviware/ln03/rmcs/dviln03.hlp351
-rw-r--r--dviware/ln03/rmcs/dviln03.ln3_publish5770
-rw-r--r--dviware/ln03/rmcs/dviln03.tex_publish2480
-rw-r--r--dviware/ln03/rmcs/dvitoln03.ch1143
-rw-r--r--dviware/ln03/rmcs/dvitoln03.cld198
-rw-r--r--dviware/ln03/rmcs/dvitoln03.web10433
-rw-r--r--dviware/ln03/rmcs/ginotosix.cld31
-rw-r--r--dviware/ln03/rmcs/ginotosix.for159
-rw-r--r--dviware/ln03/rmcs/ginotosix.hlp173
-rw-r--r--dviware/ln03/rmcs/graphics.sty27
-rw-r--r--dviware/ln03/rmcs/local.mf187
-rw-r--r--dviware/ln03/rmcs/local_guides.bib306
-rw-r--r--dviware/ln03/rmcs/openclose.six103
-rw-r--r--dviware/ln03/rmcs/openclose.small103
-rw-r--r--dviware/ln03/rmcs/test.pic252
-rw-r--r--dviware/ln03/rmcs/test.six129
-rw-r--r--dviware/ln03/rmcs/test.tex12
-rw-r--r--dviware/ln03/rmcs/texprint.com144
-rw-r--r--dviware/ln03/rose/clink.opt1
-rw-r--r--dviware/ln03/rose/dvi2ln3.c1654
-rw-r--r--dviware/ln03/rose/dvi2ln3.dif109
-rw-r--r--dviware/ln03/rose/dvi2ln3.lis1602
-rw-r--r--dviware/ln03/rose/dvi2ln3nft.c1145
-rw-r--r--dviware/ln03/rose/ffc.pas277
-rw-r--r--dviware/ln03/rose/ffc.web991
-rw-r--r--dviware/ln03/rose/forpxl.fdl4
-rw-r--r--dviware/ln03/rose/ln03bis.mem632
-rw-r--r--dviware/ln03/rose/ln03topp.pli1255
-rw-r--r--dviware/ln03/rose/lnfinc.pli35
-rw-r--r--dviware/ln03/rose/newffc.c1293
-rw-r--r--dviware/ln03/rose/older_driver.mem84
-rw-r--r--dviware/ln03/rose/picmode.pli529
-rw-r--r--dviware/ln03/rose/specials.c480
-rw-r--r--dviware/ln03/rose/toppnft.pli654
-rw-r--r--dviware/ln03/thomas/clink.opt3
-rw-r--r--dviware/ln03/thomas/descrip.mms26
-rw-r--r--dviware/ln03/thomas/ln03dvi.c1932
-rw-r--r--dviware/ln03/thomas/ln03dvi.man124
-rw-r--r--dviware/ln03/thomas/ln03fonts.c1388
-rw-r--r--dviware/ln03/thomas/ln03specials.c486
-rw-r--r--dviware/ln03/thomas/ln03version.c5
-rw-r--r--dviware/ln03/thomas/makefile22
-rw-r--r--dviware/ln03/thomas/pk.c1096
-rw-r--r--dviware/ln03/thomas/pk.h194
-rw-r--r--dviware/ln03/thomas/pkgbl.c79
-rw-r--r--dviware/ln03/thomas/setup.bsd4_24
51 files changed, 39620 insertions, 0 deletions
diff --git a/dviware/ln03/readme b/dviware/ln03/readme
new file mode 100644
index 0000000000..caff9537d0
--- /dev/null
+++ b/dviware/ln03/readme
@@ -0,0 +1,30 @@
+The upgraded ln03 driver has been contributed by Matt Thomas. It will
+be found in the sub-directory thomas. It is set up to use
+pk fonts. Note the inverted name ln03dvi for this driver.
+The function is still the same. dvi-->ln03 output.
+
+Some write-white fonts are provided in cmfonts/gf/gf300w.
+There were set for a Ricoh 4080, and may not be quite right
+for the ln03. They will still be an improvement on write-black
+fonts. At some time in the future all fonts will be sent
+out in PK format, but if you find only gf format in cmfonts/gf/gf300w
+you will have to compile and run gftopk (from MFware).
+You can make up other fonts using METAFONT. Look at the
+RicohFortyEighty mode_def in U_Wash.mf (utilityfonts/bases)
+make a copy of this into your own mode_def file, and
+reset the parameters as necessary. There is a good deal
+of discussion and guidance in recent editions of TUGboat
+(volumes 8 and 9, passim). Remember to include the line
+input white_setup
+in your mode_def file, (see the comments in U_Wash.mf)
+
+The amsfonts may not be entirely satisfactory,
+but they are the product of old Metafont79 and are not subject to
+the same adjustments as newer fonts. Even a WRITE-WHITE base may
+not be entirely satisfactory. THe nicks come out very blunt on
+some characters, and pixel editing may be necessary in the long
+run.
+
+
+
+
diff --git a/dviware/ln03/rmcs/00readme.txt b/dviware/ln03/rmcs/00readme.txt
new file mode 100644
index 0000000000..3f26ebec3e
--- /dev/null
+++ b/dviware/ln03/rmcs/00readme.txt
@@ -0,0 +1,206 @@
+DVItoLN03 Version 4.1 1st October 1991
+========= =========== ================
+
+Changes in the V4.1 release are the introduction of two new qualifiers:
+ /[NO]VERBOSE - the default for this may be set up at a site as either state;
+ with /NOVERBOSE, most terminal output is suppressed, apart
+ from the name of the input file, the total bytes of down-
+ loaded fonts, and progress indication as each page is output.
+ /PAPER_SIZE - the default for this should reflect the setting of the paper
+ size selection switch on the rear of the machine. The program
+ requires knowledge of the physical paper size to handle pages
+ which mix landscape and portrait orientation material.
+
+This distribution contains the following files:
+
+00README.TXT - the file you are reading
+
+Files for building the program:
+DVITOLN03.CH - a change file for DVItoLN03, for revising V4.0 of the
+ Web to V4.1
+DVITOLN03.CLD - VMS command language definition for the DVILN03 command
+DVITOLN03.EXE - a ``load-and-go'' executable, for VMS V5.4-2
+DVITOLN03.OBJ - object code, for linking uder different versions of VMS
+DVITOLN03.WEB - the WEB source of DVItoLN03 (V4.0)
+
+Files for generating the documentation:
+CHANGEBAR.STY - for those without this: style option for changes
+DVILN03.HLP - on-line (DCL) help for DVItoLN03
+DVILN03.LN3_PUBLISH - file ready to be COPYed to your LN03
+DVILN03.TEX_PUBLISH - the ``local guide'' for DVItoLN03 (in LaTeX)
+LOCAL_GUIDES.BIB - a BibTeX database used at RMCS --- needs BibTeX V0.99c
+GRAPHICS.STY - a local LaTeX style file for graphics inserts
+OPENCLOSE.SIX - a Sixel dump of the screen of a terminal, scaled 2:1
+OPENCLOSE.SMALL - the same dump, but scaled 1:1
+TEXPRINT.COM - command procedure implementing the TEXPrint command
+(Note that LOCAL.MF is no longer included; better collections of mode_defs have
+been published, and are available from good archives everywhere.)
+
+DVILN03.HLP is a standard (DCL) help file, for inclusion in SYS$HELP:HELPLIB.HLB
+or your local specialized help library.
+
+********************************************************************************
+* This bit is IMPORTANT: many of the reports that the author receives that *
+* ``DVItoLN03 doesn't work properly'' are because the sites have not set up *
+* the LN03 device correctly. The only place this is specified is in the user *
+* manual, and if your printer isn't already set up correctly, it won't PRINT *
+* unless you send it with PRINT/PASSALL. And even then, it won't come out *
+* correctly if the DIPswitch on the printer is set to AutoWrap! *
+********************************************************************************
+You should produce a copy of our local guide. If your LN03 is not spooled, then
+simply COPY the file DVILN03.LN3_PUBLISH directly to YOUR LN03. Please note
+that this file includes LOTS of eight-bit characters, so you may need to fetch
+it again in binary mode if your FTP connection has stripped off the 8th bit. If
+your LN03 is set up as a printer queue (as the local guide recommends), the
+safest bet is to PRINT it /PASSALL until you've found out how to set up the
+queue compatibly; one important caveat is that the terminal line MUST be set up
+/NOWRAP (see the local guide).
+
+Everything is explained, I hope, in the local guide. As supplied,
+DVILN03.TEX_PUBLISH assumes that you have a working copy of the previous version
+(V3.1-1 or later) of DVItoLN03, but it does not use any of the special
+facilities provided by this new release.
+
+If you are currently using a different driver, you will have to modify the line
+at the start of DVILN03.TEX_PUBLISH that reads
+> \let\iffulldoc=\iftrue %%% Change to \iffalse if you don't have DVItoLN03
+to say instead
+> \let\iffulldoc=\iffalse %%% Change to \iffalse if you don't have DVItoLN03
+and then LaTeX it and pass through your existing driver.
+
+The guide should be edited to suit YOUR site; I have attempted to flag all
+site-specific details in DVILN03.TEX with the string SYSDEP, on, or near to, the
+relevant line(s). Ensure that you define the macros \sitename and \contact; all
+queries at any site should be channelled through the latter individual, and if
+he/she cannot resolve them, then I shall be delighted to (attempt to) help.
+
+
+However, the real meat is in DVITOLN03.WEB; this is a WEB version of a DVI-to...
+driver for the DEC LN03/LN03-Plus laser printers. This program has been revised
+to V4.0 and is now capable or reading EITHER packed or expanded raster files,
+virtual fonts, missing fonts (!), landscape/portrait orientation (mixed on one
+page, even!). It also supports the DEClaser~2100 and~2200 (otherwise known as
+the LN05 and LN06).
+
+Packed (.nnnPK) files are used in preference to .PXL files (if both are
+available), and are sought in directory given by the /PK_FONT_DIRECTORY
+qualifier; the .CLD file provided specifies this as TEX_PK:. PXL files are
+sought in the directory given by the /PXL_FONT_DIRECTORY qualifier, and, at
+RMCS, are kept in separate subdirectories of TEX_PXL_ROOT:, which is a concealed
+device specified as the value for this qualifier. Details are given in the user
+guide, including rearranging the allocation of font files to different directory
+structures. The program no longer looks in TEX$FONTS: for .TFM files, but
+instead in whatever is defined as the default for the /TFM_DIRECTORY qualifier;
+this allows TeX administrators to abandon use of logical names with dollars in
+them, as recommended by Digital.
+
+This implementation of DVItoLN03 has the following advantages over certain other
+DVItoLN03 programs (these are not in order of importance; the new features are
+at the end of the list):
+
+ i) It IS written in WEB, as opposed to C and other such kludgy languages.
+ ii) It downloads to the LN03's font memory the rasters for only those
+ characters actually used in the document. As such, it does not run out
+ of font memory just because you've used a few characters from each of a
+ large number of different fonts.
+ iii) It HAS a capacity for SIMPLE graphics inclusions. These have to be in a
+ format the LN03 understands (DEC sixels), and are copied verbatim into
+ the output file generated.
+ iv) It works in landscape and portrait orientations.
+ v) It makes use of the ``proper'' VAX/VMS DCL interface for commands.
+ vi) It CAN print glyphs whose rasters are too large to be downloaded to the
+ LN03 as a font file (by performing a sixel graphics dump of the bitmap);
+ obviously this slows things down considerably!
+ vii) It CAN handle the invisible fonts used by SliTeX; each such character is
+ actually downloaded as a null character locator, ans is imaged by the
+ appropriate amount of whitespace.
+viii) Either packed or unpacked font files (or both) may be provided in either
+ flat or rooted directory structures; if logical names are used to specify
+ these locations (as in the .CLD file provided), the files may be spread
+ over a number of different directories or volumes.
+ ix) The error messages are improved over earlier versions of the program, and
+ are now all indexed in the woven (WEAVEd?) WEB. They are also all listed
+ in the users' manual.
+ x) The program can now handle fonts with more then 128 characters, up to
+ TeX's limit of 256. Therefore, it can now process documents which use
+ Silvio Levy's Greek fonts.
+ xi) Retention of the log (.TYP) file may now be forced, suppressed, or allowed
+ to be determined by the success of the processing.
+ xii) Minor revisions and corrections have been made, in particular, it now
+ correctly understands the physical limitations to the imaging area.
+xiii) Correct some log reports; report files read (except font files); provide
+ the /OUTPUT qualifier, to permit utilization of a scratch directory or
+ direct spooling to the output device.
+ xiv) Support for Flavio Rose \special commands, for drawing changebars, was
+ added by Robin Fairbairns at Laser Scan of Cambridge, UK.
+ xv) TeX Font Metrics (TFM files) are no longer sought in the hard-wired
+ directory TEX$FONTS:, but are instead controlled through the
+ /TFM_DIRECTORY qualifier.
+ xvi) Support for Virtual Fonts; the .VF files are sought in whatever is
+ specified as the value of the /VIRTUAL_DIRECTORY qualifier; users can
+ speed processing fractionally by specifying /NOVIRTUAL_DIRECTORY if it is
+ known that no virtual fonts are used in the document. If virtual fonts
+ are never used at your site, make this the default.
+xvii) Fonts for which the program cannot find any rasters no longer cause the
+ processing to be abandoned; solid rules of appropriate dimensions are
+ subsituted for each missing glyph.
+xviii)Landscape and portrait mode material may be mixed within a document, and
+ even on a single page, through \special{landscape} and \special{portrait}.
+ However, some suitable style option still needs to be written to make this
+ feature useful.
+ xix) Qualifiers /LEFT_MARGIN and /TOP_MARGIN now take a dimension (eg 1in)
+ rather than being required to be entered in pixels; the additional
+ <physical unit> called PX (pixel) has been added to TeX's normal set.
+ xx) Support for the new DEClaser 2100 and 2200 printers has been provided by
+ Karsten Nyblad of the Danish Telecomms Research Lab. Users can select the
+ paper source tray, separately for the first and subsequent sheets, and
+ also the printing mode (simplex or duplex). There is even a duplex mode
+ for the ordinary LN03 (no, it doesn't really print two-sided) which, by
+ interspersing blank sheets at appropriate points, produces a single-sided
+ master suitable for photocopying directly to a double-sided document.
+ xxi) Last, but definitely not least, the program has been speeded up, in both
+ the font mapping and the imaging phases, so that overall it runs
+ approximately 25% faster than V3.1-4.
+
+
+The program assumes that the LN03 has sufficient font memory --- for most
+meaningful documents you will need at least one RAM cartidge (part number
+LN03X-CR); the program WILL work with just the RAM in the basic printer, but you
+will probably have to restrict yourself to printing documents 3--4 pages at a
+time: very messy! Not having one personally, I don't know what memory
+requirements apply to the new DEClaser printers.
+
+Known deficiencies: none (I hope).
+
+Possible future work:
+ Make the program accept binary files (DVI, TFM and fonts) that are not
+ in the default organization used by TeXware under VMS (512-byte fixed-
+ length records). This would make importing such files from other
+ operating systems, such as Unix or MS-DOS, easier, since at present such
+ files have to be padded out to some multiple of 512 bytes, and moreover
+ with some appropriate characters, which differs from file to file.
+
+ Any other suggestions???
+
+
+Contact
+=======
+If anyone is experiencing difficulty in installing DVItoLN03, they are welcome
+to contact the author ---
+
+ B Hamilton Kelly
+ Royal Military College of Science
+ Shrivenham
+ SWINDON
+ UK SN6 8LA
+
+Swindon (++44 793) 785252 [Direct line]
+
+or via JANET: tex@uk.ac.cranfield.rmcs
+ INTERNET: tex%uk.ac.cranfield.rmcs@nsfnet-relay.ac.uk
+ Bitnet: tex@rmcs.cranfield.ac.uk
+
+
+ Good Luck!
+
+ Brian HAMILTON KELLY
diff --git a/dviware/ln03/rmcs/changebar.sty b/dviware/ln03/rmcs/changebar.sty
new file mode 100644
index 0000000000..8a4b228b2a
--- /dev/null
+++ b/dviware/ln03/rmcs/changebar.sty
@@ -0,0 +1,667 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% CHANGEBAR STYLE
+%
+%
+% Written by:
+% Michael Fine
+% Distributed Systems Architecture.
+% October, 1986.
+%
+%
+%
+% USAGE:
+%
+% \cbstart[dimension]
+% \cbend
+% All material between the two macros is barred. Nested
+% changebars are allowed. The optional parameter specifies the
+% width of the bar. If no width is specified, the current value
+% of the parameter \changebarwidth is used. Note that \cbstart
+% and \cbend can be used anywhere but must be correctly nested
+% with floats and footnotes. That is, you cannot have one end of
+% the bar inside a floating insertion and the other outside, but
+% that would be a meaningless thing to do anyhow.
+%
+% \cbdelete[dimension]
+% A square rule is put on the page at the position of the
+% changebars. This is useful fo indicating deleted text.
+%
+% \setlength{\changebarwidth}{dimension}
+% \setlength{\deletebarwidth}{dimention}
+% Sets the default width of the bar and of the size of the
+% delete rule.
+%
+% \reversechangebars
+% Causes bars to appear on opposite side of page from which they
+% have been appearing on. Cannot be used while a bar is in
+% progress.
+%
+% \setlength{\changebarsep}{dimension}
+% Sets the separation between the bar and the left margin of the
+% text. Does not take effect until you call \reversechangebars
+% except when used in the preamble.
+%
+% \nochangebars
+% Disables the changebar commands.
+%
+% IMPORTANT NOTE: Just as with cross references and labels, you
+% usually need to process the document twice (and sometimes three
+% times) to ensure that the changebars come out correctly. However, a
+% warning will be given if another pass is required.
+%
+%
+% PARAMETERS:
+%
+% \changebarwidth
+% A LaTeX length parameter that gives the bar width. It can be
+% changed with the \setlength command. Changing its value affects
+% all subsequent changebars subject to the scoping rules of
+% \setlength.
+%
+% \deletebarwidth
+% Ditto for the size of the square delete rule.
+%
+% \changebarsep
+% A LaTeX length parameter that gives the separation of the bar
+% from the left margin of the text. It can be set with the
+% \setlength command.
+%
+%
+%
+% FEATURES:
+%
+% Changebars may be nested within each other. Each level of
+% nesting can be given a different thickness bar.
+%
+% Changebars may be nested in other environments including floats
+% and footnotes.
+%
+% Changebars are applied to all the material within the ``barred''
+% environment, including floating bodies regardless of where the
+% floats float to. An exeception to this is margin floats.
+%
+% Changebars may cross page boundaries.
+%
+%
+% DEFICIENCIES AND BUGS:
+%
+% The macros blindly use specials points \cb@minpoint through
+% \cb@maxpoint. If this conflicts with another set of macros, the
+% results will be unpredictable. (What is really needed is a
+% \newspecialpoint, analogous to \newcount etc.)
+%
+% There is a limit of (\cb@maxpoint-\cb@minpoint+1)/4 bars per
+% page (four special points per bar). Using more than this number
+% yields unpredictable results (but that could be called a feature
+% for a page with so many bars). This limitation could be
+% increased if desired
+%
+% Internal macro names are all of the form \cb@xxxx. No checking
+% for conflicts with other macros is done.
+%
+% This implementation has not been designed for two column
+% printing.
+%
+% The algorithms may fail if a floating insertion is split over
+% multiple pages. In LaTeX floats are not split but footnotes may
+% be. The simplest fix to this is to prevent footnotes from being
+% split but this may make TeX very unhappy.
+%
+% The \cbend normally gets "attached" to the token after it rather
+% than the one before it. This may lead to a longer bar than
+% intended. For example, consider the sequence `word1 \cbend
+% word2'. If there is a line break between `word1' and `word2'
+% the bar will incorrectly be extended an extra line. This
+% particular case can be fixed with the incantation `word1\cbend{}
+% word2'.
+%
+%
+% BASIC ALGORITHM
+%
+% The changebars are implemented using the \specials of the DVI to
+% LN3 translator. In essence, the start of changebar defines a
+% \special point in the margin at the current vertical position on
+% the page. The end of a changebar defines another point and then
+% joins the two using the "connect" \special.
+%
+% This works fine as long as the two points being connected lie on
+% the same page. However, if they don't, the bar must be
+% artificially terminated at the page break and restarted at the
+% top of the next page. The only way to do this (that I can think
+% of) is to modify the output routine so that it checks if any bar
+% is in progress when it ships out a page and, if so, adds the
+% necessary artificial end and begin.
+%
+% The obvious way to indicate to the output routine that a bar is
+% in progress is to set a flag when the bar is begun and to unset
+% this flag when the bar is ended. This works most of the time
+% but, because of the asynchronous behavior of the output routine,
+% errors occur if the bar begins or ends near a page break. To
+% illustrate, consider the following scenerio.
+%
+% blah blah blah % page n
+% blah blah blah
+% \cbstart % this does its thing and set the flag
+% more blah
+% <-------------- pagebreak occurs here
+% more blah
+% \cbend % does its thing and unsets flag
+% blah blah
+%
+% Since TeX process ahead of the page break before invoking the
+% output routine, it is possible that the \cbend is
+% processed, and the flag unset, before the output routine is
+% called. If this happens, the necessary artificial end and begin
+% will not be added to page n and n+1, respectively. Thus, it is
+% not possible to use a flag to signal the output routine that a
+% bar crosses a page break, and some other mechanism is required.
+%
+% The method used with these macros is to create a list of the
+% beginning and end points of each bar in the document together
+% with the page number corresponding to each point. Then, as a
+% page is completed, a modified output routine checks the list to
+% determine if any bars begun on or before the current page are
+% terminated on subsequent pages, and handles those bars
+% appropriately. To build the list, information about each
+% changebar is written to the .AUX file as bars are processed.
+% This information is re-read when the document is next processed.
+% Thus, to ensure that changebars are correct, the document must
+% be processed twice, but this is required for LaTeX anyway.
+%
+% This apprach is sufficiently general to allow nested bars, bars
+% in floating insertions, and bars around floating insertions.
+% Bars inside floats and footnotes are handled in the same way as
+% bars in regular text. Bars that encompass floats or footnotes
+% are handled by creating an additional bar that floats with the
+% floating material. Modifications to the appropriate LaTeX
+% macros check for this condition and add the extra bar.
+%
+%
+%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% User Level Commands And Parameters
+%
+%
+%
+% \cbstart \cbend
+%
+% Start and end a changebar and save state on \cb@currentlist. Width of
+% new bar is determined by adding \changebarwidth to width of current
+% bar. Does not invoke a LaTeX environment.
+%
+\def\cbstart{\@ifnextchar [{\cb@xstart}{\cb@start\changebarwidth}}
+ \def\cb@xstart[#1]{\cb@start{#1}}
+
+\def\cbend{\cb@end}
+
+%
+% \cbdelete
+%
+% Start and end a square bar of the specified width. Use width
+% \deletebarwidth if none specified.
+%
+\def\cbdelete{\@ifnextchar [{\cb@delete}{\cb@delete[\deletebarwidth]}}
+\def\cb@delete[#1]{\vbox to 0pt{\vss\cb@start{#1}\vskip #1%
+ \cb@end}}
+
+
+%
+% \begin{changebar} \end{changebar}
+%
+% Identical to \cbstart and \cbend but invokes a LaTeX environment to
+% enforce correct nesting. Cannot be used in tabular and tabbing
+% environments. Not yet properly implemented.
+%
+%\newenvironment{changebar}{\@bsphack\cbstart\@esphack}{\@bsphack
+% \cbend\@esphack}
+
+
+%
+% \nochangebars
+%
+% Disables the changebar commands.
+%
+\def\nochangebars{\let\cb@end\relax \def\cb@start##1{}}
+
+%
+% \changebarwidth \deletebarwidth
+%
+% LaTeX length parameters that give the width of bars and delete
+% squares, respectively.
+%
+\newlength{\changebarwidth}
+\setlength{\changebarwidth}{2pt}
+
+\newlength{\deletebarwidth}
+\setlength{\deletebarwidth}{4pt}
+
+%
+% \reversechangebars
+%
+% Switches the side of the page on which the bars appear. It also
+% computes the position of the bar and stores in dimension variables
+% \cb@dimodd and \cb@dimeven. Called by modified \document at end of
+% preable.
+%
+\newdimen\cb@dimodd % position of special point for odd side pages
+\newdimen\cb@dimeven % ditto for even side pages
+\newif\ifcb@side % switch for current side of page for bars
+
+\def\reversechangebars{\global\cb@dimodd=\hoffset
+ \global\cb@dimeven=\hoffset
+ \global\advance\cb@dimodd by \oddsidemargin
+ \global\advance\cb@dimeven by \evensidemargin
+ \global\ifcb@side
+ \global\advance\cb@dimodd by -\changebarsep
+ \global\advance\cb@dimeven by \textwidth
+ \global\advance\cb@dimeven by \changebarsep
+ \global\cb@sidefalse
+ \else
+ \global\advance\cb@dimeven by -\changebarsep
+ \global\advance\cb@dimodd by \textwidth
+ \global\advance\cb@dimodd by \changebarsep
+ \global\cb@sidetrue\fi}
+
+
+%
+% \changebarsep
+%
+% A LaTeX length parameter that gives the separation of the bar from the
+% left margin of the text.
+%
+\newlength{\changebarsep}
+\setlength{\changebarsep}{30pt}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Declarations And Initializations
+%
+%
+
+%
+% A version message
+%
+\typeout{Changebar Style <October 20, 1988>}
+
+\let\cb@ig=\ignorespaces %useful abreviation
+
+\def\cb@maxpoint{80} % max value of used special points
+\def\cb@minpoint{1} % ditto for min;
+ % MUST BE ODD ****
+\def\cb@nil{0} % a void value for points
+
+\newcount\cb@nextpoint % next value of special point to use
+\newcount\cb@currentpoint % current value in use
+\cb@nextpoint=\cb@minpoint % intially = \cb@minpoint
+
+\newcount\cb@page % count for page value from hist list
+\newcount\cb@pagecount % our internal count of pages output
+\cb@pagecount=0 % initially 0 due to timing of increment
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros for beginning and ending bars
+%
+%
+
+%
+% \cb@start#1 #1 is the dimension of the bar
+%
+% This macro is used to start a change bar. It assigns a new value to
+% the current point and advances the counter for the next point to be
+% assigned. It pushes this info onto \cb@currentlist and then sets the
+% point by calling \cb@setBeginPoint with the point number. Finally, it
+% writes the aux file.
+%
+\def\cb@start#1{\cb@currentpoint=\cb@nextpoint
+ \@tempdima=#1\cb@ig % for \cb@push
+ \cb@push\cb@currentlist
+ \ifvmode \cb@setBeginPoint\cb@currentpoint
+ \else \vbox to 0pt{\vskip -\ht\strutbox %jump up a line to
+ \cb@setBeginPoint\cb@currentpoint %set point
+ \vskip \ht\strutbox}\fi
+ \cb@writeAux\cb@advancePoint}
+
+\def\cb@advancePoint{\global\advance\cb@nextpoint by 4\cb@ig
+ \ifnum\cb@nextpoint>\cb@maxpoint
+ \global\cb@nextpoint=\cb@minpoint\relax\fi}
+
+%
+% \cb@end
+%
+% This macro is used to end a changebar. It pops the current point and
+% nesting level off \cb@currentlist and sets the end point by calling
+% \cb@setEndPoint with the parameter corresponding to the BEGINNING
+% point number. It writes the aux file and joins the points.
+%
+\def\cb@end{\cb@pop\cb@currentlist
+ \ifnum\cb@currentpoint=\cb@nil
+ \typeout{Changebar Warning: Badly nested changebars; Expect erroneous results.}\else
+ \cb@setEndPoint\cb@currentpoint
+ \advance\cb@currentpoint by1\cb@writeAux\fi}
+
+
+%
+% \cb@setBeginPoint#1
+%
+% Assigns position to points #1 and #1+2. First computes the position.
+%
+\def\cb@setBeginPoint#1{\special{ln03:defpoint \the#1(\the
+ \cb@dimodd,)}\@tempcnta#1\advance\@tempcnta by2\cb@ig
+ \special{ln03:defpoint \the\@tempcnta(\the\cb@dimeven,)}}
+
+%
+% \cb@setEndPoint#1
+%
+% Assigns position to point #1+1 and point #1+3. Then does a connect
+% special to join #1 and #1+1 or to join #1+2 and #1+3. Assumes that
+% width of bar is given in \@tempdima
+%
+\def\cb@setEndPoint#1{\@tempcnta=#1\advance\@tempcnta by1\cb@ig
+ \special{ln03:defpoint \the\@tempcnta\space
+ \space(\the\cb@dimodd,)}\if@twoside\@tempcntb=#1\advance
+ \@tempcntb by3\special{ln03:defpoint \the\@tempcntb\space
+ \space(\the\cb@dimeven,)}{\count9=#1\advance\count9 by2\cb@ig
+ \special{ln03:connect \the#1/\the\count9\space\space
+ \the\@tempcnta/\the\@tempcntb\space\space\the\@tempdima}}\else
+ \special{ln03:connect \the#1 \the\@tempcnta\space\space
+ \the\@tempdima}\fi}
+
+%
+% \cb@writeAux
+%
+% Writes the string
+% \cb@barpoint{\cb@currentpoint}{\thepage}{\cb@tempdima} to the aux
+% file. Assumes that width of bar is in \@tempdima.
+%
+\def\cb@writeAux{\begingroup \edef\point{\the\cb@currentpoint}\cb@ig
+ \edef\level{\the\@tempdima}\cb@ig
+ \let\the=0\edef\cb@temp{\write\@auxout
+ {\string\cb@barpoint{\point}{\the\cb@pagecount}{\level}}}\cb@ig
+ \cb@temp\endgroup}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros for Making It Work Across Page Breaks
+%
+
+
+%
+% \@makecol
+%
+% Modifies the LaTex macros to end the changebars spanning the current
+% page (if any) and restart them on the next page. Does the
+% following: It resets special points for this page. Adds begin bars
+% to top of box255. The bars to be begun are saved in \cb@beginSaves.
+% Increments the changebar-internal page counter so that the value
+% corresponds to the number of this page in strictly sequential order
+% (the LaTeX page number can be reset). Then it builds the list
+% \cb@spanlist, then calls \cb@processActive to process the elements
+% on the list, then it executes the original \@makecol.
+%
+\let\cb@makecol=\@makecol
+\def\@makecol{\setbox255=\vbox{\special{ln03:resetpoints \cb@minpoint
+ \space\cb@maxpoint}\cb@beginSaves\unvbox255}\cb@ig
+ \gdef\cb@beginSaves{}\global\advance
+ \cb@pagecount by 1\cb@buildActive
+ \cb@processActive\cb@makecol}
+
+%
+% \cb@processActive
+%
+% Processes each element on span list. Each element represents a bar
+% that crosses the page break. There could be more than one if bars are
+% nested. Works as folows:
+%
+% pop top element of span list
+% if point null (i.e., list empty) then done
+% else
+% do an end bar on box255
+% save start for new bar at top of next page in \cb@startSaves
+% push active point back onto history list (need to reprocess
+% on next page).
+%
+\def\cb@processActive{\cb@pop\cb@spanlist
+ \ifnum\cb@currentpoint=\cb@nil \else
+ \setbox255=\vbox{\unvbox255\cb@setEndPoint\cb@currentpoint}\cb@ig
+ \cb@saveBeginPoint\cb@currentpoint \cb@push\cb@history
+ \cb@processActive\fi}
+
+%
+% \cb@saveBeginPoint#1
+%
+% Saves a \special to begin a point in expanded macro \cb@beginSaves.
+% This is then used to start all spanning bars at the top of the next
+% page. It is almost the same as \cb@setBeginPoint
+%
+\def\cb@saveBeginPoint#1{\xdef\cb@beginSaves{\special{ln03:defpoint
+ \the#1(\the\cb@dimodd,)}\cb@beginSaves}\@tempcnta#1\advance
+ \@tempcnta by2\xdef\cb@beginSaves{\special{ln03:defpoint
+ \the\@tempcnta(\the\cb@dimeven,)}\cb@beginSaves}}
+
+\def\cb@beginSaves{} % initially empty
+
+
+
+
+%
+% \cb@buildActive
+%
+% Initializes the spanlist to null. Pops top of history list. If point
+% is on future page, push back onto history list. If point on current
+% or previous page and odd, add point to span list; if even, pop span
+% list since this bar has terminated on current page.
+%
+\def\cb@buildActive{\cb@initlist\cb@spanlist\cb@pushNextActive}
+
+\def\cb@pushNextActive{\cb@pop\cb@history
+ \ifnum\cb@currentpoint=\cb@nil \else
+ \ifnum\cb@page>\cb@pagecount \cb@push\cb@history \else
+ \ifodd\cb@currentpoint \cb@push\cb@spanlist
+ \else \cb@pop\cb@spanlist\fi
+ \cb@pushNextActive\fi\fi}
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros For Managing The Lists of Bar points
+%
+% The macros make use of three lists corresponding to \special
+% defpoints. Each list takes the form
+% <element> . . . <element>
+%
+% Each element is of the form xxxnyyypzzzl where xxx is the number of
+% the special point, yyy is the page on which this point is set, and zzz
+% is the dimension used when connecting this point.
+%
+% The list \cb@history is built from the log information and initially
+% lists all the points. As pages are processed, points are popped off
+% the list and discarded.
+%
+% The list \cb@spanlist is a temporary list used by the output routine
+% and contains the list of all bars crossing the current page (there may
+% be more than one with nested bars). It is built by popping elements
+% off the history list.
+%
+% The list \cb@currentlist contains all the current bars. A \cb@start
+% pushes an element onto this list. A \cb@end pops the top element off
+% the list and uses the info to terminate the bar.
+%
+% For performance and memory reasons, the history list, which can be
+% very long, is special cased and a file is used to store this list
+% rather than an internal macro. The ``external'' interface to this
+% list is identical to what is described above. However, when the
+% history list is popped, a line from the file is first read and
+% appended to the macro \cb@history.
+%
+
+%
+% \cb@initlist % Initialize a list
+%
+\def\cb@initlist#1{\xdef#1{}}
+
+%
+% Initializations, etc.
+%
+\cb@initlist\cb@history % the history list; initially empty
+\cb@initlist\cb@spanlist % list of bars spanning current page
+\cb@initlist\cb@currentlist % used to implement nesting without using
+ % TeX grouping
+%\xdef\@empty{} % to test if list is empty. In LaTeX.
+
+\newwrite\cb@write % file for history list
+\newread\cb@read
+\immediate\openout\cb@write=\jobname.cb % open for building of history list
+
+%
+% \cb@pop#1 #1 is name of list (e.g., \cb@history)
+%
+% This pops the top element off the named list and puts the point value
+% into \cb@currentpoint, the page value into \cb@page and the bar width
+% into \@tempdima. If the list is empty, returns a void value (\cb@nil)
+% in \cb@currentpoint and sets \cb@page=0.
+%
+\def\cb@pop#1{\ifx #1\cb@history \ifeof\cb@read \else
+ {\endlinechar=-1\read\cb@read to\@temp
+ \xdef\cb@history{\cb@history\@temp}}\fi\fi
+ \ifx \@empty#1\cb@currentpoint=\cb@nil\cb@page=0\else
+ \expandafter\cb@carcdr#1e#1\fi}
+
+\def\cb@carcdr#1n#2p#3l#4e#5{\cb@currentpoint=#1\cb@page=#2\@tempdima=#3%
+ \xdef#5{#4}}
+
+%
+% \cb@push#1
+%
+% Pushes \cb@currentpoint, \cb@page and \@tempdima onto the top of the
+% named list
+%
+\def\cb@push#1{\xdef#1{\the\cb@currentpoint n\the\cb@page p\the\@tempdima l#1}}
+
+%
+% \cb@barpoint % For populating history file
+%
+% Writes one line to .cb file which is equivalent to one <element>
+% described above.
+\def\cb@barpoint#1#2#3{\immediate\write\cb@write{#1n#2p#3l}}
+
+
+%
+% \document
+%
+% Modifies \document to manage history file. It closes the .cb file
+% and opens it for reading. Also calls \reversechangebars to compute
+% the dimensions of the bar positions (thus any changes to margins
+% etc. in preamble will be recognised).
+%
+\let\cb@document=\document
+\def\document{\reversechangebars
+ \cb@document\immediate\closeout\cb@write
+ \immediate\openin\cb@read=\jobname.cb}
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros For Checking That The .AUX File Is Stable
+%
+
+%
+% \enddocument
+%
+% Does a \clearpage to flush rest of document. Then closes .cb file
+% and reopens for checking. Inits history list (to be read from
+% file). Lets \cb@barpoint=\cb@checkhistory for checking.
+%
+\let\cb@enddocument\enddocument
+\def\enddocument{\clearpage\cb@initlist\cb@history
+ \immediate\closein\cb@read\immediate\openin\cb@read=\jobname.cb%
+ \let\cb@barpoint=\cb@checkHistory\cb@enddocument}
+
+%
+% \cb@checkHistory
+%
+% Pops the top of the history list (\jobname.cb) and
+% check to see if the point and page numbers are the same as the
+% arguements #1 and #2 respectively. Prints a warning message if
+% different.
+%
+\def\cb@checkHistory#1#2#3{\cb@pop\cb@history
+ \ifnum #1=\cb@currentpoint
+ \ifnum #2=\cb@page % do nothing
+ \else \cb@error % page numbers mismatched
+ \fi
+ \else \cb@error % point numbers mismatched
+ \fi}
+
+\def\cb@error{\message{Changebar Warning: Changebar info has changed. %
+Rerun to get right.}\gdef\cb@checkHistory##1##2##3{}\let\cb@barpoint=\cb@checkHistory}
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros For Making It Work With Nested Floats/Footnotes
+% Works for LaTeX 2.09
+%
+
+%
+% \end@float
+%
+% This is a replacement for the Latex macro of the same name. All it
+% does is check to see if changebars are active and, if so, it puts
+% changebars around the box containing the float. Then it calls the
+% original LaTeX \end@float
+%
+\let\cb@endfloat=\end@float
+\def\end@float{\cb@pop\cb@currentlist\ifnum\cb@currentpoint=\cb@nil
+ \else \cb@push\cb@currentlist\global\@tempdima=\@tempdima
+ \egroup \global\setbox\@currbox
+ \vbox\bgroup \cb@start\@tempdima\unvbox\@currbox\cb@end\fi
+ \cb@endfloat}
+
+\let\endfigure=\end@float % need to rebind these to new def
+\let\endtable=\end@float
+
+%
+% \@footnotetext#1
+%
+% Replacement for the LaTeX macro of the same name. Simply checks to
+% see if changebars are active and if so wraps the macro arguement
+% (i.e., the footnote) in changebars.
+%
+\let\cb@footnote=\@footnotetext
+\long\def\@footnotetext#1{\cb@pop\cb@currentlist\ifnum\cb@currentpoint=\cb@nil
+ \cb@footnote{#1}\else \cb@push\cb@currentlist
+ \edef\cb@temp{\the\@tempdima}\cb@ig
+ \cb@footnote{\cb@start{\cb@temp}#1\cb@end}\fi}
+
+%
+% \@mpfootnotetext#1
+%
+% Replacement for the LaTeX macro of the same name. Same thing as
+% \@footnotetext.
+%
+\let\cb@mpfootnote=\@mpfootnotetext
+\long\def\@mpfootnotetext#1{\cb@pop\cb@currentlist
+ \ifnum\cb@currentpoint=\cb@nil
+ \cb@mpfootnote{#1}\else \cb@push\cb@currentlist
+ \edef\cb@temp{\the\@tempdima}\cb@ig
+ \cb@mpfootnote{\cb@start{\cb@temp}#1\cb@end}\fi}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% end of changebar style
+%
diff --git a/dviware/ln03/rmcs/cli.for b/dviware/ln03/rmcs/cli.for
new file mode 100644
index 0000000000..755c0df1cf
--- /dev/null
+++ b/dviware/ln03/rmcs/cli.for
@@ -0,0 +1,495 @@
+ SUBROUTINE CLI
+
+C
+C FUNCTIONAL DESCRIPTION:
+C
+C Uses Niel Kempson's routines to extract the command line information
+C
+C DUMMY ARGUMENTS:
+C
+C none
+C
+C IMPLICIT INPUTS:
+C
+C none
+C
+C IMPLICIT OUTPUTS:
+C
+C All values in COMMON/GINOTOSIX/ initialized
+C
+C
+C SIDE EFFECTS:
+C
+C none
+C
+C
+ IMPLICIT NONE
+
+ INCLUDE '($SSDEF)'
+ INCLUDE '($NAMDEF)'
+
+ INTEGER*4 SEGMENT !Segment number in saved drawing
+ REAL*4 WIDTH !Desired width
+ REAL*4 HEIGHT !Desired height
+ REAL*4 SCALE !Desired scale factor
+ CHARACTER*255 INPUT !Name of input file
+ CHARACTER*255 OUTPUT !Name of output file
+ LOGICAL FORMFEED !Do we want a formfeed at the end of the
+ !file?
+
+ COMMON/GINOTOSIX/INPUT,OUTPUT,WIDTH,HEIGHT,SCALE,SEGMENT,FORMFEED
+
+ INTEGER*4 CLI_STATUS
+ INTEGER*4 CLI_STRING_LENGTH
+ INTEGER*4 FILE_NAME_STATUS_BITS
+ INTEGER*4 INPUT_LENGTH
+ INTEGER*4 OUTPUT_LENGTH
+ INTEGER*4 OUTPUT__LENGTH
+ INTEGER*4 PARSE_STATUS
+ INTEGER*4 F_DOLLAR_PARSE
+ CHARACTER*255 CLI_STRING
+ CHARACTER*255 OUTPUT_
+ CHARACTER*255 DEFAULT_FILESPEC
+ CHARACTER*255 DEFAULT_NAME
+ INTEGER*4 DEFAULT_NAME_LENGTH
+ INTEGER*4 DEFAULT_TYPE_LENGTH
+ INTEGER*4 DEFAULT_FILESPEC_LENGTH
+
+ PARAMETER PARSE_CONCEAL = 0
+ PARAMETER PARSE_NOCONCEAL = 1
+ PARAMETER PARSE_SYNTAX_ONLY = 2
+ PARAMETER PARSE_CHECK_EXISTS = 0
+
+ EXTERNAL CLI$PRESENT
+ EXTERNAL CLI$GET_VALUE
+
+ INTEGER*4 CLI$PRESENT
+ INTEGER*4 CLI$GET_VALUE
+
+ EXTERNAL CLI$_PRESENT
+ EXTERNAL CLI$_ABSENT
+ EXTERNAL CLI$_NEGATED
+ EXTERNAL CLI$_COMMA
+
+ SEGMENT = 0
+ CLI_STATUS = CLI$PRESENT ('SEGMENT')
+ IF (CLI_STATUS .EQ. %LOC (CLI$_PRESENT)) THEN
+ CLI_STATUS = CLI$GET_VALUE ('SEGMENT',
+ 1 CLI_STRING,
+ 1 CLI_STRING_LENGTH)
+
+ IF (CLI_STATUS .EQ. SS$_NORMAL) THEN
+ READ (CLI_STRING(1:CLI_STRING_LENGTH), 110) SEGMENT
+ ELSE
+ TYPE *,'GINOTOSIX Error - Invalid segment'
+ STOP
+ END IF
+ IF (SEGMENT.LT.0) THEN
+ TYPE *,'GINOTOSIX Error - Invalid segment'
+ STOP
+ END IF
+
+ END IF
+
+ SCALE = 0
+ CLI_STATUS = CLI$PRESENT ('SCALE')
+ IF (CLI_STATUS .EQ. %LOC (CLI$_PRESENT)) THEN
+ CLI_STATUS = CLI$GET_VALUE ('SCALE',
+ 1 CLI_STRING,
+ 1 CLI_STRING_LENGTH)
+
+ IF (CLI_STATUS .EQ. SS$_NORMAL) THEN
+ READ (CLI_STRING(1:CLI_STRING_LENGTH), 100, ERR=200) SCALE
+ ELSE
+200 TYPE *,'GINOTOSIX Error - Invalid scale'
+ STOP
+ END IF
+
+ END IF
+
+ WIDTH = 0
+ HEIGHT = 0
+ CLI_STATUS = CLI$PRESENT ('SIZE')
+
+ IF (CLI_STATUS .EQ. %LOC (CLI$_PRESENT)) THEN
+
+ CLI_STATUS = CLI$GET_VALUE ('SIZE.WIDTH',
+ 1 CLI_STRING,
+ 1 CLI_STRING_LENGTH)
+
+ IF (CLI_STATUS .EQ. SS$_NORMAL) THEN
+ READ (CLI_STRING(1:CLI_STRING_LENGTH), 100) WIDTH
+ ELSE
+ TYPE *,'GINOTOSIX Error - Invalid width'
+ STOP
+ END IF
+
+ CLI_STATUS = CLI$GET_VALUE ('SIZE.HEIGHT',
+ 1 CLI_STRING,
+ 1 CLI_STRING_LENGTH)
+
+ IF (CLI_STATUS .EQ. SS$_NORMAL) THEN
+ READ (CLI_STRING(1:CLI_STRING_LENGTH), 100) HEIGHT
+ ELSE
+ TYPE *,'GINOTOSIX Error - Invalid height'
+ STOP
+ END IF
+
+ END IF
+
+ CLI_STATUS = CLI$PRESENT ('OUTPUT')
+ IF (CLI_STATUS .EQ. %LOC (CLI$_PRESENT)) THEN
+ CLI_STATUS = CLI$GET_VALUE (
+ 1 'OUTPUT',
+ 1 OUTPUT_,
+ 1 OUTPUT__LENGTH)
+
+ PARSE_STATUS = F_DOLLAR_PARSE(
+ 1 OUTPUT_(1:OUTPUT__LENGTH),
+ 1 '*.*;*',
+ 1 'FULL',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 OUTPUT,
+ 1 OUTPUT_LENGTH,
+ 1 FILE_NAME_STATUS_BITS)
+
+ IF (IAND(FILE_NAME_STATUS_BITS, NAM$M_WILD_DIR) .NE. 0) THEN
+ TYPE *,'GINOTOSIX Error - Illegal output filespec'
+ STOP
+ END IF
+
+ ELSE
+
+ OUTPUT(1:7) = '[]*.*;*'
+ OUTPUT(8:) = ' '
+ OUTPUT_LENGTH = 7
+
+ END IF
+
+ CALL REMOVE_WILDCARDS (OUTPUT, OUTPUT_LENGTH)
+
+ CLI_STATUS = CLI$GET_VALUE('INPUT_FILESPEC',
+ 1 INPUT,
+ 1 INPUT_LENGTH)
+
+ IF (CLI_STATUS .NE. SS$_NORMAL) THEN
+ TYPE *,'GINOTOSIX Error - Illegal input filespec'
+ STOP
+ END IF
+
+ PARSE_STATUS = F_DOLLAR_PARSE (
+ 1 INPUT(1:INPUT_LENGTH),
+ 1 '.PIC',
+ 1 'FULL',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 INPUT,
+ 1 INPUT_LENGTH,
+ 1 FILE_NAME_STATUS_BITS)
+
+ PARSE_STATUS = F_DOLLAR_PARSE (INPUT,
+ 1 ' ',
+ 1 'NAME',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 DEFAULT_NAME,
+ 1 DEFAULT_NAME_LENGTH,
+ 1 FILE_NAME_STATUS_BITS)
+
+ DEFAULT_FILESPEC = DEFAULT_NAME(1:DEFAULT_NAME_LENGTH) // '.SIX'
+ DEFAULT_FILESPEC_LENGTH = DEFAULT_NAME_LENGTH + 4
+
+ PARSE_STATUS = F_DOLLAR_PARSE (
+ 1 OUTPUT(1:OUTPUT_LENGTH),
+ 1 DEFAULT_FILESPEC(1:DEFAULT_FILESPEC_LENGTH),
+ 1 'FULL',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 OUTPUT,
+ 1 OUTPUT_LENGTH,
+ 1 FILE_NAME_STATUS_BITS)
+
+ IF (IAND (FILE_NAME_STATUS_BITS, NAM$M_WILDCARD) .NE. 0) THEN
+ CALL REMOVE_WILDCARDS (OUTPUT, OUTPUT_LENGTH)
+ END IF
+
+ FORMFEED=.FALSE.
+ CLI_STATUS = CLI$PRESENT ('FORMFEED')
+ IF (CLI_STATUS .EQ. %LOC (CLI$_PRESENT)) FORMFEED=.TRUE.
+
+ RETURN
+
+100 FORMAT (F5.0)
+110 FORMAT (I5)
+
+ END
+
+ SUBROUTINE REMOVE_WILDCARDS (FILE_SPEC, FILE_SPEC_LENGTH)
+ INCLUDE '($NAMDEF)'
+ PARAMETER PARSE_CONCEAL = 0,
+ 1 PARSE_NOCONCEAL = 1,
+ 1 PARSE_SYNTAX_ONLY = 2,
+ 1 PARSE_CHECK_EXISTS = 0
+ CHARACTER*(*) file_spec
+ INTEGER*4 file_spec_length
+ CHARACTER*255
+ 1 new_file_spec,
+ 1 node,
+ 1 device,
+ 1 directory
+ CHARACTER*255
+ 1 default_name,
+ 1 default_type,
+ 1 name,
+ 1 type,
+ 1 version
+ INTEGER*4 new_file_spec_length,
+ 1 node_length,
+ 1 device_length,
+ 1 directory_length,
+ 1 name_length,
+ 1 type_length,
+ 1 version_length,
+ 1 f_dollar_parse,
+ 1 parse_status,
+ 1 file_name_status_bits,
+ 1 string_length
+
+
+ file_spec_length = string_length (file_spec)
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'NODE',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 node,
+ 1 node_length,
+ 1 file_name_status_bits)
+ IF (node_length .GT. 0) THEN
+ new_file_spec(1:) = node(1:node_length)
+ END IF
+ new_file_spec_length = node_length
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'DEVICE',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 device,
+ 1 device_length,
+ 1 file_name_status_bits )
+ IF (device_length .GT. 0) THEN
+ new_file_spec(new_file_spec_length+1:) = device(1:device_length)
+ END IF
+ new_file_spec_length = new_file_spec_length + device_length
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'DIRECTORY',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 directory,
+ 1 directory_length,
+ 1 file_name_status_bits)
+
+ IF (IAND (file_name_status_bits, NAM$M_WILD_DIR) .EQ. 0) THEN
+ IF (directory_length .GT. 0) THEN
+ new_file_spec(new_file_spec_length+1:) =
+ 1 directory(1:directory_length)
+ END IF
+ new_file_spec_length = new_file_spec_length + directory_length
+ END IF
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'NAME',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 name,
+ 1 name_length,
+ 1 file_name_status_bits )
+
+ IF (IAND (file_name_status_bits, NAM$M_WILD_NAME) .EQ. 0) THEN
+ IF (name_length .GT. 0) THEN
+ new_file_spec(new_file_spec_length+1:) = name(1:name_length)
+ END IF
+ new_file_spec_length = new_file_spec_length + name_length
+ END IF
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'TYPE',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 type,
+ 1 type_length,
+ 1 file_name_status_bits )
+
+ IF (IAND (file_name_status_bits, NAM$M_WILD_TYPE) .EQ. 0) THEN
+ IF (type_length .GT. 0) THEN
+ new_file_spec(new_file_spec_length+1:) = type(1:type_length)
+ END IF
+ new_file_spec_length = new_file_spec_length + type_length
+ END IF
+
+ parse_status = f_dollar_parse (
+ 1 file_spec(1:file_spec_length),
+ 1 ' ',
+ 1 'VERSION',
+ 1 PARSE_CONCEAL+PARSE_SYNTAX_ONLY,
+ 1 version,
+ 1 version_length,
+ 1 file_name_status_bits)
+
+ IF (IAND (file_name_status_bits, NAM$M_WILD_VER) .EQ. 0) THEN
+ IF (version_length .GT. 0) THEN
+ new_file_spec(new_file_spec_length+1:) =
+ 1 version(1:version_length)
+ END IF
+ new_file_spec_length = new_file_spec_length + version_length
+ END IF
+
+ IF (new_file_spec_length .GT. 0) THEN
+ file_spec(1:) = new_file_spec(1:new_file_spec_length)
+ END IF
+ file_spec_length = new_file_spec_length
+
+ RETURN
+ END
+
+ INTEGER*4 FUNCTION f_dollar_parse (file_spec,
+ 1 default_file_spec,
+ 1 parse_type,
+ 1 parse_flags,
+ 1 return_buffer,
+ 1 return_string_length,
+ 1 file_name_status_bits)
+ INCLUDE '($FABDEF)'
+ INCLUDE '($NAMDEF)'
+ PARAMETER PARSE_CONCEAL = 0,
+ 1 PARSE_NOCONCEAL = 1,
+ 1 PARSE_SYNTAX_ONLY = 2,
+ 1 PARSE_CHECK_EXISTS = 0
+ CHARACTER*(*) file_spec,
+ 1 default_file_spec,
+ 1 return_buffer,
+ 1 parse_type
+ INTEGER*4 return_string_length,
+ 1 parse_flags,
+ 1 file_name_status_bits
+ RECORD /FABDEF/ fab
+ RECORD /NAMDEF/ nam
+ CHARACTER*16 local_parse_type
+ CHARACTER*255
+ 1 full_filespec
+ INTEGER*4 SYS$PARSE,
+ 1 start_char,
+ 1 stop_char,
+ 1 return_buffer_size,
+ 1 parsed_string_length
+ BYTE int_to_byte
+
+ fab.FAB$B_BID = FAB$C_BID
+ fab.FAB$B_BLN = FAB$C_BLN
+
+ fab.FAB$L_FNA = %LOC (file_spec)
+ fab.FAB$B_FNS = int_to_byte (LEN (file_spec))
+
+ fab.FAB$L_DNA = %LOC (default_file_spec)
+ fab.FAB$B_DNS = int_to_byte (LEN (default_file_spec))
+
+ fab.FAB$L_NAM = %LOC (nam)
+
+ nam.NAM$B_BID = NAM$C_BID
+ nam.NAM$B_BLN = NAM$C_BLN
+
+ nam.NAM$L_ESA = %LOC (full_filespec)
+ nam.NAM$B_ESS = int_to_byte (MIN (LEN (full_filespec), 255))
+
+ nam.NAM$B_NOP = 0
+
+ IF (IAND (parse_flags, PARSE_NOCONCEAL) .NE. 0) THEN
+ nam.NAM$B_NOP = NAM$M_NOCONCEAL
+ END IF
+
+ IF (IAND (parse_flags, PARSE_SYNTAX_ONLY) .NE. 0) THEN
+ nam.NAM$B_NOP = nam.NAM$B_NOP + NAM$M_SYNCHK
+ END IF
+
+ f_dollar_parse = SYS$PARSE (fab)
+ file_name_status_bits = nam.NAM$L_FNB
+
+ CALL STR$UPCASE (local_parse_type, parse_type)
+
+ IF (local_parse_type .EQ. 'NODE') THEN
+ start_char = nam.NAM$L_NODE - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_NODE) - 1
+
+ ELSE IF (local_parse_type .EQ. 'DEVICE') THEN
+ start_char = nam.NAM$L_DEV - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_DEV) - 1
+
+ ELSE IF (local_parse_type .EQ. 'DIRECTORY') THEN
+ start_char = nam.NAM$L_DIR - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_DIR) - 1
+
+ ELSE IF (local_parse_type .EQ. 'NAME') THEN
+ start_char = nam.NAM$L_NAME - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_NAME) - 1
+
+ ELSE IF (local_parse_type .EQ. 'TYPE') THEN
+ start_char = nam.NAM$L_TYPE - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_TYPE) - 1
+
+ ELSE IF (local_parse_type .EQ. 'VERSION') THEN
+ start_char = nam.NAM$L_VER - nam.NAM$L_ESA + 1
+ stop_char = start_char + ZEXT (nam.NAM$B_VER) - 1
+
+ ELSE IF (local_parse_type .EQ. 'FULL') THEN
+ start_char = 1
+ stop_char = ZEXT (nam.NAM$B_ESL)
+
+ ELSE
+ TYPE *, 'Invalid parse string: (',local_parse_type,').'
+ CALL LIB$SIGNAL (MODIFY$INVPARTYP, 1, local_parse_type)
+ CALL EXIT
+ END IF
+
+ parsed_string_length = stop_char - start_char + 1
+ return_buffer_size = LEN (return_buffer)
+ return_string_length = MIN (return_buffer_size, parsed_string_length)
+
+ IF (return_string_length .GT. 0) THEN
+ return_buffer(1:) = full_filespec(
+ 1 start_char:start_char + return_string_length - 1)
+ END IF
+
+ RETURN
+ END
+
+ INTEGER*4 FUNCTION string_length (string)
+ IMPLICIT NONE
+ CHARACTER*(*) string
+ CHARACTER this_char
+ string_length = LEN (string)
+
+ DO WHILE (string_length .GT. 0)
+ this_char = string(string_length:string_length)
+ IF ((this_char .NE. ' ') .AND. (this_char .NE. CHAR(9))) THEN
+ RETURN
+ END IF
+ string_length = string_length - 1
+ END DO
+ RETURN
+ END
+
+ BYTE FUNCTION int_to_byte (number)
+ IMPLICIT NONE
+ INTEGER*4 number
+
+ IF ( IAND (number, '00000080'X) .NE. 0) THEN
+ int_to_byte = IOR (number, 'FFFFFF00'X)
+ ELSE
+ int_to_byte = IAND (number, '000000FF'X)
+ END IF
+
+ RETURN
+ END
diff --git a/dviware/ln03/rmcs/descrip.mms b/dviware/ln03/rmcs/descrip.mms
new file mode 100644
index 0000000000..0fb1c47289
--- /dev/null
+++ b/dviware/ln03/rmcs/descrip.mms
@@ -0,0 +1,117 @@
+#
+############################################################################
+############################################################################
+.SUFFIXES : ;
+.SUFFIXES : .exe .obj .pas .ln3 .dvi .tex .web .ch
+
+.dvi.ln3
+ - DVILN03 $(MMS$SOURCE)
+ @ $(WSO) "$(MMS$TARGET) built at ''F$TIME()'."
+ @ $(WSO) " "
+
+.tex.dvi
+ TEX /BATCH $(MMS$SOURCE)
+
+.pas.obj
+ PASCAL $(PFLAGS) $(MMS$SOURCE)
+ TYPE $(MMS$TARGET_NAME).lis
+ DELETE/LOG $(MMS$TARGET_NAME).lis;
+
+#
+############################################################################
+############################################################################
+PFLAGS = /NODEBUG/OPTIM/LIST/SHOW=(NONE,STAT)
+LINKFLAGS = /NODEBUG/NOTRACEBACK/SYSSHARE
+DPFLAGS = /DEBUG/NOOPTIM/LIST/SHOW=(NONE,STAT)/CHECK=ALL
+DLINKFLAGS = /DEBUG/TRACEBACK/SYSSHARE
+WSO = WRITE SYS$OUTPUT
+exe_dir = TEX_EXE:
+
+target_list_1 = dvitoln03 dvil_debug
+target_list_2 = dvitoln03.ln3
+
+
+#
+############################################################################
+############################################################################
+default :
+ @ $(WSO) "You must specify which target to make. Valid targets are:"
+ @ $(WSO) " "
+ @ $(WSO) "Programs:"
+ @ $(WSO) " $(target_list_1)"
+ @ $(WSO) " "
+ @ $(WSO) "Documentation: "
+ @ $(WSO) " $(target_list_2)"
+ @ $(WSO) " "
+ @ $(WSO) "EXES - make all executables"
+ @ $(WSO) "DOC - make all .LN3 files"
+ @ $(WSO) "INSTALL - move executables to $(exe_dir)"
+ @ $(WSO) "CLEAN - delete all rebuildable files"
+
+#
+############################################################################
+############################################################################
+install :
+ COPY/LOG *.EXE; $(exe_dir)*.*;0
+
+#
+############################################################################
+############################################################################
+clean :
+ @ PURGE/LOG
+ @ IF F$SEARCH("*.TEX") .NES. "" THEN $ DELETE *.TEX;*
+ @ IF F$SEARCH("*.DVI") .NES. "" THEN $ DELETE *.DVI;*
+ @ IF F$SEARCH("*.LN3") .NES. "" THEN $ DELETE *.LN3;*
+ @ IF F$SEARCH("*.PAS") .NES. "" THEN $ DELETE *.PAS;*
+ @ IF F$SEARCH("*.OBJ") .NES. "" THEN $ DELETE *.OBJ;*
+ @ IF F$SEARCH("*.EXE") .NES. "" THEN $ DELETE *.EXE;*
+ @ IF F$SEARCH("*.POO*") .NES. "" THEN $ DELETE *.POO*;*
+ @ IF F$SEARCH("*.LIS") .NES. "" THEN $ DELETE *.LIS;*
+ @ IF F$SEARCH("*.TYP") .NES. "" THEN $ DELETE *.TYP;*
+
+#
+############################################################################
+############################################################################
+exes DEPENDS_ON $(target_list_1)
+ @ $(WSO) "$(MMS$TARGET_NAME) built at ''F$TIME()'."
+ @ $(WSO) " "
+
+#
+############################################################################
+############################################################################
+doc DEPENDS_ON $(target_list_2)
+ @ $(WSO) "$(MMS$TARGET_NAME) built at ''F$TIME()'."
+ @ $(WSO) " "
+
+dvitoln03 DEPENDS_ON dvitoln03.exe
+ @ $(WSO) "$(MMS$TARGET_NAME) built at ''F$TIME()'."
+ @ $(WSO) " "
+
+dvil_debug DEPENDS_ON dvil_debug.exe
+ @ $(WSO) "$(MMS$TARGET_NAME) built at ''F$TIME()'."
+ @ $(WSO) " "
+
+
+dvitoln03.ln3 DEPENDS_ON dvitoln03.dvi
+
+#
+############################################################################
+############################################################################
+dvitoln03.pas DEPENDS_ON dvitoln03.web dvitoln03.ch
+ TANGLE dvitoln03
+
+dvil_debug.obj DEPENDS_ON dvil_debug.pas
+ PASCAL $(DPFLAGS) $(MMS$SOURCE)
+ TYPE $(MMS$TARGET_NAME).lis
+ DELETE/LOG $(MMS$TARGET_NAME).lis;
+
+dvil_debug.exe DEPENDS_ON dvil_debug.obj
+ LINK $(DLINKFLAGS) $(MMS$SOURCE)
+
+dvil_debug.pas DEPENDS_ON dvitoln03.pas
+ COPY/LOG dvitoln03.pas dvil_debug.pas
+#
+############################################################################
+############################################################################
+dvitoln03.tex DEPENDS_ON dvitoln03.web dvitoln03.ch
+ WEAVE dvitoln03
diff --git a/dviware/ln03/rmcs/dviln03.hlp b/dviware/ln03/rmcs/dviln03.hlp
new file mode 100644
index 0000000000..93fa684dc7
--- /dev/null
+++ b/dviware/ln03/rmcs/dviln03.hlp
@@ -0,0 +1,351 @@
+1 DVILN03
+
+ DVILN03 is a program to convert TeX Device Independent (DVI) output
+ files into a form suitable for printing on a Digital LN03 laser
+ printer. The "Local Guide to DVILN03" contains full details of this
+ program. Please report any problems or suggestions to Brian Hamilton
+ Kelly, or by sending electronic mail to user TEX.
+
+ Format:
+
+ DVILN03 file-name
+
+ If the program terminates successfully, it will produce two new files,
+ with the same name, but different types.
+
+ file-name.LN3 - the output file, suitable for printing on a Digital
+ LN03 laser printer using the TEXPRINT command.
+
+ file-name.TYP - the log file, recording messages sent by DVILN03 to
+ the terminal, plus additional information.
+
+
+2 Parameter
+
+ file-name
+
+ Specifies the TeX DeVice Independent (DVI) file to be converted to
+ a form suitable for printing on a Digital LN03 laser printer.
+
+
+2 Command_Qualifiers
+
+/STARTING_PAGE
+
+ /STARTING_PAGE=starting_page_number (default = *)
+
+ This qualifier specifies the first TeX page to be converted. A
+ wildcard qualifier may be used, in which case, the first page number
+ matching the specification is used. DVILN03 accepts TeX multiple page
+ specifiers e.g. 1.*.19.4; see the user guide for further details.
+
+ If you omit this qualifier, DVILN03 will start at the first page of the
+ document.
+
+
+
+/NUMBER_OF_PAGES
+
+ /NUMBER_OF_PAGES=number_of_pages_to_print (default=1000000)
+
+ This qualifier specifies the number of TeX pages to be converted.
+ If you omit this qualifier, DVILN03 will print the entire document.
+
+
+
+/ORIENTATION
+
+ /ORIENTATION=image_orientation (default=PORTRAIT)
+
+ This qualifier specifies the orientation of the document as it will be
+ printed on the Digital LN03 printer. Two options are available:
+
+ /ORIENTATION = PORTRAIT
+ The output is intended to be printed taller than it is wide.
+
+ /ORIENTATION = LANDSCAPE
+ The output is intended to be printed wider than it is tall.
+
+/OUTPUT
+
+ /OUTPUT=file_spec
+
+ The output (ready for printing on an LN03 printer) will normally be
+ written in the current directory, with the same name as the DVI file
+ and file extension `.LN3'. The /OUTPUT qualifier, which requires a
+ partial file specification, can be used to override some or all of
+ these defaults.
+
+ This qualifier can be particularly useful for users with limited disk
+ quota who can use it to divert output to a scratch disk, or even send
+ it directly to a spooled printer.
+
+/LOG
+
+ /LOG[=file_spec]
+ /NOLOG
+
+ This allows the user to control whether the log file will be kept after
+ processing the document and optionally to provide an alternative file
+ specification for the file. The default for this file is to write it
+ in the current directory, with the same name as the DVI file, but with
+ file type `.TYP'. Any value provided to the /LOG qualifier allows the
+ user to override some or all of these defaults. If /LOG is specified,
+ with or without a file specification, the log file will always be
+ retained, even if no error or warning messages have been issued.
+
+ If /NOLOG is specified, the file will always be deleted at the end of
+ processing, even if an error or warning message has been issued.
+
+ The default action, if neither qualifier is present, is to delete the
+ file if no error or warning messages were issued, but to retain it
+ otherwise.
+
+/VERBOSE
+
+ /VERBOSE (deafult)
+ /NOVERBOSE
+
+ Controls the amount of progress messages sent to the user's terminal.
+ All messages go to the log file (see /LOG) in the usual fashion, but
+ if /NOVERBOSE has been specified, the terminal only shows the total
+ number of bytes of fonts downloaded and the page numbers processed;
+ warning and error messages still appear, of course.
+
+/LEFT_MARGIN
+
+ /LEFT_MARGIN=left_page_margin_offset (default=300px)
+
+ This qualifier specifies the distance (in the given unit) between the
+ physical left-hand edge of the paper and TeX's logical left-hand edge
+ of the paper. Device Independent (DVI) files are produced by TeX under
+ the assumption that this distance is one inch. The resolution of the
+ Digital LN03 printer is 300 pixels/inch; the default value is therefore
+ set to 300px. `px' is used to specify pixels as the unit for this
+ dimension; any of TeX's standard physical units (e.g. pt, mm, in) may
+ be used instead.
+ Use this qualifier with care.
+
+/TOP_MARGIN
+
+ /TOP_MARGIN=top_margin_offset (default=300px)
+
+ This qualifier specifies the distance (in the given unit) between the
+ physical top edge of the paper and TeX's logical top edge of the paper.
+ Device Independent (DVI) files are produced by TeX under the assumption
+ that this distance is one inch. The resolution of the Digital LN03
+ printer is 300 pixels/inch; the default value is therefore set to
+ 300px. `px' is used to specify pixels as the unit for this dimension;
+ any of TeX's standard physical units (e.g. pt, mm, in) may be used
+ instead.
+ Use this qualifier with care.
+
+/HFUZZ
+
+ /HFUZZ=dimension (default=100sp)
+
+ Ordinarily, TeX never generates lines that exceed the right margin; if
+ it does, it issues an `Overfull /hbox' message. However, some macro
+ packages cause TeX to exceed the margin by a few points or so, and
+ these pages, when processed by DVItoLN03, will give rise to warning
+ messages if the right margin is exceeded by more than the value
+ specified with /HFUZZ. The default value of this qualifier is 100sp,
+ which is invisibly small (it's approximately the wavelength of visible
+ light!); using larger values with this qualifier can suppress the
+ warning messages.
+ Use this qualifier with care.
+
+/VFUZZ
+
+ /VFUZZ=dimension (default=100sp)
+
+ TeX is even less likely to write output below the bottom margin of the
+ page, but this qualifier can be used analogously to /HFUZZ (q.v.) to
+ suppress the resultant warning messages if it does!
+
+/DUPLEX_BY_PAGE_NUMBERS
+
+ /DUPLEX_BY_PAGE_NUMBERS (default)
+ /NODUPLEX_BY_PAGE_NUMBERS
+
+ Specifies whether or not DVItoLN03 should use the page numbers stored
+ in the .DVI file for deciding which pages should be printed on left and
+ right pages. Each page may have more than one number, and DVItoLN03
+ will use the number (from TeX's \count0). Pages will be printed on
+ alternating right and left pages when /NODUPLEX_BY_PAGE_NUMBERS is
+ specified. When /DUPLEX_BY_PAGE_NUMBERS is specified, DVItoLN03 will
+ print pages with odd and even numbers on right and left pages
+ respectively. However, if a page has number 0, it will be printed on a
+ right page. The /PRINT_MODE must be specified to enable duplex
+ printing.
+
+/PRINT_MODE
+
+ /PRINT_MODE=(print_mode[,...])
+ /PRINT_MODE=(SIMPLEX,NORMAL) (default)
+
+ Permits use of extra facilities of newer printers such as the DEClaser
+ models 2100 and 2200 (LN05 and LN06). Some combination of options can
+ be used with the traditional LN03 as well.
+
+ The options are as follows:
+
+ SIMPLEX Print only on one side of the paper. This is the default.
+
+ DUPLEX Print on both sides of the paper.
+
+ MASTER Used together with DUPLEX for producing a master for copying.
+ This will make the printer print on one side of the paper,
+ but insert a blank sheet when the left page in the copies is
+ to be blank. The output is therefore correctly sequenced
+ to be photocopied into a double-sided document. This option
+ can even be used with an ordinary LN03.
+
+ TUMBLED Used together with duplex mode. MASTER may not be specified.
+ Print left pages upside down.
+
+ NORMAL The opposite of TUMBLED. This is the default.
+
+/FEED_TRAY
+
+ /FEED_TRAY=(option=tray_type[,...])
+ /FEED_TRAY=ALL=DEFAULT_TRAY (default)
+
+ The LN05 printer is capable of selecting paper feed from its paper tray
+ or by manual insertion of a sheet or envelope: this could be used, for
+ example, to print the first page on a manually-fed sheet of letterhead
+ stationery.
+
+ The LN06 has two individually selectable paper trays and manual feed as
+ standard; in addition, it may be fitted with an optional envelope
+ feeder and a large capacity (1000 sheet) external paper tray.
+
+ Any of these paper sources may be selected through use of the
+ /FEED_TRAY qualifier; the options available are
+
+ ALL=tray_type Feed all sheets from the specified tray
+ FIRST=tray_type Feed the first sheet from this tray
+ REST=tray_type Feed subsequent sheets from this tray
+
+ Tray types are specified through use of the following keywords:
+
+ DEFAULT_TRAY TOP_TRAY BOTTOM_TRAY ENVELOPE_TRAY MANUAL_FEED
+
+/DEVICE_TYPE
+
+ /DEVICE_TYPE=printer_type (default: LN03)
+
+ Selects the model of printer for which output is being prepared; the
+ default value of this qualifier will vary from site to site, but may
+ readily be overridden to generate output for a different model.
+
+ Values accepted for printer_type are:
+
+ LN03 The traditional LN03, or the LN03-plus. Not the LN03R
+ PostScript printer.
+ LN05 The DEClaser 2100.
+ LN06 The DEClaser 2200.
+
+/TFM_DIRECTORY
+
+ /TFM_DIRECTORY=file_spec (default=TEX$FONTS:)
+
+ Specifies where files containing TeX Font Metrics will be found.
+ Only use this qualifier if you are a system wizard!
+
+/VIRTUAL_DIRECTORY
+
+ /VIRTUAL_DIRECTORY=file_spec (default=TEX$FONTS:)
+
+ Specifies where files containing the description of virtual fonts will
+ be found.
+ Only use this qualifier if you are a system wizard!
+
+/PK_FONT_DIRECTORY
+
+ /PK_FONT_DIRECTORY=file_spec (default=TEX$PK:)
+
+ Specifies where files containing packed pixel rasters will be found. If
+ the specification (after logical name translation, if necessary) ends
+ with the characters ".]", a tree-structured directory will be assumed,
+ with fonts of different magnifications held in separate directories.
+ Otherwise, a flat structure is assumed, with the different
+ magnifications being distinguishable by different file type extensions.
+ Only use this qualifier if you are a system wizard!
+
+/PXL_FONT_DIRECTORY
+
+ /PXL_FONT_DIRECTORY=file_spec (default=TEX$PXL_ROOT:)
+
+ Specifies where files containing unpacked pixel rasters will be found.
+ If the specification (after logical name translation, if necessary)
+ ends with the characters ".]", a tree-structured directory will be
+ assumed, with fonts of different magnifications held in separate
+ directories. Otherwise, a flat structure is assumed, with the
+ different magnifications being distinguishable by different file type
+ extensions.
+ Only use this qualifier if you are a system wizard!
+
+/PAPER_SIZE
+
+ /PAPER_SIZE=paper (Default = A4)
+
+ Controls whether the program assumes the use of European A4 (210x297mm)
+ paper or US (8-1/2x11in). It is insufficient just to use this qualifier
+ to control the output: it is also necessary to power down the printer,
+ move the paper size switch on the back to the desired setting, and switch
+ on again. Therefore, it is extremely unlikely that this qualifier will
+ ever be specified by a user: rather it is present so that the system
+ manager can define the default paper size in use at any individual site.
+
+2 Examples
+
+
+ DVILN03 LATEX_OUTPUT_FILE
+
+ This command converts LATEX_OUTPUT_FILE.DVI to a form suitable for
+ printing on a Digital LN03 laser printer. All pages are converted
+ for printing in portrait form, starting one inch (300 printer
+ pixels) from the top and left-hand edges of the paper.
+
+
+
+ DVILN03/START_PAGE=5.3.2/NUMBER_OF_PAGES=13 LATEX_OUTPUT_FILE
+
+ As above, but convert only thirteen TeX pages, starting at TeX
+ page [5.3.2].
+
+
+
+ DVILN03/NUMBER_OF_PAGES=20/ORIENTATION=LANDSCAPE LATEX_OUTPUT_FILE;-1
+
+ This command converts the immediately previous version of file
+ LATEX_OUTPUT_FILE.DVI to a form suitable for printing on a Digital LN03
+ laser printer. The first 20 pages are converted for printing in
+ landscape form, starting one inch (300 printer pixels) from the top
+ and left-hand edges of the paper.
+
+ $ DEFINE MY_FONTS 'F$ENVIRONMENT("DEFAULT"),TEX$FONTS:
+ $ DEFINE MY_PK 'F$ENVIRONMENT("DEFAULT"),TEX$PK:
+ $ TEX/TEXFONTS=MY_FONTS: TESTFONT
+ Name of the font to test = myfont
+ *\table\bye
+ $ DVILN03/TFM_DIRECTORY=MY_FONTS:/PK_FONT_DIRECTORY=MY_PK: TESTFONT
+
+ This is one circumstance in which a user might want to use the extra
+ qualifiers, for use with a font that has just been built (by METAFONT)
+ and is residing in the current directory. TeX (and DVItoLN03) will
+ expect to find MYFONT.TFM in the current directory; failing that it
+ will look, as usual, in the directory indicated by TEX$FONTS.
+ DVItoLN03 will in addition look for MYFONT.300PK in one of those
+ places.
+
+
+ DVILN03 /PRINT_MODE=DUPLEX /NODUPLEX_BY_PAGE_NUMBERS -
+ /FEED_TRAY=(FIRST=MANUAL_FEED,REST=TOP_TRAY) LATEX_OUTPUT_FILE
+
+ Converts LATEX_OUTPUT_FILE.DVI to a form suitable for printing on the
+ DEClaser 2200. Pages are printed on both sides of the paper, and
+ DVItoLN03 does not insert blank pages when page numbers indicate it.
+ The first sheet of paper must be manually fed, and the rest are taken
+ from the top tray.
diff --git a/dviware/ln03/rmcs/dviln03.ln3_publish b/dviware/ln03/rmcs/dviln03.ln3_publish
new file mode 100644
index 0000000000..4b681b41d8
--- /dev/null
+++ b/dviware/ln03/rmcs/dviln03.ln3_publish
@@ -0,0 +1,5770 @@
+[!pc›?22 J
+›?27h›11h›7 I›?52h›3475t
+0;1;0y
+Ba_??CXNRdO@????Fo???@O???@TKB?oKB?oKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????^aO??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????iPk??LOX??BwEo???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??NOB??@_@???r?O??B_D??Ac@O??C?W??FoE??Bg@_??T?[??K?F???kA???e?_???OH??@oAO??v?c??C_I??AsA_??G?k??GoJ??BwAo??X?o??L?K???{BO??
+i?s??@OM??@gB_??t?w??A_N??ASBo??y?{??DOO??BIC???L`C??IWP???KC_??]@G??MOQ??@KCo??g@K??NOR??@eD???u@O??AoT??A?DO??x@S??B_U??AKD_??
+w@W??BOV??AeDo??}`[??EWW??AuE???G`c??GwX??ByEO??X`g??LGY??@AEo??j`k??@g[??A]F???A`s??Bw\??BAFO??y@s??C_]??AgF_??~@w??D?^??@sFo??
+c`{??@W_??@AG???\A???J?_???[GO??^AC??Lo`???AG_??HaG??GWa??BeG_??AaK??Gwb???QH???daO??Kgc???UHO??jaS??CGe??B]H_??[a[??B@AAThYUdhT
+KB?oKB?oGA?_GA?_GA?_GA?_GA?_GDSoKB?oKB?oKBHRQr?oPs[??????G@??_??E????Fb|~~{?_O??F??T???M???^???^???Z???Z?G?z?G?z?G?z?G?p?K@p?K@p
+?K@p?K@p?K@_?MB_?MB_?MB_?MB_?NB~?^B~?^B~?VB??VB??Ra??ra??~~pF~~pF~~pFo???G@??_??E????Fb|~~{?_O??F??S?N{~?N~~?N~~?Rb??ra??r_?@r_?
+@r_?@r_?@ra?@ra??rb_?~b~?^b~?Nb~?rb??r_?@r_?Br_?Bb_?Bb_?Bb_?Bb_?Br_?@rb?@~~~?~~~?^|~?????G@??_??K????Fb|~~{?_O??F??R?G?~@}B~@~B~
+@~bp@vr?@rq?@py?@pw?@ow?@o{???{???[???[???[???[???[???[???{???{???w?@pw?@pw?@rq?@vr?@~bp?~B~?]B~?G?~?????G@??_??E????Fb|~~{?_O??
+F??S?N{^?N|~?N~~?Bbo?Rb??rb??ra?@r_?@r_?@r_?Br_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Br_?@r_?@ra?@ra??rb??rbo?^~~?N|~?N{^?????G@??_??
+E????Fb|~~{?_O??F??T?N~~B~~~B~~~Br_?Bb_?Bb_?Bb_?Bb_??B_??B`o?B`o?B`o?N`~?N`~?N`~?B`o?B`o?B`o?B_??B_??B_?FB_?FB_?FB_?FB_?FN~~F~~~
+F~~~Fo???G@??_??K????Fb|~~{?_O??F??R?N~~@~~~@~~~@r_?@r_?@r_?@r_?@r_??B_??B_w?B_w?B_w?N_~?N_~?N_~?B_w?B_w?B_w?B_??B_??B_??B_??B_?
+?B_??B_??N{B?N{B?N{B?????G@??_??K????Fb|~~{?_O??F??S?KA^?}B~?~B~?~bw?vr_?rr??pz??py??oy??o{???{???[???[???[???[???^wBo^wBo~wBo}?
+?oz??pz??pz??rr_?vro?~bw?~B~?}B~?{A^?o???G@??_??E????Fb|~~{?_O??F??T?N~pF~~pF~~pFra??ra??ra??ra??ra??ra??ra??ra??ra??~b~?~b~?~b~
+?ra??ra??ra??ra??ra??ra??ra??ra??ra??ra??~~pF~~pF~~pFo???G@??_??Q????Fb|~~{?_O??F??P?N~~?^~~?^~~?W?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B
+?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?N~~?^~~?^~~?O???G@??_??Q????Fb|~~{?_O??F??Q?KB~?{B~?{B~?o@o??@o??@o??@o
+??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??Xo??|o??|w?@|}?N{~?Nw^?N_F?????G@??_??E????Fb|~~{?_O??F??T?N~`F~~`F~~`
+Frb??rb_?Rbo?Rbw?B`w?B_{?B_}?B_^?B_N?J_N?N_^?N_^?N_|?N_{?N`w?F`w?Bbo?Bbo?Bb_?Rb_?Rb??rb??~~`F~~`F~~`Fo???G@??_??E????Fb|~~{?_O??
+F??S?N{F?N{F?N{F?F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F??Bf??Bf??Bf??Bf??Bn~~B~~~B~~~Bo???G@??_??
+E????Fb|~~{?_O??F??T?B}?Fv~?Fv~?F|p_@|p_@|p_@|p_@|pp@|pp@xop@xop@xoz@xoz@xoz@poZ@poZ@po^@poM@poM@po?@po?@po?@po?@po?@po?@v~?Fv~?
+Fv~?Fo???G@??_??E????Fb|~~{?_O??F??T?F~oF~~oF~~oFza@?za@?za@?zaB?raB?raB?raF?raF?raF?raE?raM?raM?raK?ra[?ra[?ra[?raW?raW?raw?rao
+?rao?rao?~~`?~~`?~~@?o???G@??_??Q????Fb|~~{?_O??F??P?N?^?Np~?Nz~?@zo??z_??~_?O^??O^??O^??O^??O^??O^??O^??O^??O^??O^??O^??O^??O^?
+?O^??O^??O^??O~_?Oz_?@zo?Nz~?Np~?N?^?????G@??_??E????Fb|~~{?_O??F??S?N|~?N~~?^~~?rb??ra?@r_?@r_?Bb_?Bb_?Bb_?Bb_?Bb_?@ra?@rb??~b~
+?~b~?^`~?B_??B_??B_??B_??B_??B_??B_??B_??N{@?N{@?N{@?????G@??_??E????Fb|~~{?_O??F??U?N{^?N|~?N~~?Bbo?Rb??Rb??ra??ra??ra??rb??rb?
+?Rbo?^b~?N`~?Nb~?Bbw?Bb_?Rb_?Rb??Rb??Rb??Rb??Rb?MRb?MRb?N~~@N~}@F~{@Bo???G@??_??K????Fb|~~{?_O??F??R?MB^?^b~?^r~?Vzw?P~_?O~_?O^?
+?O^??O{???{??Bw??Nw@?No^?NB~?GB~?OBw?oB??oA?@oA?@o??@o[?@o[?@o]?@o~?@r~o?~~~?^~~?N[~?????G@??_??E????Fb|~~{?_O??F??T?N~~F~~~F~~~
+Fo[MF?[MF?[MF?[MF??M???M???M???M???M???M???M???M???M???M???M???M???M???M???M???M???M???M?MB~?MB~?MB~?????G@??_???????Fb|~~{?_O??
+F??V?N~@^~~@^~~@^r_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bf_?Bv_?B~A?@~Bb@}B~?{B~?O@~?????G@??_??
+E????Fb|~~{?_O??F??T?N~_F~~_F~~_Fra??ra??ra??ra??vB??VB??VB??VB??^B_?]B_?MB_?MB_?MB_?K@p?K@p?K@p?K@p?G?p?G?z?G?z?G?z???Z???^???^
+???M?????G@??_??E????Fb|~~{?_O??F??T?F~?Fv~?Fv~?Fow?B_w?B_w?B`o?@po?@po?@po?@po?@po^@po^@xoz@xoz@x_z?x_z?x_z?x_p?zap?zap?zap?zap
+?zAp?ZA_?^B_?^B_?VB??O???G@??_??E????Fb|~~{?_O??F??T?Nzx@~zx@~zx@vB_?NB_?M@o?M@p?K?x?K?z?G?^?G?^???N???N???M???N???^?G?^?G?z?K@x
+?K@p?MBo?MB_?FB_?VB??Vb??~~pF~~pF~~pFo???G@??_??E????Fb|~~{?_O??F??T?N~_F~~_F~~_Fra??vb??vB??^B_?]B_?MB_?K@p?K@p?G?z?G?z?G?~???^
+???^???M???M???M???M???M???M???M???M???M?K@~?K@~?K@~?????G@??_??K????Fb|~~{?_O??F??R?Nz~@~z~@~z~@oz?@oz??oz_?Ozo?OBo??@w??@{???{
+???]???^???N?G?F?K?F?K?B?M?@?N?@?N???F_?@vo?@ro?@pw?@p{?@~~~@~~~@~~~@o???G@??_??Q????Bb}~~{?_O??D??S?NoN?Nw^?Nx~?@x{?@zw??Bo??B_
+?GB~?NB~?Nr~?Nz`?B~_??~_??^_??^_??~o?B~{?Nz~B~r~B~BNBo???G@??_???????Fb|~~{?_O??F??T?F{??F{??F{??F???F???F???F???F???FB}?NB~?~B~
+@~BF@~?@B~??B~??Ff??Ff??FF??FF??FF??FN??Fn??Fn?@B~A@B~BF@~B~?~B~?VB}?????G@??_??Q????Bb}~~{?_O??D??Q?KB~?NB~?^b~?^r_?Rz_?Pw???{?
+??{???[???[???[???[???{???{??@y??rz??~r_?~b~?^B~?K@~?????G@??_??K????Fb|~~{?_O??F??T??B{?OB{?OB{?OB??OB??OB??OB??OB??]BN?^B~?^b~
+?Vr{?Rzo?Pz_?O~_?O~??O^??O^??O^??O^??O~_?O~_?Pzo?Pzw?Vr{?^r~F~b^F}BNFo???G@??_??Q????Bb}~~{?_O??D??Q?K?^?N@~?Nb~?Nrw?Rz_?Pz??O~?
+?o~??o]??~~~?~~~?~~~?o{???{??@y??rz??~r_?~b~?^B~?K@~?????G@??_??E????Fb|~~{?_O??F??R??B{?oB}@oB~@wAN@wAF@w?B?G?B?G?B?N~~?~~~?~~~
+?w?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?G?B?Nz~?Nz~?Nz~?????G@??_??E????Bb}~~{?_O??Fo?T?KBNF~B~F~b~F~b{FBro?Bro?@r_
+?@r_?@r_?Bro?Bro?N`{?N`~?No~?NoN?Bo??Bo??Nb~?Nr~@~z~Brz?Bo{?F_{?F_[?F?[?F?{?F`{?F~z_B~r~@~b~?{@~??????A?O?G???????@w~^~~?GC??@o?
+Do@~??@~??@~??@o??@o??@o??@o??@o??@o~_Bo~oNo~oNopo^o_O^o??^o??\o??\o??\o??\o??\o??\o??\o??\o??\o??\o??^~xv~~xv~~xv{???A?O?G??E??
+??@_~^~~?GC??@s?COB??OB_?oB_?oB_?oB??O????????????????B~?oB~?oB~?oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oB~~oF~
+~oF~~oC?????_C?A???o????WNv~~oA@???f??w??@o?N_?}?Bw?F???????????}B~wN~_~?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w
+?BoNN_{^~o~~B~wB????_C?A???W????]Nv~~oA@???[?@S?^o??^o??^o??[???[???[???[???[???[NwN[NwN[NwN[N?@[N_?[Fo?[Bw?[@{?{@{?{@{?{B{?{Fs?
+{F_?[N??[N?@[M?B[K?B~}K^~}K^~}K^????_C?A???o????]Nv~~oA@???[?@K?~o[?~o[?~o[???[???[???[???[???[???[???[???[???[???[???[???[???[?
+??[???[???[???[???[???[???[???[???[?~~{F~~{F~~{F????_C?A??Bg~~~~MNz~~oA@???S?@c?nw{N?N~^FoB~~r{?}Ns|?NbwM?@w]B_?]F_w?B_wM??wMB_?
+MB_w?B_wM??wMB_?MB_w?B_wM??wMB_?MB_w?B_wM?B~~^s@~~v|?^~|~OC???A?O?G????????w~n~~?GC??@O?Do@~~_B~~oN~~oNopo^o_O^o??^o??\o??\o??\o
+??\o??\o??\o??\o??\o??\o??\o??^~xv~~xv~~xv{???A?O?G??B?????w~n~~?GC??@O?CoA?BoBo^oBw~o@{{?C[o?CM_?KM_?KF??[F??[F??[F??[F??[N_?[M
+_?K]o?K{w?D{{?Fw~oBo^oA?Bo????A?O?G????????w~n~~?GC??@w?DO@~~_B~~oN~~o^opo^o?O~o??~o?@xo?@xo?@po?@po?@po?@ro?@zo?@zo?O~o_O~opo^o
+~oNo~oDo~_@o??@o??@o??@o??@o??@o??@o??B~@oB~@oB~@o????A?O?G??B?????w~n~~?GC??@w?DOB?roFo~oFw~oF{~?C}{?C]w?CNw?CNw?CFo?CFo?CFo?CF
+o?CNw?CNw?C]{?C}{?D{~?Fw~oFo~oF_roC?o?C?o?C?o?C?o?C?o?C?o?C?o?C?~@{?~@{?~@{???A?O?G??@_????w~n~~?GC??@O?DOB~{O~~~P~~~p~?Npz?Bpz?
+@oB?@oB??oB??oB??OB??OB??OB??OB??OB??OB??OB??OB~~oB~~oB~~o????A?O?G??C_????w~n~~?GC??@O?COBo~oB{~oB}~o?~}??N{??Fw??Nw?@~??B}BoB{
+^oB_~o??~?CFw?CFo?CNo?C^w?C~}?F~~oB~^oBvFo????A?O?G??@_???B?~^~~?GC??@c?CoB??OB??OB??OB??OB??OB~~oN~~oN~~oN??OB??OB??OB??OB??OB?
+?OB??OB??OB??OB??O^??O^??O^?_o^?po]?~oM?~oC?~_??????_C?A????????MNz~~oA@???S?@[?^~?F^~?F^~?F[??F[??F[??F[??F[??F[??F[??F[??F[??F
+[??F[??F[G?F[G?F{M?F{N|~wN|~oF|~????_C?A???W????MNz~~oA@???S?@S?~~C^~~C^~~C^]K?B[K?@[K?@[K?@wM??wM??wM??oFC?oFC?oFC?oFC?_Bk?_Bk?
+_Bk??@{??@{???w?????_C?A???W????MNz~~oA@???S?@S?~~C^~~C^~~C^F??FF??FF??FMG?BMG?BMGwBMH{BMH{BMHkBMHkBkJk@kJk@kJk@kJC@{NC@{NC@wM??
+????_C?A???W????MNz~~oA@???S?@S?~ncN~ncN~ncNwM??wFC?oFc?_Bk?_@{??@{???w???{??@{?_Bk?oFc?oFC?wM??{M?@~~C^~~C^~~C^????_C?A???W????
+MNz~~oA@???]?@S?~~C^~~C^~~C^[G?B[K?@[K?@wK?@wM??wM??oMC?oEC?oFC?_FK?_FK??BK??BK??Bk??@w??@w??@w???w???w???w???{???[?f_[?v_K?~_C?
+~???]???????_C?A???W????MNz~~oA@???S?@O?~n{N~n{N~n{NBk?FBm?BBn?@?N_??Fo??Bw??@{?_?{?o?[?w?K?{?CM}??M^??MN_?M~~{N~~{N~~{N????_C?A
+???o????]Nv~~oA@???[?@K?_?{?wB{?{F{?}N_?MM??FK?@Fk?BBg?BBg?B@o?F@o?F@o?F@o?F@o?F@o?F@o?F@o?F@o?FBw?FBg?BBg?BFk?BFK?@MM??}N_?{F{?
+wB{?_?{?????_C?A??@w????]Nv~~oA@???[??{?o?F??]?@{?Fw?^w@~oF^?[[@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F~^~|~~v{???A?O?G??B??
+??@w~^~~?GC??@o?CoB_FoBw^oB{~oD}}?K^w?KN_?[N_?[N??[N??[???[?_?[?_?[?o?K?o?K?w?C?{?C?}???^???NoA?FoB?BoB_?oBo?OB{??\}??^~~o^~~o^~
+~o[???A?O?G??B????@w~^~~?GC??@o?CoBoNoB{~oB}~oC}{?K]o?K]_?K]_?K?_?K?o?K?w?K?}?F?~oB?~oB?~oC?{?K?o?K?_?[?_?[???[???[N??[N_?[N_?[N
+o?L~{?N}~oF{~oB_No????A?O?G??@_???@w~^~~?GC??@o?DO??}???~???~_??z_??zoA?xoA?woB?woB_wOB_w?@ow?@ww??{w??[w??]w??Nw?B~~p~~~p~~~p{?
+w???w???w???w???w???w???~p{?~p{?~p{???A?O?G??B????@w~^~~?GC??@o?CoB{~oF{~oF{~oC[???[???[???[???[???[???[???[??B{NoB{~oB{~oD{{?K[
+o?K?_?[?_?[???[E??[N??[N_?[No?[^w?L}}?F}~oFw^oB_Fo????A?O?G??B????@w~^~~?GC??@o?Co??~oB?~oF_~oNoooNwo?L{o?K{o?K]???]???N??BNNoBv
+^oB~~oF~{?C~w?K^o?[N_?[N??[N??[N??[M??[]_?[]o?[{w?N{{?Fw~oBo^oB?No????A?O?G??B????@_~^~~?GC??@s?Co?F??B~~o^~~o^~~o[Fw?KFw?C?{???
+}???]???N???N???F_??F_??Bo??Bo??@oA?@oA?@oA??oA??oB??oB??oB??oB??OB??OB??OB??OB??OB??O??????_C?A???o????]Nv~~oA@???[?@K?o@{?{F{?
+}N{?^N?@FK?@Bg?BBg?BBg?BBg?BFK?@NM?@}N{?wB{?{F{?}N_?NM?@Bg?BBw?F@o?F@o?F@o?F@o?FBg?BFk?B^N?@}N{?{F{?o@{?????_C?A???o????]Nv~~oA@
+???[?@K?w@{?{F{?~N{?^n_@Nm?@B{?BB{?B@w?B@w?F@w?FBw?FBw?FFm?F^n_F~N{F}F{Fw@{F?G?F?G?F?G?B?K?BFm?BFn?@Fn_?Nnw?~f{?~@{?{?[?????_C?A
+??@G????ENv~~oA@???c?@C?_?K?_?K?_?K?_?K?w@{?}F{?~N{?~nk?f}K@b}K@`}K@`}K@`}K@boK?foK?~_K?~?{?}B{?wF{?_N{?_NK?_MK@b}K@b{K@b{K@b}K@
+b}K@f~K?nn{?~F{?}B{?{?{?_?K?_?K?_?K?_?K?????_C?A??@G????]Nv~~oA@???[?@C?}@{?~F{?~n{?F~_@B}?@B{?@B}?@?N_@?Nw??F{?_@{?o?{?o?[?o?K?
+o?K?o?K?o?K?o?K?????????????????????o?C?w?K?w?K?w?K?o?C?????_C?A??BW????]Nv~~oA@???[??S?B`{^Fp{^Fp{^Fp{^Fp{^Fp{^???????MFp{^B_??
+?G@??_??K????@b|~~{?_O??H??R?@r_?Rz_?V~o?V~o?V^o?V^w?F^w?F^w?F\{?F|{?F|{?Bw}?@o}???}???^???^?G?^?G?N?G?N?K?F?K?F?K?F?M?B?M?B?MBB
+?^B`?~Bp@~Bp@~`o@~`o@~`o@vpo@vro@vro@rr_?rr??O???G@??_??o????Fb|~~{?_O??B_?F?Bo}^fx{[F@w]Bo}Fo{F????_C?A??Ag????ENv~~oA@???c??o?
+??y?B{?Nw?^o?^??]?@{?Bo?F_?]??w?B_?N??{?@o?F??[?@o?F??[?Bo?N??w?B_?]?@w?N?@{?F_?{?Bo?]?Fo?}?Bo?M????_C?A??@_????ENv~~oA@???c??o?
+@o?^?B{?^_Bw?N??w?F_?{?B_?]?@o?F??[?Bo?N??w?B_?M??w?B_?M??{?Bo?F??]?@w?Fo?N_?}?@{?Bw?Fw?No?^??[?????_C?A??@G????uNv~~oA@???S?@C?
+_?K?_?K?_?K?_?K?_wK@b}K@f~K@~n{?}B{?w?{?w?{?}B{?~n{?f~K@b}K@_wK@_?K?_?K?_?K?_?K?????_C?A???o????uNv~~oA@???S?@K???{???{???{???{?
+??{???{???{???{?~~{F~~{F~~{F~~{F??{???{???{???{???{???{???{???{?????_C?A??B?????aN~~~oA@???K??_?NFz}~nz{{N@{^r{N????_C?A??BW????
+aN~~~oA@???E??W?Fb{~Nr{]????_C?A??@G????ENv~~oA@???c?@C??M?@?M?@?N?@?N?@?N_@?N_??N_??Fo??Fo??Fw??Bw??Bw??@{??@{?_@{?_?{?o?{?o?[?
+o?[?w?K?w?K?{?K?{?C?{?C?}???}???~???^???^???N_??N_??No??Fo??Fo??Bo??Bo??????_C?A??BW????MNz~~oA@???S??W?Fb{~Nr{]???????????]Nr{~
+Npw???A?O?G??K?????w~n~~?GC??@g?@o?{^fx}^bo??????????Bp}^fx}^F`wNB{^Bo???G@??_??K????Bb}~~{?_O??B??R?Nz~?~~~@~~~@~~~@o??????????
+?????N~~@~~~@~~~@~z~?o???G@??_??K????Fb|~~{?_O??F??R??@~?KB~?MB~?^Bb?~b??vr{?rz~@pz~@wzn@w~F@{}B@{]B@{[@@{[@@{[@@{[@@{]B@{}B@w~F
+?wzn?pz~?Rz~?Vp{?Na?@~Bb@}B~@{B~?oB~?????G@??_??u????@b|~~{?_O??H??L?N{^~p~~Fo[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?
+@o?F??[?@o?F??[?@o?F??[?@o?F?N{^~p~~Fo???G@??_??E????@b|~~{?_O??H??L?N{^~p~~Fo?[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[
+?@o?F??[?@o?F??[?@o?F??[?@o?FN{^~p~~Fo???G@??_??o????BB|~~{?_O??B_?F?F@w^Bw]Bo{F@p{~Nrw]????_C?A??@G????eNz~~oA@???C?@C?~~{@~~{@
+~~{@~~{@????_C?A??@G????iNv~~oA@???W?@C??M?@?N?@?No@?Nw@?N{?oB{?w@{?{?{?}?K?~_C?~o??^o??^o??~o??~_C?}?K?{?{?w@{?oB{??N{??Nw@?No@
+?N?@?M?@????_C?A??@G????iNv~~oA@???W?@C?Bo??Fo??^o??~o??~_C?}?[?{?{?w@{?_B{??N{??Nw@?No@?No@?Nw@?N{?_B{?w@{?{?{?}?[?~_C?~o??^o??
+Fo??Bo??????_C?A??@G????E?????A@???C?@C?~~{@~~{@~~{@~~{@????_C?A??@G????ENv~~oA@???c?@C?Bo??Bo??Fo??Fo??No??N_??N_??^???^???~???
+}???}???{?C?{?C?{?K?w?K?w?K?o?[?o?[?o?{?_?{?_@{??@{??@{??Bw??Bw??Fw??Fo??Fo??N_??N_??N_@?N?@?N?@?M?@?M?@????_C?A???o????ENv~~oA@
+???c?@K??N?F?NoF?NwF?B{???{???[???[???[???[???[???[???[???[???[???[?o?[?~o[?~oK?~oK?~o[?o?[???[???[???[???[???[???[???[???[???[?
+??[???{??B{??NwF?NoF?N?F????_C?A???o????ENv~~oA@???c?@K?^o??~oC?~oK?w?[?_?[???[???[???[???[???[???[???[???[???[???[??@{??N{F?NwF
+?NwF?N{F?@{???[???[???[???[???[???[???[???[???[???[?_?[?w?[?~oK?~oC?^o??????_C?A??@w????WNv~~oA@???M??s?@poNF_{]BpwFF?[[@poFF?[[
+@poFF?[[@poFF????G@??_??K????@B~~~{?_O??CO?R??K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@_K?@n~~@~~~@o????A?K?K??@_?
+???W~^~~?GC??A??Fo??o?C??K?@??B??O??w?K??M?B??B_?o??k?[??J?F??Ao@o??E?{??@_N???WBo??B@w???o]???KF_??@bo???W{???EN???@v_???Lw??B~
+^oA?~~{?_?Fo?G?@{?B??^?@o?B_?[??w?F_?M?Bw?B??~?@o?N~@~p~~o^{^o???G???o??K????BB|~~{?_O??Fo?Y?N~~@oB~~p{?w?D{?M?@}?B_?^??w?Fo?]?@
+{?F_?^?@w?Fo?]?@{?F_?^??w?Fw?M?@^?B_?Rw?wN{^?MB~NoB_?V_?w?Fo?M?@{?F_?]?@w?F_?}?@w?N_?]?Bw?F_?}?@w?N_?]?@w?Fo?]?@}?B_?Vo?~~{~?N~~
+Bo????A?E?K??C_????W~^~~?GC??AC?E_??}?KB?N{N?w?^n?N_@~?B{?F_?~??w?Nw?K?B^?A??ro?_?K}?G?BN_???rw???K^???BFo???@{????^????Fo???@{?
+???^????Fo???@{????}???BN_???rw???K{?G?B^?A??^_?_?Fo?K?@{?F_?M?F[?A?Fro??N{^??Bw@o????A?Q?K??B?????o~^~~?GC??@{?FOB~~o[?~~{~?M?@
+^?B_?^??w?F_?]?@o?N_?[?Fw?E?@}?@_?~_?O?Nw?C?B}?@?@~_?O?^w?C?F}?@?@~_?O?^w?C?F}?@?@~_?O?^w?C?F}?@??~_?O?Nw?E?B}?@_?^_?W?Fw?F??}?@
+w?F_?^??w?D{?N~~NoB~~o[?????_M_A???o????KNv~~oA@???^?@k?~~~~?N~~~oB_?^_?w?F_?M?@o?B_?[??w?F??]?@_?F_?W?@w?EB?]?@_oF_?OK?w?CB?MA@
+?oB_~oK?wN{B?MA@?oB_?OK?w?CB?M?@?oZ_?OKEw?C?@m?@??N_?O?Bw?C??}?@_?N_?W?Bw?F??}?@{?F~~~{@~~~~?Owg??@ERsxS????????????????????????
+,
+yA_??CXNRdO@????Fo???@O???@TKB?oKB?oKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????UAS??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????\@o??MwY??@vFO???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??@oC??Aw@???R?S??IGD???Y@_??j_W??AOF??BW@o??Z?_???_H??A[AO??U?g??N?I??@kAo????o??H_K???oBO??A?w??HoM???oBo??`?{??NoN???{C???
+l@????_P??@_CO??t`C??CwQ??AcC_??B@K??GOR??B[Co??U@O??IoS????DO??[@S??M?T???_D_??W@W??J?U???CDo??U@[??K?V???SE???`@_??KOW???yEO??
+b`c????Y??@uE_??y@g??DwZ??BSEo??Q`o??K?[???uFO??t`s??Aw]??@gF_??D@{??Bg^??AmFo??Ga???Jg_??B_G???~a???F?`??A[GO??saC??@ga??@_G_??
+haG??Koa??BmG_??`aK??Nwb??@uH???JaS??EGd??A?HO??lAS??LGd??BuHO??PAW??G?e??A{H_??BA[??Eof??AyHo??|a[??BGg??@mI???ma_??B?{AThYUdhT
+KB?oKB?oGA?_GA?_GA?_GA?_GA?_GDSoKB?oKB?oKBHRQr?oPs[??????GBO?_??K????BB|~~{?_O??Fo?X?N~~~oB~~~{?w?Fw?M?@w?B_?[??w?F??M?@o?F_?W?@
+w?E??]?@_oF_?WK@w?CB?M?@?oB__OK?wN{B?MB~?oB__OK?w?CB?M?@?oB_?OK?w?CB?M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??~v{??N|~??????A?
+W?K??C_????W~^~~?GC??AC?F_??}?[E?Nw^@g?^N?^?@~?Fw?N_@~?@o?^w?G?F^???@vo???[}???FN_??@bw???W^???EFo???@{????^????Fo???@{????^????
+FoB}Np{?~b{}?G?FN_A?@rw?_?\{?G?F^?A?@~_?_?^o?W?Fw?N?@{?Fw?]?N~_F?Nw~@_BwBo????A?K?K??B?????o~^~~?GC??@{?FOB~F~{^~p~~F}?@{?B_?^??
+w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Fo?MB~~oB_~~{?w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??
+w?Fo?N{^~p~~F~{^????_G?@???W????KNv~~oA@???^??w?~r~~N}?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?^{~
+~r{???A?I?G??B?????o~^~~?GC??A??C_Bo~oNo~oK?N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N???N??M
+N??^N??^N??^N??^N_?FF_?]BoB{@oBo?o????A?Q?K??B?????o~^~~?GC??@{?F_B~N~_~~r~wN}?@w?^_?]?@w?Fo?M?@]?B_?R_?w?C[?M?@B_B_?O[?wGCB?MB@
+?OB_wOC?wNC@?MBx?oB_vOK?wL{F?MANBoB_`o{?w?K^?M?@F_B_?Rw?w?D{?M?@^?B_?^_?w?Fo?M?@{?F_?]?Bw?Fo@~{~~B~~N~o~????_I?A???o????KNv~~oA@
+???^?@[?~v{?~v{?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?C?w?D_w?D_w?D_w?D_w?Dow?Dow?Cow?Cww?C{w?C~~~{~
+~~{~?????GBo?o??K????BB|~~{?_O??Fo?d?N{@?N_^~oK?~@~_?oB{?M?B?No?W?[?|_@_@oBu?E?F?NW?W?w?{o@_B_Br?E?M?NK?W@q?{O@_FGBp?E?[_NC?WBb?
+{?@_MKBo?E?woN??WF@_{?@_[EBo?E@oWN??WM?o{?@_wBBo?EB_KN??WK?X{?@_o@fo?EB?E^??WG?N{?@__?~o?EA?B~??{??F{?B~Bw^~F~{N`~{^?????G?o?o??
+K????BB|~~{?_O??Fo?\?N{@~`~~?~w^w?N_?]?Fo?B_B{??W?~??E?^o?@_Fk??WBz??E?{o?@_^K??WNb??EBoo?@_{KC?WMB@?EB_oo@_oKK?WKBF?EA?po@__K{?
+W?B^?E??v_@_?Nw?W?B{?E??~?@_?N_?W?Bw?E??{?Bo?M??~o~_?N{No?????A?Q?K??C_????W~^~~?GC??AC?F???}?C??N{N?G?FF_B_?vo?{?Fw?N??{?@w?M?@
+N?B??ro?o?K}?K?FN_B?@pw?_?[^?G?NFoA?Bp{?_?{^?G?NFoA?Bp{?_?{^?G?NFoA?Bp{?_?{]?G?FN_B?@rw?o?[{?K?B^?B_?v_?w?Fo?N??{?Fw?M?B^?A?Bp{?
+?N{N??Bw?O????A?y?G??B?????o~^~~?GC??@{?EOB~~o[?~~{^?M?@N_B_?V_?w?Fw?M?@{?B_?^?@w?Fo?]?@{?F_?^?@w?Fo?]?@{?B_?^_?w?Dw?M?@N_B_~p{?
+wN{F?M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??N{~??B~No??????_C_B??@G????ENv~~oA@???h?@o??N_@??B~BoA?@pw?
+w?L{?N?@}?Bo?N??]?B_?Vo?w?K{?K?BN_B?@rw?o?[]?G?FFoA?Bp{?_?{^?G?NFoA?Bp{?_?{^?G?NFoA?Bp{?_?{^?G?NF_A?@rw?o?[}?K?FN?B??vrow?Lw}MC@
+{@rr?N?L}_B_Bvw?_@{]??B~Bo_?}?sG???KA???F?o??BoM??B{Bo??}?[??N_F??Bw?o??{?C???A?K?K??B?????o~^~~?GC??A??F_B~~oC?~~{N?M?@FoB_?Ro?
+w?D{?M?@]?B_?^_?w?Fw?M?@}?B_?^_?w?Dw?M?@^?B_?Ro?w?C^?MB~BoB_~oK?wGCF?M?@BoB_?O{?w?C]?M?@F_B_?Pw?w?C]?M?@N_B_?Rw?w?C}?M?@NbB_?Vwo
+w?D{MN{~~Bb~N~_^??B_Bo???G@W?_??Q????@b|~~{?_O??GO?Q?MAF?^a^?Rr{?Pzo?Oz_?O^??O^??O]??O]??O]??O{??@{??Bw??Nw@?No^?Np~?NB~?KB~??B{
+?OBo?OB??oB??oA??oM??oM??oM??o]??o^??O~??P~_?V~o?NL~?KK^??????A?E?K??B?????o~^~~?GC??@{?F?B}~~{F~n~~@pzo_?[M{??F@n??@_Zo??WF{??M
+?~??B?No??oB{??K?~??B?Bo????{????N????Bo????{????N????Bo????{????N????Bo????{????N????Bo????{????N????Bo????{????N???MB~^oB_~v{?
+????_B?B???o????KNv~~oA@???_?@s?~r~}F~{~~`~_?]?@w?F??M?@o?B_?[??w?F??M?@o?B_?[??w?F??M?@o?B_?[??w?F??M?@o?B_?[??w?F??M?@o?B_?[??
+w?F??M?@o?B_?[??w?F??M?@o?B_?[??w?F_?K?BW?B??v??_?[o???NM???Fpw??NoN??Bo?o????A?K?K??@_????o~^~~?GC??A??FoB~B}@~~o~_^~?@_?~o???F
+w?C??}?@??N_?w?Bo?M??[?B_?F?@{?@_?^??G?Fo???Bu????|_???NW???Fb???@wo???]K???N@_??BoW???{E???]?o??F_K??BwB_??{?W??N?E??Bo@o??w?K?
+?M?B??B??O??o?C??K?@?????G@g@???E????BB|~~{?_O??G??k?N{N~`~{B~{N~`~{B~_?{?Fo?^??w?F??N??w?F??M?@{?L_?M?@{?L_?M?@{?L_?M?@e?\o?K?B
+e?[o?K?Be?[o?K?Bf?[o?G?FB?{W?G?FB?{W?G?FB?{W???N@`wK???N@`wK???N@`wK???N@rwK???]?roE???]?roE???]?roE??A{?V_B??A{?V_B??A{?V_B??B{
+?N?B??Bw?N?@??Bw?N?@??Bw?N?@??@o?M????@o?M????@o?M???????G?o?o??E????BB|~~{?_O??Fo?^?Nw^~@~}F~o^w?^o?[?B{?A?@v??_?{o???NE???F`o?
+?BwK???{B_??^?W??F_B??Bo?o??{?C??M?@??B_?o??w?[??J?F??AwBo??E@{??@o]???KN_??@bo???\w???B}?A??^??o?F_?]?@w?No?}?F~o^w^~{F}F{???A?
+K?K??@_????o~^~~?GC??@{?G?B~B}B~~o~_~~?@_?~_?O?Fw?M??{?F_?E?@{?@_?~????Nw???Fu???Bwo???{K???^@_??F_[??BwB???{?{??M?F??B_?o??o?K?
+?K?B??B??o??o?K??K?B??B??o??o?K??K?B??B??o??o?K??K?B??B}^o??~f{?????_A_A???o????MNz~~oA@???S?@O?~?[?~`{?Fbw?Ff_?Ff_??F???F???F??
+wF{?}F{?~F??Nf??Fv??Bv?KBv?KBv_KFv_KNnwM~N{F}MK@????_D_A???W????ENv~~oA@???_?@S?[???^o??^o??[???[???[???[???[???[???[???[???[???
+[No?[N{B{KKF{GCF{??N[??N[??][??][??][??][??][??][??][??][??N{??N{GCF{KKBKN{@KNw?????_M?@???o????MNz~~oA@???S?@??oB~o^v`wNF_]]@w?
+Bo?N??{?Bo?N??{?Bo?^?@w?Nk@{wN`o{B~?Bo???G@W?_??K????@b|~~{?_O??G??T??B??OB{?OB{?OB??OB??OB??OB??OB??OB??OB??OB??OB??]BN?^B~?Vbw
+?Rr_?Pz_?Pz??O~??O~??O~??O~??O~??O~??O~??O~??Pz??Pz_?Rro?Vrw?^b^F}BFFo???GB_?O??E????Bb}~~{?_O??D??P?K?N?N?~?F`w?Bro?@z_?@z_?O~_
+?O~??^~~?^~~?O{???{???{??@{??@w??By??Vr??^b`?N@~?K?^?????G@O?O???????@b|~~{?_O??G??O??@}?N}?|{BpwNF_?M??w?B_?M??w?B_?N{N~o~_?M??
+w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?NwN~_{???A?I?G??@_????_~n~~?GC??@{?D???_?^_zo~o~ox{^?w{]??]{??]{??]{??]{??]{??]{??{]?@{^?B{
+FoBkBo?K???K???[??B{^oBw~oN{~o[]o?[N??{F??wF??wF??wN??{]_?\{w?Nw~oF?No??????_D_A???W????ENv~~oA@???_?@W?[???^o??^o??[???[???[???
+[???[???[???[???[???[???[Nw?[N{@{MKB{KCB{G?B{G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B~}[~~}[~????_B_@????????KNv~~oA@
+???^??g?]?@{?Fo?^?@w?????????????????F??^_@}?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?N{B~oK???A?S?C??LB~~~{o~^~~?GC??A_?B???@w?N
+_?}?Bo?F??????????????????z_B}?N??{?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?MBo{N@w{F~oN{?????G@??_??E????@b|~~{?_O??
+G??T?F???F{??F{??F???F???F???F???F???F???F???F???F???FBwBvBwBvBo?VBo?F@w?F?{?F?]?F?N?N?N?N?^?N?|?N?{?F@w?FBo?FBo?FB_?VB_?VB??~~r
+F~~rFo???G?w?O???????@b|~~{?_O??G??J?F??^o@~?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?N{F~o[???A?
+c?K??@_????w~n~~?GC??@O?Go@o~K?N?F~~{r{?~{KzN?Bo_P|w?N??Bv??{??N[?@o??\o?F??@v??[??F[?@o??\o?F??@v??[??F[?@o??\o?F??@v??[??F[?@o
+??\o?F??@v??[??F[?B~xv~}@~~f^~wF????_D_A???W????MNz~~oA@???S?@W?[Nw?^~{@~}KB{KCB{G?B{G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B
+[G?B[G?B~}[~~}[~????_A_A???W????MNz~~oA@???S?@O?_@{?wF{?]M?@NK?BFG?BB_?FB_?FBo?NBo?NBo?NBo?NBo?NBo?NB_?FFg?FFG?BNK?B]M?@wF{?_@{?
+????_D_A???W????MNz~~oA@???\?@S?[No?^~{B~{KF{GCF{G?N[??N[??^[??][??][??][??][??][??][??^[??N{G?N{GCF{MKB[N{@[Nw?[???[???[???[???
+[???[???[???~o[?~o[??????G@??_??K????Bb}~~{?_O??FO?T?MAN?^A^?^bw?Rro?Rz_?Pz??P~??O~??O~??O~??O~??O~??O~??P~??Pz_?Rz_?Rro?Vrw?^b^
+?]BF?OB??OB??OB??OB??OB??OB??OB??OB{FoB{Fo????A?k?C??@_????w~n~~?GC??@O?Bo@oNn|~~vno]^@w{?@o?F??[?@o?F??[?@o?F??[?@o?F??[?B~@~{F
+????_J?@???o????MNz~~oA@???S??s?}?v}BpwN@owFB?[KBo?~?NwB~?^oBo?^?pwBF?[[@poNF`{N~o^r?o???GAo?O??E????Fb|~~{?_O??F??L?E??W?@_?E??
+[?@o?F_?^?B~F~{^[?@o?F??[?@o?F??[?@o?F??[?@oEF?W[@`oEF?W{?r_B{?F????_D_A???W????MNz~~oA@???S?@W?[G?B^~_B^~_B[G?B[G?B[G?B[G?B[G?B
+[G?B[G?B[G?B[G?B[G?B[G?B[G?B[K?B[M?B{N?BwJ{~oH{~????_C?A???W????MNz~~oA@???S?@S?~}C^~}C^]K?F[G?B[G?@[G?@wK??wK??wK??oEC?oEC?oFC?
+_BK?_BK?_B{??@{??@{???w???w???w?????_@_B???W????MNz~~oA@???S?@w?~~fNN~~xrr{ww?KNMM?@@rb_?o\o{?KB[B?B?v?o@oN_KG[@w@aE?]?Wb_F?E[w?
+o?vK?K?Lr?B?B^o?_?|{?G?F]?A?@v_???[w???BK?????A?O?G????????w~n~~?GC??@O?DoB}wr~}wr~oo?^_o?F?oOA?wo??\o??Lo??F_??F???N???N_??\oA?
+woA?wOB?o?F__?Nw_?^~wV~~wV{???A?O?G??@_????w~n~~?GC??@s?DOB~wP~~wP|wo?\o_?Lo_?Do_?F_o?B_o?B_o?B?WOB?WOB?[OA?KoA?KoA?No??Fo??Fo??
+B_??B_??B_??@_??@_??@_???o?N?oAN?OBN?OB}???{????????_M?@???W????MNz~~oA@???S?@??~N~{~prwBF_MN?W]@`wEBw?Fo?N??}B@{K@woFb_NE?]W@|w
+~v~~^o???G?g?_??K????Cb|~~{?_O??Fo?Q?K?N?N?~?F`w?B`o?@r_?@z_?Oz??Oz??Oz??O~??o~??o~??o~??o~??o~??o~??o~??o~??o~??o~??o~??o~??oz?
+?Oz??Oz??Pz_?Pr_?B`o?F`w?N?~?K?N??????A?I?G??E????@G~^~~?GC??@w?BoA??[?@}?F~?[[@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@
+o?F??[?@o?F??^|~~v{???A?I?G??B????@G~^~~?GC??@w?C_B_BoBwNo?{^??M}??E{?CFw?C^w?K^w?K^o?K^o?KMw?K?w?K?w?K?{?C?{???}???^???N???F_??
+BoA?@oB??OB_??@o??Kw??K[??KM_?F~~oF~~oF~~oC???A?I?G??B????@G~^~~?GC??@{?C_B_BoBwNo?{~??[{??]{?C]{?C}w?C]{?C?{?C?{?C?}???]???^_B?
+FoB?Bo??N???}???{?C?{?C?w?K?w?KMw?K^w?K^w?K^w?K^{?CF{?CM}??{^?BwNoB_Bo??????_A_A???W????QNv~~oA@???]?@O??F???F???F_??Fo??Fo??FW?
+?F[??FK?_FC?oFC?oF??WF??[F??KF??EF??FF??BF??@f??@v??~~{N~~{N?F???F???F???F???F???F???F???N{F?N{F????_A_A???o????QNv~~oA@???^?@G?
+FM??~N{?~F{?~B{?~?{?B???B???B???B???B???B???b@{?zB{?~F_?NN??FM?@FM?@?K?B?K?B?K?B?K?BBk?BB{?BB{?BB{?B@}?@@m?@Bn??NFo?}B{?w?{?????
+?G?g?_??K????Cb|~~{?_O??Fo?Q??@~?KB~?MBb?^B_?Vb_?Rr_?Rr_?Pw??@w???w???{E?K{~?M|~?F~o?B~_?P~_?P~??O~??o~??o~??o~??o~??oz??oz??pz?
+?pz_?Pr_?Rro?F`w?N?~?K?N??????A?I?G??C_???@G~^~~?GC??@{?C_?E??B}~oN}~oN}~oKEo?CBo??Bw??B[???K???M???F???B???B_??@o??@o???oA??oA?
+?oB??oB??OB??OB??OB??OB_?OB_?OB_?OB_?OB_?OB_?OB_?OB_?O??????_A_A???o????QNv~~oA@???^?@G?o?{?{B{?]F_?NN??FM?@Bk?@Bk?@Bk?@Fk?@Nm?@
+^m??~FC?}B{?{@{?w@{?{F{?]N{?NNo@Fn_@Bm?BB{?B@{?B@w?B@w?B@w?BB{?BBk?@Fm??^N_?}B{?w?{??????G?g?_??K????Cb|~~{?_O??Fo?Q?K?N?N?~?F`w
+?Bro?@z_?@z_?O~_?O~??O~??O~??o~??o~??o~??o~??oz_?pz_?pzo?rrw?~b^?~BN?wB@?oB??OB_?OB_?Pz_?@zo?@xw?@w{?@w]?NoN?N?B??????A?Q?K??B??
+????~^~~?GC??AG?F_??N_??_F{??K@r??B?wO??wK???MB???B_o???wK???MB_??B_w???wF???M@o??B_M???o@vwN{?N}B~?@}?Fo?N??[?Bo?F_@{??{?^_?B_N
+[??[Br??F`ww??{{E??NN@o?Bv_K??~oB_?N{?[?F}?BE@z??p_}w?{K^F_^Bn_~~?^_B~?@????_N_@??@G????ENv~~oA@???_??w?{?N{Bpw]@roFN?{{BroNN??}
+?@w?Fw?F_?N??{?@o?F??K??o?B??K??o???????????????w?Bo?^?@{?F_?????G?w?O??W?????B|~~{?_O??GO?D??w^Fp{^Fp{^Fp{MB_wMB_wMB_wMB_wM????
+???MFp{^B_????A?c?K??C_???Bg~N~~?GC??AS?FoBo?O?K~?K?BhoF??{MFw?FBfzo?o^}~oKFrL{@@or_??[K{??FBF??@oow??[KN??FB`o?B_WM??wFBoA[?o[?
+~GKB?NB@?o??oGCF?MB?FoB_w@o?[F?w?F`oK??wMF??FB`_?@wwW??MME??@r`__?[wWG?BMEB??R`_w?Cw[M??[B@o?F?w]?B_FB_?o@{W?G?F????_B_@??@_????
+ENv~~oA@???M??W?B`{~NrwoKB?wE@oMBoW???A?k?C??C_???Bg~N~~?GC??Aw?Ao??@w?Bo?N??]??[?@o?B_?M??[?@o?B??M??w?B_?E??[?@o?F??[?@o?F??[?
+@o?F??[?@o?F??[?@o?E??w?B_?M??o?F??[?B_?M?@o?F??w?B??[?B_?K?@o???GAo?O??Q????Mb{~~{?_O??J_?J??[?B_?]?@o?M?@o?F??w?B_?K?@o?E??W?B
+_?M??o?B??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?B_?M??w?B_?F??[?@w?B_?F??[??w?@o?F_?M??[?????_C_B??@G????cNv~~oA@???_?@o??E????@_
+????W????E????@_????W????E????@_????W????E????@_????W????E????@_????W???~~~~B~~~~o{?W????E????@_????W????E????@_????W????E????@_
+????W????E????@_????W????E????@_??????A?M?C??E????A_~~~~?GC???w?@_?MFr{~Nb?oKB_WF?wN@_???G?w?O??W????IB~~~{?_O??@O?D??w^Fp{M????
+?G?g?_??Q????Mb{~~{?_O??JO?O??B??K??w?B_?E??[?@o?B??M??w?@_?F??[??o?B_?M??W?@o?F??M??w?B_?F??[?@o?B_?M??W?@o?F??K??w?B_?E??[?@o?
+B??M??w?@_?F??[??o?B?????G?w?O??W????Bb}~~{?_O??D??D??w^Fp{M??????????????w^Fp{M????_B_@??@_????MNz~~oA@???\??S?B`{^Fow?????????
+????B`{^FpwWE@_[B?oM@oG?????_C_B??@G????_Nz~~oA@???K?@o?~~~~B~~~~o{??????????????????????????????????????????N~~~o~~~~{N????_B_@
+??@_????yNr~~oA@???l??[?^v{B?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?v|~?????G?w?O??E????Mb{~~{?_O??JO?F?F|~WE@_WE@_
+WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@~^o????A?M?C??C_????W~^~~?GC???w?@_?WN@oM@_[B?oK^Nr{}F????G?g?_??W????BB|~~{?_O??
+@O?M?@w]F`w^N`w]F`w???A?a?G????????W~^~~?GC??A??FO??}KKN?NzvFw?N^pz??r{]w?C^Fm??B_B_??w?w??M?M??B_B_??w?w??M?M??B_B~~~{@~~~~?]??
+B_B_??w?w??M?M??B_B_??w?w??M?M??B_B_??w?w??M?M??B_B_??w?w??M?M??B_B_??w?w??M?M??B_B}p~{?~k^~?????G@W?_???????@b|~~{?_O??G??V??Bw
+?OB~?wAN@{AB@}A@@}A?@}???M???M???M???M???M???N~~@~~~@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@~zB^~zB^o??
+?G@W?_???????@b|~~{?_O??G??V??Bw@oB~@wAN@{AB@}A@@}??@}??@}??@}??@}??@}??@}??@~~~@~~~@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??@}??
+@}??@}??@}??@}??@}??@~zf^~zf^o???GAO?o???????@b|~~{?_O??G??c??Bw_r{??Nzf^oA?B~~o?K?BN~??w?C^{?B_??~o?M??B_??w??M??B_??w??M??B_??
+w??M??B_??w??N~~~~{?~~~~~oB_??z_?M??Bm??w??Mw?B_??z_?M??Bm??w??Mw?B_??z_?M??Bm??w??Mw?B_??z_?M??Bm??w??Mw?B_??z_?M??Bm??w??Mw?B_
+??z_?NzF^~oN~k\~~?{???A?I?G??B?????W~^~~?GC???w?Bo?MF@{}Nvw~^bx{KE?oWB@_MF?WK@owB`oNF_WK????_E_@???W????CN~~~oA@???B??g?~oN~?~{B
+????_A_A??@w????ENv~~oA@???M??{?EB?{]@owB`oEB?[M?oWB@_KEFrw~^b|}Nfo[M????G?g?_???????MB}~~{?_O???_?U?N~~N~~~No???G@O@????????MB}
+~~{?_O???_?k?N~~~~~~B~~~~~~~Bo???GBw?O??]????Eb}~~{?_O??C_?P?K?z?N?~?F_}?B_{?@o{?@w[??w[??w]??{]??[M??[M??^N?O^N?W^F?G^F?M|f?Nx~
+?Bo}?????GBG?O??]????Eb}~~{?_O??C_?M?G?Nw@~oNB_{FBw]F?w?B_?N??[?@o?F??[?@p_FF?wN~_^w?O???GBG?O??]????Eb}~~{?_O??C_?L?K?Nw@~wFBoW
+F@_]E?w]~_~~?O[?@o?F??[?@p_FF?wN~?^w?O???G?w?O??Q????Fb|~~{?_O??F??J?G?B_?]?@w?B????????????????}?B{?Mw@p_Ff?]K?{?@o?F??]??w?B_F
+N?[[?xoBv?F{?V_?????_B?B??@G????YNz~~oA@???Q?A??]Nb`@~r}}o~mbr{MxgKNBm]BBozb_O[MwG?BBnB??o~oo?KF[K?@@vB?_O\wwGFb]MA@wrb_oEKwwK@p
+NNB?Mrro_@{[[G?N????_A_A??@G????YNz~~oA@???Q?@S?]No?~Nw@zk{@xkK@x{C@w{C@wK?@{M?@{M??[M??[N??]F?[]F?[MF_KMB_MNF_FNN?BFN?@????_N_@
+??@w????YNz~~oA@???Q??{?_?~_F~?{MB_[K@xoBf?M]?{w@r_FM?[{@poFB_[Nb_^}?~_?????_J?@??@G????YNz~~oA@???Q?@??]Fr{~mzfxmNf{]NpwNBo?N??
+[?@o?F_?]??w?B_?N??{?@o?????_H_@??@G????YNz~~oA@???Q??w?o?~_F~?{[BpwNf_[}?Bw@~?N{?{?FoO]BowNB_{N`o^}?~o@????_D?@??@G????iNv~~oA@
+???Y??o?_?M??w?Bo?N??{?@o?F_?^{F~o^_?N??{?@o?F??]?@w?B_?M??{BboMF?W[@xoB~?Fw?????G?w?O??u????EB|~~{?_O??BO?F?B`{^Fp{WF?oM@oM@oK?
+yA_??CXNRdO?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
+,
+sAS??CXNRdO@????Fo???@O???@TKB?oKB?pKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????OAG??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????N`c??NCW??@XE_???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??MoB??@O@???l?O??@_D??@{@O??w?S??COE??Ag@_??{_W??DWF??Ay@o??F__??GGG??BeA???Q_c??K?H???cA_??a?g??MoI??@OAo??l?k??@_K??@{B???
+w?o??COL??AQBO??|_s??BGM??AUB_??s_w??BWN??AaBo??@`???DGO??AuC???E`C??E_P??AuCO??@@G??EwQ??A{C_??}@G??DWR??AcCo??{`K??C?S??AMD???
+}@O??DoT??AeDO??A`W??EwU??BQD_??L`[??HgV????E???X@_??K_W??@?EO??X`c??K?X???YE_??N`g??DoY??BSE_??~`g??AwZ??@gEo??r@k??AO[??@{F???
+f`o??NW[??@MFO??[@s??M_\???WF_??e@w??Nw]??@cFo??x@{??Cg_??AoG???~A???EG`??BaGO??WaG??MGa??@aGo??jaK??Awc??AmH???QAS??B@AAThYUdhT
+KB?oKB?pGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBCoKBHRQr?oPs[??????G?O?_??E????KB|~~{?_O??EO?R???F?G?N?G?N?G?L?G?L?K?\?K?\?K?\?K?W?M?w?M?w
+?M?w?M?w?M?w?F@o?F@o?N@~?N@~?Nb~?Bb_?Bb_?Bb_?N~w@~~w@~~w@o????A?C?G??@_???B?~^~~?GC??@c?C_B~FoB~^oB~~o?w{??ww?Cwo?Cwo?Cwo?Cww?Cw
+w?Bw~oBw^oBw^o?w}??wo?Cwo?Kw_?Kw_?Kw_?Kw_?Kwo?Kww?F~~oF~~oB~No??????_@?A???o????oNv~~oA@???X?@C?oL{@{N{@}N{@~Nc@^N?@Nm?@Fk?@B{?@
+Bo??Bo??@o??@o??@o??@o??@o??Bo??Bo??B{?@Fk?@Nm?@^M?@~Nc?}N{?{F{?o@{??????G?O?_???????KB|~~{?_O??EO?R?N{^?N|~?N~~?Bbo?Bb_?Rb??ra?
+?ra??ra?@r_?@r_?@r_?@r_?@r_?@r_?@r_?@r_?@ra??ra??rb??rb_?Rbo?^~~?N|~?N{^??????A?C?G??@_???B?~^~~?GC??@c?CoB~~oN~~oN~~oKw_?Kw_?Kw
+_?Kw_?Kw???w???wM??wM?BwNoBwNoBwNo?wM??wM??w???w??[w??[w??[w??[w??^~~o^~~o^~~o[?????_@?A???W????oNv~~oA@???X?@K?~~{F~~{F~~{FM??F
+M??FM??FM??FM???M???MB_?MB_?}B{?}B{?}B{?MB_?MB_?M???M???M???M???M???M???~oK?~oK?~oK??????G?O?_??K????KB|~~{?_O??EO?Q?MBn?NB~?Nb~
+?Nr{?Fro?Bzo?@z_??~_??{???{???[???[???[???^}?o^}?o~}?o~_??~_?@zo?Bzo?Brw?Nr{?Nb~?NB~?MBn??????A?C?G??@_???B?~^~~?GC??@c?CoB~~O^~
+~O^~~O[ww??ww??ww??ww??ww??ww??ww?Bw~oBw~oBw~o?ww??ww??ww??ww??ww??ww??ww??ww??ww?B~~O^~~O^~~O[?????_@?A??@G????oNv~~oA@???X??{?
+~v~~^~|~o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F~^~|~~v{???A?C?G???????B?~^~~?GC??@c?D?B~{O~~{O~~{O{ww?Cw{??w}??w^??w
+N_?wF_?wBoAwBoBwBoBwFoBwFoBwNOBwN?@w]??w]??w{??w{??ww?Cww?F~{O~~{O~~{O{?????_@?A???W????oNv~~oA@???X?@K?~oK?~oK?~oK?M???M???M???
+M???M???M???M???M???M???M???M???M???M???M???M??FM??FM??FM??FM??F~~{F~~{F~~{F?????G?O?_??E????KB|~~{?_O??EO?R?B~_@v~o@v~o@trO?\rW
+?\rW?\rW?\rW?\r\?\r\?XrL?XrL?XrL?XrL?XrN?PrF?PrF?Pr??Pr??Pr??Pr??Pr??V~o@v~o@v~o@o????A?C?G??@_???B?~^~~?GC??@c?Co@~~?^~~?^~~?]w
+w?AwwOAwwOAwwOAwwoAwwo?wwo?wwo?wxo?wxo?wxo?wx_?wx_?wz_?wz_?wz??wz??wz??wy?B~}OB~}OB~{O??????_@?A???o????oNv~~oA@???X?@C?}B{?~F{?
+~n{?Fn??B}?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@@{?@B}?@B}?@Fn??~n{?~F{?}B{??????G?O?_??E????KB|~~{?_O??EO?Q?N{^
+?N|~?N~~?Bbo?Rb??Rb??ra??ra??ra??rb??rb??Rbo?^b~?N`~?N_^?B_??B_??B_??B_??B_??B_??B_??N{@?N{@?N{@??????A?C?G??B????B?~^~~?GC??@{?
+COBwNoB{^oB}~o?]{??Nw?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFo?CFpoEFpoCNzoC]~_B}~oB{^oBwNo??M???]???[???{???w???w???
+????_@?A???W????oNv~~oA@???X?@O?~o[?~p{?~r{?MF_?MN??MM??MM??MM??MM??MN??MF_?}B{?}@{?}B{?MFo?MF_?MF??MF??MF??MF?MMF?MMN?N~~CN~}CF
+~{CB?????G?O?_??K????KB|~~{?_O??EO?P?NBn?Nr~?Nz~?B~{??~o??~_??^_??{???{??B{??NwB?No^?N@~?GB~??Bw??B_?OB_?OB??O^??O^_?O~o?R~w?N~~
+?N|~?N[^??????A?C?G??@_???B?~^~~?GC??@c?CoB~~o^~~o^~~o[F@o[F@o[F@o[F@o[?@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??
+@oBo^oBo^oBo^o??????_@?A????????oNv~~oA@???X?@S?~~C^~~C^~~C^MG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?B]K?B]K?B
+{M?@{NC@wN{?oF{?_B{??????G?O?_??E????KB|~~{?_O??EO?R?N~w@~~w@~~w@pr??Rb_?Bb_?Bb_?Bb_?F@o?F@o?F@o?F@o?E?o?M?w?M?w?M?w?M?w?K?W?K?\
+?K?\?K?\?G?L?G?N?G?N???F??????A?C?G??@_???B?~^~~?GC??@c?Co@~{?\~{?\~{?[M_?KM_?KM_?KK_?C[o?C[o?C[o?C[poE[roE[roE[rOEWrOAWrOAWrOAW
+rOAWrOAWrOAWq?BWu?Bo]?Bo]?@o[???????_@?A???W????oNv~~oA@???X?@K?~no@~no@~no@[F_?[B_?wBo?w@o?o@s?o?{?_?{?_?[???[?_?[?_?{?o?{?o@s?
+w@s?wB_?wB_?[F??[F??MM??~~_F~~_F~~_F?????G?O?_??E????KB|~~{?_O??EO?R?N~w@~~w@~~w@rb_?Bb_?F@o?F@o?M?w?M?w?M?w?K?\?K?\?G?N?G?N???F
+???F???F???F???F???F???F???F?M?~?M?~?M?~??????A?C?G??B????B?~^~~?GC??@c?COB~~oF~~oF~~oCF{?CF{??F]??F^???N???F_??Fo??BoA?@oB?@oB?
+?oB_?OBo?OBo??@wo?D{o?C{o?C]o?C^o?F~~oF~~oF~~oC?????_@?A???o????YNz~~oA@???Q?@K?~?{?~`{?~b{?Ffw?Ff_??F???Fw?{F{?~F{?~f[?Nv??Bv??
+@v??Bv_?Nvw?~n{F~n{F}M[F????_@?A????????oNv~~oA@???X?@O?^o??^o??^o??[???[???[???[???[Nw?{N{@{N{B{MKF{GCF{??N[??N[??M[??M[??M[??M
+{??N{G?N{KCF{MKF{N{B{N{@[F{??????G?O?_??Q????Eb}~~{?_O??C_?O?M?~}F~{^vxwNf_^??{?@o?F??[?Bo?N?@~_NnB}}Np~}B~_Fo???G?O?_??E????KB|
+~~{?_O??EO?S??B}??B}??B}??B_??B_??B_??B_?MBn?Nb~?Nr~?Fz{?Bzw?@~o??~_??^_??^_??^_??^_??~o??~o?@zw?Fz{?Nr~B~b~B~BfBo????A?C?G??C_?
+??@g~n~~?GC??@G?C?B_B~_^~B|}^@zwB~?NwN~~~~~~~o[?Bo?Nw@zo^nb{^~_~w@{???A?C?G??@_???B?~^~~?GC??@c?CO??~?C?~oE?~oE?zoE?xoE??oA??oB~
+~oB~~oB~~oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oB}~oB}~oB}~o??????_@?A???W????YNz~~oA@???[?@K?wM{F{N{F}N{F^FoFNF_?FF??
+FF??FF??NF_?^Fo?~B{?~@{?~?{?F???N???~F{?~N{@~n{BN}?FBw?F@o?F@o?FBw?FF{?F^n?B~n{B}N{?wB{?????_@?A????????oNv~~oA@???X?@S?^o??^o??
+^o??[???[???[???[???[F{?{N{?{N{@{NK@{MC@{K?@[K?@[K?@[K?@[K?@[K?@[K?@[K?@[K?@[K?@~}[^~}[^~}[^?????G?O?_??Q????Ib|~~{?_O??E_?O?K?B
+o?N??{?B??????????B}?~wB~_M??w?B_?M??w?B_?M??w?B_?M??w?B_?N~~~~~~~{???A?C?G???????B?~^~~?GC??@c?D?@~??@~??@~??@o??@o??@o??@o??@o
+~_\o~_\o~_\o}?@o^?@oN_@oFoBoBoBoFoBoNoBoNOBo]?@o}?@o{?Dow?F~{o~~{o~~{o{?????_@?A???o????oNv~~oA@???X?@C?~oK?~oK?~oK?_?K?_?K?_?K?
+_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?~~{@~~{@~~{@?????G?O?_???????Eb}~~{?_O??C_?T?N~v?~~~@~~~@vq~@ro]
+@ro]@poM@poM@poM@poM@poM@poM@poM@poM@poM@v{}Fv{}Fv{}Fo???G?O?_???????Eb}~~{?_O??C_?T?F|~?N~~?N~~?^Br?^B`?^B??VB??VB??VB??VB??VB?
+?VB??VB??VB??VB??^~fF~~fF~~fFo???G?O?_??K????Eb}~~{?_O??C_?P?K?F?N?^?N_~?Bpw?@zo??z_??^??O^??O^??O^??O^??O~_?Oz_?@zo?Bpw?N_~?N?^
+?K?F?????G?O?_???????Eb}~~{?_O??Eo?S?F~}?N~~?^~~?~Bb@~A@@~??Bv??Bv??Bf??Bf??Bf??Bn??B~A?B~B@@~Bb@~B~?~B~?V@~?F???F???F???F???F??
+?F???N{F?N{F?N{F??????A?C?G??@_???@g~n~~?GC??@G?CoB~}?N~~_^~~o^_fo^_`o^_?oB_?OB_?OB_??B_??B_??B_??B_??B_??B_??B~NoB~NoB~No????A?
+C?G??C_???@g~n~~?GC??@G?BoBwN~w~~r{^N_{wBr_^?NwB~@~oNo@}@v_N[?|wNvr~^~{~|o{???A?C?G??@_???Bo~^~~?GC??@[?COB_??B_??B_??B_??B_??B~
+~oB~~oB~~oB_??B_??B_??B_??B_??B_??B_??B_o?F_o?F_o?F_wOF_{oF_~oB?^oA?No??????_@?A????????YNz~~oA@???Q?@S?^~o@^~o@^~o@[K?@[K?@[K?@
+[K?@[K?@[K?@[K?@[K?@[K?@[K?@[M?@{N_@{N{^{N{^wL{^????_@?A???W????YNz~~oA@???Q?@K?~~_F~~_F~~_FMM??]N??[F??[F??[F??wB_?wB_?wB_?wB_?
+o@s?o@s?o@s?_?{?_?{???[?????_@?A???W????YNz~~oA@???Q?@K?~~sF~~sF~~sFFK?@FK?@FK?@FK?@FK[@eK{?eK{?eKs?mMs?mMs?mMs?mMs?{F_?{F_?{F_?
+????_@?A???W????YNz~~oA@???Q?@K?~noB~noB~noB{B_?wBo?o@s?o?{?_?{???[?_?[?_?{?o@s?wBo?wB_?[F??~~oF~~oF~~oF????_@?A???W????YNz~~oA@
+???Z?@K?~~cF~~cF~~cFMM??[M??[F??[F??wF??wB_?wB_?oBc?oBc?o@c?_@s?_@s???{???{???{???[???[???[?_?K?f_K?v_K?~_C?~???N????????G?O?_??
+K????KB|~~{?_O??EO?P?K?F?N?^?N_~?F_{?@po?@zo??z_??z_??^??O^??O^??O^??O^??O^??O^??O^??O~_?Oz_??z_?@zo?Bpw?F_{?N_~?N?^?K?F??????A?
+C?G??E????B?~^~~?GC??@c?B_B??[?@w?Fo?^_@~oF~?\{@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??^w~~b~}No???G?O?_??K????KB|~~{?_O??EO?P?N?N
+?No~?Nx~?B~}??~o?O~_?O~_?O~??OB??OB_?OB_?OBo??Bw??@{???}???^?G?N?K?F?M?B?N_@?Nr??Rz??^~~?^~~?^~~?O????A?C?G??B????B?~^~~?GC??@c?
+COBoBoB{NoB}^o?}~??]{??]w??Kw???{???}???^_B_^oB_FoB_^o??~???{???w?C?o?CEo?CNo?CNw?CN{?C~~?B}^oB{NoBoBo??????_@?A???W????oNv~~oA@
+???X?@K??Bw??B{??Bk?_Bk?oBc?oBc?wB_?{B_?[B_?]B_?NB_?FB_?Fb_?Br_?~~{F~~{F~~{F?B_??B_??B_??B_??B_?_N{B_N{B_N{B?????G?O?_??K????KB|
+~~{?_O??EO?P?Np~?Np~?Np~?@o??@o??@o??@o??@o??@o??@o??No^?Np~?Nr~?Frw?@ro?OB_?OB??O~??O~??O~_?O~o?R~{?Nx~?No~?N?N??????A?C?G??B??
+??B?~^~~?GC??@c?COA?NoB_^oBo~oBw{O@{{??}{??]{??]???N@_B~NoB~^oB~~o?~}??^{?CNw?CNo?CNo?CNo?CMw?C]w?C}{?D{~?B{^oBwNoB_Bo??????_@?A
+???o????iNv~~oA@???Y?@C?@o??~~{@~~{@~~{@@~_?@v_??Bo??Bw??@w???{???{?_?[?_?[?_?K?o?K?o?K?o?C?o?C?w?C?w?C?w???w???w???w???w???w???
+????_@?A???o????oNv~~oA@???X?@C?w?{?}B{?~F{?Nn_?B}?@@{?@@{?@@{?@Bm??Nn_?}B{?w?{?}B{?NF_?Bm??B}?@@{?@@{?@@{?@B}?@Bm??Nn_?~F{?}B{?
+w?{??????G?O?_??K????KB|~~{?_O??EO?P?M?N?N_~?Np~?Fx{?@zw??~o??~_?O^_?O^_?O^_?O~_?P~o?Rzw?^z~?^r~?^b~?[B_?OB_?@zo?@zw?@x{?@w~?Nw^
+?NoN?N_B??????A?C?G??B????@_~^~~?GC??A??COA??oA??oA??oA??oBoFoB{^oB}~oB}}oE^woENwoEFwoENwoENwoE~?oB}?oB{FoBo^oA?~oA?}oA?{oENwoEN
+ooENooENwoE^{oE}~oB}~oB{NoBoBoA??oA??oA??o????A?C?G??I_???B?~^~~?GC???s?@o?{^Fp{[F@o]Fo{Np{M?????G?O?_??c????EB|~~{?_O??GO?J?G?F
+o?^_?~?@}?@w?Bo?N??]?@w?B_?N??{?@o?F??[?@o?F??[?@o?N??{?B_?]?@w?N??{?F_?}?Bo?]?Bo?]?@o???G?O?_??W????EB|~~{?_O??GO?J??{?Fo?}?Fo?
+}?Bo?M?@w?F??{?B_?M?@w?F??[?@o?F??[?@o?F??]?@w?F_?N??{?Bw?F_?^??}?@{?Bw?Fo?N?????G?O?_??i????IB~~~{?_O??Ao?F?Bx}^fx}]F`{Np{N????
+?G?O?_??o????IB~~~{?_O??@O?D?@{^Fp{^?????G?O?_??K????EB|~~{?_O??G??P??B??OB??OB_?OB_?OBo??Bo??@w??@w???{???{???]???]???N???N?G?F
+?G?F?K?B?K?B?M?@?M?@?N???N???F_??F_??Bo??Bo??@w??@w???{???{???[???[??????G?O?_??o????Eb}~~{?_O??C_?D?@{^Fp{^???????????^Fp{^Fo??
+?G?O?_??i????Eb}~~{?_O??E??E?Bw}Nbw}???????????]Nbw}Nb_{N`{N@o???G?O?_??K????Eb}~~{?_O??Ao?P?N~~?^~~?^~~?O???????????????????N~~
+?^~~?^~~?O????A?C?G??B????B?~^~~?GC??@c?C_A?NoB_^oBo~oBw{OD{~_C}~oE]~oM]xoNNooNNooNF_ONF_ONF_ONF_ONF_ONNooNNooM]xoE]~oC}~o@{^_Bw
+wONo~oN_~oE?^o??????_@?A??B?????WNv~~oA@???_??o?~o~~B~{N@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F?N{N
+~o~~Bo???G?O?_??E????EB|~~{?_O??G??K?N{N~o~~Bo?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??z~B~{N~o{???A?
+C?G??B????BG~n~~?GC???K?COB~~oF~~oF~~oC?????_@?A???o????{Nv~~oA@???T?@C??K?@?N?@?N_@?Nw?_B{?o@{?{?[?}?C?~_??No??Fo??No??~_??}?C?
+{?[?o@{?_B{??Nw??N_@?N?@?K?@?????G?O?_??K????NB|~~{?_O??DO?P??[??@{??B{??Nw??N_B?N?F?K?^???~??B}??Bw?OBo?OBw?OB}???~?K?^?N?F?N_B
+?Nw??B{??@{???[???????A?C?G??B?????o?????GC???K?COB~~oF~~oF~~oC?????_@?A???o????WNv~~oA@???_?@C?@o??@o??Bo??Bo??F_??F_??N???N???
+]???]???{???{???w?C?w?C?o?K?o?K?_?[?_?[???{???{??@w??@w??Bo??Bo??F_??F_??N???N???M?@?M?@?K?@?K?@????_@?A??@_????iNv~~oA@???K??s?
+@_oNF_{]BpwNF_{]BpwNF_{]BpwFF?[[????_J_A???W????iNv~~oA@???Y?@g??B????@w????]????F_???B{????~????No???Bm?O??x_C??MW@??BB?o??ooK?
+?KKB?GA@@oA?_O[?_GCF?K??BoB?~o{?oN{N?E??F_@_?@w?W??]?F??N?@w?Bo?~wF~?~}@~oK???A?a?G??@_???Ag~^~~?GC??@g?DoB~~oF~~o^o??~o?@zo?Bro
+?Bro?Bro?Bro?Bro?@zo??~o~o^o~o^o_?~o?@zo?Bro?Fbo?Fbo?Fbo?Fbo?Fbo?Bro?Bro?@~~~o~~~oK???A?g?G??B????Ag~^~~?GC??@g?Do??~eA?~u^_@v~o
+?Vpw?F_{?F_{?F?]?F?]?E?N?E?N???N???N???N???N???N???N?E?]?E?]?E?{?F?{?B@w?Bbo?Pr_@o}?~o[?~_C???A?m?G??@_???Ag~^~~?GC??@g?EOB~~oC?
+~~{F?N??BoBo?@o?{??w?N??[?Bo?F??{?Bo?N??w?Bo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Fo?M?@{?B_?^??w?Bo?M??{?Bo?N??[?Bo?B_?{??{?N??FoB~~o[?
+~~{@?????G@o?_??E????Ib|~~{?_O??E_?V?N~~F~~~F~??Fn??FN??EN??MN??KNB?KNB?KNB??NB_?NB~?NB~?NB_?NB??NB??NB?WN??WN??KN??KN??KN??MN??
+MN??Fn~~F~~~Fo???G@W?_??E????Ib|~~{?_O??E_?T?N~~B~~~B~??B~??Bn??BN??FN??EN??EN@_EN@_?N@_?N@o?N@~?N@~?N@o?N@_?N@_?N@_?N???N???N??
+?N???N???N???N{^?N{^?????G@O?O??E????Ib|~~{?_O??E_?K?N{N~o~o?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N{N~o{???A?
+O?G??@_???Ag~^~~?GC??@g?D?B~FoB~FoBo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??ro??ro??ro??zo??zo??Zo??^oo?^~~o^~
+~o[???A?Q?K??@_???Ag~^~~?GC??@g?G?B~?WB~~oN?~~?Bo?~o?{?Nk?\_Bz?FW?}o@u?NK?{oBr?NK?{oBr?NK@wWBr?]E?{oF`_NKBoKBr?{B?{oN?oNKF_EBr@w
+@_{o]?WNKN?BBrBo?o{o{?KNKM?@Bvb_?O~~w~F~~{No~o???GAw?_??E????Ib|~~{?_O??E_?Y?N{?~oN~?^{B{?Lw?N?BK?Bo@r??k?{o?B?NK??oFr??KBwo?B?}
+K??o^B??KN_o?BBwK??o{BC?KM?p?BB_Ko?ooB[?KG?v?BA?No?o?B{?K??~?B??N_?o?Bo?]??{?N{BM?B~?r??????_L?A???o????iNv~~oA@???Y?@c??Nw??GB~
+?oB__o{?{??]?F_?N??{?F_?F?@o?@w?{??M?M??BoB_?O{?w?CN?M?@BoB_?O{?w?CN?M?@BoB_?O{?w?C]?N??F_Bo?@o?[??{?F_?]??{?N??F_B__o{?_N{B??B}
+??????A?g?G??@_???Ag~^~~?GC??@g?E_B~^o??~~{B?NA?@oBo??{?{??M?N??F_Bo?@w?{??]?N??F_Bo??w?{??N?NA?@oBo~oK?{N{B?NB?@oBo_?{?{??N?N??
+BoBo??{?{??N?N??BoBo??{?{??N?~??foN~B~wB~o~w?O???GBw?O??K????Ib|~~{?_O??E_?O?N@b~E{]^_xw@v?F[?\_@u?N?B{?~_F}B~o~{F}?^oB{?N??{?N_
+?}?Fw?^oBv?~NNk~wo{???A?g?G??@_???Ag~^~~?GC??@g?EOB}~~{?~n~~?@xw{??E]K??@fb???\wo?CB]G?@?va??OLw_?C?]????F_???@w????]????F_???@w
+????]????F_???@w????]????F_???@w????]????F_???@w??B?~o{?oN{N?????GAw?_??E????Ib|~~{?_O??E_?Y?N{B~?N~?~oB}?@o?N??K?Bo?B??{?Cw?M?@
+E?B_?P_?o?KK?K?BB?B??oo?_?[E?G?F@_A?@oW???{B???N?o??foK??Hw@??A]?O??~????No???B{????]????F_???@w????K???????_I_B???W????iNv~~oA@
+???Y?AO?~}N~}?~~w~~wBv_?F{?B]??]o?Fo?@z??N??Fk??{??~o?B_?R|_?M?@Nu??wGDxW?B__Vdo?KAB]R??oKNoK?B?o~?o?GBF{@_?_M^oEOA?X}?X??@nw?s?
+?E~_BO??N{?N???}o?[??Bz?@o??Fg?F???]_?[??@q??o??B??B?????GAw?_??E????Ib|~~{?_O??E_?Y?N}F~oB~`~{?{?C^?M?BB_B??o[?o?[B?GAF?O??roC?
+?L{???B}????^_???Fo???@w????}????No???Bm?O??x_K??K[B??BB@oA?_O{?o?CN?K??FoB_?@w?}??}?N}B~oN~_~{BsAS??CXNRdO?????????????????????
+,
+lAW??CXNRdO@????Fo???@O???@TKB?oKB?pKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????HAK??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????M`g??BSX???|Eo???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??K?B???e@???V_O??KOC??B{@???Q?S??H?D??Bu@O??O_W??HoE???A@o??R_[??IWF??Bm@o??H__??GOG??BaA???E_c??DGH??AWAO??w?c??A_I??A?A_??
+q?g??AWJ??@mAo??l_k??NwJ??@EB???b_o??LWK???]BO??S?s??FOL??BWBO??N?w??E?M??@{B_??v_w???wN??@KBo??a_{??IwN???SC???]`???M?O??@_CO??
+b`C??IoP??BYCO??]`G??AGR??BACo??W`O???GT??BCDO??X@W??AWV??BmDo??[`_??@GX??BYEO??f@g??NOY??@uEo??r`k??AW[??ACF????@s??GG\??B]FO??
+N@w??Jw]???UFo??Z`{??MO^???eG???YA???Jw_???UGO??bAC???ga??@cG_??waG??Dwb??B[Go??jaO??Koc???qHO??XAS??Kgd???oH_??YaW??B?{AThYUdhT
+KB?oKB?pGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBCoKBHRQr?oPs[??????GBG?O??K????Hb}~~{?_O??C??O?Nw@~o]NBo{N@_w?B~_N~?{]B_{M@owFr_^Nb{~}^~o{
+????_N_@???W????iNv~~oA@???Y?@G?No??No??M???M???M???M???M???M???M???M???MB{?}F{?}N??]M?@MK?@MG?BMG?BMG?BMG?BMG?BMG?BMK?@]M?@}N??
+uF{?e@{?????_H_@???W????eNz~~oA@???O??w?w@~wNro{FboME?[?@o?F??[?@o?N??w?Fb@{MN_^w?[???A?}?C??@_???Ag~^~~?GC??@g?C_??^_??^_??[???
+[???[???[???[???[???[???[?Bo\oBw^o?{^??]]??M[??F[??F[??F[??F[??F[??F[??M[??]]??{^?Bw~oNo{oK???A?e?C??@_???AW~n~~?GC??@??B_B_@~_N
+N@wMM?ww~r~~No[?@o?F??{?B_?]KFow}@~_@o???G?_?O???????Ib|~~{?_O??E_?M???^oB~_N^?{[Bpo?F??[?@o?F??~oN~?v??[?@o?F??[?@o?F??[?@o?F??
+[?@o?NwF~_[???A?q?C??@_???AW~n~~?GC??@_?C?Bo}~b~FMwMF?w[B`oMF?w[F?z{@~wBB_?M?Nw^~B~}^o~w@~?Fw?^_B~?}^No~{?{???A?}?C??@_???Ag~^~~
+?GC??@g?C_?~???~???w???w???w???w???w???w???w???w???wFoBwNoBw]?@w[??w[??w[??w[??w[??w[??w[??w[??w[??w[??w[?B~}ON~}OK???A?A?C?????
+??Ag~^~~?GC??@g?AO?{?Bo?N??{?????????????????B{?No?w?B_?M??w?B_?M??w?B_?M??w?B_?M?B~?^{@????_A?@??Aw~~~~iNv~~oA@???`??k?_?]?@w?F
+_?[???????????????B_@}?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[E@w{FroN~?^w?????_M?@???W????iNv~~oA@???Y?@G?No??No??M???M???
+M???M???M???M???M???M???MNw@MNw@MBw?M?w?M?[?m?K?}?K?}?[?]?{?M?{?M@w?MBo?MBo?MF_?~~oB~~oB????_?_@????????iNv~~oA@???Y??c?No?~?B_?
+M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?~oF~?O???G???o??E????Hb}~~{?_O??C??\?B{~~?B~^~{@}NBB?vb__OKwwG?BMMA??rb_
+_?KwwG?BMMA??rb__?KwwG?BMMA??rb__?KwwG?B~~ffF~~xxp{???A?}?C??@_???AW~n~~?GC??@??C_?~FoB~NoBw]?@w[??w[??w[??w[??w[??w[??w[??w[??w
+[??w[??w[?B~}ON~}OK???A?q?C??@_???AW~n~~?GC??@??C?B_@~_^FB_M[?X_@}?Fw?^_@}?Fw?^_Bf?M[Bo{}@~_@o???GBw?O??E????Hb}~~{?_O??Do?Q?B{~
+?N|~?Nbo?Fb_?Rb??Rb??ra??ra??ra??ra??rb??rb??Vb_?^bw?N`~?J_^?B_??B_??B_??B_??B_??N{@?N{@??????A?w?C??@_???AW~n~~?GC??@[?C_B_WoBw
+Zo@{^??]]??M[??N[??F[??F[??F[??F[??N[??M[??]]??{^_Bw^oBo[o??[???[???[???[???[???~_K?~_K?????_E_@???W????eNz~~oA@???O??o?no^~B~_M
+]?xw?B_?M??w?B_?M??w?B_?M??w?N{B~oK???A?Y?C??@_???AW~n~~?GC??@??B?B{@~wFBo[F@_[EBoB~?^wB}?]?BoKN@owFB_{N~o^z?O???G@g?O??E????NB|
+~~{?_O??Do?J?B??K??o?B??M??w?Bo?~oN~?r_?M??w?B_?M??w?B_?M?Ww@b_EM?Xw@~?Bw?C???A?}?C??@_???AW~n~~?GC??@??C_?~^_?~^_?w[??w[??w[??w
+[??w[??w[??w[??w[??w[??w[??w]?@w^?Bo~oN_|oK???A?w?C??@_???AW~n~~?GC??@??COB~~?F~~?C{[??wK??wK?@oE?@oE?@oF?B_B?B_B?B_BoB?@oB?@oA?
+?oA??oA??o????A?g?G??@_???AW~n~~?GC??@??EOB~~Nc@~~rx?Rpw[??w^B??MEoo?BbkK?@oz@_?[KWW?FBEEOB_p_s?wGKL?MABBoB__o{?o?CF?K?@@oB??O[?
+????_M?@????????eNz~~oA@???O?@K?~n_B~n_B{F_?wB_?o@s?o?s?_?[???[???{?_?{?o@s?wB_?WB_?]F??~~_F~~_F????_M?@???W????eNz~~oA@???V?@C?
+~~o@~~o@NF??MB??MB??[@_?[@_?[@o?w?o?w?o?w?{?o?[?o?[?_?K?_?K?_?K?_?C?_?C?`_C?ro??wo??^o??F_???????GBG?O??K????Lb|~~{?_O??E??M?M?@
+}?[[B_oKB`oEE?[w@r_FM?[w@r_FM?[w@r_FM?[w@r_FM?WWB`oMF@oM}?^_?O???GBG?O??Q????Lb|~~{?_O??E??K?K??w?B~?N{?w?B_?M??w?B_?M??w?B_?M??
+w?B_?M??w?B_?M??w?B_?M??~o~~Bo???GBG?O??K????Lb|~~{?_O??E??M?N_B~?}MFo{]Fro^N@{wBb_?N??{?@o?F_?N??]??{?@w?@oKB_oFB?MEN{^~p~~Fo??
+?GBG?O??K????Lb|~~{?_O??E??M??w[~`~}B~wF@_?E??W?@_?E?NWB~_{]Fow]?Bo?N??{BboNN?{{BroFF_wN~?^w?O???GBG?O??K????Lb|~~{?_O??E??M?K?N
+{@|wFbo]F@wMF_w?@_AF?^[F~o{^F?{[Br_FM?[w@r_FM?wwBb_MFBoM}?^o?o???GBG?O??K????Lb|~~{?_O??E??M?N?B}?[{Bpw]B`oMF@w[F`x}BnoN~?NwB~o^
+f`{MNo{{@roFM?[wBr_MFBw]~?~o?o???GBG?O??K????Lb|~~{?_O??E??M?N?B}?[[B_w[BpoFE?[w@r_FM?[w@roMN?w}~B~wMu?w?B_?F@w[F_w]BxwF~?Nw????
+?G?G?O??Q????Ib|~~{?_O??E_?C??{NBo{NBo{NBo{E@_WE@_WE@_?????NBo{N????_?_@??@G????iNv~~oA@???J??S?Bp{^Fp_WF?oM@oK?????_E_@???o????
+]Nv~~oA@???e??g?_?N??]??w?@o?B_?M??[?@o?B_?M??w?@_?F??[?@o?F??[?@o?F??[?@o?F??[?@o?E??w?B_?M?@o?F??w?B_?[?B_?M??o?E??o???G@g?O??
+K????Fb|~~{?_O??H_?I??[?B_?[?@o?M?@o?F??w?B_?K?@o?F??W?@_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?F??[?@o?F_?M??[?@o?B_?F??[??w?@o????A?
+A?C??C_???Aw~~~~?GC???k?@??FBo{NB?oKB_WF?o????A?A?C??C_???Aw~~~~?GC???O?@??NBo{N????_K_@???o????]Nv~~oA@???d??w??B??M??w?@_?F??[
+??o?B_?M??W?@o?F??M??w?B_?F??[?@o?B_?M??W?@o?F??K??w?B_?E??[?@o?B??M??w?@_?F??[??o????A?A?C??C_???AW~n~~?GC??@[?@??NBo{N????????
+???FBo{NB?oKB_WF?o????A?A?C??C_???@w~^~~?GC??AS?@o@~^oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?v|~?????G?G?O???????Fb|~~{?_O??
+HO?F?F|~WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_^v{?????_?_@???o????iNv~~oA@???J??S?E@oM@_[B?p{^Fpw?????_@?A????????iNv~~oA@
+???Y?@_??Fx}_N~~wNNrwNBp{NBo[M??[M??[M??[M??[M??~~{N~~{N[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??~n?N~n?N????_N_@????????
+iNv~~oA@???Y?@K??Fw?_F{?wNK?wN??{N??[N??[???[???[???[???~~{?~~{?[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??~n?F~n?F????_N_@
+????????iNv~~oA@???Y?@K??Nw?_N{?wNK?wN??{N??[M??[M??[M??[M??[M??~~{?~~{?[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??[M??~ncF~ncF
+????_??B????????iNv~~oA@???Y?@w??Fzw?WB~~_N_ww{FwMAB@~B__o\owGCF[K?@?FB??O@oo?C?[K?@?N~~~o^~~~{F[K?@@vB??O\oo?CF[K?@@vB??O\oo?CF
+[K?@@vB??O\oo?CF[K?@@vB??O\oo?CF~nFFN~zppr{???A?q?C??@_???Ag~^~~?GC???k?B?AN@x{Nfo}^Bp_KE?o[B_oEB_]F?wK@????_B_@????????ON~~~oA@
+???B??g?~oN~?~{B????_K_@??@w????iNv~~oA@???J??o?E?o[B_wF@_MF?wK@_oE^Bx{Nfo{]Bo???G@G?o??K????Mb{~~{?_O??G_?\?N~~FoB~~v{?w?Fo?]?@
+w?N_?[?Fw?E?@}?@_?~_?W?Nw?E?B}?@_?~_?W?Nw?E?@}?@o?^_?]?Bw?Fo?]B~~oB_~v{?w?Fw?]?@w?N_?[?Fw?E?B}?@??~_?O?^w?C?F}?@?@~_?O?^w?C?F}?@
+?@~_?W?Nw?F?B}?@o?^_?^?B~~~~?N~~No????A?Q?K??C_???BO~N~~?GC??AO?F???{?{K?Nw~B??~]?z?B}?Mw?N?B~?@_?~w?G?N}???Bvo???{{???MN_??Bbw?
+??w}???KFo??B@{???o^????Fo???@{????^????Fo???@{????^????Fo??BBw???o}???KN_??BFo???x{???E}???@~_???No?W?Bw?N??[?Nw???Nv_??Nw~??Bo
+Bo????A?E?K??B????Bg~N~~?GC??AG?FOB~~~{B~~~~?}?@{?N_?[?Bw?E??}?@??N_?O?Fw?C?@}?@??Z_?OWEw?CE@m?@@_Z_?OW?w?CF?MA@@oB_~o[?wN{F?MA@
+@oB_?O[?w?CE?M?@@_B_?OWWw?CEEM?@?@b_?O?Kw?C?BM?@??r_?O?Kw?C?Bm?@??~_?W?Nw?F_@~~~~o^~~~{F????_??B???o????yNr~~oA@???a?@k?~~~~?~~~
+~oN_?^?Bw?F??}?@_?N_?O?Bw?C?@}?@??^_?O?Ew?C?@m?@@_Z_?OWEw?CE?M?@@_B_?O[?wGCF?MB~@oB_~o[?wGCF?M?@@oB_?OW?w?CE?M?@@_B_?OW?w?C??M?@
+??B_?O??w?C??M?@??B_?O??w?C??M?@??B~^o??~v{??????G@w?o??K????Mb{~~{?_O??G_?_?N{~~N~~N~r~w?E?@}?@_?^_?W?Fw?E?@}?@_?^_?W?Fw?E?@}?@
+_?^_?W?Fw?E?@}?@_?^_?W?Fw?E?@}B~~o^_~~{Fw?E?@}?@_?^_?W?Fw?E?@}?@_?^_?W?Fw?E?@}?@_?^_?W?Fw?E?@}?@_?^_?W?Fw?E?@}?@_?^_?W?F~r~{~~{~
+~N{???A?c?K??B????Bg~N~~?GC??AG?GOB~N}B~?N{~wN{?w?F?FoB_?W?F?M?@o?K?w?F_?OB_?]???M?@[???w?Cw??B_?Po??M?@B_??w?CF??B__OK??MB@?o??
+wMCB??B_{O[??MAxBo??wJsN??B_Fp{??M?NF_??w?[}??B_?vo??M?@]???w?Fw??B_?^?@?M?@{?C?w?F_?oB_?[?F?M?@o?[?w?E?BoB_?W?N?M?@_B{?~r~_~oF~
+N}B~?O???GBO?_??K????Mb{~~{?_O??G_?X?N|~??B~^o??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??
+w?C??M?@??B_?O??w?C??M?@_?F_?W?@w?E??]?@_?F_?[?@w?F??]?@o?B_?]??w?F_?M?@{?B_?^o?~~~~?N~~~o????A?M?O??B????Bg~N~~?GC??AG?I?B~?oB?
+~~{F?MB~w?[?w?^_@oB_@u?N?J?FW?{?k?\_BoAo@u?]?H_FW@w?e?\_F_AW@u?{?GoFWBo?b?\_N?AK@u@w?GWFWF_?`_\_]?AE@uBo?GKFWN??_o\_wGE@@uB__WCF
+WMA@_O\_oKM?@uB?ow?FWKBB_?\__E]?@uA?Xw?FWG@f_?\_?B}?@u??Nw?FW??~_?\_?@y?@~_@Fg?F~o{]~N~~Bor{~o???G@_?o??K????Mb{~~{?_O??Go?`?N~~
+@o??~~{^??B_?Vo??M?@{???w?F_?OB_?]?B?M?@o?[?w?F?@oB_?[?F?M?@o?[?w?F?@oB_?[?F?M?@w?K?w?F_?OB_?^???M?@^???wN{^??B_~o{??M?@Fo??w?C{
+??B_?V_??M?@]???w?Fo??B_?^???M?@{???w?Fo?OB_?^?@?M?@{?C?w?Fo?OB_?^A@?]?@{GK@w?F_ooF~N}Bf?N{~oN{?????^o??????_G_A??@G????sNr~~oA@
+???c?@O?w?{E{F{E]N_FFM?FBk?FBg?F@o?F@o?F@o?E@o?EBo?EBo??Fo??N_??~_??~?{?}F{?{N{@oN{B?NwB?M?F?G?F?G?N???N???N?o?M?o?M?o?M@o?M@o?N
+Bo?FFw?FNw?B~}?@w~{?_r{?????_C_B???o????yNr~~oA@???a?@w?~n~~F~z~~p{}w?C^Bm?@F?Z_?P_Ew?CW@}?@M?N_?R?Bw?Co?}?@K?N_?R?Bw?Co?M?@??B_
+?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?OB?~~{?oN~~?????G@w?o??E????Mb{
+~~{?_O??Go?a?N{N?N{B~o{?~oNo?O@{?N?@?B_?w?C?E?B_?O?W?K?B??o?o?K?B?B??o?K?G?F??W?_?[?@_A?Bo?F???N??K???{??o??Fw?B???]_?C??@y??O??
+NK?????{o????Br?????]E????@wW????N`o????{B????BoK????N?x????w@c???B_EO???K?N????o?{???B?Bo???G?F????_?[???A?@o?????B????????_F_B
+???W????yNr~~oA@???a?AG?~`~_~oB}F}B~?M?Fo?{?o?]?@oA?@w?B???No?C??@~?????Fe?????}[????Foo????]@_???BwF????N?L????w?[???B_@o???K?F
+????_?[???B?Bo???K?^????w@w???@oN_???B@{????MF_????W}?????ro?O??Bm?@???Ew?K???N?@oA??w?F?K?@_?{?w?C?BoBo?w?~?N{FwN{B~o^_~oK???A?
+O?G??B?????_~n~~?GC??@S?DOBwBoB{No?{^??{{??{{???w???w???{?B?~oBw~oB{w??}w??^w??^w??Nw@_Nw@_N{@_^}@_}~@v{ro~wooK?????_G_A???W????
+sNr~~oA@???b?@[?[???^o??^o??]???[???[???[???[???[???[???[???[???[???[???[NoB[N{F{G[N{?C]{??{[??{[?@w[?@w[?@w[?@w[?@w[?@w[?@w[?@w
+[??{[??{{??}{?C^{G[NKN{FKNo@?????G?O?_??K????AB}~~{?_O??DO?Q?K@~?NB~?^b_?Vr_?Rr_?Pw??@w???{???{???{???{???{???{???{??@w??@w??rq?
+?vq??^b`?^B~?K?~??????A?C?G??@_????_~n~~?GC??@S?CoA?NoB_~oBw{?D{o?K{_?K]_?[]_?^~~o^~~o[N???N???N???N???N???]???]??W{??\{_?NooON_
+~oA?No??????_E_@????????sNr~~oA@???b?@???Fo?~wBvoNN?{]??w?B_?M??w?B_?M??w?B_?N{^~p~_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??
+~`~}Fo???G@??_??E?????b}~~{?_O??GO?T????B{B^F}B~F^BwFFbo?Br_?Rr_?Rr_?Rr_?Rr_?Rr_?Rr_?Vbo?N`w?N_~?L_^?@_??@_??B_??Nb~?NB~?~r~Bry?
+Bow?F_{?F_[?F?[?F?[?F?{?F`w?B~r_@~b~?{@~??????A?a?G??@_???BO~N~~?GC??AK?E?@o??@~??@~??@w??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o
+??@o~?Do~o^o`o^o?O~o??zo??xo??xo??xo??xo??xo??xo??xo??xo??xo??xo??xo??xo??xo??z~x~~~x~{?????_D?@???W????yNr~~oA@???a??g?]?@{?Fo?
+^?@w??????????????????????@o?F{?^o@w?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?N{B~oK???A?S?C??@_???BO~N~~?GC??AK?Ao@o?F{?^o@w?F??
+[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?B~@~{F????_L_B???W????GNz~~oA@???T?A[?[NoB~o@~~{~~?~{F
+z{CB}?D}_?^o?Bo?@~??N??F[??[??\o?@o?@v??F??F[??[??\o?@o?@v??F??F[??[??\o?@o?@v??F??F[??[??\o?@o?@v??F??F[??[??^~p~~p^~~F~~D~????
+?GAG?_??E????AB}~~{?_O??DO?W?FB{?V~~@~}F@~_@B~??Bn??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bf??Bn~f~~~f~o????A?O?G??@_?
+???_~n~~?GC??@S?DOA?NoB_~oBow?Cw_?K[??[]??{M??wN?@wN?@wN?@wN?@wN?@wN?@wN?@wM??w]??{[??[w_?Now?F_~oA?No??????_G_A???W????GNz~~oA@
+???^?@[?[NoB^~{F~w[N{?C^{??}[??{[?@{[?@w[?@w[?@w[?@w[?@w[?@w[?@{[??{[??{{??}{?C^{G[N[N{F[No@[???[???[???[???[???[???[???[???~o[?
+~o[??????GBG?O??E????AB}~~{?_O??DO?O?F@}^~~~|~bp{NBo?N??[?@o?F??[?@o?F??[?@o?F??[?@o?F??~o~~Bo???GBG?O??K????AB}~~{?_O??DO?M?N_Z
+~@{]F_{[@p_FE?{WFoB}?^wF}?~?Fo?}?roBM?[w@r_NN@{]~o~r@o???GBG?O??E????BB|~~{?_O??Fo?M?E??W?@_?E??W?@o?F??[?@w?Fo?~p~~Fv??[?@o?F??
+[?@o?F??[?@o?F??[B@oKF?o[B@oKN?ww@r_F{?F????_F?A???W????GNz~~oA@???T?@[?~{L~~{L~]??^[??M[??Fw??Bw??Bw??BoGC@oGC@oKK@_KK?_KK??E[?
+?E[??E[??Bw??Bw??Bw??@o??@o??????G@o?_??E????AB}~~{?_O??Fo?V?N~B^~~B^v_?Fv??Bf??@}???}???}???{A@?[A@?[BB?WBB?GBB??@f??@f??@f???}
+???}???}???[???[???K???K???M???E???E??{B?G{B?K{@?Nw??Fo???????A?O?G??B??????~^~~?GC??AG?CoA?BoB_No@o[??ww??[o?C[o?C]o?KM_?KM_?KM
+_?KN_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[N_?[M_?KM_?KM_?K]o?K[o?C[o?Cww?@o[?B_NoA?Bo????A?O?G??E??????~^~~?GC??AC?
+BoA??[?@{?F~?[{@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??^|~~v{???A?O?G??B??????~^~~?GC??AG?CoB?FoBo
+^o@w}??[{?CMw?K]w?K}w?K]w?K]w?K?w?K?w?K?w?C?{?C?}???^?B?NoB?Fo??]???{???w?C?w?K?o?[?o?[Mo?[^o?[^o?[^o?[^o?[Fw?KMw?K]{?D{}?Bo^oB?
+Fo????A?O?G??@_?????~^~~?GC??AC?DO??[???[???]???]???^???^???\_??\o??[oA?[oA?[OB?[?B_[?@_[?@o[??o[??W[??W[??K[??M[??E[??F[?B~~p~~
+~p{?[???[???[???[???[???[???[?A?~o}?~o{?????_C?A???o?????Nv~~oA@???a?@K?o@{?{B{?}F_?NM??FM?@Fk?@Bk?BB{?BBw?BBw?BBw?FBw?FBw?FBw?F
+Bw?FB{?FFk?FFk?FNM?F^N?F}J{FwH{F?GCF?G?B?K?B?K?B?K?@Fm?@Fm??Fn??Ff_?Fbw?~@{?{?[?????_H?B???o????mNr~~oA@???d?AC??Fo?????~o???GBf
+????_KK@??A?_OC??KA@?O??oGC@??B?_OC??KA@?O??oKC@??B?oO???KB`????oFC???B?[o???G?z????_@~_~oE?B}B~?W?F?B{?_?[?B_B?Bo?E?M?N??[?[@w?
+?o?wFg?B?@o{o?C?Fbr????M]M????~oW???B~@o???NwBc???~?Fo??Bw?No??^_?~??@w?F}??Nk?~W?B{{Now?N`~{B{?w@~?Bo??????_D?@??@_????gN~~~oA@
+???D??S?B`{^Fow?????_I?A??@G????iNv~~oA@???Y?@W?~r{?~~{?B~?@B{?BBw?FBo?NBo?MBo?]Bo?]Bo?{Bo?{Bo?{Bo?{Bo?{Bo?{Bo?{Bo?{Bo?[Bo?]Bo?]
+Bo?NBw?FB{?BB~?@~~{?~r{?????_?_@??@G????iNv~~oA@???Y??O?Bo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{???A?[?G??C_???Ag~^~~?GC??@g?Co?N??[N
+??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[N??[]_?K]_?K{o?Dw{?Bo^oB?Fo????A?[?G??@_???Ag~^~~?GC??@g?
+Do?N?F?N?F?]?B?]?B_]?B_{?@o{?@p{?@pw??xw??zo??^o??^o??^__ON__ON?_oF?ooF?ooE?poA?xo??Xo??Xo??Zo??N_??N_??F?????A?q?C??@_???A?~n~~
+?GC??@C?C?B_@~_^~B{{N?xoBf?Fw?^_@}?Fw?^_B~?M[Bx{~B~wF}?F????_D?@???W????GNz~~oA@???T??k?M??w?B_?M?B~?~{BM??w?B_?M??w?B_?M??w?B_?
+M??w?F_B}?^o@~?BlAW??CXNRdO?????????????????????????????????????????????????????????????????????????????????????????????????????
+,
+[Ao??CXNRdO@????Fo???@O???@TKB?oKB?qKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????wA_??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????}@{??Kc]??A{G????????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??@?C??@{@???@?S??GoD??Bw@O??X?W??MoE??@s@o??p?[??CoG??AwA???V?c??MOH??@OA_??u?g??COJ??BKAo??T?o??LoK???iBO??e_s??LWL??@EB_??
+__w??LOM???}Bo??j_{????O??@aC???s`???AOP??AUCO??x@C??BGQ??AWC_??~`G??BgR??@uCo??o`K??@?S??@]D???n`O???oT??@qDO??j`S??NoT??@ID_??
+e@W??MWU???sDo??_`[??J_V??B]Do??Q`_??JWW??B[E???}`_??AOX??@UEO??e@c??LgX??@IE_??Y@g??@oZ??AoEo??P@o??N_[??AKFO??G@w??LO]??AGFo??
+~`{??HG_??@cGO??EAG??Ioa??@?Go??}AK??Ioc???aHO??kaS??EWe???YHo??BA_??K?g???SIO??bAc??M?h??@WI_??jAg??AOj??AUIo??Bao??B@AAThYUdhT
+KB?oKB?qGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBGoKBHRQr?oPs[??????GBg?_??E????Fb|~~{?_O??F??[??@_????{????N????Bo????}?C??N_@??Bw?O??~?K?
+?KoB??BK?o??r_[??GWF??AE@o??`o{???KN???BBoA??p{?_?C]?GB~FoB?~r{?o??{?K??N?B_?Fo?W?@w?E??]?Bw?N_?~oN~B~{B~o{???A?m?G??B????@w~^~~
+?GC??@o?E?B~~oN~~o~o?@~o?Bro?Bbo?Fbo?Fbo?Fbo?Fbo?Bbo?Bro?@zo~o~o~o^o?@~o?Bro?Fbo?Fbo?NBo?NBo?NBo?NBo?NBo?Fbo?Fro?Bz~~p~~~oK???A?
+s?G??B????@w~^~~?GC??@o?EO??~GK@_N}N?[?Nv_Fo?~_@}?Bo?V_?w?C{?K?@N_B??Pw?o?C]?G?@BoA??O{????N????Bo????{????N????Bo????{????]?G?@
+F_A??Rw?_?C{?K?@]?B??N_?w?Bo?v??o?{{?GB~Bo??~?K?????_??B???o????]Nv~~oA@???[?@k?~~{B?N~~BoBo?Bw?{?@w?N??{?Bo?M??{?B??^??o?No?K?B
+{?A??~??_?^o?G?F{?A?@~??_?^o?G?F{?A?@~??_?^o?G?F{?A??~??_?No?K?B{?B??^??w?Fo?N??{?@w?N??N_B~~o{?~~{B?????GA_?_??K????Fb|~~{?_O??
+F??W?N~~N~~~N~??Nn??MN??KN??[N??WNB?WNB?WNB?WNB??NB_?NB~?NB~?NB_?NB??NB??NB?oNB?oN??oN??WN??WN??WN??[N??]N??Nn~~N~~~No???GAG?_??
+K????Fb|~~{?_O??F??U?N~~F~~~F~??Fn??FN??EN??MN??KN??KNB?KNB?KNB??NB??NB_?NB~?NB~?NB_?NB??NB??NB??NB??N???N???N???N???N???N???N{^
+?N{^?????G?W?o??K????Fb|~~{?_O??F??[??B{_oE?~w{@o?~]?^?B}?Fw?N?@]?B_?Ro?o?C}?K?@F_B??Pw?_?CN?G?@Bo????{????N????Bo????{????N?N{N
+BoB~Bpw?w?C]?M?@N_B_?Ro?w?Dw?M?@}?B_?^?B{?F?B~o@_N~^?OB{`oC???A?y?G??B????@w~^~~?GC??@o?E_B~r~{B~{~~?~??N?Bo?Bo?{??{?N??N?Bo?Bo?
+{??{?N??N?Bo?Bo?{??{?N??N?Bo~r{?{N{~?N??N?Bo?Bo?{??{?N??N?Bo?Bo?{??{?N??N?Bo?Bo?{??{?N??N?Bo?Bo?{??{?N~N~oN~r~{B????_E_@???W????
+]Nv~~oA@???[??o?~o~~B~??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N{N~o{???A???K??B????@w~^~~?GC??@o?F?B~B~wF
+~o~}@~??^?Bo?Bo?{??]?N??B_Bo??[?{G?B?NB??OBow???{F???N@w??Bo~???{Nw@?NB~?OBoxoK?{KKB?NB@@oBo_?{?{??N?N??FoBo?Bw?{??}?N??^?Bo?F_?
+{?Bw?N{N~_~~B~wN????_F?A???o????]Nv~~oA@???[?@S?~p{?~p{?{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{??W{??W{??W
+{??W{??[{??K{??M{??N{G?N~~{N~~{N????_H?B???o????]Nv~~oA@???[?AC?~oC?~oF~?wB~?^?B_@{?{?M?FoAo@{?]?J?Fo@w?k?^?F_?oBu?]?B?NW@w?K?|_
+F_?oFb?]?B?]K@w?K@woF_?oN@_]?B?{E@w?KBoWF_?o]?o]?B@wB@w?KF_KF_?o{?W]?BBo@`w?KN?EF_?ow?K]?BB_?pw?KM?BF_@wo?C]?N~Bw^{@~{N`~oC???A?
+y?G??B????@w~^~~?GC??@o?E_B~?N{B~oF~?~?B]?Bo?r??{?[o?J?FK?AoBr??K@{o?B?^K??oNb??KBoo?B@{K??o]B??KN_o?BBoKO?owBC?KM?r?BB?Ko?ooB[?
+KG?~?B??No?o?B{?K??}?B??N_?o?Bo?]??w?N{BM?B~?r??????_I?A???o????]Nv~~oA@???[?@[?~~{@~~{F{??N{??[{??{{?@w{?@w{?@w{?@w{?@w{?@w{??{
+{??[{??N{N{F{N{@{???{???{???{???{???{???{???{???{???{???~o{?~o{?????_M_A???o????]Nv~~oA@???[?@o?~~{??N~~@oBo??{?{??[?N??N?Bo?F_?
+{?@w?N??]?Bo?F_?{?@w?N??N?Bo?@o?{??N?NB~@oBo~oK?{K?N?N??BoBo?@{?{??]?N??F_Bo?@w?{??]?N??F_Bo?@w?{??}BN??^_z~B~oF~o~o?o???G?g?_??
+K????Fb|~~{?_O??F??Q?MAN?^a~?Rrw?Oz_?Oz??O^??O]??O]??O{??@{??F{??NwF?No~?N`~?NB~??B~?OBo?OB_?oB??oA??oM??oM??o]??o^??O~_?V~o?Nl~
+?MK^?????GBO?_??E????Fb|~~{?_O??F??Z?Nz~~oN}~~{BFnB??ozo_?KE{??B@~??@oNo??WB{??E?~??@_No??W?{????N????Bo????{????N????Bo????{???
+?N????Bo????{????N????Bo????{????N????Bo????{???oN{~?KB~No????A?y?G??B????@w~^~~?GC??@o?E_B~B~{B~o~~?~??]?Bo?B??{??o?N??K?Bo?B??
+{??o?N??K?Bo?B??{??o?N??K?Bo?B??{??o?N??K?Bo?B??{??o?N??K?Bo?B??{??o?N??K?Bo?B_?w?CW?M?@F?B??ow?_?{N??B~?o??~?C?????_M_A???W????
+]Nv~~oA@???[?@o?~_~~?~wN~oN_?vw?o?K[?K?FB?A?@ow?_?{E???N?o??f_K??Jw@??B{????}????N_???Bo????{?C??N_@??B[?o??r?[??GwF??AEBo???p{?
+_?K]?G?@N_B??Bo?w?@w?N?@}?B~@~{N~o^~Bo???GBw?O??E????Eb}~~{?_O??C_?R?N_F?No^?Bo{?Bpw?@`o??@o??@w?M@~?Np~?Fxo?@|o?@|o??|o@_|o@`|w
+@bx}@nz~?~bb?O???G?g?_??E????EB|~~{?_O??FO?S?B{??B{??B_??B_??B_??B_??B_??B_??B_??B_??B_??B`~?Nb~?^b`?vb?@ra?@r_?Br_?Br_?Br_?Br_?
+Br_?Br_?Bra?@va?@vb??~b`?|b~?P`~??????A?k?C??@_???@g~n~~?GC??@G?BoB_F~?~^Bo{N@wWF_?N??{?Bo?N??{?Bo?]?@x_NFB{MN?^w?{???A?I?G??@_?
+??@_~^~~?GC??@s?D???}?C?}?C?o?C?o?C?o?C?o?C?o?C?o?C?o?C?o?C?o?F_roFw~oD{}?C}w?C]o?C^o?CNo?CNo?CNo?CNo?CNo?CNo?CNo?C]w?C}{?D{}?Fw
+vo~_po{?????_J?@???W????YNz~~oA@???Q??{?w?^wFvo}Fb_]]?|w~v~~^o{?Bo?N??{?F_?]WBpo~BboF}?N????_B_@????????WNv~~oA@???\??{??B~?^}@x
+wFbo]F??[?@o?F??[?@o?N{F~o\o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??~_^}@o???GBw?O??E????Eb}~~{?_O??Eo?Q?MBf?~b~?rq{?pxw?@xw?@xw?@xw
+?@xw?@xw?Bo{?No^?MoF??w???w??@w??No~?Nr~?Nz~?Pz_?o~??o]??o]??o~??p~_?rzo?^`~?M?^??????A?I?G??@_???@_~^~~?GC??@s?D??~???~???w???w
+???w???w???w???w???w???w???w???w^oAw~oBw{OFww?Dwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?F~}O~~}O{?????_A?@???W????WNv~~oA@
+???\??c?N??}?Bw?N_?{?????????????????B{?No?w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?~oF~?O???G?w?O??mN~~~uB|~~{?_O??HO?J?G?Bo?^?@{?F
+_?K???????????????Bo@~?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[N@w{FroN~?Vw?????_@?A???W????WNv~~oA@???\?@K?No??No??
+M???M???M???M???M???M???M???M???M???MNwBMNwBMFo?MBo?M@w?M?{?m?[?}?[?}?{?}?{?]@w?MBw?MBo?MF_?MF_?MN??~~cF~~cF?????G?_?O??E????EB|
+~~{?_O??FO?H?B{?No?w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?N{@~oC???A?Q?K??@_???@g~n~~?GC??@G?GO?~~m?N
+?J~~}P{?}MC^N_Bwo?{{?Fa?@r_?MG?BM??w_?Kw?Ba??r_?MG?BM??w_?Kw?Ba??r_?MG?BM??w_?Kw?Ba??r_?MG?BM??w_?Kw?N~pF~{@~~C^~oC???A?I?G??@_?
+??@g~n~~?GC??@G?D??~^oA~~oBw{OFww?Dwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?Cwo?F~}O~~}O{???A?}?C??@_???@g~n~~?GC??@G?C_B?BoBo
+No@w]??[w??]w?CMo?CNo?KNo?KNo?KNo?KNo?KNo?KMo?C]w?C[w?@w]?BoNoB?Bo????A?I?G??@_???@g~n~~?GC??@g?D??~^oB~~oFwwOLwo?[w_?[w_?{w??{w
+??{w??{w??{w??{w??{w_?\w_?\wo?Nw{ONw~oCw^o?w???w???w???w???w???w??B~?OB~?O????A?C?G??@_???@g~n~~?GC??@g?D?B_boFwfoF{}?C{{?C]w?C]
+o?CNo?CNo?CNo?CNo?CNo?CNo?C^o?C]w?C}{?D{}?FwvoF_poC?o?C?o?C?o?C?o?C?o?C?o?C?}?{?}?{???A?_?C??@_???@g~n~~?GC??@G?BOA~B~{^}@xwFf_K
+M??w?B_?M??w?B_?M??w?B_?M??w?N{B~oK???A?_?C??@_???@g~n~~?GC??@G?BOBwB^wNBo{FB_[KBoo^?NwB~_^wBo?^?pwBF?[[Bpw^B~{N{oK???A?_?C??@_?
+??Ag~^~~?GC??@g?B??o?B??K??o?B??M??w?Bo?~o^~@r_?M??w?B_?M??w?B_?M??wBB_KM?owBB_K]?zo@}?B????_A_A???W????YNz~~oA@???Q?@O?N~_@N~_@
+MK?@MK?@MK?@MK?@MK?@MK?@MK?@MK?@MK?@MK?@MK?@MM?@MN?@]N_@{N{NwK{N????_@?A???W????YNz~~oA@???Q?@K?~~?F~~?FMM?@MM??[E??[E??[E??wB??
+wB??wB_?o@c?o@c?o@{?_?{?_?{???[???[???[?????_L?A???W????YNz~~oA@???Q?@k?~~rr@~~{{o[{{M?@MNB??Bbwo?@ouE??[L``?FBWWO@obFC?wGor?MAK
+KoB_@bK?o?[^?K?FFoB?@p{?_?KM?G?BB_A??ow?????_@?A????????YNz~~oA@???Q?@S?~nCN~nCN{N?@wN??oFC?_Bk?_@k???{???w??@w??@{?_Bk?oFC?oF??
+wM??}M?@~~C^~~C^????_@?A???W????YNz~~oA@???Y?@K?~~?F~~?FMM?@MM??[E??[E??[E??wB??wB??wB_?o@c?o@c?o@{?_?{?_?{???[???[???[???K???K?
+??K?boC?boC?wo??^_??N???????_J?@???W????YNz~~oA@???Q??w?~b~}Npw{B`wEBwWF`_^E?}?@wBFoKF_o]B_{E@wWBpz~F~{^????_N_@???o????cNv~~oA@
+???Z?@??w?^oBr_[FB_]]?xoBf?N{?~oB~?N{?~oB~?N{?~oB~?N{?~oB~?N{?xoBf?]]@owM@roB}?F????_N_@??@_????cNv~~oA@???Z??s?o?B_?No?~oBb?M??
+w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B~F~{^????_N_@???o????cNv~~oA@???Z?@??{?^{Fpw~@foN]@~wF~?^{?zo?N??}?@w?Fo?N??]
+??}?@w?Bo?F_?FB?MK?[o?x_~v~~^~|~????_N_@???o????cNv~~oA@???Z?@??{?^{Fpo}Ffo}]@xwFf_?]??{?Bo?F}?Nw?[?F_?{?F_?{?Bo?N?M{@~oF~?^]?|w
+Fbz{F~?F????_N_@???o????cNv~~oA@???Z?@??BBb{N~o^~?[K??o?B??K??o?B?Bk@~o^NBo[]?pw?N??{?Bo?N?N{?~oB~?N]?x{Fbz{F~?F????_N_@???o????
+cNv~~oA@???Z?@??w?^wFro[Fb_]]?|oBv?N{?~oB~?N{?~oB~_]}@r{~N~w|wBo?F??]@xwFb_]N@w]F_~{@~_@????_A?@??@G????WNv~~oA@???\??S?B`{^Fp{^
+Fp{^B_wMB_wMB_wMB_w?????B`{^Fow?????_A?@??@G????WNv~~oA@???L??W?B`{~NrwoKB_WF?wN@_????A?_?C??C_????o~^~~?GC??Ag?A_A??{?@o?F_?F??
+K??w?@_?F??[??w?B_?M??w?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??w?B_?M??w?F??[?@_?M??o?F??w?B??[?@_?K???A?_?C??B?????o~^~~?GC??Ag?
+A_?F??w?B_?[?B_?K?@o?E??w?B_?K?@o?F??[?@_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??{?@o?F??[?@w?B_?E??[??o?B_?F??M??w?@o????A?G?C??C_?
+??A_~~~~?GC???s?@O?MFp{^F`_WE@oKB_[E?????G?_?O??Q????IB~~~{?_O??@O?D??w^Fp{M?????G?_?O??Q????Eb}~~{?_O??C_?D??w^Fp{M???????????M
+Fp{^B_???G?_?O??Q????Eb}~~{?_O??E_?D??w^Fp{M???????????MFp{^F`_WE@oKB_[E????_A?@??@_????KNv~~oA@???h??[?^v{B?oKB?oKB?oKB?oKB?oKB
+?oKB?oKB?oKB?oKB?oKB?oKB?oKB^v{?????_A?@????????KNv~~oA@???h??[?^v|_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_WE@_^v{?????_A_A
+????????WNv~~oA@???\?@S??No?_N{@oKKBwKCB{K?B[K?B[???[???[???[???[???~~{B~~{B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B[G?B
+[G?B~mC^~mC^?????G@O?O???????Ab~~~{?_O???o?J?N{F~o^~@o???GB??o??K????BB|~~{?_O??Fo?b????@o?????F????_?{???A?Bo???G?N????o@{???B?
+Fo???M?~????wB{???Bo^o???B@~????KF{????W~_???@b}????BNw@???K~?C???z{?o??@n_B???E}?K???Nw@o???~?F?GB~~o{?_N~~BoA??]?N?K??o@{?o?B?
+Fo@_?K?~?E??_B{?[?A?^oB~@~b~@~{F}N{F?????G@w?o??K????BB|~~{?_O??Fo?^?N~~^oB~~~{Bw?^_@}?Fo?~_@w?^w?]?N}?F_B~_@w?~w?]?N}?F_B~_@w?^
+w?^?F}?Fo?~_@~?FwN~~?]B~~o^_@{?Nw?]?F}?F_B~_@o?~w?[?^}?F?F~_@o@~w?[?^}?F?F~_@o?~w?]?N}?F_@~_@}?N~~~~@~~~~o????A?c?K??C_????o~^~~
+?GC??@{?Fo??{B|_?Nz~[W@~oFn?Fo@~{?[?^n_B?Frw?O@w~?C?[Nw??FB}??@o~_??WF{??E@~????^o???F{???@~????^o???F{???@~????^o???Nw??EB}??@_
+~_??WNo@?FBw?O?o}?K?MN?F?@r?Fo?N_N~?@oB}~oC?{B{?????_K?B???o????KNv~~oA@???^?AG?~~|~??B~~~{B?M?Nw?{?w?}?FoB_Bo?~?M?N?Fw?w?{?~?B_
+BoB{?M?N?N_@w?{?}?F_BoBw?]?N?N_Bw?{?}?N_BoBw?}?N?N_Bw?{?}?N_BoBw?}?N?N_Bw?{?}?N_BoBw?}?N?N_@w?{?}?F_BoBw?]?N?No?w?{?~?B_Bo@}?M?N
+?B{?w?}?FoB_B}?N?N~~~oK?~~|~????????_B?B???o????KNv~~oA@???^?@w?~~~~@~~~~o^_B}?Fw?}?@}?N??^_Bo?Ew?{?Bm?N??r_Bo?Kw?{EBM?N@_r_BoW?
+w?{E?MAN@oB_~o[?wN{F?MAN@oB_BoW?w?{E?M?N@bB_BoWow?{?KM?N?@b_Bo?Ww?{?EM?N?@r_Bo?]w?{?F}?No?~~~~{N~~~~Bo???G?W?o??K????BB|~~{?_O??
+Fo?[?N~~~o^~~~{Fw?~_@}?N_?^_Bo?Fw?{?@m?N??z_Bo?Kw?{?BM?N@_r_BoWKw?{E?M?N@_B_bo[?wN{F?MB~@oB_bo[?w?{E?M?N@_B_BoW?w?{E?M?N??B_Bo??
+w?{??M?N??B_Bo??w?{??M?N??B_Bo??~~{B?N~~?o????A?u?K??C_????o~^~~?GC??@{?Go??{B|_??B}~vC?_F~?]oB?Fo@~?N?F?Fw?}?K?^?Bw?O@w?No@?F??
+~_??[?B}??@o?Nw??E??^o??W?@~?????F{?????^o????@~?????F{?????^oB}~o\~?Nz~@v{??F{?~_??^oB}??@~?Nw??F{?~?C?^oBw?O@~?N_B?F{?{?[?^oB?
+Fw@~?GB~wF{??Nz~^???{B|_??????A?u?K??B?????o~^~~?GC??@{?H?B~~~f~B~~~}^{Nw?{?^oB_Bo@~?M?N?F{?w?{?^oB_Bo@~?M?N?F{?w?{?^oB_Bo@~?M?N
+?F{?w?{?^oB_Bo@~?M?N?F{?wN~~^oB_~~|~?M?N?F{?w?{?^oB_Bo@~?M?N?F{?w?{?^oB_Bo@~?M?N?F{?w?{?^oB_Bo@~?M?N?F{?w?{?^oB_Bo@~?M?N?F{?~~~x
+~o~~~~f~Bo????A?w?C??@_????o~^~~?GC??@{?COB~~oF~~oF_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_
+BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB~~oF~~oC?????_M_A???o????KNv~~oA@???^?@g?~~{B?N~~?oB_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N
+??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??N_Bo?Bw?{??}?N_?N_Bw?Bw?}??}?No?F_B{?@w?~_?]?N}?F~~~{@~~~~?O???GAo@???K????BB|
+~~{?_O??Fo?l?N{N??B}F~{^??B~F}?^??B~?E?~?GB|?E?~?GB|?E?~?GB|?E@}?KB{?E@}?KB{?EB{?EB{?EB{?EB{?EBw?RB{?EBw?RB{?EBw?RB{?EBo?pb{?EBo
+?pb{?EB_@or{?EB_@or{?EB?BoZ{?EB?BoZ{?EB?BoZ{?EA?FoN{?EA?FoN{?E??noF{?E??noF{?E??~_B{?E??~_B{?E??^?B{?E??^?B{?E??^?B{?N{NMMB~F~{N
+MMB~Fo???GBW?o??K????BB|~~{?_O??Fo?c?N{^?N{N~r{?~o~_^o@_?M@~?E??wN{?W?@_~oD_?EB}?u??WNoFW?@_~?|_?EBwBu??WN?^W?@_wB|_?EB?^u??WGB~
+W?@__N|`?E??~uC?W?B}Wo@_?Npf?E??}E{?W?Bw^o@_?N@~?E??wF{?W?B?^o@_?G@~?E???F{?W???^o@_??@}?E???Fo?W???]?B~Bo@o?N{N?E???????GAg?o??
+Q????BB|~~{?_O??Fo?_??BwFo??~~{?_@~w?]?Fw?^o?{?N}?E?F~_??@~{???~~_??^vw??Fx}??@}^o??~f{??Nx~??B}^o??~f{??Nx~??B}^o??~f{??Nx~??B}
+^_??^nw??F~}??@~~???N~o@_B~w?W?^{?N?B}?Fw?]?F~_@?N~~??BwFo????A?W?K??B?????o~^~~?GC??@{?F_B~~v{?~~~~?]?N{?^_B{?Nw?}?F}?N_@~_Bw?~
+w?}?N}?N_B~_Bw?~w?}?N}?N_@~_Bw?^w?~?B}?N{?^_~~{@wN|~?M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??N~~?OB~~oC?
+????_I_B??@G????KNv~~oA@???g?A???N_^??B~~oA?F~_@w?^_@~?Bo?~w?W?^}?E?F~o??B~}??@~~_??^vw??Fx~??B}^o??~f{??Nx~??B}^o??~f{??Nx~??B}
+^o??~f{??Nx}??@}^_??^nw??F~{???~~NEFN~bxbp~oM|wNw@~{@w?~}?C?~~{??N`~o???{M???NBp??Bo~o??{N{??MB~??B_^o??wF{??K?~??A?Fo???GAg?o??
+K????BB|~~{?_O??Fo?c?N~~Fo??~~~~??B_B~_B?M?Nw?[?w?~?BoB_B{?N?M?No@{?w?~?FoB_B{?^?M?No@{?w?~?BoB_B{?N?M?Nw?[?w?~w?oB_~~{??MB~~o??
+w?~}?OB_B~oB?M?N}?[?w?~o@oB_B~?F?M?N{?[?w?~o@oB_B~?F?M?N{?[?w?~o@or_B~?FBM?N{?{Mw?~_Fo~~~{F~@~~~?^{B?????GAw?_??Q????BB|~~{?_O??
+Fo?U?K?~ENB~F^r_Frw?Frw?F`{?F@{?F@{?EB{?EF{??N{??N{^?Nz~?^z~?~r~@~b~B~B~F{B~FoB{NoB?NoA?No??NoK?N_K?N_K?N_[?F_{?Fp{?B~~?B~^~?wN~
+??????A?W?K??B????@G~^~~?GC??@w?FoB}~~{~~n~~Nrzo@rwM{?[w@n?FK?Zo@r?F{?\o?~?FW?No@u?B{?\_?~?FW?Bo@o??{?[??N?F??Bo@o??{?[??N?F??Bo
+@o??{?[??N?F??Bo@o??{?[??N?F??Bo@o??{?[??N?F??Bo@o??{?[?wN~~?}B~~oK???A?o?K??B?????o~^~~?GC??@{?GoB~~wF~@~~~_^{Fw?{?K?B_Bo?o?M?N
+?B??w?{?K?B_Bo?o?M?N?B??w?{?K?B_Bo?o?M?N?B??w?{?K?B_Bo?o?M?N?B??w?{?K?B_Bo?o?M?N?B??w?{?K?B_Bo?o?M?N?B??w?{?K?B_Bo?o?M?N?B??w?{?
+M?B_Fo?w?K?^?@o?_B{?F_A?^o?N??B}wO[??Nr~?o??wF{???????A?o?K??@_????o~^~~?GC??@{?HOB~~oB{F~~~?No^w?{?o?F_BoB??M?^?M??o@{?W?B?No@o
+?G?~?B??_F{?K???^o?W??B~?@_??Nw?B???~_?K??B{?OW??No@@_??~?KF??Bw?oK??NaF?o??{G[@??BoboC??MBN????wL{???B?^o???K@~????oF{???A?No??
+?G?~?????@{?????Fo?????M??????w???????A?C?S??@_????o~^~~?GC??@{?KoB~~~b~?~{F~~~w~oN~@~?F_B{?[?B_Bw?~?B??w?}?^o?o?M?^?F{?K?B?Fo@~
+?@_?o@{?~o?W?K?~?N{?F?A?NwB~?Oo?_B}?~OCK??@~_Ns@@_??^{Bw?oW??N~?}?KF??B}oN_F?o??~eBo@oK??Np`{G[@??B{[^AN?O??~BN_boC??N_rwK{???Bw
+E{B^????}@~?~o???N?^oF{???BoBw@~????w?}?No???M?F?B{???B_@o?~????o?[?Fo???K?B?@w???A??o?M????_?C?B????????GB??o??K????BB|~~{?_O??
+Fo?b?N~~{N{@~~~o~oF_Fo?N?K?^??[?oB}??oA?^w?@??B~o????N~_????~fC???B{Ko???NoZ????}@{???BoBo???M?N????w@{???B?No???K@~????oF{???@_
+~o???FB}?O??MNw@???W~?K???rw@o??Bn_F???F{?{???N_FoA??[?^?K?@oB{?w?E?^oB~F~b~@~{^}N{F?????G@W?_??E????Bb}~~{?_O??D??V?M?~?Nb~?^ro
+?~r_?~r?@~r?@vb?@oB?@wB~@~B~@~rB@vz?@r~?@p~?@p~?@p~?@r~_@vzwB~q~^~?N^o???GAw?_??K????@b|~~{?_O??G??W?N{??N{??N_??N_??N_??N_??N_?
+?N_??N_??N_??N_??N_??Nbw?~b~B~aFF~_@Nn_?^n_?^N_?~N_?~N_?~N_?~N_?~N_?~N_?~N_?~N_?^N_?^n_@N~aFFrb~Bpb{?o???G?g?_??K????Bb}~~{?_O??
+D??R?K@~?NB~?^bp?~ro?vzo?rzo?r~_?R{??B{??B{??B{??B{??B{??B{??Fw??Fw?@no?@~bB?~B~?[@~?????GAw?_??K????@b|~~{?_O??G??W??B_FoB_Fo??
+Fo??Fo??Fo??Fo??Fo??Fo??Fo??Fo??Fo??F{?~F~B~F~b`F~q?Fvw?Frw?Fr{?Fr{?Fr{?Fr{?Fr{?Fr{?Fr{?Fr{?Frw?Fvy?Fvr?F~b`F~@~~{?^~o???G@??_??
+E????Bb}~~{?_O??D??T?KB~?NB~?~bb@~r?Bvy?Bvw?Fr{?Fr{?F~~~F~~~Fr{??B{??B{??B{??Fw??Fw?ENo?FN_BF~B~BwB~?o???GA??O??E????@b|~~{?_O??
+G??R??B{?OB~?wB~@{Bf@}Bf@}Bb@}BB?}?B?M?B?M?B?M?B?M?B?N{~?N{~?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?M?B?No~
+?No~?????G@o?_??E????Bb}~~{?_O??F_?V?K@~NnB~^~bp]~b_]vr?@vr?@vr?@vr?@vr?@~b_?~bp?~b~?^`~?@_??B_??F_??Nb~?~b~B~B~F~r~Nrw?^p{?^?{?
+]?{?]?{?]@{?^Bw?Nnq?F~b~B{B~?O???GAw?_??Q????@b|~~{?_O??G??W?N{??N{??N_??N_??N_??N_??N_??N_??N_??N_??N_??N_??Nbw?~b}B~aNB~_BF~_@
+F~_@F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~_?F~~F~~~F~o???G@g?O??K?????B|~~{?_O??GO?J?Fo?~?B}?Nw?~_B{?Fo?????????????????
+~oB~?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?~o^~@v?k??@ERsxS????????????????????????????????????????????????????????????????
+,
+tao??CXNRdO@????Fo???@O???@TKB?oKB?qKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????Pac??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????VQ???HW]??@XGO???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K????C??@W@???t?O??A_D??@{@O??z?S??C?E??A?@_??s_W??AWF??AM@o??A__??FGG??B}A???Z_c??LwH??@MA_??n_g??AwJ??A_Ao??C?o??H_K???IBO??
+^?s??HoL??BaBO??I?w??M?M??@wBo??e?{??B?O??BCC???W@C??NOP??AGC_??F@K??J_R??@kD???w`O??FWT??@GD_??~@W??H_V???kE???y@_??G?X??B{EO??
+c@g??A_Z??B?Eo??e@o??Co\????F_??T@w??Ko]???KFo??`@{??L_^??@OG???pa???Bw`??ASGO??zAC??E_a??A{G_??CAK??G?b??BoGo??PAO??GOc??BSH???
+IAS??Fod??BcHO??MAW??KOe???yHo??ba[????g??@uI???yA_??Dwh??ACIO??gac??CGi??@mI_??oAg??B_j??@kIo??aak??Jwj??BuIo??Wao??B?{AThYUdhT
+KB?oKB?qGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBGoKBHRQr?oPs[??????GA_?_??K????@b|~~{?_O??G??W?N{??N{??N_??N_??N_??N_??N_??N_??N_??N_??N_?
+?N_??Na?^~a?^~_?B~a?@~b_?~bo?^`w?N_{?N_~?N`~?Nb~?Nbx?^bo?vbo?vb_@vb?Bva?Fva?N~~B~~~B~o???G@g?O??K????@b|~~{?_O??G??J?N{?~oBw?N_?
+}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N_?}?Bw?N{F~o[???A?G?O??C_????w~n~~?GC??@O?Ho@~}?^}?V~}f~{F]?~^oo^w
+?~~?B~_@^g?N}?D}_?~w?By?B~_?Ng?N}??}_?~w?By?B~_?Ng?N}??}_?~w?By?B~_?Ng?N}??}_?~w?By?B~_?Ng?N}??}_?~~p~~p^~~F~~D~????_J_A??@G????
+MNz~~oA@???S?@_?^~_B^~wN]G{N}?K^}?C^}?C^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^~{^~~{^~????_F?A???W????MNz~~oA@???S?@[?
+_N{?wN{B}KCN^??^^??^N_?}N_?}No@}No@}No@}No@}No@}No@}N_?}N_?}^??^^??^}KCNwN{B_N{?????_J_A???o????MNz~~oA@???\?@_?~~_B~~{N}G[^}?C~
+}?@}}?@}}?B{}?B{}?B{}?B{}?B{}?B{}?B{}?B}}?@}}?@}}?C~}K[^}N{N}NoB}???}???}???}???}???}???}???~o[?~o[??????G?O?_??K????Bb}~~{?_O??
+D??Q?F~{?F~~?Vbv?~br?~bp?~bp?~b_?^_??N_??N_??N_??N_??N_??N_??N_??N_??N_??N_??N{N?N{N?????GBw?O??K????Bb}~~{?_O??D??O?N@n~F{]]?\o
+@u?NW@{?~oN}F~w~}F~?~oB{?~?Fw?^_B~?~]N{~{o{???A?w?C??@_???@_~^~~?GC??@s?BoA??W?@_?F??[?@o?F_?^?@~?F~N~{~{?Fo?^?@{?Fo?^?@{?Fo?^?@
+{?FoW^@`{EFoW^@`{BN_Nw?^????_J_A??@G????MNz~~oA@???S?@_?~}?^~}?^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}??^}G?^}K?^}MC^
+{F~~oB~~????_I?A???W????MNz~~oA@???S?@c?~o^}?^{F~_Fw?B_?{?CW?N?@E?B_?oo?w?KK?K?F@_B?@oW?_?{B?G?N?oA?foK??H{@??B~?O??~_???Nw???@{
+????^????B_????w??????A?c?K??@_????w~n~~?GC??@O?GoB~xv~w@~~f^~_F}??Nw?Fw?@~??N?@Fu??{?C^W?B__rso?MABNR??wGL|K?B?pv_W?KBF]@_?_E~o
+B?A?Z~?K?G@n{?s??B~_@o??N}?F???]o?K??@z??o??Fk?B???K_?C?????_I?A???W????MNz~~oA@???S?@c?~w^~?N}F~oBo?Pw?w?KF?M?F?oB?`oC?_K{@??B~
+????^_???Fo???B{????~_C??NW@??Bb?oA?oO[?oGCN?MA?FoBw?B{?~wF~?^}@~oC???A?g?G??@_????w~n~~?GC??@s?EOB~@~w@~o^}?^_?M?Bo?P_?{?CW?M?B
+B?B_?oo?o?[E?K?F@_A?BoK?_?{B?GA^?o??foC??N{@??B}????~_???Fo???@{????M????B_????W????E???F_o??B{K???~@_???o[??G[B??B}?O??]???????
+?G@o?_??K????EB|~~{?_O??FO?T?G?~?MB~?Nb_?vb??vr?@ry?Bry?Bry?Br}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fr}?Fry?Bry?Bry?Bvr?
+@vb??~bp?}B~?G?~??????A?[?G??E????@_~^~~?GC??@s?CO??B_??BoBoBoB~BoBNBoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB?
+BoB?BoB?BoB?BoB?BoB?BoB?BoB?BoB~~oF~~oC?????_F?A??@G????WNv~~oA@???\?@K?w@{?~F{?Fnw@Nn_B^~_B^~?F^~?F^}?FNm?FFN?F?N?F?N?B?N_B?N_@
+?No??Fo??Bw??@{?_?{?o?KEo?CEw??E[??F}N{F~N{B~n{B~~{B~~{B~~{B?????G@o?_??K????EB|~~{?_O??FO?T?K?~?NB~?^bw?~bo@~r`@~r`@~r`@~rp@~rp
+@~bo?oBw?OB{?G@~?G@~??Bw?OB_@oB_BoB?Brr?Fvz?F~~?F~~?F~~?F~~?F~~_Bvz_@vro@~b~?[@~??????A?[?G??@_???@_~^~~?GC??@s?Do??_?K?o?K?w?K?
+w?K?{?K?}?K?~?K?z_K?x_K?woM?wON?wON_w?Low?Kow?KWw?K[w?KMw?KFw?N~~v~~~v{?{?K?{?K?{?K?{?K?{?K?{?M?~v}?~v{?????_F?A??@G????QNv~~oA@
+???]?@S?@_??~n{^~n{^~n{^~n{N~n{F~~{B@{?@?}???~???v_??Bo??@o??@w??@w??@{???{?_?{?_?{?_?{?_?{?o?{?o?{?o?{?o?{?o?{?o?{?o?{?o?{?_?[?
+????_F?A???o????WNv~~oA@???\?@S?oB{?{N{?}N?B^K?FNk?FNg?NNw?NNw?NNw?^Nw?^Nw?^Nw?^N{?^Nk?^^m?^^N?^}N{^{H{^?GG^?G?NNG?N^k?N^k?F^k?F
+^m?BNn?@NNo?}F{?w?{??????G@o?_??Q????Mb{~~{?_O??HO?R???E???E?K?~?NB~?Fru?RrE?pwE?ozE@o~e@o~e@p~e@p~e@r~E?~{F?N{^?Nx~?Nz~?Nr~?^b~
+?~B~?wB~@oB}@pze@r~E@r~E@r}E@r}E@p}E@o]E?ozE?pze?Vru?N`~?K?^???E???E???E??????A?w?C??C_???Bg~N~~?GC??As?BO??F??M??]??{?Bw?F_?N??
+]?@w?Bo?N??{?@w?F_?]?@w?Fo?N??{?Bo?N??{?Bo?N??{?Bo?^?@w?F_?]?@w?N??{?Bo?]?@w?N??w?B_?[?B_?K?@o?M?@o???A?w?C??C_???Bg~N~~?GC??As?
+BO?F??w?F??w?F_?{?B_?M?@o?N??w?F_?]?@o?N??{?Bo?N?@{?F_?]?@w?F_?]?@w?F_?]?@w?Fo?N??{?Bo?N_?]?@w?Fo?N??}?@w?Bo?F_?M??[??w?@o????A?
+Y?C??E????@o~~~~?GC???[?@o?}^v|~^v{}?????G@g?O??]????Mb{~~{?_O??JO?G?N~~~o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@~~~
+~o????A?Y?C??@_???Bg~N~~?GC??As?A?B~~~~_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB_wMB~~~{?????_M_A????????ENv~~oA@???_?AG?
+?N?N~_??~n~~?W?~~N[Bo?~}{ON_@~zp?}?B~n?Bw?N}w?F_?~o??M?B}???w?Nw??B_?~_??M?B}???~~~~FoB~~~{^?M?B}???w?Nw??B_?~_??M?B}???w?Nw??B_
+?~_??M?B}???w?Nw??B_?~_??M?B}???w?Nw??B_?~_??M?B}???w?Nw??B_?~_??M?B}???~@~~BoB{F~{N?????GAw?_???????@b|~~{?_O??G??Y??BoBo??~`{?
+_B{{?K?NN_B_@rw?w?L~?M?BN_B_?rw?w?K??M?B??B_?o??wGL~?N~~^oB~~v{?w?L{?M?B^?B_?vo?w?L{?M?B^?B_?vo?w?L{?M?B^?B_?vo?w?L{?M?B^?B_?vo?
+w?L{?M?B^?B_?vo?w?L{?Nq^~oN{f~{B????_F?A????????wNz~~oA@???A?@c?~~~~?^~~~oC???A?K?K??B?????W~^~~?GC??A??F_???@_????[????F????@w?
+???}????No???B{??G?|??A?NO??oBo??K@{??@_]???WF_??B@w???o]???EF_??@bw???K{???BN????Zo??B}~o??~~{???No?G?@w?E??]?@o?B_?[??w?D_?M?@
+[?B_?^_?w?N~?~w~~oN}No???G???o??K????BB|~~{?_O??Fo?\?MB~~oB_~~{B?Bq?@o?{_?{?N_?^?@w?Fo?]?@{?F_?^?@w?Fo?]??{?Fw?N??~?@o?Nw?K?B~?@
+?N|~??B~~oE?B}?B_?^?@w?Fo?]?@w?F_?]?@w?F_?~?@w?Fo?N?@{?Bo?^??}?Bo?N_?{?B{?F_?~o?~n|~?N~~Bo????A?E?K??F_????W~^~~?GC??AC?FO??oB{O
+?N`~E?B}w@o?N{?^_?}?F{?F?@~_?o?N{?C?Bn????zw???M^???Bfo???x{???EN_???Bw????}????N_???B{????^????Fo???@{????^???BF_A??pw?_?C}?G?@
+N_B??Ro?w?@{?E??}?@o?N?@N?B_@o{?oN{F??B}?O????A?Q?K??B?????o~^~~?GC??@{?G?B_~~{?wN~~@o?{_?{?N??^?Bw?N_?]?Bo?F_@w?@w?]??]?F_?F_Bw
+?@{?}??N?N_?BoBw??{?}??N?N_?BoBw_?{?]G?F?Fq?@o@{_?[?^G?F?Bq?@o?}o?[?Fk?B??~??o?No?M?@{?Bo?N??~?@w?N{?Nz~NoB~~o[?????_M_A???o????
+KNv~~oA@???^?@s?wN~~F}B~~p{?N??^?Bo?F_?}?@o?F_?[?@w?F??]?@o?F_?[?@woB??^E?o?Bp_???{W???NF???~p{??N{^?G?NB_A?@oo?_?[K?G?FB@a?@ooK
+_?[?BK?F??r??o?Eo?K?@k?B??^??w?Bo?N??}?B{?N}~~{@~~~~?O???GBO?_??K????BB|~~{?_O??Fo?\?MB~~p~_~~{^?Bo?Fo?{?@w?N_?[?@w?F??]?@o?F_?[
+?@w?F??]K?o?Fp_K??{W???NE???Bpo??N{^??B~FoA?Bow?_?[K?G?FB?A?@oo?_?[K?G?F??B?@o??o?K??K?B??B??o??o?K??K?B??B_?o??~f{??N|~??????A?
+W?K??F_????W~^~~?GC??AC?F_??oB{_?NB~K?B{wBc?Nw?~_?{?N{?F?Bz_?o?]{?C?FN?@?@rw???[^???FFo??@p{???KN_???Bw????}????N_???B{????^????
+FoB}Np{?~b{^?G?FF_B?@rw?o?[}?K?BN_B??vo?o?L{?M?B}?B_?~?B}?N_Bzw@_N{N?OB}?o????A?K?K??B?????o~^~~?GC??@{?G_B_~}N~?}B~w~{B?Bo?F_??
+N??^???}?@{??@w?Bo??F_?N???]??{??@w?Bo??Fg?N???^_?{???}?@o??Bw?F???N_?[??N~~@o??~~{F?G?No?[?_?^??oA?@{?B?G?Fo?K?_?^??oA?@}?B?K?F
+w?K?o?N_?OB??}?@?K?Bw?C?o?N_?OB??~?@?M?B{?C?~b~~FoB~F~{^??????A?_?C??@_????o~^~~?GC??@{?CoB_~o^_~o[?N???N???N_??F_??F_??F_??F_??
+F_??Fo??Bo??Bo??Bo??Bo??BoA?BoA?@oA?@oA?@oA?@oA?@oB?@oB??oB??oB??oB??oB??oB_?oB~NoB~No??????_I?A???o????KNv~~oA@???^?@c?wN{N?MB~
+Bo??N????Bo????}????F_???@w????]????F_???@w????^????Bo????{????N????Bo????{??G?N??A?@o??_?[??G?F_?E?@w?@_?^??K?Fo?B??{??o?N_?K?B
+W?B??v??o?Lw?M?B^_B}~r{?~~{~?????GBo?o??K????BB|~~{?_O??Fo?i?M?~??B~?}?~?GB~?o@{?G?^??@{?K?^??@}?K?^??@u?E?N??@u?E?N??@u?B?N??Be
+?B?N??Be?H_N??Bf?H_N??Bb?GoF??Bb?GoF??Bb?GWF??BB?WWF??BB?[KF?GBB?[KF?GB@_[CB?GB@_[CB?GA@o{?B?GA@o{?B?GA@W}?B?KA@W}?B?KA?K}?@?KA?
+K}?@?K??F}?@?K??F}?@?M??B~?@?N?@B~?@?NwN@~{^?N{N`~{^?????G?o?o??K????BB|~~{?_O??Fo?a?M?~oN{BwF~?~oK?^??}??@{?@o??Nw?F???|_?K??Bu
+?Oo??MW@B???x_CK??Be?ow??K[BB_??oo[E??AB@oW??GKF@_??_o{E???BBo[?_?K^@oA??PwB?G?@F_K?_?C}?oA??RoB?G?@~?K?o?Fw?oB??N_@?K??}?C?o?Bo
+?OB??N?@?M??w?C?{?F_?OB}B}???N{No????????G@G?o??]????@b|~~{?_O??GO?\??B?Fo??}F{??Brw???Nw?E?@{?Bo?M?@}?@_?^o?O?N{???B~_???|w???^
+^???Fro??@{}???^N_??Frw??@{}???^FoA?Bp{?_?{^?G?NFoA?Bp{?o?[]?K?FF_B_?rw?w?K}?N?@N?Bo?Fo?]?@w?Bo?{??]?MABBoB?~oK??F{??????GBg?_??
+K????BB|~~{?_O??Fo?\?MB~~oB_~~{B?Br?@o?{_?{?N_?N?@w?Fo?]?@{?F_?^?@w?Fo?]?@{?Fw?N??}?Bo?N_?[?B{?B??~o?OB~^oA?~p{?_?[??G?F??A?@o??
+_?[??G?F??B?@o??o?K??K?B??B??o??o?K??K?B??B_?o??~b{??N{~??????A?Q?K??F_????W~^~~?GC??Ac?FO??o@{??N`~???{}???B}?@_?^??{?B_?^_?W?F
+{?E?B~????~w???N]???Fvo??@{{???^N_??Frw??@{}???^N_??Fp{?_?{^?G?NFoA?Bp{?_?{^?K?FF_B?@pw?o?K]?M?BNfb_?Rr}{??{rfc?]G[|?N?FFoB_`o{?
+oN{B?_@~?oG???KB??AB?o??poC??N{@??B~?O??~o???F{????}?????G?o?o??K????BB|~~{?_O??G??^?MB~NoB_~~{??Br_?o?{o?[?Ng?F?@y?Bo?]_?{?Fg?N
+?@y?Bo?]_?[?F{?F??~??o?Nw?C?B~_??N{~??B~BoA?Bpw?_?[{?G?FN?A?@r_?_?\w?G?F]?B?@vo?o?L{?K?B^?B??vo?o?L{WK?B^FB_?~oo~b~wMN{~}@{??M?N
+????_D_A??@G????ENv~~oA@???`?@W??Nop?N{r_G[~o?K}w?C{w??{{??[[??W[??W[??W[???{???{?C?{?{?wN{?wN{@oN{B?N{F?N?F?G?F???N???N???N@_?F
+@_?F@_?FB_?FBg?BFk?BN}?@^~??|v{?op{??????G?W?o??]????BB|~~{?_O??Fo?\?Nb~~p~w~~{^]K?BFpr??po[w?K[BM?@F?z_?P_Ew?CW@m?@F?Z_?OoB{?CK
+?N????Bo????{????N????Bo????}????F_???@w????]????F_???@w????^????Bo????{????N????Bo????{????N_??}N{N?Nr~Bo????A?K?K??I_????o~^~~
+?GC??A??FOB~N~w^~r~}F}?@{?F_?]??{?F_?N??W?Bo?E??{?@_?N??W?Bo?F??}?@o?F_?K?@w?B??]??o?F_?K?@w?B_?^??w?Bo?E??{?@_?N??W?Bo?E??{?@o?
+N??K?@o?B??[??w?N??E?Bo?@o?{_?K?]K?@?NBo??B_^o??_@{??????G?o?o??c????BB|~~{?_O??G??^?N{NwF~~B}@~}?A?B~????^o???B{?A??]?@_?F_?[??
+w?F_?M?@W?B_?V??w?Ko?K?BM?B??p_?o?KK?K?BB?B??oW?_?[E?G?F?oA?@oK?_G[@?GAF?O??ro???K{???@n????Zo???B{????~????F_???@w????M????B_??
+????_E_C??AO????KNv~~oA@???_?Ao?~o~}F~oN~o~}F~oN}?Bo?^?@{?Bo?]??{?Bo?U??{?Bo?U??{?Bw?R??{?Bw?R??{?Bk?P_?{?Bk?P_?{?BE?oo?w?FE?oo?
+w?FB?oW?w?FB?oW?wGF@?o[?wGF@?oK?wKF@?oK?wKF?`oC?wMM?`oC?oEM?po??oEM?po??oBM?Xo??oBM?Xo??o@m?Lo??o@m?Lo??o?}?Fo??_?{?Fo??_?[?Fo??
+_?[?Bo??_?K?Bo??_?K?@o??_?K?@o??????_B?B???W????KNv~~oA@???^?AG?oN}B~oN?~wN~?o@{?B{??F_?B_??]??E??Bo??K??NA??o??{KC@??B_oO???M@b
+????oBK???B?No???G?^????_?{?????Bo?????^????_@{???B?No???K?{????WBo????o]????B`w????FN_????K{?????Zo?O???}?@?G?Bw?K?o?F??oBo?}?F
+?N{N}F{?~o^w^o??????_B?B??@w????KNv~~oA@???^?AC?~`~?~oF~F{B~?M?B?@{?w?K?@oB??o?B?K?F_?K?_?^??OA?B{?????NW????@|o????Fr?????]E???
+?BwK????N?w???@{@_???F_B????}?C???Bo?O???N??????{?????Bo?????F??????]?????@w?????F_?????]?????@w?????B_?????N????KB~@o??wN{F????
+????_A_A??@G????MNz~~oA@???S?@O?w@{?}F{?]N_?]M??MM???M???M???M??oN{?{N{?~N??Nn??Fv??Bv?KBv?KBv_KBvoKFv{E~n[B~NC?????_D_A??@w????
+ENv~~oA@???_?@K?w???~???~_??{???w???{???[???[???[???[???[???]???MFw?mN{@}MC@]K?BMG?BNG?FFG?FFG?FFG?FFG?FFK?FFk?BBk?BBk?BBm?@Bn?@
+Fn_?Nvo?|r{?oo{?????_M?@??@_????MNz~~oA@???S?@??_F~_~~Bo]N?{[@w?F_?N??{?Bo?N??{?@o?N??{?Bv?]KBw{~@~o@o???G@W?_??Q????@b|~~{?_O??
+G??T????F?A?FoB?Fo??F_??F_??F_??B_??B_??B_??B_??Bo??Bw?~@{B~@~B`@~b?@va?@rq?@rq??py??py??py??pz??p~??o~??Oz??Oz??Pz_?Pzo?Rr{?^bn
+B~BbBo???GB_?O??Q????Bb}~~{?_O??D??P?G?~?M@~?NBo?Fb_?Br_?Pz??Pz??O~??^~~?^~~?O{???{???[???{???{???~_?@x_?Fpw?N_^?N?F?????G@O?O??
+K????@b|~~{?_O??G??R??B_?oBw@oA}@oAN@oAF?w?F?G?B?G?B?G?B?G?B?G?B?K?B?Nw^?Nw^?K?@?K?@?K?@?M?@?M???M???M???M???M???N???F???F???F??
+?F???F_??F_??N{F?N{F?????G?g?_???????AB}~~{?_O??Fo?W????}?B}~?B~z{BFx}AB@}A@@~A@@~A?@~A?@~A?@~B??~B??}Bp?^B~?J?~?B_??B_??F_??Nb~
+?^B~@~b~Brq?Bpw?B_w?B_{?B_[?B_{?Bpy?@vz_?~b~?]?~??????A?U?G??B?????W~^~~?GC??A??DO??@oB_@oBo@oA?@o??@oA?@oA??oA??oA??oA??oA??oB?
+?oB?{ON?~O^?bo^?@o^??o^_?O^_?O^_??^_??^_??^__?^o_?\o_?Lo_?Lo_?Lo_?Lwo?Lwo?N~{p~~{p{???A?M?C??@_????o~^~~?GC??@{?AoA?@{?Fo?^?@{?B
+????????????????o?Fw?^_@w?F??]?@w?B_?M??w?B_?N??[?@o?F??[?@o?F_?~oF~?O???G?w?O??E????@b|~~{?_O??G??J???Fw?^o@w?F??]?@w?B_?M??w?B
+_?N??{?@o?F??[?@o?F_?]??w?B_?M??w?Bo?F??[?@o?F??]?@w?N{B~oK???A?c?K??B?????w~n~~?GC??@O?G_B?{O\~?Nb|r~{?~?~n{?B_@vz_?K?BNm??w?C]
+w?B_?Pz_?M??Bm??w??Mw?B_??z_?M??Bm??{??N{?@o??\o?F??@v??[??F[?@o??\o?FA?@v_?]G?F]?B~{r~~?~~rN~{B????_D_A???o????MNz~~oA@???S?@S?
+oNCB}NsF~G{Fw?[Fo?KFw?CFw?CFw??Fw??Fw??FwG?F{G?F[G?B[G?B[G?B[G?B[K?B]K?B~~K^~~K^????_A_A??@G????MNz~~oA@???S?@O??B{?oN{?{K?@]G?B
+N??FF??FB_?NBo?NBo?NBo?NBo?N@w?F@w?F@w?BB{?BB{?@Bm??NF_?}B{?w?[?????_D_A????????MNz~~oA@???\?@_??K[NwN[~{B{{??|w??\w_?^o_?No_?No
+_?No_?No_?Nwo?Lwo?Dwo?D{o?C{o?C}o?K^wG[NwNwFwN_@w???w???{???{???[???[???[???~oK?~oK??????G@??_??Q????Bb}~~{?_O??FO?R???~@k@~@nBb
+@~b?@va?@vq?@rq??ry??py??py??pz??p~??o~??Pz??Pz_?Pz_?Rzw?Vr{?^bn?NBb??B_??B_??Bo??@o??@o??@o??@o??B~?oB~?o????A?k?C??B?????w~n~~
+?GC??@O?COB?}OBw~oF{zoF_xoF?woB_?OB_?OB_??B_??B_??B_??Bo??@o??@o??@o??@o??@o??@w??B~@oB~@o????A?k?C??B?????w~n~~?GC??@O?BoB?^~@~
+}F_w[B`oNF?{?No?}?^oF}?~?BwEN?Ww@b_MN?w[Fpz~B~KB????_J?@??@_????]Nv~~oA@???[??s?_?F??K??o?B_?M??{?@{?N{^~p|o?F??[?@w?B_?M??w?B_?
+M??{?@oEF?W[@`oEF?M[?~o@}?????A?U?G??E?????w~n~~?GC??@O?Co@o_?L}{?L~}?Lwo?Loo?Lwo?Kwo?Cwo?Cwo?Cwo?Cww?C{w?C[w??[w??[{??[{??[}??[
+~_B{~o^w{o[???A?O?G??E?????w~n~~?GC??@O?DOB~wP~~wP|wo?[w_?Dw_?Doo?@oo?@oW?@o[?@oK?B_M?B_E?B_B?B_B?B_@_B?@oB??oB??oB??OB??O????A?
+E?K??E?????w~n~~?GC??@O?F_B~{[{~~~FNNrb_?O{ww?CFMJ?@?rao?OKwmGK@MHaB?VA[oo@obKK?[?pb?F?EWo@o@bK?[?Kv?F?BFoB_?P{?w?C^?M??BoB_??w?
+W??E?????G@??_??E????Bb}~~{?_O??D??W?NaN~~aN~{?BFw?B@oAF?oAF?OBM??@m???{???{???{??@}??@v?GBb?GB`?KB??^B??^b??~~_N~~_No???G@??_??
+?????Bb}~~{?_O??FO?X?N?^~_FoF~w@_?\{?G?BE?A?@p_???[K???FB???@oW???[F???F?o??b_K??Gw@??BM????r_???Ew???@{????N????Bo????[????F???
+??o????K????@_????W???wB??AN?O??roC??N{????}????????_A_A??@_????QNv~~oA@???^?@K??Fw?_N{?oKK@wG?B[G?B[G?FM??FMG?FNG?FNG?FFg?FFg?F
+Fg?FFg?FFg?FB{?BB{?BB{?BB{?BB{?BB{?@B}?@@}?@@}??@~??@v??Bf_?Bb_?F@w?~?{?{?K??????G?g?_??W????Cb|~~{?_O??F_?N???o?B_?N~?~{@o?F??[
+?@o?F??]??w?B_?M??w?B_?N??[?@o?F??[?@w?F_?M??w?B_?M??{?B~f~~^o???G?g?_??K????Cb|~~{?_O??F_?U??B{?OB~@wBBB{?@F}??Fv??Fn?@Nn?@Nn?@
+Nn??Ff??F_??Fo??FoA?BoB?@oB??oB_?OBo??@w???}???N?G?F?K?B?M?@@f??@b_??po??~z~?~~~?^~~?O???G?g?_??Q????Cb|~~{?_O??Fo?S??B}?GB~?{BB
+@}A?B~A?B~?@B~A?B~A?BoA?@oB?@oB??oB_?oBw?O@~???~??Bo??B_?OB_?oB_?oB??oB_?oz_?p~_?p~_?p~_?o~o?O^o?O~w?@x}?No^?N?F??????A?I?G??C_?
+??@G~^~~?GC??@w?D???_?K?o?K?o?K?w?C?{?C?u?C?v?C?r_C?p_C?woA?wOB?w?B_w?@ow??ow??W[??K[??E[??F[?B~~o~~~o{?]???M???M???M???M???N???
+N?B?~oN?~oK???A?I?G??C_???@G~^~~?GC??@{?D?B??Oz?~o~?~o^?~oF_^o@_??@_??@_??@_??@_??@o???o^_Ao~oBowOFoo?Lo_?Ko_?K?_?[?_?[?_?[?o?[M
+o?[No?KNo?KNw?KBw?CF{??M]??]N_B{FoBo@o??????_B_@??B?????ENv~~oA@???M??[?NBx}^fxoKB?wF@oM@oK???A?M?C??E????A_~~~~?GC???S?@O?]F`{^
+B_????A?I?G??@_???Bg~N~~?GC??As?E????M???M???F???F???B_??B_??@o??@o???w???w???[???[?_?K?_?K?o?C?o?C?w???w???[???[???M???M???F???
+F???B_??B_??@o??@oA??oA??oB??OB??OB???B_??B_??@o??@o???w???w???[???[???M???M???F???F????????_B_@??@_????MNz~~oA@???S??_?[Nbw}F_?
+????????????F`w^Fow???A?M?C??C_????w~n~~?GC??@s?AOB_?N?@{?Fo?^?????????????????????????????{?Bo?N_?}?Bo?K??o?B_?E??[??o?B_?F??K?
+????_D_A???o????ENv~~oA@???_?@W??K?N?N_^?Fo{?@w{??{{_?[[_?K?_?K?_?K?_?K?_?K?o?K?~n{N~n{No?CNo?CMo?CNw?CNw??Fw??Fw??Fw??FwG?F{G?F
+[G?B[G?B[G?B[G?B]K?B]K?B~~C^~~?^????_A_A??AO????ENv~~oA@???M?@??NF_}^Fz{^np}~FB_KE?oWB`oFB_[M?w[@owB@_???G@g?O??K????@B~~~{?_O??
+?o?J?NwF~_^~?o???G?g?_??u????@b|~~{?_O??B_?O?EB?]N?w[@owB`oEB?[M?oWB@`{}Frw^N`{}Fbo???A?}?C??B????@g~n~~?GC??@??C?B_@~_^~B~}^~x~
+~~~~~~~~~~~~~~~~~f~}^~o~}@~_@o???GA??O??W????BB|~~{?_O??I_?H?G?@o?F??[??w?B_?E??[?@o?B??M??w?@_?F??[??o?B_?M??W?@o?F??[?@o?E??w?
+B_?K?@o?F??W?B_?M??o?F??[?@_?M??w?B??K?@o?E??O???GA??O??K????BB|~~{?_O??I_?H??K?@o?F??W?B_?M??o?F??[?@_?M??w?B??[?@o?E??w?B_?K??
+o?F??[?@o?F??M??w?@_?F??[??o?B_?M??W?@o?F??K??w?B_?E??[?@o?B?LWk??@ERsxS????????????????????????????????????????????????????????
+,
+OAk??CXNRdO@????Fo???@O???@TKB?oKB?rKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????kA[??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????q@w??F[\???\G????????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??MWB??@C@???a_O??M_C??@E@O??h?S???GE??@G@_??b_W??MoE??@I@o??i?[??MwF??@KA???i__??N?G??@MAO??j?c???gI??@gA_??p_g??AOJ??@kAo??
+q_k???GK???yB???_?o??MOK??@ABO??a_s??LGL???YB_??S_w??JGM??ByB_??K_{??FON??A{Bo???`???C_O??AMC???t@???BGP??@wCO??n`C???WQ??@KC_??
+c`G??MOQ???ACo??T@K??FoR??AoCo???`O??DOS??AeD???u`O??HoT??@]D_??G@[??K?V??@_E???G`c??I?X??@?E_??H@k??MWZ??AgF???Q@s??Bo]??B}F_??
+^@{??Bw_????GO??oaC??K_a???aGo??paK??A?c??BCH???FaS??I?d???{H_??wAW??C?f??A]Ho??Ma_??Igg???CIO??fAc??NWh??@OI_??qAg??B@AAThYUdhT
+KB?oKB?rGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBKoKBHRQr?oPs[??????GB_?O??E????NB|~~{?_O??Do?P?G?B?K?F?K?F?K?E?K?E?M?M?M?M?M?M?M?M?E?K?F?[
+?F?[?F?[?F?[?F?[?N_~?N_~?N_~?B_w?Bpw?F~{?V~{?V~{?O????A?w?C???????Bo~^~~?GC??@[?COB~FoB~^oB~~o?w{??wo?Cwo?Cwo?Cwo?Cww??w~?Bw^oBw
+^oBw~o?ww??wo?Cwo?Cwo?Cwo?Cww?Cw{?B~~oB~^oB~No??????_M?@???o????{Nv~~oA@???V??{?wF^w^~`~~Fo}]@xwFf?N[?{?@o?F??[?@o?F??{?Bv?][@xw
+Nfb{NN_~}@~_@o???GB_?O??E????NB|~~{?_O??Do?P?N{F?N{^?N{~?@p{?@pw?@ro?@r_?@r_?@r??Pr??Pr??Pr??Pr??Pr??Pr??Pr_?Pr_?@ro?@pw?@p{?N{~
+?N{^?N{F??????A?w?C???????Bo~^~~?GC??@[?C_B~~oF~~oF~~oCwo?Cwo?Cwo?Cwo?Cw???wF??wF?BwFoBwFoBwFo?wF??wF??w???w_?Kw_?Kw_?Kw_?N~~oN~
+~oN~~oK?????_M?@???W????{Nv~~oA@???V?@C?~~{@~~{@~~{@MK?@MK?@MK?@MK?@M???M@o?M@o?}@{?}@{?}@{?M@o?M@o?M???M???M???M???M???~oC?~oC?
+~oC??????GB_?O??E????NB|~~{?_O??Do?P?F~{?V~{?V~{?Ppo?@po?@po?@po?@po?@po?@po?Np~?Np~?Np~?@po?@po?@po?@po?@po?@po?@po?F~{?V~{?V~{
+?O????A?w?C??B????Bo~^~~?GC??@[?BoB~^~|~~v~??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@~v~~^~|~????_M?@???W????{Nv~~oA@???V?@??
+^~x~~f~}FBw[F`o^f?}[@|oF~?N{?~oF~?^{@roNN?{[F`o]FBo[NF~{^~p~~????GB_?O??E????NB|~~{?_O??Do?P?N{B?N{B?N{B?B_??B_??B_??B_??B_??B_?
+?B_??B_??B_??B_??B_??B_??B_??Bb??Rb??Rb??Rb??^~~?^~~?^~~?O????A?w?C???????Bo~^~~?GC??@[?Co@~{?\~{?\~{?^[u?F[u?F[u?F[u?F[vOF[vOE[
+rOE[rOE[rOE[roC[poC[poC[o?C[o?C[o?C[o?C[o?D~{?\~{?\~{?[?????_M?@???W????{Nv~~oA@???V?@C?^~o@^~o@^~o@vF??vF??vF??vF??vFC?fFC?fFC?
+fFK?fFK?fFK?FFK?FFK?FF[?FFW?FFW?FFW?FFW?^vo?^vo?^vo??????GB_?O??K????NB|~~{?_O??Do?N?N_N~b~}NowwBv_F[?\o@v?F[?\o@v?F[?\o@v?F[?\o
+@v?F[?|wFbr}N~w~}?{???A?w?C???????Bo~^~~?GC??@[?COB~FoB~^oB~~o?w{??ww?Cwo?Cwo?Cwo?Cwo?Cww?Cw{?Bw~oBw^oBwFo?w???w???w???w???w???w
+??B~?OB~?OB~?O??????_M?@???W????{Nv~~oA@???V?@G?~o[?~o{?~p{?FBo?FF_?FF??FF??FF??FF_?FBo?~@{?~@{?~@{?FBw?FBo?FB_?FB_?FB_?FJ_BFN_B
+^~_B^~_B^~?@?????GB_?O??K????NB|~~{?_O??Do?N?N_~~B~}Np{~BroFM?[wBo?^?Nw?~_~wF{?~?Fo?]?@o@v?F[?|wNvr~N~{^|o{???A?w?C??@_???Bo~^~~
+?GC??@[?COB~~oF~~oF~~oEFooEFooEFooEFooE??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oBoFoBoFoBoFo??????_M?@??Bg~~~~{Nv~~oA@
+???V?@S?~~C^~~C^~~C^MG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?BMG?B]K?B}M?B{NC@{N{@wN{?_B{??????GB_?O??E????NB|~~{?_O??
+Do?P?F~{?V~{?V~{?Ppo?@po?B_w?B_w?B_w?B_w?B_w?F?[?F?[?F?[?F?[?E?K?M?M?M?M?M?M?K?E?K?E?K?F?K?F?G?B??????A?w?C???????Bo~^~~?GC??@[?
+Co@~{?\~{?\~{?[[o?C[o?C[o?C[o?C[o?CWo??WpoAwzoAwzoAwzOAwzOAwzOAwzOAwzOAoZOAoZOAoY?Bo]?Bo]?Bo]???????_M?@???W????{Nv~~oA@???V?@C?
+^~w?^~w?^~w?]@o?[@w?{?w?w?{?w?[?o?[?o?K?_?K?o?K?o?[?o?[?w?w?w?w?[@w?[@o?MBo?MB_?^~o@^~o@^~o@?????GB_?O??E????NB|~~{?_O??Do?P?F~{
+?V~{?V~{?Rpw?B_w?F_{?F?[?F?[?M?M?M?M?K?E?K?F?K?F?G?B?G?B?G?B?G?B?G?B?G?B?G?B?M?N?M?N?M?N??????A?w?C??B????AW~n~~?GC??@??COB{@oB}
+FoB}Fo?]N_?]N?A?NoBwNoB}NoB~MO?^M??FM??NN??^NoB~~oF}~oF{}oC???A?w?C???????Bo~^~~?GC??@[?C_?~???~???~???w???w???w???w??Aw^oBw~oBw
+~oFw{OFww?Lwo?Kwo?Kw_?Kw_?Lwo?Lwo?Nww?Nw}OFw~oFw~oAwNo??????_M?@???o????eNz~~oA@???O??{?w@~wN~o~^bo]N?{?Bo?F??[?Bo?N[Bxw~fr{N~_~
+w?{???A?w?C??B????AW~n~~?GC??@??BoBoB~_^~B|}N`|wBvb~^~|~~v{N??|oNfb}^No~}@~_Bo???GB_?O??E????NB|~~{?_O??Do?N??@}_F~?^{@~oFf??[?@
+~v~~^~|~o?F??[?@o?F??[?@o?F??[?@o?F}N~w~~b{???A?w?C??@_???AW~n~~?GC??@c?COBo~oFw~oF{~oC}~_C]N??MM??MM??]N??}N_B}FoB}BoB}@o?]??B}
+NoB}~oB}~o?^}?CNw?CFo?CFo?CNw?C~}?F}~oB{^oBoFo??????_M?@????????{Nv~~oA@???V?@K?No??No??No??M???M???M???M???mB{?}F{?}N{?}NC?]M??
+]M??MM??MM??MM??MM??MM??MM??MM??~~cF~~cF~~cF?????GB_?O??Q????Lb|~~{?_O??E??N?M?@w?F_?]?@??????????B~?^{@~oF??[?@o?F??[?@o?F??[?@
+o?F??^|~~v~~^o???GB_?O???????Hb}~~{?_O??C??R?N~z?N~~?^~~?^r~?RrN?PrF?PrF?PrF?PrF?PrF?PrF?PrF?PrF?V~^@v~^@v~^@o???GB_?O???????Hb}
+~~{?_O??C??R?J{~?N|~?N~~?Nbp?Fb_?Fb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?Bb_?N~x@~~x@~~x@o???GB_?O??K????Hb}~~{?_O??C??N?M?B}?~{Fpw{Bb_N]?\o
+@v?F[?\oBv_MMBw}~@~wB}?B????_M?@????????eNz~~oA@???W?@G?nv{?~~{?~~{@}NC@}M?B]K?BMK?BMG?BMG?B]K?B]K?B}M?B}Nc@}N{@}N{?mB{?M???M???
+M???M???M???~oC?~oC?~oC?????_M?@????????eNz~~oA@???O?@G?~~oB~~{B~~{BwG{Bw?[?w?K?w?C?w???w???w???w???w???w???~r{?~r{?~r{?????_M?@
+???o????eNz~~oA@???O??{?}@~}F~{^FpwFF@{?~oN}F~?~?FwF]?|wFvr~^~{~~o{???A?w?C??@_????_~n~~?GC??@S?BoB_?M??w?B_?M??~r~~N~{~w?B_?M??
+w?B_?M??wFB_[M@xwFf_N{?~_?{???A?w?C??@_???AW~n~~?GC??@??COB~~_F~~_F~~_C[[??[[??[[?B[\oB[\oB[\oB[\_BWL_BWL_BWL_BwN_@wN?@wN?????A?
+w?C??B????Bo~^~~?GC??@[?BoB_?~?F}?{{F`o[Bb_MM?\o@v?F[?\o@v?F[?\o@v?N]?wwBb_[FBo]}?~o@}?B????_M?@??@_????{Nv~~oA@???V??o?o?B_?N??
+}?B}?N{?~oBf?M??w?B_?M??w?B_?M??w?B_?M??w?B_?N{N~o~~Bo???GB_?O??K????NB|~~{?_O??Do?N?N_F~@~}Np{~BvoN]?|oBv??[?@w?Fo?N??]?@~?B}?F
+{?Fw?FpoNfB~^~|~~v{???A?w?C??B????Bo~^~~?GC??@[?BoBw@~o^~`{]N`w{Fb_?N??{?B~_F}?Nw@{?N_@{?F_?[?|oBv_N^@{}~r~}F~_F????_M?@???W????
+{Nv~~oA@???V?@C??@{?_@{?_@s?o@s?w@o?w@o?{@o?[@o?M@o?N@o?F@o?F`o?Bpo?~~{@~~{@~~{@?@o??@o??@o??@o?oN{@oN{@oN{@?????GB_?O??K????NB|
+~~{?_O??Do?N?Nw~~b~}Now?B_?M??w?B_?M?NwF~`~}Nrw}Bf_?]?@oBv?N]?|{Frz~N~w^}?[???A?w?C??B????Bo~^~~?GC??@[?BoB?F~?~}B~{NFo{Fbo]??{?
+BoN~F~{~~r{^^?|wBv?N[?|oBf_]^Bw}~B~wF~?F????_M?@???o????uNv~~oA@???W??{?@oB~^~|~~v{F^?[}?@{?Bw?F_?^??{?Bw?F_?]??w?Bo?N??[?@o?F??
+[?@o?F??????_M?@???o????{Nv~~oA@???V??{?{?^wB~w~FboN]?\o@v?N]@w{~@~o@~_NFboMM?\o@v?F[?\oBv_]NNo^}?~_?o???GB_?O??K????NB|~~{?_O??
+Do?N?N?F~?~}Frw}FroNM?\w@v_F]?|wFvr}^~x~~F|_]?@w?Bo]N@w}f`~}B~wF~?C???A?w?C??B????Ag~^~~?GC??@s?BoB??[?@o?FoB~o^~b~~^{|xpvfF][|x
+voF}?^wN}@~?N{@|rvfN[[|prvfN]^|~~b~{F~?Fo?F??[?@????_M?@??Ag????gN~~~oA@???D??S?Fp{^Fp{?????_M?@???o????iNv~~oA@???\??{??F??[?@w
+?F_?N??{?@w?F_?N??}?@w?Fo?N??{?@w?F_?^??{?@w?F_?N??{?@w?F_?N??{?@o?F?????GB_?O??i????Hb}~~{?_O??C??D?@{^Fp{^????????Fp{^Fp{???A?
+w?C??@_???AW~n~~?GC???c?COB~~oF~~oF~~oC???????????B~~oF~~oF~~oC?????_M?@??Ag????iNv~~oA@???\??k?~o^~@~{F@o?F??[?@o?F??[?@o?F??[?
+@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F?N{F~o^~@o???GB_?O??E????Ib|~~{?_O??FO?J?N{F~o^~@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F
+??[?@o?F??[?@o?F??^~@~{F~o[???A?w?C??B????Ag~^~~?GC??@s?Bo?F??[?Bo?N?@w?F_?{?Bo?]?@w?N??{?B_?]?@o?F??{?B_?]?@o?N??{?F_?]?Bo?N?@w
+?F_?[?@o????_M?@???o????ON~~~oA@???M??{??u?BW?L_?u?BW?L_?u?BW?L_?u?BW?L_~v~~^o???GBo?o??K????Mb{~~{?_O??G_?d????B_?????M?????@{?
+????Fo?????^????_B{???A?No???K@~????oF{???B?^o???EB~????WNw???@o~_C??BB{?O??KNo@???W~?K??@bw?o??FN_F???K{?[???ro@o??@n?N???Ew?{?
+??^_Fo??~~{^??B~~p{?_?E?NoA??W?~?K?@_F{?o???^oB???@~?E???Nw?W???~_B~@~B~F~{F{N{^????_K?B??@G????yNr~~oA@???a?AC??M@~_?C?~N~B?OB~
+_M[@oB{?~_F_BoBw?^?F?N?@}?K?{?Fw?OB_?^o@?K?@~_??o?F}??B??^w??G?@^o??_?D~?????F{?????^o????@~?????F{?????^o????@~?????F{?????^o??
+??B}??A??^w??G?@~_??_?F{?OB??^_@?K??}?K?w?Bo@o@o?M?N?B_?oB{?F???~w?N??B{~oK??MB~??????A?A?O??B????Bg~N~~?GC??AG?HOB~~~{@?N~~~o{?
+w?~?NoB_Bo@}?M?N?No?w?{?}?F_BoBo?}?N?M?Fw?{?w?^_BoB_B}?N?K?Nw?{?o?~_BoB?B}?N?K?^w?{?o@~_BoB?F}?N?K?^w?{?o@~_BoB?F}?N?K?^w?{?o@~_
+BoB?F}?N?K?Nw?{?o?~_BoB?B}?N?M?Fw?{?w?^_BoBo?}?N?N_@w?{?~?B_Bo@}?M?NoB{?~~~~BoB~~~{@?????G@w?o??K????Mb{~~{?_O??G_?_?N~~~r~~~~{~
+w?{?N}?N?Br_Bo?ww?{?KM?N?FB_Bo@ow?{?WM?NEEB_Bp`_w?{WWM?NE?B_Bpo?w?{]?MB~FoB_~p{?w?{]?M?NF?B_Bp_?w?{W?M?NEKB_Bpb?w?{?oM?N?EB_Bo@_
+w?{?WM?N?FB_Bo@ow?{?]M?N?Fr_Bw?~~~~~N~~~~r{???A?Q?K??B????Bg~N~~?GC??AG?F_B~~~{^~~~~F}?N_@~_Bo?]w?{?FM?N?@b_Bo?ww?{?MM?N?BB_Bo?o
+w?{WKM?NEBB_Bp_?w?{W?M?NF?B_Bpw?wN{^?MB~FoB_Bpw?w?{[?M?NE?B_Bp_?w?{W?M?NE?B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??N~~@oB~~o[?
+????_A?C??@G????yNr~~oA@???a?AW??KB~??K?~N}F?oB~?[{B_B{?~?N_BoBw?~?F?N?B}?K?w?Nw?OB??~o@?G?B~_??_?N}??A??~w????B^o????L~?????F{?
+????^o????@~?????F{?????^o????@~?????F{?{N{~^oBo~r~}??Bw?~w??N_B~_??}?N{?OBw?~_@?N_B}?K?}?No@oBw?}?N?NoB_B{?~?K?~oF~?oB{~{[B?KB~
+??K???A?}?C??@_???Bg~N~~?GC??AG?CoB~~o^~~o^?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?
+FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB?FoB~~o^~~o[???A?K?K??B????Bg~N~~?GC??AG?FOB~~o[?~~{F?M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??
+w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo?Ww?{?EM?N?@b_Bo?Ww?{?FM?N?@r_Bo?Mw?{?Bm?N??~_Bw?Nw?~_B~~~~o~~~~{N
+????_N_C???o????yNr~~oA@???a?B??~o{??NB~~p{??Nb~w@{??N_FWB{??MoFWB{??MoFWB{??MoFWFw??MWFWFw??MWFWNo??MKFWNo??MKFWN_@_MCFWN_@_MCF
+WN?BoM?FWN?BoM?FWN?BoM?FWM?FWM?FWM?FWM?FWK?NKM?FWK?NKM?FWG?^EM?FWG?^EM?FWG?^EM?FW??~BM?FW??~BM?FW?@}@m?FW?@}@m?FW?B{?}?FW?B{?}?F
+W?Bw?]?FW?Bw?]?FW?Bw?]?FW?Bo?M?F~o~o?N~~~o|_?N~~????_A?C???o????yNr~~oA@???a?A[?~p{?}F~~NoBw^}@~???BwN{???L_~oC??uB}?O?BWNwB??L_
+~?[??uBwBo?BWN?^??L_w@{??uB?No?BWK@~??L__N{??u??~oCBW?B}?oL_?NoB?u??~?[BW?BwBoL_?N?^?u??wB{BW?B?NoL_?G@~?u??_N{BW???~oL_??B}?u??
+?NoBW???}?L_??Bw?u???N?BW???w?L_??B??~{N?G?B~o{???K???A?{?K??C_???Bg~N~~?GC??AG?Go??wB{???B{~oC??B~_@oB?Bw?^?M?F?B{?{?K?^_Bw?OB{
+?N_@?No?~???}?F{??Bw?^w??N_B^_??{?L}??Bo?v{??N?F^o??{?\~??Bo@v{??N?F^o??{?\~??Bo@v{??N?F^o??{?\~??Bo@vw??N?B~_??}?N}??Bw?~o??N_@
+~?C?~?Fw?OB{?N?B?Fw?w?[?NoB?Bw?^???~w?[??Nr~?O??wB{??????GAO?o??K????Mb{~~{?_O??G_?_?N~~~oB~~~{Fw?~_B}?N_B~_Bo?~w?{?^m?N?Fz_BoB}
+w?{?~m?N?Nz_BoB}w?{?~m?N?Fz_Bo@}w?{?N}?N_B~_B}?NwN~~@}B~~oB_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??
+~~{@?N~~?O????A?{?K??C_???Bg~N~~?GC??Ao?Go??wB{???B{~oC??B~_@oB?Bw?^?M?F?B{?{?K?^_Bw?OB{?N_@?No?~???}?F{??Bw?^w??N_B^_??{?L}??Bo
+?v{??N?F^o??{?\~??Bo@v{??N?F^o??{?\~??Bo@v{??N?F^o??{?\~??Bo@vw??N?B~_??}?N}??Bw?~o??N_@~GCN~?FwoP~{?NBbMFw?wE\oNoB?Z}?^??B~w?[?
+?Nr~?O??wN{@@???o?KC??A??oW??G?N@o??_N{F??A?~o[??GB~?o???N{B????~oC???B}?O???Fo?????_N?B???o????yNr~~oA@???a?A[?~~|~??B~~~{B?M?N
+w?{?w?}?FoB_Bo?~?M?N?Fw?w?{?~_B_BoB}?M?N?Nw?w?{?~_B_BoB}?M?N?Nw?w?{?^_B_Bo?~?M?N_@{?w?~_BoB_~~{B?MB~~oK?w?~wBoB_B}?^?M?No@{?w?~?
+NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B|_w?}?^vB_BoB~]N~~?^w~~~{@{@{???A?y?G??C_???Bg~N~~?GC??AG?E?B?^rBo~rfwoB|{
+?B{}?Bw]?Bo^?B_^?B_^?B?~?B@~??B~??B~BoB}~oB}~o^{~o~w~p~o~r~?~v{?~f{?oN{??N{??Nw??NoB?N_B?N_B?N_F?N_F?F_N?Fo~?Bz~?P~f~o{B~oK???A?
+i?K??B????Bg~N~~?GC??AG?G_B}~~~~?^z~~~{@^k?^{?C]o@~_?Oz?F{?@@k?^_?CFo@}??o^?Fw?B?{?^??KBo@{??oN?Fo?B?{?^??K?o@{???B?Fo???K?^????
+o@{???B?Fo???K?^????o@{???B?Fo???K?^????o@{???B?Fo???K?^????o@{???B?Fo???K?^????o@{???B?Fo???K?^????o@{???B?Fo??oN~~FoB?~~{^????
+?G?G@???K????Mb{~~{?_O??G_?e?N~~?^o~~~{@~B~_BoA??]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F_BoA?
+?]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F_BoA??]?N?G?@w?{?_?F?BoB??[?^?K??_@{?w?A?No@o??@~?Bo??No@Fo??{N{N??A?~oC?
+????_N?B???W????yNr~~oA@???a?A[?~~{@{F~~~oFo^}?N???Bw@{???N?FoA??[?^?G?@_B{?o?A?NoB??G@~?M???F{?W???~o@_??B}?B???Nw@K???~?CW??B{
+?P_??NoBF???}?KK??Bw@oo??N?F@_??{?{E??B_BoK??M?N?o??wH{B??B?foC??KA~?O??_N{???A?~o????@~?????F{?????^o?????}?????Bw?????F??????[
+??????A?[?S??@_???Bg~N~~?GC??AG?LoB~~~B~B~`~~~~o~o~w^~?N?N{???^_BoB}???Bw?{?~_???{?^?Nw@_?F?FoB{?W?@oB{?~?F??W?~?NoBo?A?NoB{?{??
+?F{?~_\_??@~?NWFW???~oBu@u???Nw?wo{o??B}?MKNK???~_FbFr_??Nq@oP{W??B{_[C^E???}KN@Noo??NbB_B{K??Bwpw?~B???{E[?^oW??N@f?F{E??BoZoB~
+@o??wB{?~_K??M?~?NwB??B?NoB}?O??o@{?~?C??K?^?No@??A?BoBw????_?{?}??????N?F_?????@o@o??????[?[???????_G_A???o????ANz~~oA@???U?@_?
+wF{?}N{@~N?B~M?F~M?N~K?N]K?N?K?N?K?N_N{N{N{N~K[N~k?N^k?N^{?NN{?NN{?NN}?N^~?N~n_^~J~~{?~~????_M_A???o????sNr~~oA@???b?@g?~oC??N{@
+??Bw?O??}?C??N_@??Bw?O??}?C??N_@??Bw?O??}?C??N_@??Bw?O??}?C??Nbp@oBw~R{?}?|}?N_B~?Bw?^_@}?Fw?^_@{?Fw?^?B}?Fo?~_@{?Nw?^?B}?Fo?~_@
+{?Nw?^?B}?Fo?~_@{?Fw?^_@}?Fw?N_B~?BwBv{?]Nw^?Bbw@o????A?U?G??B?????G~n~~?GC??@W?D?A?~oF_~o^woo~{o?|{o?|}o?{}_?[~???~???~???~???~
+???~???~???~??@}??@}??B{??r{?Ozw`o^_~oM?~o????A?y?G??B????BO~N~~?GC??AK?E_??oF{??K@~????^_???Fw???@}????^_???Fw???@}????^_???Fw?
+??@}????^_???Fw?_F|}?MB~^oBwov{?~?@~?Fo?^_@}?Fw?N_@}?B{?^_?~?Fw?No@}?B{?^_?~?Fw?No@}?B{?^_?~?Fw?N_@}?Fw?^_@{?F{?~G@~?Nb@^oBo~~wB
+_B~}?o???G@o?_??K?????b}~~{?_O??D_?T?G@~?MB~?^b`@~r?@vq?Bvw?Brw?Fr{?Fr{?F~~~F~~~Fr{??B{??B{??B{??Fw??Fw??No?EN_@FN?FB}B~@oB~?O??
+?GAW?O??E????LB{~~{?_O??Go?R??B{?WB~?{Bn@}Bf@}Bf@~Bb@~BB?~?B?N?B?N?B?N?B?N?B?N?B?N{~?N{~?N?B?N?B?N?B?N?B?N?B?N?B?N?B?N?B?N?B?N?B
+?N?B?N?B?N?B?N?B?N?B?N?B?N?B?N?B?Nw~?Nw~??????A?g?G??@_????G~n~~?GC??AC?EOA?^~_?wN~~?^B`zoFwoM[@^GBN?Fq?Bo@{_?{?^G?N?Fq?Bo@{_?{?
+^G?N?Nb?@oBowOK?}N{@?J`~???W????M????F_???Bw~o[?}N{~?Nb~^oBo~~{?~N~~?Fw?~_C~?N_@FoBo?P{?{?C^?N?@NoBw?Vw?~?B{?V{?{N{^?GB~?o????A?
+y?G??B????BO~N~~?GC??AK?E_B~?O??~oC??N_@??Bw?O??}?C??N_@??Bw?O??}?C??N_@??Bw?O??}?C??N_@??Bw?O??}MCN?NbxNoBwFr{?}?|}?N_F^_Bw?vw?
+}?L}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_B~b~{B~w~~?o???GA??O??E????Jb{~~{?_O??H??K?N_?~?F{?^o@
+~?F{?^_???????????????????B~?^{@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@~o~~Bo???GA??O??E????LB{~~{?_O??Go?K?N{@~oFw?^_@
+}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^{N~o{???A?Y?O??B?????G~n~~?GC??@W?I_B~wP~oBoB~}R~{
+FoBwNVw]NoBwB~wF^oBw@~oB^_Bw?~o@^_Bw?~o@^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?^_Bw?^o?
+^_Bw?^o?^_Bw?^o?^_B~b~~F~oN~b~~F~oK???A?y?G??B?????G~n~~?GC??@W?E_B~wO{?~~c~?N_^NoBwBvw?}?\}?N_B^_Bw?vw?}?D}?N_@^_Bw?Vw?}?D}?N_@
+^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N}N~oN~b~{B????_I?A???o????ANz~~oA@???U?@[??F{?wN{B{KCF]??N^??^N_?}N_?}N_?}No@}No@}
+No@}No@}No@}No@}No@}N_?}N_?}^??^}G?N{KCFwN{B?F{?????_M_A???o????ANz~~oA@???_?@g?~~CF?N~|NoBwBv{?}?N{?N_@~?Fw?^_@}?Fw?^_@{?Nw?^?B
+}?Fo?~_@{?Nw?^?B}?Fo?~_@{?Nw?^?B}?Fw?^_@}?Fw?^o?}?N}?N_N^oBw~p{?}NcF?N_@??Bw?O??}?C??N_@??Bw?O??}?C??N_@??Bw?O??~o{??N{N??????A?
+I?G??B?????G~n~~?GC??@W?CoB~}?F~~_Nwz_^wxo^wwo^wwo^woONw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OBw?OB~FoB~Fo????A?C?G??B??
+???G~n~~?GC??@W?COBovoB{~o?}}??]w??No??No??^??B~??B~FoB}NoB}^oBw~oBo~oC?~_CB{?CB{?CFw?CNw?C^{??~}?B~^oBbFo????A?C?G??@_????W~^~~
+?GC??A??CO???o???o???o???oA??oA??oB??oB_?oBo?oBw?oB~~oB~~oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo_oFo_oFo_oFo_oFo_oFopoF_
+xoB?~o??No????A?y?G??B?????G~n~~?GC??@W?E_B~oV{?~{D~?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?}?D}?N_@^_Bw?Vw?
+}?D~?N_@^oBw_V{?{KL~?NB~~_N?N~wBOAk??CXNRdO?????????????????????????????????????????????????????????????????????????????????????
+,
+OB{??CXNRdO@????Fo???@O???@TKB?oKB?rKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????kBk??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????prG??Ekr??@jLO???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??N_B??@}@???z_O??GWD??B}@O??\_W??MwE??@e@o??v_[??DWG??A?A???g?_??COH??AOAO??k_c??NwH???KAo??E_o??A_L???uB_??F?{???GO???OCO??
+F`G??JGQ??AWCo??}@O???WU???SDo??}`[??D?X??@]E_??E`k??AG[???oFO??Y@w??NG^????GO??`AC??Ewa??BqG_??vAK??E?c???_HO??uAS??KGe???oHo??
+{A[??Dog???qIO??sac??DWi???qIo??fAk???Wk??AOJ???KAs??Mgl??BEJ_??]a{???_o??A{K???[BC??Dgq??ACK_??GBK??LOr??@kL???ABS??I?t??@wL_??
+mBW??B?v??BCLo??Eb_??HGw???MMO??\bc??MWx??@UM_??dbg??Mgy??@YMo??Dbo??IW{??BCN???ybo??FG|??BcNO??ZBw??Ho}??BKN_???b{??B?{AThYUdhT
+KB?oKB?rGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBKoKBHRQr?oPs[??????GBO?_??E?????b}~~{?_O??D_?Z?N{N}?^~B~_F{?N_?N?BW?Bo@v??w?[o?M?NM?B?Bp_?
+o@{W?G?^B?A?Foo??B{E???~@_??^_K??FwB??B}?o??~?C??No@??Bw????}????F????@o??????A?o?K??@_????G~n~~?GC??@W?HOB~p~~`F~~F~}C^}?C}??No
+?ry??^?B^g?@{?\}_?F_@~z??M?F}{??w?~zw?B?B~l`?KAN{UC?_H~pKoA?v~Cr?GB~wBk??N~_Fo??^{?^??@}o?{??Fz?Bo??Ng?N???{_?[??@o?@o??E??B????
+?GBO?_??E?????b}~~{?_O??D_?Z?N{N~_N~B~wB{?Kw?M?FF?B_Bow?o@{F?G?^?o??noC??Nw???B}????~????N_@??B{?o??~?[??MWN??BFBoA?_p{?oGC~?M??
+^o@o?Fw?~wF~@~}@~o[???A?s?G??@_????G~n~~?GC??A??EoB~B~_F~o~w@~?Bw?Bo?u??{?\o?M?FK?B_Br_?o?{W?K?^E?A?Foo?_@{K???~@_??NoW??FwB??@}
+?o??~_K??No@??B{?O??}????N_???@o????[????B?????o????E???F`_??B{[???~B???NoW??HWB??B}?O??}????????GA_?_??K????@b|~~{?_O??G??V??@~
+?MB~?~B@@~a?Bvo?Fvo?Frw?Nbw?Nbw?Nb{?Nb{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^b{?^bw?Nbw?Nbw?Nfo?Fvo?F~a?B~B@@}B~?o@~????
+?GA_?_??W????@b|~~{?_O??G??R???W???]?G?^?N{^?N{^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^?G?^
+?G?^?G?^?G?^?G?^?G?^?Nz~@~z~@o???GA_?_??Q????@b|~~{?_O??G??T?K?~?Nb~?Rrw?ozo@r~_Bv~?Bv~?Fv~?Fv}?Fry?Fpr?FoB?FoB?BoB_BoB_@oBo?oBo
+?OBw??@{???}???^?G?NEG?BEK?@EM??EF??FNb~B~r~B~z~B~~~B~~~B~~~Bo???GA_?_??K????@b|~~{?_O??G??V?GB~?MB~?~b_@vb?B~r?F~q?F~q@F~q?F~r?
+FvB?FoB?BoB_BoBo@oBw?WB~?GB~??B_@oB?FoA?No??No??^o??^rw?^v{?^v{?^v{?^v{?Nv}?Npz?Fvr_B~b~@{B~?????GA_?_??K????@b|~~{?_O??G??V????
+@oA?@oB?@oB?@oB_@oBo@oBw@oBw@oBk@oBm@oBf@wBb@wB`@{B_@}B_@vB_@rB_@pb_@pr_@oz_@o^_@~~~^~~~^oB_@oB_@oB_@oB_@oB_@oB_@oB_@oB~^oB~^o??
+?GA_?_??Q????@b|~~{?_O??G??T?@_?@fb?@~b~@~b~?~b~?^b~?N_~?L_F?@_??@_??@_??@_??H`~?Nb~?^bo?rb_@pb?BoB?BoB?FoB?FoB?Fpz?Fr~?Fr~?Fr~?
+Fr~?Fr~?BoZ_Bpzo@rrw?~b~?M?~?????GA??O??W????LB{~~{?_O??CO?G?Bx~^~~~~~z?oM@_[F?wF?wE?????GA??O??W????FB~~~{?_O??@o?F?Bx~^v|~^rw?
+????_M_A???W????sNr~~oA@???b?@k??N?^??B}NoA?Nv_?o?~w?M?F~?Bo@~o?{?N{?N?B~?Bo?r??{?K??N?B??Bo?o??{?K??N~~~oB~~~{?{?N{?N?B~?Bo?~o?
+{?N{?N?B~?Bo?~o?{?N{?N?B~?Bo?~o?{?N{?N?B~?Bo?~o?{?N{?N?B~?Bo?~o?{?N{?N?B~?Bo?~o?~_~~@~wN~o[???A?m?G??B????BO~N~~?GC??@C?D??}w?L~
+{?\~{?^~{?~~{?~~{?~}w?~???r???r_??x_??Xo??\o??[w_?K[o?CMw??EW???????_K_@???W????qNz~~oA@???D??w?~r~~N~{~~r~~No???GAw?_??c????LB{
+~~{?_O??CO?S?E??@f??@ra??pr??Oz_??z_??X_??\o??Ko??Ko?F~o@~~oB~~oB~~oB~z_B~z_Bvr?@o????A?w?O??B????@?~N~~?GC??Ac?Jo???K?@?????M?B
+?????M?B?????N?F?????N?F?????N?F?????N_N?????N_N?????No^?????No^?????No^?????Nw~?????Mw~?????M|~?????K\~?????K\~????_GN~????_GN~
+????oGN~?O??o?F~?O??w?F~?o??w?B}?o??w?B}?o??[?B}@o??[?B{@o??]?B{Bo??M?BwBo??}N~~Bo??~N~~Fo??~N~~Fo??F_BoNo??B_B_No??B_B_No??@oB_
+^o??@oB?^oA?@oB?~oA??oA?~oA??oA?~oB~^oB{~v~~^oB{~v~~^oB{~v{???A?e?O??C_???@?~N~~?GC??Ac?IOB~~~{~??B~~~~~?OB~~~~~@oB?NoBwBoB?NoB_
+FoB?NoB_NoB?NoB?NoB?NoB?NoB?NoB?^oB?NoA?^oB?NoA?^oB?NoA?^oB?NoB?^oB?NoB?NoB?NoB?NoB?NoB_FoB?NoBoBoB?NoBw@oB?NoB}?oB?~~~~??B?~~~~
+@oB?NoB_BoB?NoB?NoB?NoA?^oB?NoA?^oB?No??~oB?No??~oB?No??~oF?No??~oF?No??~oF?No??~oF?No??~oF?No??~oF?No??~oB?NoA?~oB?NoB?^oB?NoB_
+^oB?NoBoNoB~~~~~BoB~~~~~?oB~~~|~??????A?k?O??E????@?~N~~?GC??Ac?IO???Nw^o?C?wN~~w?C?}N~~{oC?~`~o~oE?~oN?~oF?~o??~oF_^o??~_FoFo??
+~?FwBo??}?FwBo??{?F{@o??w?F{@o??w?F}?o??w?F}?o??o?F}?o??o?F~?O????B~?O????B~?O????B~?O????B~?O????B~?O????B~?O????B~?O????B~?O??
+??B~?O????B~?O????B}?o????B}?o??o?F}?o??o?F{@o??o?F{@o??w?FwBo??w?FwBo??{?BoFo??}?B_^o??^?B?~o??^_A?~oM?No??~`~oBo??}N~~@o??wN~~
+?O???Nw~??????A?}?O??C_???@?~N~~?GC??Ac?JOB~~~{^??B~~~~~?OB~~~~~@oB?^oBwFoB?^oB_NoB?^oA?^oB?^o??~oB?^o??~_F?^o??~?N?^o??}?N?^o??
+}?^?^o??}?^?^o??{?~?^o??{?~?^o??{?~?^o??{?~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??{@~?^o??
+{?~?^o??{?~?^o??{?~?^o??}?^?^o??}?^?^o??}?N?^o??~?N?^o??~_F?^o??~_B?^oA?^oB?^oB?NoB?^oBwFoB~~~~~@oB~~~~~?OB~~~{~??????A?M?O??C_?
+??@?~N~~?GC??Ac?HoB~~~~~@~~~~~{F~~~~~o^?^oBw@{@~?M?NoF{?_?~?^o??B{@~???NoF{???z?^o??Bk@~???MoF}??pz?^w?BFK@~_?K[oF}??pr?^{?B?K@~
+o?K?oF~o?oB?~~{B?KB~~oK?oN~~?oB?^~?B?K@~o?K?oF~??oB?^w?B[K@~_?LooF}??vB?^w?BMK@~???woF{??Bb?^o??MK@~???{oF{??@r?^o??Fk@~???^oF{?
+_@~?^oB?F{@~?N_^~~~~~o~~~~~~B~~~~~{N?????G?G@???Q????CB{~~{?_O??IO?c?N~~~~{B~~~~~oN~~~~~?{@~?NoBoF{?{?^?^oB?@{@~?G?FoF{?_?^?^o??
+@{@~???FoF{???^?^o??B{@~o?CMoF~??Oz?^{?@Bk@~o?C?oF~??OB?^}?@?K@~{?C?oN~~?OB?~~{@?KB~~oC?oF~o?OB?^}?@?K@~o?C?oF~??OB?^{?@?K@~o?C?
+oF~??OB?^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B~~v{??N~~^o??~~|~????????_@?D??@_????ONr~~oA@???h?As???B~B}??
+?MB~^~???Nr~~~c??Nw^}N{?_N{BoN{?oN{?_N{?wB{??Nw?{@{??No?}?{??No?}?{??N_?~?[??N??~?[??N??~_K??N??~_K??M??~_K??M??~oC?????~oC?????
+~oC?????~oC?????~oC?????~oC?????~oC?????~oC?????~oC?????~oF?~~{^~oF?~~{^~_N?~~{^~_K?_N{?~_K?_N{?~?[?_N{?~?[?_N{?}?{?_N{?}?{?_N{?
+{@{?_N{?wB{?_N{?oN{?oN{?_N{BwN{??Nw^}N{??Nr~~~w??MB~^~_???B~B}??????_@?D??@G????ONr~~oA@???h?A{?~~{^~N|~~~{^~N|~~~{^~N|~oF{??N{@
+oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oN~~~~{@oN~~~~{@
+oN~~~~{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@oF{??N{@
+oF{??N{@oF{??N{@~~{^~N|~~~{^~N|~~~{^~N|~????_F?A???W????ONr~~oA@???h?@[?~~|~~~|~~~|~_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?
+_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?_N{?~~|~~~|~~~|~?????GBW?o??Q????CB{
+~~{?_O??IO?a?N~~^o??~~|~??B~~v{??K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B?
+^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~?G?BoF{?_?N?^oA??{@~?G?BoF{?o?N?^oB??[@~?K?@oF{?w?F?^oB_?[@~?N?@oF{?{?F?^oBw?[@~
+?Nw@oF}?~oB~~~~~?N~~~~{?~~~~~o??????_@_E??@G????ONr~~oA@???h?Bg?~~{???B{~oN~~o???Nr~?~~~?O??~n{BoN{@??B}BoB?~oC??NwN?KB|?o??|o{?
+oNsB??BvBoB?}O[?_NKN?KBx@oA?{o{?oNCN?KBpBoB?{O{?oNCN?KBpBoB?{O{?oMC^?MBoBoB?wP{?wN?N?KB@No@o{?{?oKC~?FBoBoB?_V{?MN?N?KA@^o?w{?{?
+oGD~?BboBoB??^{?FN?N?K?@~o?[{?{?o?F}?OzoBoB??^w@Bn?N?K?@~?KF{?{?o?F{?o^oBoB??^oB@~?N?K?@}G[B{?{?o?Fw`oNoBoB??^BN?^?N?K?@{K{@{?{?
+o?F_~oBoBoB??]B~?N?N?K?@wN{?{?{?o?F?^oBoBoB??[@~?N?N?K?@_B{?{?{?o?E?NoBoBoB??O?^?N?N?N|~?@~?~~{B~v{?F{B~~oN~^o?MoN~~?o???G?O@O??
+Q????CB{~~{?_O??IO?n?N~~??B~^~~~?OB~^~~~?oB~^{B~@oB??[B~@oB??[B~BoB??[B|FoB??[BxNoB??[Bx^oB??[Bp~oB??[B`~oB??[B@~oF??[A@~oN??[A@
+~o^??[?@~o~??[?@~_~??[?@~@~??[?@}B~??[?@{F~??[?@{N~??[?@wN~@?[?@oN~@?[?@_N~B?[?@?N~F?[?@?N~N?[?@?Nz^?[?@?Nr~?[?@?Nb~?[?@?NB~?[?@
+?MB~?[?@?MB~?[?@?KB~?[?@?GB~?[?@??B~?[?@??B}?[?@??B}?[?@??B{?[?@??Bw?^|~??Bo?^|~??B_?^|~??B??O???GB_@???W????CB{~~{?_O??IO?j????
+~o[???B_~r{???B{?~w@??B}?N_B?G?~?M?N?K?^?K?^?M?N?G?~?N?N?G@~?N_F??B~?N_F??B~?NoB??B}?^oB??B}?^wB??B}?~w@??B{?~w@??B{?~w@??B{?~{@
+??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~{@??B{@~w@??B{?~wB??B}?~wB??B}?~oB??B}?^oB??B}?^_F??B~?N_F
+??B~?N?N?G@~?M?N?G?~?K?^?K?^?G?~?M?N??B~?N_F??B{?~w@??Bo~v{?????~o[??????G@g@???Q????CB{~~{?_O??IO?f?N~~~p{?~~~~~oB~~~~~?{@~?NoF
+oF{?{?~?^oB_F{@~?M?~oF{?oB~?^oB?^{@~?K@~oF{?oF~?^oB?^{@~?K@~oF{?oF~?^oB?^{@~?K?~oF{?wB~?^oB_F{@~?N?NoF{?~?^?~~~~?[B~~v{?oF{???B?
+^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B?^o???K@~????oF{???B~~p{??N~~Fo??~~{^????????_M?C
+??@_????ONr~~oA@???t?Ak???B~@o???MB~No???NoB~_C??Nw?}?K?_B{?w?{?o@{?o@{?w?{?_B{?{?{?_F{?}?[??N{?}?[??N{?~?K??Nw@~?K??Nw@~_K??NwB
+~_K??NwB~_C??NoB~_C??NoB~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~oC??NoF~_C??NoB~_C??NoB~_K??NwB
+~?K??Nw@~?K??Nw@}?[??N{?}?^{?^{?{?~}_v{?w?}N`r{?o@{Frp{?_B{B~_{??N{F~?[??NoN~_C??NB~^o????B~^o?E????}??E????}?CF????}KKF????{N{F
+????{N{F????{N{B????{N{B????wN{B????wN{@????oN{@????oN{??????B{?????_M?C??@G????ONr~~oA@???h?B??~~~~@o??~~~~^o??~~~~~oC?oF{?~_[?
+oF{?{?{?oF{?w@{?oF{?wB{?oF{?oB{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oF{?oB{?oF{?w@{?oF{?w@{?oF{?}?[?oF{?~_K?oN~~^o??
+oN~~^o??oF}?~oC?oF{?~oK?oF{?~_[?oF{?~?{?oF{?~?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?{?oF{?}?~_oF{?}@~_
+oF{?}@~ooF{?{B~o~~{^wF|{~~{^oN{~~~{^?Nw^????_H?B??@_????ONr~~oA@???h?@s??N{B@}B~fo^o~~{F}?N~@~o?~?\}?N?F^_B_@r{?o?[~?G?FNoA?@v{?
+_?\~???F~o??@~{B??B~No??~~{B?Nz~NoB}~~{?~N~~?^r~~oNw~~{FwN~~@{B~~o{?~n{N?KB~Fo??~@{??N?^??B_Fo[?o@{F?K?^@oA?Fo{?_@{N?G?^FoB?Br{?
+o?|~?M?N~oFo@~{N~?N~~~{@b~~~??^{Fo????A?_?O??B????@W~N~~?GC??A_?IoB}~~~~~oN}~~~~~oN}~~~~~oN}?^wB~?K}?NwBw?K]?NwBo?K]?NwBo?KM?NwB
+_?KN?NwB_?[N?NwB_?[F?NwB??[F?NwB??[F?NwB??[F?NwB??[F?NwB??[??NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB
+?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB?????NwB????~~~~@o??~~~~@o??~~~~
+@o????A?}?O??C_???@?~N~~?GC??Ac?J_B~~p}?~r~~~p}?~r~~~p}?~r~?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??
+w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??w?B?^o??
+w?B?^o??w?B?^o??w?B?^o??{?B?^o??{?A?~o??]?A?~o??]???~oC?N???~_K?N_??~?]?Fo??}B~oBo??{N~~@o??oN~~?O???No~??????A?w?O??@_???@?~N~~
+?GC??Ac?KOB~~p{?~N{@~~{^?Nr~?^~~FoB{~oF?~o??_?[?_N{??G?B?GB~?OB??o??~oC?o?C??N{B?K?@??B}?oB_????~_K?w????NwF?N????B{@o@o????~?{?
+]????N_N?B_???BwFo?w????{@{?F????N?~?@o???B_No?M????wB{?B_???M@~??{???B?^o?F????oN}?@o???GB~_?K???A?~wCB?????N~@?O????B~ooC?????
+~}K@?????Nzb??????B}|o??????~F[??????Np~??????BwNo??????}B{??????N?^??????BoFo??????{@{??????M?N??????B_Bo??????o?[??????K?F????
+??A??o????????A?i?W??@_???@?~N~~?GC??Ac?P?B~~p~}~p~_~o~~~p~}~p~_~o~~~p~}~p~_~o~?^oA?~o??M?B?^oA?~o??M?A?~oA?~oC?F?A?~o??~oC?F?A?
+~oC?~oC?F_??~oC?~oK?B_??~oC?~oK?B_??~oK?~o[?Bo??~_M?~o[?@o??~_]?~o[?@o??~?^?~o}??o??~?^?}O}??o??~?~?}O~??o??}?~_{@~??O??}?~_{@~?
+?O??}@~o{B~_?O??{@|owB~_????{B|owB~_????wB|wwF|o????wB{woF|o????wF{woF|w????oF{[_N{w????oF{[_N{w????_N{]_N{\????_N{M?N{\????_N{N
+?N{\?????N{N?N{N?????N{F?NwN?????N{F?NwN?????NwB?NoF?????NwB?NoF?????NoB?NoB?????No@?N_B?????No@?N_B?????N_@?N_@?????N_??N?@????
+?N_??N?@?????F???M??????????_M?C???o????ONr~~oA@???h?A{?~n{~}N{N~n{~}N{N~n{~}N{N_N{@??w??N{B??{??NwF_?[??NwFo?K??NoNo?C??N_^w?C?
+?N_^{????N?~[????M@~]????MB~N????KB~F_???GB~Bo???GB~Bo????B~@o????B}@o????B{Bo????B{Bo????BwFo????BwNo????BwNo????B{^o????B]~o??
+??BM~o????AN~oC??G?F~oK??K?B~o[??K?@~_[??M?@~?{??N??}@{??F_?}@{??B_?{B{??Bo?wF{??@w?wF{???{?oN{???[?_N{@~~{@~N|~~~{@~N|~~~{@~N|~
+????_@_B???o????cNv~~oA@???Z?@w?oN{B?Nb~FoB{oR{?~?L~?NoB~_B{?~w@~?N{?^oB~?Fw?^o@??B{?O??~?C?}N{@_N~~?^@~~?FwB~o@~?N{?^w@~?F~?No@
+~oB{?V{?~?D~?No@^oB}?^{?~oF}_^{B~mNzN~b~}R~?^}?~????_H?B???o????INr~~oA@???i?AC?~o[???B~@o???N{F????{?[???Bo@o???N?F????{?[???Bo
+@o???N?F????{?[???Bo@o???N?F????{?[???Bo@o???N?F????{K^~??Bo|~{B?NB~{?{?{B~?FoBoFw?~?N?N?F{?{?[?~oBo@oB~?N?F?Nw?{?[?~_Fo@oB}?^?F
+?Nw@{?[?~_Fo@oB}?^?F?Nw@{?[?~_Fo@oB}?^?F?Nw@{?[?~_Bo@oB~?N?F?N{?{?}?^oBoFw?~?N?~w@{?{NvoBoBo{N{B?FB?^o??????_M_A???o????cNv~~oA@
+???Z?@g??No^?GB~~oB_F~o@{?~}?^_B~_F{?~w@~_F}?^w@~_F}?^o?~o???N{???B~????~o???N{???B~????~o???N{???B~????~_C??Nw@??B}?W?B~?N??~_F
+w?NoB~?@w@~{?GB~^o??~?{?????_H?B???o????INr~~oA@???i?AC???B{Fo???No^????~@{???B?Fo???K?^????o@{???B?Fo???K?^????o@{???B?Fo???K?^
+????o@{???B?Fo???K?^????o@{??NrNFoA?~~{^?M?^~`{?{?~wFoBw?~?^?NoBw@{?~_F?FoB}?[?^?Nw?o@{?~oB?FoB~?K?^?N{?o@{?~oB?FoB~?K?^?N{?o@{?
+~oB?FoB~?K?^?N{?o@{?~_B?FoB}?[?^?Nw@o@{?~?F_FoBw?~?^?N?F}@{?w@~}~oE?~|~~?OB}p~{@????_??B???o????cNv~~oA@???Z?@k??NwN?KB~NoB_F~{?
+{?^{?^_B}?F{?^_B~_Fo?~w@{?N}?N?F~oB_@~{?w?^~?M?F~~~~@~~~~o^~????~o???N{???B~????~_???Nw@??B}?O?F~?M?@~_Bo?^oB}?BwB~{?WB~~o??~@{?
+????_N_@???o????INr~~oA@???i?@c??N?~??B}~o??~~o?_B~}?[?^~_F_F~w@w?~}?]?N~_F_B~o?w?{??M?N??B_Bo??w?{??M?N??B_Bo??~~{B?N~~?oB~~oK?
+w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??w?{??M?N??B_Bo??~n{@?Nz~?OB}~oC?
+????_B?B???o????cNv~~oA@???g?@w?_N~BF}B~~r~wp~{~}GK~N~o@^rz}?Nw}~_B}?Nw?~_B}?Nw?~_B}?Nw?~_B}?Nw?~_B}?No@^oBw_r{?}K[~?Nb~BoA{~oK?
+F????Bo????{????~????Nr~NoB{~~{@}N~~?~b~~o^o~~{N~N~~B~w?{@{~?K?^NoA?Fp{??@{^???^NoA?Fr{?_@|}?K?N~?Fo@~_F~?N_~~{??N{^?????GAO?o??
+Q????Ab{~~{?_O??I_?`?N{F????~o[???B~@o???N?F????{?[???Bo@o???N?F????{?[???Bo@o???N?F????{?[???Bo@o???N?F????{?[???Bo@o???N?F~oC?
+{K^~@oBo|~KN?NB~w?{?{B~?FoBoF{?^?N?^o@{?{?~?FoBoB{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo
+@{?^?N?Fo@{?{?^?FoBo@{?^?N|~~N{@~v~{~oF~^~r~?O???GBG?O??Q????@B{~~{?_O??Io?N?N?@}?^{@~oF~?^{@~oF}?^o?O??????????????????~o^~@~{F
+{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F~v~~^~|~????_E?B???o????INr~~oA@???i?@{?~o[??N{F??B~@o??{?[??N?F??Bo@o??
+{?[??N?F??Bo@o??{?[??N?F??Bo@o??{?[??N?F??Bo@o??{?^wN~?F}B~o@~_~{?^o?~?F}?Fo@~o?{?\}?N?FNoBo`o{?{M[F?NBv@oBo~o[?{N{N?NB~FoBo~p{?
+{K{~?NBF^oBo_~{?{?N~?N?B~_Fo?~wB{?N{?~?B}?^o?~?N~r~{^~{~~F~~N~p~????_K_@??@G????INr~~oA@???i??{?~o^~@~{F{?^o@~?F{?^o@~?F{?^o@~?F
+{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F{?^o@~?F~v~~^~|~????_D_D??@G????cNv~~oA@???Z?BS?~oN~?~_^?N~B~o~}
+^oB~w}K^F~{?{NN?fo^}?N@zoN{B~_FoNwB~?^o@{@}?~oB{?^?N_F{?~?FoBw@~?No@{?]?NoB{?^?F_B{?~?Fo@w?~?No@{?]?NoB{?^?F_B{?~?Fo@w?~?No@{?]?
+NoB{?^?F_B{?~?Fo@w?~?No@{?]?NoB{?^?F_B{?~?Fo@w?~?No@{?]?NoB{?^?F_B{?~?Fo@w?~?No@~v~w~{N~F~|~}N~B~p~~^~b~o~{^?????GAO?o??Q????HB|
+~~{?_O??Eo?`?N{B~oC?~{N~@oB~{~KN?NBzw?{?{Bn?FoBoF{?^?N?^o@{?{?~?FoBoB{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo
+@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N|~~N{@~v~{~oF~^~r~?O????A?K?K??B????AO~^~~?GC??@k?FO??~?[?_N{~?K?N^_Bo?~_@}?Fo?~o@
+{?^{?M?F~_B_B~w?w?~}?M?N~oB_F~{?w@~~?M?^~oB_F~{?w@~~?M?^~oB_F~{?w@~}?M?N~_B_B~o@{?^{?^?F}?Fo?~?B}?F_B~w?_N{~??B{@o????A?c?K??B??
+??AO~^~~?GC??A[?GOB~p~{??N~v~oK?~~~oBoBoN}?^?N?^oB{?{?}?^oBo@oB~?N?F?N{?{?[?~oBo@oB}?^?F?Nw@{?[?~_Fo@oB}?^?F?Nw@{?[?~_Fo@oB}?^?F
+?Nw@{?[?~oFo@oB~?N?F?N{?{?]?~oBoBw@~?N?^oB{?{B~_FoBo~~_N?NBv~oK?{K\~??Bo@o???N?F????{?[???Bo@o???N?F????{?[???Bo@o???N?F????{?[?
+??B~^o???N|~????~v{?????????_I?A???o????cNv~~oA@???Z?@_?~}K^~~L~~vl}{B~~{@~~{?~~{?~~{?~~{?\}{?[?{?[?{?[?{?[?{?[?{?[?{?[?{?[?{?[?
+{?[?{?[?{?[?{?[?{?[?{?[?~~{?~~{?~~{??????GAG?_??K????HB|~~{?_O??Eo?U?MB~Bnb~B~r_Bry?Bp{?Bo{?B`{?Bb{?Bf{??N{N?N~~?Nz~?~z~B~r~F~B~
+FwB~NoB_NoA?No[?N_{?N_{?N@{?N@{?Ff{?F~~@B~~~@{^~?O????A?a?G??@_???AG~N~~?GC??AW?DO??B_??B_??B_??B_??Bo??Bo??BoA?BoB?BoB?BoB_BoBw
+~o~~~o~~~o~_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_BoB_Bpr_Bpr_Bpr_Bpr_Bpr_Bpr_Fpz?Fpz?No}?~o[?~?K???A?c?K??C_???AO~^~~
+?GC??@k?GOB~@~o^?N{F~@{?~o^{FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?FoBo@{?^?N?Fo@{?{?^?
+FoBo@{?^?N?Fo@{?{?^_FoBo@}?^?N?F{@{?w?~wFoB_F~z~?[B~v~{@?NzF~oC?????_J?C???W????cNv~~oA@???Z?A{?~v~}N~@~~v~}N~@~~v~}N~@~{?^_@o?F
+w?~?Bw?Bw?~?Bw?Bw@~_F{?Bo@~_F{?@o@~_F{?@_B|oN}??_B|oN}??_F|wN~???F{w^f???F{w^f???N{[~F_??Nw[~B_??Nw]~Bo??NoN}@s??NoN}@s??NoN}@{?
+?N_F{?{??N_F{?{??N?Bw?[??N?Bw?[??N?Bw?[??M?@o?K??M?@o?K?????_E?B???W????cNv~~oA@???f?AC?~v~?~oF~^{B~?^|~oN{@w?{?B_B_Bo?M?M?^??{?
+o@{?@oB?Nw?F?G?~_?K?_B}??o??^{?@??@~o?C??Nz_????~m????B}{O???Npp????~Fk???BwMo???N_z????{@{???BoFo???N?^????w?{???B_Bo???K?F????
+o?[???A??o???G?B????o?C???B??O??FM?@???}w????F~o????^v????@~]????F{{????N`w???B{@o???N?B?????????G?o?o??Q????FB{~~{?_O??Ho?Z??B{
+?OA?~o{?w?[~?N?B^_Bw?^o?}?F{?No?}?F{?N_@~_Bw?~w?}?N}?N_B~_Bw?~{?}?^~?N_F~oBw@~{?}?^~?N_F~oBw@~{?}?^~?N_F~oBw@~{?}?^~?N_F~oBw@~{?
+}?^~?N_F~oBw@~w?}?N}?N_B~_Bw?~w?}?N{?N_@~?Bw?^_@~?Bw?^o?{?L}?M?FNoA?~o{??No@?????G?o?o??]????FB{~~{?_O??Ho?V??B_??Bo??B}?MB~?N~~
+?N~~?@~~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~??B~?Nz~
+^~z~^~z~^o????A?K?K??C_???@o~N~~?GC??A[?EoA?~oK?{N{^?Nb~^oB{w^{?^gB~?^{?~oN~?^wB~oF{@~{@~?^~?^oF~oFw@~w?~?\{?NoF??B{@o??~?[??NwB
+??B}?o??~oC??N{??G@~??B?No??o@{??M?N??Bo@o??}?C??No?@o@}??[?Fo?F_?}??{?F_?N_?w?B{N~~?~b~~oN{~~{B~n~~?~~~~oF~~~{@~~~~?^~~~oC???A?
+K?K??C_???@o~N~~?GC??A[?Eo??~oK?oN{^?NB~^oBwo~{?}GN~?NoF~oF{@~{@~?^}?^oF~_F{@~w@~?^~?^_B~oFo?^{??GB~??A?^o??oB{??N?^??B~@o??~p{?
+?K@~????~o???Nw@??B}?o??~_K??NoF~?B{@~w@~?^~?~oF~oN{@~{B~?^~?~oF~oN}@~{B~_N~?^wB~_B~?^r@~oBw~v{?wN{^?GB~?o????A?c?K??@_????g~N~~
+?GC??Ag?G_??oN{@??B{~o[??N}BFoA?^w?^?K?~oB{?w@~?NoB_F{?~?M?NoB{?w?~?NoB_B{?~?M?N_@{?w?{???B_Bo???M?N????w?{???B~~~{~?N~~~r{?~~~~
+NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~?M?N_B{?w?}?NoB_Bw?~
+?M?N_B{?w?}?NoB}~~b~?~z~}N{B~n~w~oK???A?I?G??@_???A?~n~~?GC???W?COB~~oF~~oF~~oF~~oF~~oF~~oC???A?E?K??B?????W~^~~?GC??AC?Fo???F|_
+?MB~[OBwork?^_?~?@{?Ng?N?Bz?@o?[w?K?FN?@?@ro?O?[}???BN_???p{???K^????Fw????}????N_???Bw????~????Fo???@{????^?G?BFoA??P{?_?C]?K?@
+F_B??Bw?w??{?F??^??w?N_?F_Bo_o{?oN{B??B~??????A?]?K??B?????o~^~~?GC??@{?H???~oF}BoB~?^wN?N?@{?C?{?L_??Bo?v???N_B[???u?[o??AW@r??
+?H_FM???f?{w???KBp_???oNE???B@{[???MF`o???W]B???@bwK???EN?w???[{B_???roE???B^?W???Lw@oA??v_F?G?@}?K?_?Fo?oA??^?B?K?@{?K?o?B_?OB_
+?M?@?N?@w?C?~_~??OB~B{????????A?Q?K??B?????o~^~~?GC??A??Fo??~~{@?N~~@oBo_?{?{??]?N??N_Bw?Bw?]??}?F_?N_@w?Bw?^??^?Bo?Fo?{_?{?NK?F
+?Bzo?OB}~o??~b{??@w{???^]???Bv????|o???N]?A?Bv_?_?\w?G?F]?A?@vo?o?\{?K?B^EB??~p_w?N{[Nw~}Bb~N~?^??B_Bo???GA_?_??Q????@b|~~{?_O??
+GO?X??B_`oC?}L{@?Bz{???N}???@~??_?No?K?BW?B??U??o?D_?K?@W?B_?O??w?K??K?F??B?Fo??oN{@?GB~@o??~o[??NoN??B?Bo????{????N????B_????w?
+B??M??o?B_?M??{?B_?F??y?@o?]_?K?N{?@?N~o??Bv^o??op{??????GAG?_??K????BB|~~{?_O??G??_?N{^wN~~F}B~{?E?F~????^o???B{?E??]?@_?F_?[??
+w?D_?M?@W?B_?R??w?Co?M?@E?B_?Oo?w?CK?M?B@_B??oW?o?KB?KAB?OB?_oC?oKK??KBB??B?Wo??oBK??K?v??A?Fo??_@{??G?N??A?@o??_?[??G?B??A??o??
+????_?_C???o????KNv~~oA@???_?As?~o~}F~o^~o~}F~o^}?F_?}?B{?B_?[??{?Bo?]??{?Bo?U??{?Bw?R??{?Bw?R??{?Bk?P_?{?Bm?P_?{?Be?Oo?{?Bb?Ow?
+{?Bb?OW?{GB`?OK?{GB`?OK?{KB__oC?{KB?_oC?{EF?oo??wEF?oo??wBF?Wo??wBf?Wo??w@f?Ko??w?v?Mo??w?v?Eo??w?^?Bo??w?^?Bo??w?N?@o??w?N?@o??
+w?F??o??w?F??o??w?B??O??w?B??O??????_M?@???o????MNz~~oA@???S?@???B~?^}Bb{N@w{BroNA?]?@w?F_?^??{?Bo?N??{?B{?]{Bx{~B~o@o???G@??_??
+K????@b|~~{?_O??G??T????F_B?FoB?Fo??B_??B_??Bo??Bo??@o??@oA?@oA?@oA??oA^?{B~?}Bp?~Bo?Vb_?Rr_?Rr_?Pz_?@z_?@zo?@~o??|o??|o??|wF?|w
+B?{{B?w}B`x~@nrr@~b_?o???G?O?_??K????@b|~~{?_O??IO?V????NoA?^oB?]oB?]OB_]OB_??B_??B_??B_??Bo??@o??@o??B~BwB~Bo@w???w???w???w???w
+???{???[???[???[???[???[???]???M???M???M???M???N???F???F???F?G?F?G?B?GwB?Lw@?L{@?Nw??Fw???????A?_?C??@_????o~^~~?GC??@{?BO??B_?N
+??{?Bo??????????????????{?Fw?xoBb_ME?wWBpoN??]?@w?B_?N??[?@wFB_KM?owBb_F}?No?O???G@??_??K????@b|~~{?_O??G??S?G?F?N?F?N?F?G?B?G?B
+?K?B?K?B?K?@?K?@?M?@?M?@?M???MB?@~B_B~@oBf?WBv?KBv_EBv_B@~_@?N_@?NoN?Jo^?@o]?@o{?@w{B`w[@_w[@_w[@o}{?o~w?O^o?????GB??o??E????Bb}
+~~{?_O??D??e?Nb_B~w?~NC^~oFKN|rB?Ww^~KCB`_~w_?NE@vr??{[BNK?@o?K{o?F??Pr??]?@Fm?@w?C]w?B_??z_?M??Bn??{??N[Bbo??|oEF??@v_W[??FM@pw
+_?\wBfa?@~?FMG?Bw?K???A?a?G??@_????w~n~~?GC??@O?EOBww?[?~NcN?Ko~B_AMBpw?`_[[?KWFF_BF?ow?o?KM?K?@B_B_?O{?w?CF?M??@oB__?[?{GBB?^A?
+oo@ooKK?[KB`?Fb?[o@w_B{?M??^?????G?g?_??yN~~~rb}~~{?_O??FO?V?MABB~BfFr@~NB_}M@_]]@_N]@oN]??F]??F]G?F^G?F^G?BNG?BNK?BFk?BFk?BB{AF
+@}BF?}B~?]@{?M???N???N???F???F???F_??F_??N{B?N{B??????A?w?C??B?????w~n~~?GC??@s?C_??FoN?noN_{ONo{?Dww?C{w?C{w?C]w??]w??]w??^{??N
+[??N[??N]??N]??NN??MN_?]NoB{NoBwF???F???F???F_??B_??B_??B_??BoBo^oBo^o??????_N_@???o????MNz~~oA@???S?@???B}?^{BbwNF_{MBo{?Bo?]?^
+wF~?^oB{?N?M{?|oBv?N]?{}~`~w@o???G@o?_??K????Bb}~~{?_O??D??S?MBB?~b~@rp}B_o}Bow[BoW]Bo[M@o?M???M???N???N???F???F?GwFBg{F@g{B@{{F
+?}^F?~z~?Rp{?????G?O?_??E????Bb}~~{?_O??FO?T?N?@FN_BFhoFB_wFBgWFBgWBBw[B@{?B@{?@@{A@@}A@?}A??}A??}B??}B??]B_?]B_?]Bx?[B~?GBn??B_
+??Bo?@@o?Bpw?Bo{?Bo]?@oN?NoF?N_@??????A?[?G????????W~^~~?GC??Ac?EO???F{??KB~??B_wOC?[K?@?Bb??O?[o?C?Bk?@??Z??O?Fo?C??}?@_?N_?G?@
+[?A?wV{?oMC~?KB_NoB??F_?o?@o?M??{?@_?N??W?Bo?E??{?@o?N_?K?@w?B??]??o?F_?M??{?F_?N?@w?@w?}??N?Nq@@oBK~oK?BN{@??oO???M????@_????W?
+???E????@o????K????B?????o???????GAG?_??E????Bb}~~{?_O??F_?X?G?BM?B??ro?o?K{?K?@F?B??Po?w?C]?M?@F_B_??w?w??M?N??BoBo??{?[??F?F??
+@o@w_K[@]GBF?Fb?oo@wwMK?~N@f?No~^oB[Brw?F????@w????]????B_????w????N????Bo????[????F????@o???????G?w?O??W????IB~~~{?_O??@O?D??w^
+Fp{M?????G?w?O??W????IB~~~{?_O??B_?E??w^Nr{}KB?oM@_[B_{E????_C_B??@_????oNv~~oA@???[?@g??????o??o?K??N?B??B{????No??o?{??N?B??Bw
+????N_??_@{??M?F??Bw?O??^_???@{????^????^_???N_@??B_@o??_@{????}????}????N?B??B?Bo???B{???B{????{?K??K?B?????o???G?g?_??Q????Mb{
+~~{?_O??JO?O??B??K??w?B_?E??[?@o?B??M??w?@_?F??[??o?B_?M??W?@o?F??M??w?B_?F??[?@o?B_?M??W?@o?F??K??w?B_?E??[?@o?B??M??w?@_?F??[?
+?o?B?????G@G?o??W????KB|~~{?_O??F??Y??K????N????No???No???Bo?o??o?{????~????^????N?@??B_@o??_@{???@}????}?C??M?B??B_?o??}?C??Fw?
+?G?^??B_@o??{?C??Fo????~??B?Bo??{?K??No????~????Bo????K???????A?{?K??B????AG~~~~?GC???o?Bo??W?@w?Fz?^~`~~v~~^~`~oF{?^_@w?E????A?
+{?K??D_A??AG~~~~?GC???o?Bo?B??{?NoB~?^{N~v~~^~{N~oC~??{??o????A?{?K??FB~~~|W~N~~?GC???{?B?@_?E??W?Bo?N??{?Bw?^_@}?F{?~oB~_^}@~{N
+~o{???A?{?K??FB~~~}?~n~~?GC???{?B?B~B~{N~_^}@~oB~?Nw?^_@}?Fo?N??{?@_?E??W?@?No??Pc|MT???????????????????????????????????????????
+,
+Nao??CXNRdO@????Fo???@O???@TKB?oKB?sKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????ja_??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????s@{??E[\??@vG????????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??LoB???s@???a?O????D??@S@O??y?S??D_E??BO@_??H_[??HwF??Bu@o??[__??KWG???YAO??a_c??NgH??@MA_??b_g??LwI???qAo??`_k??MwJ??@AB???
+k_o???WL??BABO??U_w??NWM??AIBo??F`???JGO??@MCO??w`C??JOQ??@gCo??~@K??HOS???oDO??p@S??DoU??BsD_??Y`[??M?V???EE???J@_??CgW??@qE???
+c@_??A_X??A_EO??E@g??HWY???MEo??P`k??JwZ???uF???j`o??AW\??A]FO??F@w??JO]???oFo??q@{??E?_??A_G???wA???D_`??AkGO??FaG??DWa??AUG_??
+yaG??Dgb??AYGo??uaK??AWc??@eH???maO??Agd??AaHO??EaW??Boe??@YH_??{aW??GWf???YI???ja_??AWh??AyIO??cag???Wj??@yIo??uAk??B@AAThYUdhT
+KB?oKB?sGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBOoKBHRQr?oPs[??????G?g?_??W????Bb}~~{?_O??D??S??A^?{B~?}Bp?~Bo?Vb_?Rr_?Rr_?Pz_?@z_?@zo?@~o
+??|o??|o??|wB?|wB_{{@_w}@`x~@~rr?~b_?O???GBw?O??]????@b|~~{?_O??G??O?M?@~?F{?]??w?Bo?N??[?@o?F_?]??w?B_^~B~{]FpoNN?]{@zoBn?M{?zw
+B~_F]?\w@roFN?[]B_}M@~oB}?????A?}?C??E?????w~n~~?GC??@O?CO??^_B?~oB_ooFow?Dww?C{w?C{O??]???]???]???^???N???N???N???N???Mo??]w??{
+^?B{NoBo@o????A?I?G??E?????W~^~~?GC??A??DO???@w?o@{?o@{???w???w???{???{???[???[?_?[?_?[?_?K?foN?~oN_{ONo{?Dww?C{w?C{w?C]w??]w??]
+{??^{??N[??N[??N]?oN]?wNN?WMN_W]^o^{{oNww?C???A?}?C??E?????w~n~~?GC??@O?CO??^oB?~oB_woFoo?Dw_?C{o?C}w??]}?B}NoB}Bo?^???N???N???N
+???M???Mo??]w??{^?BwNoBo@o????A?S?C??LB~~~{W~^~~?GC??Ac?D_???@{?_B{?oBs?wBo?wBo?w???w???[???[???[???[???[?A?~o]?~o[?M???M???M???
+N???F???F???F???F???F_??B_??B_??B_??B_??Bo??@o??@o??@o??@oA?@oA??oA??oA??oBM?OB]?OB~??B}???}????????_N_@???o????MNz~~oA@???\?@O?
+?FoM?N{N_K[NoKKFwGCF{G?F{G?F]G?B]G?B]K?B^K?BNK?@NK?@NM?@NM?@NN??MN_?]No?{N{?wFK??F???F_??F_??B_?Bbo?F`w?Fo{?~_[?~?C??????G?g?_??
+Q????@b|~~{?_O??G??T?G?F?N?F?N?F?G?B?G?B?K?B?K?B?K?@?K?@?M?@?M?@?M???MB{?NB~?^BF?^B@?~A??~b??vb??Vb??Rb??Rr_?Rr_?@r_?@ro?@xoF@xo
+B?xwB?wwB_|w@o~o?o^_?O???G@O?O??Q????BB|~~{?_O??Fo?K???N??{?Bo?F??????????????????Bo?N_@v?MM?{WBp_FF?]?@w?Bo?N??[?@w?B_MM?W{@`oF
+n?Nw?^??????_N_@??@G????ENv~~oA@???_?@K?_?[?{?[?{?[?_?K?_?K?o?K?o?K?o?C?o?C?w?C?w?C?w???wK?B{N?F{B_E[HoF[GwF]G[F}GKB}?C?}?C?~?[?
+n?{?F?{?F@w?F`wFF_wBB_wBBgwBB|w@B~o@@~_?????_A?@??@_????ENv~~oA@???_??g?o?Nw?~_Bo?F??]?@w?F_?M??{?Bo?F??[?@w?F_?M??w?Bo?N??[?@o?
+F_?]??w?B_AN?[{@poBF?M{?^_?{?????G@w?o??Q????Bb}~~{?_O??D??b?Fbo@r{?~NbN^oBmF}xp?KWN^n??p_[{w?Bf?rzo?MK@Ff??w?C][?B_??xo?N??Bv_?
+{??NM?@o??[w?F??@ro?]G?FF?\w_?[[?ra??pwBMG?Bb_K{o?N]?Rr??~o?FK?@]?????A?[?G??C_????w~n~~?GC??@O?E?@w{?^{}?~mFozEBpzE@prf?pzb?Oz_
+?Oz_??zo??~o??\o??\o_?\w_MLw_EKwoEKwoFC{oBk{_@{[??{???A?I?G??E?????w~n~~?GC??@O?Co??^_B?~oF_woFoo?Lw_?K{_?[{_?[]_?[]_?[]o?[^o?[N
+o?KNo?KNw?CNw?CM{??]]??{N_B{FoBo?o????A?I?G????????w~n~~?GC??@s?DoB?_o~_xp|o^rooNb_oFf_wBv_WBv_?@v_?@va?@vq?@vq??rq??rr??pz??pz?
+?o~?`o^_poN_~oF_^?B_??Bo??Bo??@o??@o??@w??@w??B~?oB~?o??????_N_@??@_????MNz~~oA@???\?@G??@{BoJ{BwNCB{N?@]M?@NM?@NM?@Fm??Fm??Fm??
+F~??Bv??Bv??Bv_?Bv_?Bro?Bbw?Fb{?~B{?}@o??@o??@o??@w???w???w???w???{?{F{?{F{??????GBG?O??Q????Bb}~~{?_O??D??Q?Fbw?Nr{?]yN?{ZF?{ZB
+?}^@?}N@?]???M???N???N???F???F???F_??F_??B_??B_??Bo??Bo??@o??????GBG?O??Q????Bb}~~{?_O??D??O?G?~oF~_w^Bo[N@o{F_?{?FoF~?~oB{?^_@w
+Bf_NM?{wBroNFnwN}?K???A?Y?C??E????@w~^~~?GC??@o?B?A??{?Bo?N??[?@w?F_?]??~o~~B~??[?@o?F_?]??w?B_?N??{?@o?F??]B`wEB_[M?xwB~?Fw????
+?G@??_??Q????Bb}~~{?_O??D??U?N??Bn_@B|oBBwwB@{WB@{Y@@{]@@}A@?}A??}B??~B??vB??VB??VB_KVB_MVBoEFBoENB{F]B^B{AF@o???GBw?O??Q????Bb}
+~~{?_O??D??R?NA??~b@@|rB@wzB@{YB@{W@@{[@?}?@?}???}A??~A??VA??VA??VB??FB??FB_?F@o?N?w?M?^?K?N?????GBO?_??Q????Bb}~~{?_O??D??[?N??
+B_^w?W{Nv?MFBwwB`o~E?o[NpgCFBk]@?oZ__OKEwG?B@mB??o^oo?KB[K?@?vB??OLooGCB[MA@?VB_oODo{KC?{Nbr?MA~^oA?Bp{?????_N_@??@G????MNz~~oA@
+???S?@K?wMK@}N{BNB{FBhwFBgwF@g{F@w[B??[???[?_?[?_?[?_?K?_?K?r_KFroKBrwCBzwK@|}K@~~{?Nbw?????_@?A??@G????MNz~~oA@???\?@O?{??M}?CN
+v?KFb_KFp_KFpgCFpwCBwGCBwG?BwK?B{K?@[K?@[K?@[M?@[M??[N??[N??{No?wF{?oF[??F???F_?AB_?Fbo?F`o?F_w?b_[?~_K?}????????GBG?O??K????Bb}
+~~{?_O??D??R?G?N@k?^@}B~?vBw?RB???B_??@o???w???[???N?G?F?K?@?M???FA??ra??Rb??^r`?Nz~?G\~??K^?????G@o?_??sN~~~pb|~~{?_O??IO?\????
+~?[??N{^?G?FF?B??Pw?o?C]?M??B_B_????w????N????@o????[????F????B~~o[?~~{F?Ba??o?w_?K?MG?B?Bb??o?wo?C?NK?@?@r??O?[w?C?FM???@r_???]
+w???Bn?W??xoF??M[?o?Bf?K??~oB_?Fw?[?@{?B??[??G?F??A??o??_?K??GwB??B]?O??~oC??Nw???@}????????_B?B???o????ENv~~oA@???_?@s???B_????
+w????N????Bo????}????No???B{????|_???NW???Br????{o??_NC??KBp??B?{???WN???EBo???o{?C?KM?@?@b_?O?Ww?C?~N{@?Nz~?O?Ew?C??}?@??N_?W?@
+w?E??]?@o?B_?]??w?Fw?]?B~_N}F~{B~`{???A?E?K??H?????W~^~~?GC??AC?Fo??_F|_?MB~[OBwoRK?^_?~?@{?Ng?N?Bz??o?[w?K?FN?@?@ro???[]???BF_?
+??o{???KN????Bw????]????F_???@w????^????Bo????{????N?G?BBoA??O{?_?CM?K?@F_B??@w?w??{?F??^??w?N_?F_Bo_o{?wN{B??@~??????A?K?K??C_?
+???o~^~~?GC??@{?FoA?~~{@_N~~@o@w??{?]??]?F_?N?@{?B_?N?@w?Bo?[??{?F??N_@o?@w?[??]?F??F_@o?@{?]??N?F_?Bo@w??{?]G?N?Bq?@o?{_?[?NG?F
+?@z?@o?Mo?K?B{?B??^??w?Bw?N??}?@w?F_?V_?{?C}?N~~BoB~~oK?????_M_A??@G????KNv~~oA@???^?@{?_N~~^wB~~v{?]??}?F_?M?@w?B_?^??w?Bo?K??{
+?B_?N??W?BwoE??]K@_?Fb???@ww???^F???~p{??N{^???NF_A?Boo?_?[K?G?FB?q?@ooMo?[?@k?B??^??o?Bo?M??}?B_?F_?[?@w?Fo?^?@~?B~~~{?~~|~????
+?GBO?_??Q????BB|~~{?_O??Fo?]?GB~~r}?~~{~?F_?Fo@w?@o?]??[?Fo?E??{?@_?N??[?Bo?B??}K?o?Fb?K?@wo???]M???Fpo??N{^??B~Fo??Bpw?_?{K?G?F
+B?A?@oo?_?[K?K?F??B??o??o?K??K?B??B_?o??w?C??M?@??Bo?O??~r{??N{~??????A?Q?K??H?????W~^~~?GC??AC?F_??_B{o?NB~M?BwwPc?Ng?^?@{?Fw?F
+?@~??o?Mw?C?Bn?@??zo???M]???@f_???W{???EN????Bw????]????F_???@w????^????BoB~Bo{?~o{N?N?@BoBo?O{?{??M?N??F_Bw?@w?}??{?F_?^?@{?N_?
+^_Bo_r[?wN{b?G@~??????A?m?G??C_????o~^~~?GC??@{?EOA?~p{?_N{^??Bw????]????F_???@{????N????Bo????{????N_???@w????]????F_???@{????N
+????Bo????{??G?N??A?@o??_?]??W?Fo?F?@{??o?N??K?Bw?B??u??w?Lo?M?@]?B_?Ro?{?C~?N~~NoB~~p{?????_L_B??@G????KNv~~oA@???^?Ag?_N{??N{B
+_N{??N{B?N_?_B{??N_?_@{??N_?o@{??No?o@{??Mo?W?{??Mo?K?{??Mo?k?{??Mw?e?{??KW@e?[??KW@b?[??KW@r?[??K[@p_[??KK@ooK??KK@ooK??KM@wOK?
+_KM@wOK?_KF@w?C?_KF@w?C?_KD`{?C?oKCp{?C?oK?p{???oK?X{???oG?Z}???wG?N}???WG?N]???[G?F]???}G?B^???~w^B~o[?~w^@~o[?????_B?B??@G????
+KNv~~oA@???^?AK?_N{?~o]?~oB~@oBw?N_??N_@K???}?Cw??B{?R_??MoBE???r?KW??BK?po??KwFF???`_[K??AE@oo??GWNB_??@o{M???BBoW???K^@_???pwF
+?G?BF_[?_?C]?oA??RwB?G?@n?K?o?E{?oB??No@?K??}?C?o?Bw?OB_?N_@?E??{???[?Bo??Bw?N???N{Fw???~o\_????????_M_A??@G????KNv~~oA@???^?@w?
+_N~~?WB~~o[?]??N?F_?F_@{?@o?^??{?Bo?N??{?Bo?N_?{?Bw?F_?]?@w?F_?M?@{?@o?^_?[?B}?@?N~~?GB~FoA?Bo??_?[??G?F??B?@o??o?[??K?B??B??o??
+w?K??M?B??B_?O??w?C??N?@??B~Fo??~p{??????G?W?o??Q????BB|~~{?_O??G??\?GB~~oA?~~{B?Fa?@o@w??{?]??]?Fo?F_?{?@w?N??]?Bo?F_?}??{?F_?N
+?@y?@o?]o?K?F~???N|~??B~No??Bvo?_?|w?G?F}?A?@~??_?^w?K?F]?B??v_?o?Lw?K?B^?B_?vo?w?C{EM?@N@bo?Ro[~p|wBn{^}?[??M?B????_F?A??@G????
+ENv~~oA@???`?@g??M?N?oBwnoK?Nno@??~o?O?Fw?E??}?@o?N??K?@o?B??[??o?F??K?@??B??o??o?[??K?~??B?~oC?_N{F??B~Bo??}@{??K?^????Fo???@w?
+???[????F??K?@o?B??[??w?F_?M??w?B_?N?@y?@o?~o?K?~}?@?NN~??BBNo??????_@_B??B?????KNv~~oA@???^?@o?}N~~B~b~~o~wwGCFNM?@@pr_?OWK{?CE
+Bn??@_Zo??[E{??B@~_??oLw??K?]????F_???@{????N????Bo????{????N_???@w????]????F_???@{????N????Bo????{??G?N??A?@o??_?[??K?F??B~~o??
+~~{??????G?o?o??u????BB|~~{?_O??G??\?Nw~~@~}N~o^w?N_?}?@o?Bo?]??{?D_?N??W?Bo?E??}?@o?N_?K?@w?B??]??o?Fo?M?@{?@_?N??W?Bo?E??}?@o?
+N_?K?@w?B??]??o?F_?M?@{?@_?N??W?Bo?F??{??o?N_?K?B{?@??z_???]{???NBo??N_^??B_@o??????_B?B??BW????KNv~~oA@???_?@w?~o~oN~{N{B~w?[?F
+{?A??^??o?Fo?K??{?@_?N??[?Bo?B??{??W?N?@E?B_?Oo?w?CK?M?@@_B_?OK?w?CB?MA@?OB__OC?wKC??MB`??B_WO??wBC??M?p??B_Eo??o@k??K?N??B?Bo??
+o?[??K?B??B??o??o?C??K?@??????A?I?G??E????@G~^~~?GC??@{?DO??{?C?~?[?Bo}??oz??Oz??Pr_?@zo?@zo?@xo?@xw?@xw??w{??{{??{{??{{??{]_?[]
+_?[]_?[]_?KMo?KNo?KNo?CNw?CNw??M{??M[??MM??[F_BwBoBo?o??????_A_A??@_????QNv~~oA@???^?@S??N_@?NwF_?{No?KMo?C[w?W[W?w[W?w]W?WMw?[M
+w?KN???F?G?B?M?@?N{??F{??N???M?@?M?@?M?@?M?@BM?@Fm?@Fn?@B~??@~??@v_?@bo?B`{?~?{?}?C??????G@O?O??u????@b|~~{?_O??B_?G?Fbw~NrwwE@_
+[B_[F_{B????_D?@??@G????gN~~~oA@???M??W?MBo{NBooM@_[B?wF?oK???A?S?C??F_???A_~~~~?GC???S?@O?MFp{NBo????A?I?G??A?@???W~^~~?GC???_?
+AoB??M??{?Fw?XoBBo[F@oGA????_G?@??@G????CN~~~oA@???B??o?~o~~B~{F????_L?A???W????ENv~~oA@???_?@k??N_???Bw????~?C??Lo@??B[?O??v_K?
+?KwB??AM?o??bo[??G[F???F@oA?@o{?_?[N?G?BBoB??pw?o?K]?K?@F_B_?Ro?w?C{?M??N?Bo~v{?{N|~?NB~^o@w?N??]?Bo?Bo?{?C{?M?@N?B_?Pw?w?K]?K?B
+F_B??o{?o?[???A?E?K??F_????W~^~~?GC??A??E?B~NoB~~oF~~oKNw?[N_?{N?@{N?@wN?BoN?BoN?F_N?F_N?F?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N?N
+?F_N?F_N?F_N?BoN?BwN?@{N_?{Nw?^~~oN~~oF~No????A?[?G??F_????W~^~~?GC??A??C_B~~oN~~oN~~oKN???N???N???N???N???N???N???N???N???N???N
+??B~~oB~~oB~~o?N???N???N???N???N???N???N???N???N???N???N???N???N???N???N??????A?s?G??C_?????~^~~?GC??AG?Do??~?[?~r~?~v~_Bvzo?vBw
+?UBw??@{???{???}???]???]???^???N???N???N???N???N???N???NoF{NoF{^oF{]?F_]?F_}?F_{?F`{?Fbw?Fbw?Vbo?vb_Bvr?~v{?~r{?~?[???A???K??F_?
+???W~^~~?GC??A??DO?N?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@z~~p~~~p~~~p{N?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN?@wN
+?@wN?@wN?@wN?@wN?@w???A?M?C??E?????W~^~~?GC??A??@??NBo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{NBo???G???o??]????@b|~~{?_O??G??W??{?
+^?{?N_{?Fo}?Bo~?@o~_?o~_?O~o??~w??|{??{}??{^?G{N?K{^?K{^?M{~?N{|?N|w?F~w?B~o?@~_?O~_?O~??o~?@o}?@o{?Bo{?Fo{?F_{?N?{?N?{?]?{?}???
+?G@W?_??]????@b|~~{?_O??G??P??{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{???{?
+??{???{???{???{??N~~?^~~?^~~?O???G???o??]????@b|~~{?_O??G??T?B{?Ff{?Ff{?Fe{?Fm{?Fm{?Fk{@Fk{@Fk{@Fk{BFg{BFg{FFg{FF_{FF_{NF_{MF_{M
+F_{]F_{[F_{{F_{{F_{wF_|wF_|oF_|oF_|oF_~_F_~_F_~?F_~?Fo~?Fo}?Fo???GAw?_??]????@b|~~{?_O??G??S?N{^?N~~?N~~?O~o?o~?@o}?@o{?Bo{?Bo{?
+Bo{?Bo{?Bo{?Bo{?Bo}?@o~?@o~o?~~~?^~~?N{^??{???{???{???{???{???{???{???{???{???{???{???{???{??????GAw?_??]????@b|~~{?_O??G??U?N{^
+?N~~?N~~?O~_?o~?@o}?@o{?Bo{?Bo{?Bo{?Bo{?Bo}?@o~?@o~_?~~~?^~~?N{^??{{??|w??|w??~o??~o??~_?O~_?O~??o}??o}?@o{?Bo{?Bo{?F_{?F_{?N???
+?G@W?_??K?????B|~~{?_O??G_?R?G@~?MB~?^b~?~b_?vq??ro??rw??@w??@w??@w??@w??Bw??Fo??No??N_F?N_~?NB~?KB~?OB{?OBo?oB_?oB?@oA?@oA?@oA?
+@oA?@oA?@oN?@o^??o~_?v~o?^z~?N`~?M?^?????GBg?_??K????@b|~~{?_O??G??Y?N~~~oN~~~{B~~~~?o@w????]????F_???@w????]????F_???@w????]???
+?F_???@w????]????F_???@w????]????F_???@w????]????F_???@w????]????F_???@w????]????F_???@w????]????F_???@w????]???????_M_A??@w????
+ENv~~oA@???`?@O?Bo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NBo?NFg?FFg?FNK?B
+NK?B}N?@{N{?wF{?_@{??????GBO?_??E????@b|~~{?_O??G??Z??{?_?[N?G?FF_B??pw?o?K]?K?BN?B_?Ro?w?C{?M?@]?Bo?F_?{?Bw?N??{?@w?N??]?B_?R_?
+w?C{?M?@N?B??po?o?K]?K?BF_A?@ow?_?[N?G?FBo??Bo[??G{F??AN@o??b_K??LwB??B[?O??v?C??No@??Bw????}???????_L?A???W????ENv~~oA@???_?@k?
+F_B_?Rw?{?@{?N_?]?@w?N??N?Bo?Rw?w?C]?K?BBoB?`o{?_G{F??BN?o??~_K??Nw@??B{????}????F_???B{????~_C??NwB??BN?oA?bo[?_?[N?K?BFoB_?pw?
+w?C{?N??^?Bw?F_?]?Bo?Bo?{?C}?M?BF_B??o{?o?[???A?C?G??B?????w~n~~?GC??@O?C?BoB~o~~f{]^?Zw?N??{?Bo?Nzo~~r~^n?^{?~oB~?^}B~{~n~}~~rp
+????_M?@???o????MNz~~oA@???S?@??o@~oN~`~^F_}W@w?Fo?N??{?Bo?N??{?Bo?^?@w?Nk@{{Nb~{F~?Fo???G@??_??K????@b|~~{?_O??G??P??B_?OB_?OB_
+?OB_?OB_?OB_?OB_?OB_?OB_?OB_?OB_?OB_?]Bf?^b~?^r~?^rw?Rzo?Pz_?P~_?O~_?O~_?O~_?O~_?O~_?O~_?P~_?Pzo?Rzo?Vr{?^r~?^bn?]Bb?O???GB_?O??
+E????Bb}~~{?_O??D??P?K?N?N?~?N`~?Frw?Br_?@z_??z??^~~?^~~?^~~?O{???{???{???w??@w??Br??Fro?Nb~?M@~?G?^?????G?g?_??E????Bb}~~{?_O??
+F_?S?MANB~B~B~b~Bvp{?Bzw?@zo?@zo?@zo?@zo?@zo?Bzw?Fp{?No~?No^?MoN??o??@o??Np~?Nr~?~r~@~z~@p~?Bo}?Bo{?Bo{?Bp}?Bvz_@~r~?~b~?[?~????
+?G?G?O??Q????@b|~~{?_O??G??C??{NBo{???????????{NBo{NBo{NBo{NBo{NBo{NBo{N????_C?A??@G????MNz~~oA@???S?@??bp~n^~|~^~o~}@~oB~?N{?~o
+B~?N{?~oB~?N{?~oB~?N{?~oB~?N{????G?g?_??E????Bb}~~{?_O??D??S?G?^?M@~?Nb~?^ro?rr??py?@py?@o{?Bo{?Bo{?Bo{?Bo{?Bo{?Bpy?@py?@rr??~ro
+?~b~?]@~?G?^?????G@??_??Q????Bb}~~{?_O??FO?P?G{^?M{~?N|~?F~{?@~w??~o??~o?O~_?O~_?O~_?O~_?O~_?O~_?O~o?O~o?@~w?B|}?N|~?M{~?K{N??{?
+??{???{???{???{???{???{???{???{???????A?_?C??C_????w~n~~?GC??@O?AoAN@{{Fzo^~?V{?No?^?@{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?????_H_@
+???W????MNz~~oA@???S??w?{?~{N~o~Nb_]?@w?N_@}?NoF~?~wF{?~?Bw?N??{?ro^Nn{^~_~w@o???GA??O??E????Ib|~~{?_O??E_?K?F_?]?@w?F_?]?@w?N{N
+~o~~Bv_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?}?ZwB~?N{?K???A?O?G??C_????w~n~~?GC??@O?C??N{?~oB~?N{?~oB~?N{?~oB~?N{?~oB~?N{?~oB~?N}@~}
+~~~}|~rp????_N_@???W????MNz~~oA@???S?@G?B{?BB{?BFk?@Fm?@Fm?@NN??NN??NN??]F??]F_?]F_?{B_?{Bo?{Bo?w@o?w@o?w@s?o?{?o?{?_?[?????_N_@
+???W????MNz~~oA@???\?@G?B{?BB{?BFm?@Fm?@Nm?@NN??NN??]N??]F_?[F_?{B_?{B_?wBo?w@o?o@s?o@s?o?s?_?{?_?{???[???[?_?K?_?K?_?K?o?C?w?C?
+~_??^_??N_???????G?g?_??K????BB|~~{?_O??G??Q?K?N?M?^?N`~?F`w?Bro?@r_?@z_?Pz_?Oz??O~??o~??o~??o~??o~??o~??o~??o~??o~??o~??o~??o~?
+?o~??o~??pz_?Pz_?Pz_?Pr_?Bro?F`w?N`~?N?~?K?N?????G?g?_??K????BB|~~{?_O??G??Q?M?N?N_~?Np~?Fzw?@zo?Oz_?OR_?OB_?OB_?OB_?OBo??Bw??@{
+?K?~?K?^?K?~??Bw??Bo?OB_?OB_?oB??oB??oB??oB??oF??oN_?o^_?O~o?Rzw?Np~?N_~?M?N?????G?w?O??Q????Jb~~~{?_O??A_?D?@w]F`w[B?oM@_[???A?
+Y?C??@_???Bw~n~~?GC???K?A_B~?~{B~oK???A?]?K??C_????W~^~~?GC??A??Fo??o?C??K?@??B??O??w?K??M?B??Bo@o??k?[??J?F??AwBo??E?{??@_N???K
+F_??B@w???o]???EN???@bo???W{???B]????v_???Lw?GB~~oA?~~{?o?Fo?[??w?F??M?@W?B??u??o?L_?K?B[?A?@~_?o?^~?~`~~oNw^o???G@G?o??Q????BB|
+~~{?_O??Fo?[?N~~FoB~~v{?w?Fw?M?@w?F_?]?Bw?F?@}?@o?^_?[?Fw?F?@}?@o?^_?[?Bw?F_?}?@{?F_?^o?wN{~?MB~~oB_?^?@w?F_?}?@o?^_?W?Fw?E?B}?@
+_?~_?W?Nw?E?B}?@_?~_?[?Fw?F?@}?@w?N_?^_@~~~~?N~~No????A???K??C_????o~^~~?GC??@{?E_B~~~{@~~~~?]?@{?F_?[?@w?E??]?@_?F_?W?Bw?C??}?@
+??N_?OKBw?CB?}?@?oB_?OK?wGCB?MB~?oB_~oK?wGCB?M?@?oB_?OK?w?CB?M?@?oB_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??N|~??B~^o??????_F_B
+??@G????KNv~~oA@???^?@{?~r~}^~{~~f~_?[?Bw?F??}?@o?N_?[?Bw?F??}?@o?N_?[?Bw?F??}?@o?N_?[?Bw?F??}?@o?N_~~{BwN~~?}?@o?N_?[?Bw?F??}?@
+o?N_?[?Bw?F??}?@o?N_?[?Bw?F??}?@o?N_?[?Bw?F??}?@o?N~N~x~~r~}^o???G@o?_??Q????BB|~~{?_O??G??S?KB~B{B~BoBo??Bo??Bo??Bo??Bo??Bo??Bo
+??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??zo?@~o?@~o?@~o?@|w??x{?@w}?No^?N?F?????GAO?o??Q????BB|~~{?_O??Fo?_?N{~
+wN~~N}B~w?F?F}?@_?^_?[?@w?F_?M?@[?B_?R_?w?C[?M?@B_B_?O[?wGCB?MB@?OB_wOK?wNCF?MAx@oB_fO{?w?{^?M?FF_B_?rw?w?D{?M?@]?B_?^_?w?Fo?]?@
+w?F_?]?Bw?F?@}?@o?^_?[?N~r~o~~{~{N{???A?k?O??B?????o~^~~?GC??A??J_B~B~o~{B~~B~o~{B~w?M?Bo?^o?K?B_?No?K?B??N_?]?F_?F_?]?F_?F_?]?F
+_?F??r?No?B??r?No?B??r?No?A?@p_]W?A?@p_]W?A?@p_]W?A?Bpo}[???Boo{K???Boo{K???Box{M???F_XwE???F_XwE???F_XwE???N?NoB???N?NoB???N?No
+B???}?F_@o??}?F_@o??}?F_@o??{?B??o??{?B??o??{?B??o??{?B??o??W?A??O????A?w?C??E????Bg~N~~?GC??Aw?B???B_?F_?N??[?@w?@o?F??M??w?@o?
+F??M??w?B_?M??W?@o?F??[?@o?F??[?@o?F??[?@o?F??[?@_?M??w?B_?M?@o?F??w?B_?[?@o?M??o?F??W?B??[?B_???GB_?O??W????Mb{~~{?_O??J_?K??[?
+B_?[?B_?M?@o?M??w?B??[?@_?M??o?F??[?@o?F??W?B_?M??w?B_?M??w?B_?M??w?B_?M??w?@_?F??[?@o?F_?M??{?@o?F_?M??[??w?B_?F??M??[?????_I?A
+???W????{Nv~~oA@???V?@_??@_??Bo??Bo??Bo??FW??FW??FW??MK??MK??MK?_KC@_KC@oGCBoG?BoN{BwN{FW??FW??FK??MK??M]??]~wB~~wB~?????G@o?_??
+Q????NB|~~{?_O??Do?R?N{~?N~~?Bb_?Rb??Rb??rb??rb??rb??rb_?Rbo?^`~?Nb~?Bb_?Rb??ra?@ra?@ra?@ra?@ra?@rb??rb_?~~~?^|~???}J???Pc|MT???
+,
+[as??CXNRdO@????Fo???@O???@TKB?oKB?sKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????wac??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????~A???HO^??BgGO???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??MWB??@C@???g_O??M_C???m@O??g_S????E??@]@_??n?W???GF??@_@o??t?[??@GH??@[A_??A?k??@WK??@SBO??e?w??LoN??@oC???S@C??MOP??AQC_??
+h@K??@oS??AoD???H`S??HoT???wD_??z@W??KOV??A[E???F@c??HoX???[E_??_`g???GZ??AAEo???`o??Bg[??@qF???s`o??@w\??@iFO??o`s???g]??@gF_??
+g@w??MW]???mFo??\`{??J?^??B{Fo??Ia???EO_??AMG???nA???Mg_???QGO??QaC??GG`??AyGO??{aC??Aga??@aG_??eaG??LOa???KGo??PAK??E?b??BQGo??
+PAO??JWc???gHO??eaS???oe??@}H_??{AW??EGf??BSHo??Pa_??J_g???OIO??^Ac??Mwh??@_I_??^ag??Ngi??@]Io??oak??AWk??AIJ???@as??B?{AThYUdhT
+KB?oKB?sGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBOoKBHRQr?oPs[??????GAG?_??K????NB|~~{?_O??Do?T??@~EKB~F^ABF~_?Fvo?Fbo?F@w?F@w?E?{?E?{???{?
+??{???{???{???{?E@w?E@w?EBo?FFo?Bn_?B~AB@{B~?O@~??????A?U?G??C_???Bo~^~~?GC??@[?CoB~~oF~~oCww?Cw_?Cw_?Cw_?KwB?KwB?KwB?KwB_BwBoBw
+Bo?wB_?wB?WwB?WwB?Ww??Ww??[w??Kw_?Kwo?N~~oN~~oK?????_J_A???o????{Nv~~oA@???V?@_??F{WoN{\{GK^}??^^??]N??[F_?[F_?WBo?WBo??Bo??Bo??
+Bo??B}B~B}B~F_?[F_?[N??[^??[}??[{?K^oN{^?N{X?????G@O?O??K????NB|~~{?_O??Do?H?N{@~oCw?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?
+M??w?N{@~oC???A?I?G??C_???Bo~^~~?GC??@[?C?B~?~{BM??w?B_?M??w?B_?M??w?B_?M??w?Bb?MK?woBb?MM?wWB`oMFb~^~|~????_B?B??@G????{Nv~~oA@
+???V?@g?NoBw?r{?}?Lw?Fo?]?@{?F_?^?BW?FW?u?@u?L_?\_AW?VK?e?Dr?H_@[o?W_vC?EGLp?@aB[O?Wpf??EKXo?@bE[??WZF??EEpo?@`k[??{MF??~rb}?~{w
+~_K???A?g?G??C_???Bo~^~~?GC??@[?D??~{?|~{?|wo?Nw_?Fw_?Fw_OFW_OEW_oEW_oCW`oCWboCWb_CWf_CWf?CWn?CWm?CW}?CW{?CWw?CWw?C{o?F~o?F~_?C?
+????_J_A???o????{Nv~~oA@???V?@[??F{?oN{@{KCF]??NN??]F??[F_?{B_?wBo@wBo@wBo@wBo@wBo@wBo@wBo@wF_?{F_?{F??[N??]]??N{KCFoN{@?F{?????
+?GAG?_??Q????NB|~~{?_O??Do?U?N{N?N{~?B`o?Bb_?Bb_?Rb_?Rb_?Rb_?Rb_?B`o?N_~?N_^?B_{?B_w?B`o?B`o?B`o?Bbo?Bbo?BboKRboM^~`N~~@Fo????A?
+}?C??B????Bo~^~~?GC??@[?BoBoK~o~FbwNN?[w@r?FK?{?FoB}?NoN}@~?No@{?F_?[?Lo?v?F[?{wFrr~F~KF????_G_A???W????{Nv~~oA@???V?@[?~n{~~n{~
+F`o{@`oo@`oo@ppo?pp_?pp_?pp_?@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o?wN{BwN{B?????GA_?_??E????NB|~~{?_O??Do?X?N{@~_F~?^w@
+]??}?F??F_B_??w?w?CE?K?@?oA?_oK?_G[@??BN?O??z_???Fw???@{????M????B_????w????M????B_????w????M????B_???B~?O??~oC?????_K_C??@_????
+_Nn~~oA@???p?Ak?~~~~@o??~~~~No??w?[?~_??o?[?{?C?o?[?w?K?o?[?_?[?o?[???{?o?[??@w?o?[??Bw?o?[??Fo?o?[??Fo?o?[??N_?o?[??N_?o?[??N?@
+o?[??N?@o?[??N?Bo?[??N?Bo?[??M?Bo?[??M?Bo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?Fo?[??M?F
+o?[??M?Bo?[??M?Bo?[??M?Bo?[??N?Bo?[??N?@o?[??N?@o?[??N?@o?[??N_?o?[??N_?o?[??Fo?o?[??Bw?o?[??@w?o?[??@{?o?[?_?{?o?[?w?[?o?[?{?C?
+w?[?~_??~~~~No??~~~~@o??????_M?C??@_????YNn~~oA@???r?Aw???B{Bw?@?GB~Nw?@?M?^}K?@?N_BoKC@?No?_M[@?Bw??M[@_@{??Nw@_?{??No@o?[??N_@
+w?K??N?@{?K??N?@{?C??M?@}?C??M?@}????K?@~????K?@^????K?@^_???K?@^_???G?@^_???G?@N_???G?@No??????No??????No??????No??????No??????
+No??????No??????No??????No??????No??????No??{N{~^_??{N{~^_???N_B^_???N?@^_???N?@^????N?@~????N?@}????N?@}?C??N?@{?C??N?@{?K??N?@
+w?[??N?@o?[??N?@_?{??N_@_@{??N_@?Fw??No@?No??Mw@?N_B_K[@?M?^{GK@?GB~~o?@??B{Fo??????_A_A??@G????_Nn~~oA@???p?@C?~~{@~~{@w?{?o?[?
+o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?
+o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?o?[?w?{?~~{@~~{@?????GBW?o??W????GBz~~{?_O??KO?a?N~~?o??~~{B??B_Bo???K?F????o?[???B?@o???K?F
+????o?[???B?@o???K?F????o?[???B?@o???K?F????o?[???B?@o???K?F????o?[???B?@o???K?F????o?[???B?@o???K?F????o?[???B?@o???K?F????o?[?
+??B?@o???K?F????o?[???B?@o???K?F????o?[???N?@o???{?F???Bo?[???N?@oA??[?F?G?@o?[?_?F?@oA??[?F?K?@o?[?o?F?@oB??[?F?M?@o?[?{?F?@oBw
+?K?F?No?w?]?~oB~~~~~?N~~~~{??????GAo@???W????GBz~~{?_O??KO?i?N{N?NB~?~{N?NB~?{?^???~?K?^???]?K?~???K?K?}???K?K@}???K?KB{???K?KB{
+???K?KBw?O?K?KBo?O?K?KBo?o?K?KB_@o?K?KB_@o?K?KB?Bo?K?KB?Bo?K?KA?Fo?K?K??Fo?K?K??No?K?K??^_?K?K??^_?K?K??~??K?K??}??K?K??}?CK?K??
+{?KK?K??{?KK?K??w?[K?K??w?[K?K??o?{K?K??_?{K?K??_@{K?K???B{K?K???B{K?K???FwK?K???FoK?K???NoK?K???N_L?K???N_L?K???N?N?K???N?N?K??
+?M?N?K???K?N?K???K?N?K???G?N?K???G?N?M?@???N?N?B???M?N{~???M?N{~???K?????GAo@???W????GBz~~{?_O??K_?i?N~~?^B~?~~~?^B~?}?N???~?K?F
+???]?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F
+???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F???K?K?F
+???K?K?F???K?G?F???M?G?N???E?G?N???E???N???F???^???B???]?G?B???}?K?@??@{?M????Bw?N????Bo?V_???B_@pw???A?~o{?????~?K??????GAo@???
+E????GBz~~{?_O??K_?o?N|~??Bo~~|~??Bo~~?N??B?F}?F??A?@{?F??A??{?N??A??w?N??A??W?N??A??W?^??B??O?^??B????^??B????}??@_???}??@_??@}
+??@_??@{???o??@{???o??B{???w??Bw???W??Bw???W??Bo?O?K??Bo?O?K??Bo?o?K??B_?o?E??B_?o?E??B_@o?F??B?@o?B??B?@o?B??A?Bw?@??A?Bw?@??A?
+Bw?@????F{??????F{??????N}??????Ne??????Ne??????^B??????^B??????^B??????}@_?????}@_?????}@s?????{?s?????{?s?????w?[?????w?[?????
+w?[?????o?K?????o?K?????o?K?????_?C??????G?W?o??Q????BB|~~{?_O??Fo?]?KB~??Bo~oK?]K?N?Fo?Fo@{?Bw?^??{?Fo?^??w?F_???@w????]????F_?
+??@w??B?^o??~f{?oN|w?M?N]?Bw?v_?~?@w?Fw?]??}?F_?No@w?@{?]B?^?F_oFo@wK@{?^B?~?FwoN_@}KFy?~rb{w^K\}N~_B{?~o?K???A?]?K??C_???@g}~~~
+?GC??BG?G????G?F??B{@o??~?[??K?F??A?@o??_?[??G?F??A?@o??_?[??G?F??A?@o??_?[??G?F??A?@o??_?[??G?F??A?@o??_?[??G?F?Nq@@wB~bo^?BxwF
+w?Nw@~?@{?^w?M?F^?B?@ro?_?[}?G?FN_A?@pw?_?[^?G?FFoA?@p{?_?[^?G?FFoA?@p{?_?[^?G?FFoA?@p{?_?[]?G?FN_A?@rw?_?[{?K?F^?B?@v_?w?^w?N?F
+{?M{@}?Ffo}?~w^~?Ny@~o???GAw?_??K????BB|~~{?_O??Fo?X??B{?OA?~o{?oG[^?M?@N_Bo?Fo?]?@w?Fo?}??{?N??N_Bo?Rw?{?C]?N?@FoB_?^~~~oF~~~{@
+Fo???@{????^????Fo???@{????^????N_???Bw????}????^?A??Vo?o?Fw?K??{?F_?M?F[?B?Fro??N{^??B{?o????A?w?C??@_???@g}~~~?GC??BG?D_??w?{?
+}@{?Nbo?Frw?Bry?@ry?@pr?@oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB~~oN~~oN??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB?
+?oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB??oB_@oB}~oB}~o????A?]?K??B????@g}~~~?GC??BG?GOB_?O???N{@????~oC???Bo?O???M?@
+????w?C???B_?O???M?@????w?C???B_?O???M?@????w?C???B_?O???M?@????w?C???B_?O???M?@????w?C???B_?O???MA@^o??wMF~?OB_]^?B?M?\o?[?w?}?
+@oB_@w?N?M?F??{?w?K?BoB_?o?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N
+?M?@??{?w?C?BoB_?O?N?M?@??{?{?M?FoB~N~b~?^{~}N{@????_J?@???o????eNn~~oA@???o??s?{?Bw?^_@}?Fw?^???????????????????????????????M?@
+~oF~?^?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@w?F_?]?@{?N~F~{^????_@_B???o????KNv~~oA@???^?@s??N_B??B~FoA?@ro?
+w?Fo?N??w?Dw?K?B]?B??ro?_?[{?G?FF_??Bpw???{]???NFo??Fp{??@{^???^Fo??Fp{??@{^???^Fo??Fp{??@{]???NN_A?Bro?_?[{?G?F]?B??v_?o?No?M?@
+w?Nw?G?NN_??~p{??N_B?????G@W?_??K????BB|~~{?_O??Fo?U?MB`B~~pF~{|Nn?\Nm?NNm?FNm?F?M?B?M?B?M?B?M?@?M?@?M?@?M?@?M?@?M?@?M?@?M?@?M?@
+?M?@?M?@?M?@?M?@?M?@?M?@?M?@?M?@?M?@?N?B?N|~?N|~??????A?[?G??B?????o~^~~?GC??@{?D_B?^oro~o|{w?{]_?{M??{F??wF??wF??oF??oN??o^??B}
+??B}BoB{~oBo~oN?~o[?~?{?o@{??@{B?BwB?BoF?B_F?B_F?B_N?B_^?@o^?@o~??~vo?~b~oMB~o??????_D_A???W????}Nn~~oA@???k?@O???K???K???K???K?
+??K?_?K?_?K?_?K?o?K?o?K?w?K?{?K?}?K?~~{F~~{Fo?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?K?o?KKo?KKo?KKo?KKo?KK
+o?KKo?KKo?KM_?[E_?[F?H{B?N{B?No?????_F_B???o????KNv~~oA@???^?AC?w?C?BoB~?^_N?N{@}?{?{?E?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?
+BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?O?N?M?@??{?w?C?BoB_?W?N?M?@_?{?w?E?BoB_?[?N?K?Bw?{?o?LoBoA?Bro^
+??B~F~{@?NoB~oC?????_@_B??@G????kNn~~oA@???o?@k??No@??B~@oB?@p{?w?C{?N??]?@o?F??]?Bo?B_?w??{?M?@N?B_?Ro?w?C]?K?BF_B??pw?o?K]?K?B
+FoB?@p{?o?[^?K?FFoB?@p{?o?[^?K?FFoB?@p{?o?[^?K?FFoB?@p{?o?[^?K?FFoB?@p{?o?[^?K?FFoB?@p{?o?[^?K?FF_B??pw?o?K]?K?BN_B_?ro?w?C{?M?@
+N?B_?V_?{?@w?N??{?@w?N??]?B_?Ro?o?[^??B~@o??~?C?????_@_B??@G????kNn~~oA@???o?@k??NwB?GB~BoB__r{?{?@}?F_?~??w?N_?F?Bw?Vo?}?D{?N_@
+~?Bo?Vo?}?D{?N_@C?Bw?O??}????N_???B{????^????Bw????~??A?Fo??w?[??N{@??B~?o??_?{????}????^????N_???Bw?O??{?K??N?B??B_?o??w?[??M?F
+F_B_@r{?w?[~?M?FNoB_@r{?w?[^?M?F@oBo?oW?{?KM?N?@F?Bw?R_?~?Bo?Fw?wGK~?KB~Bo??~_C?????_J_A???W????iNv~~oA@???Y?@g????B????@o??_?[?
+?G?F??B?@o??w?[??M?N??@oBo??K?{??B_N???WBo??F?{???o^???MF_??@`w???[]???BF_A?~p{?_N{~?K?@N?B??Bo?w??{?E??N?Bo?Fo?~gF~?~}@~oK???A?
+g?G??E????Ag~^~~?GC??@g?EO??}G[@?Ny^?W?^~?F_@~_@{?Fo?^_?w?Dw?M??N?B??Bw?o??]?K??F_???@{????N????Bo????{????N????Bo@o??{?K??N?B??
+F_?w?@w?E??{?@o?^??N?Nb@@oB_~oC?_F{??????GAw?_??E????Ib|~~{?_O??E_?Z?NB~FoBo~v{???~o???Nw?C?B{?B_?}??w?F_?]?@o?F_?[?@w?F??]?@o?F
+o?]?@{?B_?^??w?Fo?M?@{?B_?^??w?Bw?N??}?@o?F_?]?@w?F_?M?@[?Bo?Ro?{?C^?N~~@oB~~oC?????_C?A???W????iNv~~oA@???Y?@S?{N{@{N{@??{???{?
+??{?_?{?_?[?_?[?_?[?_?[?_?[?o?[?o?K?o?K?o?K?o?K?o?KWw?KWw?CWw?C[w?CKw?CM{?CN{GCN~~{F~~{F????_J_A???W????iNv~~oA@???Y?@w?{@~oN~?^
+{B{?Nw?F?B{??o@~_?M?^w?B_Fe??WBx_?E?{W?@_NE@?WB`oOF?w[K@oKBB?KB?poB?_K[?oGBN?K??zoB_?N{?W?@}?E??^_@_?Fw?W?@{?F??^?@o?F_?~oKw?N{B
+K?????A?m?G??F_???Ag~^~~?GC??@g?EoB~@~oF~o^{?~_?]?Bw?B??{??w?N??E?Bo??o?{??K?N?@@_B_?OW?w?CB?M?@?oB__OC?wGK@?KBB??B?oo??oEK??K@r
+??B?Lo??_B{??G?^??A?Bo??_?{??G?F????@o????K??????GAw?_??E????Ib|~~{?_O??E_?\?MB~}@~_^~_^?@~o?O?]W???Nb???Bow??@{F???]?o??N_E??Bo
+?o??{?K??M?@??B_?O??w?K??N?B??Bw@o??f?[??GoN???EBo???p{?_?K]?K?@N_B_?Bo?{?@{?N}B~oN~_~{B????_K_@??@G????eNz~~oA@???O?@??}?^}Bpw]
+F`oKF??]{@~{FrwMBowFB_^M@{~NZ~|~^`w???A?e?C??B????AW~n~~?GC??@??BoB?B~?~]B_{[@xo~f~}^o{?@o?F??[?Bo?MMBw[~?~o@o???GBG?O???????Hb}
+~~{?_O??E??R??A^@{B~@}Bp@~B_?FB_?FB_?FBo?F@o?N@w?N?~?N_N?@_??B_??N_~?Nb~?Nr~?@zo?Oz_?Oz_?O~_??zo?Bx{?No~?N?N?????G?G?O???????Ib|
+~~{?_O??E_?I?G?Bo?N??{?@????????????????}?Fw?]??w?B_?M??w?Bo?F??[?@o?F??[?@w?N{@~oC???A?A?C???????Ag~^~~?GC??@g?A_Bo?~?B_?M??w?B
+o?N??[?@o?F??[?@w?F_?M??w?B_?M??{?@o?F??[?@o?F_?]?B~?^{@????_??B???W????eNz~~oA@???O?@s?}Nvp@~b~~o~_pp{NwGCFBmA??oz__?KMwG?BBnB?
+?o|oo?CF[K?@@vB??O\oo?CF[K?@@vb__O^~}][^~~ffFo???GBw?O??E????Hb}~~{?_O??C??Q?Nb|?Nb~?]Bf?]B@?]B??]B??]B_?^B_?VB_?FB_?FB_?FB_?FBo
+?Fbo?N~x?~~x?o???GBw?O???????Hb}~~{?_O??Do?S?NBz?^B~@{ANB{?BB{?@Bk?@Bk?@Bm?@Bm??Bm??Bm??B}A?@}B?@~B`?~B~?V@}?F???F???F_??F_??B_?
+?N{@?N{@??????A?Y?C??@_???AW~n~~?GC??@??B_BwN~_~wBn_K]?@w?B_?N??[?@o?F??[?@o?F_?~oN~?o???G@g?O??Q????NB|~~{?_O??Do?J?K??o?@_?E??
+[?@o?Fo?~_^~?r_?M??w?B_?M??{?@o?F?K[?poBf?M[?^o@]?????A?q?C??E????BW~^~~?GC??@_?B_A?@}?^[@oWM@ooBB?MK?woBb?FM?[w@r_FM?[w@r_BF?K[
+?poBB?KM@o]M?~w@]?????A?q?C??C_???BW~^~~?GC??@_?BoB?F}?~{Fbw[N`o}F`o]?@w?Bo?F}?Nw?[?F_?{?Bo?N??{Fro^N@{]Bp}NB~wF~?C???A?w?C?????
+??A?~n~~?GC??@C?C?B~F~{~MF?wwBb_MM?wwB`o}B~wFr_?M??w?B_?M?B~?^{@????_@?A????????_Nz~~oA@???P?@O?~o{?~r{?MF??MM??MM??MM??MF??}B{?
+}B{?MF_?MF??MF??MF??MF??MN?K~~CN~{CF?????G@O?O??E????@B~~~{?_O??Ao?I?N_?~_EM?~{B~oKB??K?@oMM?~o@}?????A?{?????????A?~n~~?GC??@C?
+A_B_?~?Bm?KW?P_?E?@~?F{?E??W?@_?E??W?@_?E?@}?Fw?????_L_?????????YNz~~oA@???Q??W?B_wM??????{NB?oKB?oKBB{~????_H_@???W????CN~~~oA@
+???J??s?~oN~@poFB?WK@_oEB?WK@_oENp{~Fo???G@g?O??E????@B~~~{?_O??Ao?J?N_?~?CE?oKE?oWB@_KE?oWE?~o@}?????A?G?C??@_???Ao~n~~?GC???{?
+@o?KB?oM^v{KB?oKZEpk^B_?????_E_@???W????eNz~~oA@???O??k?}?B{?OWB?_GB@_KE?oWB@_KE?oWB@_KE@_KE?~o@}?????A?Y?C??B????AW~n~~?GC??@??
+AO?W?@w?Fo?X?@_?E??W?@_?E??W?@_?E??W?@_?~oF~?O???G@g?O??E????Hb}~~{?_O??C??J?No?~oNN@o{FBo[?@o?F_?]??}?@{??w?@oEB_Z~?~{B????_E_@
+???W????eNz~~oA@???O??k?}?B}?WwBf_MM?{?B{?Fo?W?B??[E@o{FBo]N?~wB~?????A?Y?C??@_???AW~n~~?GC??@??AoB_?M??{?Bw?L_?v?BK?KW?poB~@~{F
+o?B??K??}?^w@o???G@g?O??E????Hb}~~{?_O??C??J?GW@~_F}?Bw?@_?E?NW@~_M]@owF??[F@o[F`oN~?~o?????_E_@???W????eNz~~oA@???O??k?{?Fw?xoB
+b_KE?CK?~oN~?o[F?oWB@_KE@_]M?~oB}?????A?Y?C??B????A?~n~~?GC??@C?Ao?E?NwF~_[B@wKBo?F_?E??[?@o?B??M??w?B_?M??w?B_?????_E_@???W????
+eNz~~oA@???O??k?}?B{?WwB@_KM?zwB~?F{?^wBpo[B@oKE?oYN@~wB}?????A?Y?C??@_???AW~n~~?GC??@??AoBw?Nw@b_KF?oKE?oWB@_[F~_^}@p?E??MM?{w@
+~_D{?????GBW????K????LB~~~{?_O???o?B??[F@o????A?[?G??@_???@G~^~~?GC??@w?D_B~^oB~~oB~~oCww?Kw_?[w??{w??ww?@ww?@ow?@ow?Bow?B_w?B_w
+?B_w?B_w?B_w?B_w?B_w?B_w?Bow?@ow?@ow?@ww??ww??{w_?[ww?N~~oN~~oB~^o????A?[?G??B????@G~^~~?GC??@w?DOA?No^_~o^o~o^w{O\wo?[{o?[}_?[]
+??[M??[N??[N???F???F???F???F???F???F{@{F{@{F{@{N??[N??[M_?[]_?[}_?[{o?\ww?^w{O^o~o^_^o]?No[???A?[?G??E????@G~^~~?GC??@w?COB~~oF~
+~oF~~oE??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oA??oB~~oF~~oF~~oC???A?[?G??@_?
+??@G~^~~?GC??@w?D_B~BoB~BoB~Bo@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o??@o?B`o?B`o?B`o?B`o?Bb~
+~r~~~r~~~r{???A?[?G??@_???@G~^~~?GC??@w?Do@~oF~~oF~~oF}w?Oyw?Oyw?oww?oww?oww@oww@oww@_wwB_wwB_wwB?wwF?wwF?wwE?wwM?wwM?wwK?ww[?ww
+[?wwW?wwW?www?wwo?wwo?z~_O~~_O~~?O{???A?[?G??C_???@G~^~~?GC??@w?CoBo^oB{~oF}~oK}w?KM_?KN_?[F??[F??[F??[F??[F??[F??[F??[F??[F??[F
+??[F??[F??[F??[F??[F??[F??[F??[N_?[N_?[M_?K}w?N}~oN{~oFo^o????A?[?G??B????@G~^~~?GC??@w?DOB~^oB~~oF~~oKwo?[w??{w??ww?@ww?@ow?@ow
+?@ow?@ow?@ww??ww??{wo?^w~oNw~oFw^o?w???w???w???w???w???w???w???w???w??B~?OB~?OB~?O????A?[?G??C_???@G~^~~?GC??@w?CoB_foNw~oN{~oL}
+}?K^w?KNo?KFo?KF_?KF_?KN???N???}??B}?OB{FoBo^oA?~oC?}?K?w?K?_?[?_?[???[F??[F??[F_?[N_?[^o?L~{?N~~oF~~oBfNo????A?[?G??@_???@G~^~~
+?GC??@w?DoB~~v~~~v~~~v{FFF?FFF?FFF?FFF??F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F?B?~oF?~oF?
+~oC???A?[?G??@_???@G~^~~?GC??@w?DoB~_F~~_F~~_F{w??ww??ww??xw??|o??\o??\o??^__?N__?N__?N__?N?oOF?oOF?oOF?oOE?woA?woA?woA?wo??Wo??
+\o??\o??\o??L_??N_??N_??F?????A?[?G??@_???@G~^~~?GC??@w?DoB}wP~}wP~}wP~o_?N_o?F_oOF?wOB?woA?[oA?\o??No??No??F_??F_??F_??N_??N_??
+^o??\oA?{oA?woB?wOF?oOF_o?N__?Lo??\o??^~oV~~oV~~oV{???A?[?G??@_???@G~^~~?GC??@w?DoB~_F~~_F~~_F{w??xo??\o??^__?N__?N_oON?oOF?woE?
+woA?wo??\o??\o??N_??N_??F???F???F???F???F???F???F???F???F???F?A?~oA?~oA?~o????A?[?G??C_????_~n~~?GC??@S?CoA?BoB_NoBw~o@{{?C{w?C]
+o?KM_?KF??[F??[F??[F??[F??[F??[N_?[M_?K]o?K{w?D{{?Fw~oB_NoA?Bo??????_F?A???W????]Nv~~oA@???[?@O?_?K?_?K?_?K?_?K?_?K?_?K?_?K?~~{F
+~~{F~~{F_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?K?_?KM_?KM_?KM_?[N_G{N?N{F?N{B?No@????_F?A??@G????QNv~~oA@???]?@K?_?{?wB{?{F{?}N_?
+MM??FK?@FK?@Bg?BBg?BBg?B@o?F@o?F@o?F@o?F@o?F@o?F@o?F@o?F@o?FBw?FBg?BBg?BFk?BFK?@NM?@MM??}N_?{F{?wB{?_?{?????_F?A???o????QNv~~oA@
+???]?@S?oF{?{N{@}N{B~M?BNG?FNG?FN??FE??F?G?F?G?F?K?B?N?B_N{@_N{@_N{B?M?F?G?N???^???]???[???[Bo?[Bo?[Bo?]Bo?^Fw?N~m?F~N{B}N{@oF{?
+????_F?A??Bo????aN~~~oA@???E??W?Fb{~Nr{]????_@_B??@G????oNv~~oA@???X?@k?@o??@o{?_?[N?G?FFoB?@p{?o?[~?M?F^oBo@v{?{?^v?F_F|o@w@}[@
+N?^f?rwFpoK]@w[FBo]F@o{F@w{F@o^^@o[Fv_KF@~o@@o^{?O[F}??F@~_?@o\o??[F???F@o??@o???G@o?_??Q????KB|~~{?_O??EO?S?N~~B~~~B~~~Bo[???[?
+??[???[???[???[???[???[???[??N~~?~~~?~~~?o[???[???[???[???[???[???[??N~~B~~~B~~~Bo????A?O?G???????B?~^~~?GC??@c?DoB~~v~~~v~~~v{?
+F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???F???????_I?A??@G????oNv~~oA@???X?@W?oN{?}N{F
+~N{NN_?^F_?]B_?[Bo?{Bo?{@o?w@o?w@o?w@o?w~~{~~~{~~~{~@o?w@o?w@o?w@o?w@o?w@o?w@o?w@o?w@o?w@o?w?????G@o?_??Q????KB|~~{?_O??EO?S?N~~
+B~~~B~~~Bo[???[???[???[???[???[???[???[???[??N~~?~~~?~~~?o[???[???[???[???[???[???[???[???[???[???????A?g?G??@_???B?~^~~?GC??@c?
+E_A?~o[?wN{^?Nb~^oB{?No?N_Bo?Pw?w?CM?K?@BoB??o{?o?KF?G?B@oA??o[?_?KF?G?B@oA??o[?_?KF?G?B@oA??o[?_?KN?K?BBoB??pw?w?D}?N_@~N~~?NB~
+NoA?~o[?????_I?A??@G????oNv~~oA@???X?@W?@o?wBo?wFo?wNo?w^o?w~o?w|oCwxoKwpo[w`o{w@o{w@pww@rww@vow@~_w@~?x@}?z@{?~@w?~@o?~@o?}@o?{
+@o?w@o?w@o?w?FGl??@ERsxS????????????????????????????????????????????????????????????????????????????????????????????????????????
+,
+iAW??CXNRdO@????Fo???@O???@TKB?oKB?tKB?qSskoKC\FKB?oKTTYUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??@w?O??w?C????????????????????????o????U?K?????????????EAK??G_B???`????^_??????????????????????????????
+G????I_????O????V_????????@]?????????Dw?????????IPg??CcX???wEo???????????????????_????[???@W?o??@o???D{B???O????X_K??@????@u?o??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+a?K??I_B??@?@???i?O??MwC???K@O??Z?S??I_D???[@_??c?W???OF??@w@o??w_[??CwG??BUA???V_c??MWH??@QA_??g?g??@?J??@]Ao??j?k??M_J???sB???
+k?o??NGK???sBO??n?s??A_M??AoB_??A?{??E?N??AaBo??}_{??EWO??A}C???D`C??EwP??BECO??A@G??CgQ??AKC_??r`G??@?R??@QCo??d@K??L_R???YD???
+V@O??KGS??@[DO??j`S????U??@QD_??c@W??MGU???_Do??[`[??MGV???WE???Y`_??LgW??@eEO??l@c??NoX??@IE_??e@g??@_Z??AWEo??~`k??Cg[??AUF???
+v`o??D?\??AMFO??r@s????]???sF_??Y@w??Jg]????Fo??K@{??G?^??AsFo??WA???M__??ASGO??OAG??Moa??@sGo??~AK??H?c???EHO??jaS??B@AAThYUdhT
+KB?oKB?tGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBSoKBHRQr?oPs[??????G@G?o??W????Nb}~~{?_O???_?Y?N~~~oN~~~{B????_C_B??@G????KNv~~oA@???_?@o?
+?E????@_????W????E????@_????W????E????@_????W????E????@_????W????E????@_????W???~~~~B~~~~o{?W????E????@_????W????E????@_????W???
+?E????@_????W????E????@_????W???~~~~B~~~~o{???A?Q?K??C_????_~n~~?GC??@O?F?B~~~{N~~~~Bo????????????????????????????????????B~~~{N
+~~~~Bo????????????????????????????????????B~~~{N~~~~Bo???G?w?O??]????Mb{~~{?_O??JO?A??KB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB?oKB
+?oKB?oKB?oKB?oKB?o????A?M?C??E????BG~n~~?GC???S?@O?MFp{^B_????A?Q?K??H????Bo~^~~?GC??@_?D_?B?B?F?B_N?Bo]?@w{??|w_?^oo?N_wOF?{oA?
+^o??No??F_??F_??NoA?^oB?{oB_wOFoo?Lw_?[{??{]?@wN?BoF?B_B?B????A?I?G??C_????w~n~~?GC??@G?C?B_@~_^~B~}^~x~~~~~~~~~~~~~~~~~~~~~~~x~
+~f~{N~_^w?[???A?w?C??K????Bg~N~~?GC??Aw?Ao?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K??o?B??K?
+?o?B??K??o?B??K??o?B??K??o?B??K?~o^~@o???GB_?O???????Mb{~~{?_O??J_?J???E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E
+??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??W?@_?E??Z~@~{F????_J?@??@_????yNr~~oA@???m??g???M??w?B_?F??[?@o?B_?M??W?@o?F??
+M??w?@_?F??[??o?B_?M??W?@o?F??[?@o?E??w?B_?K?@o?F??W?B_?M?@o?F??W?B_?M??o?B??[?@_?E??w?B??K???A?k?C??C_???Bg~N~~?GC??Aw?A_?B??[?
+@o?E??w?B_?K?@o?F??W?B_?M?@o?F??W?B_?M??o?B??[?@_?E??w?B_?M??w?@o?F??[??w?B_?E??[?@o?B_?M??W?@o?F??K??w?B_?E??[?@o?B?????GB_?O??
+Q????@b|~~{?_O??IO?L?N?@~?K]@owMBowFB_[M@o?F??{?B_?]?Bo?}?B{?xwFB_{NB_[]@poFF?[[BpoMF`wMN?~w@}?B_?[?Bo?M?@w?F??[B`oMF?w]B_w[B~_F
+{?C???A?w?C??C_????W~^~~?GC??Ag?BOB_?M??w?B_?M??w?B_?M??w?B_?M??~p~~F~{^w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??
+w?B_?M??w?B_?M??w?????A?W?K??B????@w~^~~?GC??@o?Fo??o?C??K?@??B_?o??w?K??M?B??Bo@o??{?[??N_N??BWBo??u?{??Go^??AKFo??`b{???W~???F
+^o???vw???L}?G?@~?A?~~{?oN~~?[??}?F??N_@W?Bo?u??{?Lo?N?FK?B_@~{B~f~~?~x~????_B?B??@G????]Nv~~oA@???[?@k??N_N@_B~No^?N~_F{?^_@~_B
+o?^w?W?F~???@~w???^}???F^_??@f{???X~????^o???F{???@~????^o???F{???@~????^_??@nw???Z}???E~???@~_@??Nw?w?B{?^_?[?~}???~r{??N_N????
+?G@w?o??K????Fb|~~{?_O??F??^?N~~FoB~~~{?{?Nw?~?Bw?^o?{?N{?M?F~?B_@~o?o?~{?K?N~?B?B~o?o@~{?K?^~?B?F~o?o@~{?K?^~?B?F~o?o@~{?K?^~?B
+?B~o?o?~{?K?N~?B_@~o?w?^{?N?B~?Bw?^o?~_B~~~~?N~~Fo????A?m?G??B????@w~^~~?GC??@o?E?B~~oB~~oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo
+?oBo?oBo?oBo?oBo?oBo?oBo?{Bo?{Bo?{Bo?}Bo?}Bo?uBo?vBo?vbo?vz~~v~~~v{???A?I?G??@_???@g~n~~?GC??@G?DOBoNoB{~o@{}?D{{?L{w?Kww?K?w?N?
+~oNw~oN}wON}w?L~w?K~w?K~w?L~{?L}~?^{vp~o`p{???A?a?G??@_???@_~^~~?GC??@s?DoB~??B~??Bw??Bw??Bw??Bw??Bw??Bw??Bw??Bw??Bw??Bw~?Nw~o~w
+`p~w?R~w?Bzw?Fzw?Fzw?Fzw?Fzw?Fzw?Fzw?Fzw?Fzw?B~w?R~w`p{w~o{W~?K?????_N_@???o????YNz~~oA@???Q?@C?oB{?}N{?~N_?^n_?^n_?Nv??No??No??
+No??No??No??No??No??^g?@~k?@~MC?}F{?o@{?????_M?@???W????YNz~~oA@???Q?@C?^vo?^~{@]N[@}NK@}NC@}MC?}???}???}???}???}???}???}???}???
+}???}???~o{?~o{?????_K_@???o????YNz~~oA@???Q??w?}@~}Fow]@p_FE?{?~oF~B~w^~@~oNo?}?roFM?[wFpz~F~KF????_K_@???W????iNv~~oA@???Y??w?
+o?B??K??w?B_?N??{?B{?N{~~r~w?N_?}?Bw?N_?}?Bw?N_?}?BwKN_o}BBwKN_x{@~?Bo???G@??_??Q????BB|~~{?_O??GO?P???B???B?M?N?N_~?Bpz??zb??zB
+?O^b?O^r?O^r?O~r?P~b?F{B?N{N?Nw~?Np~?Np~?NB~?KB~??B~?ORr?P~b?P~B?P~B?P~B?O^B?OZb??zr?Bpz?N_~?M?N???B???B??????A?M?C??E?????o~^~~
+?GC??Ac?@o@~^v{F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@v|~^o????A?M?C??@_????o~^~~?GC??Ac?@o@~^v|o[F@o[F@o[F@o[F@o[F@o[F@o
+[F@o[F@o[F@o[F@o[F@o[F|~^o????A?K?K??C_???@w~^~~?GC??@o?F?B~B~{N~o~~B~??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo~~{?
+{N~~?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N{N~o~~B~{N????_C?A??@G????]Nv~~oA@???[?@C?{N{@{N{@?Bo??Bo?
+?Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo??Bo?Fro?Fro?Fro?Frw?Bp{?~_{?}?K?????_C_B??@G????]Nv~~oA@???[?@w?
+~o~{F~{N~@~o?N?@{?@o?N??M?Bo?@o?{??M?N??@oBo_?K?{K?@?NB_??Bo{???{N_@?NB{?oBoz_K?{K[F?NABBoBo_O{?{??^?N??N_Bo?Bo?{?@{?N??}?Bo?N?@
+{?Bo?^??{?N~B~o~~o~{No???G@W?_??E????AB}~~{?_O??DO?T???M???M???M???^???^???^?G?x?G?x?G?x?K@o?K@o?K@o?EB_?MB~?MB~?BB??RB??Rb??Rq?
+?~~oF~~oFo????A?I?G??@_????_~n~~?GC??@S?CoB~~oF~~oCww?Cw_?Cw_?KwE?KwE?KwE?KwF?BwFoBwFo?wF??wE?WwE?WwE?Ww??[w??Kw_?Kwo?N~~oN~~oK?
+????_B_@???W????GNz~~oA@???T??c?~oF~?R_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M?B~?^{@????_N_@???W????GNz~~oA@???T?@C?~oK?~oK?
+M???M???M???M???M???M???M???M???M???M???MG?@MG?@MG?@MK?@MK?@MM??MN??~~{?~~{??????GBg?_??E????AB}~~{?_O??DO?Z?F{?{?^~?N_F}?Bw?N_?
+}?BW?]o?u?Fk?L_@z?AW?}W?e?Ne?@_Fwo?W@}K?E?^b?@aMwO?WbmC?ELr_?@b[w??WvM??EFb_?Bpww?B~]NoF~rB{@o???G@W?_??E????AB}~~{?_O??DO?T?B~_
+Fv~_F~a?@~_??~_@?|_B?x_B?x_F?p_F?p_M?p_]?p_[?p_{?p`w?p`o?pbo?pb_?pb??rr??~}??~{??o????A?[?G??B?????_~n~~?GC??@S?D?A?FoB_^oBo{??w
+o?C[_?K]_?[M??[N??{N??{N??{N??{N??{N??{N??{]_?[]_?[{o?Kwo?Fw{?F_^oA?Fo??????_D_A???W????GNz~~oA@???T?@S?~n{N~n{NB_wM@_wK@ow[?owW
+?owW?owW??w???w???w???w???w???w???w???w???w???w???w?wN{?wN{??????G@W?_???????AB}~~{?_O??DO?V?N}@^~}@^~??B~??@}???{A@?[BB?WBB??@f
+??@v???}???}???[???[???[???[???[???[???[?GB~?GB~??????A?k?C??@_????_~n~~?GC??@S?BoB_?~_NF@oMM?Wo@b?F[?\o@v?F[?\o@v?F[?\o@v?EK?ww
+Bb_[FN_Nw?K???A?k?C??B?????_~n~~?GC??@S?B?B??N??~oBn?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?NwN~_{???A?k?C??B?????_~n~~?GC??@S?
+BOBw?^oFb_{FFo[]@pwFF??]?@w?Bo?N_?^??}?@[??wE@oWB`r~B~{N~o{???A?k?C??@_????_~n~~?GC??@S?BoBw@~o^B`wMN?w{?Bo?N??]?@~_B}?F?@w?N?@w
+?F_F]?\w@voMNnw^}?[???A?k?C??@_????_~n~~?GC??@S?Bo??B_?N??}?B{?Nw?x_Bf?MM?wWB_oMB_wFBn|~~v{?B_?M??w?Bk@~oF{???A?k?C??B?????_~n~~
+?GC??@S?BO?MBNwN~_^}?oW?@_?E??W?|_N}@pwN@_w?F??[?@oFF?[[@owNB~wF}?C???A?k?C??@_????_~n~~?GC??@S?BoB?B~?^]B_{M@wwB_?M??[@|o~~Fp{w
+Bv_F[?\o@v?E[?xoBb_{NN_^{?[???A?k?C??B?????G~n~~?GC??@W?Bo?E?Nx~~f~}^o[w?poBB_?E??]??w?@o?F??M??w?@_?F??[?@o?F??[?@o?????GAo?O??
+E????AB}~~{?_O??DO?N?N?F~@{{N`w{Bb_MM@w{^@z{B~?F}?}{Npw}Bv_F]?\o@v?N]Bw{~@~o@o???GAo?O??E????AB}~~{?_O??DO?N?N?F}?{]F_ww@r_F[?\o
+@v?F[?|wBfr{^~`vOF??M??wBboMF?wN~?^w?O???GA_?_??Q????Ib|~~{?_O??E_?U?N~~?N~~?~A?B~??Fn??FN??NN??NN??NN??NN??NN??FN??FnA?B~B~?~B~
+?N???N???N???N???N???N???N???N???N???N{N?N{N?????GBW?o??K????Ib|~~{?_O??E_?d?N~B~~C^~{N~{P|w?By?@v_?Ng?B{??}_?Fo?By??^??]w?@w?Dz
+o?B_?Vn??MA@{[??wGNpw?B?_~D_?KBBwEC?oKN_WOA?p}?p?GBfwBK?_E^?Ko??Z{?Z??@no@k??B}?Fo??Ng?N???}_?{??@w?Bo??F_?N???[??[???o?@_????A?
+I?G??@_???@O~n~~?GC??@K?D???@_??Bo??Bo??BoA?FOA?FOA?FOB?M?B?M?B_]?@_[?@_[?Bo~oBo~o?ow??wo?C{o?D~{?|~{?{?????_@?A???o????SNz~~oA@
+???R?@C?oG{@{J{@}N?@NM?@Fk?@Bk?@Bw?@@w?@@o??@o??@o??@w?@Bw?@Bg?@Fk?@NM??}F??{B{?o@{??????GBw?O???????DB}~~{?_O??Co?R?N~~?^~~?Rb?
+?Ra??Ra??r_o?r_o?r_w?N_~?N_~?B_w?B_o@b_o@b_?@b_?@r_??rb??~~~?~~~?o????A?A?C??@_???@O~n~~?GC??@K?AOB~?^{@M??w?B_?M??w?B_?M??w?B_?
+M??w?B_?M??w?B_?~oF~?O???GBG?O???????DB}~~{?_O??Co?P?N{@?N{@?B_??B_??B_??B_??B_??B_??B_??B_??B_??Ba??Ra??Ra??Rb??Rb_?Bbo?N~~?N~~
+??????A?e?C??B????@O~n~~?GC??@K?B?BwB^wNB_{FB_[K@o?N?F{?~_N{@~?F??{?B_?M?owBB_{F~o^z?O???G?g?_??E????DB}~~{?_O??Co?S?F~?Bv~?Brq?
+?ra??Ra??VB??FB??NB_?M@_?M@_?K?p?K?p?K?x?G?Z?G?Z???N???N???N???E??????A?s?G??E????@_~^~~?GC??@s?DoB~NoB~~oB~~oCN{?[No?{N??{N?@wN
+?@wN?BoN?BoN?B_N?F_N?F_N?F_N?F_N?F_N?F_N?F_N?F_N?BoN?BoN?BwN?@wN??{N_?{Nw?^~~oN~~oB~No??????_A?@??@_????WNv~~oA@???\??O?Bo{NBo{N
+Bo{NBo{NBo{NBo{NBo{NBo{NBo{NBo{?????_@?A??@_????WNv~~oA@???\??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?Bo?N??{?
+Bo?N?N|~~v~~^o???GAw?_??W????EB|~~{?_O??FO?S?B{?Bb{?Bf{?Bf[?Bn[?Bm[?Bm[?Bm[@Bk[@Bk[BBk[BBg[FBg[FB_[FB_[NB_[MB_[]B_[]B_[{B_[{B_[w
+B_\wB_\oB_\oB_^oB_^_B_^_Bo^?Bo^?Bo????A?g?G??@_???@_~^~~?GC??@s?EO?N?K?@BoB??Pw?w??]?M??F_B_?Bo?[??{?F??^?@o?F_?M?@w?B_?{??[?N??
+F?Bo?@o?w?CM?M?@B_B??oW?o?KF?K?B@oA?@oK?_G[B?GAF?o??boC??K{@??BM????r_???Lw???@{????^????B_??????GBw?O??E????Eb}~~{?_O??C_?Q?K?N
+?N?~?N`~?Bro?@z_?Oz??O]??o]??o]??o]??o]??o~??oz??Pz_?Rro?N`~?N?~?K?N?????G@g?O??E????Lb|~~{?_O??E??K?B_?M??w?B_?M??w?N{F~o^~@r_?
+M??w?B_?M??w?B_?M??w?B_?M?@w@n_N{?~o?o???GBw?O??K????HB|~~{?_O??Eo?O?M?F{?~wFro{Ff_M[?xo@}?Fw?^_@}?Fw?^_@}?Fw?^_@}?Fw?^_B~?M[?xo
+Ff_{NN_^{?~_@o???GBw?O??K????HB|~~{?_O??Eo?O?N?F~@~}Nr{}Bv_F]?Hw?F_?]??{?Bz_F}?Nw@{?N_@w?N_?{?Bo?N?@{?Nw@v_^^nw~~@~o@o???G???o??
+K????Ib|~~{?_O??E_?Z??B{BoY?~r{Fw@~w@~?Fw?^w?[?F~?A?@vo???\}???F^_??@b{???W~????No???B{????~????No???B{????~???E^_??@fw???X{???F
+~?A??~_@_?No@}?@w@~w?GB~No??~?{?????_B?B???o????iNv~~oA@???Y?@s?~~{N?N~~NoBo?~o?{?No?^?Bw?No?{?F{?N?@~?B_?~o?w?N{?M?F~?B_@~o?w?^
+{?M?F~?B_@~o?w?^{?M?F~?B_@~o?w?N{?M?B~?Bo?~o?{?F{?N_?~?B{?Fo?~o?~~|~?N~~Bo????A?a?G??B????Ag~^~~?GC??@g?D_B~^oB~^oBo?oBo?oBo?oBo
+?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?oBo?rBo?rBo?rBo?rbo?rbo?pro?pzo?p~~~p~~~p{???A?U?G??@_???A?~n~~?GC??@C?D_B~~?F~~_Nwxo^w
+oo^woO^wo?^wo?^wo?^wo?^wo?^wo?^wo?^wo?^wo?^wo?^~xr~~xr{?????_@?A???W????_Nz~~oA@???P?@K?o@{?{F{?^N?@NM?@Fk?BFk?BF{?FF{?FF{?FF{?F
+F{?FF{?FFk?BNm?B^N?@{F{?o@{??????GAW?O??E????Lb|~~{?_O??E??L?K??o?B??M??w?Bo?No?~o~~B~_?}?Bw?N_?}?Bw?N_?}?BwEN_W}@bwEN_\{?~_@o??
+?G?O?_??K????Fb|~~{?_O??F_?P???B???B?M?^?N`~?Brz??zb??^b?O^r?O^r?O~r?R~r?^{B?N{^?Nw~?Np~?Nb~?NB~??B~?Ozz?P~b?P~B?P~B?P~B?O^b??zb
+?Bxz?N_~?M?N???B???B?????G?_?O??W????Fb|~~{?_O??HO?F?F|~^o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o\~^v{?????_A?@????????]Nv~~oA@
+???d??[?^v|~[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F@o[F|~^o????A?q?C??@_???BG~n~~?GC???w?C?B_M~_~NBw]N?w{@poFF?[]@pwBr_^Nr}~}^vo{
+????_E_@???W????qNz~~oA@???M??s?o?~oFvo[F`oM??[?@o?F??[?@o?FE?{]~_~w?o???GA??O??E????Kb}~~{?_O??B_?L?M?N}@{{F@w[Boz~B~{B@o?F??[?
+@p_MFnwN}?K???A?e?C??B????Bo~^~~?GC??@s?C???}?B{?No?z_?M??w?Bo?F??^o^~@~??]?@w?B_?M??w?Bo?N??[?@o?F??[?@w?B_?M[?\o@~?@w?????_A?@
+????????{Nv~~oA@???V??g?_?M??w?@????????????????]?B{?Mw?x_Bf?N??[?@w?B_?M?M{?xoB~?Fw?????G?G?O??E????NB|~~{?_O??Do?G?Nr{[F@w]B_w
+NBo[F@w]B_wNBu\f\r{]?????GBg?_???????Kb}~~{?_O??B_?\?Fr{}?F}~~sB|k]N?~^@`oNroWKB{KAB?vB?_OLwwKCB]MB@?Rb_o@cwwM?\NNB_FBrow?{[[K?F
+????_G?@???o????qNz~~oA@???M??o?w?^oBv_MM?w{@no@}?^w@w?F@o[F@w[B~oN}?????GBg?_??E????IB{~~{?_O??HO?Z?Nz~?OB~~o[?~~{^?Nz~NoBo?F{?
+{?@{?N??}?Bo?N?@{?Bo?^??w?Fo?M?B{?B??~??o?No?K?F{?A?@~??_?^o?G?F{?A?@~??_?^o?G?F{?A?@~??_?^o?G?F{?B?@~??o?No?K?B{?B??~??w?No?N?@
+{?Bo?^??}?Bo?Fo?{?@~?Nz~NoB~~p{?~~{N?Nz~?O????A?y?G??E????A_~N~~?GC??AS?D_B}~p~~~r~~~r~}~p{?F_??F_??F_??F_??F_??F_??F_??F_??F_??
+F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_??F_B}~p~~~r~~~r~}~p{?????_M_A???o????gNr~~oA@???d?@g?
+~b{??N|~??B~^o??~b{??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??w?C??M?@??B_?O??
+w?C??M?@??B_?W?@w?F??}?@o?N_?[?Bw?F??}?@o?N_?[?B~n~~?~~~~oN~~~{B~n~~?o???GBg?_??E????IB{~~{?_O??HO?[?NwB~_^~?~{N~o^~B~wF~_^o@n??
+{?zo?N?M{?BoBn??{@ro?N?[{?BoFN??{Bro?N?w{?BoMN??{Fbo?N@w{?Bo[N??{NBo?NBo{?Bo{N??{MBo?NB_{OBowNC?{KBp?NB?{OBooNK?{GBr?NA?{oBo_NK?
+{?Bv?N??|oBo?N[?{?Bu?NwF~_B~B~w?~o~{?NwF~?????A?y?G??@_???A_~N~~?GC??AS?F?B}?~oF~o^}B~{F~_~}?~oF{?Bo?N??{?Bo?N??{?Bo?M?@]?B_?V_?
+w?Dw?M?@]?B??ro?o?K{?K?BN?B??ro?o?[}?G?FF_A?@pw?_?[]?G?FF_??Bo{???{N???NBo??Bo{???wF??A]@o??f_[??HwF??A[?o??f?K??HoB??A[?o??}?C?
+?N_@??Bw?O??{???????_M_A??@G????gNr~~oA@???d?@_??Fw?_N{@oN{BwN{F{KKN}??^]??]^??}N??{N_@{F_@wF_@wF_@wBoBoBoBoBoBoBoBoBoBoBoBoBoBo
+BoBoBoBoBoBoFoBwF_@wF_@wF_@wN_@{N??{^??}}??^}GC^{KKNwN{FoN{B_N{@?Fw??????GBg?_??Q????IB{~~{?_O??HO?W?KB~?^B~@~b~B~r~F~y?Nvw?^fw?
+^Fw?]Fw?]Bo?]???^???^???N_A?NoB_FwB~BwB~@wB~@wB~BoB?No??No??^???}???}???{???{@w?{B{?{B{?}B{?}B{?^B{?^~z@N~z~F~r~B~B~@wB~??????A?
+]?K??I_????o~^~~?GC??@{?Fo??w?[??Na^@o?}v?[?F~_F_?~o@{?F{?N_?}?B{?N_?~?@{?Nw?^?@}?Bo?^o?{?F{?N_@~_Bw?Fw?}?@}?N_?^_B{?F{?^??~?Fo?
+No@{?B{?^f?~?BwoNo?}K@{?Nb?}?B{wNg?~EBz?Npp{wBwK}F_{Bn?~~?^?B~?B????_@_B??B?????KNv~~oA@???^?@_??M?^?No~?Fxw_@~oo?^_w?N_{?F_}?F_
+~?Bo~?@w^_@{^_?~^n_N~~{B~o{?No??No??No??Fo??Fo??Fo??Fo??FoB?FoB_F_@oN_?wN??[^??N}M?F{N{@oB{??????G?O?_??c????Hbz~~{?_O??K??P??B_
+?OBo?OBw?OBw?OBw?OBo?????????????????????????????????????????????K?F?N?^?F_}?@_{?@o}??o}??w}??W}??W~??[^??K^?G?^?G?N?K?N?K?F?K?F
+?M?F?M?B?M?B?N?B?NB@?^b@?Nb??Nb??Nb_?F`_?F`o?F_w?N_[?N?N?M?F?????GAG@O??c????BB|~~{?_O??Fo?u?M?F{?~?FoBoB~o^}F{?M@{^Nfr{?@q}@vo]
+}??K~_L{@~??BNw@}?No?OZ}?N_@{?CE^_Bw?^?@@b{?~?Bw?O[~?No?}??BFo@{?N_??@{?^?Bw?G?^?Fw?~?A?Fo@}?Fo?_?{?N_@{?G?N?Bw?^?B?Bo?~?Fw?o?{?
+No?}?K?F?@{?N_B?@o?^?B{?w?]?Fo?^MM?F_@}?Fpb_?w?N_?{Ww?M?Bw?NFN?Bo?}?Boro?{?N_?[M{?F?@w?F@n?@o?]?@o^o?[?F_K{B{?B??oB~?^??o?K?^_??
+iAW??CXNRdO?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
+,
+v@[??CXNRdO@????Fo???@O???@TKB?oKB?tKB?qSskoKC\FKB?oKS|YUdhYKBHEKB?o?????????????????????????????????????????????????JSFAO?J??w?
+?????E_???B{????^????EO@??Aw????w?C????????????????????????o????e?G?????????????B@S??K_A???`????R_??????????????????????????????
+G????I_????O????JO????C????m?????????As?????????qP???JoO??@oCO???????????????????_????[???AW?_??@o???H{A???O????h_G??@????Au?_??
+??????????????????????g???Bs?O?????W?@?????O?????O?@??C??O????C?????????????????????????????????F_???@O???BC~~~~D????Ej~~~{S????
+???@????F_Ae~~~~?????A_?????????N????N?????{????X????N????@w????I????F_???@_~~~~aN~~~zj~~~~o????RN~~~ro???A_????]????@O????S????
+q?G??FoB??Bq?o??b_O??@GD??@{@O????W??EgE??BS@_??U?[??KGF??@IA???z__??DgH??BaAO??Y_g??NwI???uAo??Z_k??KWJ??B}Ao??P?o??GoK???AB_??
+]?{??M_O??@{CO??K@G??EwQ??AkC_??y`G??A_R??@eCo??p@K???gS??AsD???V`S???gU???gD_??W@W??JgU????????M`[??DWV??@sDo??h`[??B?{AThYUdhT
+KB?oKB?tGA?_GA?_GA?_GA?_GA?_GDSoKB?oKBSoKBHRQr?oPs[??????GB??o??c????BB|~~{?_O??Fo?b?M?F}?K?{?~}Bo?wFw{^?@q}?p{?BNw@F_?K~_?}??X}
+?Bw?@fw?N_?ENo?~??[~?@{??p{?Fo??Fo?^?G?^_@{?_@}?BoA?Bw?N?G?N_?{?o?~?BoB?B{?F?K?Fo?[?o?^_@oB_@}?B@}?F{?KBw?No?ON_?~A@?~?B{GC@{?No
+o?Fo?^B??N?@{M??{?Fo]OBo?M?~?N??o?{??????GAw?_??c????BB|~~{?_O??Fo?U??Bo@oB{Fo?}N??NMG?FMG?FNk?BNk?BNk?BFm?B?M?F?M?~?MB~?[B~@{B~
+@wB~BoB~BoBoFoB?FoA?Fpo?Frw?Br{?Br{?Br}?@p}?@o^??o~_?Rzw?Np~?N?N??????A?O?G??H????Bw}~~~?GC??Ao?D???{???{???}???}???}???~???~???
+^???^???^_??^_??N_??N_B~~o~~~o{?Fo??FoA?FoA?FoA?BoA?BoB?BoB?BoB?@oB?@oB_@oB_@oB_?oB_?oBo?oBo?oBo?OBo?OBw?O^w?ONw??Nw_?Nw_?Fwo?Fw
+w?Bw[?Bo]?BoNoB?Bo????A?W?K??E????AO~^~~?GC??@k?F??F???MBo??Bo{???{^?G?NFoA?Br{?o?|~?M?N^oB_B~[?{?zv?N?MxoDwBm[B^?zF?roM`o[]Bg[F
+F_wFBo{M@x{NB_]]@owF~?KM@~oBB_^w?OwF}?CM@~??B_^o??wF???M@o??B_[???w???A?g?G??E????AO~^~~?GC??@k?D?B~~o~~~o~~~o{F???F???F???F???F
+???F???F???F???F???F??B~~oF~~oF~~oCF???F???F???F???F???F???F???F??B~~o~~~o~~~o{?????_F?A????????cNv~~oA@???Z?@k?~~~~@~~~~o^~~~{F
+?F????@o????[????F????@o????[????F????@o????[????F????@o????[????F????@o????[????F????@o????[????F????@o????[????F????@o????[???
+????_L?A??@_????cNv~~oA@???Z?@W?oN{?}N{F~N{N^g?^F_?]B_?[Bo?{Bo?{@o?w@o?w@o?w@o?w@o?w~~{~~~{~~~{~@o?w@o?w@o?w@o?w@o?w@o?w@o?w@o?w
+@o?w@o?w@o?w?????GA_?_??W????HB|~~{?_O??Eo?S?N~~B~~~B~~~Bo[???[???[???[???[???[???[???[???[???[??N~~?^~~?^~~?O[???[???[???[???[?
+??[???[???[???[???[???[???????A?s?G??B????AO~^~~?GC??@k?E_A?~o[?wN{^?Nb~^oB{?No?N_Bo?Pw?w?CM?K?@BoB??o{?o?KF?G?B@oA??o[?_?KF?G?B
+@oA??o[?_?KF?G?B@oA??o[?_?KF?G?B@oA??o{?o?KN?K?BF_B_?Vw?}?F{~~{?}N|~?KB~Bo????A?s?G??E????AO~^~~?GC??@k?D_?F?B_N?B_^?B_~?B`~?Bb~
+?Bbv?Bbf?Rbf?rbF@raFBr_FFr_FNb_F^B_F}B_F{BcFwBcFoBkFoB{F_B{F?B{F?BwF?BoF?B_F?B_F?B_F?B_?????_M_A???W????]Nv~~oA@???[?@o????M????
+B_????{????N??A?Bo??_@{??K?]??B?F_??W@w??E?]???oF_??KBo??@_{???WN???BBo???o{???EN???@f_??N|~??B~^oA??V_?_?Dw?K??}?B??N??w?Bo?N??
+{?B}?~{N~oN~Bo???GAO?o??K????Fb|~~{?_O??F??e?N?~?N?~{B{?{B{?NoBw?O?~?N_@?B{?z?C?]oBk?O@z?NW@_Fk?|_E?]OBr?G@x?NK?_Fe?{OA?{WBp?GBp
+oN_?oNF?}?B?{E@w?KBoWF_?oM?p]?B?wBDw?KB_EVo?wM?X^?@_w?s{?EB_BRo?WK?FN?@_o?[{?EB??rw?]K?BN_B~p}F~?~~Bw^{@????_A_A???o????]Nv~~oA@
+???[?@W??Nwo_N{zoGK^w?C]{??[[??[[??[]??[]???}???}?C?{@{?{N{?wN{B_N{F?NoF?K?F?G?F???F???F@_?F@_?F@g?FBg?BFk?@^~?@~v{?op{?????_M_A
+??@w????]Nv~~oA@???[?@s?~o~wF~{N}@~o?M?B{?B??N??w?B_?U??w?Co?M?@K?B_?P_?w?CW?K?BB?B??oo?o?KE?K?B@_B??oK?o?[B?GAF?OA?poC?_K[??GBf
+??A?Zo???F{????~????Fo???@{????N????B_????W??????GBg?_??E????Fb|~~{?_O??F??^?MB~{V~_~~D~?Bz?@o?{o?C?^K???F`_??@w[???}B_??N?W??Bo
+BO??w?[??M?F??B??o??o?[??K?F??B_Bo??[?{??B?N???WFo??B@w???w}???FN????vo?_?Dw?K?@}?Bo?^_?~o^}B~{F~o{???A?}?C????????o~^~~?GC??Ac?
+Do???E???F???F???B_??B_??@o??@o???w???w???[?_?[?_?K?o?C?o?C?w???w???[???[???M???M???F???F???B_??B_??@o??@oA??oA??oB??OB_?OB_??@o
+??@o???w???w???[???[???M???M???F???F????????_J?@??@_????eNz~~oA@???O??s?o?~oFv_[N@o]F?w?Bo?F??[?@o?F??[W@poMB~wF}?C???A?k?C??E??
+??AW~n~~?GC??@??BOB?B~?^]@o[E@w[B`z~B~{B@o?F??[?@p_FF?wN~?^w?O???GBg?_??Q????Hb}~~{?_O??C??[?Bp}}?@}~~w@|}NN?~N@`oNroGKB]}B@?vb_
+oOCwwK?@MMB??Rrow?C{{M?KFFB_B@po{?w]]F?EFfb_@owww?K???A?_?C??C_???AW~n~~?GC??@??B?B?@~?N]?wwBb_M]?Bw?~_F{?]?@oGF@o]F@{[B~oF{????
+?G?w?O??W????NB|~~{?_O??Do?I?E??[?@o?F??[?@w?B_?~oN~?ro?F??[?@o?F_?M??w?B_AN?W[@poFf?F{?N_????A?}?C??C_???AW~n~~?GC??@??C_@{o?D}
+w?Few?Fvw?@rw?@r{?@w{??w[??w[??w]??{]?K[M?K{N?Kwn_Nw~oFo{o????A?C?S??B????@g}~~~?GC??BG?KO???????o??????_?K??????K?B??????B?@o??
+????w?[??????M?F??????Bo@o??????{?[??????N_F??????BwBo??????z?{??????MoN??????BeBo??????x_{??????MK^??????BBFo????A?oP{?????_KC^
+?????KB?Fo????B?o@{?????WK?~?????EA?No?????o_B{?????KG?~?????@a?No?????W_F{?????B?@~??????o?^o?????E?F{?????@_@~??????K?~o???G?B
+?N{???A?~~~~????oN~~~o???K???Nw???B_??B}????W???~_C??B???No@???o??B{?O??E???~?C??@_??No@???K??B{?o??B???}?K???w??N_B???F??Bw?oA?
+Bo??}?[?o?{??NoF?N?^??B}BoB}~oBo~~{@~~{?{N~~?O???G?O@O??u????GBz~~{?_O??K_?r?Nz~FoBo~o^~~o{?{N{BwN{??K@~?K@~??A?FoB?No????{?_B{?
+???F?G?~?????oA?^o??_?K?_F{??G?@??@~??B?????^o??o????F{??E????B~??@_????~_??K????Nw??B????B}???W????~_??E????Nw@??o???B{?O?M????
+~?C?@_???No@??K???B{?o?B????~?M??O???N_B_?C???Bw?{??????}?N??????N_FW?????Bo@u??????{?[o?????N?FM?????Bo@p_?????{?{K?????M?NB???
+??B_BoW?????w?{E?????M?N?o????B_FoK?????oH{@?????KA^?O????B?vo??????oN{??????K@~??????A?No??????_B{??????G?^??????A?Fo????????{?
+???????N????????@o????????[?????????_@?D???o????_Nn~~oA@???p?BW??Nz~F}B~NoB}~p~_~r{?wN{B_N{B?GB~?O@~??A?~o??N_???N{??@w???B}?O?N
+????~_C??o???No@_?C???B{?{?@????}?N_?????N_FW?????Bo@r??????{?{W?????N?NF?????B_Fow?????w@{F?????K?~?o????B?noC?????_N{??????GB~
+????????~o???????N{???????B}?O??????~_C??????Nw@??????B~?o????A?}oK?????_NcF?????KBo@o????@_{?{?????[N?N?????Bb_Fo?????[w@{?????
+BK?~??????Z?No?????B_F{???A??w@~????o?C?~o???K???N{???@_??B}????K???~_C??B_??No@???{??B{?o??No??~?[?_B{??NwF?N@~??B~FoB~~oF_~~{@
+~~{@wN~~?O????A???K??E?????o~^~~?GC??@{?F???wB{??Nr~??B}}?M?N}?Bo?~?@}?Fo?~o?w?N}?M?B~_@_?~{?W?N~?A?B~w?_?|}?G?N~n~~B~z~~o|~????
+^o???B{????~????No???B{????}????^_???vw?_?L{?G?B~?B??^_@w?Fo?~_?w?|~?KB~Fo??~_K?????_K?B???o????KNv~~oA@???^?AO??Fr_NoBo^~b~?N@~
+Fno@?F{F{?C?~_No?oB}?]?B?Nw?w?K?^_B_?o@}?M?B?B{?{?K?NoBo?o?^?N?@?@{?{?C?FoBo?O?^?N?@_@{?}?E?FoBw?W?N?N_?_?{?}?A?BoBw?G?N?N_?o?{?
+~?B?BoB{?K?F?Fo?o?[?^?B?@o@{?K?F?Fo?w?[?^_Bo@o@~?N~~{N{N~~~o~o{?????_H_@???W????SNz~~oA@???R??w?{?Nw@poMB`oEE?[w@r_FM?[w@r_FM?[w
+@r_FM?WWB`o[Bn_F{?K???A?e?C??C_???@O~n~~?GC??@K?Ao@_?F_?^o@v?F??[?@o?F??[?@o?F??[?@o?F??[?@o?F??~o^~@o???GAW?O??K????DB}~~{?_O??
+Co?K?N_@~_MF@o[N@owFB_?M??w?@w?Fo?N_?^??]?o{B@wM~o^~@~{F????_H_@???W????SNz~~oA@???R??w?}?N}Bow]B`oMF??[?@w?B~?F{?[?F_?{?B_FM?[w
+@roNFnwN}?K???A?e?C??@_???@O~n~~?GC??@K?B_Bo?~oNF_wNF?[[@r_FM?[w@roMNnw~~Bk_M??[?@oMB_wN~_N{?O???G?g?_??K????NB|~~{?_O??Do?Q??B~
+?MB~?~B@?~a??vo??rw??@w??@w???{???{???{???{???{???{???{??@w??@w??Bw??Fo??n_??~B@?}B~?O@~??????A?}?C??C_???Bo~^~~?GC??@[?C?B~^~|~
+Bo?N??{?Bo?N??{?Bo?N?N{~~r{N??{?Bo?N??{?Bo?N??{?BoB~~~~~????_I?A??Ag????ANn~~oA@??@H?@???M??w?Bo?N??[?@w?F_?N??{?@o?F_?]??w?Bo?N
+_?]?@w?Bo?N??{?@w?F_?^??{?@o?F_?]??w?Bo?N??]?@w?B_?N??{?@o?N??{?B_?]?@w?N??{?B_?]?@w?F??{?Bo?M?@w?F??[?Bo?M??w?F_?[?Bo?N??w?F_?]
+?@o?N??{?F_?]?@o?N??{?B_?M????A?g?G??E?????G}~~~?GC??Cc?C??F??[?Bo?N??w?F_?]?Bo?N??w?F_?]?@o?N??{?B_?]?@o?F??{?B_?M?@w?F??{?Bo?M
+?@w?F_?[?Bo?N?@w?F_?[?Bo?N??w?Bo?N??[?@w?F_?N??{?@o?F_?]??w?Bo?N_?]?@w?Bo?N??{?@w?F_?^??{?@o?F_?]??w?Bo?N??]?@w?B_?N??{?@o?F????
+?G?g?_??yN~~~uB|~~{?_O??HO?X????No??wF{??NBp???ww?C?FK?@??z??O?Fw?C??}?@_?N_?G?@{?B??V_?oNC~?KBoFoB?{B{?w?@w?E??]?@_?F??W?@o?F??
+]??o?F_?K?@w?B??]??w?Fo?M??{?F_?F_Bw?@{?~GCN?Kr~?oAK~oC?B@_???w????E????@_????W????F?????o????K???????A?G?C??C_???A_~~~~?GC???S?
+@O?MFp{^B_????A?q?C??B????A?~n~~?GC??@??B_Bo?~oN~`~}F~{~~r~~N~{~~r~~N~{~~r~}F~w^~?~o?o???GAW?O??K????Ib|~~{?_O??GO?L?M??w?B_?M??
+w?B_?M??w?B_?N{^~p~~F}??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?M??w?B_?????GBg?_??E????Ib|~~{?_O??E_?Z??@o????[????F????Bw
+????}????No@??Bk?O??z?C??KWB??BE?o??p_K??GKF??AB@o??_o[?_?CN?G?@BoB??P{?oN{^?KB~Fo@_?Bo?W??{?F??N?@o?F_?]?@{?N{@~o^~?^{F????_?_@
+??@G????mN~~~oA@???C??O?Bo{NBo???GAG?_??Q????CB~~~{?_O???_?S?N~~B~~~Bo???GAW?O??K????Kb}~~{?_O??BO?J?A??W?@_?EKEzo^{?^_?~?Fn@uKE
+W?@_?A??????_G?@??@G????}Nz~~oA@???J??g?K??o?BCAloN}?V_?~_Ev?rCAK??o?LoV??@ERsxS????????????????????????????????????????????????
+;DVItoLN03 font loadœ
+›75;2475s›75;3475r1;10}U000000002SK00GGœ
+1;11}U000001002SK00GGœ
+1;12}U000002002SK00GGœ
+1;13}U000003002SK00GGœ
+1;14}U000004002SK00GGœ
+1;15}U000005002SK00GGœ
+›10m
+›789d›14m›1091`³¯°±¿À›22a²¼¶»›21a®¾¹µ¶
+›789d›1042`­
+›881d›916`·º»›21a½¸¶›15m›68a·¹º»›14m›21a´½›15m›22aâ}£|¡{~|›5aÄ
+›881d›1128`¸
+›1032d›11m›1123`Óíçàê›16a×àéçèïëê›15aØãèèñ
+›1090d›950`æë›1aëè›16aëä›17aÕèãâïíçâàè›14aÕêåçêããíçêå›16a÷›16aÜâçãêâã
+›1090d›902`Üâ
+
+›1511d›1197`›30a›371k9;0;1q
+!119?wo`@BF^!3~^FB@`ow!120?-
+!119?!4~]]!5~]]!4~!120?-
+!119?NB`_ow}!3~}wo_`BN!120?-
+!80?!3_!3?!4_!30?_o{eab~^~bae{o_!30?!4_!3?!3_!81?-
+!69?_oOo_]QQ]?Flw\VWGNKKN!3G^PP^o_wkCkw?_oOo_??!3_!3?__b~BB~^!3R^~BB~b__!3?!3_??_oOo_?wkCkw_o^PP^!3GNKKNGWV\wlF?]
+QQ]_oOo_!70?-
+!67?wGJ}CEB_wKEB@@!11?!7_?!4@BB!3EFCFLGLNGNLGL~??~]!3Q]~??~LGLNGNLGLFCF!3EBB!4@?!7_!11?@@BEKw_BEC}JGw!68?-
+!66?[vau^??}B!13?wMB@@??_~{x`@BAEKGWo__!11?~??~]!3Q]~??~!11?__oWGKEAB@`x{~_??@@BMw!13?B}??^uav[!67?-
+!67?^Pp~__f{_!4?_oOW!4G^[o_!3?!6~}w_!5?@BAE!3CKGKCC^OG~{}y}{~WO^CCKGK!3CEAB@!5?_w}!6~!3?_o[^!4GWOo_!4?_
+{f__~pP^!68?-
+!69?F!3C~CF}k}r`_!9?@!3_b!8~!6woo_!5?{{woo_@n!3~n@_oow{{!5?_oo!6w!8~b!3_@!9?_`r}k}FC~!3CF!70?-
+!73?@@Ppv|~}~|~}A!3?w}!14~^F!4BFN]!4?~!3^NNFN!3~NFNN!3^~!4?]NF!4BF^!14~}w!3?A}~|~}~|vpP@@!74?-
+!77?@F^!4~@!4?BFF@!5?@B!5~o!17?o{!5~{o!17?o!5~B@!5?@FFB!4?@!4~^F@!78?-
+!80?@F~~w_!11?_o{!7~}{ww!6o!3w{}!11~}{!3w!6oww{}!7~{o_!11?_w~~F@!81?-
+!83?^!3~}}!5{}}!5~!5^!8N!27F!8N!5^!5~}}!5{}}!3~^!84?-
+!84?~^^NNFF!3B!3@!7?!5_o!6OW!21GW!6Oo!5_!7?!3@!3BFFNN^^~!85?-
+!81?{f@!3_oOWGGK!3CE!3AB!4@!45?!4@B!3AE!3CKGGWOo!3_@f{!82?-
+!82?!3@!85?!3@!83?-
+!256?-
+!14?!3{!85[{!5[{!37[{!5[{!85[!3{!15?-
+!14?!3~!85?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?wGG{!11G{!7G!3gw!4Wwgg!3G{!14G{GWo!3_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?NGGN!6GWwggGN!3Gw[ErX|cEa}aAes\XrE^w!9GWWwgnGKF!3B!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!23?!5@~`?~lK}!7~}KKl~?`~!5AECKWo_?@BEKWo_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!29?BMWrenHXR^RPXJkerWMF!11?@FKWo_??@BEKWo_!10?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!34?@@B!4AB@@!21?@@B!6A!3B!3A!5?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?wGG{!11G{!7G!3gw!4Wwgg!3G{!14G{GWo!3_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?NGGN!6GWwggGN!3Gw[ErX|cEa}aAes\XrE^w!9GWWwgnGKF!3B!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!23?!5@~`?~lK}!7~}KKl~?`~!5AECKWo_?@BEKWo_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!29?BMWrenHXR^RPXJkerWMF!11?@FKWo_??@BEKWo_!10?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!34?@@B!4AB@@!21?@@B!6A!3B!3A!5?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?wGG{!11G{!7G!3gw!4Wwgg!3G{!14G{GWo!3_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!10?NGGN!6GWwggGN!3Gw[ErX|cEa}aAes\XrE^w!9GWWwgnGKF!3B!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?!3~!23?!5@~`?~lK}!7~}KKl~?`~!5AECKWo_?@BEKWo_!16?~!5?~!37?~!5?~!85?!3~!15?-
+!14?B!3~!28?BMWrenHXR^RPXJkerWMF!11?@FKWo_??@BEKWo_!10?~!5?~!37?~!5?~!84?!3~B!15?-
+!15?!3~_!32?@@B!4AB@@!21?@@B!6A!3B!3A!5?~!5?~!37?~!5?~!83?_!3~!16?-
+!15?@!3~!83AB!5?~!37?~!5?B!83A!3~@!16?-
+!16?F~~}!79AaaAyY!3QqboOOW!3Gk!7cCKGwGKC!7ck!3GWOOobq!3QYyAaa!79A}~~F!17?-
+!17?F~~}!76?~@@~?~!3?ccCcqQQZHHl!3cCcclH??~??Hlcc_!3ckHHJOAuCC?c!3?~?~@@~!5?wwo_!67?}~~F!18?-
+!18?B!3~_!70?}}ww~??~?~!3?cC?cuQQZHHl!6clH??~??Hl!6clHHZQQuCCcc!3?~?~??~ww{}!4~^!65?_!3~B!19?-
+!19?@!3~o!69?BB??~??~?~!3?ccC?qOQZGHl!6clH??~??Hl!6clHHZOOu!4c!3?~?~??~@!3Bb||wo!64?o!3~@!20?-
+!21?N~~{_!67?~~[[~??~?~!3_CC??e__rPOW!6GHXOO~OOXH!6GXPPra_a!4C!3_~?~??~]}}~~^^NF!63?{~~N!22?-
+!22?@^~~w!66?@@??~wN@!4?!6@!13?_o[F[o_!13?!6@!4?@Nw~!70?w~~^B!23?-
+!24?B!3~o!68O!4PR!6Qq!9AE!4CF@!5?@F!4CE!9Aq!6QR!4P!68Oo!3~B!25?-
+!26?F^~}w!71Oo!5?~!37?~!5?o!71Ow}~^F!27?-
+!28?B^~~w_!68?~!5?~!37?~!5?~!69?w~~^B!29?-
+!30?@N~~{o!66?~!5?~!37?~!5?~!66?o{~~NB!31?-
+!33?F^~}w_!63?~!5?~!37?~!5?~!63?_w}~^F!34?-
+!35?@F^~}w!61?~!5?~!37?~!5?~!61?w}~^F@!36?-
+!38?BN^~{w_!57?~!5?~!37?~!5?~!57?_w{~^NB!39?-
+!41?@F^~}w_!54?~!5?~!37?~!5?~!54?_w}~^F@!42?-
+!44?@FN~}{o!51?~!5?~!37?~!5?~!51?o{}~NF@!45?-
+!48?BF^~}wo!47?~!5?~!37?~!5?~!47?ow}~^FB!49?-
+!52?BN^~{wo!43?~!5?~!37?~!5?~!43?ow{~^NB!53?-
+!56?BF^~}wo_!38?~!5?~!37?~!5?~!38?_ow}~^FB!57?-
+!60?@FN^}{w_!34?~!5?~!37?~!5?~!34?_w{}^NF@!61?-
+!64?@BFN~}{o_!29?~!5?~!37?~!5?~!29?_o{}~NFB@!65?-
+!69?@BFN^}{w_!24?~!5?~!37?~!5?~!24?_w{}^NFB@!70?-
+!74?@BFN^}{wo_!18?~!5?~!37?~!5?~!18?_ow{}^NFB@!75?-
+!80?@BFN^}{wo_!12?~!5?~!37?~!5?~!12?_ow{}^NFB@!81?-
+!86?@BFN^}{woo_!5?~!5?~!37?~!5?~!5?_oow{}^NFB@!87?-
+!5?_!87?@BFN^}{wo~_!4?~!37?~!4?_~ow{}^NFB@!87?_!6?-
+!6?@E{o!90?@BFNN]{{~o__!31?__o~{{]NNFB@!90?o{E@!7?-
+!9?~~{!95?@@BFNN]{{woo_!15?_oow{{]NNFB@@!95?{~~!10?-
+!7?_{~~^!104?@BBFNN][{wwoww{[]NNFBB@!104?^~~{_!8?-
+!4?ow}~~nB!114?!5@!114?Bn~~}wo!5?-
+_w}~~NB@@~}o!231?o}~@@BN~~}w_?-
+!5~w_?w!3~!231?!3~w?_w!5~?-
+!5~!6N!233M!6N!5~?-
+!5~!6?~~BBf~]!3?~~!6B??~~BBf~]!3?~~!5?~~!3?o~~{_w]~w!10?o{MF!3BFFE??o{MF!3BFN}{?o{MFBBFFE??~~]{wo?~~??o{MF!3B
+FN}{?{~rbffmM?o{MF!3BFFA?~~!6B?~~BBf~]!3?~~!6B!10?o{MF!3BFFA??o}^~w_??~~!5?~~??{~rbffmM??o{N^}w??{~rbffmM!6?!5~
+?-
+!5~_!5?^^FFN^[W??^^!5ZW??^^FFN^[W??N^[!3W[NB!3?^^@FFB?^^!10?N^{w!3owWW??FN][!3W[MF@?N^{w!3o~^??^^??BFN^^??FN][!3W
+[MF@?G\|xpr~N?N^{w!3owWG?^^!5ZW?^^FFN^[W??^^!4ZXW!10?N^{w!3owWGW^!4BN^[?N^[!3W[NB??[\xxpr~NW]F!4BN^[[\xxpr~N!5?
+_!5~?-
+@FN^^~}{{!237w{{}~^^NF@?-
+›1575d›1000`Ûë›24aàè›16aÚçèçïàíñ›15aÔëèèãåã›15aëä›17aÜâçãêâã
+›1575d›1059`ñ
+›1634d›1340`ãêæàé
+›1634d›1228`Üæíçð
+›1735d›1398`á›1aãí›15aóööó
+›1735d›1129`ôòïæ›18aÜãìïãé
+›1792d›1123`ëí›14m›16açðéêëõö›11m›47aãíîçëê›16aõøó
+›1792d›1095`Ö›251aÞ
+›1960d›15m›1263`.3675247
+›2035d›12m›1035`G›11a78F6E<5›1a8F›12aG;8›11aBC›1a8E4G<BA›10aB9›9aG;8›11m›11a$5)+-QT›12m›9a6B@@4A7›9aBA
+›2035d›783`1;<F›10a7B›1a6H@8A
+›2085d›721`G;8›15m›38a«¯›12m›584a4G8F›12aG;8›15m›42a^[`_\]ab›12m›11aCEB:E4@X
+›2085d›15m›790`®›12m›74a6B@CHG8EY›18a1;<F›12a6B@@4A7›11a46G<I›15m›151aZ
+›2135d›12m›721`J;<6›100aJF›12a4›13a1›640aG›11m›15a`$5)›12m›12a9BE@›13aGB›13a5›1a8
+›2135d›803`;›13a4??B›137a3›14aBHGCHG›13a^?8›14a<A›13a78I<68_<A78C›1a8A78A
+›2144d›1019`%
+›2170d›15m›1730`Í
+›2185d›12m›782`I›326a;›11a@4›156aG87›11aBA›11a4›10a$%#›11a+-NQ›196aG8EY
+›2185d›721`6BA›20a8EG87›12aGB›10a4›10a^?8›11aJ;<6›88aL›9a5›1a8›11aCE<A›382a?4F8E›11aCE<A
+›2230d›15m›1589`>
+›2235d›12m›783`)G›10a<F›10a4FFH@87›10aG;4G›10aG;8›10aE8478E›11a<F›10a94@<?<4E›8aJ<G;›9a+›4a1›16a3›10a4A7›10a;4F›10aE847›10aG;8
+›2248d›1631`%
+›2279d›15m›828`>
+›2284d›12m›721`?B›1a64?›11a+›4a1›373a4@<?<›63aL›10aJ<G;›12aG;8›15m›39a«¯°®¬­›12m›15aBC›1a8E4G<A:
+›2284d›894`3›12a2F8E›13a'H<78›12a\O]Y›17a&›88a4E<G›15m›194a®
+›2297d›12m›870`%
+›2334d›721`FLFG8@›14a<F›14a4?FB›13a4FFH@87Y
+›2384d›783`)9›13aL›99aI›339aBH›13a64AUG›13a4AFJ›69aL›13aE847<A:›13aG;<F›14a7B›1a6H_
+›2384d›845`BH›13a;4›20a8›13a4›13aDH8FG<BA›14aG;4G›13aL›248a8E›14a5
+›2434d›796`GX›14a4F>›15aý›10m›17aúùýôõýùôøö›12m›4aþ›636aL›14aC›1aBFF<5?8
+›2434d›721`@8A›10m›131aõ›12m›227aY›20a(8›15aF;BH?7›15a4?FB›14a5›1a8›15a<A9BE@87›14aB9›14a4A
+›2484d›15m›750`^[`_\]ab›12m›368aG87›15a4AB@4?<8FY
+›2484d›15m›721`Z›12m›181a5H:F›14aBE›14aHA7B›1a6H@8A
+›2534d›1266`87›12a?B›1a64??L›11a4G›12aý›10mü÷ýöùôøö›12m›3aþ›12a64A›13a5›1a8›12aE8C›1aBEG87
+›2534d›783`"H:F›13aG;4G›12a64AABG›12a5›1a8›13aE8FB?I
+›2583d›721`GB›19aG;8›20a4HG;BEX›20a"E<4A›15m›19a;>B@A›192aF›12m›182aL›18a5›1a8›20a6BA›153aL
+›2583d›15m›1247`EDC›22a=?AA›12m›22aX›22aJ;B›19a@4›162aG46G87›20a5
+›2633d›721`%_@4<?›12a4F›11m›299a:F?B>›108a<Jj›12m›12aVBA›13aG;8›15m›15a<>C?E›12m›14aA8G›28aBE>WY
+›2633d›11m›906`i3>7eLC`:<`<I›108aD=`IE›12m›414aJ
+›3030d›15m›658`Î
+›3046d›14m›701`ÁÇ›11m›16a¡®¤›14m›14aÄÅÒÓ›11m›862a´›14ap¯²°›1a¯²¡´©¯®
+›3046d›14m›676`Æ›11m›252a¡²¥›13a²¥§©³´¥²¥¤›13a´²¡¤¥­¡²«³›14a¯¦›13a´¨¥›13aq©§©´¡¬›12ar±µ©°­¥®
+›1;607;3001;2;598!|
+
+
+›462d›12m›449`ÁËÊÐÃÊÐÏ›10m›1224a½
+›607d›13m›449`³ÔÓ›93aØ×
+›607d›569`ØËÓ
+›716d›12m›917`zv©ª§z¨›820a~«
+›716d›449`kz¬›17av¤y›18ab}v¤|zy›18ae
+›824d›566`©§¥›1ayªx©~¥¤›1112a°
+›824d›449`°›43ah¤
+›879d›14m›762`}
+›885d›10m›518`ÐâЛ45a²¼µÈ›15a§›5a¯›296aÃÉÆ›14a®ÃÉÆ·¹›16a¡½À¹›13m›36aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÐ
+›885d›833`³›16a¸Ã›1a¹Ç›15a˽ȼ›15aÍ
+›899d›808`~
+›939d›14m›869`}
+›945d›10m›518`ÐâÑ›45a«Æ¹Ê½¹Ë½Â»›15a§›5a¯›17a³›15aªÉÈÄÉÈ›13m›33aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÐ
+›959d›915`~
+›999d›14m›889`}
+›1005d›10m›518`ÐâÒ›45a|ÃÁÁ½ÈȽ»›13a§›5a¯›314aµÄ›1a¹Æ›13m›36aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÐ
+›1005d›961`³›15aªÉÈÄÉÈ›16aÈÛ14a«
+›1019d›935`~
+›1066d›854`Ƚ»›13aȼ¹›16ah,.W›14a¡½À¹›13m›28aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÑ
+›1066d›622`ÐâÒâЛ51a«Æ½Â
+›1174d›12m›962`sh©¥ik¯²›726a±
+›1174d›449`±›43ac¥~¤|›17a£¥§z›17a¬~©}›17ac
+›1235d›10m›702`ÈÆÃÀÀ½Â»›13a˼½·›69aµ»¹Ç›14a}›299aÈÇ›13m›32aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÒ
+›1235d›518`ÑâЛ45a|Û248a¼›15a«›131a±¤Èç©ÏÒ›15a«Æ½Â
+›1295d›702`ÈÆÃÀÀ½Â»›13aȼ¹›15azÄÄ›1a¹µÆµÂ·¹›16aú›15aȼ¹›15a«Æ½Â›107aµ»¹›13m›13aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÓ
+›1295d›518`ÑâÑ›45a|Û702aȹ¸›15a«
+›1356d›622`ÑâÑâЛ51a®Ä›1a¹·½ºÍ½Â»›15aµ›15a¹˛15a­¹º¹Æ¹Â·¹›16a«›59aÈ›13m›19aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÕ
+›1356d›1354`ýÂ
+›1416d›1181`È›14a«›211aȵȽÛ13m›17aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÕ
+›1416d›622`ÑâÑâÑ›51a®Ä›1a¹·½ºÍ½Â»›15aµ›15a}½ë¹Æ¹Â›61aµÄ›1a¹Æ›15aªÆ½¹Â
+›1476d›518`ÑâÒ›45a¤Â·Àɸ½Â»›16a¢ÆµÄ¼½·Ç›15a¤Áµ»¹Ç›15a½Â›15aÍ›265aÈ›13m›28aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aÕ
+›1476d›1245`ÃÉÆ›14a}Û1a·ÉÁ¹Â
+›1537d›622`ÑâÒâЛ51a¢¤©ª›15a¢ÆµÄ¼½·Ç›13m›15aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68a×
+›1645d›12m›449`²›43ae~¢z¨›16ar¨zy›17av¤y›18afz¤z§v©zy›17aw›83ash©¥ik¯²›447aµ
+›1645d›1157`®›17ac
+›1706d›10m›518`ÒâЛ45a¯¼¹›16ah$5)›14a¡½À¹›13m›18aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aØ
+›1766d›518`ÒâÑ›45a¯¼¹›16ah,.W›14a¡½À¹›13m›18aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aØ
+›1827d›518`ÒâÒ›45a¯¼¹›16ah380›14a¡½À¹›13m›18aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›68aØ
+›1887d›622`ÒâÒâЛ51a¯¼¹›15ai5%1"/2%›14a¬ÉµÀ½ì¹Æ›13m›35aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÏ
+›1947d›518`ÒâÓ›45a¡›43aÈ›15a¡½À¹Ç›14a­¹µ¸›15a¶›72a±¤Èç©ÏÒ›13m›25aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÏ
+›1947d›648`Û281aÍ›15a}
+›2008d›622`ÒâÓâЛ51a}½Æ¹·ÈÃÆÍ›14aºÃÆ›14a¯›18a³›15a¡›43aÈ›14a¨¹Èƽ·Ç›15a¡½À¹Ç›13m›18aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÐ
+›2008d›1166`ÃÂ
+›2018d›1065`~
+›2068d›622`ÒâÓâÑ›51a}½Æ¹·ÈÃƽ¹Ç›13aºÃÆ›15ah0+›15a¡½À¹Ç›13m›26aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÐ
+›2129d›622`ÒâÓâÒ›51a}½Æ¹·ÈÃƽ¹Ç›13aºÃÆ›15ah07,›14a¡½À¹Ç›13m›38aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÐ
+›2189d›622`ÒâÓâÓ›51a}½Æ¹·ÈÃÆÍ›14aºÃÆ›14a±½ÆÈɵÀ›14a¡›43aÈ›14a¡½À¹Ç›13m›18aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÑ
+›2189d›1224`ÃÂ
+›2298d›12m›449`f¢¥¨¨v§®›1244a°²
+›2406d›449``›29ah¤{¥§£v©~¥¤›17a{¥§›17ap®¨©z£›16ajv¤v|z§¨›600a°´
+›2466d›10m›518`zâЛ34a|ƹµÈ½Â»›14aȼ¹›15azÄÄÆÃÄƽµÈ¹›15a}½Æ¹·ÈÃƽ¹Ç›13m›20aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÖ
+›2527d›1082`µ·›22a¹¸›15a«½Ì¹À›14aÞh0+ß›14a¡½À¹Ç›13m›19aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐÖ
+›2527d›622`zâÐâЛ40a²¼¹Æ¹›15aÈÛ15aÄÉÈ›15a«›41a¿
+›2587d›622`zâÐâÑ›40a²¼¹Æ¹›15aÈÛ15aÄÉÈ›15a~Ìĵ¸¹¸›16a­µÇȹƛ14aÞh07,ß›14a«½Ì¹À›14a¡½À¹Ç›13m›38aö›23aö›10m›45aÐ×
+›2648d›518`zâÑ›34a¨Ã›1a¸½ºÍ½Â»›14aȼ¹›16a|ÃÁÁµÂ¸›14a}¹ì½ȽÛ15a¡½À¹›13m›26aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÐØ
+›2708d›873`ÃÆÁÇ›14a§½¶ÆµÆÍ›15aºÃÆ›15aÉǹ›15a˽ȼ›15aȼ¹›15a¬É¹É¹›13m›24aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÑÏ
+›2708d›518`zâÒ›34a|ƹµÈ½Â»›14aµ›15a¡
+›2769d›829`ÃÆÁÇ›15aºÃÆ›14aÉǹ›16a˽ȼ›14a§©ÏÒ›15a¬É¹É¹›13m›46aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÑÐ
+›2769d›518`zâÓ›34a}¹ì½»›15a¡
+›2829d›518`zâÔ›34a®¹ÈȽ»›15aȼ¹›15añ¯›268aÍǽ·µÀ›15a|¼µÆµ·È¹Æ½ÇȽ·Ç›13m›22aö›23aö›22aö›23aö›22aö›22aö›23aö›10m›45aÑÑ
+›2829d›909`¹ÆÁ½ÂµÀÝÇï›13a«¼
+›2937d›12m›449`a›10m›32a$5),.TW›12m›16ab¥££v¤y›17anªv¢~½z§¨›719a±³
+›3046d›584`¬›16a©¥›18aª¨z›17a®›118a¬¤›16ae›50a©¨›17a¬~©}›17aq›216ash©¥ik¯²›128a±µ
+›3046d›449`b›31ag¥›235a¥ª§›17a¥›111a¥¤›232au›17av¤y›17ac
+›3056d›1309`d
+
+
+›462d›10m›607`½½›12m›1065aÈÇÏЛ16aËÄ›15aÄÇÅÑÎÃÏ
+›607d›607`c›28aq}z›18afhkl©¥phu›18am§¥|§v£›772a²°
+›664d›10m›675`}âЛ34a«Æ¹ÄµÆ½Â»›14aÈÛ15aÉǹ›15a')./MH2)7›13m›21aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÐ
+›720d›675`}âÑ›34a°Ç½Â»›15aȼ¹›15a')./MH2)7›14a«ÆûƵÁ›13m›42aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÐ
+›777d›780`}âÑâЛ38a¬ÉµÀ½ì¹ÆÇ›15aµÄÄÀ½·µ¶À¹›15aÈÛ14a')./MH2)7›13m›28aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÐ
+›833d›675`}âÒ›34a~̵ÁÄÀ¹Ç›15aú›14aȼ¹›16aÉǹ›15aú›15a')./MH2)7›13m›39aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÑ
+›935d›12m›969`v§¤~¤|›17ajz¨¨v|z¨›705a²²
+›935d›607`d›34ad§§¥§›17av¤y›18at
+›992d›10m›806`µÈµÀ›14a~ÆÆÃÆÇ›13m›20aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÒ
+›992d›675`~âЛ38a¡
+›1048d›1079`Í›14a~Ì·¹¹¸¹¸›17a~ÆÆÃÆÇ›13m›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÒ
+›1048d›780`~âÐâЛ42a|µÄµ·½È
+›1105d›780`~âÐâÑ›42a{µ¸›16ah$5)›14a¡½À¹›15a~ÆÆÃÆÇ›13m›13aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÓ
+›1161d›965`ȹƵÀ›15a~ÆÆÃÆÇ›13m›32aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÕ
+›1161d›780`~âÐâÒ›42a¤Â
+›1218d›1083`µÈµÀ›14a~ÆÆÃÆÇ›13m›26aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒÖ
+›1218d›780`~âÐâÓ›42aªÈ¼¹Æ›16a¡
+›1274d›675`~âÑ›38a©ÃÂðºµÈµÀ›14a~ÆÆÃÆ›14a¨¹Çǵ»¹Ç›13m›40aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÒØ
+›1331d›823`µÆ½»›14a¨¹Çǵ»¹Ç›13m›38aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÓÑ
+›1331d›675`~âÒ›38a²
+›1387d›675`~âÓ›38a¤ÂºÃÆÁµÈ½ÃµÀ›13a¨¹Çǵ»¹Ç›13m›43aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›46aÓÔ
+›1489d›12m›607`oz{z§z¤xz¨›1196a³µ
+›1633d›13m›607`ºÏ×Ø›23aÔÌ›24a¶ÏÍÙÖË×
+›1728d›14m›981`}
+›1734d›10m›675`Л82a~̵ÁÄÀ¹›15a§›5a¯›97aµ»¹›14a§µ›22aÃÉÈ›13m›45aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›69aÔ
+›1734d›1052`³›16a«›129aÍ
+›1748d›1027`~
+›1791d›675`Ñ›82a±½ÇɵÀ›13aÔÔÏ›13a®·Æ¹¹Â›15a}ÉÁÄ›14aÄƽ›100aÍ›14aȼ¹›14auLF:EE5BLYYT›12a|ÃÁð
+›1791d›1361`ȹ¸›14a¶
+›1847d›780`ÁµÂ¸›13m›46aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›69aÖ
+›1904d›675`Ò›82a±½ÇɵÀ›13aÔÔÏ›13a®·Æ¹¹Â›15a}ÉÁÄ›14aÄƽ›100aÍ›14aȼ¹›14auE:K@>5BLYYT›12a|ÃÁð
+›1904d›1361`ȹ¸›14a¶
+›1960d›780`ÁµÂ¸›13m›46aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›23aö›22aö›23aö›22aö›22aö›23aö›22aö›22aö›10m›69a×
+›2104d›13m›688`ÐÓÔ›328aØ×
+›2104d›607`±É›104aÚÑËÊÍËÒËÓ
+›2199d›12m›1222`L?8›11m›14alJH><B:D›12mF›12a9BE›13a6›370a4F›13a47787
+›2199d›607`1;8›14a6B›1a78›14a9BE›13a;4A7?<A:›12aG;8›14a/BF8_FG›349a;4A:854E›14a@4E><A:›12aJ
+›2249d›607`5›182a4<E54<EAF›13aB9›13a+4F8E064AX›14a#4@›298a8EF<BA›14aQYO_OY
+›2249d›629`L›14a/B5<A›13a&›510a5E<7:8X›13a2*X›14a4G›14aI
+›2298d›1373`8E›20a$%#?4F8E›20aCE<A›115a8E8›20aCEB›139aL
+›2298d›678`1;8›20a4?:BE<G;@F›18a9BE›19a;4A7?<A:›19aG;8›20aA8J›319aG8EF›21aJ›130aI<787›20a5
+›2348d›1326`8?86B@@›337a;›19a+45›1aBE4GBE<8F[
+›2348d›607`*4EFG8A›19a-L5?47›17aB9›17a1&+X›17aG;8›18a$4A<F;›17a1›153aHA<64G<BAF›16a/8F84E6
+›2398d›786`87›13a=HFG›13a4F›13a4??›12aG;8›14aBG;8E›13a8A;4A68@8A›492a8EF<BA›13aQYSX
+›2398d›607`G;8L›14a4EE<I›638aGF›15a;47›13a5›1a88A›14a6B@C?8G87›14a4G›13aI
+›2448d›717`8E8›15a<A›196aGB›13aG;<F›14aA8J›14aE8?84F8Y
+›2448d›607`4A7›14aJ›100aG8:E4G87›14a<A
+›2498d›1354`I<787›18a@›39a;_A88787›20aFHCC›1aBEG›19a4A7›19a8A6BHE_
+›2498d›678`,L›18a6B??84:H8›18a-<8?›18a*8@CFBA›19a;4F›19aCEB›149aH6
+›2547d›607`4:8@8A›392aL›14aHF89H?›16aFH::8FG<BAF›16a9BE›16a8A;4A68@8A›68aI›143a84EF
+›2547d›742`GX›16a4A7›15a;4F›16a@478›16a@4A›660aGF›17aB›20a8E›16aG;8›16aL
+›2597d›1692`8›15aG;8›16aCEB:E4@›15a64C45?8
+›2597d›607`V;<F›16a?4G8FG›15a<784X›15a=HFG›16a4F›15a)U@›15a45›1aBHG›15aGB›15aE8?84F8›16aG;<FX›16a<F›15aGB›15a@4>
+›2647d›607`B9›14a;4A7?<A:›13a5<A4EL›13a^?8F›15aG;4G›10m›14aôû›36aþý›12m›355aLG8›14a^K87_?8A:G;›14aE86BE7FX›15a5HG
+›2647d›10m›1167`öù›12m›40aBE:4A<M87›15a4F›14aROP_5
+›2697d›607`G;4G›14aJ<??›13a;4›20a8›13aGB›14a4›28a4<G›13a4›13a9HGHE8›15aE8?84F8WY
+›2697d›819`I›101aJ
+›2747d›804`X›15a)›17a@›110a>AB›172aL›16a:E84G›18a<A785G87A8FF›19aGB›17aG;8›18a787<64G87›18a54A7›17aB9
+›2747d›678`&<A4??L›90aHFG›18a46›64aJ?87:8›17a@
+›2797d›607`;8?C›1a8EF›18aJ;B›17a;4›20a8›17a46G87›18a4F›15m›17aÅ›12m›389aI<787›17aHF89H?›17aFH::8FG<BAF›18a9BE›16a8A_
+›2797d›886`I›227a_F<G8›17aG8FG8EF›19aV4A7›17aCEB
+›2846d›785`GFWZ
+›2846d›607`;4A68@8A
+›2921d›677`ü›23a.;<?›9a1›17aL?BE›8aV›11m›263aO`IA;›108a`LCj›12m›129aL›136aJ›19aL›8a4A7›9a"879BE7
+›2921d›832`4›11m›94ai/`3:PDGIeM:›108aF<`:<›12m›87aWX›8aB9›8a/B›20a4?›8a(B??B›28a4
+›2971d›721`-8J›14a#B??8:8X
+›3046d›677`ü›170a4<E54<EAF›13aV›11miI?e<D`<:E`:›12m›108aWX
+›3046d›721`/B5<A›13a&›11m›449a<`LCj
+
+
+›462d›12m›449`ÈÇÏЛ16aËÄ›16aÄÇÅÑÎÃÏ›10m›1052a½½½
+›607d›12m›520`ü›22a*4EFG8A›15a-L5?47›14aV›11miC:IJK>FeK?›12m›108aWX›12a4A7
+›607d›11m›1123`D`=Cj
+›682d›12m›520`ü›22a/B5›9a06›21aH@4AA›9aV›11m›263aJMER`›86a`F:J:›12m›108aWX›8aB9›9aG;8›10a%HEBC›1a84A›10a0C468
+›682d›687`;›11m›149aiJ<ALE:FFe>I›108a=F>K›108a`@GMj
+›732d›12m›693`X›14a4G›13a&›263aY
+›732d›563`!:8A6L›97aE4F64G<›14a<A›14a)G4?L
+›813d›449`V4A7›11aB9›10a6BHEF8X›12aG;8›11a7BM8AF›12aB9›10aHAFHFC›1a86G<A:›12a:H<A84_C<:F›10a4G›10aG;8›11a/B›20a4?›9a,<?<G4EL›9a#B??8:8
+›813d›1591`L
+›870d›449`B9›14a06<8A68TW
+
+
+›462d›10m›607`½Ê›12m›1102aÕ›14aËÄ›16aÁÆ¿ÊÅÃÏ
+›462d›1539`ÏÑÉÉ¿Î
+›607d›13m›1221`ËÇØÙÖË×
+›607d›607`¼ËÚ›22aÇÓÊ›24a³ÎÇÓÍËÊ›23a¶
+›711d›14m›639`_VlhXYpq›10m›18a±ÓâЛ19a½Ç›18aµ›19aÁµ½Â›416a¼›19a½Â·ÃÆÄ›1aÃƵȹǛ18aÇÃÁ¹›19aÁ½ÂÃÆ
+›711d›14m›607`R›10m›503aȹµ·¹›19aÉÄ›1a¸µÈ¹›20a˼½·
+›767d›607`¶É»›22aì̹Ǜ22aÞÁÃÇÈÀÍ›19aÈÛ21a¼µÂ¸À¹›22aöǷÉƹ›22aºÃ›459aʽ¸¹¸›21aµÇ›21aµ
+›767d›1429`È›20aÄÆöÀ¹ÁÇßâ›38a¤È›22a½Ç›21aÄÆÃ
+›824d›626`¼µÂ»¹›17aìÀ¹›17aÈÛ16a¶›1a¹›17aµÄÄÀ½¹¸›16aÈÛ16aȼ¹›17a$5)3/,.TWh6%"›369a¹ÆǽÛ16aú
+›824d›607`·›951a±ÓâÏ›16aìÀ¹å›17aµ›16a¹˛17aÊ
+›880d›607`ȼ¹›14ah6%"›824aÊ›80aË›13a¶›1a¹¹Â›15añ¸¹Èµ¶¶›1a¹¸ïâ
+›880d›794`ìÀ¹›14a½Ç›13aµÀÇÛ13a½Â·Àɸ¹¸á›15a¶›1a¹·µÉǹ›15a¶›1aÃȼ›14aìÀ¹Ç›14a¼µ›22a¹›14aÂÃ
+›938d›678`¯¼¹›15aºÃÀÀÛ745a¹ÆǽÃÂä
+›938d›856`˽»›13a¹˛16aº¹µÈÉƹǛ14aµÆ¹›15aµ¸¸¹¸›16a½Â›15aȼ½Ç›15aÊ
+›1036d›15m›675`'›10m›23a¯¼¹›15ai0!0%1t2)9%›13aÅɵÀ½ì¹Æ›14a½Ç›14a½Â›314aË›13aÇÍÇȹÁ›14aÁµÂµ»¹ÆÇ›14aÈÃ
+›1036d›1348`ÈÆÛ1a¸É·¹¸›15aÈÛ13aµÀÀÃ
+›1093d›721`ÇÄ›1a¹·½ºÍ›17aȼ¹›16a¸¹ºµÉÀÈ›16aĵě1a¹Æ›17aǽι›17aÞ~ÉÆÃÄ›1a¹µÂ›16a!X›17aÊÇâ›16a42ßå›15aȼ½Ç›16a½Ç›16a¹·¹ÇǵÆÍ
+›1149d›721`ǽ·¹›17aȼ¹›16aÁ½Ì½Â»›16aú›16aÀµÂ¸Ç·µÄ›1a¹›18aµÂ¸›16aÄ›1aÃÆÈƵ½È›16aÃƽ¹Â›93a›15aÃÉÈÄÉÈ›17aÛ16aȼ¹
+›1149d›1689`ȵȽÃ
+›1205d›721`ǵÁ¹›11aĵ»¹›11aƹÅɽƹǛ11aµÂ›12a½Â›209aËÀ¹¸»¹›11aú›11aȼ¹›12aǽι›11aú›11aȼ¹›11aĵě1a¹Æâ›19a¯¼¹
+›1205d›1197`ȽÁµÈ¹›9a¿ÂÃ
+›1262d›2028`È›15aÈÃ
+›1262d›721`ÅɵÀ½ì¹Æ›15a·µÂÂÃÈ›15a¶›1a¹›16aÇÄ›1a¹·½ì¹¸›17a¹ÌÄÀ½·½ÈÀÍ›14aÈÛ15aÄÆÛ1a¸É·¹›16aÃÉÈÄÉÈ›16aµÇ›15a½º›15aǹÂ
+›1318d›1553`¼›14aÛ15aȼ¹›14a¶µ·›246aȹÆ
+›1318d›721`ȼ¹›14aÂÃÂ𸹺µÉÀÈ›15aĵě1a¹Æ›15aǽιá›14aǽ·¹›15aȼ¹›14aÇ˽ȷ›245a¿›15aú›14aȼ¹›14aÄƽÂ
+›1375d›1072`¼µÂ»¹¸á›16aµÂ¸›15aȼ¹›15aÄ›1aÛ31a¹Æ›15a·Í·À¹¸â
+›1375d›721`µÀÇÛ14a¹¹¸Ç›16aÈÛ15a¶›1a¹›15a·›383aË
+›1473d›15m›675`'›10m›23a¯¼¹›14ai5%1"/2%›268aÈÆÛ1a¸É·¹¸å›14a½Â›13aȼ¹›14a¸½ÇÈƽ¶Éȹ¸›13ah#,$›13aìÀ¹á›14aȼ½Ç
+›1473d›1017`ÅɵÀ½ì¹Æ›13a½Ç›14a½Â
+›1530d›865`Í›20a¸¹ºµÉÀÈá›21aµÂ¸›21aÄÆÛ1a¸É·¹Ç›22aȼ¹›20aǵÁ¹›21aȹÆÁ½ÂµÀ›19aÃÉÈÄÉÈ›20aµÇ›21a¹µÆÀ½¹Æ
+›1530d›721`½Ç›20aÛ21a¶
+›1586d›744`¹ÆǽÃÂÇ›13aú›15aȼ¹›14aÄÆûƵÁâ›19a{Í›14aÁµ¿½Â»›14aȼ¹›15a¸¹ºµÉÀÈ›14ai./5%1"/2%á›13aÃÆ›14aÇÄ›1a¹·ð
+›1586d›721`Ê
+›1643d›721`½ºÍ½Â»›17aȼ½Ç›17a¹ÌÄÀ½·½ÈÀÍ›17aÛ18aȼ¹›18a·ÃÁÁµÂ¸›18aÀ½Â¹á›18aÁ¹Çǵ»¹Ç›17aÈÛ18aȼ¹›18aȹÆÁ½ÂµÀ
+›1699d›721`µÆ¹›15aƹ¸É·¹¸›16aÈÃä
+›1797d›12m›772`¾›10m›23aȼ¹›15aµÁ¹›15aú›15aȼ¹›15ah$5)›15aìÀ¹›15a¶›1a¹½Â»›16aÄÆÛ1a·¹Çǹ¸å
+›1873d›12m›772`¾›10m›502aÉÁ›172aÍȹǛ15aú›15aºÃ›96aËÂÀõ¸¹¸å
+›1873d›821`ȼ¹›15aƹě1aÃÆÈ›15aú›15aȼ¹›15aÈÃȵÀ›14a›61a¶›1a¹ÆÇ›15aú›15a¶›207aÈÇ›14a¸Ã
+›1948d›12m›772`¾›10m›23aȼ¹›15a›61a¶›1a¹ÆÇ›16aú›14aȼ¹›16aĵ»¹Ç›15aÄÆÛ1a·¹Çǹ¸â
+›1948d›923`ÉÁ
+›2046d›678`¯¼¹›15aºÃÀÀÛ563a¹ÆǽÃÂä
+›2046d›856`˽»›13a¶É»Ç›15aµÆ¹›15aì̹¸›16a½Â›15aȼ½Ç›15aÊ
+›2145d›15m›675`'›10m›23aªÄȽÁ½ÎµÈ½Ã›12aú›13aºÃ›77aËÂÀõ¸½Â»›12a¼µ¸›14aÁµ¸¹›13aȼ¹›14aÄÆûƵÁ›13a½Â·µÄµ¶À¹›13aú
+›2145d›1108`È›13a¸Ã
+›2201d›721`¼µÂ¸À½Â»›15aºÃ›116aȵ½Â½Â»›14aÁÃƹ›15aȼµÂ›15aÐ××›14a»ÀÍļÇâ
+›2201d›969`ÈÇ›14a·ÃÂ
+›2299d›15m›675`'›10m›23azÀÀ›12aÆÉÀ¹Ç›13aË›441aȵȽÛ11aÇÄ›1a¹·½ì¹¸›14a½Â›13aȼ¹›13a·ÃÁÁµÂ¸›13aÀ½Â¹á
+›2299d›932`¹Æ¹›13aÃÉÈÄÉÈ›12a½Â›13aȼ¹›13aÃƽ¹Â
+›2356d›721`¹Ê›557aÊ›625aȵȽÃÂâ
+›2356d›764`¹Â›12a½º›12aÇÃÁ¹›12aú›12aȼ¹Á›12aǼÃÉÀ¸›13a¼µ›22a¹›12aµÄÄ›1a¹µÆ¹¸›12a½Â›13aȼ¹›12aÃÄÄ›1aÃǽȹ›12aÃƽ¹Â
+›2454d›15m›675`'›10m›23a¨½Ì¹¸›14aÄ›1aÃÆÈƵ½ÈãÀµÂ¸Ç·µÄ›1a¹›13aÁµÈ¹Æ½µÀ›13aƹÅɽƹǛ14a¿ÂÛ325aÍǽ·µÀ
+›2454d›1665`ËÀ¹¸»¹›14aú›15aȼ¹›14aļ
+›2511d›721`ĵě1a¹Æ›18aǽιá›19a¶›1a¹·µÉǹ›19aȼ¹›18añÃƽ»½Âï›17a½Â›18aÀµÂ¸Ç·µÄ›1a¹›18aÁÛ1a¸¹›19a½Ç›17aƹÀµÈ¹¸›18aÈÛ17aȼ¹
+›2567d›14m›740`.33.,›10m›19a¹¸»¹›15aú›15aȼ¹›15aĵě1a¹Æâ
+›2567d›14m›721`"
+›2665d›15m›675`'›10m›397aȵȽÛ10a˽ȼ½Â›11aµ›12aĵ»¹›12aƹǹÈÇ›11aȼ¹›12aÁµÆ»½ÂÇ›11aÈÛ11aȼ¹›12a¼µÆ¸ð
+›2665d›721`|¼µÂ»½Â»›11aȼ¹›12aÃƽ¹Â
+›2722d›753`µÆ¹›11a¸¹ºµÉÀÈÇá›12a˼½·›645a¼µÂ»¹›12aȼ¹Á›12aµ»µ½Ââ
+›2722d›721`Ë›342a¼›11a¹·¹ÇǽȵȹǛ12aȼµÈ›11aȼ¹›12aÄÆûƵÁ›10a·
+›2820d›15m›675`'›10m›134aÈ›16aȼµÈ›15a·Ã›354a¼µÆµ·È¹ÆÇ›15aÞ·µÂ›16aÃÂÀÍ›16a¼µÄÄ›1a¹Â›17a˽ȼ›16a0+
+›2820d›721`z›16aºÃ›199aȵ½ÂÇ›15a¸ÉÄÀ½·µÈ¹¸›17a·
+›2877d›782`ÈÇßá›10a½º›10aµÀÀ›10a·›224a¹Æ¹›11a½Áµ»¹¸›10aÞ¹â»âá›10a˽ȼ›10aM>LM?HGM›73aÃÉÀ¸›10aƹÇÉÀÈ
+›2877d›721`ºÃ›191a¼µÆµ·È¹ÆÇ›10aË›621aßá›10aË
+›2933d›721`½Â›15aµÂ›15a½ÀÀ¹»µÀ›14aºÃ›78aËÂÀõ¸â›20a¯¼¹›15aÄÆûƵÁ›15aÂÛ263a¼›16a¹ÆÆùÃÉÇ
+›2933d›1030`È›14a¸Ã›497aË›15a¸¹È¹·ÈÇ›15aÇÉ·
+›2990d›782`ÈÇá›15a˼½·›355aÍ›15a¯›18a³Ë›193aÈ›31aµÆ¹›14a¸Ã›1a¹Ç›16a޵ĵÆÈ›15aºÆÃÁ
+›2990d›721`ºÃ›153a¼›16a½Ç›15aÁÃƹ›16aȼµÂ›16aµÂ›155aµÆ¹›15aÃÆ›16aºÃ›16aË
+›3000d›1356`~
+›3046d›721`'&MH07,ßÛ
+›1;479;665;2392;8!|
+
+
+›462d›12m›656`Õ›15aËÄ›15aÁÆ¿ÊÅÃÏ›10m›908aÊ
+›462d›12m›449`ÏÑÉÉ¿Î
+›607d›14m›552`_VlhXYpq›10m›14a±ÓâÏ›14aË›919a¹ÆǽÃÂÇ
+›607d›14m›520`R›10m›337aµÇ›14aȼ¹›15aìÆÇÈ›15aÄɶÀ½·›15aƹÀ¹µÇ¹›14aǽ·¹›15a±ÒâÐðÓå›14aÃȼ¹Æ›15aÊ
+›664d›496`Ê›282aȹƵÀÀÍ›14aµÈ›14aȼ¹›15aµÉȼÃÆÝÇ›15aǽȹá›14aµÂ¸›15aÇÃÁ¹›15aú›15aȼ¹Ç¹›15a¼µ›22a¹›15a¶›1a¹¹Â
+›664d›449`¼µ›22a¹›15a¶›1a¹¹Â›16aÉǹ¸›16a½Â›991aÊ
+›720d›449`·½Æ·ÉÀµÈ¹¸›16aÈÛ16aµ›16a¸¹¸½·µÈ¹¸›16a¶µÂ¸›17aú›13m›16aô›10m›2aðǽȹ›16aȹÇȹÆÇó¤ÝÁ›15aÊ›339aÃÉÆ
+›720d›1538`¹ÆÍ›16a»ÆµÈ¹ºÉÀ›15aºÃÆ›15aÍ
+›777d›628`ÈÀ¹Á¹ÂÛ
+›777d›449`¼¹ÀÄá›16a»¹Â
+›833d›14m›552`_VlhXYpq›10m›162aÈÆÛ1a¸É·¹Ç›18aȼ¹›17aºÃÀÀÛ298aÈÇ›17aµÂ¸›18a¹˛17aº¹µÈÉƹÇ
+›833d›14m›520`R›10m›200a±ÓâÏ›16a½Â›350a˽»›15aƹì¹Á¹Â
+›890d›449`·ÃÁĵƹ¸›16a˽ȼ›14a±ÒâÐä
+›986d›15m›518`'›10m›805aÈ›15aìÀ¹Çå›16aºÃÆ›16a¹Ê›138aÈá›16aȼ¹›16aÄÆÃð
+›986d›563`®ÉÄÄ›1aÃÆÈ›17a¼µÇ›16a¶›1a¹¹Â›17aµ¸¸¹¸›17aºÃÆ›16aʽÆÈɵÀ›15aºÃ›251a¹ÆÍ›16aºÃÂ
+›1042d›563`»ÆµÁ›18a˽ÀÀ›17aµÈȹÁÄÈ›18aÈÛ19aÃÄ›1a¹Â›19aµ›19aìÀ¹›18a˽ȼ›19aµÁ¹›15m›18a*›14m&.-3-!,%›15m›3a+›10mh5&á›18aÀÛ1aÿ½Â»
+›1099d›563`½Â›13aȼ¹›13a¸½Æ¹·ÈÃÆÍ›12aƹº¹Æ¹Â·¹¸›14aȼÆÃÉ»¼›13aȼ¹›13aÅɵÀ½ì¹Æ›12ai5)134!,t$)1%#3/18
+›1155d›901`Í›16aƹÅɽƹÁ¹Â›315aÈÇ›16a·µÂ›16aÇÄ›1a¹¹¸›18aÄÆÛ1a·¹Çǽ»
+›1155d›563`ÞǽȹǛ16a˽ȼÃÉÈ›15aµÂ›259aÈ›17aºÃÆ›16aʽÆÈɵÀ›15aºÃÂ
+›1212d›829`Í›18aÁµ¿½Â»›16aȼ¹›18a¸¹ºµÉÀÈ›424a/18ßâ›24a¢ÀÍļÇ
+›1212d›563`ºÆµ·È½ÃµÀÀÍ›15a¶›439ai./5)134!,t$)1%#3
+›1268d›563`ºÆÃÁ›16aÇÉ·›143aÈ›16a˽ÀÀ›16a¶›1a¹›17a½Áµ»¹¸›17aºÆÃÁ›16aȼ¹›17aµÄÄÆÃÄƽµÈ¹›17aļ›187aÈÇá
+›1268d›734`¼›18aµ›17aºÃ›829aÍǽ·µÀ›16aºÃÂ
+›1324d›563`ö›1a¹Í½Â»›15aµÀÀ›15m›14a*›14m$5)›16a"83%›15m›4a+›10m›15aǹÅɹ·¹Ç›16a½Â›15aȼ¹›15ah5&›15aìÀ¹â
+›1420d›15m›518`'›10m›22a®ÉÄÄ›1aÃÆÈ›21aºÃÆ›20a¯›17a³ÝÇ›20auLI><B:E›19a·ÃÁÁµÂ¸›20a¼µÇ›21a¶›1a¹¹Â›21a¹Ìĵ¸¹¸›22aµÂ¸›20a½Áð
+›1430d›844`~
+›1477d›563`ÄÆÛ22a¹¸å›19a½È›17a½Ç›17aÃÂÀÍ›18a¹·¹ÇǵÆÍ›18aÈÛ17aÄÆÛ257aÈ›17a·›318a¹Íð
+›1477d›628`Ê›602aʽ¸¹›18aÇÉî·½¹Â›53a¼µÆµ·È¹ÆÇ›18aú›17aµ›18a¿
+›1533d›595`ÃƸ›12aÈÛ11a½¸¹Â›515a¹ÍË›290aÈß›12aµÆ¹›12aɽÅɹ
+›1533d›563`Ë›211aȽºÍ›12a½È›12aɽÅɹÀÍä›18aǽ·¹›13aµÀÀ›11a¿›75aÃƸǛ12a޵ț11aÄƹǹÂ
+›1590d›563`½Â›19aȼ¹½Æ›18aìÆÇÈ›18aÈ›31aÛ18aÀ¹ÈȹÆÇá›18aȼ¹Â›19aÃÂÀÍ›18aȼµÈ›18aÁµÂ›281aʽ¸¹¸á›19aµÀð
+›1590d›846`Ë›593aÍ›18a¹¹¸›20a¶›1a¹›19aÄÆÃ
+›1646d›770`Í›20auLI><B:E›20aǹÅɹ·¹Ç›22a˽ÀÀ›20aÃƸ½ÂµÆ½ÀÍ›19a¶›1a¹›22a¸¹ì¹¸›22a˽ȼ½Â›20aµ
+›1646d›563`ȼÃÉ»¼›21aµÂ
+›1703d›773`¿›183aÍÀ¹›21aÃÄȽÃÂå›25aµÉȼÃÆÇ›21aú›22aȼ¹Ç¹›22aµÆ¹›22a¹Â·ÃÉƵ»¹¸›22aÈÃ
+›1703d›563`Áµ·ÆÛ21aĵ·›20aµ»¹›23aÃÆ›21aÇÈ
+›1759d›563`Ëƽȹ›14aµÀÀ›14a¿›75aÃƸ›15aĵƵÁ¹È¹ÆÇ›14a½Â›15aºÉÀÀâ
+›1759d›765`¹ÍË
+›1855d›15m›518`'›10m›22a®ÉÄÄ›1aÃÆÈ›16aºÃÆ›14aÈ›31aÛ14a¹˛16auLI><B:E›14a·ÃÁÁµÂ¸Çä
+›1855d›825`Ë
+›1951d›563`E:G=L<:I>›80aÍ›20aȹÌÈá›22aÆÉÀ¹Çá›21aÃÆ›20a»ÆµÄ¼½·Ç›21a½ÂǹÆȽÃÂá›21aÉÄ›21aÈÛ20aȼ¹›21a¹Â¸›21aú
+›1951d›801`zÂ
+›2007d›872`È›21aĵ»¹á›21aÃÆ›20aȼ¹›21a¹ÌÈ›21auLI><B:EvIHKMK:BMw›18a·ÃÁÁµÂ¸á
+›2007d›663`ȼ¹›21a·ÉÆƹÂ
+›2064d›753`¼¹Ê›991aȵȽÃÂá
+›2064d›663`˼½·›67a¹Æ›19aÛ1a··ÉÆÇ›20aìÆÇÈá›20a˽ÀÀ›18a¶›1a¹›21aÃÉÈÄÉÈ›19a½Â›19aÀµÂ¸Ç·µÄ›1a¹›20aÃƽ¹Â
+›2120d›1367`È›19a½Ç›18a¶›1a¹½Â»›19aÄÆÛ1a·¹Çǹ¸›19a½Â›19aÀµÂ¸ð
+›2120d›663`ƹ»µÆ¸À¹ÇÇ›18aú›18a˼¹È¼¹Æ›19aȼ¹›18a¸Ã›1a·ÉÁ¹Â
+›2176d›663`Ç·µÄ›1a¹›16aÃÆ›14aÄ›1aÃÆÈƵ½È›14aÁÛ1a¸¹â
+›2250d›563`IHKMK:BM›22a¯¼¹›15aÃÄÄ›1aÃǽȹ›15aú›15aȼ¹›15aÄƹʽÃÉÇ›15a·ÃÁÁµÂ¸
+›2346d›923`¹ÍË›161aÍ›18a¶›1a¹›20aÉǹ¸›20a˽ȼ›18aÃÆ›19a˽ȼÃÉÈ›18aȼ¹›19aéEGTWjÝ
+›2346d›563`©Ãȹ›19aȼµÈ›18aȼ¹Ç¹›20a¿›75aÃƸǛ18aÁµ
+›2403d›563`ÄƹìÌá›12aǽ·¹›12aȼ¹›11a·Ã·¹ÄÈ›12aú›11aÄƽ›186aȵȽÛ302aÍ›11a·Ã·¹ÄÈ
+›2403d›1173`Ƚ»›10aÃƽ¹Â›93a›10aÈƵÂÇ·¹Â¸Ç›11aµÂ
+›2459d›563`ú›15a¸¹Ê½·¹›15a¸¹Ä›1a¹Â¸¹Â›1a·¹â
+›2555d›15m›518`'›10m›22a¯¼¹›14aÅɵÀ½ì¹ÆÇ›13ai,%&3t-!1').›12aµÂ¸›13ai3/0t-!1').›59aË›13aƹÅɽƹ›13aȼµÈ›13aȼ¹½Æ
+›2555d›1509`ÂÃ
+›2611d›563`µÇÇÛ1a·½µÈ¹¸›14aÊ›619aȵ̛14aú›15aµ›15a¯›17a³›15m›15a*›14m$),%-2).-›15m›3a+›10má
+›2611d›800`µÀɹǛ15a¶›1a¹›16aÇÄ›1a¹·½ì¹¸›16aÉǽ»›15aȼ¹›15aÇÍÂ
+›2621d›1616`~
+›2668d›742`Í›14aµ›13a›61a¶›1a¹Æ›15aÞƹµÀ›13aÃÆ›13a½Â›214aË›80aÍ›14aµ›14aÈ›31aÃðÀ¹Èȹƛ12a·Ã›1a¸¹›14aºÃÆ
+›2668d›563`ȼµÈ›13a½Çá›14a¶›97aÉÁ›274aȹ»¹Æß›13aºÃÀÀÛ31a¹¸›12a¶›91aË
+›2724d›563`µ›20a¯›17a³›15m›20a*›14m›120a!+›16a4-)3›15m›4a+›10må›22aȼ¹›20aÇȵ¸µÆ¸›19aɽÈÇ›20aú›20a¯›17a³›20aÞIM›23aLI›24aI<›24aBG›23a<F
+›2724d›14m›728`/(82)#
+›2734d›10m›631`~›851a~
+›2781d›563`FF›24a==›23a<<ß›15aµÆ¹›15aÇÉÄÄÀ¹Á¹Â›101aÍ›15aFB›15aÞºÃÆ›14aÁ½·ÆÃÂá›15a½â¹â›14aЛ13mõ›10mÁß›15aµÂ¸›15aIQ›15aÞºÃÆ
+›2781d›1071`ȹ¸›15a¶
+›2837d›563`Ľ̹Àßâ
+›2933d›15m›518`'›10m›22a¯¼¹›19aÄÆûƵÁ›17aÂÛ18aÀû¹Æ›18aµÇÇÉÁ¹Ç›18aȼµÈ›18ah3&-›18aìÀ¹Ç›18a˽ÀÀ›18a¶›1a¹›19aºÃɸ›18a½Â›19aȼ¹
+›2990d›973`Í›12aȼ¹›13aÀû½·µÀ›11aµÁ¹›13a3%7^&/.32å›11a½ÂÇȹµ¸á›12aȼ½Ç›12a½ÂºÃÆð
+›2990d›563`¸½Æ¹·ÈÃÆÍ›12a½Â¸½·µÈ¹¸›13a¶
+›3046d›837`Ê›42a¹¸›18aÈÛ18aȼ¹›19aÄÆûƵÁ›18aȼÆÃÉ»¼›18aȼ¹›19a·ÃÁÁµÂ¸ð¸¹ì½ȽÃÂ
+›3046d›563`ÁµÈ½Ã›18a½Ç›18a·Ã›22a¹Í
+›1;2064;566;41;8!|
+
+
+›462d›607`ʽ›12m›1102aÕ›14aËÄ›16aÁÆ¿ÊÅÃÏ
+›462d›1539`ÏÑÉÉ¿Î
+›607d›10m›721`ìÀ¹á›19aÉǽ»›19aȼ¹›19ai3&-t$)1%#3/18›717aË
+›607d›1369`ÅɵÀ½ì¹Æâ›31a®ÍÇȹÁ›19aÁµÂµ»¹ÆÇ›18aµÆ¹›19aÂÃ
+›664d›721`ºÆ¹¹›11aÈÛ10aÉǹ›11aÀû½·µÀ›8aµÁ¹Ç›11aú›10aȼ¹›11aºÃÆÁ›10a3%7t).0432›301aÉÇ›10a·ÃÂð
+›664d›1673`½ÂÇȹµ¸á›11aµÂ¸›11aȼ
+›720d›721`ºÃÆÁ›9aÈÛ12m›147aóæ›10m›10aƹ·ÃÁÁ¹Â¸µÈ½ÃÂÇ›9aƹ»µÆ¸½Â»›10a·ÉÇÈÃÁ¹ÆðµÇǽ»Â¹¸›9aÀû½·µÀ
+›720d›12m›874`ÂÞÜÞçÖß
+›777d›10m›721`µÁ¹Çâ
+›876d›15m›675`'›10m›23a«Æ¹Ê½ÃÉÇ›15aÊ›492aÃÉÀ¸›15aµ¶›1aÃÆÈ›15aÉÄ›1aÛ16a¸½Ç·Ã›22a¹Æ½Â»›14aµ›15aƹºð
+›876d›931`¹ÆǽÃÂÇ›14aú›15aȼ¹›15aÄÆûƵÁ›14aË›436aÊ
+›933d›1023`È›17aºÃÆ›18a˼½·›61a¼µÆµ·È¹Æ›17a¶½ÈÁµÄÇ›18a·ÃÉÀ¸›18aÂÃÈ›18a¶›1a¹›19aºÃɸ›18aÞ½Â
+›933d›721`¹Æ¹Â·¹›19aÈÛ17aµ›18aºÃ›197a¼›18a·
+›989d›913`¿›224a¿›419aµÇ›10aÇÃÁ¹Ë¼µÈ›11aÉǹÆð¼ÃÇȽÀ¹á
+›989d›721`¹½È¼¹Æ›11aĵ·›22a¹¸›11aÃÆ›11aÉÂĵ·›22a¹¸›12aĽ̹À›11aìÀ¹Çßâ›18a¯¼½Ç›11aË
+›1046d›891`µÆ½µÂ·¹›18a˽ȼ›18aȼ¹›18aÄÆÃÄ›1aÃǹ¸›18a§¹Ê›125a±¤ð}ƽʛ289aèá
+›1046d›721`µÂ¸›18aµÈ›17aÊ›612a¹À›18aÏ›18a}›153a¹Æ›17a®ÈµÂ¸µÆ¸›18açÑ
+›1102d›1087`Ë›16aÇɶÇȽÈÉȹǛ15aÇÃÀ½¸›16aÆÉÀ¹Ç›16aú›16aµÄÄÆÃÄƽµÈ¹›15a¸½Á¹ÂǽÃÂÇ
+›1102d›721`ÇÛ16aȼ¹›16aÄÆûƵÁ›15aÂÃ
+›1159d›1103`¼›15aµ›15aºÃ›131aµÆ½»›14aÁ¹Çǵ»¹›14a˽ÀÀ›14a¶›1a¹›16a¸½ÇÄÀµ›22a¹¸â
+›1159d›721`ºÃÆ›14a»ÀÍļǛ15aºÆÃÁ›15aÇÉ·›138aÈâ›19az›16aË›578aÍ
+›1259d›15m›675`'›10m›23az›12aÁ¹·›402aʽ¸¹¸›12a¶›125a¼›13aÇÄÉƽÃÉÇ›12aé0:@>›23aPB=>K›23aMA:G
+›1259d›844`¼µÂ½ÇÁ›13a¼µÇ›12a¶›1a¹¹Â›14aÄÆÛ142aÍ›12a˼½·
+›1315d›721`3>7›23aK>IHKM>=Ý›16aÁ¹Çǵ»¹Ç›16aÁµ›356aÍ›17aȼ¹›17aÉǹÆä›23aǹ¹›17aȼ¹›17a¸¹ð
+›1315d›1291`Í›16a¶›1a¹›17aÇÉÄÄƹÇǹ¸›18a¶
+›1372d›721`ǷƽÄÈÛ11aú›11aȼ¹›11ai(&499›229aÃÆ›11a·ÃÁÄÀ¹È¹Â¹ÇÇ›11aú›11aÃÆȼûõÀ½È›14aá›10aȼ¹
+›1372d›1169`ÅɵÀ½ì¹Æâ›18a¡›608aÍ
+›1428d›942`ȵÆÍ›19ai5&499›410aʽ¸¹¸á›20a¶ÉÈ›20a½ÈÝÇ›19a¹ÌÈƹÁ¹ÀÍ
+›1428d›721`·ÃÁÄÀ¹Á¹Â›264aÅɵÀ½ì¹Æ›19a½Ç›19aµÀÇÛ19aÄÆÃ
+›1484d›820`¹ÀÍ›14aȼµÈ›15aȼ½Ç›14aË›143a¹Æ›15a¶›1a¹›16aƹÅɽƹ¸â
+›1484d›721`ÉÂÀ½¿›289aÃÉÀ¸›15a¹Ê
+›1584d›15m›675`'›10m›568aÊ›206aʽ¸¹¸›14aÈÛ14aÇÉÄÄ›1aÃÆÈ›12m›15aÂÞÜÞçÖßóæ›10m›14a¹Ë
+›1584d›721`|ÃÁÁµÂ¸ðÀ½Â¹›14aÅɵÀ½ì¹ÆÇ›14a¼µ›22a¹›15a¶›1a¹¹Â›16aÄÆÃ
+›1629d›15m›1017`-
+›1645d›10m›721`}~|ÀµÇ¹Æ›13aÑÐÏÏ›35aµÂ¸›15aÑÑÏÏ›13aÄƽ›376aË›14aµÇ›14aȼ¹›14a§©ÏÔ›14aµÂ¸
+›1645d›1325`ȹÆÇ›13aÞÃȼ¹Æ˽ǹ›13a¿ÂÃ
+›1702d›721`§©ÏÕßâ›29a¯¼¹›19aÉǹƛ18a·µÂ›19a·Ã›345aȽ»›18a˽ÀÀ›17a¶›1a¹›19a½Â›18aǽÁÄÀ¹Ì›18aÃÆ
+›1702d›1239`ÈÆÃÀ›17a˼¹È¼¹Æ›18aÄƽÂ
+›1758d›721`¸ÉÄÀ¹Ì›19aÁÛ1a¸¹›19aÞÄƽ›980a¼
+›1758d›1096`Ƚ»›18aÛ19a¶›1aÃȼ›19aǽ¸¹Ç›18aú›19aȼ¹›19aĵě1a¹Æßá›19aµÂ¸›20aºÆÃÁ›18a˼½·
+›1815d›779`ÍÞÇß›13aȼ¹›15aĵě1a¹Æ›16a˽ÀÀ›14a¶›1a¹›16aº¹¸â
+›1815d›721`ÈƵ
+›1915d›15m›675`'›10m›1137aÊ›101aÈÇ›16a¼µ›22a¹
+›1915d›721`§µÇÈá›17a¶ÉÈ›18a¸¹ì½ȹÀÍ›18aÂÃÈ›17aÀ¹µÇÈá›17a·ÃÂǽ¸¹Æµ¶À¹›18aÇÄ›1a¹¹¸›19a½ÁÄÆÛ22a¹Á¹Â›98aÊ
+›1971d›721`¶›1a¹¹Â›18aÁµ¸¹›16a¶›1065a¹À½ð
+›1971d›976`Í›17aƹÃÆ»µÂ½Î½Â»›15aÇÃÁ¹›16a¸µÈµ›16aÇÈÆÉ·ÈÉƹǛ17aÈÛ16aƹ¸É·¹›17aȼ¹›17aÀ½¿
+›2028d›721`¼Ã›1aÛ1a¸›15aú›15aȼ¹›16a±›125aʽ»›14aÈÛ15aĵ»¹›15aºµÉÀÈâ
+›2028d›994`z³›15a¼µ
+›2158d›13m›607`k¨¬¦›19a[tmxsq|
+›2247d›14m›639`_VlhXYpq›10m›152aÈÆÛ1a¸É·¹¸›11aȼ¹›12aºÃÀÀÛ293aÈÇ›12aµÂ¸›11a¹˛12aº¹µÈÉƹǛ12a·ÃÁð
+›2247d›14m›607`R›10m›195a±ÒâЛ11a½Â›345a˽»›10aƹì¹Á¹Â
+›2303d›607`ĵƹ¸›16a˽ȼ›14a±ÒâÏä
+›2403d›15m›675`'›10m›23a®ÉÄÄ›1aÃÆÈ›15aºÃÆ›15a¯›18a³ÝÇ›14auLI><B:E›253aµÇ›15a¹Ìĵ¸¹¸›16aµÂ¸›15a½ÁÄÆÛ22a¹¸â
+›2403d›1302`·ÃÁÁµÂ¸›15aË›462aÊ
+›2413d›991`~
+›2481d›1331`Í›18aÂÛ589a˽»
+›2481d›721`®½Ì¹À›18aÞÃÆ›18aÃȼ¹Æ›18a§©ÏÒß›18aìÀ¹Ç›18aÁµ›88aË›18a¶›1a¹›19a½Â·Àɸ¹¸›19aÉǽ»›18aȼ¹›19aºÃÀÀÃ
+›2538d›787`ȵ̹Ǜ14a˽ȼ½Â›15aȼ¹›15aĵƵÁ¹È¹Æ›15aú›14aȼ¹›16auLI><B:E›14a·ÃÁÁµÂ¸ä
+›2538d›721`ÇÍÂ
+›2638d›12m›772`¾›10m›23auLI><B:Ev27y›15m*›14m:›57a!,%›15m›2a+›10mw
+›2638d›14m›1152`+%-
+›2714d›12m›772`¾›10m›430aM?BE>y›15m*›14m›57a-!,%›15m›2a+›10mw
+›2714d›821`uLI><B:EvEGTWjIEH›14m›160a:+%
+›2790d›12m›772`¾›10m›430a>Ey›15m*›14m:›57a!,%›15m›2a+›10mw
+›2790d›821`uLI><B:EvEGTWjLBQ›14m›114a+%-
+›2890d›10m›1865`Í›16aÉǹÆÇá›16a¶ÉÈ
+›2890d›721`¯¼¹Ç¹›16a·ÃÁÁµÂ¸Ç›16a˽ÀÀ›15aÂÃÈ›16aÂÃÆÁµÀÀÍ›14a¶›1a¹›17a½ÂǹÆȹ¸›16a¸½Æ¹·ÈÀÍ›15a¶
+›2946d›1294`È›11aÇÈ›279a¼›11aµÇ›11a@K:IAB<Lá›10aǹ¹›15m›12a,›10mÑâÒâ
+›2946d›721`ȼÆÃÉ»¼›10aȼ¹›12aÉǹ›11aú›10aµ›11a¸Ã›1a·ÉÁ¹Â›63aÍÀ¹›11aÃÄȽÃÂá›10aÇÉ·
+›3030d›15m›676`È
+›3046d›11m›708`qrp¬¡³¥²›13a¡®¤›14auwº½Çuwº¾›13a¡²¥›13a²¥§©³´¥²¥¤›14a´²¡¤¥­¡²«³›14a¯¦›14m›13aÃËÊËÑÈÌ
+›1;607;2991;2;598!|
+
+
+›462d›12m›656`Õ›15aËÄ›15aÁÆ¿ÊÅÃÏ›10m›883aʽ½
+›462d›12m›449`ÏÑÉÉ¿Î
+›607d›15m›518`'›10m›178aʽÛ11a­Ãǹ›12auLI><B:EÇ›11aµÆ¹›12aÇÉÄÄ›1aÃÆȹ¸›14aÈÛ12a¸Æµ›67a¹ÆȽ·µÀ›11a¶µÆÇ›12a¶›1a¹Ç½¸¹
+›607d›563`¯¼¹›13a¡Àµ›801aË›12aÊ
+›664d›563`·›1142aËÇá›16a˽ȼ›17aç›7aè
+›664d›582`¼µÂ»¹¸›18aÁµÈ¹Æ½µÀâ›25a¯¼¹›18aĵƵÁ¹È¹ÆÇ›17aƹ·Ã»Â½Î¹¸›18aµÆ¹›17aµÇ›17aºÃÀÀÃ
+›720d›648`¿›450aÍ›15a¶›1a¹›15aÃÁ½Èȹ¸ä
+›720d›563`¶Æµ·›22a¹È½Â»›14aÁµÈ¹Æ½µÀ›14aȼµÈ›14aÁµ
+›835d›12m›614`¾›10m›478aBGMy›15m*›14m/›60a3›15a-.›15m›3a+›10mcç›15m*›14m$),%-›15m›2a+›10mègç›15m*›14m$),%-›15m›2a+›10mèdwâ
+›835d›663`uLI><B:EvEGTWj=>?IH›14m›134a.)-
+›891d›10m›918`Èá›10a½Â›10aȹÆÁÇ›10aú›13m›10aò›10m›10aµÂ¸›13m›10aó›10m›12a·Ã›1aÃƸ½ÂµÈ¹Ç›10aÛ10aȼ¹›10aĵ»¹â›18a~½È¼¹Æ
+›891d›663`}¹ì¹›11aµ›10aÄ›1aýÂ
+›948d›663`·Ã›1aÃƸ½ÂµÈ¹›14aÁµ›741a¹Ç›14aÄÀµ·¹›14a˽ȼ
+›948d›946`Í›14a¶›1a¹›15aÃÁ½Èȹ¸á›14a˼¹Â›15aȼ¹›15a¸¹ì½ȽÛ14aȵ¿
+›1004d›663`ȼ¹›16aµÄÄÆÃÄƽµÈ¹›15a·ÉÆƹ›759aÈ›13m›16aï
+›1004d›10m›1113`È›16aÄ›1aÃǽȽÃÂâ›22a¯¼½Ç›15aȼ¹Æ¹ºÃƹ›16a¸¹ì¹Ǜ17aÄ›1aýÂ
+›1011d›15m›1930`p
+›1060d›10m›663`ÈÛ15a¶›1a¹›16aµÈ›14aÞ›13mò›14a÷›8aó›10m›13aßâ
+›1067d›15m›880`p›45ap
+›1144d›12m›614`¾›10m›478a<My›15m*›14m›21a.)-›50a!)1›15m›5a+›10my›15m*›14m/›113a!)1›15m›5a+›10mçy›15m*›14m$),%-›15m›2a+›10mèwá
+›1144d›663`uLI><B:EvEGTWj<HGG>›14m›89a/›60a3›15a/›140a.)-3›16a/
+›1200d›10m›663`˼¹Æ¹
+›1272d›15m›930`*›14m/›113a!)1›15m›5a+›12a#›13a*›14m›21a.)-3›16a-.›15m›3a+›10mçi›15m*›14m›21a.)-3›15a-.›15m›3a+›10mè
+›1272d›14m›969`.)-3›16a/›155a/›217a/
+›1374d›10m›663`|ù·È›19aĵ½ÆÇ›18aú›19aÄ›1aý›805aÈß
+›1374d›1103`ÈÇ›18aÈû¹È¼¹Æá›19a˽ȼ›18aµ›19aÆÉÀ¹›19aú›18a˽¸È¼›19aÞ¼¹½»¼
+›1430d›15m›663`*›14m$),%-›15m›3a+›10m›586a¹ÆÈÇ›23aÈÛ23aȼ¹›24aÉÇɵÀ›24aÑ›23aĽ̹ÀÇ
+›1430d›823`â›46a¤º›24aÃÁ½Èȹ¸á›24aȼ¹›24aÀµÈȹƛ23aƹÊ
+›1487d›1009`ÈÇ›13aÁ›699aÍ›13aµ›13aÆÉÀ¹
+›1487d›663`ÞÏâÓÄÈßâ›18a¯¼¹›13aÄ›1aý›85aÉÇÈ›12a¶›1a¹›14a·µÄµ¶À¹›13aú›13a¶›1a¹½Â»›14a·Ã¹·È¹¸›14a¶
+›1543d›663`ȼµÈ›11a½Ç›10a¹½È¼¹Æ›11aÇÈƽ·ÈÀÍ›10aÊ›484aȵÀâ›16a¯¼¹›12aÊ›98aÈ›10aú
+›1543d›1099`¹ÆȽ·µÀ›10aÃÆ›11aÇÈƽ·ÈÀÍ›10a¼ÃƽÎÛ193aµÆ½µÂ
+›1600d›15m›663`*›14m/›113a!)1›15m›5a+›10m›15a˽ȼ›15aȼ¹›16a½Â›78a¹Â½Â»›14aéiÝ›15a½Ç›15aÉǹ¸›16a˽ȼ›15aMPHLB=>›94aÈð
+›1600d›14m›702`.)-3›16a/›10m›312aȹÆÊ›620aÄƽÂ
+›1656d›663`½Â»›19aÈÛ19aÇÄ›1a¹·½ºÍ›14m›20a36.›10m›281aÈÇá›20aù›20aÈÛ19a¶›1a¹›20aÉǹ¸›20aÛ20aÀ¹ºÈð¼µÂ¸
+›1656d›1049`ĵ½ÆÇ›19aú›19aÄ›1aýÂ
+›1713d›1113`Èð¼µÂ¸â
+›1713d›663`ĵ»¹Çá›15aµÂ¸›15aù›15aÛ16aƽ»¼
+›1796d›12m›614`¾›10m›478aIHBGMLy›14m›17a:123›15m›2a+›10my›15m*›14m+!23›15m›3a+›10mw›326aËÀð
+›1796d›663`uLI><B:EvEGTWjK>L>M›15m›167a*›10m›278a|µÂ·¹À›24aµÀÀ›24a¿ÂÃ
+›1852d›1276`ÈÇ›13m›15aï›30aö›8aö›8aö›5aï›10m›13aâ
+›1852d›663`¹¸»¹›16aú›14aȼ¹›16a·Ã›1aÃƸ½ÂµÈ¹Ç›14aú›15aÄ›1aýÂ
+›1859d›15m›1350`o›96aq
+›1967d›10m›563`z»µ½Âá›19aȼ¹›18aÉǹƛ19a¹¹¸›20aÂÃÈ›18aË›473a¼›19auLI><B:E›18a·ÃÁð
+›1967d›1120`ÃÆÆÍ›18aµ¶›1aÃÉÈ›18a·Æ¹µÈ½Â»›18aÇÉ·
+›2023d›1008`ÍÀ¹›15aÃÄȽÛ16a<A:G@>;:K›80aʽ¸¹Ç›15aȼ¹›17aµÄÄÆÃÄƽµÈ¹
+›2023d›563`ÁµÂ¸Ç›16a¸½Æ¹·ÈÀÍä›22aȼ¹›16aÇÈ›445aÄÆÃ
+›2080d›809`¼›17aµÆ¹›17a½Â›22aÿ›84aÍ›17aÁ¹µÂÇ›17aú›17aȼ¹›17a·ÃÁÁµÂ¸Ç›17au<;LM:KM›16aµÂ¸
+›2080d›563`Áµ·ÆÃÇ›16a˼½·›156aÊ›45a¹¸›16a¶
+›2130d›14m›943`}
+›2136d›10m›563`u<;>G=›107aÍ›15aȼ¹›15a§›5a¯›18a³›15a¹Â›184aÈ›14a<A:G@>;:Kâ
+›2136d›707`á›14aÃÆ›15a¶›293aʽÆÃÂÁ¹Â
+›2150d›989`~
+›2251d›15m›518`'›10m›256aË›13aÇÉÄÄ›1aÃÆÈÇ›14aµÂ›14aÃÄȽõÀ›13aìÀ¹›14aÇÄ›1a¹·½ì·µÈ½Ã›14aÛ14aȼ¹›14ai,/'›13aÅɵÀð
+›2251d›563`«ÆûƵÁ›13aÂÃ
+›2307d›563`½ì¹Æâ
+›2422d›15m›518`'›10m›22a«ÆûƵÁ›12aÂÛ110aʽ¸¹Ç›13aȼ¹›13ai/43043›12aÅɵÀ½ì¹Æ›13a˼½·›97aÍ›13a¶›1a¹›14aÉǹ¸›14aÈÛ13a¸½ð
+›2422d›796`Ë›13aÄÆÛ632a¼›13aÁµ
+›2478d›1035`È›12aìÀ¹›13aÇÄ›1a¹·½ì·µÈ½Ã›13aÞºÃÆ›12a¹ÌµÁÄÀ¹á›13aÛ204a¼
+›2478d›563`ƹ·È›13aÃÉÈÄÉÈ›13aÈÛ12aµ›13a¸½ë¹Æ¹Â›678aÈÛ13aµ›12aǷƵȷ
+›2535d›563`¸½Ç¿ßá›16aÃÆ›16a¹Ê›569aȹÆá›16aÄ›1aÃÇǽ¶ÀÍ›16aµÇ›16aµ›16aÇÄ›1aÛ1aÃÀ¹¸›17a¸¹ð
+›2535d›790`¹Â›17a¸½Æ¹·ÈÀÍ›16aÈÛ16aȼ¹›17a§©ÏÒ›16aÄƽÂ
+›2591d›563`ʽ·¹â
+›2706d›15m›518`'›10m›340aË›12a¹ÂÇÉƹǛ13aȼµÈ›12aµÀÀ›12aÃÉÈÄÉÈ›13aìÀ¹Ç›12aµÆ¹›13a·Æ¹µÈ¹¸›13a½Â›12aȼ¹›13aÉǹÆÝÇ
+›2706d›563`¯¼¹›13aÄÆûƵÁ›12aÂÃ
+›2762d›563`·ÉÆƹ›416aÊ›207aÍ›21ai/43043›214aá›21aȼ¹›20aÉǹ
+›2762d›688`È›21a¸½Æ¹·ÈÃÆÍ›20aÞÉÂÀ¹ÇÇ›20aÛ22a¹Æƽ¸¸¹Â›20a¶›212aßä›19aºÃÆÁ¹ÆÀÍ
+›2819d›563`ú›19aµ›20aÀû½·µÀ›18aµÁ¹›20a·ÃÉÀ¸›20a·µÉǹ›20aÇÉ·›678aÈ
+›2819d›1248`¼›20aìÀ¹Ç›20aÈÛ19a¶›1a¹›21a·Æ¹µÈ¹¸›19a½Â›20aµ›20a¸½ë¹Æ¹Â
+›2875d›738`â
+›2875d›563`¸½Æ¹·ÈÃÆÍ
+›2990d›15m›518`'›10m›22a|ÃÆƹ·ÈÀÍ›20aƹě1aÃÆÈÇ›20aȼ¹›21aƹÀµÈ½Ê›445aÈÇ›20aÀõ¸¹¸›20aµÈ›20aÂÃÂð
+›2990d›1143`¹›19aÁµ»Â½ì·µÈ½Ã›20aú›20aºÃÂ
+›3046d›563`Çȵ¸µÆ¸›15aǽιÇâ
+›1;783;1598;2;14!|
+›1;1583;1270;2;14!|
+›1;1343;1270;2;14!|
+›1;1050;1270;2;14!|
+›1;1565;1142;2;14!|
+›1;1309;1142;2;14!|
+›1;1333;833;2;14!|
+
+
+›462d›607`ʽ½½›12m›1076aÕ›14aËÄ›16aÁÆ¿ÊÅÃÏ
+›462d›1539`ÏÑÉÉ¿Î
+›607d›13m›607`k¨¬¥›19a[tmxsq|
+›693d›10m›607`¯¼¹›16aºÃÀÀÛ44a»›14a¹Â¼µÂ·¹Á¹Â›82a¹Æ¹›15aÁµ¸¹›16aÈÛ14m›46a_VlhXYpq›10m›14aµÈ›15a±ÒâÏä
+›693d›786`˽›301aÈÇ›15aË›14m›249aR
+›787d›15m›675`'›10m›23a{Ãȼ›12aĵ·›22a¹¸›12aµÂ¸›12aÉÂĵ·›22a¹¸›12aºÃ›177aÍ›11aÂÛ106a¼›12a¶›1a¹›12a¼¹À¸›13a½Â›11añÆÛ1aÃȹ¸ï
+›787d›898`¿›258a¿›117aÈ›12aìÀ¹Ç›12aÁµ›81aË›12a¹µ·
+›843d›721`ÃÆ›14añíµÈï›15a¸½Æ¹·ÈÃÆÍ›14aÇÈÆÉ·ÈÉƹÇâ
+›937d›15m›675`'›10m›504aÈÇ›15a˽ȼ›16aȼ¹›16a¯›18a³›16aÁµÌ½Á›233a¼µÆµ·È¹ÆÇá
+›937d›721`«ÆûƵÁ›14a·µÂ›17a¼µÂ¸À¹›16aºÃ›470aÉÁ›15aú›15aÑÔÕ›16a·
+›947d›1462`~
+›994d›721`˼½·›856aÈÇ
+›994d›811`¼›15aÄ›1a¹ÆÁ½ÈÇ›15aµ··¹ÇÇ›15aÈÛ15a®½ÀʽÛ14a§¹ÊÍÝÇ›15a¢Æ¹¹¿›15aºÃÂ
+›1087d›15m›675`'›10m›23a¯¼¹›17ai,/'›17aµÂ¸›17ai./,/'›16aÅɵÀ½ì¹ÆÇ›16aÄ›1a¹ÆÁ½È›17aÉǹƛ17aǹÀ¹·È½Ã›17aú›16a˼¹È¼¹Æ›17aȼ¹
+›1144d›721`ÄÆûƵÁÝÇ›13aÀû›15aìÀ¹›15aÞh380ß›14a½Ç›15aƹȵ½Â¹¸›14aµºÈ¹Æ›15aÄÆÛ1a·¹Çǽ»â
+›1238d›15m›675`'›10m›23a«ÆûƵÁ›16a·ÃÆƹ·ÈÀÍ›17a·ÃÁÄÉȹǛ18aȼ¹›18a½Áµ»½Â»›16aµÆ¹µ›17aú›18aÇȵ¸µÆ¸›17a~ÉÆÃÄ›1a¹µÂ
+›1294d›721`zÓ›15aĵě1a¹Æâ
+
+
+›462d›1921`Ð
+›607d›13m›615`ØÖÔ›2aÊÙÉØÏÔÓ
+›607d›449`Ý›70a¹Ó
+›704d›15m›746`É
+›710d›13m›449`¦¬¦›56altm}›11m›19aÙ›6aÝ›19aß›13m›301ay~{›19ahy~{oq›18a^uvq
+›710d›879`py›2aq|›18a¢u}t›19a¤
+›725d›11m›797`Õ
+›780d›15m›842`H
+›790d›14m›1542`}
+›796d›10m›632`Í›18aÄÆûƵÁ›37aú›18aȼ¹›19a¯›17a³›19aºµÁ½ÀÍ›17a½Ç›18aÆÉ›19aÞ¯›17a³á›18a§›5a¯›14m›151a¥›10m›9a¯›19a³ßá›18a½È
+›796d›449`²¼¹Â›19aµÂ›981a³›18aÃÆ›18a®›14m›18a¤
+›806d›10m›1041`~›368a~
+›810d›1588`~›185a~
+›853d›449`ÄÆÛ1a¸É·¹Ç›16aÈ›31aÛ14aÃÉÈÄÉÈ›15aìÀ¹Çâ›20aªÂ¹›16aú›15aȼ¹Ç¹›15a½Ç›14aȼ¹›12m›16aßâÜ›14aøßÚ›10m›118a¼›15aƹ·ÃƸǛ15aµÀÀ›14aȼ¹
+›853d›657`Ë›813aá›15a˼½·
+›903d›14m›703`}
+›909d›10m›449`ÃÉÈÄÉÈ›13aȼµÈ›11a§›5a¯›126aÈ›13aÈÛ11aȼ¹›13aȹÆÁ½ÂµÀ›11a޵¸›12aµ›12aÀÃÈ›12aÁÃƹ›12a¶›1a¹Ç½¸¹ÇÛßâ›19aªÂ›13aµ›12m›41a¿Ô
+›909d›10m›775`³›12aǹ›12m›963aÒ
+›923d›10m›749`~
+›959d›14m›833`}
+›965d›10m›640`ȵȽÛ12aú›12a§›5a¯›477aÍÄ›1a¹›13aéh,)2›100aË›42a¹Æá›12a½È›12a½Ç›13aȼ¹
+›965d›449`½ÁÄÀ¹Á¹Â›264a³á›12aȼ½Ç›13aìÀ¹›13a¼µÇ›12aȼ¹›13aìÀ¹›13aÈ›191aÝâ›18a£Ã›31a¹Ê
+›979d›879`~
+›1022d›730`¼›14a½Ç›14aú›14aÁÃÇÈ›14a½Â›447aȵ½ÂÇ›13aµÀÀ›13aȼ¹›15a½ÂÇÈÆɷȽÃÂÇ
+›1022d›449`Ãȼ¹Æ›14aìÀ¹›15a˼½·›282aȹƹÇÈ›13a¶›1a¹·µÉǹ›16aȼ½Ç›14a·ÃÂ
+›1078d›519`ÍÄ›1a¹Ç¹È›13aÍ›253aÈå›13aȼ½Ç›12aìÀ¹›13a½Ç›12a½Â›13aµ›12m›444aâåàÖç›10m›102a¼
+›1078d›449`ÈÛ12aÈ›161aÃÉÆ›12a¸Ã›1a·ÉÁ¹Â›12m›329aÂÚéÞØÚúÇáÙÚã›1aÚáÙÚáç›14aÄ›10m›128a˼½·
+›1129d›14m›880`}
+›1135d›10m›449`½Ç›18a·ÃÁÁÛ18aÈÛ14m›18a%5%18›10m›22a§›5a¯›18a³›18aǽȹ›18a½Â›18aȼ¹›19aË›405aÍÄ›1a¹›19aú›18aéh$5)Ýâ
+›1135d›1261`ÃÆÀ¸›17aµÂ¸›18a¼µÇ›19aµ›18aìÀ¹›18aÈ
+›1149d›926`~
+›1191d›764`ȹƵÀ›12aºÃÆÁµÈ›12aú›13ah$5)›12aìÀ¹Ç›13aµÆ¹›13a¹ÌÄÀµ½Â¹¸›13a˽ȼ½Â›13aȼ¹›13aÄÆûƵÁ
+›1191d›449`}¹Èµ½ÀÇ›12aú›13aȼ¹›13a½Â
+›1248d›14m›449`R›57aoi›1ad›10má›13a˼½·›465a¹›13aÁ¹È¼Ã›1a¸›12aºÃÆ›12aÄÆÛ1a·¹Çǽ»›13ah$5)›12aìÀ¹Çá›13a¶ÉÈ
+›1248d›14m›481`_Vl›10m›181a¼›12a¸¹Ç·Æ½¶›1a¹Ç›13aȼ¹›13a¸¹ì½ȽÊ
+›1304d›449`¹¹¸›15aÃÂÀÍ›14a·Ã·¹Æ›14aȼÃǹ›14a˼Û14aµÆ¹›13aËƽȽ»›13ah$5)›13aÄÆÛ1a·¹Çǽ»›14aÄÆûƵÁÇâ›18a}¹Èµ½ÀÇ
+›1361d›449`ú›11aÁÃÇÈ›11a¯›46aË›205aÊ›491aµÆ½ÃÉÇ›11a½ÇÇɹǛ11aú›12m›11aÐÑÅ×›1aâÖç›10má
+›1361d›655`³›27aµÆ¹›11aìÀ¹Ç›11a¼µ›22a¹›11aµÀÇÛ10a¶›1a¹¹Â›13aÄɶÀ½Ç¼¹¸›11a½Â›11aÊ
+›1371d›630`~
+›1417d›449`ȼ¹›16a¹ËÇÀ¹Èȹƛ14aú›15aȼ¹›15a¯›380aá›15aÓá›14aÔá›15aÕá›14aÖèâ
+›1417d›926`³›15a°Ç¹ÆÇÝ›15a¢ÆÃÉÄ›15açÒ
+›1427d›900`~
+›1532d›15m›880`É
+›1538d›13m›449`¦¬§›56ae{q¡uq¢uxs›11m›17aÙ›6aÝ›20aß›13m›18ad~}z~}
+›1553d›11m›931`Õ
+›1618d›14m›1128`}
+›1624d›10m›449`{¹ºÃƹ›14aÍ›359aø¹ÆÇ›14a§›5a¯›17a³›14a¼µÇ›14aËÆÃÉ»¼›121aÃÉá›13a½È›13a½Ç›14a¹·¹ÇǵÆÍ
+›1624d›613`ÃÉ›14a·µÂ›14aǹ¹›14a˼µÈ›13aË›499aÈ›13aºÃÆ›13aÍ
+›1638d›1174`~
+›1681d›449`ÈÛ21aÄÆÛ1a·¹ÇÇ›22aȼ½Ç›20ah$5)›507aÃÉ›21aǼÃÉÀ¸›21aÉǹ›14m›22aR›78a_R^›10m›21aÈÃ
+›1681d›887`ìÀ¹â›38azÇ›22aµ›20aìÆÇÈ›21aÇȵ»¹á›22aÍ›14m›335a_Vlh
+›1737d›10m›828`ȵȽÛ17aú›17aÍ›258aÈ›18aÛ17aµ›18a»ÆµÄ¼½·Ç›17aȹÆÁ½ÂµÀá›16aƵȼ¹Æ
+›1737d›449`ÄÆÛ1a¸É·¹›19aµ›17aƹÄƹǹ›213aÃÉÆ›17a¸Ã›1a·ÉÁ¹Â
+›1794d›593`µÇȹ›21aĵě1a¹Æ›21aɹ·¹ÇǵƽÀÍå›24aȼ¹›14m›21aR›78a_R^›10m›22a°Ç¹ÆÝÇ›20a¢É½¸¹›21aç×è›20aµÂ¸›22aȼ¹
+›1794d›449`ȼµÂ›21aË›14m›647a_Vlh
+›1844d›569`}
+›1850d›10m›449`ÀÛ1a·µÀ›15a§›5a¯›17a³›16a°Ç¹ÆÝÇ›14a¢É½¸¹›16açЛ250aË›14aÈÛ15aÉǹ›15aȼ½Ç›15aÄÆûƵÁâ
+›1850d›995`è›15a¸¹Ç·Æ½¶›1a¹›16a¼Ã
+›1864d›615`~
+›1965d›15m›904`É
+›1971d›13m›449`¦¬¨›56a[ywwu}}uxs›11m›18aÙ›6aÝ›19aß›13m›320amz›2aq{
+›1971d›1037`d~}z~}›19a}y›18ae
+›1986d›11m›955`Õ
+›2057d›10m›505`Ë›42a¹Æá›23aȼ¹›22aȽÁ¹›22a˽ÀÀ›21a·ÃÁ¹›22aÞÇÛ1aÃÂá›23aÍ›384aÃÉ›22aµÆ¹›22aƹµ¸Í›22aÈÃ
+›2057d›449`£Ã›31a¹Ê›652aÃÉ›22a¼ÃÄ›1a¹Ûß›42a˼¹Â›22aÍ
+›2113d›634`ÃÉÆ›13a¸Ã›1a·ÉÁ¹Â›270aË›12a½È›13a½Ç›12a¹·¹ÇǵÆÍ›13aÈÛ13aÄÆÛ1a·¹ÇÇ›13aȼ¹›13ah$5)›13aìÀ¹
+›2113d›449`·ÃÁÁ½È›12aÍ›254aÈ›13aÈÛ13aĵě1a¹Æå›14aÂÃ
+›2154d›15m›1823`I
+›2170d›10m›449`˽ȼ›16aȼ¹›16a·ÃÁÁµÂ¸›16a$5),.TW›15a˼½·›135aµÈ¹Ç›15aȼ¹›14m›48a_VlhXYpq›10m›15aÄÆûƵÁ›80aÃÆ
+›2170d›1114`¼›16aµ·È½Ê›14m›170aR›10m›386aâ›22a¡
+›2220d›14m›1499`}
+›2226d›10m›449`¹ÌµÁÄÀ¹á›14aÈÛ14aÄÆÛ1a·¹ÇÇ›14aȼ¹›14aìÀ¹›15aQQQh$5)á›12aƹÇÉÀȽ»›14aºÆÃÁ›13a§›5a¯›18a³½Â»›13aQQQh3%7›49aÃÉ
+›2226d›1847`á›13aÍ
+›2240d›1545`~
+›2283d›449`Ë›117aÍÄ›1a¹ä
+›2283d›481`ÃÉÀ¸›15aÈ
+›2358d›15m›614`J›288aK
+›2374d›12m›449`ºcbi»¶›10m›42a$5),.TWyQQQ
+›2465d›14m›481`_VlhXYpq›10m›19aƹµ¸Ç›20aȼ¹›20ah$5)›19aìÀ¹á›21a¸¹È¹ÆÁ½Â¹Ç›19a˼½·›281a¼µÆµ·È¹ÆÇ›19aú
+›2465d›14m›449`R›10m›941a¼›20a½Â¸½Ê½¸ÉµÀ›19a·
+›2521d›511`¼›13aºÃ›919aȵ½Â½Â»›12aȼ¹›13a¹·¹ÇǵÆÍ
+›2521d›449`¹µ·›98aÈ›12aµÆ¹›13aÉǹ¸›13aȼ¹Æ¹½Â›13aµÂ¸›13aËƽȹǛ12aµÂ›13aÃÉÈÄÉÈ›12aìÀ¹›13a·ÃÂ
+›2578d›793`ËÂÀõ¸›10aȼ¹›12aƵÇȹƛ11aĵÈȹÆÂÇ›11a·ÃÆƹÇÄ›1aø½Â»›11aÈÛ11a¹µ·›55a¼µÆµ·È¹Æ
+›2578d›449`½ÂÇÈÆɷȽÃÂÇ›11aÈÛ11a¸Ã›930a¼›12a·
+›2634d›486`ÈÛ12aȼ¹›13a§©ÏÒ›13aÄƽ›1001aÍÄ›1a¹Ç¹È
+›2634d›449`½Â›329aȹÆâ›18a¤È›13aȼ¹Â›13aµÄÄ›1a¹Â¸Ç›14aȼ¹›13a¹·¹ÇǵÆÍ›13a½ÂÇÈÆɷȽÃÂÇ›12aÈÛ12aÈ
+›2691d›449`Í›256aÈ›16aÉǽ»›15aȼ¹›15a¸Ã›220a¼µÆµ·È¹ÆÇâ
+›2691d›472`ÃÉÆ›15a¸Ã›1a·ÉÁ¹Â›277aËÂÀõ¸¹¸›15a·
+›2756d›14m›501`Ý
+›2767d›15m›1059`S
+›2772d›11m›752`´›12a²¥¦¥²³›11a­¯³´¬¹›11a´¯›11au›3a{›15a~Å›10a³©®£¥›11a´¨¡´›11a©³›11a´¨¥›11a°²¯§²¡­›11a­¯³´›11a£¯­­¯®¬¹›12aµ³¥¤
+›2772d›519`{¨©³›10a¤¯›1a£µ­¥®
+›2783d›1098`r
+›2818d›449`¡´›16a´¨¥›15a¡µ´¨¯²Â³›16a³©´¥È›16a¨¯›26a¥¶›148a¹›16a¢›1a¥›15a¡³³µ­¥¤›16a´¨¡´›16a´¨©³›15a©®£¬µ¤¥³›16a{›15m›154aW›11m›8a{›15a~›14a¡³
+›2818d›843`·›35a¥²Å›15a©´›15a­¡›600a~›15a¡®¤›16az›15m›16aV
+›2826d›11m›1636`r
+›2829d›1845`r
+›2863d›476`¥¬¬
+›2863d›449`·
+›2893d›14m›501`Þ
+›2909d›11m›519`{¨¥›16a£¯­­¡®¤›17a©³›15m›15afgh›13m›177aJ›11m›14a¢›1a¥£¡µ³¥Å›17a©¦›16a©´›15a·›170an~Ç|vz›15a£¯­­¡®¤›17a¬©®¥
+›2909d›13m›902`$3(1-*,G›11m›296a¥²¥Å›16a´¨¥›17a|
+›2955d›449`©®›290a¯µ¬¤›10a¢›1a¥›11aµ®¡¢¬¥›11a´¯›11a¤©³´©®§µ©³¨›11a¢›1a¥´›26a¥¥®›10a´¨©³›11a¡®¤›11a´¨¥›13m›130a$2›11m›8a£¯­­¡®¤
+›2955d›480`´¥²°²¥´¥²›11aÃputÄ›10a·›542a·›13m›273a$3(1-3
+›2984d›14m›501`ß
+›3000d›11m›789`´Å›14a´¨¥›13a°²¯­°´›14a¦²¯­›13a|›263a·®›13a¡³›15m›13ajdceki
+›3000d›11m›519`t®›13a´¨©³›12a¤¯›1a£µ­¥®›358an~Ç|vz›12a©³›13a³¨¯
+›3030d›14m›501`à
+›3046d›11m›663`¢›1a¯¬›14aË›13mY›11m›160a´³›14a­¡®¤¡´¯²¹›14a·¨©´¥³°¡£¥›13aﮥ›14a¯²›13a­¯²¥›13a³°¡£¥³›13a¯²›13a´¡¢³Ä
+›3046d›519`{¨¥›12a³¹­›96a›12a²¥°²¥³¥®
+›1;449;2727;2;598!|
+
+
+›462d›10m›607`Ñ›12m›1245aÒÇÐËÈÊíð
+›462d›1300`ï›45aÂËÇÊÅ›16aÉËÎÛ14aÓÇÐÆ›15aÂ
+›607d›10m›929`È›13aÃÉÈÄÉÈ›14aìÀ¹›14a¼µÇ›14aȼ¹›14aìÀ¹›14a¹ÌȹÂǽÛ14ah,.Wá›13aµÂ¸›14a·µÂ›15a¶›1a¹›14aÅɹɹ¸
+›607d›678`¯¼¹›14aƹÇÉÀȵÂ
+›664d›607`ºÃÆ›19aÄƽ›204aÍ›19a§©ÏÒ›19aÀµÇ¹Æ›19aÄƽ›232aÍ›20aÂÃÆÁµÀ›12m›47a¿ÔõÒÉÏ›10m›23a·ÃÁð
+›664d›761`Ƚ»›19aÈÛ19aµÂ›360aȹƛ19aÅɹɹ›20a¶›12m›201aÒ
+›720d›10m›839`Ë›42a¹Æá›19a¶›1a¹·µÉǹ›21a½È›19a·Ã›200aÍ›19aÞÀûߛ18a¹Ç·µÄ›1a¹›21aǹÅɹ·¹Çá›21aµÂ¸
+›720d›607`ÁµÂ¸Çâ›34a£Ã›31a¹Ê›359aȵ½ÂÇ›19aÁµÂ
+›777d›607`µÀÇÛ16aȵ¿›347aȹƛ16aºÃÆÁµÈȽ»á›14a½È›16aÁ›219aȹ¸›16a˽ȼ›16aµ›16a›61a¶›1a¹Æ
+›777d›764`¹Ç›15a·µÆ¹›17aú›16aµÀÀ›15aÄƽ›395aÉÇÈ›16a¶›1a¹›17aÄƽ›246aÉÁ
+›833d›1233`È›15a·ÃÁÁµÂ¸â›22a¯¼¹›16aºÉÀÀ›16a¸¹Èµ½ÀÇ›15aÞºÃÆ›15aȼÃǹ›16a˼Ã
+›833d›607`ú›16aÇÄ›1a¹·½µÀ›16aÅɵÀ½ì¹ÆÇ›15aºÃÆ›15aȼ¹›17aÄƽÂ
+›889d›1428`¹Â›17a½Â›18azÄÄ›1a¹Â¸½Ì›20azâ›28a¯¼¹›19ah,.W›17aìÀ¹
+›889d›607`˽Ǽ›18aÈÛ18aǹț17aÉÄ›19a¹˛19aÀµÇ¹Æ›17aÅɹɹÇß›19aµÆ¹›18a»½Ê
+›946d›1238`¼›18aµÆ¹›18aÄ›1a¹·ÉÀ½µÆ›18aÈÛ18aȼ¹›18a§©ÏÒá›18aµÂ¸›18a˽ÀÀ›17a·µÉǹ
+›946d›607`½Ç›18aºÉÀÀ›17aú›18a¹Ç·µÄ›1a¹›19aǹÅɹ·¹Ç›19a˼½·
+›1002d›836`Ê›358aÍ›17aÃȼ¹Æ›18aºÃÆÁ›17aú›17aÄƽ›357a¹›18a·µÆ¹
+›1002d›607`µ¶ÇÃÀÉȹ›17a¼µ›22aÛ1a·›18a½º›17aĵÇǹ¸›18aÈÛ18aµÂ›406aȹÆå›19aȼ¹Æ¹ºÃƹá›17aȵ¿
+›1059d›1062`Ƚ»›13aÈÛ13aµÂ›14aÃƸ½ÂµÆÍ›13aÀ½Â¹›13aÄƽ›171a¹Â›14a380%½Â»›13a½È›13aÈÃ
+›1059d›607`ÂÃÈ›14aÈÛ13aÅɹɹ›15a½È›13aºÃÆ›13aÄƽ›553aȹƛ14aó›13a¹Ê
+›1115d›607`µ›15a±}°›15a½Ç›14m›15a-.3›10m›19aƹ·ÃÁÁ¹Â¸¹¸Û
+›1245d›12m›868`©~¤|›16a©}z›10m›17ah,.W›12m›17ae~¢z
+›1245d›607`°¹²¹°›52am§~¤
+›1334d›10m›636`Û16aǽÁÄÀ½ºÍ›15aȼ¹›16aȵǿ›15aú›16aÅɹɹ½Â»›16aȼ¹›16ah,.W›240aȽ»á›15m›15a*›14m2)3%-!,%›15m›2a+›10m›16aÄÆÃð
+›1334d›607`¯›819aìÀ¹›16aºÃÆ›16aÄƽÂ
+›1374d›15m›1849`L
+›1390d›10m›607`ʽ¸¹Ç›18aȼ¹›18a3%701).3›17a·ÃÁÁµÂ¸å›18aȼ½Ç›17a½Ç›18aµ·ÈɵÀÀÍ›16aµ›12m›18aÂÁÈ›10m›97a¶›1aÃÀ›37a˼½·›101aÍ
+›1390d›1708`ÇÍÁ›188a¼›17aÁµ
+›1447d›607`¶›1a¹›14aµ¶¶Æ¹Ê½µÈ¹¸›13aÈÛ12a½ÈÇ›12aìÆÇÈ›13aºÃÉÆ›13aÀ¹ÈȹÆÇá›12a3%70â›19a²¼¹Â›13a¹Ì¹·Éȹ¸›14aµÇ›13aµ›12m›13aÂÁÈ›10m›13a·ÃÁð
+›1503d›607`ÁµÂ¸á›17a½È›15a½Â›22aÿ›602a¼›16aÅɹɹǛ18aÍ›306aȽ»
+›1503d›831`Ê›45a¹Ç›15aµ›17a·ÃÁÁµÂ¸›16aÄÆÛ1a·¹¸Éƹ›17a˼½·›213aÃÉÆ›15aìÀ¹›17aºÃÆ›16aÄƽÂ
+›1560d›1197`ȹÆâ
+›1560d›607`Û15aȼ¹›16aµÄÄÆÃÄƽµÈ¹›14a§©ÏÒ›15aÄƽÂ
+›1652d›12m›1299`k¥©z
+›1731d›10m›721`¨ÃÇÈ›24aú›24aȼ¹›25aÂÃÆÁµÀ›23a01).3›24a·ÃÁÁµÂ¸›25aÅɵÀ½ì¹ÆÇ›24aÞ›14m›19a'›10m›28ai$%,%3%á
+›1731d›14m›1740`%
+›1787d›10m›721`i#/0)%2l›14m-›10má›14m›13a%3#›10m›95aÍ›15a¶›1a¹›16aÉǹ¸›16a˽ȼ›14aȼ¹›15a3%701).3›14a·ÃÁÁµÂ¸â
+›1787d›1025`ß›14aÁµ
+›1866d›721`¡›392aÈ›20aQQQh,.W›561aȽ»
+›1866d›747`ÃÆ›19a¹ÌµÁÄÀ¹á›20aÈÛ19aÄƽ›205aá›19a¸¹À¹È½Â»›19aȼ¹›20aìÀ¹›20aµºÈ¹Æ›19aÄƽÂ
+›1922d›721`ȼƹ¹›14a·ÃĽ¹Çá›14aµÂ¸›15aǹ¸½Â»›15aÍ›647aÍÄ›1a¹ä
+›1922d›1257`ÃÉ›14aµ›14aÁ¹Çǵ»¹›14aÉÄ›1aÛ15a·ÃÁÄÀ¹È½ÃÂá›13aÈ
+›2023d›12m›721`ºcbi»¶›10m›811alW
+›2023d›908`3%701).3i./3)&8›22aQQQi$%,%3%i#/0)%2
+›2176d›13m›1294`ĹØÔº¼Üß
+›2176d›607`Þ›69a´ÔÏÓÍ›24aÒÔÖË›23aÚÏØΛ23a´
+›2281d›10m›607`¯¼¹›18a$5),.TW›17a·ÃÁÁµÂ¸›18aÂÃÆÁµÀÀÍ›17aÄÆÛ1a·¹ÇǹǛ18aȼ¹›18a˼ÃÀ¹›18aú›17aȼ¹›18ah$5)›17aìÀ¹›18aµÂ¸
+›2337d›1140`ȹÀÀ½»½›550a¹Ç›11aȼ¹›12aÇȵ¸µÆ¸
+›2337d›607`ÈƵÂÇÀµÈ¹Ç›10a½È›11aµÀÀ›11aÈÛ11aµ›11aºÃÆÁ›11a½Â›111a¶À¹›10aÈÛ11aȼ¹›12a§©ÏÒâ›18a¤È›12aµÀÇÛ10aÁµ¿
+›2387d›14m›619`}
+›2393d›10m›607`§›5a¯›18a³›13aµÇÇÉÁÄȽÃÂÇá›12aȼµÈ›12a½Çá›13aȼµÈ›12aȼ¹›13aȹÌÈÝÇ›12m›287aç›10m›13a½Ç›13aÀÛ1a·µÈ¹¸›12a¹Ìµ·ÈÀÍ
+›2393d›12m›1455`åÚÛÚåÚáØÚ›14aã›1aâÞá
+›2407d›10m›665`~
+›2450d›753`¼›22a¸Ã›318a¼›21aµ·ÆÃÇÇ›20aºÆÃÁ›21aȼ¹›21aÈÃÄ›21aÀ¹ºÈð¼µÂ¸›21a·Ãƹƛ21aú›20aȼ¹
+›2450d›607`ù›21a½Â·›93aË›20aµÂ¸›22aù›21a½Â·
+›2506d›808`Ë›42a¹Æá›13aÅɵÀ½ì¹ÆÇ›13aÈÛ14aȼ¹›14a$5),.TW›592aÈÆÃÀ
+›2506d›607`ĵě1a¹Æâ›20a£Ã›31a¹Ê›568a·ÃÁÁµÂ¸›14aÄ›1a¹ÆÁ½È›14a¹ÌÄÀ½·½È›13a·ÃÂ
+›2563d›629`Ê›141a¼›14aĵ»¹›14aǼµÀÀ›14a¶›1a¹›15aÄƽ›316aË›14aÁµÂ›122a˽»›12aĵ»¹Ç›14aµÆ¹›14aÈÃ
+›2563d›607`Û22a¹Æ›14a˼½·›390aȹ¸›14aìÆÇÈá›14aµÂ¸›14a¼Ã›131aÍ›14aºÃÀÀÃ
+›2619d›751`ȹ¸â›26a¤È›17aµÀÇÛ16aµÀÀÛ493aÈ›16aƹº¹Æ¹Â·¹›18aÄ›1aý›180a¹Â
+›2619d›607`¶›1a¹›18aÄƽ›316aËÇ›15aǹÀ¹·È½Ã›17aú›17aµ›17a¸½ë¹Æ¹Â›312aÈá›17aµÂ¸›17a¹Ê
+›2676d›607`Ä›1a¹ÆÁ½ÈÇ›13aȼ¹›13aĵě1a¹Æ›14aÈÛ12a¶›1a¹›14añÈÉƹ¸›13aÛ13a½ÈÇ›12aǽ¸¹ïá›13a½Â›433aȵȽÃÂâ
+›2676d›1537`ÈÛ12aȼ¹›13aÀµÂ¸Ç·µÄ›1a¹›14aÃƽ¹Â
+›2734d›859`˽»›17aǹ·È½ÃÂÇ›17aµÂ¸›19azÄÄ›1a¹Â¸½Ì›20a{›18a»½Ê›384a¼›18aú›18aȼ¹
+›2734d›678`¯¼¹›18aºÃÀÀÛ695a¹›18aºÉÀÀ›18a¸¹Èµ½ÀÇ›17aú›18a¹µ·
+›2790d›607`ÅɵÀ½ì¹ÆÇ›14a˼½·›324aÍ›15aȼ¹›14a$5),.TW›14a·ÃÁÁµÂ¸å›14aȼ¹Ç¹›15aÅɵÀ½ì¹ÆÇ›14aµÆ¹
+›2790d›890`¼›15aµÆ¹›14aµ··¹Äȹ¸›15a¶
+›2847d›748`ËÇä
+›2847d›607`µÇ›15aºÃÀÀÃ
+›2961d›15m›675`'›10m›23ai23!13).'t0!'%
+›3030d›14m›659`á
+›3046d›11m›698`¯²›13a¦µ²´¨¥²›13a©®¦¯²­¡´©¯®›13a²¥§¡²¤©®§›14m›14aÃÂÄ›11m›79a¢›1a¯¬³Å›13a³¥¥›14aÉÀ›39a¨¡°´¥²›14a½Ê
+›3046d›676`s›646a³¹­›182aÅ›13a£
+›1;607;3001;2;598!|
+
+
+›462d›12m›633`çåâßßÞáÜ›13aêÝÞØ›69aÖÜÚæ›14a›299açæ›10m›501aÒ
+›462d›12m›449`ïôî›45aÁâá›248aÝ›15aÌ›131aÒÇçâÈÊíð›15aÌåÞá
+›607d›15m›518`'›10m›22ai.4-"%1t/&t0!'%2
+›702d›15m›518`'›10m›22ai3/0t-!1').
+›796d›15m›518`'›10m›22ai,%&3t-!1').
+›891d›15m›518`'›10m›22ai/1)%.3!3)/.
+›986d›15m›518`'›10m›22aic./d,/'
+›1080d›15m›518`'›10m›22aic./d5%1"/2%
+›1175d›15m›518`'›10m›22ai/43043
+›1270d›15m›518`'›10m›22ai(&499
+›1364d›15m›518`'›10m›22ai5&499
+›1459d›15m›518`'›10m›22ai$%5)#%t380%
+›1554d›15m›518`'›10m›22ai01).3t-/$%
+›1648d›15m›518`'›10m›477at.4-"%12
+›1648d›563`ic./d$40,%7t"8t0!'%
+›1743d›15m›518`'›10m›22ai&%%$t31!8
+›1838d›15m›518`'›10m›22ai0!0%1t2)9%
+›1932d›15m›518`'›10m›477a/18
+›1932d›563`ic./d0+t&/.3t$)1%#3
+›2027d›15m›518`'›10m›477a3/18
+›2027d›563`ic./d07,t&/.3t$)1%#
+›2122d›15m›518`'›10m›22ai3&-t$)1%#3/18
+›2216d›15m›518`'›10m›477a/18
+›2216d›563`ic./d5)134!,t$)1%#3
+›2324d›520`Þ¯¼¹›15aÀµÇÈ›14aºÃÉÆ›15aÅɵÀ½ì¹ÆÇ›15aµÆ¹›14m›14a$%:-)3%+8›10m›19aºÃÆ›14aÇÍÇȹÁ›15a˽εƸǛ14aÃÂÀÍÛß
+›2447d›13m›674`}{yvvuxs›18a¢tuo›85amsq|›19a\›370a}|
+›2447d›449`§¬¦›56a[yx›306at›20ae›161ak`}yac¥¨›19ae{ux
+›2533d›10m›652`á›14m›49a_VlhXYpq›10m›16aÈƵÂÇÀµÈ¹Ç›15aµÀÀ›16aȼ¹›17aĵ»¹Ç›17a½Â›17aȼ¹›17ah$5)›129aÈÛ16aµ›17aºÃÆÁ
+›2533d›449`ªÆ¸½ÂµÆ½ÀÍ›14m›26aR›10m›928aìÀ¹›17a½Â
+›2589d›539`¼›18a·µÂ›17a¶›1a¹›18aÄƽ›103aÍ›18aȼ¹›17a§©ÏÒ›17aÄƽ›133aË›42a¹Æá›16a½º›17aÍ›189aʽ»›17a¸½ºð
+›2589d›449`˼½·›271aȹ¸›17a¶›326aȹÆå›18a¼Ã›31a¹Ê›133aÃÉ›17aµÆ¹›17a¼µ
+›2630d›15m›1071`M
+›2646d›10m›449`ì·ÉÀÈ›333aÈ›18aµ›18aì»Éƹ›743aÈá›19a½È›18a½Ç
+›2646d›549`Í›19a½Â›18a»¹ÈȽ»›17aƽ»¼›225aÛ19aĵ»¹›18aÑÒ›18aú›18aµ›18aÑÏÏðĵ»¹›18a¸Ã›1a·ÉÁ¹Â
+›2702d›449`Ƶȼ¹Æ›17aË›408a¹¹Ä›17aÛ17aÄƽ›608aȽÃÂ
+›2702d›620`µÇȹºÉÀ›15aú›17aĵě1a¹Æ›17aÈÛ16a¿›226aȽ»›16aµÀÀ›16aÑÏÏ›16aĵ»¹Ç›16aÞÂÃÈ›16aÈÛ16aÁ¹Â
+›2759d›449`ȼ¹›12aȽÁ¹›11aȵ¿›88aµ½È½Â»›10aºÃÆ›11aȼ¹›11aÃÉÈÄÉÈÛß›19a¯¼¹Æ¹ºÃƹ›14m›43a_VlhXYpq›10m›82aËÇ›10aȼ¹›12aÉǹÆ
+›2759d›688`¹Â›12aË›14m›650aR›10m›195aµÀÀÃ
+›2815d›743`¼›14aĵ»¹›14aǼµÀÀ›13a¶›1a¹›14aÉǹ¸›15aµÇ›13aȼ¹›15aÇȵÆȽ»›12aÄ›1aý›179aȹ¸›13aÃÉÈÄÉÈå
+›2815d›449`ÈÛ14aÇÄ›1a¹·½ºÍ›14a˼½·›797aÈ›13aºÃÆ›14aÄƽÂ
+›2872d›1049`ÈÆÃÀ›14a¼Ã›132aÍ›14aĵ»¹Ç›15aµÆ¹›15aÈÛ15a¶›1a¹›16aÄÆÛ1a·¹Çǹ¸â
+›2872d›449`½È›15aµÀÇÛ14aÄ›1a¹ÆÁ½ÈÇ›15aȼ¹›15aÉǹƛ15aÈÛ15a·Ã›132aË›15aÁµÂ
+›2939d›14m›501`â
+›2955d›11m›519`n¬´¨¯µ§¨›12aù›67aüùû›746a¯µ²›12a¯µ´°µ´Å›13a©´›11a³¯­¥Ñ
+›2955d›714`üúþý›88a©³›11a´¨¥›12a²¥£¯­­¥®¤¥¤›13a­¥´¨¯›1a¤›13a¯¦›11a°²¥¶©¥·©®§›12a¹
+›3000d›449`´©­¥³›13a¨¡°°›1a¥®³›14a´¨¡´›13a©´›12a£¡®®¯´›14a°²¯›214a´›13a¤¥´¡©¬›12a·¨¥®›13a°›1a¥²¦¯²­©®§›14a´¨©³›12a³¯²´›13a¯¦›12a°²¯›1a¯¦Ñ
+›3000d›1003`¶©¤¥›13a³µÏ£©¥®
+›3046d›449`²¥¡¤©®§›14a¯°›1a¥²¡´©¯®
+›1;449;2910;2;598!|
+›1;2064;1766;72;8!|
+›1;2064;1009;71;8!|
+
+
+›462d›10m›607`Ó›12m›1245aÒÇÐËÈÊíð
+›462d›1300`ï›45aÂËÇÊÅ›16aÉËÎÛ14aÓÇÐÆ›15aÂ
+›607d›10m›790`µÀɹ›14aÛ13aȼ¹›14ai23!13).'t0!'%l›11aÅɵÀ½ì¹Æ›13a½Ç›13aÉǹ¸›14aÈÛ12aÇÄ›1a¹·½ºÍ›14aȼ¹›14aÇȵÆÈð
+›607d›678`¯¼¹›13aÊ
+›664d›819`ÉÁ›294a¹Â›17aµÇ›18aµ›14m›17a231)-'›10m›22aµÂ¸›18aȵ¿›312aµÀɹ›18aéeÝâ
+›664d›607`½Â»›18aĵ»¹›18a›61a¶›1a¹Æå›19aȼ½Ç›17a½Ç›18a»½Ê›451a¹Ç›17aȼ¹›18a¸¹ºµÉÀÈ›18aÊ
+›714d›14m›1303`}
+›720d›10m›885`µÀɹ›15a˽ÀÀ›14aÁµÈ·›86aÍ›15a§›5a¯›18a³›15aĵ»¹›15a›61a¶›1a¹Æ›16aµÂ¸›15aÇÛ15a˽ÀÀ›14aÂÃÆÁµÀÀÍ
+›720d›607`¯¼½Ç›15a¸¹ºµÉÀÈ›15aÊ›277a¼›15aµÂ›301aÉÁ
+›734d›1349`~
+›777d›607`ÇȵÆÈ›14a˽ȼ›15aȼ¹›16aìÆÇÈ›15aĵ»¹›15a½Â›15aÍ›256aÈá›16a˼µÈ¹Ê›139aÉÁ›153aË›42a¹Æá
+›777d›1175`ÃÉÆ›15a¸Ã›1a·ÉÁ¹Â›188a¹Æ›14a½ÈÇ›15a›61a¶›1a¹Æâ›21a£Ã›31a¹Ê
+›833d›607`½º›20aÍ›131aʽ¸¹›20aµ›20aǽ»À¹›19a›61a¶›1a¹Æá›14m›53a_VlhXYpq›10m›208a¼›19aȼ½Ç›20a˽ȼ›19aȼ¹›14m›20a:123
+›833d›10m›677`ÃÉ›19aÄÆÛ299aÉÁ›14m›97aR›10m›203a˽ÀÀ›19aÁµÈ·
+›889d›607`Û1a··ÉÆƹ·¹›21aú›19aµ›19aĵ»¹›20a˽ȼ›18aȼµÈ›19a›61a¶›1a¹Æâ›34a¯¼½Ç›19aÁ¹µÂÇ›19aȼµÈ›19a½º›19aȼ¹›20aĵ»¹Ç›19aú
+›889d›1281`ÉÁ
+›946d›783`È›19a-8t&),%›18aµÆ¹›18a›61a¶›1a¹Æ¹¸›19aÞÏßá›18aÞ½ßá›18aÞ½½ßá›18aÞ½½½ßá›17aÞÐßá›18aÞÑßá›18aÞÒßá›13m›18aö›8aö›8aö›10m›5aá›19aǵ›19aá
+›946d›607`¸Ã›1a·ÉÁ¹Â›325aÉÁ›897aÍ
+›1002d›607`ȼ¹Â›12aǹÀ¹·È½Â»›10ai23!13).'t0!'%lV›689a¼µÂ½ÇÁ
+›1002d›1280`˽ÀÀ›10aǹÀ¹·È›11aĵ»¹›11aÞ½½ßå›11aȼ¹Æ¹›11a½Ç›11aÂÛ11aÁ¹·
+›1059d›607`ÈÛ16aǹÀ¹·È›16aĵ»¹›17aÞÑß›16a½ÂÇȹµ¸â›23aÞ©Ãȹ›16aȼµÈ›14m›33a!6›10m›22a¯›17a³›17aË›148aÊ›225aµÀɹÇ
+›1059d›14m›1379`1›10m›206aÃÉÀ¸›16a¼µ›22a¹›16a¼µ¸›17aȼ¹›16aÊ
+›1069d›1496`~
+›1115d›607`Ïá›15aðÐá›16aðÑá›15aðÒá›16aÐá›15aÑ›15aµÂ¸›16aÒ›16aºÃÆ›15aȼ¹›16aµ¶›1aÛ22a¹›15aĵ»¹›16a›61a¶›1a¹ÆÇá›15aµÂ¸›16aȼ¹Æ¹ºÃƹ›16aĵ»¹›15aÞÑß
+›1115d›1295`Ê›165aÉÁ
+›1172d›14m›626`.4+$›10m›25a¶›1a¹›20aǹÀ¹·È¹¸›20a¸½Æ¹·ÈÀÍå›21aÈÛ19aµ··ÃÁÁÛ1a¸µÈ¹›19aÇÉ·›68aÉÁ›181a¼¹Á¹Çá›20aȼ¹
+›1172d›14m›607`#›10m›943a¼›20a›61a¶›1a¹Æ½Â»›20aÇ·
+›1228d›607`i23!13).'t0!'%›493a¹›15a›61a¶›1a¹ÆÇâß
+›1228d›956`ÅɵÀ½ì¹Æ›15aµ··¹ÄÈÇ›15a¹»µÈ½Ê›58aÉÁ
+›1286d›678`Þ¤º›17aÍ›83a¹›17a¶›1a¹¹Â›18a·À¹Ê›291aË›16a¯›18a³ÝÇ›17au<HNGMU›13mö›8aö›7aö›10m›5a]›17aÈÛ17a»¹È›17añºµÂ·Íï
+›1286d›766`ÃÉÝÊ›221a¹Æ›17aµÂ¸›18aÉǹ¸›18aƵ
+›1296d›1438`~
+›1343d›607`ĵ»¹›16a›61a¶›1a¹ÆÇá›16aȼ¹Â›16aÍ›558aÉÁ›340aÍ›16aÄ›1a¹ð
+›1343d›738`ÉÁ›237aÃÉ›16a·µÂ›16aÇÄ›1a¹·½ºÍ›16aȼ¹Ç¹›17a¹ÌÈƵ›15a›61a¶›1a¹ÆÇá›16aǹĵƵȹ¸›16a¶
+›1399d›607`ƽÛ1a¸Ç›18aÞéâÝß›26aÈÛ18aȼ¹›18ai23!13).'t0!'%l›16aÅɵÀ½ì¹Æå›18a½È›17a½Ç›18aºÃÆ›17aȼ½Ç›18aƹµÇÛ17aȼµÈ›17aȼ¹
+›1456d›832`µÀɹ›12aÁ›595a¼µÆµ·È¹ÆÇá›12aµÂ¸›13aÂÃÈ›12aµÇ›12aµ›12aǽÁð
+›1456d›607`ÅɵÀ½ì¹ÆÝÇ›12aÊ›127aÉÇÈ›12a¶›1a¹›14aÇÄ›1a¹·½ì¹¸›13aµÇ›12aµ›12aÇÈƽ»›12aú›12a·
+›1512d›708`ÉÁ¹Æ½·µÀ›17aÊ›178aÉÇ›426aehU]›48aÃÉÀ¸›18aǹÀ¹·È›18aȼ¹›19aìÆÇÈ
+›1512d›607`ÄÀ¹›19a›207aµÀɹâ›30a¯¼›61ai23!13).'t0!'%lWh›111aË
+›1569d›607`ĵ»¹›18a˼¹Æ¹›19a¯›18a³ÝÇ›18au<HNGMT›17a½Ç›18aÒ›18aµÂ¸›19au<HNGMV›500aµÀɹ
+›1569d›1537`½Ç›18aÐØá›19aÂÛ18aÁµÈȹƛ17a˼µÈ›18aÊ
+›1579d›876`~
+›1625d›639`µÇ›15a½Â›15au<HNGMUâß
+›1625d›607`Ë
+›1684d›678`¯¼¹›24a›61a¶›1a¹Æ›24aú›24aĵ»¹Ç›24aÈÛ23a¶›1a¹›25aÄƽ›505aµÀɹ›24aÈÛ23aȼ¹
+›1684d›804`ÉÁ›496aȹ¸›23a½Ç›24aÇÄ›1a¹·½ì¹¸›25aµÇ›24aȼ¹›24aÊ
+›1740d›607`i.4-"%1t/&t0!'%2l›15aÅɵÀ½ì¹Æå›18aȼ½Ç›14m›17a)2›10m›85aÉÁ¹Æ½·µÀ›17aÊ›264a¹Ç›16aȼ¹›18a¸¹ð
+›1740d›1367`µ›17a›207aµÀɹá›18aµÂ¸›18aȵ¿
+›1796d›732`µÀɹ›12aUTTTTTTT›11aó›11a¼ÃÄ›1a¹ºÉÀÀÍ›12aȼ½Ç›11a˽ÀÀ›11a¹ÂÇÉƹ›12aȼµÈ›11aÍ›378aÈ
+›1796d›607`ºµÉÀÈ›11aÊ›969aÃÉÆ›12a˼ÃÀ¹›11a¸Ã›1a·ÉÁ¹Â
+›1853d›735`ȹ¸Û›27a¯¼¹Æ¹ºÃƹ›18aÈÛ16a¹ÂÇÉƹ›19aȼµÈ›17aȼ¹›17aĵ»¹›18aÞÑß›16aú›17aȼ¹›18a¹µÆÀ½¹Æ›17a¹ÌµÁÄÀ¹›17a½Ç
+›1853d›607`½Ç›17aÄƽÂ
+›1909d›687`ȹ¸á›15aÍ›94aÃÉÀ¸›14a¹¹¸›16aÈÛ15a½ÇÇɹ›15aȼ¹›15a$5),.TW›14a·ÃÁÁµÂ¸›15aµÇ
+›1909d›607`Äƽ›113aÃÉ›15aË
+›2011d›12m›607`ºcbi»¶›10m›22a$5),.TW›23a-8t&),%›23ai23!13).'t0!'%lV›22ai.4-"%1t/&t0!'%2lX
+›2112d›649`ÉÇ›17a»¹ÈȽ»›16aĵ»¹Ç›17aÞ½½ßá›16aÞ½½½ßá›16aÞÐß›16aµÂ¸›17aÞÑßâ›25azÇ›18a˽ȼ›16aµÀÀ›12m›16aÂÁÈ›10m›17a·ÃÁÁµÂ¸Ç›17aµÂ¸
+›2112d›607`ȼ
+›2168d›992`Í›15a¶›1a¹›16aµ¶¶Æ¹Ê½µÈ¹¸›16aÈÛ15aȼ¹›17aÁ½Â½Á›217a¹›15aȼ¹Á›16aɵÁð
+›2168d›607`ÅɵÀ½ì¹ÆÇá›15aȼ¹Ç¹›17aÁµ›612aÉÁ›15aÈÛ15aÁµ¿
+›2225d›1127`Ê›500aÊ›185aȹƹ¸›16aµÇ
+›2225d›607`¶½»ÉÃÉÇå›15aȼ¹Æ¹ºÃƹ›15aȼ¹›15aµ¶›1aÛ22a¹›15a·ÃÁÁµÂ¸›15a·ÃÉÀ¸›15aµÀÇÛ14a¼µ›22a¹›15a¶›1a¹¹Â›16a¹Â
+›2326d›12m›607`ºcbi»¶›10m›22a$5),›24a-8t&),%i2lVi.lX
+›2501d›13m›832`}{yvvuxs›18a}tq›18aZzz›2aqm{mxoq›19ayr›19a}tq›18ae{ux›131amsq
+›2501d›607`§¬§›56a[yx›870a}qp›18ae
+›2585d›14m›693`}
+›2591d›10m›607`zÀÀ›14a§›5a¯›238aÍ›385a¼›16aµÇ›14auH==LB=>F:K@BG›13aµÆ¹›14aÁ¹µÇÉƹ¸
+›2591d›765`³ÝÇ›14aĵ»¹›15aÀµ›22aÃÉÈ›13a¸½Á¹ÂǽÃÂÇá›14aÇÉ·
+›2605d›739`~
+›2641d›14m›1676`}
+›2647d›10m›607`ºÆÃÁ›16aµ›15aÇȵ¸µÆ¸›12m›294aç›10m›1aå›16aì»Éƹ›16aЛ16aǼÛ112aË›16a§›5a¯›103aÍÇ›15aÃÉÈ›16aµ›16aĵ»¹
+›2647d›12m›945`åÚÛÚåÚáØÚ›17aã›1aâÞá›10m›278aËÇ›15a¼Ã›132a³›16aÀµ
+›2661d›1722`~
+›2704d›607`ºÃÆ›15aȼ¹›15a:KMB<E>›49aÍÀ¹›15aÉǽ»›14aÐÏðÄ›1aý›49aÍÄ›1a¹â
+›2704d›937`ÇÈ›336aÈ›15aÈ
+›2762d›704`ÃÆ›21aÇÄ›1a¹·½µÀ›22a¹ë¹·ÈÇá›23aÍ›129aÍ›21a츛23a½È›22aÉǹºÉÀ›22aÈÛ21a¶›1a¹›23aµ¶À¹›22aÈÛ21aƹ¸¹ì¹›23aȼ¹
+›2762d›678`¡›395aÃÉ›22aÁµ
+›2818d›607`Ä›1aÃǽȽÛ15aú›16aȼ½Ç›16aƹº¹Æ¹Â·¹›16aÄ›1aý›232aȽ»å›16aȼ¹›16aÅɵÀ½ì¹ÆÇ›15ai,%&3t-!1').
+›2818d›1201`È›16a˼¹Â›16aÄƽÂ
+›2875d›607`µÂ¸›16ai3/0t-!1').›13a½ÁÄÀ¹Á¹Â›139a¼µÂ»¹â
+›2875d›1164`È›15aȼ½Ç›14a·
+›2933d›984`ÈÇ›24a¹¹¸›25aÇÃð·µÀÀ¹¸›12m›24aßÖáÙæØÖã›1aÚ›25aâåÞÚá›93aá›10m›23aºÃÆ›23aȼ¹›24aĵě1a¹Æá
+›2933d›678`®ÃÁ¹›24a¸Ã›1a·ÉÁ¹Â›12m›684açÖçÞâ
+›2990d›10m›607`˼¹Æ¹›13aȼ¹›13aÄƽ›1170aÍð
+›2990d›892`ȹ¸›13aĵ»¹›13a½Ç›12a˽¸¹Æ›13aȼµÂ›13a½È›12a½Ç›13a¼½»¼â›19azÇÇÉÁ½Â»›12aȼµÈ›12aȼ¹›14aĵ»¹›12aÀµ
+›3046d›607`ÃÉÈ›12aĵƵÁ¹È¹ÆÇ›12a¼µ›22a¹›12a¶›1a¹¹Â›14aÇɽȵ¶ÀÍ›12aƹ¸¹ì¹¸á›14aȼ¹›396a$2#!0%
+›3046d›965`Ê›588ai/1)%.3!3)/.l,!.
+
+
+›462d›12m›633`çåâßßÞáÜ›13açÝÚ›15a¿ãã›1aÚÖåÖáØÚ›16aâÛ›15açÝÚ›15aÌåÞá›107aÖÜÚ›10m›411aÔ
+›462d›12m›449`ïôï›45aÁâá›702açÚÙ›15aÌ
+›824d›13m›892`ý
+›857d›902`H›19a>@
+›919d›14m›569`ÕÖ×æ›9aÔ›39aÛ
+›919d›652`ÚØÙ
+›932d›13m›892`þ
+›940d›15m›699`Ç
+›969d›13m›1151`I
+›973d›1130`ý›301aJ
+›988d›1130`þ›280aþ
+›1042d›1203`K
+›1054d›1182`ý›228aý
+›1065d›1182`þ
+›1104d›570`H›19a>@
+›1106d›975`ý
+›1125d›560`û›65aü
+›1166d›985`L
+›1229d›1589`N
+›1249d›1514`ü›23aû
+›1270d›767`H
+›1291d›710`û›46aü
+›1374d›1608`O
+›1394d›1580`û›102aü
+›1997d›1197`M
+›2017d›841`û›631aü
+›2161d›975`þ›186aþ
+›2204d›1182`P
+›2264d›1203`ý
+›2496d›10m›594`U›24auH==LB=>F:K@BG›22al›24aZWIM›82aZ›24auM>QMPB=MA›22al›24aWXYIM
+›2552d›594`V›24auMHIF:K@BG›23al›23aV[IM›178a[›24auF:K@BGI:KL>I›22al›24aUUIM
+›2609d›594`W›24auA>:=A>B@AM›22al›24aUVIM›154a\›24auF:K@BGI:KPB=MA›22al›23a]TIM
+›2665d›594`X›24auA>:=L>I›23al›24aVYIM›225a]›24au?HHMLDBI›23al›23aWTIM
+›2721d›594`Y›24auM>QMA>B@AM›22al›24aXWu;:L>EBG>LDBI›22af›24auMHILDBI›22acYV\IMd
+›2810d›14m›1212`}
+›2816d›10m›812`¡½»Éƹ›14aÐä›20a~̵ÁÄÀ¹›15a§›5a¯›97aµ»¹›14a§µ›22aÃÉÈ
+›2816d›1283`³›16a«›129aÍ
+›2830d›1258`~
+›1;1202;2222;42;2!|
+›1;1202;2119;42;2!|
+›1;1579;1393;2;11!|
+›1;1579;1393;2;187!|
+›1;1579;1248;2;42!|
+›1;1514;1248;2;42!|
+›1;840;2016;2;11!|
+›1;840;2016;2;717!|
+›1;974;2150;11;2!|
+›1;974;1065;1096;2!|
+›1;1181;1054;11;2!|
+›1;1181;1013;52;2!|
+›1;1451;1012;42;2!|
+›1;1451;946;42;2!|
+›1;1129;977;11;2!|
+›1;1129;931;57;2!|
+›1;891;782;11;2!|
+›1;891;782;150;2!|
+›1;709;1290;2;11!|
+›1;709;1290;2;131!|
+›1;559;1124;2;11!|
+›1;559;1124;2;150!|
+›1;1765;1065;1096;2!|
+›1;1578;1065;1096;2!|
+›1;1555;1065;1096;2!|
+›1;839;1065;1096;2!|
+›1;709;2222;2;1125!|
+›1;709;2159;2;1125!|
+›1;709;1063;2;1125!|
+›1;709;1012;2;1125!|
+›1;709;987;2;1125!|
+›1;708;781;1651;2!|
+›1;559;931;2;1275!|
+›1;558;2432;2;1278!|
+›1;1834;781;1651;2!|
+›1;558;781;1651;2!|
+›1;558;780;2;1278!|
+
+
+›462d›607`Õ›12m›1245aÒÇÐËÈÊíð
+›462d›1300`ï›45aÂËÇÊÅ›16aÉËÎÛ14aÓÇÐÆ›15aÂ
+›607d›10m›607`ÅɵÀ½ì¹Æ›18a·µÂ›18a¶›1a¹›19aÉǹ¸›19aÈÛ17aȹÀÀ›14m›50a_VlhXYpq›10m›17aÈÛ17aÄƽ›292aÈ›19a½Â›18aȼ½Ç›17aÃƽð
+›607d›14m›1184`R›10m›339aÈ›18aȼ¹›18a¸Ã›1a·ÉÁ¹Â
+›664d›651`ȵȽÃÂâ›20aÞ©Ãȹ›15aȼµÈ›14aǽ»À¹›15aĵ»¹Çá›15aÃÆ›15a¹Ê›591aȹ¸›16a½Â
+›664d›607`¹Â›741a¹Â›16aĵÆÈÇ›15aú›15aĵ»¹Çá›15a·µÂ›15a¶›1a¹›16aÄƽÂ
+›720d›607`ȼ¹›15aÃÄÄ›1aÃǽȹ›14aÃƽ¹Â›93aÂá›13aȼÆÃÉ»¼›14aÉǹ›14aú›14aÇɽȵ¶À¹›14auLI><B:E›13aǹÅɹ·¹Ç›15a½Â›14aȼ¹
+›720d›963`ȵȽÃ
+›777d›607`¯›18a³›15aÇÃÉÆ·¹›15aìÀ¹âß
+›787d›632`~
+›908d›12m›607`±¹±¹°›52ap¦›1azx~{®~¤|›17av›18a¤z¬›17aoz{z§z¤xz›17am›68a©
+›908d›1447`¥~¤
+›997d›10m›607`¯¼¹›18ai,%&3t-!1').l›16aµÂ¸›18ai3/0t-!1').l›16aÅɵÀ½ì¹ÆÇ›18aÞ˼½·›101aÍ›17a¶›1a¹›19aµ¶¶Æ¹Ê½ð
+›997d›1731`¼›17aÁµ
+›1054d›607`µÈ¹¸›13aÈÛ13a¾ÉÇÈ›13ai,%l›12aµÂ¸›14ai3/lß›12a¹µ·›373aÉÁ¹Æ½·›13aÊ›189aË›80aÍ
+›1054d›1231`¼›13aƹÅɽƹ›13aµ›13aǽ»À¹›13a›167aµÀɹá›13aºÃÀÀÛ31a¹¸›12a¶
+›1110d›607`µ›13aÈ›31aÃðÀ¹Èȹƛ10aµ¶¶Æ¹Ê½µÈ½Ã›12aºÃÆ›12a˼µÈ›12a¯›18a³›12a·µÀÀÇ›12aµ›15m›12a*›14m›120a!+›16a4-)3›15m›4a+›10må›13aȼ½Ç›12a¹ÌÄƹÇǹÇ
+›1110d›660`Ë›14m›843a/(82)#
+›1120d›10m›1312`~
+›1167d›607`ȼ¹›15a¸½ÇÄÀµ·¹Á¹Â›439aÈ›14aºÆÃÁ›14aȼ¹›16aÀ¹ºÈð¼µÂ¸›15aµÂ¸›15aÈÃÄ›15a¹¸»¹Ç›15aú
+›1167d›924`È›15aú›15aȼ¹›15aƹº¹Æ¹Â·¹›16aÄ›1aýÂ
+›1223d›607`ȼ¹›18aĵě1a¹Æá›18aƹÇÄ›1a¹·È½Ê›48aâ›27a¯¼¹›17aÊ›156aÍ›17a¶›1a¹›18a»½Ê›163aÍ›17aú›17a¯›18a³ÝÇ›17aÇȵ¸µÆ¸
+›1223d›1007`¹ÀÍ›148aµÀɹ›18aÁµ›163a¹Â›17a½Â›17aµÂ
+›1233d›1819`~
+›1280d›15m›607`*›14m›120a!+›16a4-)3›15m›4a+›10mÇá›19a˽ȼ›19aȼ¹›19aµ¸¸½È½Ã›18aú›19aFB›195aȽ»›19aЛ13mõ›10mÁ›19aÞÁ½·ÆÃÂßá›18aµÂ¸
+›1280d›14m›625`/(82)#›10m›677aá›19aƹÄƹǹÂ
+›1320d›15m›1294`N
+›1336d›10m›607`IQá›13a˼½·›199aÈÇ›13aɽÈÇ›13aú›12m›12aãÞëÚßæ›10m›19aá›13aȼ¹›13a¶µÇ½·›13aɽț12aú›13aÁ¹µÇÉƹ›12aÛ13aȼ¹›13a§©ÏÒå
+›1336d›771`¼›12aƹÄƹǹÂ
+›1392d›607`ȼ¹Æ¹›20aµÆ¹›20aÒÏÏ›20aĽ̹ÀÇ›19aÈÛ20aù›20a½Â·›638aÈ›19aµÈ›20aµ›20a¸¹Âð
+›1392d›1236`¼›21aÞȼ¹›19a§©ÏÒ›21a·µÂ›20aȼ¹Æ¹ºÃƹ›20aÄƽÂ
+›1432d›15m›1033`I
+›1449d›10m›655`Í›15aú›16aØÏáÏÏÏ›14a¸ÃÈÇ›13mù›10m½Â›292aÃÉ›15aÁ½»¼›444aµÀɹǛ16aºÃÆ
+›1449d›607`ǽț397aß›16aµÂ¸›16aÇÃá›16aµÇ›16aÍ›160aÈ›15a¹ÌÄ›1a¹·Èá›17aȼ¹›16a¸¹ºµÉÀÈ›16aÊ
+›1505d›607`ȼ¹Ç¹›17aÅɵÀ½ì¹ÆÇ›16aµÆ¹›16a¶›1aÃȼ›17aWTTIQ›15aºÃÆ›16a¯›531aÈå›16aȼ¹›17aǵÁ¹
+›1505d›1363`³ÝÇ›16a¸¹ºµÉÀÈ›16aƹº¹Æ¹Â·¹›17aÄ›1aýÂ
+›1515d›1337`~
+›1562d›607`¹ë¹·È›17a·ÃÉÀ¸›18a¶›1a¹›18aµ·›80a¹¸›17a¶›365aµÀɹ›17aµÇ›17aUBG›17aÃÆ›17aVYhXFF›117a¹Â
+›1562d›959`¼½¹Ê›85aÍ›17aÇÄ›1a¹·½ºÍ½Â»›17aȼ½Ç›17aÊ›460aÃÆ›17a¹Ê
+›1618d›607`µÇ›15a[VhV[IMâ
+›1749d›12m›1246`©›16am›245a©v©~¥¤
+›1749d›607`±¹±¹±›52ap¦›1azx~{®~¤|›17av›18ac~¼z§z¤›70av¦›1az§›17al§~z¤
+›1839d›10m›810`á›14m›54a_VlhXYpq›10m›20aÄÆÛ1a¸É·¹Ç›22a½ÈÇ›21aÃÉÈÄÉÈ›21aµÇÇÉÁ½Â»›12m›21aã›1aâåçåÖÞç›10m›21aÃƽ¹Â›93aÂ
+›1839d›607`ªÆ¸½ÂµÆ½ÀÍ›14m›31aR›10m›1106aȵȽÃ
+›1896d›607`ºÃÆ›16aȼ¹›17aĵě1a¹Æ›18aÞ˽ȼ›15aȼ¹›17aĵě1a¹Æ›18a¶›1a¹½Â»›17a¼½»¼¹Æ›16aȼµÂ›17a½È›16a½Ç›17a˽¸¹ßâ›24a£Ã›31a¹Ê›89aÃÉ
+›1896d›1889`Ë›42a¹Æá›16aÍ
+›1946d›14m›1489`}
+›1952d›10m›607`Á½»¼›434aÈ›19aĵƵÁ¹È¹ÆÇ›19aÈÛ19a§›5a¯›17a³›20aÞuM>QMPB=MAá›14m›19a%3#›10m›115a¼
+›1952d›705`È›19a˽Ǽ›19aÈÛ19aÉǹ›20a¸½ë¹Æ¹Â›823aßá›19aÇÉ·
+›1966d›1535`~
+›2008d›607`ȼµÈ›15aȼ¹›16aĵě1a¹Æ›16a½Ç›16aµÇÇÉÁ¹¸›16aÈÛ15a¶›1a¹›16a½Â›12m›16aßÖáÙæØÖã›1aÚ›10m›19aÁÛ1a¸¹å›16a½È›15a½Ç›15aȼ¹Â›16a¹·¹ÇǵÆÍ›16aÈÃ
+›2065d›607`ȹÀÀ›14m›49a_VlhXYpq›10m›572aȵȽÛ16a·ÃÁÁµÂ¸Ç›18aÈÛ18aȼ¹›18a§©ÏÒâ
+›2065d›14m›688`R›10m›201aȼµÈ›18a½È›17aǼÃÉÀ¸›18aǹ¸›19aƹðÃƽ¹Â
+›2121d›970`Í›17aÁ¹µÂÇ›17aú›17aȼ¹›17ai/1)%.3!3)/.l›16aÅɵÀ½ì¹Æá›17aÞ˼½·›100aÍ›17a¶›1a¹
+›2121d›607`¯¼½Ç›17a½Ç›17aÇÄ›1a¹·½ì¹¸›18a¶›942a¼›16aÁµ
+›2178d›607`µ¶¶Æ¹Ê½µÈ¹¸›15aÈÛ14ai/1lßá›14aµÂ¸›15aȵ¿›173aµÀɹÇï›14a0/131!)3›14aÃÆ›14a,!.$2#!0%›14aÞ0›14aÃÆ
+›2178d›1204`¹Ç›14aȼ¹›15añÊ
+›2234d›607`,ßå›14aȼ¹›16a¸¹ºµÉÀÈ›15a½Ç›14a0/131!)3â
+›2367d›13m›607`§¬¨›56a`xov~puxs›18a_{mztuo|›19a`wmsq|›18aux›18a¤›330a}
+›2367d›1503`y~{›19a\y›2ao~wqx
+›2451d›14m›1049`}
+›2457d›10m›607`z›20aÀÛ1a·µÀ›18a¹ÌȹÂǽÛ20aÈÛ18a§›5a¯›18a³›19aµÈ›19a­¨|®›19aÄ›1a¹ÆÁ½ÈÇ›19aȼ¹›14m›52a_VlhXYpq›10m›18aÄÆûƵÁ›18aÈÃ
+›2457d›14m›1640`R
+›2471d›10m›1095`~
+›2513d›1314`ȹ¸›11a¸Ã›1a·ÉÁ¹Â›383aÍĽ·µÀÀÍ
+›2513d›607`½Â·Àɸ¹›12a»ÆµÄ¼½·›11a½Áµ»¹Ç›10a˽ȼ½Â›10aµ›11aÄƽ›249aÈâ›19a¯¼¹›12a½Áµ»¹Ç›10a˽ÀÀ›10aÈ
+›2570d›607`¼µ›22a¹›12a¶›1a¹¹Â›14a·µÄÈÉƹ¸›12aºÆÃÁ›12aµ›12a»ÆµÄ¼½·µÀ›11a¸½ÇÄÀµ›59aÍ›12aÇúț31aµÆ¹›11a˼½·›242a¿ï
+›2570d›654`Ê›772aÍ›12a¶›107aË›161a¼›12añƹµ¸Ç›12a¶µ·
+›2626d›607`ÇÉ·›1414aÈ
+›2626d›669`¼›15aµÂ›14a½Áµ»¹›14aÈÛ14aȼ¹›14a¼ÃÇÈ›14a·ÃÁÄÉȹÆâ›20a¯¼¹›15aÃÂÀÍ›14aºÃÆÁµÈ›13aÇÉÄÄ›1aÃÆȹ¸›15aµÈ›14aÄƹǹÂ
+›2682d›743`¼›21aµÂ›19a½Áµ»¹›19a¸ÉÁÄ›21aƹÅɽƹǛ20aȼµÈ›19a½È›19a¶›1a¹›21a½Â›19a}~|ÝÇ›19aéǽ̹ÀÝ›19aºÃÆÁµÈå›20aȼ½Ç
+›2682d›607`ºÃÆ›19aÇÉ·
+›2739d›831`ȹ¸›18a½Â›17aȼ¹›17aÄÆûƵÁÁ¹ÆÇÝ›16aÁµÂ›451aȹƛ17aµÂ¸›17aȼ¹
+›2739d›607`½Ç›17a¸Ã›1a·ÉÁ¹Â›591aɵÀÇ›16aºÃÆ›17aȼ¹›17a§©ÏÒ›17aÄƽÂ
+›2795d›607`±¯ÑÓÏãЛ11aȹÆÁ½ÂµÀÇâ›18a®É·›494aÍ›12aȼ¹›14m›89ah\›10m›13aÄÆûƵÁ›11aºÆÃÁ
+›2795d›1086`¼›13aìÀ¹Ç›12a·µÂ›13a¶›1a¹›13a»¹Â¹ÆµÈ¹¸›13a¶›14m›111a[d]
+›2852d›10m›607`ÇÃÉÆ·¹Ç›15aËƽÈȹ›14a½Â›15a­¹¢¤®å›14aÄÆÛ603aÍÄ›1a¹›15a½Ç›14aÇÄ›1a¹·½ì¹¸
+›2852d›1199`ʽ¸¹¸›15aȼµÈ›14aȼ¹›15a·ÃÆƹ·È›15a¸¹Ê½·¹›15aÈ
+›2908d›607`Þ,.TW›17aÃÆ›18a,.TWt0,42á›16aµÇ›18aµÄÄÆÃÄƽµÈ¹ßá›17aȼ¹›14m›94ah\›10m›230aÍ›17a¶›1a¹›19a½ÁÄ›1aÃÆȹ¸
+›2908d›14m›1461`[d]›10m›62aÃÉÈÄÉÈ›18aÁµ
+›2965d›14m›687`!3),›10mâ
+›2965d›14m›607`5%1"
+›3030d›659`ã
+›3046d›11m›676`³¥¥›13a§¬¯³³¡²¹
+›1;607;3001;2;598!|
+
+
+›462d›12m›449`ïôð›45aÇáØßèÙÞáÜ›16aÅåÖãÝÞØæ›14aÇàÖÜÚæ›15aÞá›15aì›266aç›10m›461aÖ
+›462d›12m›1175`âèå›15aÂâ›1aØèàÚá
+›601d›14m›762`}
+›607d›10m›549`Û14aÄƹĵƹ›15a§›5a¯›339a¼›15aµÂ›15a½Áµ»¹á›13a½Â·Àɸ¹›15a@K:IAB<L›14aµÇ›14aµÂ›15aÃÄð
+›607d›520`¯›281a³›14aÈÛ14a½Â·Àɸ¹›15aÇÉ·
+›621d›808`~
+›664d›449`ȽÛ14aÈÛ14aȼ¹›15au=H<NF>GMLMRE>›583a¹›15a¹˛14a·ÃÁÁµÂ¸Çá
+›664d›1023`·ÃÁÁµÂ¸å›14aȼ½Ç›14a˽ÀÀ›13a¸¹ì¹›16aìÊ
+›720d›449`ȼ¹›16aìÆÇÈ›15aºÃÉÆ›14aú›15a˼½·›256aËÇä
+›720d›858`¼›15aµÆ¹›15aµÇ›15aºÃÀÀÃ
+›812d›15m›1922`I
+›830d›10m›449`uLF:EE53VXT›895a¼¹Ç›21a¼½»¼›21aµÂ¸›22aÑ
+›830d›735`¤Â·Àɸ¹Ç›22aµÂ›22a½Áµ»¹›20a¸ÉÁÄ›22a½Â›21aµ›21aÇĵ·¹›22aÐâս·
+›845d›15m›1922`J
+›887d›10m›620`¼¹Ç›15a˽¸¹á›15aÇɽȵ¶À¹›14aºÃÆ›14aµ›15aºÉÀÀðǷƹ¹Â›14a¸ÉÁÄ›16aºÆÃÁ›14aµ›15a±¯ÑÓÏãЛ13aȹÆÁ½ÂµÀ
+›887d›563`½Â·
+›943d›563`Á¹µÇÉƽ»›15aÓ×Ï›15m›9a&›10m›10a×ÏÏ›15aǷƹ¹Â›15aĽ̹ÀÇá›15aµÈ›14aÐäЛ15aÇ·µÀ½Â»
+›1035d›15m›1820`H
+›1053d›10m›449`uE:K@>53VXT›48aÃÆ›14aÄƽ›663aͽ»›15aÒâѽ›15m&›10mÔ›27a½Â
+›1053d›735`¡›131aȽ»›14aµ›15a¸ÉÁÄ›16aµÈ›15aÑäЛ14aÇ·µÀ½Â»á›14aÛ1a··ÉÄ
+›1068d›15m›1820`J
+›1163d›10m›449`uLF:EE5BLYYT›48aÃÆ›13aÐäЛ13aÇ·µÀ¹¸›14a¸ÉÁÄ›15aºÆÃÁ›13aµ›14a±½ÇɵÀ›13aÔÔÏ›13aȹÆÁ½ÂµÀá›13a˽ȼ›13aÔ×Ô›15m›7a&
+›1163d›10m›759`¡
+›1220d›563`ÖÕ×›14aǷƹ¹Â›16aĽ̹ÀÇá›15a½Â›15aµ›14aÇĵ·¹›16aÁ¹µÇÉƽ»›14aÐâØԽ›15m&›10mÑâÔÕ½Â
+›1330d›449`uE:K@>5BLYYT›48aÃÆ›14aÄƽ›663aͽ»›15aÒâؽ›15m&›10mÔâÐѽÂ
+›1330d›759`¡›131aȽ»›14aµ›15a¸ÉÁÄ›16aµÈ›14aÑäЛ15aÇ·µÀ½Â»á›14aÛ1a··ÉÄ
+›1440d›449`Þ¯¼¹›16aìºÈ¼›15a·ÃÁÁµÂ¸á›14au@BGHá›15a½Ç›14a¸¹Ç·Æ½¶›1a¹¸›16a½Â›15m›15a,›10m›205aËâß
+›1440d›1360`ÑâÒâЛ13a¶›1a¹ÀÃ
+›1500d›520`¤Â›13a¹µ·›491a¹›11aù›12aĵƵÁ¹È¹Æá›12a˼½·›73aÉÇÈ›12a¶›1a¹›13aȼ¹›12aµÁ¹
+›1500d›636`¼›12a·µÇ¹›12aȼ¹›13a·ÃÁÁµÂ¸Ç›12aȵ¿›428a¼›12aÁ
+›1557d›1173`Í›19a¹·¹ÇǵÆÍ›20aìÀ¹›20a¹ÌȹÂǽÃÂßâ›33a¯¼¹›20a·ÃÁð
+›1557d›449`ú›20aȼ¹›20aǽ̹À›19a¸ÉÁÄ›20aìÀ¹›20a޽·Àɸ½Â»›19aµÂ
+›1613d›449`ÁµÂ¸Ç›21a¹ÂÇÉƹ›20aȼµÈ›20aµ›20aÇĵ·¹›20aú›20aȼ¹›20aµÄÄÆÃÄƽµÈ¹›19aǽι›20a½Ç›20aÀ¹ºÈ›20a˽ȼ½Â›19aȼ¹›20aȹÌÈ
+›1670d›490`ÃÉ›12a˽ÀÀ›10aÁÃÇÈ›12aÄÆöµ¶ÀÍ›11aÉǹ›12aȼ¹›13a·ÃÁÁµÂ¸Ç›11a˽ȼ½Â›12aµ›11a?B@NK>›11aµÂ¸ãÃÆ›12aIB<MNK>
+›1670d›449`ÞÍ
+›1726d›449`¹Â›184aÈßâ›14m›51a_VlhXYpq›10m›12a½Ç›13aĵÇǹ¸›14aȼ¹›14aìÀ¹ÂµÁ¹›14aµÂ¸›14a½ÂÇÈÆɷȹ¸›13aÈÛ13aÈƹµÈ›13aȼ¹
+›1726d›493`ʽÆÃÂÁ¹Â›14m›67aR
+›1783d›10m›901`Í›18aÁ¹µÂÇ›17aú›17a¯›18a³ÝÇ›17auLI><B:E›16a·ÃÁÁµÂ¸ß›17aȼÆÃÉ»¼›18aȼ¹
+›1783d›449`ìÀ¹›18aµÇ›17aµ›17aǽ̹À›17a¸ÉÁÄ›18aÞ¶
+›1793d›1163`~
+›1839d›449`µ¶›1aÛ22a¹›15aÁµ·ÆÃÇâ
+›1839d›520`Ê
+›1926d›813`
+[7 IP9;0;1q
+~!766@~
+-~!766?~
+-~!368?K!4AcW!188?o!4GO_!19?w!13?o!5Go!19?w!33?o!5GO!25?w!70?~
+-~!368?ogca`__!14?w!112?w!61?_OGCA@!3?}C!4A{!3?{!4AC~!13?~!5?~!4?}C!3AC!3?{!4AC~!3?{!5Q[!4?}C!3AC!13?B!5Cw!3?}!3?_}!4?K!5Q_!3?AA~AA!5?{!5Q[!3?{ACWCA{!46?~
+-~!389?~!112?~!60?B!6A!3?B!5?B!3?@!4A@B!13?@!5A@!4?B!8?@!4A@B!3?@!5A!5?B!18?@!5A@!3?G!3PON!5?!5A@!5?@AA@!4?@!5A!4?B!5?B!46?~
+-~!38?}!5@}!3?o_!4O_!3?_!5O_!3?o_!4O_!13?~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!74?~!45?{A!4@E!5?@~!6?_!5O_!3?_!5O!4?_!5O_!3?
+_!4O_~!10?~??~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!34?~
+-~!38?N!5ON!3?~N!4ON!3?N!5QB!3?^!5?^!13?^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!74?~!45?FG!4OK!5?O^O!5?N!5ON!3?@!5QK!3?N!5QB!3?
+N!4OG^!10?~??^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!34?~
+-~!48?B!69?B!55?B!12?o!30?@!4A@!38?{!5?B!120?~!112?~!32?B!55?B!43?@!4A@!44?B!80?~
+-~!187?~!74?~!126?~!87?__OOGCC!9AC!3GO_!3?~!263?~
+-~!37?~!36_~!37_~!36_~!37_~!36_~!37_~!15_!111?~!80?__OGCA@!22?@AC~O_!261?~
+-~!37?^!36?^!37?^!36?^!37?~!36?^!19?_OO!3GKcuyj\NJD~ZF~!126?~!74?oGCCA@!32?~?@ACGO_!256?~
+-~!187?~!45?__OGGKEA!3@?_OwGKFB@!3?_WE~??~!30?}CGoGC}!4?!5_!5?!4_?o!3?_?!4_!6?_e!6?__}__!5?_!4?_!5?!4_?}!4?!5_!10?~!67?_WCCAA@!38?~!6?@AKO_!252?~
+-~!187?Fw!37?_OGKCA@@??__OGGCA`\E@@!6?oKB??~?~~!30?~!5?~!3?W!5c~!3?N!4O~!4?~@!4?~!4?__~__!6?^__O!4?^!4_^_!3?^!4_P~!3?^!5cF!9?~!59?__OGCAA@@!44?~!10?@EGo!249?~
+-~!188?@Fw!28?_WGCE@@??_OOGCCA@!5?{B@!7?oKB!5?~?~~!50?A!4CB!70?~!50?__OGCCAA@!53?~!14?@EGo!245?~
+-~!190?@Ew!20?oGCCB@?_OGGCAA@!10?wM@!7?_[B!8?~?~~!107?_o!17?~!38?__O!4GCAA@@!62?~!18?@EGO_!240?~
+-~!193?BKO_!10?_OGCaPOGCCA@@!16?oKB!6?_WE@!10?~?~~!106?@?~!17?~!16?!5_!4O!5GCCAA!4@!74?~!22?@AKO_!236?~
+-~!196?@EGo??_oWKJCAA@!24?}@!6?wE@!10?!3@~~@~!5@!101?CCFCC!15?~BBFFJRb!33B!9D!11H!3P!4`!45@~!27@BLP``!193@!38?~
+-~!197?_WCBBLO_!28?_[B!4?oKB!16?~~?~!126?~!7?@AKO_!55?!5@AACC!5GOO__!27?~!32?@ACGo!226?~
+-~!192?_OGCA@!6?@BKGW_!22?wF!3?oKB!19?~~?~!126?~!12?@AKo!69?!4@AAC!4GOO__!12?~!37?@EGO_!221?~
+-~!188?_OKA@!17?@ACGGO_!14?_^?_WF!22?~~?~!126?~!16?BCW_!80?!3@AC!5GO_~!42?@@ACGO_!214?~
+-~!184?_OKA@!28?@@AEGGW__!5?~WE@!24?~B?~!126?~!20?@ACGO_!86?~@!3ACCGGOO!3_!36?@ACCGOO_!206?~
+-~!181?_WE@!41?!3@B}D!4GOO__!19?~??~!126?~!25?@ACGO_!81?~!13?@@AACC!3GOO__!31?@AACCGOO_!197?~
+-~!178?_WE@!47?}@!9?!7@!4A!8C~CC~!9C!3A!114?~!31?@AACGO__!73?~!26?!4@AAC!4G!3O__!24?@!3ACCGGOO_!186?~
+-~!175?_WE@!50?~!29?~??~!126?~!39?@@ACGGOO__!63?~!42?!4@!3ACC!4G!3O!4_!15?!4@AAC!4GOO__!171?~
+-~!171?_OKB!54?~!29?~??~!126?~!49?!3@AC!5GOO__!49?~!62?!5@AA!4C!7GOO!5_!5?!5@AACC!7GOO__!151?~
+-~!168?_WE@!56?}@!29?~??~!126?~!63?!4@AA!3C!6G!5O!4_!25?~!87?!7@!4A!5C!9G!4P!3`!4aA!4C!7G!4O!7_!117?~
+-~!166?wE@!58?_^!30?~??~!126?~!87?!9@!5A!7C!4G~!8G!7O!10_!98?!11@!7A!5CDD!7H!6I!5KSS!7W!9g!9O!9_!61?~
+-~!163?oKB!61?~!31?~??~!126?~!112?~!25?!22@!14A!18C!42G!29O!34_!4`!21@!13B@@!39?~
+-~!160?_WF!64?~!28?!3G~GG~!5G!121?N!112G~!188G!36HG!38?~
+-~!158?_[B!65?oN!31?~??~!239?~!263?~
+-~!156?oM@!67?~!32?~??~!239?~!4?CA~!105?E!3@`QK!43?~??_??~!6?_OGF!3?~??_??~!3?o_!4O_!26?A@@!3`]!31?~
+-~!154?WE@!69?N!32?F??~!239?~!4?OO^OO!103?WSQP!3O!43?FWE@EWF!3?[A@!7?FWE@EWF!3?^!5?^!26?G!5ON!31?~
+-~!262?~!239?~!263?~
+-~!262?~!105?_OGCGO_!127?~!263?~
+-~!256?!6_~!5_!100?NO_?_ON!14?!113_~!225_!38?~
+-~!262?~!108?@!17?~FXbDHIQQacCC!4G!5O__!89?~!263?~
+-~!262?~!126?~??@EW_!4?!4@ACGGOO__?!4@!3ACC!7GOO__!69?~!263?~
+-~!262?~!126?~!5?@EW_!13?@AACCGGO_!12?@@!3ACC!4GO__!55?~!263?~
+-~!262?~!126?~!8?@EW_!19?@@AACCGOO_!16?@@AACCGGOO_!44?~!263?~
+-~!262?~!126?~!12?BCW_!25?!3@AACGGO_!17?@AACCGO_!36?~!263?~
+-~!262?~!126?~!16?BCW_!31?@@AACGGO_!16?@@ACGGO_!28?~!263?~
+-~!256?!6@~!5@!121?~!20?@@ACGO_!33?@@AACGGOO_!14?@EGO_!23?~!263?~
+-~!262?~!126?~!27?@ACCGOO_!35?@@AACGOO_!10?@@ACGo!17?~!263?~
+-~!262?~!126?~!35?!3@AACGGOO!3_!31?@@AACGOO_!7?@EGOO_!11?~!263?~
+-~!262?~!126?~!48?!4@AA!3C!4G!4O__!21?@@AAC!3GO__??BCW_!7?~!263?~
+-~!262?~!84?!7_!3?]!4`Q{!3?wCA@ACw!15?~!67?!7@!4A!5C!7G!6O!3_``ACGGPQcgO_?~!263?~
+-~!262?~!94?G!4OGF!3?BCGOGCB!15?~!112@~NzJJTTd!3D!15H!6P!7`!187@!38?~
+-~!256?!6CF!5C!121?~!112?~??@ACGO`@@ACC!4GO_!19?!16@!7A!9C!18G!9O!9_!157?~
+-~!389?~!112?~!8?@ACGO_!5?!5@AC!5GOO__!71?!20@!8A!11C!23G!11O!11_!73?~
+-~!323?{!5Cw!3?{!55?~!112?~!14?@AACGO__!13?!5@AACC!5GOO__!137?!23@!11A!39?~
+-~!323?~!5A@!3?~A!4@}!3?o!5H}!3?E!5Ho!3?}!5HM!19?~!112?~!22?@@ACGGO__!22?!5@AA!4C!5G!4O!3_!187?~
+-~!323?@??_!6?@!5?@!4?!6@!4?!5@!5?!5@!20?~!112?~!31?@@AACGGOO!3_!33?!6@!5A!4C!7G!5O!4_!156?~
+-~!326?~!10?!5Go!3?o!4GoK!36?~!112?~!43?!4@AC!5GOO__!49?!9@!7A!4C!12G!6O!8_!110?~
+-~!326?N!6G!3?E!5HN!3?b!4C~!37?~!112?~!58?!7@AA!5C!7GOO!4_!68?!13@!9A!9C!18G!9O!11_!41?~
+-~!347?!4@!38?~!112?~!85?!12@!4A!7C!11G!9O!9_!126?~
+-~!351?_!7?!5_!7?_!17?~!112?~!137?!20@!11A!13C!34G!9O!39?~
+-~!338?!7O!4?A@~!6?n!5On!3?{A@?@A{!14?~!112?~!263?~
+-~!349?GGNGG!4?F!5GF!3?@ACGCA@!14?F!112?F!263?~
+-~!38?W!4CGo!721?~
+-~!38?_OGCA@!30?!601_!91?~
+-~!38?!7@!721?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!182?__!3O!4G!3C!15A!5C!6GO!3_!542?~
+-~!173?_O!3GE!3@!42?!3@AA!3C!3GO__!528?~
+-~!166?oGGCA@@!65?!3@ACC!3Go!518?~
+-~!160?oGGE@@!82?!3@AAC!3GOO_!506?~
+-~!39?CA~!75?!9_!28?_OGE@@!100?!3@AAC!3GOO_!183?!8_!303?~
+-~!39?OO^OO!30?w!33GwGGKI!4H!9G!8H!5I!6K!4GggWKIH!9G!11g!16W!81G!3HIIK!3GWW!3g!109G!3g!5W!10G!6K!8I!28H!8G!37H!11I!12K!31G!75W!46G!91?~
+-~!74?~!28?_WCA@!25?!3_!3O!6GcSKB!3A!12@!122?!3@!3AC!6GOO!4_!56?!4_!5O!9G!3C!4A!9@!371?~
+-~!74?~!25?_WE@!16?__O!3GCCAAB@@!8?_WE@!160?!8@!6A!24C!7A!11@!405?~
+-~!74?~!23?wE@!12?oGGCAA@!17?oGE@!625?~
+-~!74?~!20?_WF!9?oGGE@@!20?oGCB!629?~
+-~!74?~!19?wF!5?_OGE@@!23?wE@!633?~
+-~!74?~!17?{B!3?_WCA@!24?_OKB!636?~
+-~!74?~!15?_]@_OKA@!24?_OKB!640?~
+-~!74?~!14?{bWE@!25?oKA@!643?~
+-~!74?~!12?_}F@!24?_WE@!647?~
+-~!74?~!10?_{B!23?oGE@!651?~
+-~!74?~!8?ok^@!20?oGCB!655?~
+-~!74?~!6?oM|B!17?_OKA@!659?~
+-~!74?~!4?oNoN!13?__WCCB!664?~
+-~!74?~??oKrN!9?__WGKB!670?~
+-~!74?~okZE@?__O!3GCCB!676?~
+-~!37?!638@!91?~
+-~!600?!3Gw!3G!6?W!56?GO_!93?~
+-~!603?~!8?A}!6?{ACWCA{!3?{!5Q[!13?!7C!3?!7C!5?_PIC!90?~
+-~!75?!3C{!3C!46?K!28?{!17?{!5Cw!421?B!7?AABAA!4?B!5?B!3?@!5A!34?A@!94?~
+-~!78?~!7?~A!3@A!3?o!5H}!3?~A!4@}!3?E!5Ho!5?@~!6?}!5HM!3?~A!4@}!3?@@~@@_!14?~AEIQa@!3?}!5HM!3?E!5Ho!3?~}!4@}!3?}!5@}!3?~A!4@}!3?E!5Ho!3?}!5HM!514?~
+-~!78?@!7?@!9?!6@!3?@!5?@!4?!5@!5?!5@!5?!5@!4?@!5?@!6?@@!15?@!5?@!4?!5@!5?!5@!4?N?!4@!5?!5@!4?@!5?@!4?!5@!5?!5@!515?~
+-F!766CF
+\
+
+›7 I
+›2580d›449`¡½»Éƹ›13aÑä›19a±½ÇɵÀ›13aÔÔÏ›12a®·Æ¹¹Â›15a}ÉÁÄ›13aÄƽ›99aÍ›14aȼ¹›13auLF:EE5BLYYT›12a|ÃÁÁµÂ¸
+›2580d›1225`ȹ¸›13a¶
+›2703d›994`¹›11aȼ¹›13aÉȽÀ½È›685a¹Æ¹
+›2703d›520`¡½»ÉƹǛ12aÑ›12aµÂ¸›13aÒ›13a½ÀÀÉÇÈƵț205aÍ›11aú›12aȼ¹Ç¹›13a·ÃÁÁµÂ¸Çå›13aȼ¹›13a¸ÉÁÄÇ›13aË
+›2760d›513`¹Â›15aºÆÃÁ›15aµ›15a±½ÇɵÀ›14aÔÔÏ›14aȹÆÁ½ÂµÀâ
+›2760d›449`ȵ¿
+›2820d›520`¯¼¹›16aǽ̹À›15a¸ÉÁÄ›16a˽ÀÀ›15a¶›1a¹›16a½Â·Àɸ¹¸›14m›97a!3),›10m›19a˽ȼ½Â›15aȼ¹›16aƹÇÉÀȽ»›15ah,.W›15aìÀ¹
+›2820d›14m›1178`5%1"
+›2877d›10m›473`Í›14m›50a_VlhXYpq›10må›17a½È›12m›59aª¨©›10m›17a½Â·Àɸ¹›17aȼ¹›18a¹·¹ÇǵÆÍ›17a$#2›264aÈÆÃÀ›16a®Èƽ»ß
+›2877d›449`¶›14m›41aR›12m›261a£›10m›617aÞ}¹Ê½·¹›17a|ÃÂ
+›2933d›726`ÈÆÛ1a¸É·¹›14aȼ¹›13a¸ÉÁÄá›14aµÂ¸›13aì½Ǽ›14a˽ȼ›12aȼ¹›13a23›194a¹ÆÁ½ÂµÈÃÆß
+›2933d›449`ǹÅɹ·¹›15aÈÛ12a½Â›823aÞ®Èƽ»›12a¯
+›2990d›449`¹Ç·µÄ›1a¹›17aǹÅɹ·¹â›25a}ÉÁÄÇ›16aºÃÆ›16aÄƽ›540aÉÇÈ›16aÇÄ›1a¹·½ºÍ›17aȼ¹
+›2990d›1111`Ƚ»›15a˽ȼ›16aȼ¹›16a·ÃÁÁµÂ¸Ç›16aÁ
+›3046d›449`Ç·µÀ½Â»›15aȼÆÃÉ»¼›15aȼ¹›15aȼ½Æ¸›15aĵƵÁ¹È¹Æ›14aú›15aȼ¹›16a$#2›14aǹÅɹ·¹á›16aȼ¹Æ¹ºÃƹ›15aȼ¹›16aìÀ¹Ç
+›1;1820;1040;2;18!|
+›1;1922;817;2;18!|
+
+
+›462d›607`×›12m›1245aÒÇÐËÈÊíð
+›462d›1300`ï›45aÂËÇÊÅ›16aÉËÎÛ14aÓÇÐÆ›15aÂ
+›595d›586`
+[7 IP9;0;2q
+-~!766@~
+-~!766?~
+-~!368?K!4AcW!188?o!4GO_!19?w!13?o!5Go!19?w!33?o!5GO!25?w!70?~
+-~!368?ogca`__!14?w!112?w!61?_OGCA@!3?}C!4A{!3?{!4AC~!13?~!5?~!4?}C!3AC!3?{!4AC~!3?{!5Q[!4?}C!3AC!13?B!5Cw!3?}!3?_}!4?K!5Q_!3?AA~AA!5?{!5Q[!3?{ACWCA{!46?~
+-~!389?~!112?~!60?B!6A!3?B!5?B!3?@!4A@B!13?@!5A@!4?B!8?@!4A@B!3?@!5A!5?B!18?@!5A@!3?G!3PON!5?!5A@!5?@AA@!4?@!5A!4?B!5?B!46?~
+-~!38?}!5@}!3?o_!4O_!3?_!5O_!3?o_!4O_!13?~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!74?~!45?{A!4@E!5?@~!6?_!5O_!3?_!5O!4?_!5O_!3?
+_!4O_~!10?~??~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!34?~
+-~!38?N!5ON!3?~N!4ON!3?N!5QB!3?^!5?^!13?^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!74?~!45?FG!4OK!5?O^O!5?N!5ON!3?@!5QK!3?N!5QB!3?
+N!4OG^!10?~??^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!34?~
+-~!48?B!69?B!55?B!12?o!30?@!4A@!38?{!5?B!120?~!112?~!32?B!55?B!43?@!4A@!44?B!80?~
+-~!187?~!74?~!126?~!87?__OOGCC!9AC!3GO_!3?~!263?~
+-~!37?~!36_~!37_~!36_~!37_~!36_~!37_~!15_!111?~!80?__OGCA@!22?@AC~O_!261?~
+-~!37?^!36?^!37?^!36?^!37?~!36?^!19?_OO!3GKcuyj\NJD~ZF~!126?~!74?oGCCA@!32?~?@ACGO_!256?~
+-~!187?~!45?__OGGKEA!3@?_OwGKFB@!3?_WE~??~!30?}CGoGC}!4?!5_!5?!4_?o!3?_?!4_!6?_e!6?__}__!5?_!4?_!5?!4_?}!4?!5_!10?~!67?_WCCAA@!38?~!6?@AKO_!252?~
+-~!187?Fw!37?_OGKCA@@??__OGGCA`\E@@!6?oKB??~?~~!30?~!5?~!3?W!5c~!3?N!4O~!4?~@!4?~!4?__~__!6?^__O!4?^!4_^_!3?^!4_P~!3?^!5cF!9?~!59?__OGCAA@@!44?~!10?@EGo!249?~
+-~!188?@Fw!28?_WGCE@@??_OOGCCA@!5?{B@!7?oKB!5?~?~~!50?A!4CB!70?~!50?__OGCCAA@!53?~!14?@EGo!245?~
+-~!190?@Ew!20?oGCCB@?_OGGCAA@!10?wM@!7?_[B!8?~?~~!107?_o!17?~!38?__O!4GCAA@@!62?~!18?@EGO_!240?~
+-~!193?BKO_!10?_OGCaPOGCCA@@!16?oKB!6?_WE@!10?~?~~!106?@?~!17?~!16?!5_!4O!5GCCAA!4@!74?~!22?@AKO_!236?~
+-~!196?@EGo??_oWKJCAA@!24?}@!6?wE@!10?!3@~~@~!5@!101?CCFCC!15?~BBFFJRb!33B!9D!11H!3P!4`!45@~!27@BLP``!193@!38?~
+-~!197?_WCBBLO_!28?_[B!4?oKB!16?~~?~!126?~!7?@AKO_!55?!5@AACC!5GOO__!27?~!32?@ACGo!226?~
+-~!192?_OGCA@!6?@BKGW_!22?wF!3?oKB!19?~~?~!126?~!12?@AKo!69?!4@AAC!4GOO__!12?~!37?@EGO_!221?~
+-~!188?_OKA@!17?@ACGGO_!14?_^?_WF!22?~~?~!126?~!16?BCW_!80?!3@AC!5GO_~!42?@@ACGO_!214?~
+-~!184?_OKA@!28?@@AEGGW__!5?~WE@!24?~B?~!126?~!20?@ACGO_!86?~@!3ACCGGOO!3_!36?@ACCGOO_!206?~
+-~!181?_WE@!41?!3@B}D!4GOO__!19?~??~!126?~!25?@ACGO_!81?~!13?@@AACC!3GOO__!31?@AACCGOO_!197?~
+-~!178?_WE@!47?}@!9?!7@!4A!8C~CC~!9C!3A!114?~!31?@AACGO__!73?~!26?!4@AAC!4G!3O__!24?@!3ACCGGOO_!186?~
+-~!175?_WE@!50?~!29?~??~!126?~!39?@@ACGGOO__!63?~!42?!4@!3ACC!4G!3O!4_!15?!4@AAC!4GOO__!171?~
+-~!171?_OKB!54?~!29?~??~!126?~!49?!3@AC!5GOO__!49?~!62?!5@AA!4C!7GOO!5_!5?!5@AACC!7GOO__!151?~
+-~!168?_WE@!56?}@!29?~??~!126?~!63?!4@AA!3C!6G!5O!4_!25?~!87?!7@!4A!5C!9G!4P!3`!4aA!4C!7G!4O!7_!117?~
+-~!166?wE@!58?_^!30?~??~!126?~!87?!9@!5A!7C!4G~!8G!7O!10_!98?!11@!7A!5CDD!7H!6I!5KSS!7W!9g!9O!9_!61?~
+-~!163?oKB!61?~!31?~??~!126?~!112?~!25?!22@!14A!18C!42G!29O!34_!4`!21@!13B@@!39?~
+-~!160?_WF!64?~!28?!3G~GG~!5G!121?N!112G~!188G!36HG!38?~
+-~!158?_[B!65?oN!31?~??~!239?~!263?~
+-~!156?oM@!67?~!32?~??~!239?~!4?CA~!105?E!3@`QK!43?~??_??~!6?_OGF!3?~??_??~!3?o_!4O_!26?A@@!3`]!31?~
+-~!154?WE@!69?N!32?F??~!239?~!4?OO^OO!103?WSQP!3O!43?FWE@EWF!3?[A@!7?FWE@EWF!3?^!5?^!26?G!5ON!31?~
+-~!262?~!239?~!263?~
+-~!262?~!105?_OGCGO_!127?~!263?~
+-~!256?!6_~!5_!100?NO_?_ON!14?!113_~!225_!38?~
+-~!262?~!108?@!17?~FXbDHIQQacCC!4G!5O__!89?~!263?~
+-~!262?~!126?~??@EW_!4?!4@ACGGOO__?!4@!3ACC!7GOO__!69?~!263?~
+-~!262?~!126?~!5?@EW_!13?@AACCGGO_!12?@@!3ACC!4GO__!55?~!263?~
+-~!262?~!126?~!8?@EW_!19?@@AACCGOO_!16?@@AACCGGOO_!44?~!263?~
+-~!262?~!126?~!12?BCW_!25?!3@AACGGO_!17?@AACCGO_!36?~!263?~
+-~!262?~!126?~!16?BCW_!31?@@AACGGO_!16?@@ACGGO_!28?~!263?~
+-~!256?!6@~!5@!121?~!20?@@ACGO_!33?@@AACGGOO_!14?@EGO_!23?~!263?~
+-~!262?~!126?~!27?@ACCGOO_!35?@@AACGOO_!10?@@ACGo!17?~!263?~
+-~!262?~!126?~!35?!3@AACGGOO!3_!31?@@AACGOO_!7?@EGOO_!11?~!263?~
+-~!262?~!126?~!48?!4@AA!3C!4G!4O__!21?@@AAC!3GO__??BCW_!7?~!263?~
+-~!262?~!84?!7_!3?]!4`Q{!3?wCA@ACw!15?~!67?!7@!4A!5C!7G!6O!3_``ACGGPQcgO_?~!263?~
+-~!262?~!94?G!4OGF!3?BCGOGCB!15?~!112@~NzJJTTd!3D!15H!6P!7`!187@!38?~
+-~!256?!6CF!5C!121?~!112?~??@ACGO`@@ACC!4GO_!19?!16@!7A!9C!18G!9O!9_!157?~
+-~!389?~!112?~!8?@ACGO_!5?!5@AC!5GOO__!71?!20@!8A!11C!23G!11O!11_!73?~
+-~!323?{!5Cw!3?{!55?~!112?~!14?@AACGO__!13?!5@AACC!5GOO__!137?!23@!11A!39?~
+-~!323?~!5A@!3?~A!4@}!3?o!5H}!3?E!5Ho!3?}!5HM!19?~!112?~!22?@@ACGGO__!22?!5@AA!4C!5G!4O!3_!187?~
+-~!323?@??_!6?@!5?@!4?!6@!4?!5@!5?!5@!20?~!112?~!31?@@AACGGOO!3_!33?!6@!5A!4C!7G!5O!4_!156?~
+-~!326?~!10?!5Go!3?o!4GoK!36?~!112?~!43?!4@AC!5GOO__!49?!9@!7A!4C!12G!6O!8_!110?~
+-~!326?N!6G!3?E!5HN!3?b!4C~!37?~!112?~!58?!7@AA!5C!7GOO!4_!68?!13@!9A!9C!18G!9O!11_!41?~
+-~!347?!4@!38?~!112?~!85?!12@!4A!7C!11G!9O!9_!126?~
+-~!351?_!7?!5_!7?_!17?~!112?~!137?!20@!11A!13C!34G!9O!39?~
+-~!338?!7O!4?A@~!6?n!5On!3?{A@?@A{!14?~!112?~!263?~
+-~!349?GGNGG!4?F!5GF!3?@ACGCA@!14?F!112?F!263?~
+-~!38?W!4CGo!721?~
+-~!38?_OGCA@!30?!601_!91?~
+-~!38?!7@!721?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!182?__!3O!4G!3C!15A!5C!6GO!3_!542?~
+-~!173?_O!3GE!3@!42?!3@AA!3C!3GO__!528?~
+-~!166?oGGCA@@!65?!3@ACC!3Go!518?~
+-~!160?oGGE@@!82?!3@AAC!3GOO_!506?~
+-~!39?CA~!75?!9_!28?_OGE@@!100?!3@AAC!3GOO_!183?!8_!303?~
+-~!39?OO^OO!30?w!33GwGGKI!4H!9G!8H!5I!6K!4GggWKIH!9G!11g!16W!81G!3HIIK!3GWW!3g!109G!3g!5W!10G!6K!8I!28H!8G!37H!11I!12K!31G!75W!46G!91?~
+-~!74?~!28?_WCA@!25?!3_!3O!6GcSKB!3A!12@!122?!3@!3AC!6GOO!4_!56?!4_!5O!9G!3C!4A!9@!371?~
+-~!74?~!25?_WE@!16?__O!3GCCAAB@@!8?_WE@!160?!8@!6A!24C!7A!11@!405?~
+-~!74?~!23?wE@!12?oGGCAA@!17?oGE@!625?~
+-~!74?~!20?_WF!9?oGGE@@!20?oGCB!629?~
+-~!74?~!19?wF!5?_OGE@@!23?wE@!633?~
+-~!74?~!17?{B!3?_WCA@!24?_OKB!636?~
+-~!74?~!15?_]@_OKA@!24?_OKB!640?~
+-~!74?~!14?{bWE@!25?oKA@!643?~
+-~!74?~!12?_}F@!24?_WE@!647?~
+-~!74?~!10?_{B!23?oGE@!651?~
+-~!74?~!8?ok^@!20?oGCB!655?~
+-~!74?~!6?oM|B!17?_OKA@!659?~
+-~!74?~!4?oNoN!13?__WCCB!664?~
+-~!74?~??oKrN!9?__WGKB!670?~
+-~!74?~okZE@?__O!3GCCB!676?~
+-~!37?!638@!91?~
+-~!600?!3Gw!3G!6?W!56?GO_!93?~
+-~!603?~!8?A}!6?{ACWCA{!3?{!5Q[!13?!7C!3?!7C!5?_PIC!90?~
+-~!75?!3C{!3C!46?K!28?{!17?{!5Cw!421?B!7?AABAA!4?B!5?B!3?@!5A!34?A@!94?~
+-~!78?~!7?~A!3@A!3?o!5H}!3?~A!4@}!3?E!5Ho!5?@~!6?}!5HM!3?~A!4@}!3?@@~@@_!14?~AEIQa@!3?}!5HM!3?E!5Ho!3?~}!4@}!3?}!5@}!3?~A!4@}!3?E!5Ho!3?}!5HM!514?~
+-~!78?@!7?@!9?!6@!3?@!5?@!4?!5@!5?!5@!5?!5@!4?@!5?@!6?@@!15?@!5?@!4?!5@!5?!5@!4?N?!4@!5?!5@!4?@!5?@!4?!5@!5?!5@!515?~
+-F!766CF
+\
+
+›7 I
+›1834d›10m›607`¡½»Éƹ›13aÒä›19a±½ÇɵÀ›12aÔÔÏ›13a®·Æ¹¹Â›14a}ÉÁÄ›14aÄƽ›99aÍ›14aȼ¹›13auE:K@>5BLYYT›12a|ÃÁÁµÂ¸
+›1834d›1383`ȹ¸›13a¶
+›1962d›15m›1250`O
+›1971d›1033`Â
+›1978d›10m›607`˽ÀÀ›15a·ÃÁÁ¹Â·¹›17a˽ȼ›16aé›36a0]kTkUJÝ›185aȽ»›16a˽ȼ›15aȼ¹›17añÇÁµÀÀï›14a·ÃÁÁµÂ¸Çá
+›1978d›1285`ºÃÆ›15aÄƽÂ
+›1985d›15m›1046`Á
+›2027d›706`Â
+›2034d›10m›607`µÂ¸›13aé›36a0]kTkVJÝ›11aºÃÆ›12aÉǹ›12a˽ȼ›12aȼ¹›12añÀµÆ»¹ï›11aÊ›288aè›12aºÃÆ›12aºÉÆȼ¹Æ›12a¸¹Èµ½ÀÇâ
+›2034d›1429`¹ÆǽÃÂÇå›12aǹ¹›13açÐÏ
+›2041d›15m›719`Á
+›2182d›12m›607`±¹²¹°›52afhkl›17af§v¦}~x¨
+›2277d›10m›607`¯¼µÂ¿Ç›11aÈÛ10aȼ¹›10a»Ã›1aÛ1a¸›11aÃǛ10aú›10a®ÅÂâ›11a§¸Æâ›11a¥Ã¼Â›14m›73a££¨««›10m›187aÈ›11aÛ10aѨ~®~
+›2277d›14m›1473`u}›10m›140aá›11aµ›10aÇÈɸ¹Â
+›2334d›607`·ÃÉÆǹ›12aµÈ›12a­¨|®á›10aµ›12aÄÆûƵÁ›11aÞ')./MH2)7ß›10a½Ç›12aÂÛ65aÊ›228a¼›12a˽ÀÀ›10a·Ã›22a¹ÆÈ
+›2334d›1519`Ë›11aµ›20aµ½Àµ¶À¹›11a˼½·›185aÊ
+›2390d›607`ȼ¹›18aÁ¹ÈµìÀ¹›17aÞ2!5$1!ß›15aÃÉÈÄÉÈ›18aú›17a¢¤©ª›17aÈÛ17aµ›17aÇɽȵ¶À¹›17aǽ̹À›17a¸ÉÁÄá›18aƹµ¸Í›17aºÃÆ
+›2431d›15m›1438`P
+›2447d›10m›607`½Â·ÀÉǽÛ10a½Â›11aÍ›251aÈ›11a˽ȼ›10aȼ¹›11au@BGH›30a·ÃÁÁµÂ¸â›18a¯¼¹›11au@BGH›10a·ÃÁÁµÂ¸
+›2447d›864`ÃÉÆ›10a¸Ã›1a·ÉÁ¹Â
+›2503d›607`ȵ¿›458aÉÇä
+›2503d›671`¹Ç›15aȼƹ¹›15aĵƵÁ¹È¹ÆÇá›14aȼ
+›2616d›630`u@BGHc›15m*›14m6)$3(›15m›3a+›10mg›15m*›14m(%)'(3›15m›4a+›10mdv›15m*›14m:+%-!,%›15m›1a+›10mw
+›2729d›607`˼¹Æ¹›18aȼ¹›15m›19a*›14m6)$3(›15m›3a+›10m›18aµÂ¸›15m›18a*›14m(%)'(3›15m›5a+›10m›17aµÆ¹›18a¹ÌÄƹÇǹ¸›19a½Â›17aȹÆÁÇ›18aú›17aȼ¹›14m›18aifblmjd›10m›62aʽð
+›2729d›2006`¹Â
+›2786d›607`ÆÃÂÁ¹Â›188aÈ›15auNGBME>G@MA›232a¹›16aµÂ›15aµÄÄÆÃÄƽµÈ¹ÀÍ›14aǽι¸›16aµÆ¹µ›15aú
+›2786d›755`ÈÝÇ›15a·ÉÆƹ›296aá›14aµÂ¸›15aƹǹÆÊ
+›2842d›607`ȼ¹›14aĵ»¹›14aºÃÆ›13aȼ¹›14a½Â·Àɸ¹¸›15a½Áµ»¹â›19a¯¼¹›14a')./MH2)7›414aȹ¸›15a½Â
+›2842d›1585`ÄÆûƵÁ›12a½Ç›14a¸Ã›1a·ÉÁ¹Â
+›2899d›607`µÄÄ›1a¹Â¸½Ì›16a}â
+›2984d›14m›659`ä
+›2993d›15m›676`Â
+›3000d›11m›726`²¥°²¥³¥®›267a¨¡²¡£´¥²
+›3000d›863`´³›14a´¨¥›13aË¥³£¡°›1a¥Â›13a£
+›3007d›15m›690`Á
+›3030d›14m›659`å
+›3046d›11m›676`n¬³¯›13a¤¥Í®¥¤›14a©®›13a´¨¥›13m›152aD›11m›40a¹¬¥›13a¯°´©¯®
+›3046d›13m›1006`<C7B=>9›11m›30a³´
+›1;607;2956;2;598!|
+
+
+›462d›10m›1921`Ø
+›607d›13m›449`ß›70a¶ÏÑË×›23aÃ×ËÊ›22aÇÓÊ›24a·ËÓËÖÇØËÊ›22aÈ›109aĹØÔº¼Üß
+›607d›1393`Û›24a´
+›712d›449`¨¬¦›56aitq›14m›18a÷çðé›13m›18a^uvq
+›794d›14m›1388`}
+›800d›10m›1338`Í›14a§›5a¯›219aȵ½ÂÇ›13aȼ¹›14a·ÃÁð
+›800d›449`¯¼½Ç›14aìÀ¹á›13aµÇ›14aµÀƹµ¸Í›13a¹ÌÄÀµ½Â¹¸á›13a½Ç›14a»¹Â¹ÆµÈ¹¸›13a¶›121a³›13aµÂ¸›14a·ÃÂ
+›814d›1434`~
+›856d›678`ÍÄ›1a¹Ç¹È›20aȼ¹›21a¹Â›265aÈå›23a½ÈÇ›20a¸¹Ê½·¹ð½Â¸¹Ä›1a¹Â¸›1a¹Â›228aè
+›856d›449`ÁµÂ¸Ç›21aÈÛ21aÈ›273aȽƹ›21a¸Ã›1a·ÉÁ¹Â›483aÈ›22aºÃÆÁµÈ›20açÒ
+›913d›449`Á¹µÂÇ›19aȼµÈ›19a½È›18a·µÂ›19a¶›1a¹›20aÄÆÛ1a·¹Çǹ¸›20a¶›188aÈ›14m›51a_Vlh›13mö›8aö›8aö›10m›24aÄÆûƵÁÇ›18aÈÛ18aÄ›1a¹ÆÁ½È
+›913d›1129`Í›18a¸½ë¹Æ¹Â›14m›36aR
+›969d›10m›689`Í›14a¸½ë¹Æ¹Â›983aȹÆÇá
+›969d›449`¸Æ½Ê½Â»›14aÁµÂ›184aÈ›13aÃÉÈÄÉÈ›14a¸¹Ê½·¹Çá›15aºÆÃÁ›14a±}°Ç›14aµÂ¸›14a¸ÃÈðÁµÈƽ̛13aÄƽÂ
+›1025d›449`˽ȼ›20aÀÛ724aȹÆÇá›21a˽ȼ›20aƹÇÃÀÉȽÃÂÇ›19aÞÉÇɵÀÀÍß
+›1025d›593`˽Ǽ›20aƹÇÃÀÉȽÃÂÇá›20aȼÆÃÉ»¼›20aÀµÇ¹Æ›20aÄƽÂ
+›1082d›449`ú›22aÒÏÏ›21a¸ÃÈÇ›21aÄ›1a¹Æ›22a½Â·›138aÈ›20aÉÄ›23aÈÛ21aļÃÈÃðÈ›503a¼›21a¼µ›22a¹
+›1082d›846`¼á›23aƽ»¼›318aÍÄ›1a¹Ç¹ÈȹÆÇá›22aÇÃÁ¹›21aú›22a˼½·›92aÊ
+›1120d›15m›839`H
+›1138d›10m›449`ƹÇÃÀÉȽÃÂÇ›14aú›15aÔáÒÒÒ›277a¼Û
+›1138d›875`¸ÃÈÇ›15aÄ›1a¹Æ›16a½Â·
+›1153d›15m›839`J
+›1265d›13m›449`¨¬§›56aitq›14m›18a÷êëö›13m›18a^uvq
+›1353d›10m›893`Í›13aȼ¹›13a$5),.TW›11a·ÃÁÁµÂ¸å›13aȼ¹›13aìÀ¹›14m›13a-!,%›10m›16a½Ç›12aȼ¹›13aǵÁ¹›12aµÇ
+›1353d›449`¯¼½Ç›13aìÀ¹›12a½Ç›13a»¹Â¹ÆµÈ¹¸›12a¶
+›1409d›449`ȼµÈ›15aÇÄ›1a¹·½ì¹¸›16aºÃÆ›15aȼ¹›15ah$5)›14aìÀ¹â›20a¯¼¹Ç¹›16ah,.W›479aɸƹ¸Ç
+›1409d›1322`ìÀ¹Ç›15aȹ¸›16aÈÛ14a¶›1a¹›16aÀµÆ»¹›14aÞ¼
+›1466d›449`ú›15a¶ÀÛ1a·›504a¹Æ›15aµÂ›124aÈ›15a½Â›15a¿›444aȽ»
+›1466d›582`¿Ç›15aÀûßá›14aµÂ¸›16aȼ¹Æ¹›15a½Ç›15a¹ʛ99aÍ›15aÄ›1aý›108a¹¹Ä½Â»›15aȼ¹Á›15aµºÈ¹Æ›15aÄƽÂ
+›1506d›15m›1509`HG
+›1522d›10m›449`ÞÉÂÀ¹ÇÇ›17aÍ›95aµÂ›170aÈ›16aºÉÆȼ¹Æ›17a·ÃĽ¹Ç›16a½ÁÁ¹¸½µÈ¹ÀÍ›36aßâ›24a¤È›17a½Ç›16aµ›17a»Ã›1aÛ1a¸›16a½¸¹µá
+›1522d›626`ÃÉ›16aË›46aÈ›16aÈÛ16aÄƽÂ
+›1579d›449`ȼ¹Æ¹ºÃƹá›13aÈÛ13a¸¹À¹È¹›13aÇÉ·›890a¿ÀÍ›13a·ÃÂð
+›1579d›896`¼›13aìÀ¹Ç›13aµÇ›13aÇÛ1aÛ13aµÇ›13aÄ›1aÃÇǽ¶À¹á›12aǽ·¹›14aȼ¹Í›13a·µÂ›13aÅɽ·
+›1635d›449`ÇÉÁ¹›14aÍ›563aµ›104aÍ›14aÇÄ›1a¹·½ºÍ½Â»›14aȼ¹›14ai$%,%3%›12aÅɵÀ½ì¹Æ
+›1635d›587`ÃÉÆ›14a¸½Ç¿›13aÅÉÃȵå›13aȼ¹›14a¹µÇ½¹ÇÈ›13aË›21aÍ›13a½Ç›13a¶
+›1692d›449`Û16aȼ¹›15a¹Â¸›16aú›14aȼ¹›16a3%701).3›14a·ÃÁÁµÂ¸›15aÀ½Â¹â
+›1749d›520`¯¼¹›19ai/43043›258aÍ›18a¶›1a¹›20aÉǹ¸›20aÈÛ18a»½Ê›549aÈ
+›1749d›803`ÅɵÀ½ì¹Æ›19aÁµ›333a¹›18aȼ½Ç›19aÃÉÈÄÉÈ›19aìÀ¹›19aµ›19a¸½ë¹Æ¹Â
+›1805d›449`ìÀ¹›18aÇÄ›1a¹·½ì·µÈ½ÃÂå›18aȼ½Ç›16aÁµ›290aÊ›606a¼›17a½Ç
+›1805d›950`Í›17a¶›1a¹›18aÉǹ¸›18aÈÛ17aÛ22a¹Æƽ¸¹›16aȼ¹›18a¸¹ºµÉÀÈ›16aµ·È½ÃÂá›17a˼½·
+›1862d›449`ÈÛ15a·Æ¹µÈ¹›14aȼ¹›15aìÀ¹›15a½Â›15aȼ¹›15a·ÉÆƹ›207aá›14a˽ȼ›14aìÀ¹›15a¹ÌȹÂǽÛ15aéh,.WÝ›14aµÂ¸›15aȼ¹
+›1862d›1045`È›15a¸½Æ¹·ÈÃÆÍ
+›1918d›449`ǵÁ¹›15aµÁ¹›14aµÇ›14aȼ¹›15aµ·ÈɵÀ›13ah$5)›317aÉÇ›14aȼ¹›15aÅɵÀ½ì¹Æ›14a·ÃÉÀ¸›14a¶›1a¹›15aÉǹ¸
+›1918d›1061`ìÀ¹›15aÃÄ›1a¹Â¹¸â›21a¯¼
+›1975d›566`¹ÆÈ›14aȼ¹›16aÃÉÈÄÉÈ›15aÈÛ14aµ›15aǷƵȷ›208a¼›16aµÇ›15aÞ$)2+›16a2#1!3#(jßâ
+›1975d›449`ÈÛ15a¸½Ê›506a¼›15a¸½Ç¿á›14aÇÉ·
+›2032d›1201`Ƚù¸›15a½Â›15aǹ·È½Ã›15aÐâÒá›15a¶›85aËÂÀõ¸½Â»
+›2032d›520`¯¼½Ç›15aìÀ¹›16aÇȵÆÈÇ›14aÃëá›14aµÇ›15aµÀƹµ¸Í›15aÁ¹Â›454aÍ›15a¸Ã
+›2073d›15m›659`HH
+›2089d›10m›449`ȼ¹›12m›19aÜßìãÝæ›10m›415a¼µÆµ·È¹ÆÇ›17aÈÛ18aȼ¹›18a§©ÏÒÝÇ›18aºÃ›191aâ›29a¯¼¹
+›2089d›714`ú›18aȼ¹›18a¹·¹ÇǵÆÍ›19a·›557aÈ›17aÁ¹ÁÃÆÍ
+›2145d›449`ºÃÆÁµÈ›14aú›15aȼ½Ç›15aĵÆÈ›14aú›15aȼ¹›15aìÀ¹›16a·ÃºÃÆÁÇ›14aÈÛ15a}~|›14aÇȵ¸µÆ¸›15aÐ×Ï›14açÐÐèâ
+›2272d›13m›449`¨¬¨›56aitq›14m›18a÷ïòí›13m›18a^uvq
+›2354d›14m›1774`}
+›2360d›10m›449`¯¼½Ç›21aìÀ¹›21a½Ç›14m›53a_VlhXYpq›10m›154aµÀ¹Â›575aÍ›21a§›5a¯›18a³å›21a½È
+›2360d›14m›690`R›10m›184aÝÇ›20a¹Åɽʛ77aÈ›20aú›21aȼ¹›21aÀû›21aìÀ¹›21a»¹Â¹ÆµÈ¹¸›21a¶
+›2374d›1820`~
+›2416d›516`ȵ½ÂÇ›18aµÀÀ›18aȼ¹›19aÃÉÈÄÉÈ›19aÞ˽ȼ›18aÇÃÁ¹›19a¸½ë¹Æ¹Â·¹Ç›19aú›18aºÃÆÁµÈß›18aȼµÈ›14m›50a_VlhXYpq
+›2416d›10m›449`·Ã›14m›1211aR
+›2473d›10m›511`È›11aÈÛ9aÍ›517aÈ›10aÀõ¸Çá›14m›10a%3#›10m›3aß›10aµÂ¸›10aÇÃÁ¹›10aºÉÆȼ¹Æ›11a½ÂºÃÆÁµÈ½ÃÂ
+›2473d›449`ǹ›101aÃÉÆ›10aȹÆÁ½ÂµÀ›9aÞ¸¹Èµ½ÀÇ›9aú›10aºÃÂ
+›2529d›1576`¼›18aĵ»¹â›27azÇÇÉÁ½Â»
+›2529d›449`ƹ»µÆ¸½Â»›17aȼ¹›18a˼¹Æ¹µ¶›1aÃÉÈÇ›18a½Â›17aȼ¹›18aìÀ¹›18aú›17aȼ¹›18aÇȵÆÈ›16aú›17a¹µ·
+›2585d›816`È›22aÄƽ›308aá›21aȼ¹Æ¹›22a½Ç›22aÂÛ21aÄ›1aý›122a¹¹Ä½Â»›22aȼ¹
+›2585d›449`ȼµÈ›22aȼ¹›22a¸Ã›1a·ÉÁ¹Â›119aÈÇ›21aǵȽǺµ·ÈÃƽÀÍ›361aÈ›22a½Â›22a¿
+›2642d›449`h380›18aìÀ¹á›19aµÂ¸›18aÇÛ18a½È›18aǼÃÉÀ¸›18a¶›1a¹›19a¸¹À¹È¹¸›18aµÇ›18aÇÛ1aÛ18aµÇ›18aÄ›1aÃÇǽ¶À¹å›20a¼Ã›31a¹Ê›135aÃÉ
+›2642d›1685`Ë›42a¹Æá›17a½º›18aÍ
+›2698d›564`¹›22aȼµÈ›14m›53a_VlhXYpq›10m›165aʽ»›22aµÂÃÁµÀÃÉÇÀÍ›194a¹¹Ä›22aȼ½Ç›21aìÀ¹›21aÈÃ
+›2698d›449`¶›1a¹À½¹Ê›14m›146aR›10m›204a½Ç›21a¶›1a¹¼µ›350aá›21aÄÀ¹µÇ¹›22a¿
+›2755d›514`Ë›15m›15a*›14m›19a.-3!#3-!,%›15m›3a+›10mâ
+›2755d›449`ǼÛ14m›65a#
+›2812d›10m›866`ʽÃÉÆ›19aú›14m›50a_VlhXYpq›10m›495aʽ¸½Â»›18aÂÃ
+›2812d›520`¯¼¹›19a¸¹ºµÉÀÈ›18a¶›1a¹¼µ›14m›176aR›10m›202a½Ç›18aÈÛ18a¸¹À¹È¹›19aȼ½Ç›18aìÀ¹›19aÄÆÃ
+›2869d›449`Á¹Çǵ»¹Ç›16aË›269aË›42a¹Æá›16a½º›16aµÂ›71aµÆ½»›15aÃÆ›16a¹ÆÆÃÆ›15aÁ¹Çǵ»¹Ç›14m›84a%›10m›20aÄÆÃð
+›2869d›675`¹Æ¹›16a½ÇÇɹ¸å›17a¼Ã›31a¹Ê›156aÍ›16aË›14m›504a6%1
+›2939d›486`ÝÜ
+›2955d›11m›564`¥®›13a´¨©³›12a©³›12a´¯›13a¢›1a¥›13a¤¥°²¥£¡´¥¤È›13a°¨¯´¯›1a£¯°›255a¨¥¡°›1a¥²Å›13a¡®¤›13a¤¯›1a¥³®Â´›13a´©¥›12aµ°›13a´¨¥
+›2955d›519`r¶›617a¹©®§›15a©³›12a¦¡³´¥²Å›12a£
+›3000d›516`´¥²›14a±µ¥µ¥Æ
+›3000d›449`°²©®
+›3030d›14m›486`ÝÝ
+›3046d›11m›519`³¥¥›13a§¬¯³³¡²¹
+›1;449;2910;2;598!|
+›1;1496;1973;2;15!|
+›1;839;1125;2;18!|
+
+
+›462d›10m›607`ÐÏ›12m›326að›45aÄÇÈÃÏ›16aÑÏÛ15a¿Ê›15aÅÃÊÃο›224aÒÇÐËÈÊíð
+›462d›1647`ÐÛ14aÀÕ›15aÂ
+›607d›10m›1518`â›30a¯¼¹›19ai,/'›258aÍ›19a¶›1a¹
+›607d›607`¸É·¹¸á›21aȼ¹›19aìÀ¹›20a˽ÀÀ›17a¶›1a¹›20aƹȵ½Â¹¸›19aµÉÈÃÁµÈ½·µÀÀÍ›247aÅɵÀ½ì¹Æ›18aÁµ
+›664d›1022`ȽÛ19aú›19aȼ¹›20ah380›179aÊ›104aá›20aȼ¹›20ai./,/'›19aÅɵÀ½ì¹Æ
+›664d›607`Éǹ¸›21aÈÛ19a¹ÂÇÉƹ›20aƹȹ›351aìÀ¹å›22a·Ã›22a¹ÆǹÀÍ
+›720d›607`˽ÀÀ›14m›14a-%5%1›10m›43a¹¹Ä›15aȼ¹›15aìÀ¹â
+›720d›821`¿
+›777d›678`¯¼¹›20ai,/'›20aÅɵÀ½ì¹Æ›19aÁµ›325a¹›20aµ›20aìÀ¹›20aÇÄ›1a¹·½ì·µÈ½Ã›20aÈÛ19aÛ22a¹Æƽ¸¹
+›777d›1132`Í›20aÃÄȽõÀÀÍ›18aȵ¿›506aÊ
+›834d›607`ĵÆÈ›15aÃÆ›14aµÀÀ›14aú›15aȼ¹›15a¸¹ºµÉÀÈ›15aÇÄ›1a¹·½ì·µÈ½Ã›15aºÃÆ›15aȼ¹›15aÀû›14aìÀ¹å›15a½º›15aȼ½Ç›14a½Ç›15aÉǹ¸á›15aȼ¹›15aìÀ¹
+›890d›607`˽ÀÀ›14aµÀË›21aÍÇ›13a¶›1a¹›16aƹȵ½Â¹¸â
+›890d›761`µ
+›1015d›12m›607`²¹²¹°›52aq}z›10m›18ai5%1"/2%›12m›16anªv¢~½z§
+›1103d›10m›607`}Éƽ»›13aÃÄ›1a¹ÆµÈ½ÃÂá›13aȼ¹›13aÄÆûƵÁ›13aƹě1aÃÆÈÇ›13aÛ13aȼ¹›14aȹÆÁ½ÂµÀ›12aȼ¹›14aºÉÀÀ›13aÇÄ›1a¹·½ì·µÈ½ÃÂ
+›1159d›607`ú›18aµÀÀ›17aìÀ¹Ç›18aƹµ¸›18aÞȼ¹›18a½ÂÄÉÈ›18ah$5)›233aÍ›18aǽ̹À›17aìÀ¹Ç›18a½Â·Àɸ¹¸›19aȼÆÃÉ»¼›18aµ
+›1159d›1263`ìÀ¹›18aµÂ¸›19aµÂ
+›1216d›607`uLI><B:E›20a·ÃÁÁµÂ¸ßâ›37a¤Â›21aµ¸¸½È½ÃÂá›21aºÃÆ›20a¹µ·›106aÈ›21aÇÄ›1a¹·½ì¹¸á›23a½È›20aƹě1aÃÆÈÇ›20aȼ¹
+›1216d›1477`¼›21aºÃÂ
+›1272d›607`µÁ¹›15aú›15aȼ¹›15aºÃ›553aË›15aÁµÂ›61aÍȹǛ15aË›119aËÂÀõ¸¹¸
+›1272d›919`Èá›14aȼ¹›15aÁµ»Â½ì·µÈ½ÃÂá›14aµÂ¸›15a¼Ã›132aÍ›14a¶›126a¹Æ¹›15a¸Ã
+›1329d›607`ÈÛ10aȼ¹›11aÄƽ›285aÈâ›18a¡›636aÉÁ›146aÍȹÇ
+›1329d›812`ȹƛ10aºÃÆ›10aȼµÈ›10aºÃ›74aÉÆȼ¹ÆÁÃƹá›10a½È›10aƹě1aÃÆÈÇ›11aȼ¹›10aÈÃȵÀ›9a›61a¶›1a¹Æ›12aú›10a¶
+›1385d›607`¸Ã›488aÈÇ›18aÄƽ›134aÛ19aƹµÇÇÉƹ›19aÉǹÆÇ›19aȼµÈ›18aȼ¹›19aÄÆûƵÁ
+›1385d›654`ËÂÀõ¸¹¸›19aºÃÆ›18aµÀÀ›18aȼ¹›19aºÃ›133aȹ¸â›30a¯
+›1442d›1259`¹ÆÍ›18aÀµÆ»¹›17a½ÂÄÉÈ›19aìÀ¹á›18a½È›18aµÀÇÛ17a½Â¸½·µÈ¹Ç›18a˼µÈ
+›1442d›607`¼µÇÂÝÈ›18a¸½¹¸›19a½º›17a½ÈÝÇ›18aÄÆÛ1a·¹Çǽ»›18aµ›18aÊ
+›1498d›1158`¼¹¸›18a˼½ÀÇÈ›16a츽»›17aȼ¹›18a½Â½È½µÀ›15aÇȵÆȽ»›15aĵ»¹›17aµÂ¸
+›1498d›607`Çȵ»¹›17aú›16aÄÆÛ1a·¹Çǽ»›17a½ÈÝÇ›16aƹµ·
+›1554d›950`¼›15a»ÀÍļǛ15aµÆ¹›15a½Áµ»¹¸›14aºÆÃÁ›15a¹µ·›100aÈâ
+›1554d›607`¸¹È¹ÆÁ½Â½Â»›15a˼½·›584a¼›15aºÃÂ
+›1612d›805`¼›14aĵ»¹›13aú›13a¯›17a³›14aÃÉÈÄÉÈ›13a½Ç›13aÄÆÛ1a·¹Çǹ¸á›14aȼ¹›13a·Ã›61aÈÇ›13aú›13a¯›18a³ÝÇ›13au<HNGMT
+›1612d›678`zÇ›13a¹µ·›839aȹÂ
+›1622d›1023`~›777a~
+›1668d›607`ÈÛ21au<HNGM]›506aË›320a¿›134aȽƹÀÍ›20aµÂµÀÃð
+›1668d›857`ƹ»½ÇȹÆÇ›20aµÆ¹›21aÃÉÈÄÉÈ›21a¶›1a¹È›31a¹¹Â›22aÇÅɵƹ›21a¶Æµ·›22a¹ÈÇá›22a¹Â
+›1725d›607`»ÃÉÇÀÍ›15aÈÛ14a¯›18a³ÝÇ›14aÛ165aʽÃÉÆâ
+›1725d›955`Ë›15a¶›1a¹¼µ
+›1735d›828`~
+›1782d›1306`É·›254aÍ›13aÇÄ›1a¹·½ºÍ½Â»›12ai./5%1"/2%á
+›1782d›678`®ÃÁ¹›12aÉǹÆÇãǽȹǛ12a츛14aȼ½Ç›12aÈÛ1aÛ12aÁ›43a¼›12aºÃÆ›12aȼ¹Áå›13a¶
+›1838d›607`¹½È¼¹Æ›24a¹ÌÄÀ½·½ÈÀÍ›22aÛ24aȼ¹›23a·ÃÁÁµÂ¸›24aÀ½Â¹á›25aÃÆ›23a¶›144aʽ»›23aȼ¹›24aÀ½Â¹›23aƹµ¸½Â»
+›1838d›1521`Í›23aƹÁÃ
+›1895d›607`=>?:NEM›22aºÃÆ›22aȼ½Ç›22aÅɵÀ½ì¹Æ›22a½Â›23aȼ¹›22a·ÃÁÁµÂ¸ðÀµÂ»Éµ»¹›22a¸¹ì½ȽÛ23ah#,$›22aìÀ¹á
+›1951d›835`Í›14aú›16aȼ½Ç›16aÃÉÈÄÉÈ›16a·µÂ›16a¶›1a¹›17aÇÉÄÄƹÇǹ¸ä›23aÃÂÀÍ›16aȼ¹›16aµÁ¹›16aú›16aȼ¹›17a½ÂÄÉÈ
+›1951d›607`ȼ¹›17aÁµ›3a¾ÃƽÈ
+›2008d›919`ËÂÀõ¸›12aµÂ¸›13a½Â¸½Ê½¸ÉµÀ›11aĵ»¹›13a›61a¶›1a¹Æ›12aÁ¹Çǵ»¹Ç›12a˽ÀÀ›12a¶›1a¹›13aÃÉÈÄÉÈ
+›2008d›607`ìÀ¹á›13aȼ¹›12aÈÃȵÀ›11a¸Ã›577aÉÁ
+›2064d›1157`ȹƹ¸ßâ
+›2064d›607`ÞÉÂÀ¹ÇÇ›15aµ›15aÄÆöÀ¹Á›15a½Ç›15a¹Â·ÃÉÂ
+›2191d›13m›607`¨¬©›56a^›52a}›19a^uvq|›18agqmp›19an›87ak`}yac¥¨
+›2191d›765`yx›346a¤›18a\
+›2278d›10m›607`¡›98a¹ÆÍ›18a½Â¸½Ê½¸ÉµÀ›12m›79aç›10m›535aÈ›18aǽιï›18a½È›17a½Ç›18aÉǹ¸á›14m›52a_Vs
+›2278d›10m›633`ÃÆ›18a¹Ê›12m›296aÛâá›10m›17aá›18aÂÛ19aÁµÈȹƛ17aµÈ›18a˼µÈ›18añÄ›1aý›14m›365aR
+›2335d›607`lhXYpq›10m›16a¹¹¸Ç›17aÈÛ15aƹµ¸›16aȼ¹›16aƹÀ¹Ê›44aÈ›16ah3&-›16aìÀ¹á›16a˼½·›107aȵ½ÂÇ›15aȼ¹›16añ¯›17a³›16a¡›43aÈ
+›2335d›1219`µÂ›322a¼›16a·Ã›339aÃÂ
+›2345d›1936`~
+›2385d›14m›1534`}
+›2391d›10m›1202`Ê›260aÍ›12a§›5a¯›257aµÇ›12aÄÆÛ1a·¹Çǽ»
+›2391d›607`¨¹Èƽ·Çïâ›18a¯¼½Ç›13aìÀ¹›13a˽ÀÀ›11aµÀÇÛ12a¼µ›22a¹›13a¶›1a¹¹Â›14aƹµ¸›13a¶›119a³›13a˼¹Â›13a½È›13aË
+›2405d›1580`~
+›2448d›630`ÃÉÆ›15ah3%7›965aÈÇ›15a¼µ›22a¹›15aÂÃÈ›15a¶›1a¹¹Â
+›2448d›607`Í›192aÇÃÉÆ·¹á›15aµÂ¸›16a½Ç›16aƹµ¸›15aµ»µ½Â›15aÈÛ15a¹ÂÇÉƹ›17aȼµÈ›15aȼ¹›16aºÃ›97aÊ
+›2504d›607`ƹʽǹ¸á›15a˼½·›137aÈ›14aÃȼ¹Æ˽ǹ›14aÀ¹µ¸›15aÈÛ15a¹ÆÆùÃÉÇ›15aÃÉÈÄÉÈâ
+›2504d›863`¼›15aÁ½»¼
+›2562d›704`ÉÆȼ¹ÆÁÃƹá›22a¹Ê›229aÈ›14m›21a2)9%›10m›23aú›21a¹µ·›293aÈ›20aƹÅɽƹǛ21aµ›21aìÀ¹
+›2562d›678`¡›297a¹ÆÍ›21a¸½ë¹Æ¹Â›254a¼›22aǹĵƵȹ›21aºÃÂ
+›2618d›1064`¼µÆµ·È¹Æ›17añƵÇȹÆÇïá›16aºÃÆ›17a¹µ·›61a¼µÆµ·È¹ÆÝÇ›17a»ÀÍļâ›27a¯¼½Ç
+›2618d›607`¸¹Ç·Æ½¶½Â»›18aȼ¹›18aµ·ÈɵÀ›17a·›523a¼›18a·
+›2675d›806`›21aÞ›15m*›14m2)3%-!,%›15m›2a+›10mß›22aÉǹǛ22aĵ·›22a¹¸›23aÞh0+ß›21aºÃÆÁµÈ›21aºÃ›241a¼›22aǵ›22a¹
+›2675d›607`½ÂÇȵÀÀµÈ½Ã›487a¿›412aÈ›21aìÀ¹Çá›24a˼½·›86aÊ
+›2731d›692`Í›15aú›15aȼ¹›15aÐÏÏáÏÏÏ›14a¸½Ç¿›15a¶ÀÛ1a·›450aÍ›16a¯›17a³ÝÇ›15aÀ½¶ÆµÆ½¹Ç›14a˼¹Â
+›2731d›607`ÁµÂ›509a¿Ç›15aºÃÆÁ¹ÆÀÍ›14aÛ1a··ÉĽ¹¸›16a¶
+›2741d›1718`~
+›2787d›12m›607`ÚëãÖáÙÚÙ›18aãÞëÚß›16aåÖæçÚåæ›10m›17a½Â›16ah07,›16aìÀ¹Ç›16aË›333aË›42a¹Æá›14m›48a_VlhXYpq›10m›15a½Ç
+›2787d›1363`¹Æ¹›17aȼ¹›16aÂÃÆÁå›16a¼Ã›31a¹Ê›14m›66aR
+›2844d›10m›1507`È›15aìÀ¹â
+›2844d›607`·µÄµ¶À¹›15aú›15aÉǽ»›15a¹½È¼¹Æ›15aÞÃÆ›14a¶›1aÃȼߛ15aºÃÆÁÇ›15aú›14aºÃÂ
+›2885d›15m›1616`HI
+›2901d›10m›751`ÃÉÆ›20a¸Ã›1a·ÉÁ¹Â›306aÍ›12m›234açæ›10m›38aá›21aȼ¹Â›14m›53a_VlhXYpq›10m›19a˽ÀÀ
+›2901d›678`¤º›20aÍ›261aÈ›21aƹº¹Æ¹Â·¹¸›21aµÂ›12m›43aéÞåçèÖß›19aÛâá›14m›216aR
+›2958d›10m›607`¹¹¸›21aÈÛ20aƹµ¸›21aȼ¹›20aµÇÇÛ1a·½µÈ¹¸›20ah5&›209aèå›23aȼ¹›20aÀµÈȹƛ19aÇÄ›1a¹·½ì¹Ç›22a¼Ã›113a¼
+›2958d›1283`ìÀ¹ÞÇß›19açÐÑ›489aË›19a¹µ·
+›3030d›14m›644`ÝÞ
+›3046d›11m›676`³¥¥›13a§¬¯³³¡²¹
+›1;607;3001;2;598!|
+›1;479;1054;1010;8!|
+
+
+›462d›12m›449`ðôñ›45aÄ›43aç›14aÄÞßÚæ›15aÎÚÖÙ›14a×›73aÒÇçâÈÊíð›10m›718aÐÐ
+›462d›12m›579`âá›280aì›16aÂ
+›607d›10m›449`·›370aÈ›14a½Ç›15aÈÛ14a¶›1a¹›15a½Áµ»¹¸á›14a˼½·›137aÈ›14a½Â›15aÈÉÆ›14aƹÅɽƹ›15aƹº¹Æ¹Â·¹
+›607d›468`¼µÆµ·È¹Æ›15a½Â›14aȼ¹›15aºÃ›452a¼›15aÁ½»¼
+›664d›449`ÈÛ17aÃȼ¹Æ›17aƹµÀ›17aÃÆ›17aʽÆÈɵÀ›16aºÃ›170a¹Â›18aȼ¹›14m›18a2!,%›10m›81aÈå›18aʽÆÈɵÀ›16aºÃ›111aÍ›17a¶›1a¹
+›664d›988`ÈÇ›17aÞÃÆ›16a¹Ê›263aºÃ›259aÈÇ›16aÁµ
+›720d›604`¹Ûß
+›720d›449`ƹ·ÉÆǽÊ
+›838d›12m›449`²¹³¹°›52ac~§zx©¥§®›16a{¥§›18aq›19au›17ae›50a©›17ajz©§~x¨›16ae~¢z¨
+›838d›1068`¥¤
+›848d›954`d
+›923d›10m›449`¯¼¹›17a¯›18a³›17a¡›43aÈ›16a¨¹Èƽ·Ç›16aìÀ¹Ç›16aÞh3&-›69aè›17aµÆ¹›16aƹµ¸›17a¶›199a¶›1a¹ÆÇ›17aú›16aȼ¹›17a¯›18a³
+›923d›672`Û404aß›16açÓ›233aÍ›16aµÀÀ›16aÁ¹Á
+›933d›569`~›1284a~
+›980d›449`ºµÁ½ÀÍ›239aÍ›19aÁµÂ›76a±¤›19aÄÆÛ1a·¹Çǽ»›19aÄÆûƵÁÇá›18a½Â·Àɸ½Â»›14m›51a_VlhXYpq
+›980d›10m›570`á›19aµÂ¸›19aµÀÇÛ18a¶›127aÍ›19a}›14m›709aR
+›1036d›10m›449`µÂ¸›14m›22aR›78a_R^›10m›208a¹›21aȼ¹Ç¹›22aÃȼ¹Æ›21aÄÆûƵÁÇá›14m›54a_VlhXYpq›10m›21a¹¹¸Ç›22aÈÛ21a¶›1a¹
+›1036d›14m›576`_Vlh›10m›91aâ›40a¥ÉÇÈ›22aÀ½¿›14m›509aR
+›1093d›10m›449`µ¶À¹›23aÈÛ22aƹµ¸›23aȼ¹Ç¹›23aìÀ¹Çå›26aȼ¹›22aÄÆûƵÁ›22a½Ç›22aÈÃÀ¸›22a˼¹Æ¹›23aÈÛ22aÀÛ1aÿ›22aȼÆÃÉ»¼›23aȼ¹
+›1149d›449`i3&-t$)1%#3/18›476aÊ›635aÍ
+›1149d›804`ÅɵÀ½ì¹Æâ›35a¯¼½Ç›21a˽ÀÀ›19a¼µ›22a¹›20a¶›1a¹¹Â›22aǹț20aÉÄ›21aµÇ›20aµÄÄÆÃÄƽµÈ¹›20a¶
+›1206d›472`ÃÉÆ›14a¯›882aÊ›130aµÀɹ›14a3%7t&/.32â
+›1206d›449`Í›129a³›14aµ¸Á½Â½ÇÈƵÈÃÆá›12aµÂ¸›14a˽ÀÀ›13aÁÃÇÈ›13aÄÆöµ¶ÀÍ›14a¼µ›22a¹›13aȼ¹›14aÊ
+›1216d›577`~
+›1262d›520`ªÆ¸½ÂµÆÍ›15aÉǹÆÇ›16aǼÃÉÀ¸›12m›95az§›10m›14a¼µ›22a¹›15aµÂ›259aÈ›15aÈÛ15aÉǹ›15aȼ½Ç›15aÅɵÀ½ì¹Æ
+›1262d›12m›975`¤z«›10m›106aÊ›81aÍ›16aƹÅɽƹÁ¹Â
+›1319d›449`Û14a·ÃÁÁµÂ¸›14aÀ½Â¹Çá›14a¶ÉÈ›14aǼÃÉÀ¸›14aÍ›108aÊ›538aÈ›13a˼¹Æ¹›15a½È
+›1319d›1081`ÃÉ›14a¼µ›22a¹›14aÇÃÁ¹›14aÄ›1a¹·ÉÀ½µÆ›14aƹÅɽƹÁ¹Â
+›1375d›449`½Ç›15a¹·¹ÇǵÆÍ›16aÈÛ14aƹµ¸›15aÂÃÂðÇȵ¸µÆ¸›15ah3&-›15aìÀ¹Çá›15aƹº¹Æ›15aÈÛ14aµÄÄ›1a¹Â¸½Ì›16a|â
+›1493d›12m›449`²¹³¹±›52ac~§zx©¥§~z¨›16a{¥§›10m›17ah0+›12m›17ae~¢z¨
+›1578d›10m›627`ÈÇ›15a½Â›16aÉǹ›17aµÈ›15m›16a*›14m2)3%-!,%›15m›2a+›10m›16aµÆ¹›16a½Â›16aȼ¹›17aĵ·›22a¹¸›16aºÃ›395a¼
+›1578d›449`¨ÃÇÈ›16aºÃ›749a¿›121aÈ›16aìÀ¹›16aºÃÆÁµÈå›15aµÀÀ›15aÇÉ·
+›1635d›449`ìÀ¹Ç›13aµÆ¹›11aÇÈÃƹ¸›12a¼¹Æ¹›13a½Â›12aȼ¹›12a¸½Æ¹·ÈÃÆÍ›11a3%7›17a1//3jn&/.32h0+oå›10aȼ¹›12m›12aÒÉÏ›10m›15aÀû½·µÀ
+›1691d›449`µÁ¹›13a3%7›17a0+›850aâ›19azÀÀ›11aÁµ»Â½ì·µÈ½ÃÂÇ
+›1691d›717`¼µÇ›12a¶›1a¹¹Â›14a¸¹ì¹¸›13aÈÛ12aƹº¹Æ¹Â·¹›13aȼ½Ç›12a¸½Æ¹·ÈÃÆÍ
+›1748d›449`ú›14aȼ¹›14aǵÁ¹›13aºÃ›971aȽµÈ¹¸›13aºÆÃÁ
+›1748d›750`È›13aµÄÄ›1a¹µÆ›14a½Â›14aȼ½Ç›13aǽ»À¹›13a¸½Æ¹·ÈÃÆÍå›14aȼ¹Í›13aµÆ¹›14a¸½ë¹Æ¹Â
+›1804d›449`¹µ·›187aÍ›18aȼ¹›18aìÀ¹›17aÈ›394a¼›17a·ÃÂǽÇÈÇ›17aú›17aµ›18a›61a¶›1a¹Æ›17aºÃÀÀÛ31a¹¸
+›1804d›511`¼›18aÃȼ¹Æ›17a¶›214aÍÄ›1a¹›18a¹ÌȹÂǽÃÂá›18a˼½·›330aÉÁ›165aË
+›1861d›473`Í›18aȼ¹›18aÀ¹ÈȹÆÇ›18aé0+Ýóȼ¹›16a›61a¶›1a¹Æ›13m›18aã›10m›23aºÃÆ›17aµÂ›100a¹Â›17aÁµ»Â½ì·µÈ½Ã›13m›17aí›10m›125a¹Â
+›1861d›449`¶›488aÉÁ›260aÍ›18a»½Ê›405a½Ç›17a»½Ê
+›1917d›473`Í
+›1917d›449`¶
+›1955d›15m›1159`r
+›1974d›13m›960`ã›10m›17aæ›15m›13a(›10mÞЛ13mö›10mÑ›15m›42a&›13m›11aä›10mß›10aà›10aÏ›13mö›10mÔ›15m)
+›2049d›10m›449`˼¹Æ¹›13m›13aä›10m›930a¼›12aµÂ¸›15m›13a(›13mò›15m)›10m›176aÈÇ
+›2049d›625`½Ç›12aȼ¹›13aÃÉÈÄÉÈ›12a¸¹Ê½·¹ÝÇ›13aƹÇÃÀÉȽÛ11a½Â›12a¸ÃÈÇ›12aÄ›1a¹Æ›13a½Â·›201aƹÄƹǹÂ
+›2106d›1289`ȹ»¹Æ›13m›15aø›15aò›10mâ›23a®½Â·¹›17aȼ¹›17a§©ÏÒ›16a¼µÇ›16aµ
+›2106d›449`ȼ¹›17aíÛ1aÃÆ›16aÃÄ›1a¹ÆµÈ½ÃÂá›15aͽ¹À¸½Â»›16aȼ¹›17aÀµÆ»¹ÇÈ›15a½Â
+›2162d›1030`¼á›15aȼ½Ç›14a¹ÅɵȽÛ15a¶›1a¹·ÃÁ¹Ç
+›2162d›449`ƹÇÃÀÉȽÛ14aú›15aÒÏÏ›15a¸ÃÈÇ›14aÄ›1a¹Æ›16a½Â·
+›2229d›15m›1266`r
+›2248d›13m›943`ã›10m›17aæ›15m›13a(›10mÞÒÏÏ›15m›10a&›10m›10aЛ13mö›10mÑ›32aß›10aà›11aÏ›13mö›10mÔ›15m)
+›2335d›10m›449`¯¼¹Æ¹ºÃƹá›20aµÂ›19aÉÂÁµ»Â½ì¹¸›20a|ÃÁÄÉȹƛ19a¨Ã›1a¸¹Æ›19a­ÃÁµÂ›18aÐÏÄÈ›19aºÃ›67aÃÉÀ¸›19a¶›1a¹
+›2335d›1724`È›18aË
+›2391d›449`ºÃɸ›19a½Â›18a3%7›16a0+j#-1UThWTT0+á›16a˼½ÀÇÈ›17a½ÈÇ›17auF:@LM>I›23aY›18aÊ›165aÃÉÀ¸›17a¶›1a¹›19a½Â
+›2391d›1572`¹ÆǽÛ17aË
+›2447d›449`3%7›17a0+j#-1UTh[XZ0+â
+›2504d›520`¯¼¹›23ai0+t&/.3t$)1%#3/18›21aÅɵÀ½ì¹Æ›22a½ÂÇÈÆÉ·ÈÇ›22aȼ¹›14m›55a_VlhXYpq›10m›22aÄÆûƵÁ
+›2504d›14m›1538`R
+›2560d›10m›449`¼Ã›1173aµÀɹ›20a3%7›17a0+jâ
+›2560d›496`Ë›20aÈÛ19a츛20aȼ¹Ç¹›20aìÀ¹Çá›20aµÂ¸›20a¼µÇ›20a¶›1a¹¹Â›21aµÇǽ»Â¹¸›19aȼ¹›20a¸¹ºµÉÀÈ›19aÊ
+›2617d›518`ÃÉ›15a˽Ǽ›15aÈÛ14aµ··¹ÇÇ›15aÍ›102aË›15aÄƽʛ134aÈ›14aìÀ¹Çá›15aƹº¹Æ›15aÈÛ15azÄÄ›1a¹Â¸½Ì›16a|â
+›2617d›449`¤º›16aÍ›378aÃÉÆ›15aÛ149aµÈ¹›15aºÃÂ
+›2673d›520`zÀȹƵȽʛ52aá›14aĵ·›22a¹¸›16aĽ̹À›15aºÃ›184aÍ›15a¶›1a¹›17a¼¹À¸›16a½Â›15aµ›16a¸½Æ¹·ÈÃÆÍ›15aÈƹ¹á›15aµÇ
+›2673d›725`¹ÀÍ›90a¿›231aÈ›15aìÀ¹Ç›16aÁµ
+›2730d›449`½Ç›17a¸Ã¹›17aµÈ›15m›16a*›14m2)3%-!,%›15m›2a+›10m›239a¿›624aʽ¸¹Ç›16aȼ¹
+›2730d›895`˽ȼ›16aÉÂĵ·›22a¹¸›17aƵÇȹƛ16aìÀ¹Çå›17azÄÄ›1a¹Â¸½Ì›18az›17aÄÆÃ
+›2786d›449`¸¹Èµ½ÀÇâ
+›2904d›12m›449`²¹³¹²›52ac~§zx©¥§~z¨›16a{¥§›10m›17ah07,›12m›17ae~¢z¨
+›2990d›10m›507`Í›13a¹Ìĵ¸¹¸›13aƵÇȹƛ11aĽ̹À›12aìÀ¹Ç›12aµÆ¹›12aÇÈÃƹ¸›11a½Â›12aµ›12a¸½Æ¹·ÈÃÆÍ›11aÈƹ¹›12a˽ȼ›12aµ›11añÄǹɸÃð
+›2990d›449`zÂ
+›3046d›449`¸¹Ê½·¹ï›14a3%7›16a07,›17a1//3j›13aµÇ›12a½ÈÇ›13aÆÛ1aÃÈä›18a3%7›16a$)2+jn3%7h&/.32h07,ho›11a½Ç›12aȼ¹›13a¸¹ºð
+›1;1222;3044;2;15!|
+›1;771;3044;2;15!|
+›1;683;3044;2;15!|
+›1;1846;2558;2;15!|
+›1;524;2445;2;15!|
+›1;711;2389;2;15!|
+›1;643;1689;2;15!|
+›1;1230;1633;2;15!|
+
+
+›462d›607`ÐÑ›12m›326að›45aÄÇÈÃÏ›16aÑÏÛ15a¿Ê›15aÅÃÊÃο›224aÒÇÐËÈÊíð
+›462d›1647`ÐÛ14aÀÕ›15aÂ
+›607d›10m›607`½Â½È½Ã›15aÉǹ¸›17aµÈ›15m›16a*›14m2)3%-!,%›15m›2a+›10m›549aË›15aȼ½Ç›16aÆÛ1aÃÈ›15aµÆ¹›16a¸½Æ¹·ð
+›607d›1144`ºÃÆ›16aȼ½Ç›16aÀû½·µÀ›14aµÁ¹â›24a{¹ÀÃ
+›664d›607`ÈÃƽ¹Ç›15a˽ȼ›15a›482aµÀɹ›16aú›15aȼ¹›16aµÁ¹›13m›16aã›10m›137aÍ›16aĵÆȽ·ÉÀµÆ
+›664d›860`ÉÁ¹Æ½·µÀ›15añµÁ¹Çïå›15aȼ¹›16aÊ›404aºÃÆ›15aµÂ
+›720d›668`È›15aÁµ»Â½ì·µÈ½Ã›13m›13aí›10m›76aÍ›14a¶›1a¹›16a¸¹Æ½Ê›200aËÇä
+›720d›607`ºÃ›370aÁµ›198a¹¸›15aµÇ›15aºÃÀÀÃ
+›803d›15m›1278`r
+›822d›13m›1079`ã›10m›17aæ›15m›13a(›10mÞЛ13mö›10mÑ›15m›42a&›10m›10aÔ›15m›10a&›13m›11aä›10mß›9aà›11aÏ›13mö›10mÔ›15m)
+›908d›1411`HJ
+›924d›10m›607`˼¹Æ¹›13m›13aä›10m›13a½Ç›12aȼ¹›13aÃÉÈÄÉÈ›13a¸¹Ê½·¹ÝÇ›12aƹÇÃÀÉȽÛ37aâ›19a®½Â·¹›13aȼ¹›13a§©ÏÒ›13a¼µÇ›12aµ›13aƹÇÃÀÉȽÃÂ
+›981d›978`¼á›15aȼ½Ç›14a¹ÅɵȽÛ15aǽÁÄÀ½ì¹Ç›14aÈÃ
+›981d›607`ú›15aÒÏÏ›14a¸ÃÈÇ›15aÄ›1a¹Æ›16a½Â·
+›1064d›15m›1435`r
+›1083d›13m›1090`ã›10m›17aæ›15m›13a(›10mÞÐÔÏÏ›15m›9a&›10m›10aЛ13mö›10mÑ›33aß›9aà›11aÏ›13mö›10mÔ›15m)
+›1185d›10m›1151`ÈÇ›21aµÆ¹›21a½Â›22a¸½Æ¹·ÈÃÆÍ›21a3%7›17a07,›17a1//3jnUYTToå›23aȼ½Ç
+›1185d›607`¼¹Â·¹›23aȼ¹›22aÉÂÁµ»Â½ì¹¸›23aºÃÂ
+›1241d›607`ÈƵÂÇÀµÈ¹Ç›20aÈÛ540a,hUYTTo›19aµÈ›15m›20a*›14m2)3%-!,%›15m›2a+›10m›227aá
+›1241d›882`3%7›17a$)2+jn3%7h&/.32h07›461aâ›38a®½Á½ÀµÆÀÍ
+›1298d›607`ȼÃǹ›15aµÈ›15auF:@LM>I›22aW›15aµÆ¹›15a½Â›15a¸½Æ¹·ÈÃÆÍ›15a3%7›17a07,›16a1//3jnVY]Voâ
+›1354d›678`¯¼¹›450a8›17aÅɵÀ½ì¹Æ›19a½ÂÇÈÆÉ·ÈÇ›18aȼ¹›14m›51a_VlhXYpq›10m›18aÄÆûƵÁ
+›1354d›775`i07,t&/.3t$)1%#3/1›14m›493aR
+›1411d›10m›654`Ë›20aÈÛ19a츛21aȼ¹Ç¹›20aìÀ¹Çå›23aµÈ›15m›19a*›14m2)3%-!,%›15m›3a+›10má›20aȼ½Ç›20a¼µÇ›20a¶›1a¹¹Â›21aµÇǽ»Â¹¸›20aȼ¹›20a¸¹ºµÉÀÈ
+›1411d›607`¼Ã
+›1467d›628`µÀɹ›16a3%7›16a07,›17a1//3jâ
+›1467d›607`Ê
+›1524d›678`zÀȹƵȽʛ52aá›11aÉÂĵ·›22a¹¸›14aĽ̹À›13aºÃ›178aÍ›13a¶›1a¹›14a¼¹À¸›13a½Â›13aµ›13aǽ»À¹›13aíµÈ›12a¸½Æ¹·ð
+›1524d›883`¹ÀÍ›137a¿›227aÈ›12aìÀ¹Ç›13aÁµ
+›1580d›682`á›15aµÇ›16a½Ç›15a¸Ã¹›16aµÈ›15m›15a*›14m2)3%-!,%›15m›3a+›10m›186a¿›599aʽ¸¹Ç
+›1580d›607`ÈÃÆÍ›518a˽ȼ›15aĵ·›22a¹¸›16aĽ̹À›16aìÀ¹Çå›15azÄÄ›1a¹Â¸½Ì›17az›16aÄÆÃ
+›1637d›607`ȼ¹›15a¸¹Èµ½ÀÇâ
+›1757d›12m›607`²¹³¹³›52ac~§zx©¥§®›16a{¥§›17as~§©ªv¢›17ae›50a©›17ae~¢z¨
+›1757d›1296`¥¤
+›1843d›10m›607`¯¼¹›15aÄÆûƵÁ›13a¹¹¸Ç›16aÈÛ14a¶›1a¹›15aµ¶À¹›14aÈÛ14aƹµ¸›15ah5&›14aìÀ¹Ç›14aºÃÆ›14aµÂ›246aÈÇ›14aÉǹ¸›15a½Â
+›1843d›1664`Í›15aʽÆÈɵÀ›13aºÃÂ
+›1899d›862`Èå›16a½Â›16aºµ·Èá›15aºÃÆ›14m›15a%5%18›10m›81aÈ›15aƹº¹Æ¹Â·¹¸á›17aȼ¹›16aÄÆûƵÁ›14a·›63a¿Ç›16aìÆÇÈÀÍ
+›1899d›607`ȼ¹›16a¸Ã›1a·ÉÁ¹Â›397aºÃ›542a¼¹·
+›1955d›931`È›19a½Ç›20aʽÆÈɵÀ›18a¶›344a¼›20aµ›20ah5&›333a¼›21aµ
+›1955d›607`˼¹È¼¹Æ›20aȼ¹›21aºÃ›263aÍ›20aÀÛ1aÿ½Â»›19aºÃÆ›20aÇÉ·›179aìÀ¹ä›29aÃÂÀÍ›20a½º›19aÇÉ·
+›2012d›1870`ȵ½Â»›15aƵÇȹÆ
+›2012d›607`ìÀ¹›16a·µÂÂÃÈ›16a¶›1a¹›17aºÃɸ›16a¸Ã›1a¹Ç›17aȼ¹›16aÄÆûƵÁ›15aµÈȹÁÄÈ›15aÈÛ16a츛16aìÀ¹Ç›16a·ÃÂ
+›2068d›607`½ÂºÃÆÁµÈ½Ã›14a½ÂÇȹµ¸â
+›2125d›678`¯¼¹›21aÄÆûƵÁ›21aÀÛ1aÿǛ20aºÃÆ›21aȼ¹Ç¹›21aìÀ¹Ç›22a½Â›21aȼ¹›21aÀÛ1a·µÈ½Ã›20aµÇÇÛ1a·½µÈ¹¸›21a˽ȼ›20aȼ¹
+›2181d›607`i5)134!,t$)1%#3/18›19aÅɵÀ½ì¹Æå›23a½È›21aÁµ›311aÊ›101aÈ›21aÈÛ21a¿›147a¼
+›2181d›1367`Í›20a¶›1a¹›22aºÃɸ›21a·Ã›22a¹Â½¹Â›123a¹¹Ä›21aÇÉ·
+›2238d›607`ìÀ¹Ç›20a½Â›19aȼ¹›20aǵÁ¹›19a¸½Æ¹·ÈÃÆÍ›19aµÇ›19aȼ¹›20a¯›97aÛ263aÈ›15m›20a*›14m2)3%-!,%›15m›2a+›10má›20aȼ½Ç
+›2238d›1353`³›19a¡›43aÈ›19a¨¹Èƽ·Çâ›32az
+›2248d›1327`~
+›2294d›607`ÅɵÀ½ì¹Æ›21a½Ç›20a»½Ê›170aµÀɹ›21a3%7›17a&/.32j›76aÉÇ›21a½Â¸¹¹¸›22aÄÀµ·½Â»›21aȼ¹Á›21a½Â›20aȼ¹
+›2294d›899`¹Â›21aȼ¹›21aÊ›332aá›21aȼ
+›2351d›896`â
+›2351d›607`ǵÁ¹›15a¸½Æ¹·ÈÃÆÍ
+›2407d›898`ÈÇ›14aµÈ›15m›13a*›14m2)3%-!,%›15m›2a+›10m›81a¹Æ›14aÁµ¿›367aÈÇá›12aȼ¹Â›14aȼ¹›14a¸¹ð
+›2407d›678`¤º›14a¸Ã›1a·ÉÁ¹Â›330a¹ʛ135a¹›13aÉǹ›14aú›13aʽÆÈɵÀ›13aºÃÂ
+›2464d›607`ºµÉÀÈ›14aǼÃÉÀ¸›15a¶›1a¹›15aÁµ¸¹›398a3/18›12aÈÛ14a»µ½Â›14aµ›15aÇÀ½»¼›146aÊ›101aÈ
+›2464d›1040`i./5)134!,t$)1%#›389aÈ›13a½ÁÄÆÛ22a¹Á¹Â
+›2520d›607`½Â›15aÇÄ›1a¹¹¸›16aú›15aÄÆÛ1a·¹Çǽ»â
+›2939d›14m›644`Ýß
+›2955d›11m›676`{¨¥›16a¦¡£´¯²›15a½›16a¡²©³¥³›15a¦²¯­›15a´¨¥›16a²¥¬¡´©¯®³¨©°›16a¢›1a¥´›26a¥¥®›16a{›14a~³›15a¤¥¦¡µ¬´›13m›135a;>9›58aA@›11m›13a¯¦
+›2955d›1439`·›13m›314aX?7<@>›58a7E>
+›2963d›11m›1559`r
+›3000d›13m›607`HGGG›11m›763a¨Å›12a·¨©£›59a¡³›12a´¨¥›12a¡³³µ­¥¤›13a²¥³¯¬µ´©¯®›13a¯¦
+›3000d›697`¡®¤›13a´¨¥›12a¤¥¦¡µ¬´›13a²¥³¯¬µ´©¯®›12a¯¦›12a¼ºº›12a¤¯´³›13a°›1a¥²›12a©®£›119a¨›12a·
+›3046d›807`´›12aͬ¥³
+›3046d›607`¡¬¬›13a¥¡²¬¹›13a¦¯®
+›1;607;2910;2;598!|
+›1;1247;2292;2;15!|
+›1;888;1465;2;15!|
+›1;800;1465;2;15!|
+›1;1522;1296;2;15!|
+›1;1433;1296;2;15!|
+›1;957;1239;2;15!|
+›1;1714;1183;2;15!|
+›1;1625;1183;2;15!|
+
+
+›462d›12m›662`Õ›16aËÄ›16aÐÃÎÉÏ›10m›940aÐÒ
+›462d›12m›449`ÅÈËÏÏ¿Î
+›607d›13m›852`ËÖÒ×
+›607d›449`·ÑÔ××ÇÖÛ›25aÔÌ›23aÂ
+›711d›12m›449``¨¦›1azx©›18aov©~¥¹›10m›550aÈ›18aú›19aµ›18aĽ̹À›18aÈÛ18a½ÈÇ›18a˽¸È¼â›30a¨ÃÇÈ
+›711d›788`ÞÐß›18a¯¼¹›18aƵȽÛ18aú›18aȼ¹›18a¼¹½»¼
+›767d›563`ÀµÇ¹Æ›15aÄƽ›135aÊ›925aÈ›16aú›15aµ
+›767d›750`ȹÆÇ›15a¼µ›22a¹›16aµ›16aÐäЛ15aµÇÄ›1a¹·È›16aƵȽÃå›14aÞÑß›15a¯¼¹›16aƵȽÛ15aú›15aȼ¹›16a¼¹½»¼
+›824d›582`¼µÆµ·È¹Æ›15aÈÛ14a½ÈÇ›15a˽¸È¼â
+›824d›563`·
+›923d›12m›732`©~¤|¹›10m›337a¼›16a¹˛238aȹÆÇ›15aµÇ›15aȼ¹›15a}~|ÀµÇ¹Æ
+›923d›12m›449`cª¦¢z­›17am§~¤›10m›125az›15aº¹µÈÉƹ›15aú›15aÇÉ·›117a¹Æ›15aÀµÇ¹Æ›14aÄƽÂ
+›979d›563`ÁÛ1a¸¹À›20aÑÑÏÏ›19aÞ§©ÏÕßá›21a½Â›20a˼½·›208aȹƛ19a·Ã›235a¼µÂ½ÇÁ›20aºÃÆ
+›979d›1140`¼›20aȼ¹›21aÄƽ›141aȵ½ÂÇ›20aµ›19aÁ¹·
+›1036d›563`Á¹·›389aÊ›652aȽ»›21aÛ22aù
+›1036d›640`¼µÂ½·µÀÀÍ›21aÈÉƽ»›21aÛ22a¹Æ›21aȼ¹›22aǼ¹¹È›22aú›21aĵě1a¹Æ›22aµºÈ¹Æ›21aÄƽÂ
+›1092d›1313`ÈÛ16a½ÈÇ›17aƹʛ147aÉÇ›17aÄÆÛ1a¸É·½Â»›18aµ
+›1092d›563`ǽ¸¹›17a¶›1a¹ºÃƹ›18a½Áµ»½Â»›16aµ›17aǹ·Ã¸›18aĵ»¹›17aÛ183a¹Æǹá›17aȼ
+›1148d›1002`Èâ›20aÞ®¹¹›16aµÀÇÛ12m›43aèà›183açÞáÜ›10mâß
+›1148d›563`¸ÃɶÀ¹ðǽ¸¹¸›16a¸Ã›1a·ÉÁ¹Â›12m›240aЛ58a×ßÚÙ›15aÌåÞá
+›1247d›449`e›50a©›10m›17aÃÆ›12m›17ae›79a©¹›10m›22az›17a·›548aÍÄ›1a¹›17aºµ·¹›17aµÂ¸›17aǽιâ›25a°ÇɵÀÀÍ
+›1247d›12m›478`¥¤›123a¥ª¤›10m›126a¼µÆµ·È¹Æ›16aǹț17aú›16aµ›17aÇÄ›1a¹·½ì¹¸›18aÈ
+›1304d›563`½Â·Àɸ¹Ç›13aÉÄÄ›1a¹Æð›14aµÂ¸›13aÀÛ31a¹Æð·µÇ¹›12aÀ¹ÈȹÆÇá›12aì»ÉƹÇá›13aÄÉ·ÈɵȽÛ13aÁµÆ¿Çá›12aÀ½»ð
+›1304d›999`Ë
+›1360d›895`ÈÇâ
+›1360d›563`µÈÉƹǛ15aµÂ¸›15aµ··¹Â
+›1459d›12m›449`f¢®¦}¹›10m›22a¯¼¹›18aļ›291aȵȽÛ17aú›18aµ›18añ·›431aȹ¸›18aĵ»¹
+›1459d›773`Íǽ·µÀ›18aƹÄƹǹ›274a¼µÆµ·È¹Æï›17aÛ18aȼ¹›18aÄƽÂ
+›1515d›563`½Ç›18a¿ÂÛ255a¼µÆµ·È¹ÆÝÇ›12m›17aÜßìãÝ›10m›74aÉÇ›19aȼ¹›18a»ÀÍļ›18aºÃÆ›18a½ÈµÀ½·›17aézÝ›18aÞ›14m;›10mß
+›1515d›683`Ë›18aµÇ›18aȼµÈ›18a·›322aå›19aȼ
+›1572d›1185`¼µÆµ·È¹Æ›15a½Â›15a¶›1aÃÀ¸›15aºµ·¹›15aÞ›12m`›10mßâ
+›1572d›563`¸½ë¹ÆÇ›15aºÆÃÁ›14aȼµÈ›14aºÃÆ›15aȼ¹›15aǵÁ¹›15a·
+›1670d›12m›834`©v©~¥¤¹›10m›21a«Æ½Â›449aÍÄ›1a¹›16aÆɽ»›16aĵƵÀÀ¹À
+›1670d›12m›449`iv¤y¨xv¦›1az›20al§~z¤›10m›256aȽ»›15a˽ȼ›15aȼ¹›16aÀ½Â¹Ç›15aú›15aÈ
+›1727d›563`˽ȼ›14aȼ¹›15aÀû›14a¹¸»¹›15aú›14aȼ¹›15aĵě1a¹Æá›14aÇÛ15aȼµÈ›14aȼ¹›14aĵě1a¹Æ›15a˼¹Â›15aƹµ¸›15a½Ç›14a˽¸¹Æ
+›1783d›563`ȼµÂ›15a½È›15a½Ç›14a¼½»¼â
+›1882d›12m›484`vx›26azy›16am~­z¢›16ae~¢z¨¹›10m›227aÃÁµÇ›15a­Ã¿½·›577a¼
+›1882d›12m›449`m›46a¡›10m›346a¤Â›17aÐØ×Ôá›14a¯›226a¿½›15a¸¹Ç½»Â¹¸›16aȼ½Ç›15aºÃÆÁµÈá›15a˼½·
+›1938d›654`Ë›13a·µÄµ¶À¹›14aú›13a¶›1a¹½Â»›14aÉǹ¸›14a¶›261aÍ›12aú›13a¯›17a³›27aµÆ¹â›20a{Í›13aÉȽÀ½Î½Â»
+›1938d›563`½Ç›13aÂÛ505aÍ›13aȼ¹›14aÁµ›3a¾Ãƽț163aË
+›1948d›1533`~
+›1995d›639`¹Æ›21a¸µÈµ›21a·ÃÁÄƹÇǽÛ20aȹ·›651aÈ›20aìÀ¹Ç›21a½Ç
+›1995d›563`·À¹Ê›486a¼Â½ÅɹÇá›23a¸½Ç¿›21aÛ1a··Éĵ·͛22aºÃÆ›21aºÃÂ
+›2051d›756`Í›16aÔÏò×ÏÜâ
+›2051d›563`ƹ¸É·¹¸›16a¶
+›2150d›12m›449`m›220a©v©~¥¤¹›10m›22a²½È¼›16aÇȵ¸µÆ¸›16aĵě1a¹Æ›17aÞ¹½È¼¹Æ›16azÓ›17açÑØÖÁÁ›15m&›10mÑÐÏÁÁè›14aÃÆ
+›2150d›12m›484`v|z›18al§~z¤
+›2188d›15m›800`H
+›2206d›10m›563`°®›18açÐн›15m&›10m×›206aȽ»›17a·µÂ›18aÆÉ›18aĵƵÀÀ¹À›16aÈÛ17a¹½È¼¹Æ›17aȼ¹›18aǼÃÆÈ›17aÃÆ›18aȼ¹
+›2206d›822`½Âèßá›17aÄƽÂ
+›2221d›15m›800`I
+›2263d›10m›563`Àû›15a¹¸»¹Çå›16aȼ¹Ç¹›16aÃƽ¹Â›298aË›16aµÇ›15aÄ›1aÃÆÈƵ½È›14aÃÆ›16aÀµÂ¸Ç·µÄ›1a¹á›16aƹð
+›2263d›1012`ȵȽÃÂÇ›14aµÆ¹›15a¿ÂÃ
+›2319d›563`ÇÄ›1a¹·È½Ê›48aâ
+›2319d›701`¹ÀÍ
+›2418d›12m›449`m~­z¢¹›14m›53a_VlhXYpq›10m›701a¼›20aµ›19aĵ»¹›19a˽ÀÀ›19aµÄÄ›1a¹µÆ
+›2418d›14m›603`R›10m›202aÈƹµÈÇ›19aȼ¹›20aǼ¹¹È›19aú›20aĵě1a¹Æ›20aÛ19a˼½·
+›2475d›687`Ë›373aÍ›21aú›21aȽ›221aË›21aµÇ›21aĽ̹ÀÇ›22aÞǼÃÆÈ›20aºÃÆ
+›2475d›563`µÇ›21aµ›22aÈ›31aÃð¸½Á¹ÂǽõÀ›19aµÆƵ›157aÍ›21a¸ÃÈÇ›22a¿ÂÃ
+›2531d›874`ÈÇïßå›13aĽ̹ÀÇ›13aÁµ›305a¿›13aÃÆ›13a˼½È¹â›19a¯¼¹›14a›61a¶›1a¹Æ
+›2531d›563`ñĽ·ÈÉƹ›14a¹À¹Á¹Â›288aÍ›13a¶›1a¹›15a¹½È¼¹Æ›14a¶Àµ·›347aÉÁ
+›2587d›673`¼›11aĽ̹ÀÇ›10aÄ›1a¹Æ›12a½Â·›194aȵÀÀÍ›14m›9a!-$›10m›34a¹ÆȽ·µÀÀÍ›318aÍ›11aȼ¹
+›2587d›563`ú›11aÇÉ·›291a¼á›11a¼ÃƽÎÛ182aÊ›157aá›10a½Ç›11a¸¹È¹ÆÁ½Â¹¸›11a¶
+›2644d›12m›563`åÚæâßèçÞâá›10m›13aµÂ¸›12m›15aÖæã›1aÚØç›14aåÖçÞâ›10m›16aú›14aȼ¹›14aÄƽ›527aȵ¶À¹
+›2644d›1318`Ƚ»›13a¸¹Ê½·¹â›20a¯¼¹›15aÈÃȵÀ›13aÄƽÂ
+›2700d›563`µÆ¹µ›15aú›14aȼ¹›16a§©ÏÒ›15aÞÛ15azÓ›15aĵě1a¹Æß›15a½Ç›15aÑÓÏÏ›15m›9a&›10m›10aÒÓÏÏ›14aĽ̹ÀÇâ
+›2778d›15m›563`*›14m2)3%-!,%›15m›3a+›10m›169aÉÁ›712aȹÆÇ›18a˽ȼ›18aµ
+›2778d›796`¼µÇ›19aµ›19a›61a¶›1a¹Æ›19aú›19a}½»½ÈµÀ›16a§©ÏÒð«ÀÉÇ›19aÀµÇ¹Æ›19aÄƽÂ
+›2834d›1144`¼›15aµÂ¸›15aµÂ›15aµÇÄ›1a¹·È›16aƵȽÛ13aú›15aÐäÐâ
+›2834d›563`ƹÇÃÀÉȽÛ14aú›15aÒÏÏ›14a¸ÃÈÇ›15aÄ›1a¹Æ›16a½Â·
+›2933d›12m›449`m›294a©v©~¥¤¹›10m›22a«Æ½Â›488aÍÄ›1a¹›24aÆɽ»›23aĵƵÀÀ¹À
+›2933d›12m›484`¥§©§v~©›17al§~z¤›10m›257aȽ»›22a˽ȼ›23aȼ¹›24aÀ½Â¹Ç›23aú›23aÈ
+›2990d›563`˽ȼ›20aȼ¹›21aǼÃÆÈ›20a¹¸»¹›21aú›20aȼ¹›21aĵě1a¹Æá›22aȼ¹›20aÂÃÆÁµÀ›20aºÃÆÁ›20aºÃÆ›20a¶›1aÛ1aÿÇá›21a˽ȼ
+›3046d›563`ȼ¹›15aĵ»¹›15a¼½»¼¹Æ›15aȼµÂ›15a½È›15a½Ç›15a˽¸¹â
+›1;800;2193;2;18!|
+
+
+›462d›607`ÐÓ›12m›1154aÕ›16aËÄ›15aÐÃÎÉÏ
+›462d›1594`ÅÈËÏÏ¿Î
+›607d›607`ov¨©z§¹›10m›22a¤Â›17aȼ¹›16aǵÁ¹›16aË›21aÍ›15aȼµÈ›15aµ›16aȹÀ¹Ê½Ç½Ã›15aǷƹ¹Â›16a½Ç›16aÇ·µÂ¹¸›16aµÇ›16aµ›12m›16aåÖæçÚå›10m›18aú
+›607d›1079`µ
+›664d›721`¼ÃƽÎÛ392a¼›12a·›685aËÇ›12aú
+›664d›867`ȵÀ›11aÇ·µÂ›12aÀ½Â¹Çá›12aÇÛ13a¹µ·›55a¼µÆµ·È¹ÆÝÇ›12a»ÀÍļ›12a½Ç›12a¶É½ÀÈ›12aÉÄ›13aºÆÃÁ›11aÆÃ
+›720d›721`Ľ̹ÀÇâ›18a¯¼¹›13aƹÄƹǹ›227aÍ›12a·›674aÍ
+›720d›1119`ȵȽÛ12aú›12aµÂ›54a¼µÆµ·È¹Æ›12a·µÂ›13aȼ¹Â›13a¶›1a¹›13aǵ½¸›12aÈÛ12aÛ1a··ÉÄ
+›777d›721`µ›15a·¹Æȵ½Â›14a›61a¶›1a¹Æ›16aú›12m›55aêæ›10m›16aµÂ¸›12m›15aØâßèàáæ›10m›2aâ
+›777d›934`ÉÁ›12m›131aåâ
+›872d›792`v|z¨¹›10m›22a¯¼¹›16aƽ»¼›533a¹›14aȼ¹›16aù›15aÃÄÄ›1aÃǽȹâ
+›872d›12m›607`ozx©¥›18am›10m›304aÈð¼µÂ¸›14aĵ»¹Ç›15a½Â›15aµ›15a¶›1aÛ1aÿá›15aÀ½¿
+›968d›12m›607`oz¨¥¢ª©~¥¤¹›10m›139aÉÁ›419aÈÇ›14aÞñĽ̹ÀÇïß›14aµÄÄ›1a¹µÆ½Â»›15aÄ›1a¹Æ›15aÀ½Âð
+›968d›888`¯¼¹›15a›61a¶›1a¹Æ›15aú›15aĽ·ÈÉƹ›15a¹À¹Á¹Â
+›1024d›1052`¼›16aÞÃÆ›14aÇɽȵ¶À¹›14aÁ¹Èƽ·›15aÁ¹µÇÉƹßâ
+›1024d›721`¹µÆ›15aÃÆ›14aÇÅɵƹ›15a½Â·
+›1120d›12m›908`©~¤|¹›10m›20a¯¼½Ç›11a½Ç›11aȼ¹›11aÂÃÆÁµÀ›10aÁÛ1a¸¹›11aú›11aÄƽ›370aȹÆÇá
+›1120d›12m›607`p~£¦¢z­›16am§~¤›10m›736aȽ»›10a˽ȼ›10aÀµÇ¹Æ›11aÄƽÂ
+›1176d›721`¹Ì·¹ÄÈ›15aºÃÆ›15aȼÃǹ›15aȼµÈ›14a·µÂ›15aÇÉÄÄ›1aÃÆÈ›12m›259açÞáÜ›10m›4aå›13aȹÌÈ›15aµÂ¸›15a»ÆµÄ¼½·Ç
+›1176d›12m›1402`ÂèãßÚë›15aÌåÞá
+›1233d›10m›1564`â›12m›32ak¹a¹›10m›18a{¹ºÃƹ›20aµÈȹÁÄȽ»
+›1233d›721`µÆ¹›19a½Áµ»¹¸›19aÛ19aù›20aǽ¸¹›19aú›19aȼ¹›20aĵě1a¹Æ›20aÃÂÀÍ
+›1289d›951`¼›23aǼ¹¹ÈÇ›22aȼÆÃÉ»¼›22aȼ¹›23aÄƽ›528aÈ›22aÃÂ
+›1289d›721`ÈÛ21aĵÇÇ›22aÇÉ·›533aȹƛ21aµ›22aǹ·Ã¸›23aȽÁ¹›21aÈÛ22aÄƽÂ
+›1346d›862`¹Æǹ›17aú›16a¹µ·›663a¼¹·›206aɺµ·ð
+›1346d›721`ȼ¹›17aƹʛ207a¼›17aǼ¹¹È›18aÞñÄ›1aÛ1aÃÆ›16aÁµÂÝÇ›16a¸ÉÄÀ¹Ìïßá›17a·›63a¿›18aȼ¹›17aÁµÂ
+›1402d›1046`ȵȽÛ19aÈÛ19a¹ÂÇÉƹ›21aȼµÈ›19aȼ½Ç›19a˽ÀÀ›18aÂÃÈ›20a·µÉǹ›20a¸µÁµ»¹›19aÈÃ
+›1402d›721`ÈÉƹÆÝÇ›19a¸Ã›1a·ÉÁ¹Â
+›1459d›721`Í›159aȹÆâ
+›1459d›744`ÃÉÆ›14aÄƽÂ
+›1554d›12m›639`ª£›213a©~¤|¹›10m›237aȽ»›17a½Â›12m›19aÂèãßÚë›10m›21aÁÛ1a¸¹›19aÞǹ¹›19aµ¶›1aÛ22a¹ßá›18aȼ¹›18aƹð
+›1554d›12m›607`q›68aw¢zy›16am§~¤›10m›125a²¼¹Â›19aÄƽ›607aÊ
+›1611d›744`¹Æǹ›19aú›18a¹µ·›460aÊ›302aȹ¸›19aȼ¹›19aǵÁ¹›19aË›21aÍ
+›1611d›721`Ê›211a¼›20aǼ¹¹È›19a˽ÀÀ›18aÉÇɵÀÀÍ›18a¼µ›22a¹›19a½ÈÇ›18aȹÌÈ›19aÃƽ¹Â›313aµ
+›1667d›1084`È›20aǽ¸¹á›23a½º›21aȼ¹›21aĵě1a¹Æ›22a½Ç›21aÈÉƹ¸›22aÛ22a¹Æ›21a½Â›21aȼ¹›21aÁµÂ¹Æ
+›1667d›721`ÆÃɸ›21aµÇ›22aȼ¹›21aºÆÛ642aÊ
+›1723d›1454`¶½Â¹¸›20a˽ȼ›12m›48aâåçåÖÞç›10m›116aȵȽÃÂß
+›1723d›721`ú›19aƹµ¸½Â»›18aµ›19a¶›1aÛ1aÿâ›32a¯¼½Ç›19aÞ˼¹Â›19a·ÃÁ›12m›234aÌ›10m›148aÃƽ¹Â
+›1780d›721`Á¹µÂÇ›16aȼµÈ›15aȼ¹›16aĵ»¹Ç›16a·µÂ›16a¶›1a¹›17a¶›1aÃɸ›17aµÀû›15aȼ¹›16aÀû›16a¹¸»¹›16aú›16aȼ¹›16aĵě1a¹Æ
+›1836d›721`ÈÛ14aºÃÆÁ›15aµ›15a¶›1aÛ1aÿâ
+›1912d›1656`È›17aµÀû›17aȼ¹›17aǼÃÆÈ›16a¹¸»¹
+›1912d›721`®ÃÁ¹È½Á¹Ç›16a½È›17a½Ç›16a¸¹Ç½Æµ¶À¹›17aÈÛ16a¶½Â¸›18aȼ¹›17a¸Ã›1a·ÉÁ¹Â
+›1969d›721`ÞÀ½¿›174a¼µÆÈßá›19aÃÆ›18aÁÃƹ›18aúȹÂá›19aµÀû›17aȼ¹›19aÀû›18a¹¸»¹›18aºÃÆ›12m›18aÈÖáÙæØÖã›1aÚ
+›1969d›10m›788`¹›17aµ›18aí½Äð·
+›2025d›819`ȹ¸›13a¶›1aÛ1aÿÇå›15a½Â›14aȼ½Ç›13a·µÇ¹á›12m›43aèà›282açÞáÜ›10m›49aÃÉÀ¸›13a¶›1a¹›15aǹÀ¹·È¹¸
+›2025d›721`Ãƽ¹Â›12m›465aЛ58a×ßÚ›14aÉâ›1aÙÚ›14aÌåÞá›10m›95aË
+›2082d›721`ÇÛ19aȼµÈ›19aȼ¹›14m›20a5%12.›10m›23aĵ»¹Ç›19aµÆ¹›20aÄƽ›282aËÂÝóȼ¹›19a¸ÃɶÀ¹ðĵ»¹
+›2082d›1382`ȹ¸›19aéÉÄǽ¸¹ð¸Ã
+›2138d›721`ÇÄƹµ¸›11aË›243aÊ›923aÈ
+›2138d›893`ÃÉÀ¸›11aȼ¹Â›12a¼µ›22a¹›11a¶›1aÃȼ›11aĵ»¹Çá›12a˼¹Â›12a¶›1aÃɸá›12a½Â›11aȼ¹›12aǵÁ¹›11aµÄĵƹÂ
+›2195d›819`ȵȽÃÂâ
+›2195d›721`Ãƽ¹Â
+›2290d›12m›607`r¤¦vx›26azy›17am~­z¢›16ae~¢z¨¹›10m›21a¯¼¹›14aÃƽ»½ÂµÀ›12aÁ¹µÂÇ›14aú›13aƹÄƹǹ›230aÈÇ›13aÉǹ¸
+›2290d›12m›752`¡›10m›953aȽ»›14aȼ¹›14aºÃÂ
+›2347d›745`Í›12a¯›97aµÇ›11a½Â›13aȼ¹›13aºÃÆÁ›11aú›13aÉÂĵ·›22a¹¸›13aƵÇȹÆÇâ›18a~µ·›76aË›12aú›12aĽ̹ÀÇ›12a˽ȼ½Â
+›2347d›721`¶›86a³›13aË›449a¿›294a¼›12aÆÃ
+›2357d›806`~
+›2403d›817`¼µÆµ·È¹ÆÝÇ›14aƵÇȹƛ13a½Ç›14aƹÄƹǹ›101aÍ›14aȼ¹›15aµÄÄÆÃÄƽµÈ¹›13a›61a¶›1a¹Æ›15aú›14aÒÑð
+›2403d›721`ȼ¹›14a·›545aȹ¸›15a¶›383aÉÁ
+›2460d›721`¶½È›17aË›587aͽ»›18aÕÔ›17aÆÛ395aÃÉÀ¸
+›2460d›826`ÃƸÇå›17aȼ¹Æ¹ºÃƹ›18aµ›17a»ÀÍļ›17aÛ1a··ÉÄ›205aËÇ›17aú›17aÒÕ›17a·ÃÀÉÁÂÇ›17aË
+›2516d›721`ƹÅɽƹ›14m›20a36.›10m›24aË›228aË›19aÞË›418a¼›21aÆÛ219aÉÇ
+›2516d›1003`ÃƸǛ20aÄ›1a¹Æ›21aÆÛ101aµÇȽ»›19aÑ×›20a¶½ÈÇ›20a½Â›20a¹µ·›85aËßá›20aµÂ¸›21aȼ
+›2573d›721`ƹÅɽƹ›20aµ›20aÈÃȵÀ›18aú›20aÐÒÏ›19aË›276aÍȹÇâ›35a¤Â›20aµ¸¸½È½ÃÂá›21aȼ¹Æ¹›20aµÆ¹›20aµ
+›2573d›1212`ÃƸǛ20aÃÆ›20aÔÑÏ›19a¶
+›2629d›721`›61a¶›1a¹Æ›21aú›20aÃȼ¹Æ›21aĵƵÁ¹È¹ÆÇ›20aƹÅɽƹ¸›21aºÃÆ›20a¹µ·›64a¼µÆµ·È¹ÆÝÇ›19a»ÀÍļá›22aÇÃ
+›2629d›745`ÉÁ›828a¼›21a·
+›2685d›721`ȼ½Ç›14a·›211aÃÉÀ¸›15aÛ1a··ÉÄ›307aÍȹǛ15aú›15a¸½Ç¿›15aÇĵ·¹â
+›2685d›828`¼µÆµ·È¹Æ›15aË›213aÍ›15aµÈ›15aÀ¹µÇÈ›14aÔÓÏ›14a¶
+›2781d›12m›607`s›140av|z¨¹›10m›697a¹›15aȼ½Ç›14aùâ
+›2781d›12m›643`z§¨¥›16am›10m›132a¯¼¹›15aÀ¹ºÈð¼µÂ¸›15aĵ»¹Ç›15a½Â›15aµ›15a¶›1aÛ1aÿá›15aÀ½¿
+›2877d›12m›607`s~§©ªv¢›16ae›50a©¨¹›10m›22aªÂ¹›20aú›18aȼ¹›20a¹ÌȹÂǽÃÂÇ›18aÈÛ19a¯›17a³á›19a½Â›217aÍ›19a¦Â›145aè
+›2877d›12m›818`¥¤›10m›750aÈÆÛ1a¸É·¹¸›19a¶›101aÉȼ›20açÐÒ
+›2887d›1495`~
+›2933d›1243`È›25aú›23aÐØØÏ›23aÞ±Òßá›25a½Ç›23aȼ¹›24a·Ã·¹ÄÈ›24aú›24aʽÆÈɵÀ
+›2933d›721`½Â›23a¼½Ç›24aÁµ›3a¾ÃÆ›22a¹Â¼µÂ·¹Á¹Â
+›2990d›721`ºÃ›110aèâ›28a²¼½ÀÇÈ›17ah3&-›513aµ›324aÈÇá
+›2990d›782`ÈÇ›17açÐÑ›317aìÀ¹Ç›18a¹Ì½ÇÈ›18a½Â›18aȼ¹›18aÉÇɵÀ›18aË›21aÍ›17aºÃÆ›17aʽÆÈɵÀ›17aºÃÂ
+›3046d›1018`Í›16a¯›18a³›17a½Â›16a¹Ìµ·ÈÀÍ›16aȼ¹›17aǵÁ¹›17aÁµÂ¹ƛ17aµÇ›16aȼÃǹ›17aºÃÆ›16añƹµÀï
+›3046d›721`µÂ¸›17aµÆ¹›16aÉǹ¸›18a¶
+›3056d›1083`~
+
+
+›462d›12m›662`Õ›16aËÄ›16aÐÃÎÉÏ›10m›940aÐÔ
+›462d›12m›449`ÅÈËÏÏ¿Î
+›607d›10m›624`ÈÇá›14aȼ¹Æ¹›14aµÆ¹›14aÂÛ15aµÇÇÛ1a·½µÈ¹¸›14aĽ̹À›14aìÀ¹Çâ›19a¤ÂÇȹµ¸á›15aµ›14ah5&›152aʽ¸¹Ç›14aµ
+›607d›563`ºÃ›1045aìÀ¹›14aÄÆÃ
+›664d›563`ÁµÄĽ»›10aºÃÆ›10a¹µ·›54a¼µÆµ·È¹Æ›10a½Â›11aȼ¹›10aʽÆÈɵÀ›10aºÃ›409aÍ›10aǽÂð
+›664d›872`¼›11a·›501aÈå›11aȼ¹›10aÁµÄĽ»›11aºÃÆ›10aµÂ
+›720d›652`¼µÆµ·È¹Æ›14aÁ½»¼›524a¼µÆµ·È¹ÆÇ›14aºÆÃÁ›13aÇÃÁ¹›14aƹµÀ
+›720d›563`»À¹›14a·›276aÈ›13aƹº¹Æ¹Â·¹›15aù›14aÞÃÆ›14aÁÃƹߛ13a·
+›777d›624`ÈÞÇßá›18aÃÆ›18aÄ›1a¹Æ¼µÄÇ›19a·ÃÂÇÈÆÉ·È›19aµ›18a»ÀÍļ›18aºÆÃÁ›18aÇÃÁ¹›19aĵÈȹÆ›18aú›18a¼ÃƽÎÃÂð
+›777d›563`ºÃÂ
+›833d›744`¹ÆȽ·µÀ›15aÆÉÀ¹Çóh5&›174aȵ½Â›15aǹÅɹ·¹Ç›17aú›15m›15a*›14m›93a.,,!-$›15m›5a+›10mÇ
+›833d›563`ȵÀ›15aµÂ¸›16aÊ›366aìÀ¹Ç›16a·Ã›14m›370a$5)›16a#
+›889d›10m›563`ºÃÆ›15a¹µ·›268a¼›16aµÆ¹›15a½Â›221aÍ›15aȼ¹›16aÃÉÈÄÉÈ›16a¸Æ½Ê›128aÉÇ›15aʽÆð
+›889d›695`¼›16a»ÀÍļá›15a˼½·›153aȹÆÄƹȹ¸›16a¶›346a¹Æâ›21a¯¼
+›946d›722`ÈÇ›20a·µÂ›20a·Ã›489aȹ¸›21aÀ¹ÈȹÆÇ›19aºÃÆÁ¹¸›20aºÆÃÁ›19aµ
+›946d›563`ÈɵÀ›19aºÃ›210aȵ½Âá›20aºÃÆ›19a¹ÌµÁÄÀ¹á›21aµ··¹Â
+›1002d›643`¶½ÂµÈ½Ã›15aú›16aÈ›31aÛ16aÃÆ›16aÁÃƹ›16a·›478aÍ›16a¯›18a³›16aµÇ›16aǽ»À¹
+›1002d›563`·ÃÁ›249aË›229a¼µÆµ·È¹ÆÇá›16a¶ÉÈ›17aÈƹµÈ¹¸›16a¶
+›1012d›1699`~
+›1059d›1532`Í›14a¯›120aÍļ¹ÂµÈ½ÃÂ
+›1059d›563`éÀ¹ÈȹÆÇÝá›12aµÂ¸›14a¼¹Â·¹›16a·µÄµ¶À¹›14aú›13a¶›1a¹½Â»›14a·ÃÂǽ¸¹Æ¹¸›15a¶›87a³ÝÇ›14a¼
+›1069d›1595`~
+›1115d›788`ÉÆȼ¹ÆÁÃƹá›17aǽ·¹›18a¹µ·›60a¼µÆµ·È¹Æ›17a·µÂ›17a¶›1a¹›19aéÈɹ¸Ý›17a½Â¸½Ê½¸Éð
+›1115d›563`ÆÃÉȽ¹Çâ›26a¡›425a¼›17a·
+›1172d›628`á›14a¶›1a¹Èȹƛ16aÄ›1aÃǽȽý»›14aú›15aµ··¹Â›175a¼›16aȼ½Â»Ç›14aµÇ›15aÉÄÄ›1a¹Æð·µÇ¹›17aÀ¹ÈȹÆÇ
+›1172d›563`µÀÀÍ›548aÈÇ›15aÛ15aÇÉ·
+›1228d›563`·µÂ›15a¶›1a¹›16aµ·›80a¹¸â
+›1228d›750`¼½¹Ê
+
+
+›462d›607`ÐÕ
+›1851d›12m›1031`1;<F›13aC4:8›14a<F›14a?89G›14a<A›55aG<BA4??L›12a5?4A>
+›1851d›1371`G8A
+
+
+›462d›10m›1898`ÐÖ
+›607d›13m›656`Ú›22aØÔ›21aÉÔÓàÍÙÖË›22aØÎË›21a´ÏÖËÉØÔÖÏË×›21aÇÓÊ›23a×ËØ›21aÙÕ›21aÇ
+›607d›449`±›69a¸Ô
+›682d›700`ØËÖ›23a¿ÙËÙË›22aÌÔÖ›24aÇÓ›23aº¼Üß
+›682d›570`¾ÖÏÓ
+›785d›10m›824`ʽ¸¹Ç›20a¸¹Èµ½ÀÇ›18aºÃÆ›19aÇÍÇȹÁ›20aÁµÂµ»¹ÆÇ›19a·ÃÂì»Éƽ»›19aµÂ›20a§©ÏÒ
+›785d›449`¯¼½Ç›20aµÄÄ›1a¹Â¸½Ì›20aÄÆÃ
+›841d›486`ÈÛ15aȼ¹½Æ›14aÇÍÇȹÁ›15aÈÛ15aÇÉÄÄ›1aÃÆÈ›15a¯›17a³›27aµÆ¹â
+›841d›449`½Â›617aË
+›851d›1050`~
+›966d›13m›449`Z¬¦›56a[{qm}uxs›19a}tq›18aZzz{yz{um}q›18a\u{qo}y{uq|
+›1053d›14m›481`_VlhXYpq›10m›139aÃÆ¿›18a˽ȼ›18aĵ·›22a¹¸›18aÃÆ›18aÉÂĵ·›22a¹¸›20aĽ̹À›18aìÀ¹Çá›19aÃÆ›18aµ›18aÁ½ÌÈÉƹ›18aú
+›1053d›14m›449`R›10m›202a˽ÀÀ›17aË›256a¿›238a¿
+›1110d›449`¶›1aÃȼâ›19a¤È›11a¸Ã›1a¹Ç›11aÂÃÈ›11aÇÉÄÄ›1aÃÆÈ›11aȼ¹›10aÉǹ›12aú›10a»¹Â¹Æ½·›11aºÃ›352a¹ÀÍ›10aÈÃá›11aǽ·¹
+›1110d›1363`È›10aìÀ¹Çá›11aµÂ¸›11a½Ç›11aÉÂÀ½¿
+›1166d›578`ÃÉÀ¸›13aƹÅɽƹ›13a½È›12aÈÛ13aƹµ¸›13aȼ¹›13a¹Â›245aÈÛ12aÁ¹ÁÃÆÍ›13aÈÛ12a¸¹È¹ÆÁ½Â¹›14aȼ¹
+›1166d›449`ȼµÈ›13aË›565aȽƹ›13aƵÇȹƛ12a½Â
+›1223d›696`Ì›13aǽιá›12a˼½ÀÇÈ›12aȼ¹›13aÃȼ¹Æ›12aºÃÆÁµÈÇ›12a¶›1aÃȼ›13a½Â·Àɸ¹›13aȼ½Ç›12a½ÂºÃÆÁµÈ½Ã›11a½Â
+›1223d›449`¶›1aÃɸ½Â»›14a¶›1aÃ
+›1279d›449`ȼ¹›12aìÀ¹á›12aÇÛ11aȼ¹›11a»ÀÍļÝÇ›11aƵÇȹƛ11a·µÂ›11a¶›1a¹›12a·ÃĽ¹¸›12aĽ¹·¹Á¹µÀâ›18a¤Â›12a·ÃÁÁÛ11a˽ȼ›11aÃȼ¹Æ
+›1336d›819`Í›18a¯›47aË›403a¼›18aìÀ¹Ç›14m›18a,423›10m›22a¶›1a¹›19aÃÆ»µÂ½Î¹¸›17aµÇ
+›1336d›449`¶½ÂµÆÍ›18aìÀ¹Ç›18aÉǹ¸›18a¶›92a³›27aµÆ¹›17aɸ¹Æ›19a±¨®á›18aÇÉ·
+›1346d›886`~
+›1392d›449`ÔÐÑð¶›564aÃÉÝÊ›711a¼
+›1392d›557`Íȹ›15aì̹¸ðÀ¹Â»È¼›16aƹ·ÃƸÇä›20a½º›14aÍ›83a¹›15a»ÃÈ›14aȼ¹Á›15a½Â›15aÇÃÁ¹›15aÃȼ¹Æ›15aÁÛ1a¸¹á›15aÇÉ·
+›1448d›449`µÇ›23a®ÈƹµÁ𧡛22aÃÆ›22aÊ›596aÈÆÃÀá›22aȼ¹Â›23a¹½È¼¹Æ›22aƹ·Æ¹µÈ¹
+›1448d›834`µÆ½µ¶À¹ðÀ¹Â»È¼›22aÂÃð·µÆƽµ»¹ð·ÃÂ
+›1505d›1015`ȵȽÛ14aú›14m›15aTSlhZWr›15aTSlhZ`›10m›156a¼›15aȼ¹Á›16aºÆÃÁ
+›1505d›449`ȼ¹Á›16a˽ȼ›15aµ›15a±¨®›15a½ÁÄÀ¹Á¹Â›523aá›16aÃÆ›15aº¹È·
+›1561d›449`ÇÃÁ¹Ë¼¹Æ¹›16a¹Àǹ›15aȼµÈ›14m›58a%2›10m›66aÊ›359aÈ›14aºÃÆÁµÈâ
+›1561d›14m›864`$.›10m›57a¼µ›22a¹›15aȼ¹Á›15a½Â›15aȼ¹›15aƽ»¼
+›1685d›12m›987`vx›26azy›16am~­z¢›16a·›10mh0+›12m¸›18ae~¢z¨
+›1685d›449``¹°¹°›52at}z§z›16a©¥›18a¦ª©›18am›46a¡
+›1772d›10m›482`È›12a­¨|®›10aȼ¹›12ah0+›342aÈÇ›11aÇÉÄÄ›1aÃÆȹ¸›12aµÆ¹›12aÄÀµ·¹¸›12a½Â›12m›11a¥¤z›10m›12a¸½Æ¹·ÈÃÆÍå
+›1772d›449`z›331aìÀ¹Ç›12aú›11aµÀÀ›11aȼ¹›11aºÃÂ
+›1828d›449`ȼ½Ç›12a½Ç›12aƹº¹Æ¹Â·¹¸›14m›14a5)!›10m›16aȼ¹›13aÀû½·µÀ›10aµÁ¹›13a3%7›17a0+›372aʽ¸¹¸›13aµÇ›12aȼ¹
+›1828d›1336`á›12aµÂ¸›12aȼ¹›13aÀµÈȹƛ11aÄÆÃ
+›1869d›15m›1459`HK
+›1885d›10m›620`µÀɹ›13aºÃÆ›12aȼ¹›12ai0+t&/.3t$)1%#3/18›10aÅɵÀ½ì¹Æ›49a½Â›12aȼ¹›13a$5)3/,.TWh#,$
+›1885d›449`¸¹ºµÉÀÈ›12aÊ
+›1941d›449`·ÃÁÁµÂ¸›13a¸¹ì½ȽÛ13aìÀ¹â›19a~µ·›98aÈ›12aìÀ¹›13aǼÃÉÀ¸›13a½Â·Àɸ¹›14aȼ¹›13aÁµ»Â½ì·µÈ½Ã›12aµÂ¸
+›1941d›1017`¼›13aºÃÂ
+›1998d›1100`ÍÄ›1a¹›19a¹ÌȹÂǽÃÂâ›33aªÂ›20aȼ¹›19aÇÍÇȹÁ›19aµÈ›19a­¨|®á
+›1998d›449`ƹÇÃÀÉȽÛ19a½Â¸½·µÈ½Ã›18a½Â›19a½ÈÇ›19aìÀ¹›20aÈ
+›2054d›449`3%7›17a0+›101aÈÇ›15aÈÛ14a3%7›17a1//3jn&/.32h0+o›280a¹›14aȼ½Çä
+›2054d›601`Ä›1aý›554aá›13aµÂ¸›15aÀÛ1aÿǛ15aÀ½¿
+›2105d›11m›1104`/*g
+›2105d›520`$BI><KGIP›20a3%7›37a1..3bf&.-32`
+›2149d›520``
+›2166d›520``
+›2183d›520``
+›2232d›805`R›107a#,"7RQ`TSZ/*c›413aR
+›2232d›520`#,"7RQ`TQQ/*c›413aR›107a#,"7RQ`TWQ/*c
+›2283d›805`R›107a#,"7RQ`VRY/*c›413aR
+›2283d›520`#,"7RQ`UTS/*c›413aR›107a#,"7RQ`WSS/*c
+›2333d›520`#,"7RQ`XUW/*c›413aR›15m›107aÆ›7aÆ›7aÆ
+›2333d›11m›805`R›107a#,"7RQ`YZW/*c
+›2374d›520``
+›2391d›520``
+›2408d›520``
+›2457d›805`R›15m›107aÆ›7aÆ›7aÆ
+›2457d›11m›520`#,)-#(`TQQ/*c
+›2498d›520``
+›2515d›520``
+›2532d›520``
+›2582d›520`#,1RQ`TQQ/*cR›128a#,1RQ`TSZ/*cS›128a#,1RQ`TWQ/*cS
+›2632d›520`#,1RQ`UTS/*cR›128a#,1RQ`VRY/*cR›128a#,1RQ`WSS/*cR
+›2683d›520`#,1RQ`XUW/*cR›128a#,1RQ`YZW/*cR›128a#,1RX`TQQ/*cS
+›2723d›520``
+›2740d›520``
+›2757d›520``
+›2813d›10m›449`ªÈ¼¹Æ›16aǽȹǛ15aÁµ›448aÈ›15aìÀ¹Ç›15aºÃÆ›15a¸½ë¹Æ¹Â›370aÈÃ
+›2813d›743`Í›15aÄƹº¹Æ›16aÈÛ14aÄÉÈ›16aȼ¹›16aºÃ›340aÈ›15aÁµ»Â½ì·µÈ½ÃÂÇ›14a½Â
+›2870d›449`ǹĵƵȹ›18a¸½Æ¹·ÈÃƽ¹Çá›18a½Â›18aȼ¹›18aºµÇ¼½Ã›18aÉǹ¸›19aµÈ›17a­¨|®›18aºÃÆ›14m›17a4-/›82a$›10m›23aĽ̹À›18aìÀ¹Ç
+›2870d›14m›1625`!#*%
+›2939d›486`Ýà
+›2955d›11m›519`w¯´›13a¦¯²§¥´´©®§›14a´¯›14a©®£¬µ¤¥›15a¡›14aË›13mT›11m›835a¶©¤¥¤
+›2955d›1018`›18a¡´›14a´¨¥›14a¥®¤›14a¯¦›14a´¨¥›14a¬¯§©£¡¬›14a®¡­¥È›14a´¨¥›14a±µ¡¬©Í¥²›15a°²¯
+›3000d›15m›449`³¶´µ›11m›1177a¨›11a­¡›87a´¡©®
+›3000d›545`¬¥§¡¬¬¹›11a¢›1a¥›12a£¡°¡¢¬¥›13a¯¦›11a¢›1a¥©®§›12a°²¥Í¸¥¤›13a´¯›12a¡›12a°¡²´©¡¬›11aͬ¥›12a³°›1a¥£©Í£¡´©¯®Å›13a·¨©£›81a¹›12a£¯®
+›3046d›449`¡›13a¤©²¥£´¯²¹›14a°¡²´
+›1;449;2910;2;598!|
+›1;807;2103;2;14!|
+›1;868;2052;2;15!|
+›1;524;2052;2;15!|
+›1;1274;1826;2;15!|
+
+
+›462d›10m›607`Ð×›12m›430a¿›45aÇÊÄ›140aÐÇËÊ›16aÄ›431aÅÃÎÏ
+›462d›1241`ËÎÉ¿›159aËΛ14aÏÕÏÐÃÉ›16aÉ¿Ê¿
+›607d›10m›781`Ëßâ›26a¤Â›17aȼ½Ç›17a·µÇ¹á›17aȼ¹›18aÊ›160aʽ¸¹¸›17aºÃÆ›17aȼ¹›17ai0+t&/.3t$)1%#3/18
+›607d›607`Þǹ¹›17a¶›1a¹ÀÛ451aµÀɹ›17aÄÆÃ
+›664d›607`ÅɵÀ½ì¹Æá›12aÃÆ›12a¶›213aµÀ¹Â·¹›13aÇÈƽ»›11aú›12a˼µÈ¹Ê›480aÃÉÀ¸
+›664d›870`Í›12aȼ¹›12a¹Åɽʛ448a¹Æ›11aÀû½·µÀ›11a½È›11aƹº¹Æ¹Â·¹Çá›13aË
+›720d›607`¹Â¸›16a˽ȼ›15aéhoÝâ
+›851d›12m›607``¹°¹±›51at}z§z›17a©¥›18a¦ª©›18ad­¦v¤yzy›18aov¨©z§›17a·›10mh07,›12m¸›18am~­z¢›16ae~¢z¨
+›940d›10m›640`È›21a­¨|®›20aµÀÀ›20aȼ¹›22aɹÌĵ¸¹¸›22aƵÇȹƛ21aĽ̹À›21aìÀ¹Ç›21aƹÀµÈ½Â»›19aÈÛ21a¹µ·›192aÈ
+›940d›607`z›1250a¼›21a¸½ë¹Æ¹Â
+›997d›1383`ÈÛ18aǹĵƵȹ›18aÇɶ›1a¸½Æ¹·ÈÃƽ¹Çá›18a˽ȼ›18aȼ¹
+›997d›607`Áµ»Â½ì·µÈ½Ã›17aµÆ¹›19a»µÈ¼¹Æ¹¸›18aÈû¹È¼¹Æ›18a½Â
+›1053d›607`Çɶ›1a¸½Æ¹·ÈÃÆÍ›14añµÁ¹ï›13aÆ¹í¹·È½Â»›14aȼ¹›14aÁµ»Â½ì·µÈ½Ã›12aµÂ¸›14aƹÇÃÀÉȽÃÂâ›18az›14aÄǹɸÃð
+›1109d›607`¸¹Ê½·¹›21a3%7›16a07,›17a1//3j›402a¼›20aȼµÈ›19aȼ¹Ç¹›20aÇɶ›1a¸½Æ¹·ÈÃƽ¹Ç›20aȼ¹Â
+›1109d›1066`½Ç›20aȼ¹Â›20a¸¹ì¹¸›22aÇÉ·
+›1166d›2082`¹
+›1166d›607`µÄÄ›1a¹µÆ›15aµÇ›13añµ·ÈɵÀï›13a¸½Æ¹·ÈÃƽ¹Ç›13aú›14aȼ¹›14aÄǹɸÃð¸¹Ê½·¹â›21aªÂ›15aÃÉÆ›13a½ÂÇȵÀÀµÈ½ÃÂá›12aË
+›1222d›1081`ËÇä
+›1222d›607`¸¹ì¹›16aȼ¹›16aÀµÈȹƛ14aµÇ›14aºÃÀÀÃ
+›1323d›12m›607`ºcbi»¶›10m›22a$%&).%i31!.2,!3)/.›15a!331)"43%l#/.#%!,%$›21a3%7›17a07,›17a1//3›23aq
+›1380d›12m›631`¶›10m›543a,ho
+›1380d›680`3%7›17a$)2+jn3%7h&/.32h07
+›1481d›607`¯¼¹›14ai07,t&/.3t$)1%#3/18›288a¹Â›13aȼ½Ç›13aÀû½·µÀ›12aµÁ¹›14aµÇ›13a½ÈÇ›13a¸¹ºµÉÀÈ
+›1481d›1166`ÅɵÀ½ì¹Æ›13a½Ç›13a»½Ê
+›1538d›628`µÀɹâ›20az›16aÀ½ÇȽ»›13aú›15aȼ½Ç›15a¸½Æ¹·ÈÃÆÍ›14aÁ½»¼›179a¹›14aȼ½Çä
+›1538d›607`Ê›729aÈ›14aÀÛ1aÿ›15aÀ½¿
+›1589d›11m›1321`Qg
+›1589d›678`$BI><KGIP›20a3%7›37a/7+›15a1..3bfQQQQQ
+›1641d›678`RSQQ`$)1cR›194aRTVQ`$)1cR›194aRVQQ`$)1cR
+›1693d›678`RWUT`$)1cR›194aRYQQ`$)1cR›194aSRWQ`$)1cR
+›1744d›678`SVZS`$)1cR›194aTQQQ`$)1cR›194aTRRQ`$)1cR
+›1796d›678`TXTS`$)1cR›194aUUXZ`$)1cR›194aVTXV`$)1cR
+›1847d›678`WUVQ`$)1cR›194aXXUQ`$)1cR
+›1899d›678`3GK:D›21aG?›21aRU›21a?BD>J`
+›1957d›10m›1417`Ê›129aÍÄ›1a¹›17ah07,å›17aȼµÈ›17aºÃÆ›16aȼ¹›18aÉÂð
+›1957d›607`¯¼¹›18aìÀ¹Ç›17a½Â›18aȼ¹›17a½Â¸½Ê½¸ÉµÀ›17a¸½Æ¹·ÈÃƽ¹Ç›16a¼µ›22a¹›17aìÀ¹›18aÈ
+›2014d›875`ÈÇ›15aÁ½»¼›365a¹›14aȼ½Çä
+›2014d›607`Áµ»Â½ì¹¸›15aºÃ›148aÈ›14aÀÛ1aÿ›14a޽›15aĵÆÈß›14aÀ½¿
+›2066d›11m›678`$BI><KGIP›20a3%7›37a/7+›15a1..3bfRVQQg
+›2111d›678``
+›2128d›678``
+›2145d›678``
+›2196d›678`!,22,#RQ`/7›435acR›107a"+!#*`/7+cR
+›2196d›919`+cR›107a!,22,#UQ`/7+
+›2247d›678`#)1#+%RQ`/7›435a+cT›85a#,"RQ`/7+cR
+›2247d›919`+cT›107a#)1#+%6RQ`/7
+›2299d›919`cR›129a#,"7RQ`/7+cR›150a#,"7RS`/7+cR
+›2299d›678`#,"28RQ`/7+
+›2351d›678`#,"7V`/7+cR›172a#,"7W`/7+cR›172a#,"7X`/7+cR
+›2402d›678`#,"7Y`/7+cR›172a#,"7Z`/7+cR›15m›172aÆ›7aÆ›7aÆ
+›2444d›11m›678``
+›2461d›678``
+›2478d›678``
+›2529d›678`#,1RQ`/7+cT
+›2571d›678``
+›2588d›678``
+›2605d›678``
+›2662d›10m›607`¯¼¹›16a¸½Æ¹·ÈÃÆÍ›14a˼½·›106aȵ½ÂÇ›14aȼ¹›16auF:@LM>I›22aW›15aìÀ¹Ç›16aÁ½»¼›178a¹›14aȼ½Çä
+›2662d›984`¼›15a·Ã›632aÈ›14aÀÛ1aÿ›14aÀ½¿
+›2714d›11m›678`$BI><KGIP›20a3%7›37a/7+›15a1..3bfSVZSg
+›2760d›678``
+›2777d›678``
+›2794d›678``
+›2844d›919`R›151a#,"7V`/7+cR›172a#,"7X`/7+cR
+›2844d›678`#,"7RQ`/7+c
+›2886d›678``
+›2903d›678``
+›2920d›678``
+›2971d›678`#,1RQ`/7+cR
+›3013d›678``
+›3030d›678``
+›3047d›678``
+›1;1068;2712;2;14!|
+›1;965;2712;2;14!|
+›1;1068;2064;2;14!|
+›1;965;2064;2;14!|
+›1;1068;1587;2;14!|
+›1;965;1587;2;14!|
+›1;755;1378;2;15!|
+›1;610;1376;4;21!|
+›1;1882;1321;2;15!|
+›1;1793;1321;2;15!|
+›1;1229;1321;2;15!|
+›1;913;1107;2;15!|
+›1;825;1107;2;15!|
+
+
+›462d›12m›449`¿ôï›45aÉâ›1aÙÞÛìÞáÜ›15açÝÚ›15aÁâààÖáÙ›14aÂÚøáÞçÞâá›15aÄÞßÚ›10m›531aÐØ
+›607d›13m›449`Z¬§›56aby›2apur¤uxs›18a}tq›18a[ywwmxp›19a\q­xu}uyx›18a^uvq
+›698d›10m›944`Û9a¿½È›11aºÃÆ›14m›43a_VlhXYpq›10m›10a½Â·Àɸ¹Ç›11aµ›11aìÀ¹›12a$5)3/,.TWh#,$
+›698d›449`¯¼¹›12a¸½ÇÈƽ¶Éȹ¸›11a½ÂÇȵÀÀµÈ½›14m›188aR
+›754d›10m›539`¼›22a¸¹ì¹Ǜ22aȼ¹›21a$5),.TW›21a·ÃÁÁµÂ¸›21aµÂ¸›22a½ÈÇ›20aÅɵÀ½ì¹ÆÇâ›38a®½Â·¹›22a½Â¸½Ê½¸ÉµÀ
+›754d›449`˼½·
+›811d›616`Í›19a¼µ›22a¹›20a¸½ë¹Æ¹Â›555aÈÇ›19aºÃÆ›20aȼ¹½Æ›19aĵ·›22a¹¸›21aµÂ¸
+›811d›449`ǽȹǛ20aÁµ›89aÊ›186aÈ›19aÁ½ÌÈÉƹǛ20aµÂ¸›20aµÆƵ»¹Á¹Â›309a¿
+›867d›449`ÉÂĵ·›22a¹¸›19aÞ½º›17aµÂ›708aÍÄ›1a¹›18aú›18aÃÉÈÄÉÈ›18a¸¹Ê½·¹›18a½Â
+›867d›566`¿›172aÍß›17aĽ̹À›18aìÀ¹Çá›18aµÂ¸›19aȼ¹›18a·ÃÁÁùÇÈ›17aÈ
+›923d›449`Éǹá›19aȼ¹›19aǹÂǽ¶À¹›18aÄÀµ·¹›18aÈÛ17aµÀÀÛ260a¼µÂ»¹Ç›18a½Ç›18a½Â›18aȼ½Ç›17aìÀ¹â›29a¯¼¹Æ¹ºÃƹ
+›923d›1044`Ë›17aºÃÆ›17aȼ¹Ç¹›19a·
+›980d›1418`ÈÇ›17a½Â›16aȼ¹›17a¸¹ì½ȽÃÂÇ›17aú›17aȼ¹
+›980d›449`½È›17aǼÃÉÀ¸›17a¶›1a¹›17aÁÛ1a¸½ì¹¸›18aÈÛ16aÆ¹í¹·È›17aÀÛ1a·µÀ›16aƹÅɽƹÁ¹Â
+›1036d›534`˽»›13aÅɵÀ½ì¹ÆÇä
+›1036d›449`ºÃÀÀÃ
+›1140d›15m›518`'›10m›22ai$%5)#%t380%á
+›1243d›15m›518`'›10m›22ai0!0%1t2)9%á
+›1346d›15m›518`'›10m›22aic./d5%1"/2%á
+›1450d›15m›518`'›10m›22ai3&-t$)1%#3/18á
+›1553d›15m›518`'›10m›22ai0+t&/.3t$)1%#3/18á
+›1656d›15m›518`'›10m›477aá›13aµÂ¸
+›1656d›563`i07,t&/.3t$)1%#3/18
+›1760d›15m›518`'›10m›22ai5)134!,t$)1%#3/18â
+›1863d›546`ÉÆȼ¹ÆÁÃƹá›15aȼ¹›15aÀ½Â¹›15aƹµ¸½Â»›16aéBF:@>›22ax3%7›17a%7%j$5)3/,.TWx›86aÍ›15a¹¹¸
+›1863d›520`¡›1178aÝ›13aÁµ
+›1919d›589`¼µÂ»¹¸›17aÈÛ17aÆ¹í¹·È›17aȼ¹›17aÀÛ1a·µÈ½Ã›16aú›16aȼ¹›17aÄÆûƵÁÝÇ›15a¹Ì¹·Éȵ¶À¹›17a½Áµ»¹›16aµÈ
+›1919d›449`ÈÛ17a¶›1a¹›17a·
+›1976d›472`ÃÉÆ›15aǽȹâ
+›1976d›449`Í
+›2035d›520`¯¼¹›17ai$%5)#%t380%›14aÅɵÀ½ì¹Æ›16a¼µÇ›16a½ÈÇ›15aÄ›1aÃÇǽ¶À¹›16aÊ›295aÍ›16aȼµÈ›15aǹ·ð
+›2035d›1433`µÀɹǛ17a¸¹ì¹¸›18a¶
+›2091d›449`ȽÛ16aú›17aȼ¹›17a$5)3/,.TWh#,$›14aìÀ¹›17a¼¹µ¸¹¸›18aé=>?BG>›22aMRI>›24a01).3%12Ýâ›23a¥ÉÇÈ›17aù
+›2148d›449`ú›11aȼ¹Ç¹›12aÊ›408a¹¸›11aµÇ›12aé=>?:NEMÝå›10aȼ¹›12a¸½ÇÈƽ¶Éȹ¸›11aÊ›210a¹Ç
+›2148d›631`µÀɹǛ12aǼÃÉÀ¸›11a¶›1a¹›12aÁµÆ¿›652a¹ÆǽÛ10aÁµ¿
+›2204d›449`,.TW›13aȼ¹›14a¸¹ºµÉÀÈ›13aÄƽ›85aÍÄ›1a¹â›196aá›12aȼ¹›13ai0!0%1t2)9%›324aÍ
+›2204d›866`ȹƛ13aÈ›102a®½Á½ÀµÆÀÍ›373aÅɵÀ½ì¹Æ›13a½Ç›13aǹț14a¶
+›2260d›449`ÁµÆ¿½Â»›18aȼ¹›19a¸¹ºµÉÀÈ›19a¸¹ì½ȽÛ19a½Â›18aȼ¹›19aé=>?BG>›23aMRI>›23a0!0%1t380%2Ý›17aǹ·È½ÃÂ
+›2317d›449`µÇ›15a¹½È¼¹Æ›15a!X›15aÃÆ›15a42â
+›2376d›872`Ê›304a¹›21a¼µ›22a¹›22aÃÉÆ›21aÉÂĵ·›22a¹¸›22aĽ̹À›22aìÀ¹Ç›22a½Â›21aµ
+›2376d›520`zÇ›22a¸¹Ç·Æ½¶›1a¹¸›22aµ¶›1aÛ22a¹á›23aµÈ›21a­¨|®›21aË›87aÊ›245a¿
+›2432d›1061`¿›734aá›23a˽ȼ
+›2432d›449`Èƹ¹›23aÇÈÆÉ·ÈÉƹá›24a˼½ÀÇÈ›21aÃÉÆ›22aĵ·›22a¹¸›23aìÀ¹Ç›23aµÆ¹›22aµÀÀ›21a½Â›23aµ›22aǽ»À¹›22a¸½Æ¹·ÈÃÆÍ
+›2489d›1157`â›25a¯¼¹Æ¹ºÃƹá›17aȼ¹›17aƹÀ¹Ê›44aÈ›17aǹ·È½Ã›17aú›17aÃÉÆ
+›2489d›449`Àû½·µÀ›16aµÁ¹Ç›17a¸¹ì¹¸›19aµÄÄÆÃÄƽµÈ¹ÀÍ›427aµÂ
+›2545d›449`$5)3/,.TWh#,$›252a¹›15aȼ½Çä
+›2545d›775`ìÀ¹›15aÀÛ1aÿǛ14aÀ½¿
+›2651d›1143`18g
+›2651d›545`JN:EB?B>K›23a0+t&/.3t$)1%#3/
+›2707d›640`G>@:M:;E>g
+›2764d›640`=>?:NEMg
+›2820d›640`O:EN>c=>?:NEMlx3%7t0+›190a^?BE>d
+›2820d›1143`jxgMRI>l
+›2877d›1143`/18g
+›2877d›545`JN:EB?B>K›23a07,t&/.3t$)1%#3
+›2933d›640`G>@:M:;E>g
+›2990d›640`=>?:NEMg
+›3046d›1143`,t1//3jx›166a?BE>d
+›3046d›640`O:EN>c=>?:NEMlx3%7t07›190agMRI>l^
+›1;2064;2164;153;8!|
+›1;1378;1861;2;15!|
+›1;2064;1172;174;8!|
+
+
+›462d›607`ÑÏ›12m›430a¿›45aÇÊÄ›140aÐÇËÊ›16aÄ›431aÅÃÎÏ
+›462d›1241`ËÎÉ¿›159aËΛ14aÏÕÏÐÃÉ›16aÉ¿Ê¿
+›607d›10m›607`Þ²¼¹Æ¹›20aȼ¹›21aÀû½·µÀ›18aµÁ¹›20a3%7›17a0+›20a½Ç›20a¸¹ì¹¸›22aµÇ›19a3%7›17a1//3jn&/.32h0+o›18aµÂ¸
+›648d›15m›1543`HL
+›664d›10m›607`3%7›17a07,›17a1//3›14aµÇ›535a,ho›35aß
+›664d›951`3%7›17a$)2+jn3%7h&/.32h07
+›720d›1082`ÃÉ›15aÁµ›374a¹›15aµÆ¹ä
+›720d›678`¨Ã›1a¸½ì·µÈ½ÃÂÇ›14aȼµÈ›14aÍ›122aÍ›15a˽Ǽ›14aÈÛ15aɸ¹Æȵ¿
+›814d›15m›675`'›10m›23a|¼µÂ»¹›14a¹½È¼¹Æ›13aÃÆ›14a¶›1aÃȼ›14a=>?:NEMl›12aÇÈƽ»Ǜ13aÈÛ13aÆ¹í¹·È›14aȼ¹›14aµ·ÈɵÀ›13a¸½Æ¹·ÈÃÆÍ
+›870d›721`ÇÄ›1a¹·½ì·µÈ½Ã›15a½ÂÇȹµ¸›15aú›14aÉǽ»›15aµ›15aÀû½·µÀ›14aµÁ¹â
+›964d›15m›675`'›10m›92aÃÉÆ›15aǽȹ›15a¸Ã›1a¹ÇÂÝÈ›15aÉǹ›16aù›16aú›15aȼ¹Ç¹›16aìÀ¹›16a·ÀµÇǹǛ15aµÈ›15aµÀÀá›14aƹÁÛ22a¹›15aȼ¹›16aÀ½Â¹
+›964d›721`¤º›16aÍ›1103aÊ
+›1020d›721`é=>?:NEMgÝ›13aºÆÃÁ›15aȼ¹›15aƹÀ¹Ê›44aÈ›15aÅɵÀ½ì¹ÆÝÇ›14a¸¹ì½ȽÃÂâ
+›1020d›1230`µÂ
+›1114d›711`È›21aÀ¹µÇÈ›21aù›22aú›21aȼ¹Ç¹›22aÅɵÀ½ì¹ÆÇ›14m›21a,423›10m›73aÊ›494aµÀɹ
+›1114d›678`z›743a¼µ›22a¹›22aµ›21a¸¹ºµÉÀÈ›21aÃÆ›21a¹ÌÄÀ½·½È›21aÊ
+›1170d›672`ʽ¸¹¸á›20aȼÆÃÉ»¼›18aȼ¹›19ah#,$›19aìÀ¹›19aÃÆ›18aµ›19a·ÃÁÁµÂ¸ðÀ½Â¹›19aÅɵÀ½ì¹Æå›20aȼ¹›19aÄÆûƵÁ
+›1170d›607`ÄÆÃ
+›1227d›607`·µÂÂÃÈ›16aÆÉ›16a˽ȼÃÉÈ›15aÇÃÁ¹›16aÇÃÉÆ·¹›16aú›16aĽ̹À›16aìÀ¹Çâ›22a¤º›16a¶›1aÃȼ›17aºÃÆÁµÈÇ›14aú›16aĽ̹À›16aìÀ¹Ç
+›1283d›1218`¿›666aÍ›10aµÈȹÁÄÈ
+›1283d›607`µÆ¹›11a½Â›10aÉǹ›11aµÈ›10aµ›11aǽȹá›10aȼ¹Â›11aȼ¹›11aĵ·›22a¹¸›11aùǛ11a˽ÀÀ›9a¶›1a¹›12a½ÂÇÄ›1a¹·È¹¸›11a¶›1a¹ºÃƹ›11aµÂ
+›1340d›607`ÈÛ15aÃÄ›1a¹Â›16aÉÂĵ·›22a¹¸›15aìÀ¹Çâ
+›1340d›890`¿
+›1396d›678`¯›120a¹›18aÉǹ›18aú›17aȼ¹›18a$5),.TW›17a·ÃÁÁµÂ¸á›18a¹µ·›178aÉÇÈ›18a½ÇÇɹ›18aȼ¹›18a}|§
+›1396d›707`Û17aÁµ¿›723a¼›18aÉǹƛ18aÁ
+›1436d›15m›799`HM
+›1452d›10m›607`·ÃÁÁµÂ¸
+›1546d›12m›607`ºcbi»¶›10m›22a2%3›24a#/--!.$›23a$5)3/,.TW
+›1639d›607`ÈÛ18aƹµ¸›18aȼ¹›19aÞÄ›1aÃÇǽ¶ÀÍ›17aƹʽǹ¸ß›18a·ÃÁÁµÂ¸›19a¸¹ì½ȽÛ18aìÀ¹å›20a¯›17a³Â½·½µÂÇ›18a·µÂ›19a¸Ã
+›1649d›1753`~
+›1696d›607`ȼ½Ç›15aºÃÆ›15aȼ¹½Æ›16aÉǹÆÇ›16aµÉÈÃÁµÈ½·µÀ›74aÍ›15a½Â·Àɸ½Â»›16aȼ¹›16aµ¶›1aÛ22a¹›15a2%3›24a#/--!.$›14a½Â›16aµ
+›1696d›1227`ÀÍ›14a¶›386aÊ
+›1752d›607`·ÃÁÁµÂ¸›15aÄÆÛ1a·¹¸Éƹ›16aȼµÈ›15aµÀÀ›14aÉǹÆÇ›15aú›15a¯›18a³›15a¹Ì¹·Éȹâ
+›1762d›1378`~
+›1809d›678`~Ê›1155aÍ›19a½ÇÂÝÈ›20aȼ¹
+›1809d›732`¹Â›21a¶›1a¹Èȹƛ21aÞ¶›1a¹·µÉǹ›22aȼ¹›21a±¨®›21a|ÃÁÁµÂ¸›21a}¹ì½ȽÛ20a°È½À½È
+›1865d›607`ºµÇȹÇÈ›14aú›15a¶›1a¹µÇÈÇÛß›20a½Ç›15aºÃÆ›14aȼ¹›16aÇÍÇȹÁ›14aÁµÂµ»¹Æ›15aÈÛ15aµ¸¸›15aȼ¹›15a$5),.TW›15a·ÃÁÁµÂ¸
+›1922d›607`ÈÛ423a%2h%7%›14aÇÛ16aȼµÈ›15aȼ¹›16a·ÃÁÁµÂ¸›17a½Ç›15aµÀË›21aÍÇ›15aµ›20aµ½Àµ¶À¹›15aÃÂ
+›1922d›664`282^2(!1%j$#,3!",›715aµ›78aÊ
+›1978d›1202`Í›15a½ÇÇɽ»›15aȼ¹›15a·ÃÁÁµÂ¸ä
+›1978d›607`µ›15aÇÍÇȹÁð˽¸¹›15a¶µÇ½Çå›14a¸Ã›15aȼ½Ç›15a¶
+›2072d›12m›607`ºcbi»¶›10m›22a2%3›24a#/--!.$›23a$5)3/,.TW›22aq
+›2128d›12m›631`¶›10m›478a282,)"o$›166a2h%7%›22aq
+›2128d›680`i3!",%l282^#/--/.jn›190a#,3!",%
+›2185d›12m›631`¶›10m›478a2,)"o$#,›166a%7%
+›2185d›680`i/43l282^#/--/.jn28›190a3!",%2h
+›2278d›1392`ÃÉ›11a¼µ›22a¹›12aËƽȹ›10aµ··¹ÇÇ›12aÈÛ11aȼ¹›12a¸½Æ¹·ÈÃÆÍ
+›2278d›607`¯¼½Ç›12a·ÃÁÁµÂ¸›11a·µÂ›12aÃÂÀÍ›11a¶›1a¹›13a¹Ì¹·Éȹ¸›13a½º›11aÍ›105aÊ
+›2319d›15m›823`HN
+›2335d›10m›607`282^2(!1%
+›2456d›13m›1056`y{w|›19aaun{m{¤›18ary{›19a~|q›18a¢u}t›19a}tq›18af~q~q
+›2456d›607`Z¬¨›56a[{qm}uxs›18am›19a^
+›2542d›10m›1116`Í›11aȼ¹›11a±›153aȹƛ11aÇÍÁ›84aÈ›9a½Ç›11a·Ã›162aÍ›12m›11aÛâåàæ›10m›2aå
+›2542d›607`¯¼¹›11aºÃÆÁµÈȽ»›9a½ÁÄ›1aÃǹ¸›11a¶›137az³›10aÄƽ›145a¶½Ã›135aÈÆÃÀÀ¹¸›9a¶
+›2598d›607`ȼ¹›16a01).3›285a¹Ç›15aµ›15ai&/1-l›14aÅɵÀ½ì¹Æ›15a˼½·›99aÍ›15a¶›1a¹›16aÉǹ¸›16aÈÛ14aÇÄ›1a¹·½ºÍ
+›2598d›820`·ÃÁÁµÂ¸›15aȵ¿›514a¼›15aÁµ
+›2665d›14m›644`Ýá
+›2681d›11m›676`{¨¥›17a¬¡´´¥²›16a£¡®®¯´›17a¢›1a¥›17a·²©´´¥®›16a¡³›13m›17a1%5›13a/--1TV&›58a0R›58aRW›11m›273a¯µ¬¤›17a£¡µ³¥
+›2681d›13m›1453`-,1›38a.5*›11m›53a¢›1a¥£¡µ³¥›17a´¨¡´›17a·
+›2726d›632`n~›15ay¥£¯²¤›17av¡®¡§¥­¥®›591a´¥²°²¥´›17a´¨¥›16a¥¸°¡®¤¥¤›17a³´²©®§
+›2726d›607`|›402a´›17az¥²¶©£¥³›16aÃyvzÄ›17a´¯›16a¡´´¥­°´›16a´¯›15a©®
+›2772d›13m›819`%5R›58a-,›58a.5›58aVH›58aW›15mË›4aË›6aË›11m›6aÁ
+›2772d›13m›607`1%5›13a$(0)TV1›58aWV&›38a10R›38a*RW›38aLGG
+›2802d›14m›644`Ýâ
+›2818d›11m›676`z¯­¥›9a³¯²´›9a¯¦›9a¬¯§©£¡¬›8a®¡­¥›9a¯²›9a¯´¨¥²›9a­¥¡®³›10a¯¦›8a¥¸°²¥³³©®§›10a´¨¥›9a³°›1a¥£©Í£¡´©¯®›10a¯¦›8a´¨¥›9a¤©²¥£´¯²¹
+›2863d›731`¨›13m›135a,GJ›38a*$›11m›13a²¥³©¤¥³›16a·©¬¬›15a­¯³´›16a°²¯¢¡¢¬¹›17a¢›1a¥›16a²¥±µ©²¥¤È›18a¡´›15ayvpzÅ›16a·›51a¥¥°›16a¡¬¬
+›2863d›607`©®›16a·¨©£›13m›36a$3(1-*›58aR#›11m›952a¥›16a«
+›2909d›607`³µ£›854a¨›13a´¨¥›13a¬¯§©£¡¬›12a®¡­¥›13m›14a1%5›12a%5%T›11m›12a²¥¦¥²³
+›2909d›659`¨›14a£¯­­¡®¤›14a¤¥Í®©´©¯®›13aͬ¥³›13a©®›13a´¨¥›13a¤©²¥£´¯²¹›14a´¯›13a·¨©£
+›2939d›14m›644`Ýã
+›2955d›11m›1097`·›14a²¥£¯­­¥®¤³›15a°¬¡£©®§›14a´¨¥›13a²¥¶©³¥¤›15a´¡¢¬¥³›13a©®›13m›14a060Q#-+›38a,›11mÅ›11a³¯
+›2955d›676`w¯´¥›14a´¨¡´›14a´¨©³›13a³¥£´©¯®›14a®¯›13m›888a+-
+›3000d›11m›607`´¨¡´›13a³¥°¡²¡´¥›13a®¯›1a¤¥³›13a©®›12a¡›12a£¬µ³´¥²›12a¤¯®Â´›13a¥®¤›12aµ°›13a²µ®®©®§›13a¤©Ì¥²¥®›46a¥²³©¯®³›13a¯¦›12a´¨¥›12a´¡¢¬¥³È›13a´¨©³
+›3000d›1637`´›13a¶
+›3046d›607`·›241aÅ›13a¯¦›13a£¯µ²³¥Å›14a©¦›12a{›336a¥²¥›13a®¯´›13a©®³´¡¬¬¥¤›13a£¬µ³´¥²Ñ·©¤¥Æ
+›3046d›634`¯µ¬¤›13a®¯´›13a¡°°¬¹›271a~›13a¡®¤›14a©´³›12a¦²©¥®¤³›13a·
+›3054d›1130`r
+›1;1898;2907;2;12!|
+›1;669;2770;2;12!|
+›1;1303;2679;2;12!|
+›1;607;2636;2;598!|
+›1;610;2181;4;21!|
+›1;610;2124;4;21!|
+›1;1026;662;2;15!|
+›1;771;662;2;15!|
+›1;682;662;2;15!|
+›1;1636;605;2;15!|
+›1;1206;605;2;15!|
+
+
+›462d›12m›772`âåàæ›14aÛâå›14aèæÚ›16aêÞçÝ›15aÈÊíð›15aÍèÚèÚ›10m›515aÑÐ
+›462d›12m›449`¿ôñ›45aÂÚøáÞáÜ›16aÄ
+›607d›10m›1078`Ƚ»›18aµÂ›432a¼›18aºÃÆÁ›19a¸¹ì¹Ç
+›607d›449`ȼ¹›20aºÃÆÁ›18aÈÛ18a¶›1a¹›20aÉǹ¸›20a˼¹Â›19aÄƽ›143aÍ›19aĵÆȽ·ÉÀµÆ›18aìÀ¹â›32a~µ·
+›664d›609`ȵ¶À¹›15aǽι›17aú›16a¹µ·›310aÍ›15aÇÄ›1a¹·½ºÍ›17aȼµÈ›16a·¹Æȵ½Â›12m›15aæÚçèã›17aøßÚæ›10m›18a¶›1a¹
+›664d›449`ȼ¹›17aÄƽ›316a¼›16aĵ»¹á›16aµÂ¸›17aÁµ
+›720d›449`ÃÉÈÄÉÈ›12aÈÛ10aȼ¹›12aÄƽ›407a¼›12a¾Ã¶›11aµÂ¸ãÃÆ›11aĵ»¹â›19az›11aǹĵƵȹ›11aÀ½¶ÆµÆÍ
+›720d›801`ȹƛ11aµÈ›11aȼ¹›11aÇȵÆÈ›10aú›11a¹µ·
+›777d›563`¼›16aǹÈÉÄ›15aìÀ¹Ç›15aÁµ›415a¼›15aÅɹɹâ
+›777d›449`ú›15aÇÉ·›312aÍ›15a¶›1a¹›16aÇÄ›1a¹·½ì¹¸›16aºÃÆ›15a¹µ·
+›833d›817`¼›12aǹÈÉÄ›13aìÀ¹Ç›13a˽ÀÀ›11a¶›1a¹›13aƹÅɽƹ¸›13aºÃÆ›12aÉǹ›13a˽ȼ›12aµÂ›12a§©ÏÒá›13aµÂ¸›12aµÈ
+›833d›520`z›13a·ÃÉÄÀ¹›12aú›13aÇÉ·
+›889d›715`Û14aȼ¹Í›17aµÆ¹›15a¼¹À¸›17a½Â›16aȼ¹›16aìÀ¹›471ah3,"›104a¼
+›889d›449`ȼ½Ç›16a½ÂÇȵÀÀµÈ½›548a282^,)"1!18j,.TW#3,›109a˼½·
+›930d›15m›769`HO
+›946d›10m›449`½Ç›18aµ›17aȹÌÈ›17aÀ½¶ÆµÆÍ›36aâ›28a¤È›18a½Ç›17a¹·¹ÇǵÆÍ›491a¼›18aµ›17aÀ½¶ÆµÆÍå›17aȼ½Ç
+›946d›1128`á›18aȼ¹Æ¹ºÃƹá›18aÈÛ17a·Æ¹µÈ¹›18aÇÉ·
+›1002d›449`¹¹¸›17a¶›1a¹›15a¸Ã¹›16aÃÂÀÍ›15a÷¹ä
+›1084d›12m›449`ºcbi»¶›10m›23a,)"1!18i#1%!3%i3›524a,
+›1084d›1020`%73›22a282^,)"1!18j,.TW#3
+›1166d›449`¡›130aȽ»›12ah,.W›432a˽»›11aÈ›31aÛ12aǹÈÉÄ›13aìÀ¹Ç›13a˽ÀÀ›11a¶›1a¹›14aƹÅɽƹ¸ä
+›1166d›475`ÃÆ›13aÄƽ›198aìÀ¹Çá›13aµÈ›12aÀ¹µÇÈ›12aȼ¹›13aºÃÀÀÛ121aË
+›1248d›505`Ðâ›22a1%2%3h373›293aȵ½Â›17aȼ¹›18a¹Ç·µÄ›1a¹›19aǹÅɹ·¹›18aÈÛ18aƹǹț17aȼ¹›18a§©ÏÒ
+›1248d›796`ó›17aǼÃÉÀ¸›17a·ÃÂ
+›1305d›1049`ÉÇ›13a·À¹µÆ½Â»›12aµÂ›541aÍ›12a¶›1a¹
+›1305d›563`ÈÛ12a½ÈÇ›12aºµ·ÈÃÆÍ›12aǹÈȽ»Çá›12aȼ›269aÍ›13a¹ÆÆÃÆ›12a·Ã¸½È½ÃÂÇâ›18a¯¼½Ç›13aÁµ
+›1354d›15m›1344`Â
+›1361d›10m›743`Ë›52a¼µÆµ·È¹Æ›12a¹Ç·µÄ›1a¹›13aǹÅɹ·¹›14aé›36a<Ýá›12aµÀȼÃÉ»¼›12aÄÆÃÄ›1a¹Æ›13aƹǹÈȽ»
+›1361d›563`¾ÉÇÈ›12aȼ¹›13aÈ›31aÛ11a·
+›1368d›15m›1358`Á
+›1410d›1088`›88aÂ
+›1417d›10m›563`ú›15aµÂ›16a§©ÏÒð«ÀÉÇ›15aƹÅɽƹǛ15aé›37an`I›36a<›354a¹¿ÈÆý̛14aÁÛ1a¸¹›16a½Ç
+›1417d›1257`Ý›15aÈÛ15a¹ÂÇÉƹ›16aȼµÈ›15a¯
+›1424d›15m›1102`Á›85aÁ
+›1474d›10m›563`·ÃÆƹ·ÈÀÍ›14a·µÂ·¹ÀÀ¹¸â
+›1563d›505`Ñâ›22a0/131!)3h373›300aȵ½Â›20a¹Ç·µÄ›1a¹›20aǹÅɹ·¹Ç›22aÈÛ19aÉǹ›21aȼ¹›20a§©ÏÒ
+›1563d›870`ó›19aǼÃÉÀ¸›20a·ÃÂ
+›1619d›896`ȵȽÃÂá›20aÉǽ»›21aȼ¹›21aµÄÄÆÃÄƽµÈ¹›20aĵě1a¹Æ›21aǽιå›23aµÈ›21a­¨|®
+›1619d›563`½Â›21aÄ›1aÃÆÈƵ½È›19aÃƽ¹Â
+›1676d›595`¹›15aÉǹ›16a~ÉÆÃÄ›1a¹µÂ›16azÓ›16aĵě1a¹Æ›16a½Â›15a¹Ìȹ¸¹¸›17aÄ›1aÃÆÈƵ½È›14aºÃÆÁµÈå›14aµÂ›15aµÄÄÆÃÄƽð
+›1676d›563`Ë
+›1725d›15m›1043`›159a›111a›63a›63a›64aÂ
+›1732d›10m›854`ÃÉÀ¸›12a¶›1a¹ä›19aé›36an_VVy*›36anUZF›36ac"›36adT›37aer›36afsÝâ›18a¯¼½Ç›13aǹÈÉÄ
+›1732d›563`µÈ¹›12aǹÅɹ·¹›14aË
+›1739d›15m›1057`Á›156aÁ›110aÁ›61aÁ›61aÁ›62aÁ
+›1789d›10m›563`ǹÅɹ·¹›13aµ·ÈɵÀÀÍ›11a½Ç›11aƹÅɽƹ¸›12aÃÂÀÍ›11aºÃÆ›11aÂÃÂð¯›342aȹÆå›12a½È›11a¸¹ð
+›1789d›1436`³›12aÉǹ›12aú›11aȼ¹›12aÄƽÂ
+›1799d›1410`~
+›1845d›563`ì¹Ǜ14aȼ¹›13aĵě1a¹Æ›14aµÆ¹µ›13aÈÛ13a¶›1a¹›14aÉǹ¸á›14aǹÀ¹·ÈÇ›13aµ›13aÇȵ¸µÆ¸›13aÞ}~|›12aÁÃÂÃÇĵ·¹¸ß
+›1902d›624`Èá›25aµÂ¸›24a¸¹Ç½»ÂµÈ¹Ç›23aȼ¹›24a¢Ï›13mö›8aö›7aö›10m›107a¼µÆµ·È¹Æ›23aǹÈÇâ›45a©Ã¹›24aú›23aȼ½Ç›23a½Ç
+›1902d›563`ºÃ›584a¢Ò›23a·
+›1958d›1075`Í›11a¯›18a³á›11aǽ·¹›14m›43a_VlhXYpq›10m›10aÄÉÈÇ›11aµÄÄÆÃÄƽµÈ¹›10a¹Çð
+›1958d›563`ÇÈƽ·ÈÀÍ›10a¹·¹ÇǵÆÍ›11aºÃÆ›10aÉǹ›11a¶›14m›250aR
+›1968d›10m›1135`~
+›2015d›906`ÈÛ11aȼ¹›13ah,.W›12aìÀ¹›13aÈÛ12a·Ã›485aË›42a¹Æá
+›2015d›563`·µÄ›1a¹›13aǹÅɹ·¹Ç›14a½Â›426aÈÆÃÀ›11aµÀÀ›11aȼ¹Ç¹›13aº¹µÈÉƹÇå›13a¼Ã›31a¹Ê
+›2065d›14m›1820`}
+›2071d›10m›563`ÇÉ·›304aÃÉÀ¸›15a¶›1a¹›16aÉǹºÉÀ›15aºÃÆ›15aºÃÆÁµÈȽ»›13aÃƸ½ÂµÆÍ›14aÞÂÃÂð§›5a¯›18a³ß
+›2071d›625`¼›16aµ›15aǹÈÉÄ›15aìÀ¹›15aË
+›2085d›1866`~
+›2127d›738`Ƚ»›14aÛ15aȼ¹›15a§©ÏÒâ
+›2127d›563`ȹÌÈ›15aÄƽÂ
+›2209d›564`Í›20a¶›1a¹›22a·Ã›22a¹Â½¹Â›645a¼›21aµÇ›20a,!.$2#!0%h373á
+›2209d›449`¤È›21aÁµ›178aÊ›101aÈ›20aÈÛ20a¸¹ì¹›22aÃȼ¹Æ›20aǹÈÉÄ›21aìÀ¹Ç›21aÇÉ·
+›2266d›449`%,)3%h373á›14m›14a%3#›10m›3aâ
+›2385d›13m›846`y{w|›19ary{›18a~|q›19a¢u}t›18aac¥¨›19af~q~q
+›2385d›449`Z¬©›56a\q­xuxs›19a^
+›2471d›10m›1328`Ƚ»›10ah,.W›408aÍ
+›2471d›449`ªÂÀÍ›12aù›11aºÃÆÁ›10a½Ç›11aƹÅɽƹ¸›11aÇÄ›1a¹·½ì·µÀÀÍ›11aºÃÆ›11aÄƽ›194aìÀ¹Çå›12aÃȼ¹Æ›11aºÃÆÁÇ›11aÁµ
+›2528d›449`¶›1a¹›13a¸¹ì¹¸›13aºÃÆ›11a·Ã›22a¹Â½¹Â·¹›13a˼¹Â›12aÄƽ›600aÈ›11a­¨|®á
+›2528d›794`Ê›350aȽ»›11aÃȼ¹Æ›11aìÀ¹Ç›12aÛ12aȼ¹›12a§©ÏÒâ›19az
+›2584d›449`ȼ½Ç›16aºÃÆÁ›16a½Ç›15a·µÀÀ¹¸›16a0,/3›17a&/1-›833aȽ»
+›2584d›1033`á›15aǽ·¹›17a½È›15a½Ç›16aµÀÇÛ15aÉǹ¸›17aÈÛ16añºÃÆÁµÈï›14aºÃÆ›16aÄƽÂ
+›2641d›449`ìÀ¹Ç›18a˼½·›611a¹Â›17aºÆÃÁ›17a»ÆµÄ¼½·Ç›18aȹÆÁ½ÂµÀÇâ›27a¤È›18a¼µÇ
+›2641d›633`¼›18a·ÃÂÇȽÈÉȹ›17aǷƹ¹Â›19a¸ÉÁÄÇ›19aȵ¿
+›2697d›449`¶›1a¹¹Â›20aµÆ¶½ÈƵƽÀ›415aÉÁ›592aË›18aÉǹÇ
+›2697d›741`Í›16aµÇǽ»Â¹¸›18aµÇ›17aºÃÆÁ›18a›61a¶›1a¹Æ›18a×Òá›18aµÂ¸›18aȼ¹›18a¹ÌµÁÄÀ¹›18a¶›1a¹ÀÃ
+›2753d›773`ÉÁ›376a¼›16aÂÃÁ¹Â·ÀµÈÉƹ›16a¹¹¸Ç›16aÈÛ15a¶›1a¹›16aµÇǽ»Â¹¸
+›2753d›449`ȼ½Ç›15aµÁ¹›16aµÂ¸›16a›61a¶›1a¹Æâ›21aªº›16a·ÃÉÆǹá›15aÇÉ·
+›2810d›449`Çɽȵ¶ÀÍ›15aµÈ›14a¹µ·›147aÍ›15aȼ¹›16aÇÍÇȹÁ›14aÁµÂµ»¹Æâ
+›2810d›740`¼›16aǽȹ›14a¶
+›2866d›520`¯¼¹›17aºÃÀÀÛ349aÃÉÀ¸›16a»¹Â¹ÆµÈ¹›17aµÂ›17aµÄÄÆÃÄƽµÈ¹›16aºÃÆÁå›16aȼ¹›17aºÃ›1aÃÈð
+›2866d›700`˽»›15a·ÃÁÁµÂ¸›17aË
+›2923d›449`ÂÃȹǛ15a¸¹Èµ½À›15a½È¹ÁÇ›14aÈÛ15a˼½·›352aȽÛ13aǼÃÉÀ¸›15a¶›1a¹›16aĵ½¸ä
+›2923d›962`¼›15aĵÆȽ·ÉÀµÆ›14aµÈȹÂ
+›2984d›14m›486`Ýä
+›3000d›11m›519`t´›21a©³›21a¡›22a²¥±µ©²¥­¥®›230a´¥²›22a³¹­›70a´›22a´¨¡´›22a¦¯²­³›22a¬©¢²¡²©¥³›21a¢›1a¥›22a©®›21a¤©²¥£´¯²¹
+›3000d›842`´›22a¯¦›21a´¨¥›22a°²©®›134a¢©¯®
+›3046d›13m›449`060Q*("/›58aT
+›3046d›608`!/6
+›1;449;2956;2;598!|
+›1;923;2582;2;15!|
+
+
+›462d›10m›607`ÑÑ›12m›430a¿›45aÇÊÄ›140aÐÇËÊ›16aÄ›431aÅÃÎÏ
+›462d›1241`ËÎÉ¿›159aËΛ14aÏÕÏÐÃÉ›16aÉ¿Ê¿
+›607d›15m›607`90/1:8›11m›23a$%&)-%a&.1,h
+›657d›15m›629`8›11m›264a-dm/G›108aK›20aWWOYQ›21aNBKAGLK›20a61!/›21a?GI›21aD:J>I›21aHIBFK>IJmh
+›657d›676`a$%2#1)/3).›108aIKI:B
+›707d›15m›629`8›11m›23aa+%-'3(dWWh
+›742d›15m›1549`½À
+›757d›629`8›11m›23aa,!1')-d]".›108aQ_+%&›108a)'(3d›86a/dQ^h
+›757d›917`33.,d›108a3dQ_1›108aQ_3.
+›791d›15m›912`¼
+›791d›896`¾
+›806d›629`8›11m›23aa23.#*d!Uh
+›841d›15m›939`¾½
+›856d›629`8›11m›264ah
+›856d›676`a-.314-#!3%
+›906d›15m›629`8›11m›23aa-.61!/h
+›941d›15m›912`¾
+›941d›896`¾
+›956d›629`8›11m›23aa6)$3(dYQh
+›991d›15m›1217`¿
+›991d›1201`¾
+›1006d›629`8›11m›264a%3_/.›108a3^h
+›1006d›676`a2%34/d]1%2›108a131!)
+›1056d›15m›629`8›11m›88a/+.3›15a&.1,›21aYT
+›1176d›13m›607`Z¬ª›56ahq}}uxs›18a}tq›18a°i›332a¤|uomv›19a[tm{mo}q{u|}uo|
+›1176d›1103`q{wuxmv«|®›17aet
+›1261d›10m›1750`ȹƛ18a¼µÇ›18a¶›1a¹¹Â›19a·ÃÂð
+›1261d›607`¯¼¹›19aìÆÇÈ›18aÇȹÄá›18aµÇÇÉÁ½Â»›18aȼµÈ›18aµ›18a§©ÏÒ›18aÃÆ›18a§©ÏÒð«ÀÉÇ›18aÄƽÂ
+›1318d›607`¹·È¹¸›13aÈÛ12aµ›12aĵÆȽ·ÉÀµÆ›12aȹÆÁ½ÂµÀ›11aÄ›1aÃÆÈ›12aú›12aȼ¹›12m›42a¿Ô›10má›12a½Ç›12aÈÛ12a·ÃÂì»Éƹ›13aȼµÈ›11aÄ›1aÃÆÈå›13aµÈ
+›1318d›12m›1445`Ò
+›1374d›10m›607`­¨|®›16aȼ¹›17aȹÆÁ½ÂµÀ›15a¼µÇ›16a¶›1a¹¹Â›18a·Ã¹·È¹¸›17aÈÛ16at37!Xj›338aʽÃÉÇÀÍ
+›1374d›1625`á›16a¶ÉÈ›17aȼ½Ç›16a˽ÀÀ›15aö
+›1431d›1092`Èâ›19a¯¼¹Æ¹ºÃƹ›13aȼ¹›14a¹ÌµÁÄÀ¹Ç›13aƹº¹Æ›13aÈÛ13aȼ¹›14aȹÆÁ½ÂµÀ›12aÀ½Â¹
+›1431d›607`¶›1a¹›14a½ÂÇȵÀÀµÈ½ÃÂð¸¹Ä›1a¹Â¸¹Â
+›1487d›1038`¶›1aÃÀ›11a,!2%1t3%1-á›11aȼ½Ç›11a·µÂ›12a¶›1a¹›13a¹Åɵȹ¸›12aÈÛ12aȼ¹›12aƹµÀ›11a¸¹Ê½·¹
+›1487d›607`ȼÆÃÉ»¼›12aȼ¹›12a}|§›12aÇÍÁ
+›1544d›607`¶›709aÈ›14aÇÉ·›259a˽»ä
+›1544d›631`Í›15aÁ¹µÂÇ›15aú›15aµ›15a}|§›15aÇÈƽ»›14aµÇǽ»ÂÁ¹Â›93a¼›16aµÇ›15aȼ¹›15aºÃÀÀÃ
+›1629d›12m›607`ºcbi»¶›10m›22a,!2%1t3%1-›23al›24axt37!Xjx
+›1715d›607`¯¼¹Æ¹ºÃƹá›14aË›885a¹›13aȼ½Ç›13aÞƹº¹Æ›13aÈÛ13aȼ¹
+›1715d›857`¹›13a˽ÀÀ›13a¹¹¸›14aÈÛ13a½ÇÇɹ›14aµ›13a·ÃÁÁµÂ¸›14aÇÃÁ¹Ë¼µÈ›13aÀ½¿
+›1771d›607`ºÃ›1aÃÈÂÃȹǛ14aºÃÆ›15aȼ¹›14m›15a1›155aO›31a%›10m›18a¶›1a¹¼½Â¸›17aÇÃÁ¹›15aú›14aȼ¹Ç¹›16aǹÈȽ»Çßä
+›1771d›14m›969`!)2.-›16a$L%31
+›1857d›12m›607`ºcbi»¶›10m›22a2%3›24a3%1-).!,q
+›1897d›15m›944`IK
+›1913d›12m›631`¶›10m›23ai0%1-!.%.3q
+›1954d›15m›1129`L
+›1954d›1112`I
+›1970d›12m›631`¶›10m›23ai$%5)#%t380%l,.TWq
+›2026d›12m›631`¶›10m›23ai&/1-q
+›2083d›12m›631`¶›10m›23ai3!"q
+›2123d›15m›992`IM
+›2139d›12m›631`¶›10m›23ai20%%$lU]VTTq
+›2180d›15m›944`IN
+›2196d›12m›631`¶›10m›23ai6)$3(lVYYq
+›2254d›14m›644`Ýå
+›2270d›11m›676`w¯›12a­¡²§©®³›12a¡²¯µ®¤›13a´¨¥›12a´¥¸´È›12a´¨¥³¥›12a£¯µ¬¤›12a©®›492a¨›11a­©§¨›62a¥®
+›2270d›1393`´²¯›1a¤µ£¥›12a³°µ²©¯µ³›13a³°¡£¥³Å›13a·¨©£›113a´›12a¥¶
+›2315d›607`¢›1a¥›13a©®›13a´¨¥›13a­©¤¤¬¥›13a¯¦›13a¡®›13a¥³£¡°›1a¥›14a³¥±µ¥®£¥
+›2345d›14m›644`ÞÜ
+›2361d›11m›952`´›11aª¯¢³›11a·©¬¬›10a¯®¬¹›11a¢›1a¥›12a²¥¬¥¡³¥¤›11a´¯›11a´¨¥›12a°²©®›248a´¡©®³›12a´¨¥›11a£¯²²¥£´
+›2361d›676`r®³µ²¥›12a´¨¡´›12a°²©®›627a´¥²›11a·¨¥®›12a©´›10a£¯®
+›2407d›729`¹°›1a¥Æ
+›2407d›607`°¡°›1a¥²›14a´
+›2436d›14m›644`ÞÝ
+›2452d›13m›676`S,-1/2,#›38a%S,›58a!.›11m›423a¨¡²¡£´¥²›13a²¥£¯²¤³›13a¯¦›12a´¨¥›13m›13aR*,J›11m›11aͬ¥³›12a¤¯®Â´
+›2452d›13m›835`!1›58a-4/›11m›49a´¯›12a¥®³µ²¥›13a´¨¡´›13a´¨¥›13a¬¯®§›13a£
+›2498d›607`§¥´›13a¢²¯«›127a¹›13a´¨¥›13a³¹­›70a´
+›2498d›745`¥®›14aµ°›14a¢›164a¢©¯®
+›2528d›14m›644`ÞÞ
+›2544d›11m›676`{¨¥›12a·©¤´¨›11a©³›11a³´©¬¬›10a³°›1a¥£©Í¥¤›12a¡³›12a´¨¥›11a­¡¸©­›131a´¡¢¬¥›11a·©´¨›11a´¨¥›12a°²©®›269a´³Å
+›2544d›1347`µ­›12a°²©®›311a´¥²Â³›11a©®Ñ¢µ©¬´›11a¦¯®
+›2589d›607`©®›13a¯²¤¥²›13a´¨¡´›14a¡®›276a´¥¤›14a¡²¥›13a¯¦›13a´¨¥›13a£¯²²¥£´›13a·©¤´¨
+›2589d›875`¹›13aΡ§›14a°¡§¥³›13a°²©®
+›2619d›14m›644`Þß
+›2635d›11m›710`¶›37a¥›14a´¨¥›13a¡°°²¯°²©¡´¥›14a³¥´µ°›14aͬ¥³›13a·¨¥®›13a´¨¥›13a¦¯²­›13a©³›13aµ³¥¤
+›2635d›676`t®›18a¯«
+›2665d›14m›644`Þà
+›2681d›11m›676`w¯´¥›13a´¨¡´›13a´¨©³›13a¨¡³›14a´¯›13a¢›1a¥›13a¤¯®¥›14a´¯›13a´¨¥›14m›176aÑ›11m›31a¨¡²¡£´¥²©³´©£³
+›2681d›14m›1300`Ï›1aÉÐÍÈÎÉΛ11m›29a£
+›2710d›14m›644`Þá
+›2726d›11m›676`}›432a¹°›1a¥Å›13aµ³©®§›13m›12aS$%3(#%›12a16.%›11m›286a¥›12a£¡²¥›12a¯¦›12a´¨©®§³
+›2726d›712`¥›12a³¥´›12a´¨¥›12a´¥²­©®¡¬›12a¤¥¶©£¥›12a´›413aÆ›14a{¨©³›12a³¨¯µ¬¤›13a´¡«
+›2772d›648`¥›13m›13aS&-/+›11mÅ›13m›10aS1!"›11mÅ›15m›11a²µ±›11mÅ›12a¡¬´¨¯µ§¨›14a·›216a¹›14a¨¡²­›13a¢›102a´©¯®©®§›13a´¨¥³¥›13a¥¸°¬©£©´¬¹Á
+›2772d›607`¬©«›511a¥›12a£¡®Â´›13a¤¯›13a¡®›153a¹›14a­¥®
+›2802d›14m›644`Þâ
+›2818d›11m›701`¯›14a©­°²¯›18a¥›14a´¨¥›15a³°›1a¥¥¤›15a¡´›14a·¨©£›182a´³›16a¡²¥›14a°²©®›411a´¥²›15a©³›13a³¥´
+›2818d›676`{›127a¶›329a¨›14a¤¯›1a£µ­¥®›177a´¥¤Å›14a©´›14a©³›14a¢›1a¥³´›14a©¦›14a´¨¥›14a°²©®
+›2863d›607`µ°›14a´¯›13a©´³›12a¦¡³´¥³´›13a³°›1a¥¥¤Å›14a»Àżººo¤
+›2893d›14m›644`Þã
+›2909d›11m›676`{›126aÅ›13m›11aR*,J›11m›9aͬ¥³›10a£¯®›497a¨¡²¡£´¥²³›12a¬¯®§›10a鮣¬µ¤©®§›12a¥³£¡°›1a¥
+›2909d›703`¹°©£¡¬¬¹›238a´¡©®›12a²¥£¯²¤³›11aµ°›11a´¯›11a¡¢›1a¯µ´›12a»¿º›11a£
+›2955d›1008`¥›17a¤¯®Â´›19a·›38a´›17a´¨¥›19a´¥²­©®¡¬›17a¤²©¶›132a´¥²²µ°´›19a´¨¥³¥Å›19a¡®¤›18a©®³¥²´
+›2955d›607`³¥±µ¥®£¥³ÄÈ›22a´¨¥²¥¦¯²¥›18a·›166a¡®›327a¥²›18a´¯›18a©®
+›3000d›1094`¥›18a³¥´›19a¡®›19a¡²´©Í£©¡¬¬¹›19a¨©§¨›13m›19aS4($1'›11m›16a¡®¤›20a¡¬³¯›19a¥®³µ²¥›19a´¨¡´›19a´¨¥
+›3000d›607`³°µ²©¯µ³›20apyÑus›19a°¡©²³Å›20a³¯›19a·
+›3046d›607`Ò´¥²­©®¡¬Ð›13a©³›13a³¥´›13m›13aS,-4/!.
+›1;1470;2724;2;12!|
+›1;607;2225;2;598!|
+›1;610;2192;4;21!|
+›1;610;2135;4;21!|
+›1;610;2079;4;21!|
+›1;610;2022;4;21!|
+›1;610;1966;4;21!|
+›1;610;1909;4;21!|
+›1;832;1054;2;14!|
+›1;610;1052;4;20!|
+›1;610;1002;4;20!|
+›1;610;952;4;20!|
+›1;610;902;4;20!|
+›1;610;852;4;20!|
+›1;610;802;4;20!|
+›1;610;753;4;20!|
+›1;610;703;4;20!|
+›1;610;653;4;20!|
+
+
+›462d›12m›449`¿ôò›45aÏÚççÞáÜ›15açÝÚ›15aûЛ269aìæÞØÖß›14aÁÝÖåÖØçÚåÞæçÞØæ›10m›351aÑÒ
+›462d›12m›851`ÚåàÞáÖßóæù›14aÌÝ
+›607d›473`¶›10m›23ai./61!0q
+›648d›15m›738`IO
+›664d›12m›473`¶›10m›23ai0!'%lZZq
+›704d›15m›834`IP
+›720d›12m›473`¶›10m›23ai./"1/!$#!23q
+›777d›12m›473`¶›10m›23ai./-/$%-q
+›833d›12m›473`¶›10m›23ai./(!.'40q
+›873d›15m›714`JG
+›889d›12m›473`¶›10m›23ai./%#(/q
+›946d›12m›473`¶›10m›23ai$-!q
+›1002d›12m›473`¶›10m›95ab,!2%1t3%1-b
+›1096d›520`¨ÃÇÈ›17aÄÆöµ¶ÀÍ›17aË›69aÃÉÀ¸›17aµÆƵ»¹›17aºÃÆ›18aȼ¹Ç¹›18aÃÄ›1a¹ÆµÈ½ÃÂÇ›17aÈÛ17a¶›1a¹›19aÄ›1a¹ÆºÃÆÁ¹¸
+›1096d›863`¹›18aË
+›1153d›595`¹Æ›19aȼ¹›12m›47a¿Ô›10m›263aÍ›17a½Â·Àɸ½Â»›18aȼ¹›18a·ÃÁÁµÂ¸Ç›18a½Â›18açµ›17a·ÃÁÁµÂ¸
+›1153d›449`˼¹Â¹Ê›12m›137aÒ›10m›85a½Ç›18a¶›1aÛ1aÃȹ¸á›19a¶
+›1209d›449`ÄÆÛ1a·¹¸Éƹ›17a˼½·›121aÊ›45a¹¸›15aºÆÃÁ›14a˽ȼ½Âè›493a0t5Yh#/-
+›1209d›751`¼›15a½Ç›14a½Â›22aÿ›320a282^-!.!'%1j2823!134
+›1266d›520`©Ã›177a¹ÝÊ›203a¼µÆµ·È¹Æ½ÇȽ·Ç›13aú›15aȼ¹›16aȹÆÁ½ÂµÀ›14aÀ½Â¹›15a·Ã¹·È¹¸›16aÈÃ
+›1266d›576`Ë›15aȼµÈ›14aË›55a¹›15aǹț15aȼ¹›16a·
+›1322d›673`¹›10a¹¹¸›11aÈÛ10aµÇÇÛ1a·½µÈ¹›9a½È›9a˽ȼ›10aµ›10aÄƽ›446aÈ›9aÇÄ›1aÛ1aÃÀ½Â»á
+›1322d›449`ȼ¹›11a§©ÏÒ›10aË›619aÈ›9aÅɹɹ›11aÞºÃÆ›10aÈƵÂÇĵƹÂ
+›1378d›14m›449`%N'N›10m›258aÍÄ›1a¹Ç›14aȼ¹›15a·ÃÁÁµÂ¸›14a#/08›23a?BE>G:F>›23at37!Xjßå›13a½Â›13aȼ½Ç›14a¹ÌµÁð
+›1378d›539`½º›13aÇÃÁ¹Ã¹›14aÈ
+›1435d›567`¹Ýƹ›14a·ÃÂì»Éƽ»›15aȼ¹›15aÅɹɹ›15a2%%2›17a,!2%1á›14aÉǽ»›14a¸¹Ê½·¹›16a282^282$%5)#%j
+›1435d›449`ÄÀ¹á›15aË
+›1491d›449`ºÃÆ›15aÇÄ›1aÛ1aÃÀ½Â»äò
+›1591d›15m›449`90/1:8›11m›23a2%3›22a$%5)#%a2/.›108a]2%%2›13a+!2%1_282[282›108a%^›20a\+!2%1›14a3%1,\
+›1591d›929`.+%$d›407a$%5)#
+›1697d›10m›520`¡½ÂµÀÀÍ›61a¹›21aµÆ¹›20aƹµ¸Í›21aÈÛ20a·Æ¹µÈ¹›21aµÂ¸›21aÇȵÆÈ›19aȼ¹›21aÄƽ›258a¹›20aµÇÇÃð
+›1697d›657`á›20aË›825aȹƛ20aÅɹɹå›24aË
+›1754d›449`·½µÈ¹›13aȼ¹›14aµÄÄÆÃÄƽµÈ¹›13aÞ0,/3›16a&/1-ß›13a¸¹ºµÉÀÈ›13aºÃÆÁ›13a˽ȼ›13aȼ¹›13aÅɹɹá›15aºÃÆ›13aÉǹ›13a˽ȼ
+›1810d›449`ÈƵÂÇĵƹ›292aȽ»á›14aµÂ¸›16aµÆƵ»¹›15aºÃÆ›15aȼ¹›15aµÄÄÆÃÄƽµÈ¹›15aǹÈÉÄ›16aìÀ¹›15aÈÃ
+›1810d›661`È›15aÇÄ›1aÛ1aÃÀ½Â»›15aÄƽÂ
+›1867d›1051`Ë›141a¼›15a¾Ã¶äò
+›1867d›449`¶›1a¹›16aÉǹ¸›16aÈÛ15a·À¹µÆ›14aȼ¹›16aÅɹɹ›16a¶›1a¹È›31a¹¹Â›15a¹µ·
+›1954d›15m›449`90/1:8›11m›330a4%h
+›1954d›622`)-)3)!+)9%a04%
+›2004d›15m›471`8›11m›23aa-.%-!"+%k'%-›86ah
+›2004d›803`%1)#
+›2053d›15m›471`8›11m›23aa-."!3#(h
+›2103d›15m›471`8›11m›23aa&.1,d/+.3›14a&.1,h
+›2153d›15m›471`8›11m›23aa-.1%3!)-h
+›2203d›15m›471`8›11m›308a#3+h
+›2203d›518`a+)"1!18d+-QT
+›2253d›15m›471`8›11m›308a)9%h
+›2253d›518`a2#(%$4+%d-.2
+›2287d›15m›1740`¿½
+›2302d›471`8›11m›308a"412›108a'd.-%›108a!)+%1›108a3d]/›108a)3^^h
+›2302d›518`a2%/!1!3%d]-.›86a3_&+!›108a_-.31›108a_1%2%›86a.131!
+›2352d›15m›471`8›11m›23aa23!13h
+›2402d›15m›471`8›11m›308a%%$_›108a'_&.1›108a3›14a&.1,^h
+›2402d›518`a$%&!4+3d]-.&›86a-.&+!›108a,d/+.
+›2452d›15m›471`8›11m›308a1,\h
+›2452d›518`a.-d\+!2%1k3%
+›2502d›15m›471`8›11m›308a)-'h
+›2502d›518`a1%#.1$k"+.#*
+›2552d›15m›471`8›11m›88a2%%2›15a+!2%1
+›2756d›14m›486`Þä
+›2772d›11m›519`x´¨¥²›13aћ13mR*,J›11m›170a´¥¤›14a¯®›13a´¨¥›13a¤¥¶©£¥›14a®¥¥¤›13a´¯›13aµ³¥›13a¯®¬¹›14a¾¾›13a¬©®¥³›13a°›1a¥²›13a°¡§¥
+›2772d›799`Ä›11aͬ¥³›13a°²©®
+›2802d›14m›486`Þå
+›2818d›11m›519`}›173a¡®›938a´¥²Å›25a³¯›23a³¥´›22a©´
+›2818d›555`¥›22a¤¯®Â´›23a·›38a´›23a¯°›1a¥²¡´¯²›23a­¥³³¡§¥³›24a´¯›22a´¥²­©®¡¬³›23a´¯›22a§¥´›23a´¯›22a´¨¥›23a°²©®
+›2863d›13m›449`S,-"/-!$›58a1
+›2863d›608`#!0
+›2893d›14m›486`ßÜ
+›2909d›11m›519`n®›355a´¥²›12að›1a¯³³©¢¬¥›13a¥²²¯²›12a³´¡´µ³›13a²¥°›1a¯²´³Ä›13a³¨¯µ¬¤›15m›13afgh›11m›11a¢›1a¥›13a¥£›147a«
+›2909d›568`¹›12a©®°µ´›13a¦²¯­›11a´¨¥›13a°²©®›850a¨¯›1a¥¤›13a¢¡£
+›2955d›449`´¯›13a©´Å›12a³¯›14a³¥´›13a´¨¥›13a´¥²­©®¡¬›13m›12aS,-%#'-
+›2984d›14m›486`ßÝ
+›3000d›11m›519`w¯´¥›10a´¨¡´›11a´¨¥›13m›12a/%0%1›11m›8a­¯›1a¤µ¬¥›12a©³›10a®¯´›12a³°›1a¥£©Í¥¤›11a¨¥²¥È›12a©¦›10a©´›10a·›200a¢©¯®›53a¯µ¬¤›11a©®³¥²´
+›3000d›1441`¥²¥Å›11a´¨¥›11a³¹­›70a´›12a·
+›3046d›971`¨›14aª¯¢
+›3046d›449`¡›13a³°µ²©¯µ³›14a¢¬¡®«›14a°¡§¥›14a¡¦´¥²›12a¥¡£
+›1;449;2727;2;598!|
+›1;674;2550;2;14!|
+›1;452;2548;4;20!|
+›1;452;2498;4;20!|
+›1;452;2448;4;20!|
+›1;1242;2400;2;14!|
+›1;452;2398;4;20!|
+›1;452;2348;4;20!|
+›1;452;2298;4;20!|
+›1;452;2249;4;20!|
+›1;452;2199;4;20!|
+›1;452;2149;4;20!|
+›1;741;2101;2;14!|
+›1;452;2099;4;20!|
+›1;452;2049;4;20!|
+›1;452;2000;4;20!|
+›1;994;1752;2;15!|
+›1;1754;1589;2;14!|
+›1;1150;1589;2;14!|
+›1;1193;1433;2;15!|
+›1;452;998;4;21!|
+›1;452;942;4;21!|
+›1;452;885;4;21!|
+›1;452;829;4;21!|
+›1;452;773;4;21!|
+›1;452;716;4;21!|
+›1;452;660;4;21!|
+›1;452;603;4;21!|
+
+
+›462d›10m›607`ÑÓ›12m›635aÀ›10m›46a$5),.TW›12m›14aÁËÉÉ¿Ê›14aÍÑ¿ÈÇÄÇÃÎÏ
+›607d›13m›607`²›15m›69atxuvwyz›13m›25a³ÔÒÒÇÓÊ›25a¿ÙÇÑÏàËÖ×
+›714d›10m›607`zÇ›14aµÀƹµ¸Í›13a¸¹Ç·Æ½¶›1a¹¸á›14aȼ¹›14a$5),.TW›283a¹Ç›12a½¹ȹ¹Â›15aÅɵÀ½ì¹ÆÇå›13aȼ¹½Æ
+›714d›1302`·ÃÁÁµÂ¸›14aȵ¿
+›771d›1020`ËÇä
+›771d›607`ºÉ·ȽÃÂÇ›15aµÆ¹›15aµÇ›15aºÃÀÀÃ
+›876d›607`i23!13).'›16a0!'%l›15m*›14m›21a!'%›16a231)-'›15m›3a+›10m›22a¯›42a¹Ç›22aµ›21aÇÈƽ»ðÊ›325a¼›22aÇÄ›1a¹·½ì¹Ç
+›876d›14m›977`/›10m›265aµ¿›254aµÀɹ¸›22a½È¹Á›21a˼½·
+›932d›721`ȼ¹›13a›61a¶›1a¹Æ›13aú›13aȼ¹›13aìÆÇÈ›12aĵ»¹›13aÈÛ12a¶›1a¹›14aÄÆÛ1a·¹Çǹ¸â›20a¯¼¹›13aºÃÆÁµÈ›12aú›12aȼ½Ç›13aÇÈƽ»
+›932d›821`ÉÁ
+›989d›721`Áµ›834aËÇä
+›989d›781`Í›14a¶›1a¹›16a¸¹ì¹¸á›16aÉǽ»›15a{©¡›15aÂÃȵȽÃÂá›14aµÇ›15aºÃÀÀÃ
+›1094d›15m›821`*›14m›21a!'%›16a231)-'›15m›3a+›10m›15aääæ›15m›15a*›14m231)-'›16a)3%,›15m›3a+›15a$›15a*›14m›21a!'%›16a231)-'›15m›4a+›10mh›15m*›14m231)-'›15a)3%,›15m›3a+
+›1094d›14m›839`/›622a/
+›1173d›15m›821`*›14m231)-'›15a)3%,›15m›4a+›10m›15aääæ›15ae›15m›15a$›14a*›14m›74a'%1›15m›4a+
+›1173d›14m›1252`)-3%
+›1278d›10m›721`¯¼¹›20a¸¹ºµÉÀÈ›19a½Ç›19aée›135a¼›20aÁµÈ·›128aÍ›19aĵ»¹›20a›61a¶›1a¹Æá›20aµÂ¸›20a¼¹Â·¹›21a˽ÀÀ
+›1278d›1063`Ýá›19a˼½·›142a¼¹Ç›19aµÂ›177aÉÁ
+›1334d›970`Í›21aÄÆÛ1a·¹Çǽ»›21aȼ¹›21aìÆÇÈ›21aĵ»¹›21a½Â›21aȼ¹›21aìÀ¹â›38a~µ·›219a¹
+›1334d›721`·ÃÁÁ¹Â·¹›21a¶›890a¼›20aÇÉ··¹ÇǽÊ
+›1391d›15m›721`*›14m231)-'›15a)3%,›15m›4a+›10m›15a½Ç›15aÉǹ¸›17aÈÛ15aµÈȹÁÄÈ›14aÁµÈ·›243a¼›16aÇÉ··¹¹¸½Â»›16aù›16aú
+›1391d›1471`¼¹Ç›15a˽ȼ›15a¹µ·
+›1447d›721`¯›186aȹÆÇ›12au<HNGMT›13m›11aö›8aö›8aö›10m›6au<HNGM]å›12aȼ¹›12aìÆÇÈ›12aú›11aȼ¹Ç¹›13a½Ç›11a¶›102aÊ›43aȽÃÂ
+›1447d›771`³ÝÇ›12a·ÃÉ›912aÍ›12a·Ã›22a¹Â
+›1457d›746`~
+›1504d›1093`ÉÁ›277a¹›13a·ÃÉ›146aÍ›12a¶›1a¹›13aÉǹ¸›14aºÃÆ›12aÇÄ›1a¹·½µÀ
+›1504d›721`Éǹ¸›13aºÃÆ›12aȼ¹›13aĵ»¹›13a›61a¶›1a¹Æâ›19a®É··¹Çǽʛ124aȹÆÇ›13aÁµ
+›1560d›1375`Ƚ»›14aµÈ›14aȼ¹›15aìÆÇÈ›15aĵ»¹›15a˼Ãǹ›15au<HNGMT
+›1560d›721`¹ë¹·ÈÇá›14aºÃÆ›14a¹ÌµÁÄÀ¹á›15aÈÛ14aÇȵÆÈ›14aÄƽÂ
+›1617d›721`½Ç›15aÒ›14aµÂ¸›16au<HNGMW›14a½Ç›15aÕá›14aù›16a·ÃÉÀ¸›15aÉǹ›518aZâ
+›1617d›1454`i23!13).'t0!'%lWheheh
+›1722d›607`i.4-"%1›16a/&›17a0!'%2l›15m*›14m/›214a'%1›15m›4a+›10m›23a¯›42a¹Ç›15aµ›16aÊ›184a¼›16a½Â¸½·µÈ¹Ç›15aȼ¹›16aÈÃð
+›1722d›14m›1039`.2)3)5%›15a)-3%›10m›133aµ¿›112aµÀɹ›16a˼½·
+›1778d›812`ÉÁ›444aȹ¸á›13a½Â·Àɸ½Â»›14aȼ¹›14a23!13).'t0!'%â›17a¯¼¹
+›1778d›721`ȵÀ›13a›61a¶›1a¹Æ›14aú›13aĵ»¹Ç›13aÈÛ14a¶›1a¹›14aÄƽÂ
+›1835d›890`µÀɹ›11aÞú›11aUTTTTTTT›646aÈ›10aȼ¹›11a˼ÃÀ¹
+›1835d›721`¸¹ºµÉÀÈ›10aÊ›347aß›9a½Ç›11aÂÃÆÁµÀÀÍ›9aÀµÆ»¹›10a¹ÂÃÉ»¼›11aÈÛ11aÄƽÂ
+›1891d›986`ÈÛ
+›1891d›721`ú›15aµ›14a¸Ã›1a·ÉÁ¹Â
+›1996d›607`i3/0›17a-!1').l›15m*›14m$),%-2).-›15m›1a+›10m›23a®Ä›1a¹·½ì¹Ç›16a¼Ã›163aË›14aºÆÃÁ›15aȼ¹›15aÈÃÄ›14a¹¸»¹›16aú›14aȼ¹
+›1996d›1381`Ë›14aºµÆ›15a¸Ã
+›2053d›721`ĵě1a¹Æ›16aȼ¹›17aƹº¹Æ¹Â·¹›17aÄ›1aý›476aµÀɹ›17aÁµ›160a¹Â›16a½Â
+›2053d›1207`È›15a½Ç›16aÈÛ16a¶›1a¹›17aÄÀµ·¹¸â›23a¯¼¹›16aÊ›155aÍ›15a¶›1a¹›17a»½Ê
+›2109d›768`Í›17aú›16a¯›18a³ÝÇ›15m›16a*›14m›120a!+›16a4-)3›15m›4a+›10mÇ›17aÞIM›23aLI›24aI<›23aBG›24a<F›23aFF›24a==›24a<<ßá›16a˽ȼ›16aȼ¹
+›2109d›721`µÂ›14m›243a/(82)#
+›2119d›10m›887`~
+›2166d›721`µ¸¸½È½Ã›20aú›20aFB›20aµÂ¸›21aIQ›391aµÀɹ›21aÞú›20aWTTIQß›20aÄÀµ·¹Ç›20aȼ¹
+›2166d›1173`á›21aµÂ¸›21aȼ¹›21a¸¹ºµÉÀÈ›20aÊ
+›2222d›998`È›14aµÈ›15aȼ¹›15a·Ã›22a¹Â›268a¼›15aºÆÃÁ›15aȼ¹›15aÈÃÄ›15a¹¸»¹â
+›2222d›721`ƹº¹Æ¹Â·¹›16aÄ›1aý›232aÊ›43aȽõÀ›14aù›15a½Â·
+›2327d›607`i,%&3›17a-!1').l›15m*›14m$),%-2).-›15m›1a+›10m›258aË›19aºµÆ›20aµ·ÆÃÇÇ›19aºÆÃÁ›20aȼ¹›20aÀ¹ºÈ›19a¹¸»¹›21aú
+›2327d›1174`®Ä›1a¹·½ì¹Ç›22a¼Ã
+›2384d›1278`È›14a½Ç›13aÈÛ14a¶›1a¹›15aÄÀµ·¹¸â›19a¯¼¹›15aÊ›152aÍ›14aµ»µ½Â›13a¶›1a¹
+›2384d›721`ȼ¹›14aĵě1a¹Æ›15aȼ¹›14aƹº¹Æ¹Â·¹›15aÄ›1aý›463aµÀɹ›14aÁµ
+›2440d›721`»½Ê›164aÍ›15m›18a*›14m›120a!+›15a4-)3›15m›4a+›10m›380aµÀɹ›18aÞú›18aWTTIQß›17aÄÀµ·¹Ç
+›2440d›780`¹Â›17a½Â›18aµÂ›14m›59a/(82)#›10m›149aá›18aµÂ¸›19aȼ¹›18a¸¹ºµÉÀÈ›17aÊ
+›2497d›1076`È›15aµÈ›14aȼ¹›16a·Ã›22a¹Â›267a¼›16aºÆÃÁ›14aȼ¹›15aÀ¹ºÈ›15a¹¸»¹â
+›2497d›721`ȼ¹›15aƹº¹Æ¹Â·¹›16aÄ›1aý›233aÊ›43aȽõÀ›13aù›15a½Â·
+›2602d›607`i/1)%.3!3)/.›50aµ¿›164aµÀɹǛ21a0/131!)3›21aÃÆ›21a,!.$2#!0%›20aµÂ¸›21aÇÄ›1a¹·½ì¹Ç›23a½Â
+›2602d›916`¯›42a¹Ç›21aȼ¹›22aÊ
+›2659d›721`˼½·›140aȵȽÛ16aȼ¹›18ah,.W›789aÃÉ
+›2659d›811`¼›18aÃƽ¹Â›330aìÀ¹›18a½Ç›18aÈÛ17a½Â½È½µÀ½Î¹›17aȼ¹›18a§©ÏÒâ›29a°ÂÀ¹ÇÇ›18aÍ
+›2709d›14m›1367`}
+›2715d›10m›721`¼µ›22a¹›16aȵ¿›331a¼µÂ»¹›16a§›5a¯›18a³ÝÇ›15aµÇÇÉÁÄȽÃÂÇ›16aµ¶›1aÃÉÈ›16aȼ¹›16aĵě1a¹Æ
+›2715d›768`Ê›99a¹Â›15aÁ¹µÇÉƹǛ16aÈÛ16a·
+›2729d›1413`~
+›2771d›850`Í›17a·›234a¼›17aĵ»¹›17aÀµ›22aÃÉÈ›15aĵƵÁ¹È¹ÆÇ›16aµÇ›16auM>QMA>B@AMßá›15aÉǹ
+›2771d›721`ǽι›16aÞ¶›59a¼µÂ»½Â»›16aÇÉ·›184aÍ
+›2828d›721`ú›398a$2#!0%›367aÊ›84a˽»›13aȼ¹›16aĵ»¹â
+›2828d›773`i/1)%.3!3)/.l,!.›156a˽ÀÀ›14aÀ¹µ¸›15aÈÛ14aȹÌÈ›15aÛ22a¹ÆíÃ
+›2933d›607`iç./è,/'›224aá›14m›49a_VlhXYpq›10m›16a˽ÀÀ›16a¸¹À¹È¹›17aȼ¹›18aÀû›16aìÀ¹›17aÞh380›100aʽ¸¹¸›17aÂÃ
+›2933d›798`ªÆ¸½ÂµÆ½ÀÍ›14m›26aR›10m›766aß›17aÄÆÃ
+›2990d›1042`Í›21aºÃÆÁ›21aË›353aË›42a¹Æá›22a½º›21aȼ¹›21aÄÆûƵÁ›21a½Çð
+›2990d›721`µÂÃÁµÀ½¹Ç›20aú›21aµÂ›190a¹Æ¹›21a¸¹È¹·È¹¸â›40a£Ã›31a¹Ê
+›3046d›721`Çɹ¸›14m›16a!-8›10m›219aµÆ½»›15aÁ¹Çǵ»¹Çá›15aȼ¹›15aìÀ¹›16a˽ÀÀ›14a¶›1a¹›16aƹȵ½Â¹¸›16aºÃÆ›15aÀµÈ¹Æ
+›3046d›915`¹ÆÆÃÆ›15aÃÆ›15aË
+›1;730;2325;2;15!|
+›1;706;1994;2;15!|
+›1;1169;1720;2;14!|
+›1;842;1720;2;15!|
+›1;778;1720;2;15!|
+›1;856;1389;2;14!|
+›1;956;1171;2;14!|
+›1;1881;1092;2;14!|
+›1;1573;1092;2;14!|
+›1;1302;1092;2;14!|
+›1;928;1092;2;14!|
+›1;1066;874;2;14!|
+›1;826;874;2;15!|
+›1;479;675;39;8!|
+
+
+›462d›1898`ÑÔ
+›607d›563`Ä›1a¹ÆÉǵÀâ›26a{Í›17aÇÄ›1a¹·½ºÍ½Â»›17ai,/'›61a¹›17a·µÂ›17aºÃÆ·¹›17aȼ¹›17aÄÆûƵÁ›16aµÀË›21aÍÇ›15aÈÛ17aƹð
+›607d›1127`á›16aË›565aµ
+›664d›563`ȵ½Â›21aȼ¹›22aìÀ¹á›22a˼½ÀÇÈ›21ai./,/'›181aµ›446a¹Â›22a½º›21a¹Æð
+›664d›1147`˽ÀÀ›20aµÀË›21aÍÇ›20a¸½Ç·µÆ¸›21aȼ¹›22aìÀ¹á›23a¹Ê
+›720d›563`ÆÃÆÇãË›189a¹Æ¹›15a½ÇÇɹ¸â
+›720d›695`µÆ½»Ǜ13aË
+›796d›771`á›10aȼ¹›10ai,/'›323a¹›9aµ›10aÊ›192a¼›10a·µÂ›10a¶›1a¹›11aµ›10a·ÃÁÄÀ¹È¹
+›796d›563`ªÄȽõÀÀÍ›198aÅɵÀ½ì¹Æ›9a·µÂ›11aȵ¿›82aµÀɹá›11a˼½·
+›852d›1210`Ê›487a¼›22aÂÃÆÁµÀÀÍ
+›852d›563`ÃÆ›22aĵÆȽµÀ›20aìÀ¹›22aÇÄ›1a¹·½ì·µÈ½Ã›23aÈÛ21aÛ22a¹Æƽ¸¹›21aȼ¹›23a¸¹ºµÉÀÈÇ›21a˼½·
+›909d›949`ÃÆ›15a¹ÌµÁÄÀ¹á
+›909d›563`µÄÄÀÍ›15aÈÛ15aȼ½Ç›14aìÀ¹â›20a¡
+›1004d›12m›563`ºcbi»¶›10m›22a$5),i,/'lh$5)t,/'›22aQQ
+›1100d›595`ÃÉÀ¸›17a·Æ¹µÈ¹›17aȼ¹›18aÀû›16aìÀ¹›18aµÇ›17a77h$5)t,/'á›16a½Â›17aȼ¹›18a·ÉÆƹ›205aá›18a½Âð
+›1100d›563`Ë›1058aÈ›17a¸½Æ¹·ÈÃÆÍ
+›1156d›563`Çȹµ¸›15aú›14aµÇ›15a77h380›81a¹Â›15a½º›14aȼ¹Æ¹›15aË›533aÃÉÀ¸›14a¶›1a¹
+›1156d›933`â›14a~Ê›248a¹Æ¹›15aÂÛ15a¹ÆÆÃÆÇá›14aȼ¹›15aÀû›14aìÀ¹›15aË
+›1212d›563`ƹȵ½Â¹¸›15aµºÈ¹Æ›14m›46a_VlhXYpq›10m›14a¼µ¸›16aì½Ǽ¹¸›16a½ÈÇ›14aÄÆÛ1a·¹Çǽ»â
+›1212d›14m›847`R
+›1308d›10m›449`iç./è5%1"/2%›21a¤º›16ai./5%1"/2%›14a½Ç›14aÇÄ›1a¹·½ì¹¸á›17aÁ¹Çǵ»¹Ç›14a½Â¸½·µÈ½Â»›15aÄÆûƹÇÇ›14a¸ÉÆð
+›1364d›1896`Ëð
+›1364d›563`½Â»›13aȼ¹›13a½Â½È½µÀ›11aÇ·µÂÇ›13aú›12aȼ¹›13a½ÂÄÉÈ›13aìÀ¹›13aµÆ¹›13aÇÉÄÄƹÇǹ¸á›14aµÇ›13aµÆ¹›12aȼÃǹ›13aǼÃ
+›1421d›1161`ÈÇ›17a¸Ã›355aÍ›18aǽ̹À›17aìÀ¹Ç›18aƹµ¸
+›1421d›563`½Â»›18aȼ¹›18aǽιǛ17aú›18a½Â¸½Ê½¸ÉµÀ›17aºÃ›99aËÂÀõ¸¹¸á›18aµÂ¸›18aµÂ
+›1477d›587`Í›15aµ›15auLI><B:E›14a·ÃÁÁµÂ¸â
+›1477d›563`¶
+›1573d›449`i/43043›505aÉÇÈ›13aÇÄ›1a¹·½ºÍ›14aµ›14aĵÆȽµÀ›12aÃÆ›13a·ÃÁÄÀ¹È¹›14aìÀ¹›14aÇÄ›1a¹·ð
+›1573d›639`¯¼½Ç›14aÅɵÀ½ì¹Æá›13a½º›13aÉǹ¸á›15aÁ
+›1629d›563`½ì·µÈ½Ã›14aÈÛ15aÛ22a¹Æƽ¸¹›14aȼ¹›15a¸¹ºµÉÀÈÇ›15aºÃÆ›15aȼ¹›15ah,.W›15aìÀ¹å›14aºÃÆ›15a¹ÌµÁÄÀ¹
+›1629d›815`Ê
+›1724d›12m›563`ºcbi»¶›10m›22a$5),i/43043l6/1+^$)1j›166a12%›22a2/62t%!1
+›1724d›1253`2),+t04
+›1820d›595`ÃÉÀ¸›18a¸½Æ¹·È›18aȼ¹›19aÃÉÈÄÉÈ›18aÈÛ18a2),+t0412%h,.W›16a½Â›18a¸½Æ¹·ÈÃÆÍ›18a6/1+^$)1j
+›1820d›563`Ë
+›1876d›563`Þ˼µÈ¹Ê›252aÈ›16a¶›1a¹ß›18a½ÂÇȹµ¸›16aú›17aÈÛ17a2/62t%!1h,.W›276aÈ
+›1876d›723`¹Æ›16aȼµÈ›17aÁ½»¼›688a½Â›18aȼ¹›17a·ÉÆƹÂ
+›1933d›738`â
+›1933d›563`¸½Æ¹·ÈÃÆÍ
+›2028d›449`i$%5)#%›17a380%l›15m*›14m›98a%›14a-!,%›15m›4a+›10m›293aÍÄ›1a¹›11aú›11aÄƽ›215a¼›12aȼ¹›11aÃÉÈð
+›2028d›14m›772`$%5)#›10m›184a®Ä›1a¹·½ì¹Ç›13aȼ¹›11aÈ›208aȹƛ11aÛ11a˼½·
+›2084d›563`ÄÉÈ›16aìÀ¹›15a½Ç›15a½Â›346aȹ¸å›16aµÈ›15m›14a*›14m2)3%-!,%›15m›3a+›10m›281aµÀɹ›15aºÃÆ
+›2084d›803`ȹ¸¹¸›16aÈÛ15a¶›1a¹›16aÄƽ›361aá›15aȼ¹›16a¸¹ºµÉÀÈ›15aÊ
+›2141d›563`ȼ½Ç›12aÅɵÀ½ì¹Æ›11a½Ç›12a,.TW›349aµÀɹǛ12aµÆ¹›12a,.TY›12aµÂ¸›12a,.TZå›12a·¹Æȵ½Â
+›2141d›960`â›18aªÈ¼¹Æ›13aÄ›1aÃÇǽ¶À¹›12aÊ
+›2197d›563`Ãȼ¹Æ›16a·ÃÁ›807aÍ›16aÃÂÀÍ›16a¶›1a¹›18aÇÄ›1a¹·½ì¹¸
+›2197d›763`¶½ÂµÈ½ÃÂÇ›16aú›16aȼ¹›17a¹ÌÈ›16aȼƹ¹›17aÅɵÀ½ì¹ÆÇ›16aÁµ
+›2254d›1142`µÀɹǛ15aºÃÆ›15aȼ½Ç›14aÅɵÀ½ì¹Æâ
+›2254d›563`½Â›15aµÇÇÛ1a·½µÈ½Ã›14a˽ȼ›14aÇɽȵ¶À¹›15aÊ
+›2349d›449`i01).3›17a-/$%lc›15m*›14m›58a$%+)23›15m›2a+›10md›23a®Ä›1a¹·½ì¹Ç›11a˼¹È¼¹Æ›11aȼ¹›10aÄƽ›246aÈ›10a2)-0,%7
+›2349d›14m›772`,.›10m›670aȹƛ10aǼµÀÀ›9aÄƽÂ
+›2406d›563`Þù›11aǽ¸¹›10aú›10aĵě1a¹Æ›11aÃÂÀÍß›10aÃÆ›10a$40,%7›10aÞÛ10a¶›1aÃȼ›11aǽ¸¹Ç›11aú›10aȼ¹›11aĵě1a¹Æä›18a˽ȼ›10aȼ¹
+›2462d›971`ȹÆÇá›13a$40,%7›72aÍ›12aÃÂÀÍ›13a¶›1a¹›14aÇÄ›1a¹·½ì¹¸›14a½Â›13a·Ã¾É·ȽÃÂ
+›2462d›563`§©ÏÒ›13aµÂ¸›13a§©ÏÔ›13aÄƽ›255aÁµ
+›2518d›563`˽ȼ›12aȼ¹›13a-!23%1›196aÃÆ›12a¸ÉÄÀ¹Ì›13aÄƽ›334aÍ›12a½Â›13aµ¸¸½È½ÃÂ
+›2518d›897`ÁÛ1a¸¹âß›19a¡›274aȽ»á›12aȼ¹›14aÉǹƛ13aÁµ
+›2575d›563`ÇÄ›1a¹·½ºÍ›17a˼¹È¼¹Æ›18aȼ¹›17aƹʛ300a¼›17aǼ¹¹È›18aǼµÀÀ›16a¶›1a¹›17aÄƽ›180aÈ
+›2575d›1033`¹Æǹ›17aǽ¸¹›17aú›16a¹µ·›411aȹ¸›17añƽ»¼
+›2631d›563`Ë›21aÍ›17aÉÄï›17aÞ./1-!,›303aËÂï›18aÞ34-",%$›126a¶À¹¸›17aÃÉÈÄÉÈ›18a·µÂ
+›2631d›595`µ›292aß›16aÃÆ›17añÉÄǽ¸¹ð¸Ã›284aßå›15aÈÉÁ
+›2688d›563`¶›1a¹›13aÉǹºÉÀ›13aºÃÆ›12a»¹Â¹ÆµÈ½Â»›12aµ›12a¸Ã›1a·ÉÁ¹Â›193aȹ¸¹¸›13aÈÛ12a¶›1a¹›13a¶›1aÃɸ›14aµÀû
+›2688d›1248`È›13aȼµÈÝÇ›11a½Â
+›2744d›1186`ȵȽÃÂßâ
+›2744d›563`½ÈÇ›14aǼÃÆÈ›15a¹¸»¹›16a޽›14aÄ›1aÃÆÈƵ½È›14aÃƽ¹Â
+›2820d›563`¯¼¹›14a-!23%1›14aÁÛ1a¸¹›14a½Ç›14aÃÂÀÍ›13aú›14aÉǹ›15a½Â›14a·Ã¾É·ȽÛ14a˽ȼ›13a$40,%7å›13a½È›14a·µÉǹÇ
+›2877d›1453`á›19a¶ÉÈ›19aµÀÀ›17aÃÉÈÄÉÈ›19aµÄÄ›1a¹µÆÇ
+›2877d›563`¶ÀµÂ¿›18aĵ»¹Ç›19aÈÛ17a¶›1a¹›20a»¹Â¹ÆµÈ¹¸›18a˼¹Â›19a¹·¹ÇǵÆÍ
+›2933d›563`Äƽ›1229aȹÆð
+›2933d›643`ȹ¸›20aÛ20aù›20aǽ¸¹›20aú›20aȼ¹›20aĵě1a¹Æ›21aÃÂÀÍóǽ·¹›19a¶ÀµÂ¿›20aĵ»¹Ç›20aµÆ¹›19a½Â
+›2990d›955`á›14aȼ¹›14aƹÇÉÀȵ›237aÍ›13a¶›1a¹›15aƹµ¸½ÀÍ›13aļÃÈÛ1a·ÃĽ¹¸
+›2990d›563`ÇÄ›1a¹Æǹ¸›15aµÇ›13a¹·¹ÇǵÆÍ›255aÈ›13aÃÉÈÄÉÈ›13aÁµ
+›3046d›563`½Â›531aÈâ
+›3046d›600`ÈÛ14aµ›15a¸ÃɶÀ¹ðǽ¸¹¸›16a¸Ã›1a·ÉÁ¹Â
+›1;596;2347;2;15!|
+›1;620;2026;2;15!|
+›1;2064;1240;237;8!|
+
+
+›462d›607`ÑÕ›12m›635aÀ›10m›46a$5),.TW›12m›14aÁËÉÉ¿Ê›14aÍÑ¿ÈÇÄÇÃÎÏ
+›607d›10m›750`Û19aÇÄ›1a¹·½ºÍ›20aÁÃƹ›19aȼµÂ›19aù›20aÁÛ1a¸¹›20a˽ȼ›18aȼ½Ç›19aÅɵÀ½ì¹Æá›20a¹Â·ÀÃǹ›20aµ›19aÀ½ÇÈ›18aú
+›607d›721`¯
+›664d›721`ÁÛ1a¸¹Çá›15aǹĵƵȹ¸›15a¶›476aȼ¹Ç¹Çå›15aºÃÆ›15a¹ÌµÁÄÀ¹ä
+›664d›1103`Í›15a·ÃÁÁµÇá›14a˽ȼ½Â›14aĵƹÂ
+›753d›1228`%7g./1-!›166a1d
+›753d›821`i01).3t-/$%lc$40,›190a,g-!23%
+›842d›607`iç./è$40,%7›15a"8›17a0!'%›17a.4-"%12›22a¯¼½Ç›13aÅɵÀ½ì¹Æ›13a½Ç›13aÄƹǹ›55aÍ›14a¸¹ºµÉÀÈá›13a¶ÉÈ›14aÃÂÀÍ
+›842d›1677`È›14a¶
+›898d›844`Í›11a¹ë¹·È›10a˼¹Â›11a$40,%7›10a½Ç›10aÇÄ›1a¹·½ì¹¸›11a˽ȼ½Â›10aȼ¹›11a01).3t-/$%›9aÅɵÀ½ì¹Æ
+›898d›721`¼µÇ›10aµÂ
+›955d›721`À½ÇÈå›12a½È›13a·µÉǹǛ14aµ›13a¶ÀµÂ¿›14aĵ»¹›13aÈÛ13a¶›1a¹›15a¹¾¹·È¹¸›14a˼¹Â¹Ê›68aË›77a¹Âð›61a¶›1a¹Æ¹¸
+›955d›1666`¹Æ›14aÈ›31aÛ12a¹Ê›83aÉÁ
+›1011d›926`Ë›10a¹µ·›470aË›146aÉÁ›326aË
+›1011d›721`ĵ»¹Ç›11aºÃÀÀÛ104a¼›12aÃȼ¹Æá›12aµÂ¸›12aµÀÇÛ11a˼¹Â›12aÈ›31aÛ11aÛ1a¸¸ð›61a¶›1a¹Æ¹¸›13aĵ»¹Ç›11aºÃÀÀÃ
+›1068d›783`¼›19aÃȼ¹Æå›19aȼ›174aÉÁ›324aµ›439aÈ›18aú
+›1068d›721`¹µ·›221aÉÇ›19aÛ1a¸¸ð›61a¶›1a¹Æ¹¸›20aĵ»¹Ç›19aµÀË›21aÍÇ›17aµÄÄ›1a¹µÆ›19aÛ18aȼ¹›19aºÆÃÂ
+›1124d›721`µ›22aÄƽ›361a¹Âð›61a¶›1a¹Æ¹¸›24aùǛ22aÛ23aȼ¹›22aƹʛ216aȹÆÇ
+›1124d›846`ȹ¸›22aǼ¹¹Èá›24aµÂ¸›23a¹Ê›83aÉÁ›457a¹Æǹâ›42a«Æ½Â
+›1181d›721`Þȼ¹›13aÄ›1a¹ÃÄÀ¹á›14aÂÃÈ›13aȼ¹›13aÁµ·›369a¼›14aĵ»¹Ç›13aµÇ›14m›13a1›17a#3.›10m›16aµÂ¸›14m›13a5%12.›10má
+›1181d›1204`¼½Â¹ÇÛß›19aƹº¹Æ›13aÈÛ13aÇÉ·›14m›231a%
+›1237d›10m›721`ƹÇÄ›1a¹·È½Ê›52aá›11aǽ·¹›11aȼ¹›11aÛ1a¸¸›11aĵ»¹Ç›11aµÄÄ›1a¹µÆ›11aÛ11aȼ¹›11aƽ»¼›241a¹Â›11aùÇ
+›1237d›897`¹ÀÍ›763aÈá›10aµÂ¸›11aȼ¹›11a¹Ê
+›1294d›721`Û16aȼ¹½Æ›15aƹʛ1134aá
+›1294d›955`¹Æǹ›16aÞȼ¹›16aÀ¹ºÈßâ›21a©Ãȹ›15aȼµÈ›16aĵ»¹›15aÏ›16a½Ç›15aÈƹµÈ¹¸á›16a¹Ì·¹ÄȽõÀÀÍ
+›1350d›960`ÉÁ›933aÈá›18aǽ·¹
+›1350d›721`µÇ›18aµÂ›19aÛ1a¸¸ð›61a¶›1a¹Æ¹¸›20aĵ»¹á›20aÇÛ18aȼµÈ›19a½È›18a˽ÀÀ›17aµÄÄ›1a¹µÆ›19aÛ19aȼ¹›19aƽ»¼
+›1407d›721`ÇÉ·›658aÊ›423aÈâ
+›1407d›783`¼›15aĵ»¹Ç›15aúȹ›15aºÃÆÁ›15aȼ¹›15aȽÈÀ¹›14aÃÆ›15a·Ã›22a¹Æ›14aĵ»¹›15aú›15aµ›15a¸Ã›1a·ÉÁ¹Â
+›1479d›721`©Ãȹ›16aȼµÈ›16aÇÄ›1a¹·½ºÍ½Â»›17ai./$40,%7t"8t0!'%›166a2›15a·µÉǹǛ17a¶›1aÃȼ›17aǽ¸¹Ç
+›1479d›1552`t.4-"%1
+›1536d›813`¹ÆÍ›12aǼ¹¹È›13a޹̷¹ÄÈá›13aÄ›1aÃÇǽ¶ÀÍ›389aȹ¸å›13aÂÛ12a¶ÀµÂ¿›13aĵ»¹Ç
+›1536d›721`ú›12a¹Ê›514aá›12aȼ¹›12aÀµÇÈß›11aÈÛ12a¶›1a¹›13aÄƽÂ
+›1592d›906`ȹÆÇÄ›1a¹Æǹ¸â
+›1592d›721`˽ÀÀ›14a¶›1a¹›16a½Â
+›1682d›607`i&%%$›17a31!8lc›15m*›14m›32a!8+)23›15m›2a+›10md›990a¼
+›1682d›14m›906`31›10m›170a²½È¼›11aȼ¹›11a§©ÏÕá›12a½È›12a½Ç›11aÄ›1aÃÇǽ¶À¹›11aÈÛ12aÇÄ›1a¹·½ºÍ›12aºÆÃÁ›11a˼½·
+›1738d›996`ÍÇ›16aĵě1a¹Æ›19aǼµÀÀ›16a¶›1a¹›19aº¹¸å›18aÇÉ·›382aÍ›17aµÄÄÀÍ›17aÈÃ
+›1738d›721`ú›17a½ÈÇ›17aº¹¹¸›18aÈƵ›513a¼›18aÇÄ›1a¹·½ì·µÈ½ÃÂÇ›18aÁµ
+›1794d›1081`ȹ¸á›17aÃÆ›16aȼ¹›17aìÆÇÈ›16aǼ¹¹È›17aÁµ›472a¹Â
+›1794d›721`µÀÀ›15aȼ¹›17aǼ¹¹ÈÇ›17aÄƽ›502aÍ›16a¶›1a¹›18aÇÄ›1a¹·½ì¹¸›17aÈÛ17a¶›1a¹›17aȵ¿
+›1851d›721`ºÆÃÁ›18aµ›19a¸½ë¹Æ¹Â›1061aÈ
+›1851d›1021`È›18aÇÃÉÆ·¹›19a·ÃÁĵƹ¸›19a˽ȼ›18aȼµÈ›19aÉǹ¸›19aºÃÆ›19aȼ¹›19aÇɶǹÅɹÂ
+›1907d›1031`ȵ̛13aƹÅɽƹǛ14a¹½È¼¹Æ›14aù›14a¹Â›55aá›14a!,,l›15m*›14m31›101a%›15m›3a+›10má›13aÃÆ›14a¹½È¼¹Æ
+›1907d›721`Ǽ¹¹ÈÇâ›19a¯¼¹›15aÇÍ›501aÈÆÍ›14m›169a!838/
+›1964d›10m›721`&)123l›15m*›14m31›101a%›15m›2a+›10m›16aµÂ¸ãÃÆ›15a1%23l›15m*›14m31›101a%›15m›3a+›10mä›21aȼ¹›15m›16a*›14m31›101a%›15m›4a+›10m›227aÍ
+›1964d›14m›915`!838/›377a!838/›203a!838/›10m›41aÇ›15a·µÂ›16a¶›1a¹›17aµÂ
+›2020d›721`ù›15aúä
+›2109d›15m›775`'›10m›23a$%&!4,3t31!8á
+›2178d›15m›775`'›10m›23a3/0t31!8á
+›2246d›15m›775`'›10m›23a"/33/-t31!8á
+›2315d›15m›775`'›10m›23a%.5%,/0%t31!8á
+›2383d›15m›775`'›10m›23a-!.4!,t&%%$
+›2472d›12m›721`ÃëÖàãßÚö›10m›20ai&%%$t31!8lc&)123l›166a8g1%23l›190a1!8d
+›2472d›1359`3/0t31!›166a"/33/-t3
+›2545d›837`µÀɹǛ17a3/0t31!8›15aµÂ¸›17a-!.4!,t&%%$›75aÍ›16a¶›1a¹›18aÇÄ›1a¹·½ì¹¸›18a˼¹Â›17aÉǽ»
+›2545d›721`¯¼¹›17aÊ›689aÁµ
+›2602d›721`ȼ¹›17a§©ÏÔ›18aÞ}~|ÀµÇ¹Æ›16aÑÐÏÏß›16aÄƽ›534a¹È›17aÇÉÄÄ›1aÃÆÈ
+›2602d›1358`ȹÆå›18aȼ¹›17aÄÆûƵÁ›17a¸Ã›1a¹ÇÂÝÈ›17aÍ
+›2658d›1341`Í›15aÈƵ›196aÍ›16a¶›1a¹›16aìÈȹ¸›16aÈÛ15aȼ¹›16a§©ÏÔ
+›2658d›721`ȼ¹›16aÃÄȽõÀ›14aÐÏÏÏðǼ¹¹È›15a·µÄµ·½È›96aÍ›14aȼµÈ›15aÁµ
+›2715d›1697`Ê›139aË›10aÈÛ10aµ¸¸Æ¹ÇÇ
+›2715d›721`µÂ¸›11a§©ÏÕ›10aÞÁµ½ÂÀÍ›10a¶›1a¹·µÉǹ›12aȼ¹›10aµÉȼÃÆ›11a¼µÇÂÝÈ›10a¸½Ç·Ã›22a¹Æ¹¸›10a¼Ã
+›2771d›721`½ÈÛß
+›2844d›750`Ƶ›1243aȹÆâ
+›2844d›721`¯›36aÍ›10aǹÀ¹·È½Ã›10a½Ç›11aÂÃÈ›11aÇÉÄÄ›1aÃÆȹ¸á›12aú›10a·ÃÉÆǹá›12aÛ11aȼ¹›11aÃƽ»½ÂµÀ›9a§©ÏÒ›11aÄƽÂ
+›2933d›607`i(&499l›15m*›14m$),%-2).-›15m›2a+›10m›22a|Û376aÍ›20a˼½·›179aÉÇÈ›19a¹Ì·¹¹¸›20aȼ¹
+›2933d›1118`ÈÆÃÀ›18aȼ¹›19a¸½Çȵ·¹›19a¶›133a¼›19aȹÌÈ›19aÁ
+›2990d›721`ƽ»¼›453aÍ›19a¯›17a³›19a½Â›18aȼ¹›19ah$5)›18aìÀ¹ß›19a¶›1a¹ºÃƹ›14m›51a_VlhXYpq
+›2990d›10m›799`È›17aÁµÆ»½Â›18a޵Ǜ18a¸¹ì¹¸›20a¶›14m›632aR
+›3000d›10m›1321`~
+›3046d›721`·ÃÁÄÀµ½ÂÇ›14aȼµÈ›15aé0:@>›23aPB=>K›23aMA:G›23a3>7›24aK>IHKM>=›22a;R›13m›24aò›10mIMÝâ
+›1;730;1680;2;15!|
+›1;1028;840;2;15!|
+›1;915;840;2;15!|
+›1;852;840;2;15!|
+
+
+›462d›1898`ÑÖ
+›607d›563`²¼¹Â›19a¯›18a³›18a»¹Â¹ÆµÈ¹Ç›18aµ›19ah$5)›18aìÀ¹á›19a½È›18a½Â·Àɸ¹Ç›19a½Â›18aȼµÈ›18aìÀ¹›19a½ÂºÃÆÁµÈ½ÃÂ
+›617d›724`~
+›664d›980`ÉÁ›15a˽¸È¼›15aµÂ¸›16a¸¹Äȼ›17aú›15aȼ¹›16aĵ»¹Ç›16a·Æ¹µÈ¹¸ä›21a˼¹Â
+›664d›563`ƹ»µÆ¸½Â»›15aȼ¹›16aÁµÌ½Á
+›720d›14m›595`_VlhXYpq›10m›15aÄÆÛ1a·¹ÇǹǛ17aȼ¹›16ah$5)›16aìÀ¹á›16a½È›15a˽ÀÀ›15aÄÆÛ1a¸É·¹›17a޵¸›16a½È›15aµÀË›21aÍÇ›15a¼µÇ
+›720d›14m›563`R›10m›1203aµ
+›777d›809`µÆ½»›12aÁ¹Çǵ»¹Ç›12a½º›12aµÂ›55a¼µÆµ·È¹ÆÇ›12a¹Ì·¹¹¸›14aȼ¹Ç¹›13aÀ½Á½ÈÇâ›18aªÆð
+›777d›563`ÄÆÛ1a¸É·¹¸ß›14aË›414aÍ›13a·
+›833d›709`á›11aÇÉ·›344aø›12aȼ¹›12aÁµÆ»½ÂÇï›10a˽ÀÀ›11aÂÃÈ›11aÛ1a··ÉÆ›12a޵ț11aÀ¹µÇÈá
+›833d›563`¸½ÂµÆ½ÀÍ›78a¼›12a¹Ì·ÉÆǽÃÂÇ›12añ¶›1a¹Í
+›889d›563`ÂÃÈ›16a˽ȼÃÉÈ›15a¯›115aʽ»›15a½ÇÇɹ¸›16aµÂ›16aéHO>K?NEE›23auh;HQ›60aµÆ½»›15a½ÈǹÀº›7aßá
+›889d›865`³›17a¼µ›646aÝ›15aË
+›899d›840`~
+›930d›15m›1891`JI
+›946d›10m›563`¶ÉÈ›15aÇÃÁ¹›15aÁµ·ÆÛ15aĵ·›20aµ»¹Ç›14m›15a$.›10m›18aÄ›1a¹ÆÁ½È›15a¯›18a³›15aÈÛ15a¹Ì·¹¹¸›16aȼ¹›15a¶›1aÃɸµÆ½¹Ç›38aâ
+›946d›964`¿
+›956d›1321`~
+›1028d›1722`¼›19aÁ¹Çǵ»¹Ç
+›1028d›563`{Í›19aÉǽ»›18aȼ½Ç›18aÅɵÀ½ì¹Æ›18a˽ȼ›18aÇÃÁ¹›19aÇɽȵ¶À¹›18a¸½Á¹ÂǽÃÂá›18aÇÉ·
+›1085d›999`Ë›42a¹Æá›15aÍ›542aÃÉ›16aÈÆÉÀÍ›15aµÆ¹
+›1085d›563`·µÂ›16a¶›1a¹›17aÇÉÄÄƹÇǹ¸å›17a¼Ã›31a¹Ê›88aÃÉ›15aǼÃÉÀ¸›16aÃÂÀÍ›16aÉǹ›16aȼ½Ç›16a½º›15aÍ
+›1141d›712`Ê›209aÍ›20aÇÉ·›698aȹ¸¹¸›20aÈÃ
+›1141d›563`¶›1a¹½Â»›20aÛ22a¹ÆÀõ¸¹¸›19a¶›105a¼›20aÁ¹Çǵ»¹Çá›20aǽ·¹›20aȼ¹›20a¸¹ºµÉÀÈ›19a½Ç›19a½Â
+›1198d›735`ÃÉ›18aȼµÈ›18a¯›18a³›19a¸½¸ÂÝÈ›18a¸Ã›19aµ›18a»Ã›1aÛ1a¸›19a¾Ã¶›18aú›19aȼ¹›18aǹÈȽ»á›19aµÂ¸›19aȼ¹Æ¹
+›1198d›563`½ÂºÃÆÁ›18aÍ
+›1208d›928`~
+›1254d›563`ƹµÀÀÍ›14m›14a6)+›2a+›10m›20a¶›1a¹›16aÇÃÁ¹È¼½Â»›14aÇȽ·›216aÈÛ14aȼ¹›15aÁµÆ»½Ââ
+›1254d›1125`¿½Â»›14aÃÉÈ›15a½Â
+›1337d›836`µÀɹ›18aÞUTTLIß›16a·ÃÆƹÇÄ›1aøǛ18aÈÛ18aȼµÈ›17aºÃÆÁ¹ÆÀÍ›17a鼵Ƹð˽ƹ¸Ý
+›1337d›563`¯¼¹›18a¸¹ºµÉÀÈ›18aÊ
+›1393d›600`ÈÛ18aȼ¹›19aÄÆûƵÁä›27aȼ½Ç›18a½Ç›19aµÂ›19a½Â›577a̽ÁµÈ¹ÀÍ
+›1393d›563`½Â›594aʽǽ¶ÀÍ›17aÇÁµÀÀ›18a¸½Çȵ·¹á›20aµÄÄÆÃ
+›1449d›563`¹Åɽʛ77aÈ›16aÈÛ15aȼ¹›16aË›21aÊ›424aÈÞÛß›20a¶ÉÈ›16a½Ç›15aÀµÆ»¹›15a¹ÂÃÉ»¼›16aÈÃ
+›1449d›666`µÀ¹Â›200aµ›22a¹À¹Â»È¼›14aú›16aʽǽ¶À¹›15aÀ½»¼
+›1506d›563`µ¶ÇÃƶ›15aµÂ›518aÍ›14a¼µ›22a¹›15aÛ1a··ÉÆƹ¸â
+›1506d›757`Í›15aÆÃɸ½Â»›15a¹ÆÆÃÆÇ›14aȼµÈ›15aÁµ›84aÊ
+›1614d›449`i5&499l›15m*›14m$),%-2).-›15m›2a+›10m›22a¯¼½Ç›18a½Ç›18aµÂµÀûÃÉÇ›17aÈÛ18aȼ¹›19ai(&499›17aÅɵÀ½ì¹Æ›18aµ¶›1aÛ22a¹á›19a¶ÉÈ
+›1614d›1801`Ê
+›1671d›563`ȵ¿›704a¼›20a¯›417aË›21aȼ¹
+›1671d›627`¹Ç›20a·µÆ¹›21aú›20aȼÃǹ›21aÛ1a··µÇ½ÃÂÇ›20aÛ21a˼½·›95a³›21a¼µÇ›20aǹț21aȹÌÈ›20a¶›1a¹ÀÃ
+›1681d›1402`~
+›1727d›1751`ÉÁ›16a¸¹Äȼ
+›1727d›563`¶›1aÃÈÈÃÁ›16aú›17aȼ¹›17aµÆ¹µ›16aȼµÈ›16a½È›16a¼µÇ›17aÂÃȽ칸›17aµÇ›16a¶›1a¹½Â»›17aȼ¹›17aÁµÌ½Á
+›1784d›1106`µÆ½»›20aÁ¹Çǵ»¹›21aºÆÃÁ›14m›52a_VlhXYpq›10m›20a½Ç›21aé0:@>
+›1784d›563`ú›21aȼ¹›21aĵ»¹å›23aȼ¹›22aƹÀµÈ¹¸›20aË›14m›440aR
+›1840d›10m›563`=>>I>K›23aMA:G›23a3>7›24aK>IHKM>=›23a;R›13m›23aó›10m›2aIM›469a¹Æ›21aºÃɸ
+›1840d›1303`Ýâ›37a¯¼¹›21aµÉȼÃÆ›20a¼µÇ›21a¹Ê
+›1896d›563`µÂ›569a¼›23a¯›17a³›23a¸Ã›1a¹Ç›22aȼ½Çá›23a¶ÉÈ›23aȼ¹›22aÅɵÀ½ì¹Æ›22a½Ç
+›1896d›610`Í›22a·½Æ·ÉÁÇȵ·¹Ç›22aɸ¹Æ›23a˼½·
+›1906d›1253`~
+›1953d›585`Ê›262aÍ›646aµÆ½»ۛ26aªÂ·¹›18aµ»µ½Âá
+›1953d›563`µ›20aµ½Àµ¶À¹›16aºÃÆ›17aµÂ›22aù›17a˼Û18a¸Ã›1a¹Ç›18aÇÉë¹Æ›17aºÆÃÁ›17aȼ½Ç›17aË
+›2009d›815`µÀɹ›16aºÃÆ›14aȼ¹›15aÅɵÀ½ì¹Æ›15a½Ç›15aUTTLIâ
+›2009d›563`ȼ¹›15a¸¹ºµÉÀÈ›15aÊ
+›2118d›12m›654`êÞáÜ›17aäèÖßÞøÚåæ›18aæÝâèßÙ›19aáÚé›423aì›19aâåÙÞáÖåì›18aèæÚåæ÷
+›2118d›472`ÐÝÚ›19aÛâßßâ›523aÚå›20aáÚÚÙ›19açâ›19a×›1aÚ›19aèæÚÙ›20a×
+›2174d›563`çÝÚ›15aÞáÛâåàÖçÞâá›14a×›1aÚßâ›279açÚáÙÚÙ›16açâ›15aÝÚßã›15aæìæçÚà›15aàÖáÖÜÚåæö
+›2174d›969`ê›14aÞæ›15aàÖÞáßì›14aÞá
+›2282d›10m›449`i0+›17a&/.3›17a$)1%#3/18›168aÉÇÈ›20aÇÄ›1a¹·½ºÍ›21aµ›20a¸½Æ¹·ÈÃÆÍ›20aÞÃÆ›20a¸½Æ¹·ÈÃÆÍ›20aÈƹ¹ß›20a½Â
+›2282d›888`¯¼½Ç›21aÁ
+›2339d›653`¼›15aȼ¹›16aĵ·›22a¹¸›16aĽ̹À›15aìÀ¹Ç›16aÞ½º›14aÉǹ¸ß›16aµÆ¹›15aÈÛ15a¶›1a¹›16aºÃɸâ›22a}½Æ¹·ÈÃÆÍ›14aÈƹ¹Ç
+›2339d›563`˼½·›185a¿
+›2395d›563`µÆ¹›16a½Â¸½·µÈ¹¸›17a¶›86aʽ»›16aého›277aË›56a¼µÆµ·È¹ÆÇ›16aú›16aȼ¹›17añ¸½Æ¹·ð
+›2395d›863`Í›16a¼µ›161aÝ›23aµÇ›16aȼ¹›17aÀµÇÈ›15aÈ›31aÛ15a·
+›2452d›563`ÈÃÆÍï›19aÇÄ›1a¹·½ì·µÈ½ÃÂâ›35az›21aÀû½·µÀ›18aµÁ¹›21aÁµ›168a¹Â›20aºÃÆ›20aȼ½Ç›20aÅɵÀ½ì¹Æá
+›2452d›1368`Í›19a¶›1a¹›21a»½Ê
+›2508d›563`ÄÆÛ289a¹Ç›18aÈÛ18aµÂ›19aµÄÄÆÃÄƽµÈ¹›18a¸½Æ¹·ÈÃÆÍ›18aÇÄ›1a¹·½ì·µÈ½ÃÂå›21a¸Ã›19aƹð
+›2508d›628`ʽ¸¹¸›19a½È›18aƹÇÃÀÊ
+›2565d›658`¶›1a¹Æ›22aÈÛ21a½Â·Àɸ¹›23aµ›21aȹÆÁ½ÂµÈ½Â»›21aéjÝá›22a¶›1a¹·µÉǹ›23aȼ¹›22aÅɵÀ½ì¹Æ›21a½ÈǹÀº›21a½Ç
+›2565d›563`Á¹Á
+›2621d›691`¹Æ¶µÈ½Á›14aµÇ›16aµ›16aÄƹìÌ›16aÈÛ15aȼ¹›16aìÀ¹›16aÇÄ›1a¹·½ì·µÈ½Ã›16aºÃÆ›15a¹µ·›101aÈ›15aìÀ¹â›23a¤º
+›2621d›563`Éǹ¸›17aÊ›993a¼›16aºÃÂ
+›2678d›563`µ›18aÁ›104aµÀɹ¸›17aÀû½·µÀ›16aµÁ¹›18a½Ç›18aÉǹ¸á›19aȼ¹›18a¹Åɽʛ324aÉÇÈ›14m›17a!+›2a+
+›2678d›10m›641`ÉÀȽðÊ›741aµÀ¹Â·¹›19aÇÈƽ»Ǜ17aÁ
+›2734d›1207`ÉÇÈ›14m›15a!+›2a+›10m›20aƹº¹Æ¹Â·¹›16a¸½Æ¹·ÈÃÆÍ›15aÈƹ¹Çå›15aÃÂÀÍ
+›2734d›563`ƹº¹Æ¹Â·¹›16aǽ»À¹›15a¸½Æ¹·ÈÃƽ¹Çá›14aÃÆ›15aÁ
+›2791d›836`µÀ¹Â·¹›15aÇÈƽ»›13a½Ç›14a¹ÌµÁ½Â¹¸›14aÈÛ14a¸¹È¹ÆÁ½Â¹›14a˼¹È¼¹Æ›15aµ›13aíµÈ›14aÃÆ
+›2791d›563`ȼ¹›14aìÆÇÈ›14a¹ÅɽÊ
+›2847d›563`Èƹ¹›14aÇÈÆÉ·ÈÉƹ›14a½Ç›14a¶›1a¹½Â»›14aÉǹ¸â›20a¯¼¹›15a$5)3/,.TWh#,$›12a·ÃÁÁµÂ¸›14a¸¹ì½ȽÃÂ
+›2903d›563`ìÀ¹›15aÄÆÛ454aµÀɹ›16a3%7›17a0+j›14aºÃÆ›15aȼ½Ç›15aÅɵÀ½ì¹Æâ
+›2903d›701`ʽ¸¹¸›15a¼µÇ›15aȼ¹›16a¸¹ºµÉÀÈ›14aÊ
+›2984d›14m›486`ßÞ
+›3000d›11m›541`¯²›14a¥¸¡­°¬¥Å›14a´¨¥›14a¯µ´°µ´›15a¯¦›15m›96aYU›11m›325a¹›14a´¨¥›13m›15aF:8?79›11m›11a­¡£²¯³Å›15a°›1a¥²­©´³
+›3000d›519`s›15m›446aRUS›11m›41aÅ›13a·¨¥®›15a¦¯²­¡´´¥¤›14a¢
+›3046d›449`¬©®¥³›13a¯¦›13a¦¯²­¡´´¥¤›15m›38aSXTSW›11m›13a£¯›1a¤¥›13a´¯›13a¥¸£¥¥¤›14a´¨¥›13a²©§¨›273a¹›13aµ°›14a´¯›13a»º°´Æ
+›3046d›15m›759`Q›11m›503a´Ñ¨¡®¤›14a­¡²§©®›13a¢
+›1;449;2956;2;598!|
+›1;1328;2901;2;15!|
+›1;637;2280;2;15!|
+›1;524;2280;2;15!|
+
+
+›462d›10m›607`Ñ×›12m›635aÀ›10m›46a$5),.TW›12m›14aÁËÉÉ¿Ê›14aÍÑ¿ÈÇÄÇÃÎÏ
+›607d›10m›607`i07,›17a&/.3›16a$)1%#3/18›22a¯¼½Ç›24aÇÄ›1a¹·½ì¹Ç›26aȼ¹›25a¸½Æ¹·ÈÃÆÍ›24aÞÃÆ›23a¸½Æ¹·ÈÃÆÍ›24aÈƹ¹ß›25a½Â
+›664d›721`˼½·›152a¿›434aÍ›10a¶›1a¹›12aºÃɸá›12a½º›10aÉǹ¸â›20a¯¼¹›11aǵÁ¹›11aÆÉÀ¹Ç
+›664d›811`¼›11aÉÂĵ·›22a¹¸›12aĽ̹À›10aƵÇȹƛ11aìÀ¹Ç›11aÁµ
+›720d›721`ƹ»µÆ¸½Â»›14aÉǹ›16aú›14aÀû½·µÀ›14aµÁ¹Ç›15aµÄÄÀÍ›15a¼¹Æ¹›16aµÇ›15aÈÛ14aȼ¹›16aÄƹʽÃÉÇ›14aÅɵÀ½ì¹Æâ
+›777d›721`¯¼¹›15ah#,$›153aʽ¸¹¸›15a»½Ê›352aµÀɹ›15aú›15a3%7›17a07,›16a1//3jâ
+›777d›925`ìÀ¹›15aÄÆÛ180a¹Ç›14aȼ½Ç›15aµ›15a¸¹ºµÉÀÈ›15aÊ
+›870d›607`i3&-›17a$)1%#3/18›1058a¼›19aȼ¹
+›870d›957`¯¼½Ç›20aÇÄ›1a¹·½ì¹Ç›20aȼ¹›20a¸½Æ¹·ÈÃÆÍ›18aÞÃÆ›19a¸½Æ¹·ÈÃƽ¹Çß›19a½Â›19a˼½·
+›927d›721`¯›17a³›18a¡›43aÈ›18a¨¹Èƽ·Ç›17aÞh3&-›391aÍ›18aȼ¹›18aÄÆûƵÁâ›27a¯¼¹›19a¸½Çð
+›927d›849`Û315aß›17aµÆ¹›17aÈÛ18a¶›1a¹›19aºÃɸ›18a¶
+›937d›746`~
+›983d›921`¹ÆǽÛ14aú›14aȼ¹›15a$5)3/,.TWh#,$›14aìÀ¹›15a¼µÇ›14a3%7›17a&/.32j›14aµÇ›15aȼ¹›15a¸¹ð
+›983d›721`Èƽ¶Éȹ¸›15aÊ
+›1040d›849`µÀɹ›16aºÃÆ›14aȼ½Ç›15aÅɵÀ½ì¹Æâ
+›1040d›721`ºµÉÀÈ›14aÊ
+›1134d›607`i5)134!,›16a$)1%#3/18›1046a¼
+›1134d›1053`¯¼½Ç›17aÇÄ›1a¹·½ì¹Ç›19aȼ¹›18a¸½Æ¹·ÈÃÆÍ›17aÞÃÆ›17a¸½Æ¹·ÈÃƽ¹Çß›16a½Â›18a˼½·
+›1190d›721`±½ÆÈɵÀ›19a¡›43aÈ›20aÞh5&›502aÍ›20aȼ¹›21aÄÆûƵÁâ›36a¯¼¹›21a¸½Çð
+›1190d›910`Û127aß›20aìÀ¹Ç›21aµÆ¹›20aÈÛ20a¶›1a¹›22aºÃɸ›21a¶
+›1246d›921`¹ÆǽÛ14aú›14aȼ¹›15a$5)3/,.TWh#,$›14aìÀ¹›15a¼µÇ›14a3%7›17a&/.32j›14aµÇ›15aȼ¹›15a¸¹ð
+›1246d›721`Èƽ¶Éȹ¸›15aÊ
+›1303d›721`ºµÉÀÈ›16aÊ›488aÉÇ›17aÄÀµ·½Â»›16ah5&›16aìÀ¹Ç›17a½Â›16aȼ¹›17aǵÁ¹›16a¸½Æ¹·ð
+›1303d›851`µÀɹ›17aºÃÆ›16aȼ½Ç›16aÅɵÀ½ì¹Æá›16aȼ
+›1359d›721`ÈÃÆÍ›15aµÇ›16aȼ¹›17ah3&-›385aÈÇ›16aµÆ¹›16aÂÃÈ›16a½Â›16aÉǹá›17aƹÁÛ22a¹›15aȼ¹›17aÀ½Â¹
+›1359d›1068`ìÀ¹Çâ›23a¤º›17aʽÆÈɵÀ›15aºÃ›455aÊ
+›1416d›721`é=>?:NEMgÝ›13aºÆÃÁ›15aȼ¹›15a¸¹ì½ȽÛ15aú›15aȼ½Ç›14aÅɵÀ½ì¹Æâ
+›1510d›607`i0!0%1›17a2)9%›22a¯¼½Ç›22aÅɵÀ½ì¹Æ›23aÁ›130aÊ›300aµÀɹǛ23aÞ¸¹ì¹¸›24a½Â›23aȼ¹
+›1510d›1218`ÉÇÈ›23a¼µ›22a¹›23aù›23aú›23aȼ¹›23aÊ
+›1566d›721`0!0%1t380%2›15aǹ·È½Ã›16aú›16aȼ¹›16ah#,$›639aµÀɹ
+›1566d›1397`ìÀ¹ß›16aÇÄ›1a¹·½ì¹¸›18aµÇ›16a¸¹ºµÉÀÈâ›23a¯¼¹›16aÊ
+›1623d›721`Þ!X›18aÃÆ›19a42›1022a¼›19aµÈ›18aȼ¹
+›1623d›913`ß›19aǼÃÉÀ¸›19aÆ¹í¹·È›20aȼ¹›19aǹÈȽ»›18aú›19aȼ¹›19aĵě1a¹Æ›20aǽι›19aÇ˽ȷ
+›1679d›1022`ȹÆâ›19azÇ›14aÁ½»¼›391aµÀɹǛ15aÄƹĵƹ›14aȼ¹›15aÄÆÃð
+›1679d›721`ƹµÆ›14aú›14aȼ¹›14aÄƽ›251aÈ›13a¶›1a¹›15a¹ÌÄ›1a¹·È¹¸á›16aȼ¹›14aÊ
+›1717d›15m›1791`H
+›1735d›10m›721`»ÆµÁ›13aÈÛ13aÉǹ›14a~ÉÆÃÄ›1a¹µÂ›14aÞÑÐÏ›15m›7a&›10m›7aÑØÖÁÁß›11aÃÆ›13a°®›14a§¹Èȹƛ14aÞ×›15m›34a&›10m›7aÐнÂß›12aĵě1a¹Æá
+›1750d›15m›1791`I
+›1792d›10m›721`ƹÇÄ›1a¹·È½Ê›48aâ
+›1792d›897`¹ÀÍ
+›1;479;1444;348;8!|
+›1;1791;1722;2;18!|
+›1;754;1508;2;15!|
+›1;1735;1244;2;15!|
+›1;802;1132;2;15!|
+›1;1735;981;2;15!|
+›1;706;868;2;15!|
+›1;1909;775;2;15!|
+›1;1820;775;2;15!|
+›1;819;605;2;15!|
+›1;706;605;2;15!|
+
+
+›462d›1898`ÑØ
+›607d›13m›654`Ú›16aØÔ›16aÙ×Ë›16aÛ›147aÚÓ›16a¶›64aØ×›18aÚÏØΛ15a›270aĹá
+›607d›449`³›69a¸Ô›288aÔÙÖ›17aÔ›139aÔÓ›292aÆ›16aÇÓÊ›17a´
+›620d›1562`µ
+›682d›568`ØÔº¼Üß
+›783d›10m›449`ªÆ¸½ÂµÆÍ›12aÉǹÆÇ›13aǼÃÉÀ¸›12m›92az§›10m›11a¼µ›22a¹›12aµÂ›255aÈ›11aÈÛ12aÉǹ›13aȼ¹›12aÅɵÀ½ì¹ÆÇ›12aȼµÈ
+›783d›12m›895`¤z«›10m›103aÊ›78aÍ›12aƹÅɽƹÁ¹Â
+›840d›449`ǹÀ¹·È›14aȼ¹›14aÀÛ1a·µÈ½Ã›12aú›13aȼ¹›14ah3&-›13aÃÆ›13aĽ̹À›13aƵÇȹƛ13aìÀ¹Çå›14a¹Ì·¹ÄȽõÀÀÍ›69aË›42a¹Æá›12a½º
+›840d›1706`á›13a¼Ã›31a¹Ê
+›896d›449`Í›557aÈ›16aȼµÈ›15a¸Ã›1a¹ÇÂÝÈ›17aÃȼ¹Æ˽ǹ›15a¹Ì½ÇÈ›16a½Â›17aȼ¹›16aÇȵ¸µÆ¸
+›896d›472`ÃÉ›17a¹¹¸›17aÈÛ16aÉǹ›17aµ›16aÇÄ›1a¹·½µÀ›16aºÃÂ
+›953d›449`¸½Æ¹·ÈÃƽ¹Çá›15aȼ¹Ç¹›15aÅɵÀ½ì¹ÆÇ›15a·µÂ›16a¶›1a¹›16aÉǹ¸á›15a½Â›16a·Ã¾É·ȽÛ15a˽ȼ›15aÄÆÛ1a·¹ÇÇ›16aÀû½·µÀ
+›1009d›1247`Ë›18aºÃ›180a¹ÀÀ›17aµÇ›18aȼ¹›19aÇȵ¸µÆ¸
+›1009d›449`µÁ¹Çá›20aÈÛ18aÄ›1a¹ÆÁ½È›18aµ··¹ÇÇ›19aÈÛ18aȼ¹›19aÉǹÆÝÇ›18aÛ136aÈÞÇß›17aµÇ›19aË
+›1066d›449`ùÇâ
+›1122d›520`¡½ÆÇÈ›19aú›19aµÀÀá›19a¶›1aÃȼ›20a¯›18a³›20a½ÈǹÀº›19aµÂ¸›14m›52a_VlhXYpq›10m›18a˽ÀÀ›19aƹÅɽƹ›20aµ··¹ÇÇ›20aÈÛ19aȼ¹
+›1122d›14m›1198`R
+›1132d›10m›910`~
+›1179d›449`¯›18a³›13a¡›43aÈ›12a¨¹Èƽ·Çå›13aµÇ›13aµÀƹµ¸Í›12a¸¹Ç·Æ½¶›1a¹¸á›14aȼ¹Ç¹›13aÂÃÆÁµÀÀÍ›12aƹǽ¸¹›13a½Â›13aµ›13a¸½Æ¹·ÈÃÆÍ
+›1179d›573`ÃÂ
+›1189d›474`~
+›1235d›600`¼›20aȼ¹›20aÀû½·µÀ›18aµÁ¹›20a3%7›17a&/.32›19aƹº¹ÆÇå›22aù›20a·ÃÉÀ¸á›21aú›20a·ÃÉÆǹá›21aǽÁÄÀÍ
+›1235d›449`ÈÛ20a˼½·
+›1291d›449`ƹ¸¹ì¹›18aȼ½Ç›17aÀû½·µÀ›15aµÁ¹›17aÈÛ16aÄ›1aý›327aÈÇá›16a¶ÉÈ›17aȼ¹Â›17a¹½È¼¹Æ›17a¯›18a³
+›1291d›1120`È›17aÈÛ16aȼ¹›17a¹˛17aºÃÂ
+›1301d›1884`~
+›1348d›449`ÂÃÆ›14m›51a_VlhXYpq›10m›49aÃÉÀ¸›18a¶›1a¹›19aµ¶À¹›18aÈÛ18aÀÛ1a·µÈ¹›18aȼ¹›14m›165a$›10m›23aºÃ›328aÈ
+›1348d›14m›534`R›10m›201aË›14m›544a23!-$!1›10m›105aÈÇâ›29a®Ã›18aù›19aÁ½»¼
+›1404d›449`¸¹ì¹›16a˼µÈ›12m›14aÂÞÜÞçÖß›10m›14a·µÀÀ›14aµ›14aǹµÆ·›797aÉÀȽð
+›1404d›1063`¼ðÀ½ÇÈ›13aÞ¶ÉÈ›14aȼ¹›15aµÉȼÃÆ›14aÄƹº¹ÆÇ›14aÈÛ14a·µÀÀ›14aµ›14aÁ
+›1461d›449`Ê›461a¹›14aȼ½Çä
+›1461d›470`µÀɹ¸›16aÀû½·µÀ›14aµÁ¹ßá›14aÀ½¿
+›1545d›12m›449`ºcbi»¶›10m›23a$%&).%›23a-8›17a&/.32›23an-8›17a$)1h3&-og3%7›15a&/.32
+›1623d›14m›719`}
+›1629d›10m›449`¯¼¹Â›16aÈÛ15aÆÉ›15a§›5a¯›18a³á›15aù›15aË›147aÊ›129aÍä
+›1629d›968`ÃÉÀ¸›15a¼µ›22a¹›14aÈÛ15aǵ
+›1643d›765`~
+›1696d›15m›1544`JJ
+›1712d›12m›449`ºcbi»¶›10m›23a,!3%7i&/.3t$)1%#›166at&/.32j›21a-8t&),%
+›1712d›1020`3/18l-8
+›1790d›14m›764`}
+›1796d›10m›707`Ë›12a§›5a¯›734aÃÉÆ›13aÛ132aÈÇå›13aǽ·¹
+›1796d›449`¯¼½Ç›14a˽ÀÀ›12aµÀÀÛ128a³›14aÈÛ13aµ··¹ÇÇ›14a¶›1aÃȼ›14aȼ¹›14aÇȵ¸µÆ¸›13aµÂ¸›14aÍ›100aË›14aºÃÂ
+›1810d›810`~
+›1853d›472`ÃÉÆ›19aºÃ›841a¼›19aÀ½ÇÈá›18ah3&-›19aìÀ¹Ç›19a˽ÀÀ›18a¶›1a¹
+›1853d›449`Í›145aÈÇ›19aÄƹ·¹¸¹›20aȼ¹›19aÇȵ¸µÆ¸›19aùǛ19a½Â›19aȼ¹›20aǹµÆ·
+›1909d›449`ȵ¿›186aÃÉÆ›13a¸½Æ¹·ÈÃÆÍ›13a½Â›13aÄƹº¹Æ¹Â·¹›14aÈÛ13aµÂ›589aÈ
+›1909d›513`¹Â›13aºÆÃÁ›13aÍ›636aÍ›13aú›13aȼ¹›14aǵÁ¹›13aµÁ¹›13aȼµÈ›13aÁ½»¼
+›1966d›449`µÀƹµ¸Í›15a¶›1a¹›16a½Â›15aȼ¹›15aÇȵ¸µÆ¸›15aÀÛ1a·µÈ½ÃÂâ
+›2022d›549`Û18aÆÉ›14m›50a_VlhXYpq›10m›115aÉÇÈ›17a¼µ›22a¹›17aµ··¹ÇÇ›18aÂÃÈ›18aÃÂÀÍ›17aÈÛ17aȼ¹›18ah3&-›18aìÀ¹Çá›18a¶ÉÈ
+›2022d›520`¯›14m›123aR›10m›184aá›17a½È›17aÁ›124aÊ
+›2079d›449`µÀÇÛ20aÈÛ20aȼ¹›20aĽ̹À›20aƵÇȹƛ20aìÀ¹Ç›20aÞ¹½È¼¹Æ›20aĵ·›22a¹¸›20aÃÆ›20aÉÂĵ·›22a¹¸ßâ›36a²¼½·›67a¹Æ›20aìÀ¹
+›2079d›1255`¿›242a¿›215a¼¹Ê
+›2135d›1107`¼Ãǹ›14aºÃÆ›14aȼ¹Ç¹›14a޵¸›14aĵ·›22a¹¸›15aµÂ¸›14aÉÂĵ·›22a¹¸
+›2135d›449`¸½Æ¹·ÈÃÆÍ›14aÃÆ»µÂ½ÎµÈ½Ã›12a¼µÇ›14a¶›1a¹¹Â›16a·›480a¿›263a¿
+›2191d›978`È›19aÃÆ»µÂ½ÎµÈ½ÃÂÇßá›18aȼ¹›21aĽ̹À›19aìÀ¹Ç›20aºÃÆ›20aÍ›161aµÈ¹
+›2191d›449`ƵÇȹÆÇ›19a·µÂ›21aÉȽÀ½Î¹›19a¸½ë¹Æ¹Â›742aÃÉÆ›19aÄƽÊ
+›2248d›510`ÈÇ›14m›15a,423›10m›68aÊ›792aÃÉ›15a¼µ›22a¹›15aÃÂÀÍ›16aĵ·›22a¹¸
+›2248d›449`ºÃ›166a¼µ›22a¹›15aȼ¹›16aǵÁ¹›15aÃÆ»µÂ½ÎµÈ½ÃÂâ›20a¯¼¹Æ¹ºÃƹá›15a½º›16aÍ›109aÊ›202a¿
+›2304d›449`Ľ̹À›13aìÀ¹Çá›13aµÂ¸›13aȼ¹›13aÇȵ¸µÆ¸›12aºÃ›647aá›13aƹº¹Æ¹Â·¹¸
+›2304d›1069`ÈÇ›12aµÆ¹›13aµÆƵ»¹¸›12a½Â›13aµ›12aíµÈ›12a¸½Æ¹·ÈÃÆÍ
+›2361d›473`Í›16aȼ¹›15aÀû½·µÀ›13a3%7›17a0+á›15aÍ›159aÈ›14aÁµ¿›197a˽»›13a¸¹ì½ȽÃÂä
+›2361d›449`¶›446aÃÉ›14aÁ½»¼›115a¹›15aȼ¹›15aºÃÀÀÃ
+›2445d›12m›449`ºcbi»¶›10m›23a$%&).%›23a-8›17a0+›16a&),%2›24an-8›16a$)1h&/.32h0+og3%7›15a0+
+›2528d›520`zÀȹƵȽʛ52aá›20aÃÆ›20aµ¸¸½È½ÃµÀÀÍ›99aÃÉ›21a¼µ›22a¹›20aÉÂĵ·›22a¹¸›21aĽ̹À›21aƵÇȹÆÇ›20a½Â›20aµ
+›2528d›725`¹ÀÍ›324aá›20a½º›20aÍ›115aÊ›156a¿
+›2585d›449`ÆÛ1aÃȹ¸›17a¸½Æ¹·ÈÃÆÍ›17aÇÈÆÉ·ÈÉƹá›17aȼ¹›17aºÃÀÀÛ410aÈ›16aÇÉî·¹á›18aµÇÇÉÁ½Â»
+›2585d›1165`˽»›15a¸¹ì½ȽÛ17aÁ½»¼
+›2641d›877`ÈÇ›14aµÆ¹›15aµ··¹Çǽ¶À¹›15aȼÆÃÉ»¼›15a3%7›17a07,›17a1//3ä
+›2641d›449`ȼµÈ›15aȼ¹›15aÇȵ¸µÆ¸›15aºÃÂ
+›2725d›12m›449`ºcbi»¶›10m›23a$%&).%›23a-8›17a07,›16a&),%2›24an-8›16a$)1h&/.32h07,hog3%7›15a07,›17a1//3
+›2809d›520`¯¼¹Â›16aÈÛ16aÆÉ›14m›48a_VlhXYpq›10m›93aʽ¸½Â»›15a½È›15a˽ȼ›15aµ··¹ÇÇ›16aÈÛ16aȼ¹›16ah3&-›15aµÂ¸›16aĽ̹À
+›2809d›14m›780`R›10m›184aá›15aÄÆÃ
+›2866d›710`ÃÉÆ›11aÛ473aÈÇá›10a½È›11aË›439aÊ›45a¹
+›2866d›449`ìÀ¹Ç›12aú›10a¶›1aÃȼ›11aÍ›98aË›11aµÂ¸›11aȼ¹›11aÇȵ¸µÆ¸›11aºÃ›132aÃÉÀ¸›10a¶›1a¹›12a¹·¹ÇǵÆÍ›11aÈÛ11a½Â›22aÿ
+›2922d›759`¹›14aȼ½Çä
+›2922d›449`ȼ¹›16aÄÆûƵÁ›14aÀ½¿
+›2984d›14m›486`ßß
+›3000d›11m›519`w¯´¥›21a´¨¥›22aË›13mT›11m›591a¥²›22a©³›21a°²¯›260a¡¬µ¥›22a¦¯²›21a´¨¥
+›3000d›726`›33a¡¦´¥²›21a´¨¥›22a¬¯§©£¡¬›21a®¡­¥È›26a·¨¡´¥¶›154a¶©¤¥¤›23a¡³›22a´¨¥›21a¶
+›3046d›13m›681`-/6›11m›189aµ³´›13a¬¥§¡¬¬¹›12a¢›1a¥›13a£¡°¡¢¬¥›14a¯¦›12a¢›1a¥©®§›14a°²¥Í¸¥¤›14a´¯›12a¡›13aͬ¥›13a³°›1a¥£©Í£¡´©¯®
+›3046d›13m›449`S&-,1›13a$(/%#1›11m›69a±µ¡¬©Í¥²›13a­
+›1;551;3044;2;12!|
+›1;449;2956;2;598!|
+›1;1735;2723;2;15!|
+›1;1648;2723;2;15!|
+›1;1176;2723;2;15!|
+›1;944;2723;2;15!|
+›1;855;2723;2;15!|
+›1;1544;2639;2;15!|
+›1;1455;2639;2;15!|
+›1;1576;2443;2;15!|
+›1;1152;2443;2;15!|
+›1;920;2443;2;15!|
+›1;855;2443;2;15!|
+›1;807;2359;2;15!|
+›1;1392;1543;2;15!|
+›1;1087;1543;2;15!|
+›1;855;1543;2;15!|
+›1;1075;1233;2;15!|
+
+
+›462d›10m›607`ÒÏ›12m›146aÓ›12aÐË›13aÑÏÛ13aÕËÑΛ12aË›121aËÊÐÏ›13aÓÇÐÆ›12aЛ213aÒÇÐËÈÊíð
+›462d›653`Á›45aÆË›425aÓÊ›12aÄ›332aÔ›12a¿Ê›12aÂ
+›472d›1654`Ã
+›591d›15m›1560`JK
+›607d›12m›607`ºcbi»¶›10m›716a32j›51að
+›607d›794`$5),.TW›23ai3&-t$)1%#3/18l-8t&/.
+›648d›15m›1296`L
+›648d›1279`J
+›664d›12m›631`¶›10m›478a-8t0+j›50a-8t&),%
+›664d›680`i0+t&/.3t$)1%#3/18l
+›757d›860`¼›20aµ›19aÄƽʛ138aÈ›19a¼µÇ›19a¶›1a¹¹Â›20aÄÆÛ22a¹Â›20aÀÛ1a·µÀÀÍ›18a½Â›19aÍ›259aá›19a½È
+›757d›678`ªÂ·¹›20aÇÉ·›163aµÈ¹›19aºÃ›297aÊ›292aÃÉÆ›19a¸½Æ¹·ÈÃÆÍ
+›814d›639`ÃÉÀ¸›18a¶›1a¹›19a¶›1a¹Èȹƛ18a½º›18aÍ›170aÃÉÆ›18aÀÛ1a·µÀ›17a¯›530aÈÇ›18aµÀû
+›814d›607`Ë›374aÃÉ›18a»ÃÈ›18aÍ›244a³Â½·½µÂ›18aÈÛ18a½ÂÇȵÀÀ›16aȼ¹›19aºÃÂ
+›824d›1404`~
+›870d›607`˽ȼ›15aȼ¹›15aÇȵ¸µÆ¸›15aùǛ16aÞÉÂÀ¹ÇÇ›15aȼ¹Æ¹›16aµÆ¹›15aÀ½·¹Âǽ»›15aƹÇÈƽ·È½ÃÂÇ›13aµÄÄÀ½·µ¶À¹›15aÈÃ
+›927d›1243`ÈÇßá›16aǽ·¹›17a½È›16a˽ÀÀ›16aǵ›22a¹›16aȼ¹›17aÉǵ»¹›17aú›17aµÀÀ›16aȼÃǹ
+›927d›607`ȼ¹›17aÉǹ›18aú›16aȼ¹›18aÂÃÂðÇȵ¸µÆ¸›17aºÃ›370aÊ
+›983d›607`µ›88aµÆ¸›14a·ÃÁÁµÂ¸ðÀ½Â¹›15aÅɵÀ½ì¹ÆÇÛ
+›983d›629`Ë¿Ë
+›2939d›14m›644`ßà
+›2955d›11m›676`n§¡©®Å›13a®¯´¥›14a´¨¡´›14a´¨¥›13aË›13mT›11m›1015a¹
+›2955d›1066`›17a©³›13a®¥£¥³³¡²¹›15a¯®›14a´¨¥›13aµ³¥²Ñ¤¥Í®¥¤›15a¬¯§©£¡¬›13a®¡­¥›14a³¯›14a´¨¡´›13a©´›13a­¡
+›3000d›607`¢›1a¥›13a°²¥°›1a¥®¤¥¤›15a´¯›13a¡›13aͬ¥›13a³°›1a¥£©Í£¡´©¯®
+›3030d›14m›644`ßá
+›3046d›11m›676`n®¤Ç¯²›13m›14aS.5*›13a&-,1›12a$(/%#1-›58a+6›12a.5*›13a&(*%0T
+›3046d›1138`/6U
+›1;1311;3044;2;12!|
+›1;1238;3044;2;12!|
+›1;989;3044;2;12!|
+›1;896;3044;2;12!|
+›1;607;2910;2;598!|
+›1;610;660;4;21!|
+
+
+›462d›10m›1898`ÒÐ
+›607d›13m›449`´›69aÂÎË›22a·¹¼½ØÔÁ¹Æ›23a¾ÖÔÍÖÇÒ
+›711d›10m›449`¯¼½Ç›19aÄÆûƵÁ›17aË›245aÍ›18a®Åɵ¸ÆÛ19a§¹µ¸¹Æ›19a¥Ã¼Â›14m›81a££¨««›10m›164aµÇ
+›711d›774`µÇ›18aËƽÈȹ›18a¶›14m›516au}›10m›140aá›19a˼Û19aË
+›768d›776`È›19aµÈ›18a­¨|®›17a½Â›18aÐØ×Öâ›29a¤È›18a½Ç›18aËƽÈȹ›17a½Â›14m›19av›52a«©}§›10m›18aµÂ¸›19a¼µÇ›18aµ
+›768d›449`µÂ›19a¨â®·â›17aÇÈɸ¹Â›14m›787a¨©
+›824d›10m›970`ȹƺµ·¹â›20az›303aȹƹÇȹ¸›15a½Â›15aµ·Åɽƽ»›14aµ
+›824d›449`ºÉÀÀ›15a}|§›15a·ÃÁÁµÂ¸ðÀ½Â¹›15a½Â›223aÍ›15aǽȹ›14aȼµÈ›15a½Ç›15a½Â
+›880d›516`Í›16aú›15aȼ¹›16aÄÆûƵÁ›14a½Ç›15aË›432aÍ›15aǹ¸½Â»›16aµÂ›16a¹ðÁµ½À›14aÁ¹Çǵ»¹
+›880d›449`·ÃÄ›430a¹À·ÃÁ¹›15aÈÛ15aƹÅɹÇÈ›15a½È›15a¶
+›937d›449`ÈÛ15aȼ¹›15aµÉȼÃÆ›15aú›14m›47a_VlhXYpq›10má›516aKF<Ls›13aÞ›14mx}§¢«›10mßâ
+›937d›14m›782`R›10m›210ar3>7mNDh:<h<K:G?B>E=h
+›1066d›13m›449`\¬¦›56ae{qzm{uxs›18a}y›19a~|q›14m›225añ
+›1066d›1019`èéëìôóîé
+›1154d›10m›1369`Ê›45a¹›15a½ÈÇ›15a·ÃÁÁµÂ¸›15a¸¹ì½ȽÃÂá
+›1154d›449`{¹ºÃƹ›16aìÆÇÈ›16aµÈȹÁÄȽ»›14aÈÛ15aÉǹ›16aȼ¹›16aÄÆûƵÁá›15a½Â›22aÿ
+›1211d›449`¶›405a˽»›13a·ÃÁÁµÂ¸ä
+›1211d›473`Í›16a¹Ì¹·ÉȽ»›15aȼ¹›15aºÃÀÀÃ
+›1310d›12m›449`ºcbi»¶›10m›23a2%3›23a#/--!.$›23a3%7›17a%7%j')./3/2)7
+›1408d›493`ƹÅɹ›369aÍ›12aÁµ›596aÈÛ13aȼ¹½Æ›13aÀû½Â
+›1408d›449`Þ¡›127aÈ›14aÉǹÆÇ›13aú›14aȼ¹›13aÉȽÀ½È›95aÍ›13a·µÆ¹›14aÈÛ13aÄÉÈ›13aȼ½Ç›14a·ÃÁÁµÂ¸›13a½Â
+›1465d›449`·ÃÁÁµÂ¸›16aÄÆÛ1a·¹¸Éƹâß
+›1594d›13m›449`\¬§›56aj|uxs›19a}tq›14m›199aéñ›13m›16ae{ys{mw
+›1594d›14m›848`èéëìôóî
+›1682d›10m›449`²¼µÈ¹Ê›667aÊ›456aÉÇÈ›15aìÆÇÈÀÍ
+›1682d›605`¹Æ›14a»ÆµÄ¼½·Ç›15aµÆ¹›14aƹÅɽƹ¸›15aÈÛ14a¶›1a¹›15a·Ã›22a¹Æȹ¸›15aÈÛ14aǽ̹À›14aºÃÆÁµÈ›13aÁ
+›1739d›449`¶›1a¹›15aÃÉÈÄÉÈ›13a¶›208aÈÛ13aµ›13aÄǹɸÃð·Ã›1a¸¹›14aìÀ¹›14aÞÉǽ»›13aȼ¹›13a2!5$1!›92a¹Æßâ›18a¯¼¹Â
+›1739d›681`Í›13a¢¤©ª›14a½Â›783a¸Æ½Ê
+›1795d›486`Ê›45a¹›15a')./MH2)7›154aËÇä
+›1795d›449`½Â›22aÿ›264aµÇ›14aºÃÀÀÃ
+›1894d›12m›449`ºcbi»¶›10m›23a')./3/2)7›15m›22a*›14m:+%›16a-!,%›15m›3a+
+›2021d›12m›449`c¹±¹°›52anªv¢~½z§¨›16av¦¦¢~xvw¢z›18a©¥›10m›17a')./MH2)7
+›2109d›449`¯¼¹›16aÉȽÀ½È›184a¹›14aµ›15a›61a¶›1a¹Æ›15aú›15aÃÄȽõÀ›14aÅɵÀ½ì¹ÆÇá›14aµÇ›15aɸ¹Æä
+›2109d›642`Í›13a·µÂ›16aȵ¿›95aÉÁ
+›2222d›449`i2)9%lc›15m*›14m./3).-M›13mö›8aö›8aö›15m›5a+›10md›22a®Ä›1a¹·½ì¹Ç›18aȼ¹›17aµÆ¹µá›16a½Â›16aÁ½ÀÀ½Á¹ÈƹÇá›14aú›17aȼ¹›16aǽ̹À›16a½Áµ»¹â
+›2279d›563`¤º›17aȼ½Ç›17aÅɵÀ½ì¹Æ›16a½Ç›17aÂÃÈ›17aÉǹ¸á›17aȼ¹›18a¸¹ºµÉÀÈ›16aµ·È½Ã›16a½Ç›17aÈÛ16a·ÃÄ›239aË
+›2279d›1672`Í›17aȼ¹›18a˽¸Ã
+›2335d›1154`˽»›11a½Ç›11aÂÃÈ›11a½Â›12a¹ë¹·Èß›11aú›12aȼ¹›11aǵ›22a¹¸›12aĽ·ÈÉƹ
+›2335d›563`ǽι›12aÞÃÆ›11aȼ¹›12aĵě1a¹Æ›12aǽι›12a½º›11a˽¸Û570aÊ
+›2391d›706`Èâ
+›2391d›563`ǹ»Á¹Â
+›2469d›952`ËÇä
+›2469d›563`ªÄȽÃÂÇ›15aµÆ¹›15aµÇ›15aºÃÀÀÃ
+›2568d›563`6)$3(j›15m*›14m›106a%1›15m›4a+›10m›22a®Ä›1a¹·½ì¹Ç›12aȼ¹›11a˽¸È¼›10a½Â›11aÁÁ›11aú›10aȼ¹›11aǽ̹À›10a½Áµ»¹å›11a¸¹ºµÉÀÈÇ
+›2568d›14m›725`-4,"
+›2624d›10m›663`ÈÛ15aȼ¹›15aǵ›22a¹¸›15a˽¸È¼â
+›2624d›837`Ê
+›2700d›563`(%)'(3j›15m*›14m›106a%1›15m›3a+›10m›395aÈ›17a½Â›18aÁÁ›17aú›17aȼ¹›18aǽ̹À›17a½Áµ»¹å›18a¸¹ð
+›2700d›14m›749`-4,"›10m›82a®Ä›1a¹·½ì¹Ç›19aȼ¹›18a¼¹½»¼
+›2757d›962`Ê›164aÈâ
+›2757d›663`ºµÉÀÈÇ›14aÈÛ15aȼ¹›15aǵ›22a¹¸›15a¼¹½»¼
+›2855d›563`¤º›16aÃÂÀÍ›14aù›16aÃÄȽÛ14a½Ç›15aÇÄ›1a¹·½ì¹¸á›16aȼ¹›15aĵƹ›193aÍ›15a¶›1a¹›16aÃÁ½Èȹ¸â
+›2855d›1363`ȼ¹Ç¹Ç›15aÁµ
+›2933d›12m›563`k¹a¹›10m›13a¤º›14aȼ½Ç›14aÅɵÀ½ì¹Æ›13a½Ç›14aÉǹ¸›14a½Â›14a·Ã¾É·ȽÛ14a˽ȼ›14aȼ¹›14ai2#!,%›13aÅɵÀ½ì¹Æá
+›2990d›1378`Ë›18aȼ¹›18a½Áµ»¹â›30a¤º›19aȼ¹›19ai2#!,%
+›2990d›563`ȼ¹›19aµ·È½Ã›18a½Ç›18aìÆÇÈÀÍ›18aÈÛ18aÇ·µÀ¹á›19aȼ¹Â›19a˽¸Ã
+›3046d›563`ÅɵÀ½ì¹Æ›15a½Ç›14aÂÃÈ›15aÉǹ¸á›16aȼ¹›15a½Áµ»¹›14a½Ç›15aÇ·µÀ¹¸›15aÈÛ15aìÈ›15aȼ¹›15aǽι›15aÇÄ›1a¹·½ì¹¸â
+›1;955;1892;2;14!|
+›1;998;1308;2;15!|
+
+
+›462d›607`ÒÑ›12m›1269aËÅοÉ
+›462d›1384`›46aÐÆÛ15aÅÇÊËÐËÏÇÔ›16aÌÎ
+›607d›10m›607`iç./è&/1-&%%$›21a¤ÂÇÈÆÉ·ÈÇ›14a')./MH2)7›482a¼µÆµ·È¹Æ›13aÈÛ13aȼ¹
+›607d›1337`ÈÛ13aµÄÄ›1a¹Â¸›15aµ›14aºÃÆÁ›13aº¹¹¸›15a·
+›664d›1319`ËÇ›15aȼ¹›17aÃÉÈÄÉÈ›17aÈÛ16a¶›1a¹›18aÅɹɹ¸›18a¸½Æ¹·ÈÀÍ›16aÈÃ
+›664d›721`¹Â¸›17aú›17aȼ¹›17aǽ̹À›16aìÀ¹â›25a¯¼½Ç›17aµÀÀÃ
+›720d›721`ȼ¹›17a§©ÏÒ›17aÄƽ›671aÉÇÈ›12m›16a¤¥©›10m›17a¶›1a¹›18aµÄÄ›1a¹Â¸¹¸
+›720d›1006`ȹƛ16aºÃÆ›16aÄƹʽ¹Ë½Â»â›25az›17aºÃÆÁº¹¹¸›17aÁ
+›771d›14m›1634`}
+›777d›10m›1522`ÈÛ18aµ›18a§›5a¯›18a³›19a¸Ã›1a·ÉÁ¹Â›60aÍ›18aȼ¹
+›777d›721`ÈÛ18aǽ̹À›18aìÀ¹Ç›18aȼµÈ›18aµÆ¹›19aÈÛ18a¶›1a¹›19a½ÁÄ›1aÃÆȹ¸›18a½Â›412aÈ›19a¶
+›791d›1680`~
+›833d›721`u@BGH›14a·ÃÁÁµÂ¸›15aÞºÆÃÁ›14aȼ¹›16a@K:IAB<L›49aÍÀ¹›14aÃÄȽÃÂßâ
+›833d›1472`ÇÈ
+›908d›721`¯¼¹›15a¸¹ºµÉÀÈ›15a½Ç›15ai./&/1-&%%$â
+›1002d›607`i2#!,%l›15m*›14m&!#3.1›15m›4a+›10m›496aÍ›12aµ›12aºµ·ÈÃÆå›11aȼ¹›12a¸¹ºµÉÀÈ›12aºµ·ÈÃÆ›10a½Ç›12aЛ12aÏâ
+›1002d›953`®·µÀ¹›12aȼ¹›12aÇÈÃƹ¸›11a½Áµ»¹›11a¶›15m›627a%
+›1096d›10m›607`i2%'-%.3l›15m*›14m›74a'%1›15m›3a+›10m›22a®Ä›1a¹·½ì¹Ç›15a˼½·›334aÈ›14a½Â›14aȼ¹›14a2!5$1!›13aìÀ¹›15a½Ç›13aÈÃ
+›1096d›14m›841`)-3%›10m›374a¼›14aĽ·ÈÉƹ›14aǹ»Á¹Â
+›1152d›721`¶›1a¹›18aÉǹ¸›18aºÃÆ›17aÄÆÛ1a¸É·½Â»›18aȼ¹›18a½Áµ»¹á›17aȼ¹›18a¸¹ºµÉÀÈ›17a½Ç›17aÏâ›27a¤º›18aȼ½Ç›17aÅɵÀ½ì¹Æ›17a½Ç
+›1209d›1131`ÉÁ›14aƹ·ÃƸ›16aÀ¹Â»È¼›14aºÃÆ›15aȼ¹›15a½ÂÄÉÈ›16aìÀ¹›15a½Ç›14aÉǹ¸â
+›1209d›721`ÂÃÈ›15aÉǹ¸á›15aȼ¹›15aÁµÌ½Á
+›1302d›607`i/43043l›15m*›14m:+%›15a2/›17a#›15m›1a+›10m›103aÈÆÃÀÇ›8a˼¹Æ¹›11aȼ¹›10aÃÉÈÄÉÈ›10aìÀ¹›10a˽ÀÀ›9a¶›1a¹›11aËƽÈȹÂå›15m›11a*›14m:+%›15a2/›17a#›15m›2a+
+›1302d›14m›931`%›10m›61a|Û14m›948a%
+›1359d›10m›781`Í›12a¶›1a¹›13aµ›12aºÉÀÀ›12aÃÆ›12aĵÆȽµÀ›11aÇÄ›1a¹·½ì·µÈ½ÃÂå›13a½º›12aÂÃÈ›12aÇÄ›1a¹·½ì¹¸á›14aȼ¹›13aìÀ¹›12aµÁ¹›13a˽ÀÀ
+›1359d›721`Áµ
+›1415d›721`¶›1a¹›16aȼµÈ›14aú›15aȼ¹›15a½ÂÄÉÈ›15aìÀ¹á›15aµÂ¸›16a½ÈÇ›14a¹ÌȹÂǽÛ15a˽ÀÀ›14a¶›1a¹›16ah2)7â
+›1537d›13m›607`\¬¨›56a]£mwzvq|›17ayr›19a}tq›18a~|q›19ayr›14m›225añ
+›1537d›1325`èéëìôóîé
+›1623d›10m›663`Ðâ›12m›22aºcbi»¶›10m›22a')./3/2)7›23a&1%$
+›1698d›721`¯¼¹›14aÄÆûƵÁ›13a˽ÀÀ›12aƹµ¸›14aȼ¹›14aìÀ¹›13a&1%$h0)#á›13aµÂ¸›14aÄÆÛ1a¸É·¹›14aµ›14aìÀ¹›14a&1%$h2)7
+›1755d›974`È›17aÏâ›27a¯¼¹›18aǽι›18aú›17aȼ¹›18aǽ̹À›17a½Áµ»¹›16a˽ÀÀ›17a¶›1a¹›18aȼ¹›18aǵÁ¹›17aµÇ›17aȼ¹
+›1755d›721`ºÆÃÁ›17aǹ»Á¹Â
+›1811d›721`ǵ›22a¹¸›15aĽ·ÈÉƹâ
+›1811d›761`Ê
+›1905d›663`Ñâ›12m›22aºcbi»¶›10m›477aq
+›1905d›908`')./3/2)7i2#!,%lThY
+›1961d›12m›745`¶›10m›597ajn&1%$o›190a#›22a&1%$h'./
+›1961d›889`i/43043l$)2+^2#1!3#(›166a'1!0(h).
+›2036d›721`­¹µ¸›15aµ›14a2!5$1!›14aºÆÃÁ›15aìÀ¹›15a&1%$h'./á›14aµÂ¸›15aÄÆÛ1a¸É·¹›16aµ›15a¼µÀºðǽι¸›14a½Áµ»¹›15a½Â
+›2093d›721`ȼ¹›15aìÀ¹›15aÇÄ›1a¹·½ì¹¸â
+›2187d›663`Òâ›12m›22aºcbi»¶›10m›477a3(jUYTg›166aUTTd›22a&1%$q
+›2187d›908`')./3/2)7i2)9%lc6)$›166a(%)'(3j
+›2243d›12m›745`¶›10m›597a%%$
+›2243d›985`i2%'-%.3lUi&/1-&
+›2318d›1003`È›19aЛ20aú›19a&1%$h0)#á›18aµÂ¸›20aÇ·µÀ¹›19aȼ¹›20a½Áµ»¹›19aɽºÃÆÁÀÍ›19aÈÛ19aìÈ
+›2318d›721`­¹µ¸Ç›19aǹ»Á¹Â
+›2375d›877`Ì›24aÐÔÏÁÁ›23a˽¸¹›24aµÂ¸›25aÐÏÏÁÁ›23a¼½»¼â›46az›24aºÃÆÁº¹¹¸›24a˽ÀÀ›23a¶›1a¹›24aµÄð
+›2375d›721`½Â›24aµ›23a¶›1aÃ
+›2431d›1581`¹¸›19a¶›121aȽ»›17aȼ¹›18aÃÉÈÄÉÈ
+›2431d›721`Ä›1a¹Â¸¹¸›20aÈÛ17aÄ›1a¹ÆÁ½È›18aȼ¹›18a½Áµ»¹›17aÈÛ18a¶›1a¹›18aÄƹʽ¹Ë›87aÍ›18aÄƽÂ
+›2488d›721`ìÀ¹á›15a&1%$h2)7â
+›1;724;2239;4;21!|
+›1;724;1957;4;21!|
+›1;1990;1300;2;14!|
+›1;879;1300;2;14!|
+
+
+›462d›1898`ÒÒ
+›607d›13m›948`ÇÖÓÏÓÍ›25a»Ë××ÇÍË×
+›607d›449`µ›69aµÖÖÔÖ›25aÇÓÊ›23aÅ
+›713d›10m›449`¯¼½Ç›12a·›485aµÆ½ÃÉÇ›12a½ÂºÃÆÁµÈ½ÃµÀ›54aµÆ½»á›11a¹ÆÆÃÆ›11aµÂ¸›12aºµÈµÀ
+›713d›569`¼µÄȹƛ11a¸¹Ç·Æ½¶›1a¹Ç›13aµÀÀ›10aȼ¹›12aÊ›397aá›10aË
+›770d›449`¹ÆÆÃÆ›12aÁ¹Çǵ»¹Ç›12aȼµÈ›14m›44a_VlhXYpq›10m›11a·µÂ›13a½ÇÇɹâ›18a¨ÃÇÈ›12aÁ¹Çǵ»¹Ç›12aµÈȹÁÄÈ›11aÈÛ12a¶›1a¹›13aǹÀºð
+›770d›14m›844`R
+›826d›10m›681`á›13a¶ÉÈ›14aȼ½Ç›14aǹ·È½Ã›13a»½Ê›832a¼
+›826d›449`¹ÌÄÀµÂµÈÃÆÍ›401a¹Ç›13aºÉÀÀ›13a¸¹Èµ½ÀÇ›13aú›13aȼ¹›14a·Ã¸½È½ÃÂÇ›13aɸ¹Æ›15a˼½·
+›883d›449`ȼ¹›15a¹ÆÆÃÆ›14a·µÂ›15a¶›1a¹›15a½ÇÇɹ¸á›15aµÂ¸›15aÁµ›650aÊ›168aÍ
+›883d›1077`Í›14aȼ¹Æ¹ºÃƹ›14a¼¹ÀÄ›15aȼ¹›15aÉǹƛ15a½Â›15a¸½Ç·Ã›22a¹Æ½Â»›13a˼
+›939d›14m›481`_VlhXYpq›10m›15a½Ç›14aɵ¶À¹›16aÈÛ14aÄÆÛ1a·¹ÇÇ›16a¼½Ç㼹ƛ15ah$5)›14aìÀ¹â
+›939d›14m›449`R
+›1074d›13m›616`m}mv›19a]{{y{|
+›1074d›449`]¬¦›56a^
+›1164d›10m›630`˽»›16a¹ÆÆÃÆÇ›17a½Â¸½·µÈ¹›17aȼµÈ›14m›49a_VlhXYpq›10m›16a½Ç›17aɵ¶À¹›18aÈÛ17aÄÆÛ1a·¹¹¸›19aºÉÆȼ¹Æ
+›1164d›449`¯¼¹›18aºÃÀÀÛ14m›516aR
+›1221d›10m›792`ÃÉÆ›14ah$5)›13aìÀ¹å›14a˼¹Æ¹›14aÄ›1aÃÇǽ¶À¹á›14aÁ¹È¼Ã›1a¸Ç›14aµÆ¹›13aÇÉ»»¹Çȹ¸›14aÈÛ13aµÀð
+›1221d›449`˽ȼ›14aÄÆÛ1a·¹Çǽ»›13aÍ
+›1277d›449`ÀÛ67aÃÉ›13aÈÛ12a·½Æ·ÉÁ›22a¹Â›433a¼›13a¹ÆÆÃÆ›13aÁ¹Çǵ»¹Ç›12a·ÃÁÁ¹Â·¹›13a˽ȼ
+›1277d›484`Ë›12aÍ›246aÊ›43aÈ›12aȼ¹›13aÄÆöÀ¹Áâ›19azÀÀ›12aÇÉ·
+›1318d›15m›932`JM
+›1334d›10m›449`ȼ¹›14aȹÌÈ›13aé&:M:E›23a%KKHKjÝ›146a¼›13aÄƹ·¹¸¹Ç›15aȼ¹›14aȹÌÈÇ›13aÀ½Çȹ¸›13a¶›1a¹ÀÛ170a¼›14aµÂ
+›1334d›988`˼½·›607aËâ›19a¤º›14aÇÉ·
+›1390d›449`¹ÆÆÃÆ›12aÛ1a··ÉÆÇá›14m›45a_VlhXYpq›10m›417aá›12aµÂ¸›12aȼ¹›12aÄÆûƵÁÝÇ›11a¹Ì½È›12aÇȵÈÉÇ
+›1390d›14m›709`R›10m›195a˽ÀÀ›11a¹Ì½È›11a½ÁÁ¹¸½µÈ¹ÀÍ
+›1447d›875`¶›1aÃÀ›14a^2%5%1)38›162aÉÇ›15a½Â¸½·µÈ½Â»›14aµ›15a2%5%1%t%11/1â
+›1447d›449`˽ÀÀ›14aǹț15aȼ¹›16a}|§›15aÇÍÁ›305aÈÛ15aÓá›14aȼ
+›1580d›12m›791`®›18ad­xzzyzy›17ad§§¥§¨
+›1580d›449`d¹°¹°›52abv¦vx~©
+›1670d›10m›449`²¼¹Â›14m›50a_VlhXYpq›10m›190aȹ¸›18a˽ȼ›17a½ÂÄÉÈ›17aȼµÈ›17aƹÇÉÀÈÇ›17a½Â›18a½È›16aÉǽ»›18aÉÄ›18aµÀÀ›16aú
+›1670d›14m›584`R›10m›201a½Ç›17aÄƹǹÂ
+›1727d›802`ȹƵÀ›10a¸µÈµ›11aÇÈÆÉ·ÈÉƹá›11a½È›11a½Ç›10aɵ¶À¹›12aÈÛ11a»Ã›10aÃÂÛ›19azÀÀ›10aȼ¹Ç¹›12a¹ÆÆÃÆÇ
+›1727d›449`ÇÃÁ¹›11aĵÆȽ·ÉÀµÆ›10a½Â
+›1783d›449`·ÃÁÁ¹Â·¹›16a˽ȼ›14aȼ¹›15aȹÌÈ›14aé&:M:E›23a%KKHKj›47a<:I:<BMR›23a>Q<>>=>=jÝâ›18aªÂ¹›16aÄ›1aÃÇð
+›1840d›449`ǽ¶À¹›14aÇÃÀÉȽÛ13a½Ç›14aÈÛ14aƹ·ÃÁĽÀ¹›14m›45a_VlhXYpq›10m›330aµÀɹ›15aºÃÆ›14aȼ¹›14aµÄÄÆÃð
+›1840d›14m›1026`R›10m›184aá›13aÉǽ»›14aµ›14aÀµÆ»¹Æ›13aÊ
+›1896d›1000`Ëâ›19a¤º›13aÍ›652aÃÉÆ›13aǽȹá
+›1896d›449`ÄƽµÈ¹›13aĵƵÁ¹È¹Æ›12aÂÃȹ¸›14a¶›1a¹ÀÛ130aÃÉ›13a츛14aȼµÈ›13aȼ½Ç›12a½Ç›13a¹·¹ÇǵÆÍ›13aµÈ›13aÍ
+›1953d›449`ÄÀ¹µÇ¹›14a½ÂºÃÆÁ›12aȼ¹›14aµÉȼÃÆ›12aú›14m›45a_VlhXYpq›10m›179aÍ›13a¶›1a¹›14a·Ã›160aÍ›13a¹À¹·ÈÆý·
+›1953d›14m›996`R›10m›184aá›12a˼Û13aÁµ›163aȵ·È¹¸›13a¶
+›2009d›449`Áµ½À›15aµÇ›471a=hKF<Ls›13aÞ›14mx}§¢«›10m›109aË›42a¹Æá›15aÇÃÁ¹È½Á¹Ç›15a½È›15a½Ç
+›2009d›608`r3>7mNDh:<h<K:G?B>E›332aßâ›22a£Ã›31a¹Ê
+›2066d›876`Í›17aÉǽ»›18aȼ¹›17ai23!13).'t0!'%›16aµÂ¸›18ai.4-"%1t/&t0!'%2
+›2066d›449`Ä›1aÃÇǽ¶À¹›18aÈÛ17aÄÆÛ1a·¹¹¸›19a¶
+›2122d›449`ÅɵÀ½ì¹ÆÇ›19aÈÛ19aÄÆÛ1a·¹ÇÇ›20aȼ¹›20ah$5)›171aË›666a¼
+›2122d›1068`ìÀ¹›19a½Â›20aÈ›31aÛ18aÃÆ›19aÁÃƹ›19aÇÁµÀÀ¹Æ›18aÄ›1aÃÆȽÃÂÇá›20a˼½·
+›2178d›14m›516`L3›10m›20a¹Ì·¹¹¸›17aȼ¹›15aÄÆûƵÁÝÇ›13aÀ½Á½ÈÇâ
+›2178d›14m›449`$.-
+›2296d›10m›449`?HGM›24a?BE>›23aG:F>›23aMHH›24aEHG@›23acF:Q›23aE>G@MAl›13mò›10md›22aó›15a´›80a¹›15a¼µ¸›16a½ÈÛ›20a¯¼¹›16aÀ½Á½Èá
+›2296d›1472`ÃÉÝÊ
+›2353d›13m›563`ò›10m›288aÍ›22aȼ¹›14m›21az¢~›10m›174aÈ›14m›20a-!,%›17a+%-'3(›10m›3aá›22a½Ç›21aµÀƹµ¸Í›21aµÈ›21aȼ¹
+›2353d›589`á›23aǹț21aµÈ›21aÑÔÔ›20a¶›253a·ÃÂÇȵÂ
+›2409d›698`ÉÁ›14aÄ›1a¹ÆÁ½Èȹ¸›15a¶›67az³ã­¨®â
+›2409d›563`ÁµÌ½Á›311aÍ›15a±
+›2512d›449`LM:<D›24aLBS>l›13mò›10m›22aó›15ah$5)›257aȵ½Â›14m›15a/42(›10m›19aµÂ¸›14m›37a./›10m›19a·ÃÁÁµÂ¸Çå›15a¯›18a³›16aƹð
+›2512d›933`ìÀ¹Ç›15a·µÂ›16a·Ã›14m›290a/
+›2522d›10m›1815`~
+›2569d›1101`ÉÁ›14a›61a¶›1a¹Æ›16aú›14m›15a/42(›10m›3a¹Ç›17aȼµÈ›15a½È›14aÉǹÇá›16a¶ÉÈ›16aȼ¹
+›2569d›563`Ä›1aÃÆÈÇ›15a½Â›16aȼ¹›15aìÀ¹›16aȼ¹›16aÁµÌ½Á›100aÉÁ
+›2625d›563`ÄÆûƵÁ›17a¼µÇ›17aµÂ›18aÛ22a¹ÆµÀÀ›16aÀ½Á½È›16aú›13m›18aò›10má›18aǹț17aÈÛ17aÐÏÏ›17aȼÆÃÉ»¼›18aȼ¹›14m›18az¢~›10m›19a·ÃÂð
+›2625d›919`Ê
+›2682d›646`È›14m›18a23!#*›17a2)9%›10m›195aµÀɹ›19a½Ç›19a¹Ì·¹¹¸¹¸á›21a½ÈÝÇ›18aÁÃÇÈ›18aÄÆöµ¶ÀÍ›19a¸É¹›19aÈÃ
+›2682d›563`Çȵ›227aå›20a½º›18aȼ½Ç›19aÊ
+›2738d›563`ÇÃÁ¹›15m›19a*›14m$5)›16a"83%›15m›3a+›10m›821aÈá›19aǽ·¹›19a¯›18a³
+›2738d›892`ǹÅɹ·¹›20aÆɽ»›19aµÁÿ›18a½Â›19aµ›19aʽÆÈɵÀ›17aºÃÂ
+›2748d›1884`~
+›2795d›595`ÃÉÀ¸›15a¶›1a¹›16aÊ›689aÍ›14m›15a/42(›10m›3a¹Çâ
+›2795d›563`Ë›185a¹ÆÍ›14a¼µÆ¸ðÄƹÇǹ¸›16aÈÛ15a½ÇÇɹ›15aȼµÈ›14aÁµÂ
+›2898d›449`MHH›24aF:GR›23a;E:GD›23aO>KLH›24aI:@>L›290aȽ»›11a½Â›13a¸ÉÄÀ¹Ì›13aÁÛ1a¸¹á›13a˽ȼ›12aȼ¹
+›2898d›1093`ó›12a²¼¹Â›13aÄƽÂ
+›2954d›643`ȹƛ17añÄƽ›526a¹Æ›19aÈ›31aÛ16aÇÉ··¹Çǽʛ231a¹Â
+›2954d›563`Äƽ›175aȽ»ï›17aµ›17a¶ÀµÂ¿›18aǽ¸¹›18a˼¹Â¹Ê›73aË›213a¹›19aÛ1a¸¸›18aÃÆ›17a¹Ê
+›3030d›14m›486`ßâ
+›3046d›11m›519`z©­°¬¥Å›12a©³®Â´›13a©´Á
+›1;449;3001;2;598!|
+›1;784;2680;2;14!|
+›1;1430;2351;2;14!|
+
+
+›462d›10m›607`ÒÓ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›721`ĵ»¹Ç›18aÛ1a··ÉÆá›19aȼ¹›14m›51a_VlhXYpq›10m›17aÄÆûƵÁ›17a¼µÇ›19aÈÛ18a½¸¹Â›214a¼›18aÈƵÂǽð
+›607d›14m›1069`R›10m›612aȽºÍ›17aµÀÀ›18aÇÉ·
+›664d›721`ȽÃÂÇ›14a¶›1a¹ºÃƹ›15aÄƽ›566aÈ›14aÁµÌ½Á›217aÍ›14aȼ¹
+›664d›1048`Ƚ»›14a·ÃÁÁ¹Â·¹Çâ›20a¯¼¹›16a·ÉÆƹ›166aÉÁ›14a½Ç›15aǹț15a¶
+›720d›14m›721`z¢~›10m›16aÁµ·ÆÛ14m›253a!'%2›10m›4aá›14a˼½·›180aµÀɹ›15aú›15aÐÏÏâ›20aªÂ¹›16aÇÃÀÉȽÃÂ
+›720d›14m›975`,!7›17a"+!-*›16a/›10m›203a¼›15a¼µÇ›16aµ›15aÊ
+›777d›811`¼›22a¸Ã›1a¹ÇÂÝÈ›22a¹·¹Çǽȵȹ›22aƹ·ÃÁĽÀ½Â»›21aȼ¹›22aÄÆûƵÁ›21a½Ç›22aÈÛ21aƹÃÆ»µÂ½Î¹
+›777d›721`˼½·
+›833d›744`ÃÉÆ›15a¸Ã›1a·ÉÁ¹Â›445a¹Æ›15a·›251a¼›15aƹÅɽƹ›15aµÂ›15aÛ1a¸¸
+›833d›721`Í›256aÈ›15aÇÛ15aȼµÈ›15aȼ¹Æ¹›15aµÆ¹›15aº¹Ë›71a¼µÄȹÆÇ›15a˼½·
+›889d›721`›61a¶›1a¹Æ›15aú›15aĵ»¹ÇÛ
+›889d›745`ÉÁ
+›985d›607`MHH›24aF:GR›23a@ERIAL›13m›23aî›10m›24as›13m›24aò›10m›319a¼µÆµ·È¹ÆÇá›13m›20aî›10m›303aÈÇ›20aƹºð
+›985d›1137`ó›19a¯¼¹›20aÈÃȵÀ›19a·›242aá›21a½Â›19aµÀÀ›19aȼ¹›20aºÃÂ
+›1042d›721`¹Æ¹Â·¹¸›18a˽ȼ½Â›17aÍ›258aÈ›18a¹Ì·¹¹¸Ç›19aȼ¹›18aÇÈÃƵ»¹›16aµ›20aµ½Àµ¶À¹á›13m›16aò›10mâ›27a¯¼¹
+›1042d›1054`ÃÉÆ›17a¸Ã›1a·ÉÁ¹Â›463aÊ
+›1098d›721`ÀµÈȹƛ19aÅɵ›47aÍ›20a½Ç›20aǹț20a¶›279aÈ›14m›20a,!7›17a'+8/(2›10m›24a½Â›21aȼ¹›14m›21az¢~›10má›22aµÂ¸
+›1098d›946`Ƚț194aÍ›21aȼ¹›21a·ÃÂÇȵÂ
+›1155d›846`ÈÀÍ›19a¼µÇ›20aȼ¹›21aÊ›463a¹ÀÍ›19aȼµÈ›20aÇÉ·›263aÈ
+›1155d›721`·ÉÆƹ›264aµÀɹ›20aÐÏÏÏÏâ›33a¤È›20a½Ç›20aÉÂÀ½¿›241a¼›20aµ›20a¸Ã›1a·ÉÁ¹Â
+›1211d›985`ȹ¸á›15aÉÂÀ¹ÇÇ›16aÃÂÀÍ›15aµ›15aÇÁµÀÀ›15aÄ›1a¹Æ·¹Â›446a¹Æ¹
+›1211d›721`·ÃÉÀ¸›16a¶›1a¹›16aÄƽ›611aȵ»¹›16aú›15aȼÃǹ›15a»ÀÍļǛ16aË
+›1268d›721`µ·ÈɵÀÀÍ›14m›79a$›10m›22a½Â›18aȼ¹›18a¸Ã›1a·ÉÁ¹Â›348aËÂÀõ¸¹¸›17aºÃ›84aÃÉÀ¸
+›1268d›14m›897`42%›10m›356aÈá›19a¶›1a¹·µÉǹ›18aȼ¹›19a¸Ã›264aÈÇ›17aË
+›1324d›1444`Ê›362aȹÆâ
+›1324d›721`ÁÃÇÈ›14aÄÆöµ¶ÀÍ›15a¹Ì·¹¹¸›16aȼ¹›15aÁ¹ÁÃÆÍ›15aµ›20aµ½Àµ¶À¹›14aÛ15aȼ¹›15aÄƽÂ
+›1420d›607`MHH›24aF:GR›23a?HGML›23acF:Q›23a?HGMLl›13mò›10md›22aó›11a´›250aÈ›12aÀõ¸Ç›11aÁÃƹ›11aȼµÂ›13m›12aò›10m›12a¸½ºð
+›1420d›1387`ÃÉÆ›12a¸Ã›1a·ÉÁ¹Â
+›1476d›721`º¹Æ¹Â›95aÈÇâ›13m›26aò›10m›162aÍ›17aȼ¹›14m›18az¢~›10m›169aÈ›14m›17a,!7›17a&.-32›10m›249aÈÀÍ
+›1476d›817`È›17aºÃ›117a½Ç›17aǹț17a¶›240a·ÃÂÇȵ›233aá›16aµÂ¸›18a·ÉÆƹÂ
+›1533d›721`½Ç›15aǹț14aÈÛ15aÐÏÏâ
+›1629d›607`MHH›24aF:GR›23a,.TW›23a?HGML›115aÃÉÝÊ›611aÍǽ·µÀÀÍ›16aÉÂð
+›1629d›1083`ó›17a´›80a¹›17a¼µ¸›18a½ÈÛ›26a¯¼¹›17a§©ÏÒðÄÀÉÇ›18a½Ç›17aļ
+›1685d›721`µ¶À¹›20aÈÛ20a½Áµ»¹›20a»ÀÍļǛ20aºÆÃÁ›20aÁÃƹ›20aȼµÂ›14m›20a,!7›18a+-&.-32›10m›4aàÐÞæ›20aÐÓßá›20aÇÛ20aȼ¹
+›1741d›1227`ÃÉÆ›16a¸Ã›1a·ÉÁ¹Â›335a¼›17aȼµÈ›16aÂÛ17aǹ·ð
+›1741d›721`ñÇÃÀÉȽÃÂï›15a½Ç›16aÈÛ16aÄÆÛ1a·¹ÇÇ›17aÍ›257aÈ›17a½Â›17aǹ·È½ÃÂÇá›16aÇÉ·
+›1798d›721`ȽÛ12a½Â›22aÿ›186aÍ›12a»ÀÍļǛ12aȼµÈ›12aȼ½Ç›12aÀ½Á½È›11a½Ç›12a¹Ì·¹¹¸¹¸â›21a£Ã›31a¹Ê›104a¹Â
+›1798d›849`Ê›45a¹Ç›11aÇÛ12aÁµÂ›770aË›42a¹Æá›11a¹Ê
+›1854d›721`ȼ¹›18a¯›17a³¶›1aÛ1aÿ›18aµÂ¸›15m›18a¤¥¦›55a©ª¦›10m¶›2aÛ1aÿ›19a¸ÃÂÝÈ›17aƹÅɽƹ›18aȼ½Ç›17aÁµÂ›101aÈÇá›17aÇÃ
+›1854d›15m›1181`§¨›10m›654aÍ›17aºÃÂ
+›1864d›827`~
+›1911d›744`ÃÉÝÊ›172a¹ÆÍ›15a·Ã›22aÃÀÉȹ¸›15a¸Ã›1a·ÉÁ¹Â›217aÃÉ›15aÄ›1a¹Æ¼µÄÇ›16aÇÄ›1a¹µ¿›15aÈÃ
+›1911d›721`Í›83a¹›14a»ÃÈ›14aµ›15aÊ›143aÊ›314aÈä›20aǼÃÉÀ¸›15aÍ
+›1967d›776`ÍÄ›1aûƵļ½·›14a¸¹Ç½»Â¹ÆÚ
+›1967d›721`µ›15aÈ
+›2063d›607`MHH›24aF:GR›23aG:F>L›23acG:F>›23aLBS>l›13mò›10md›22aó›10a¯¼¹›11aµÁ¹Ç›10aú›11aµÀÀ›9aȼ¹›11aºÃ›215aÃÉÆ
+›2063d›1820`ÈÇ›10aÉǹ¸›11a½Â›10aÍ
+›2119d›897`È›16a¹Ì·¹¹¸›13m›17aò›10m›35a¼µÆµ·È¹ÆÇ›15a½Â›16aÈÃȵÀå›13m›14aò›10m›159aÍ›15aȼ¹›14m›17az¢~›10m›167aÈ
+›2119d›721`¸Ã›1a·ÉÁ¹Â›221a·›415a½Ç›16aǹț16a¶›235a·ÃÂÇȵÂ
+›2176d›14m›721`,!7›17a-!,%2›10m›290aÈÀÍ›15aǹț15aÈÛ14aÐÏÏÏâ
+›2176d›949`á›14aµÂ¸›15a½Ç›15a·ÉÆƹÂ
+›2272d›607`MHH›24aF:GR›23aOBKMN:E›23a<A:K:<M>KL›21aó›22a|¼µÆµ·È¹ÆÇ›21aȵ¿›440aÈ
+›2272d›1643`¹Â›21aºÆÃÁ›22aµ›22aʽÆÈɵÀ›20aºÃÂ
+›2328d›1720`¼µÆµ·È¹Æ›13aºÆÃÁ›12aÇÃÁ¹
+›2328d›721`ȼµÈ›12aƹÅɽƹ›13aÁÃƹ›12aȼµÂ›13aǽÁÄÀ¹›13a½Áµ»½Â»›11aú›13aµ›12aǽ»À¹›12a·
+›2385d›721`ƹµÀ›15aºÃ›569a¼µÆµ·È¹ÆÝÇ›14aǹÅɹ·¹›17aú›15m›15a*›14m$5)›16a"83%›15m›3a+›10mÇ
+›2385d›871`È›14aƹÇÉÀÈ›15a½Â›15aȼ¹›16a˼ÃÀ¹›15aú›15aȼ¹›16a·
+›2441d›1184`â›19a¤º›14aÍ›254aÈ›13aÁµ¿›73a¹ÆÍ›13a½Â›116a¹›12aÉǹ›14aú
+›2441d›721`¶›1a¹½Â»›13aÇÈÃƹ¸›13a½Â›13aÁ¹ÁÃÆÍ›95aÃÉÆ›13a¸Ã›1a·ÉÁ¹Â›114a¹Ç›13aÊ›111aȹÂǽÊ
+›2498d›721`ʽÆÈɵÀ›15aºÃ›171aÍ›16a¶›1a¹›18a¹·¹ÇǵÆÍ›17aÈÛ16a½Â·Æ¹µÇ¹›14m›17a5&›16a2)9%›10m›319aÈ
+›2498d›931`ÈÇá›16a½È›16aÁµ›680aºÆÃÁ›17a½ÈÇ›16aÄƹǹÂ
+›2554d›742`µÀɹ›15aú›15aÐÏÏÏÏ
+›2554d›721`Ê
+›2677d›12m›607`d¹°¹±›52aavy›10m›18ah$5)›12m›17ae~¢z›16ad§§¥§¨
+›2764d›10m›607`¤º›14m›45a_VlhXYpq›10m›148aȹÆÇ›12aµ›12aÁµÀºÃÆÁ¹¸›11ah$5)›11aìÀ¹›12aȼµÈ›12aÄƹʛ43aÈÇ›12a½È›11aºÆÃÁ›11aÁµ¿½Â»
+›2764d›14m›650`R›10m›195a¹Â·ÃÉ›702a¹Â
+›2820d›654`Í›11aÇÃÆÈ›10aú›10aÊ›93aÈ›10aµÈȹÁÄÈ›10aµÈ›10aÄÆÛ1a·¹Çǽ»›11a½Èá›11aȼ¹›11aÄÆûƵÁ›10aµ¶›1aÃÆÈÇ›10a˽ȼ›10aµÂ›11a¹ÆÆÃÆ
+›2820d›607`µÂ›189aµÀ½µÂ
+›2877d›607`Á¹Çǵ»¹›11aȼµÈ›11aÇȵÆÈÇ›10aé&:M:E›23a>KKHKj›47a":=›23a$5)›23a?BE>Ýå›12aȼ¹›11aƹÁµ½Â¸¹Æ›11aú›11aȼ¹Ç¹
+›2933d›607`Á¹Çǵ»¹Ç›16aµÆ¹›17aÀ½Çȹ¸›16a¶›1a¹ÀÛ395a¹›16aú›16aµ›16aǹƽÃÉÇ›17a¹ÆÆÃÆ›16a½Â›16aȼ¹›17ah$5)
+›2933d›1083`Ëâ›24a¯¼½Ç›17a½Ç›16a½Â¸½·µÈ½Ê
+›2990d›607`ìÀ¹å›16a½º›16aÍ›450aÃÉÆǹÀºá›15aÉǽ»›16a¯›330aµÇ›15a·ÃÆÆÉÄȹ¸
+›2990d›760`ÃÉ›16a¸½¸ÂÝÈ›16a»¹Â¹ÆµÈ¹›15a½È›16aÍ›328a³á›16aÄ›1a¹Æ¼µÄÇ›17a½È›15aË
+›3000d›1515`~
+›3046d›1045`¼½Â»›19aÍ›163a¼½Â¹â›32a²¼½ÀÇÈ›14m›50a_VlhXYpq›10m›19a˽ÀÀ›17aµÈȹÁÄÈ
+›3046d›607`½Â›19aȼ¹›20aÄÆÛ1a·¹ÇÇ›19aú›19aƹµ·›127aÃÉÆ›18aÁµ·›14m›279aR
+›1;1679;2496;2;14!|
+›1;805;2174;2;14!|
+›1;1595;1683;2;14!|
+›1;1687;1474;2;14!|
+›1;1591;1096;2;14!|
+›1;1179;718;2;14!|
+›1;1059;718;2;14!|
+
+
+›462d›12m›587`ÖçÖß›14aÃååâåæ›10m›1094aÒÔ
+›462d›12m›449`Ãôî›45aÄ
+›607d›10m›1877`È›18a½Ç
+›607d›449`ÈÛ18a¹ÌÄÀµ½Â›18a˼µÈÝÇ›17aËÆû›18a˽ȼ›18aȼ¹›18aìÀ¹á›19aȼ¹›18aÈÛ1aÃÀ›17aÈÛ18a¶›1a¹›19aÉǹ¸›19aµÈ›18aȼ½Ç›17aÄ›1aýÂ
+›664d›14m›449`R›57aoi›1ad›10m›50aÍÄ›1a¹›15aȼ¹›15a·ÃÁÁµÂ¸
+›664d›14m›481`_Vl›10m›65aä›20aÈ
+›753d›12m›449`ºcbi»¶›10m›23a$5)380%
+›842d›449`µÂ¸›14aºÃÀÀÛ649aȵ¶À¹›13aµÂµÀÍǽǛ12aú›13aȼ¹›14aÃë¹Â¸½Â»›13aìÀ¹â
+›842d›621`Ë›12aȼ¹›14aÄÆÃÁÄÈÇ›13aÈÛ13a»¹Â¹ÆµÈ¹›13aµ›13aÄƽÂ
+›941d›449`:EE›24aVVWL›22aó›20az›21ah$5)›882a¼µÆµ·È¹ÆÇ
+›941d›899`ìÀ¹›21a½Ç›20aÇÉÄÄ›1aÃǹ¸›21aÈÛ20aì½Ǽ›21a˽ȼ›20aµÈ›20aÀ¹µÇÈ›19aÓ›21a·
+›998d›610`ʽ»›14aȼ¹›14aÊ›211aÃÉÆ›14aìÀ¹›14aµÄÄ›1a¹µÆ¹¸›15aÈÛ14a·ÃÂǽÇÈ›13aú›14aÂÃȼ½Â»›14a¶ÉÈ›14aȼ½Ç
+›998d›563`¼µ›196aµÀɹ›15aÑÑÒå›13aÍ
+›1054d›582`¼µÆµ·È¹ÆÛ
+›1054d›563`·
+›1146d›449`;RM>›13m›24aí›10m›24aBL›23aGHM›24a;HI›22aó›14m›43a_VlhXYpq›10m›10a¹ÌÄ›1a¹·È¹¸›12aÈÛ11a츛12aµ›14m›30a./›10m›14a·ÃÁÁµÂ¸›12aµÈ›10aȼ½Ç
+›1146d›14m›951`R›552a"
+›1203d›10m›649`È›15a½Â›15aȼ¹›16ah$5)›289aµÇ›15aµÀÀ›14aƹµ¸Í›15aÈÛ15aÇȵÆÈ›14aÄÆÛ1a·¹Çǽ»›16aµ›15a¹Ë
+›1203d›563`Ä›1aý›274aìÀ¹á›15aǽ·¹›16a½È›14aË
+›1259d›563`ĵ»¹â›13m›20aí›10m›307aÍȹ›15a›61a¶›1a¹Æ›15a˽ȼ½Â›15aȼ¹›15aìÀ¹â
+›1259d›742`½Â¸½·µÈ¹Ç›15aȼ¹›15a¶›100aÉÁ
+›1351d›449`;RM>›13m›24aí›10m›24aBL›23aGHM›24aIHLM›22aó›14m›44a_VlhXYpq›10m›12a¹ÌÄ›1a¹·È¹¸›15aÈÛ12a츛14aȼ¹›13aÇȵÆÈ›12aú›13aȼ¹›13aÄ›1aÃÇÈð
+›1351d›14m›976`R
+›1407d›10m›623`¶À¹›15aµÈ›14aȼ¹›15a½Â¸½·µÈ¹¸›15aÀÛ1a·µÈ½Ã›14a½Â›15aȼ¹›16aìÀ¹â
+›1407d›563`µÁ
+›1499d›449`=>GHFBG:MHK›23aBL›13m›23aé›10m›23aó›18a¯›18a³›19aƹě1aÃÆÈÇ›19a½Â›19aȼ¹›19ah$5)›18aìÀ¹›20aȼ¹›19aµ·ÈɵÀ›18aǽι›19aú›19aȼ¹
+›1509d›943`~
+›1556d›610`±¤›15aɽÈÇÝ›15aÉǹ¸›17aȼ¹Æ¹½Âå›15a½Â›16aºµ·Èá›15aȼ¹Í›16aµÆ¹›15aµÀË›21aÍÇ›14aULI›15a½Â›16a¯›18a³›15aÃÉÈÄÉÈá
+›1556d›563`é}›867aµ
+›1566d›1722`~
+›1612d›835`ÃÉÀ¸›17a¶›1a¹›19aº¹µÇ½¶À¹›17aºÃÆ›18aÃȼ¹Æ›17aÄÆûƵÁÇ›17aȼµÈ›17a»¹Â¹ÆµÈ¹›17ah$5)
+›1612d›563`µÀȼÃÉ»¼›17a½È›17aË
+›1669d›1026`È›16aɽÈâ›25a¯›567aÍ›17aÁ¹µÂÇ
+›1669d›563`ìÀ¹Ç›17aÈÛ16aǹÀ¹·È›17aµ›17a¸½ë¹Æ¹Â›203a³›17aƹě1aÃÆÈÇ›17aȼ¹›17aµ·ÈɵÀ›16aɽț17a¶
+›1679d›1204`~
+›1725d›563`ú›14aµ›15aĵ½Æ›13aú›15a½Â›232a¼á›14aÈƹµÈ¹¸›14aµÇ›15aµ›14aƵȽõÀ›13a›61a¶›1a¹Æá›14a˽ÀÀ›14a·Ã›22a¹ÆÈ
+›1725d›833`ȹ»¹ÆÇá›13a˼½·›493aÉÁ›243aÊ
+›1766d›15m›1376`ÌN
+›1782d›10m›610`±¤›18aɽÈÇÝ›18aÈÛ17a¸¹·½Á½·ÆÃÂÇ›18aÞÏ›12aЛ13mõ›10mÁ›18aæ›19aÐÏ›201aÉÇ›18aȼ¹›19aÊ›155a¹Â
+›1782d›563`é}›15m›547a%›10m›251aÁßâ›29a¯¼›163aµÀɹ›18a»½Ê
+›1822d›15m›1462`HM
+›1838d›10m›983`Í›14a¯›18a³›14a½Ç›14aÉÇɵÀÀÍ›13aÖÑÑÖ›15m›7a%›10m›8aÑ›49aæ›13aÓÖÒÕÑ×ÕÖÑá›12a¶›1a¹·µÉǹ
+›1838d›563`ÈÛ14aȼ¹›14a¸¹ÂÃÁ½ÂµÈÃÆ›13a¶
+›1848d›1046`~
+›1879d›15m›775`HM
+›1895d›10m›563`ȼ¹Æ¹›14aµÆ¹›13aÑ›269aÈÇ›12a½Â›14aµ›13aÄ›1aý›508aÈÇ›13a½Â›14aÐÏÏ
+›1895d›825`Ç·µÀ¹¸›14aÄ›1aý›221aÈá›13aµÂ¸›13aȼ¹Æ¹›14aµÆ¹›13aÖÑÑÖ›12aÄ›1aýÂ
+›1951d›563`½Â·›212aÉÁ¹ÆµÈÃÆ›13a½Ç›14aȼ¹Â›15aÑÔÓÏÏÏÏÏ›15m›10a#›10m›13aÑÔÓ<F›12aæ›13aÐÏÏ›47aâ›19a¯¼½Ç›14a¹ÆÆÃÆ
+›1951d›620`¼¹Çâ›20a¯¼¹›15a›831aBG
+›2007d›1596`¹â
+›2007d›563`Á¹Çǵ»¹›15a˽ÀÀ›14a¶›1a¹›16a½ÇÇɹ¸›15a½º›15aȼ¹›15a¸¹ÂÃÁ½ÂµÈÃÆ›14a½Ç›15a¹»µÈ½Ê
+›2099d›449`?BKLM›24a;RM>›23aBLGbM›23aLM:KM›23aH?›24aIK>:F;E>›22aó›22a¯¼¹›23ah$5)›23aìÀ¹›23a½Ç›22a¹ÌÄ›1a¹·È¹¸›24aÈÃ
+›2156d›563`ÇȵÆÈ›14a˽ȼ›15aȼ¹›14m›55a%›10m›891a¶À¹â
+›2156d›14m›854`/1›10m›37a·ÃÁÁµÂ¸á›15a½Â¸½·µÈ½Â»›14aȼ¹›16aÇȵÆÈ›13aú›15aȼ¹›16aÄƹµÁ
+›2248d›449`)$›24a;RM>›23aBL›13m›24aì›10m›351aÍȹ›16aú›16aȼ¹›16ah$5)›16aìÀ¹›16a½Â¸½·µÈ¹Ç›16a˼½·›63a¹ÆǽÃÂ
+›2248d›760`ó›15a¯¼¹›17aǹ·Ã¸›16a¶›676a¼›16aÊ
+›2304d›563`ú›15a}›834a¹ÆǽÛ14aÑâ
+›2304d›649`±¤›15a½Ç›15a½Â›15aÉǹå›15aȼ½Ç›14aÄÆûƵÁ›15aÇÉÄÄ›1aÃÆÈÇ›15aÃÂÀÍ›15aÊ
+›2396d›449`F:@GB?B<:MBHG›23aBL›13m›23aí›10m›23aó›15a¯¼¹›16ah$5)›388a¹Æ›15auF:@GB?B<:MBHG
+›2396d›1184`ìÀ¹›16aƹě1aÃÆÈÇ›16a˼µÈ¹Ê
+›2453d›623`Í›15a¼µ›22a¹›14a¶›1a¹¹Â›17aÇÄ›1a¹·½ì¹¸›16aÈÛ15a¯›216a¹Â›15aÊ›284a¹Û
+›2453d›563`Áµ›85aÊ›430a³å›15aȼ¹›15a»½Ê›80aµÀɹ›15a½Ç›15a¹»µÈ½Ê
+›2463d›1138`~
+›2544d›449`GH›24aVVWL›226aȽù¸›12aµ¶›1aÛ22a¹›11aÞǹ¹›12aé:EE›23aVVWL›276a¶À¹›11a½Ç›11aºÃÀÀÛ31a¹¸
+›2544d›639`ó›12azÇ›12aÁ¹Â›206aÊ›322aÝßá›11aȼ¹›13aÄ›1aÃÇȵÁ›195aË
+›2601d›563`¶›576aÍȹǛ12a¼µ›191aµÀɹ›13aÑÑÒå›11a¶ÉÈ›13aȼ½Ç›11ah$5)
+›2601d›587`Í›12aµ›12aǹÅɹ·¹›13aú›12aµÈ›12aÀ¹µÇÈ›11aºÃÉÆ›12a¶›138aʽ»›11aȼ¹›12aÊ
+›2657d›563`ìÀ¹›15a¸½¸ÂÝÈÛ
+›2749d›449`GNF>K:MHK›23aBL›13m›24aî›10m›23aó›14a®¹¹›16aé=>GHFBG:MHK›22aBL›13m›24aé›10mÝ›14aµ¶›1aÛ22a¹â
+›2749d›1444`Ê
+›2841d›449`HGER›13m›24aî›10m›24a;RM>L›23aEHG@›22aó›12a¯¼¹›13ah$5)›12aìÀ¹›12aË›457aÊ›98aȵ½Â¹¸
+›2841d›1240`µÇÂÝÈ›12aÀû›11a¹ÂÃÉ»¼›13aÈÛ12a¼µ›22a¹›12a·ÃÂ
+›2898d›563`µ›15aÊ›209a¶À¹›15aµÂ¸›15aÄ›1aÃÇȵÁ›315aÍ›15aÉǹºÉÀ›16a½ÂºÃÆÁµÈ½ÃÂÛ
+›2898d›622`µÀ½¸›15aÄƹµÁ›305a¶À¹á›14aÀ¹È›15aµÀù›14aµÂ
+›2990d›449`I:@>›24a>G=>=›23aNG>QI><M>=ER›21aó›14az›15aĵ»¹›14a¶›1a¹½Â»›15aÄÆÛ1a·¹Çǹ¸›16aì½Ǽ¹¸›15a˽ȼÃÉÈ›14aµÂ
+›3046d›563`¹ÌÄÀ½·½È›14m›33a./›10m›19a·ÃÁÁµÂ¸á›14aµÂ¸›16a½Ç›14a·ÃÆÆÉÄÈâ
+›3046d›14m›723`%
+
+
+›462d›10m›607`ÒÕ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›607`I:@>›23aEBGD›13m›24aï›10m›24a:?M>K›23a;RM>›13m›23að›10m›513aµÇ›13a½Â¸½·µÈ¹¸›15aµÇ›14a¶›1a¹½Â»
+›607d›1200`ó›14a¯¼¹›15aÇȵÆÈ›13aú›15aµ›14aĵ»¹›15aË
+›664d›721`ÇÛ14a·ÀÃǹ›14aµºÈ¹Æ›14aȼ¹›15aÇȵÆÈ›14aú›14aȼ¹›15aÄƹʽÃÉÇ›14aù›15aȼµÈ›14aȼ¹Æ¹›15aË›267aÈ
+›664d›1816`¹Æ¹›14a½ÂÇÉî·½¹Â
+›720d›721`¶›224aȵ½Â›19aȼ¹›19a¹·¹ÇǵÆÍ›20a¶›607aË›17aȼ¹
+›720d›745`ÍȹǛ19aÈÛ18a·Ã›409aÍȹǛ19aȼµÈ›18aµÆ¹›19aƹÅɽƹ¸›19aÈÛ19aºÃÀÀÃ
+›777d›14m›740`./›10m›18a·Ã›1a¸¹â
+›777d›14m›721`"
+›871d›10m›607`IHLM›23aIHBGM>K›13m›23að›10m›26a:M›24a;RM>›13m›23aí›10m›497a¶À¹›10aȼ¹›11aµ¸¸Æ¹ÇÇ›11aú›10aȼ¹
+›871d›1217`ó›10a¥ÉÇÈ›11aµºÈ¹Æ›11aȼ¹›11aÄ›1aÃÇȵÁ
+›928d›721`Ä›1aÃÇȵÁ›900a¹Â›16ah$5)›16aìÀ¹á›17aȼ½Ç
+›928d›866`¶À¹›16a½ÈǹÀº›15a½Ç›16aÇÉÄÄ›1aÃǹ¸›18aÈÛ16a¶›1a¹›18aÇÈÃƹ¸ä›22a½Â›16aȼ¹›17a»½Ê
+›984d›807`ȹ¸›14m›15a.432)$%›10m›19aȼ¹›15aìÀ¹Û
+›984d›721`Ä›1aýÂ
+›1079d›607`LB@G:MNK>›23aBG›23a;RM>›13m›24aî›10m›24aLAHNE=›23a;>›24aVVW›22aó›14a¯¼¹›14m›15a6(.+%›17a:+%›10m›17aÞµºÈ¹Æ›14aȼ¹›15a¹Â¸›16aú
+›1136d›945`¶À¹ß›14a½Ç›16aÇÉÄÄ›1aÃǹ¸›17aÈÛ15a¶›1a¹›16aìÀÀ¹¸›16a˽ȼ›15aȼ¹›16aÑÑÒ›15a¶›177aȽù¸
+›1136d›721`ȼ¹›16aÄ›1aÃÇȵÁ›854aÍȹǛ16aÁ¹Â
+›1192d›721`µ¶›1aÛ22a¹å›17aȼ½Ç›16aìÀ¹›17aÇȵÆȹ¸›17aÃë›16a·ÃÆƹ·ÈÀÍ›504aÈÛ16aÇÃÁ¹ð
+›1192d›792`Ê›603aá›17a¶ÉÈ›17aȼ¹Â›17a¸¹»¹Â¹ÆµÈ¹¸›18a½Â
+›1249d›721`ȼ½Â»›15a¹ÀǹÛ
+›1344d›607`MA>›24a?BE>›23a>G=>=›23aIK>F:MNK>ER›21aó›11a²¼½ÀÇÈ›9aÄÆÛ1a·¹Çǽ»›11aµ›11aĵ»¹á›14m›43a_VlhXYpq›10m›10a¸¹ð
+›1344d›14m›1814`R
+›1400d›10m›721`ȹ·È¹¸›15aȼ¹›15a¹Â¸›16aú›15aȼ¹›15ah$5)›15aìÀ¹â
+›1522d›12m›823`©z§¤v¢›17ad§§¥§¨
+›1522d›607`d¹°¹²›52ah¤
+›1608d›10m›1253`ÈÛ10aȼ¹›12a·µÈ¹»ÃÆÍ›10aú›11añȼ½Ç›11a·µÂÝÈ›11a¼µÄÄ›1a¹Âïâ›19a¯¼¹
+›1608d›607`¯¼¹Ç¹›12aµÆ¹›11aȼÃǹ›11a¹ÆÆÃÆÇ›11aȼµÈ›11aºµÀÀ›10a½Â
+›1664d›607`¹ÆÆÃÆ›10aÁ¹Çǵ»¹›11a·ÃÁÁ¹Â·¹Ç›12a˽ȼ›10aé&:M:E›23a%KKHKj›47a)GM>KG:E›22a>KKHK›113a¼›11a¹Æð
+›1664d›1899`Ýâ›18a®É·
+›1721d›755`¹µÀ›9aÇÃÁ¹›10aÇÃÆÈ›10aú›10a·Ã›1a¸½Â»›10a¹ÆÆÃÆä›17a½º›10aÍ›100a¹Æ›10aǹ¹›11aù›10aú›10aȼ¹Ç¹›10a¹ÆÆÃÆÇá›11aÄÀ¹µÇ¹
+›1721d›607`ÆÃÆÇ›10aƹʛ634aÃÉ›10a¹Ê
+›1777d›674`ȵ·È›17aȼ¹›18aµÉȼÃÆá›18a{ƽµÂ›14m›18aw}¦¤¥›206a¬›10m›98aʽ¸½Â»›17aµÇ›17aÁ›43a¼›19a½ÂºÃÆÁµð
+›1777d›607`·Ã›14m›601a«¨§›19ay¢¥¥›10m›25aá›20aÄÆÛ234aÉ·
+›1834d›607`ȽÛ12aµÇ›13a½Ç›12a¹·¹ÇǵÆÍ›13aºÃÆ›12a¼½Á›13aÈÛ12aƹÄÆÛ1a¸É·¹›13aȼ¹›13aºµÉÀÈå›13aȼ½Ç›12aǼÃÉÀ¸›13a½Â·Àɸ¹›13a¹½È¼¹Æ
+›1890d›607`ȼ¹›20a¯›18a³›19aÇÃÉÆ·¹á›21aÈû¹È¼¹Æ›19a˽ȼ›19aµÂ›360aÍÀ¹›19aìÀ¹Çá›20aÃÆ›20aȼ¹›19aµ·ÈɵÀ
+›1890d›1291`Í›19aÂÃÂðÇȵ¸µÆ¸›20aÇÈ
+›1900d›715`~
+›1947d›607`h$5)›16aìÀ¹›17a¶›1a¹½Â»›18aÄÆÛ1a·¹Çǹ¸›17aó›17aȼ¹›16aÀµÈȹƛ16a·µÂ›17a¶›1a¹›18a¹Â·Ã›1a¸¹¸›18a˽ȼ›14m›75adgbh›1acd›10m›75aè
+›1947d›14m›1823`__›10m›148açÐÓ
+›2003d›964`Í›15a¹ðÁµ½Àâ
+›2003d›607`ºÃÆ›15aÈƵÂÇÁ½ÇǽÛ13a¶
+›2060d›1117`È›15aÈÛ15ar3>7mNDh:<h<K:G?B›190as›14m›22a{x}§¢«|›10mâ
+›2060d›678`­¹Ä›1aÃÆÈÇ›14aǼÃÉÀ¸›15a¶›1a¹›16aǹ›495a>E=hKF<L
+›2167d›607`cGH›24a=OB›16aE>G@MAd›22aó›17a«ÆûƵÁ›15a·ÃÉÀ¸ÂÝÈ›17a¸¹È¹ÆÁ½Â¹›17aȼ¹›17aµ·ÈɵÀ›16aÀ¹Â»È¼›17aú›16aȼ¹
+›2224d›721`h$5)›14aìÀ¹â
+›2319d›607`cPHK=›23a:M›24aH==›23a;RM>›13m›24aî›10md›23aó›19a²›301aÈÛ18aȼ¹›21a¸Ã›266aÈ›19aéìÀ¹Ý
+›2319d›1219`ÃƸǛ20aËƽÈȹ›19a½Â›189aËÂÀõ¸¹¸›19aºÃÂ
+›2375d›758`ÉÇÈ›14aÇȵÆÈ›14aµÈ›15aµÂ›15a¹Ê›84aÍȹ›15a½Â›15aȼ¹›15aìÀ¹â
+›2375d›721`Á›345a¹Â›16a¶
+›2470d›607`cEHG@PHK=›23a:M›23aH==›24a;RM>›13m›23aî›10md›223aÃƸǛ23aËƽÈȹ›23a½Â›196aËÂÀõ¸¹¸
+›2470d›1206`ó›23a§Ã»˛311aÈÛ22aȼ¹›24a¸Ã
+›2527d›721`ºÃ›167aÉÇÈ›14aÇȵÆÈ›14aµÈ›15aµÂ›15a¹Ê›84aÍȹ›15a½Â›15aȼ¹›15aìÀ¹â
+›2527d›782`È›14aéìÀ¹Ý›15aÁ›345a¹Â›16a¶
+›2622d›607`c>FIMR›23a?HGMd›195aȹƵÀ›15aÄÆÛ1a·¹¸Éƹ›16a¼µÇ›15a¶›1a¹¹Â›17aµÇ¿›327aÉǹ¸
+›2622d›916`ó›15az›16a½Â›595a¹¸›15aÈÛ15aÀõ¸›15aµÂ›16aÉÂ
+›2678d›721`ºÃ›245aȹÆâ
+›2678d›782`È›14aÈÛ15aȼ¹›15aÄƽÂ
+›2773d›607`cqO>›23a=>EM:›24aQd›220aµÆ¸›14a¸½ÇÄÀµ·¹Á¹Â›611aË
+›2773d›940`ó›15az›16aºÃÆË›318aÈ›15a½Â›15aµÂ›16aÃÉÈÄÉÈ›15aÀ½Â¹›15a¼µÇ›15aÇÃÁ¹¼Ã
+›2829d›1226`¿Ë›677aÈÛ12aÂÃÂð
+›2829d›721`ÁµÂµ»¹¸›12aÈÛ13a¶›1a¹·ÃÁ¹›13aµ›12a¶µ·›55aµÆ¸Ç›12aùá›13a¸¹ÇĽȹ›13aÇÃÆȽ»›12aȼ¹›13aÀ½ÇÈ›11a½Â
+›2886d›743`Ê›341aÈÇÛ
+›2886d›721`Û22a¹ÆÀµÄĽ»›14aǹ»Á¹Â
+›2981d›607`c2MKBG@›23aIHHE›23aHO>K?EHPd›22aó›21a¨Ãƹ›21auLI><B:E›21aÇÈƽ»Ǜ21aµÆ¹›21a¸¹ì¹¸›23aµÈ›22aÄÆÃð
+›3037d›1041`Û13aȼµÂ›15aȼ¹›16aÄÆûƵÁ›14a¼µÇ›15aÆÛ1aÃÁ›14aºÃÆâ
+›3037d›721`»ÆµÁ›14a½Â½È½µÀ½ÎµÈ½
+›1;778;2165;2;15!|
+
+
+›462d›12m›587`ÖçÖß›14aÃååâåæ›10m›1094aÒÖ
+›462d›12m›449`Ãôî›45aÄ
+›607d›798`v©v¢›18ad§§¥§¨
+›607d›449`d¹°¹³›52al©}z§›18ae
+›695d›10m›449`|¹Æȵ½Â›15aÃȼ¹Æ›15a·Ã¸½È½ÃÂÇ›15a·µÂ›16a·µÉǹ›14m›48a_VlhXYpq›10m›14aÈÛ15aµ¶µÂ¸Ã›16a¼ÃÄ›1a¹å›16aȼ¹Ç¹›16a¾ÉÇÈ
+›695d›14m›1157`R
+›752d›10m›449`·ÃÁÁ¹Â·¹›16a˽ȼ›15aé&:M:E›22a%KKHKjÝ
+›863d›449`":=›24ai0+›17a&/.3›16a$)1%#3/18›23aJN:EB?B>Kk›22a=H>LGbM›23a>G=›24aPBMA›23a:›24apob›22aó›25a¯¼¹
+›920d›563`Ê›161aʽ¸¹¸›17aºÃÆ›17aȼ¹›18ai0+t&/.3t$)1%#3/18›15aÅɵÀ½ì¹Æá›17aµºÈ¹Æ›17aµÄÄÀͽ»
+›920d›584`µÀɹ›18aÄÆÃ
+›976d›1117`ÉÇÈ›19a¹Â¸›19a˽ȼ›18aµ›19aéo›50a¼µÆµ·È¹Æå›19a·›63a¿›19a˼µÈ
+›976d›563`Àû½·µÀ›17aµÁ¹›19aÈƵÂÇÀµÈ½ÃÂá›17aÁ›354aÝ›18a·›215a¼¹·
+›1033d›584`µÀɹ›16a½Ç›14a¶›1a¹½Â»›16aÉǹ¸›15a˽ȼ›15aȼ½Ç›15aÅɵÀ½ì¹Æâ
+›1033d›563`Ê
+›1131d›449`":=›24ai07,›17a&/.3›16a$)1%#3/18›23aJN:EB?B>Kk›22a=H>LGbM›23a>G=›24aPBMA›23a:›24apob›101aó
+›1187d›563`¯¼¹›16aÊ›160aʽ¸¹¸›16aºÃÆ›15aȼ¹›16ai07,t&/.3t$)1%#3/18›14aÅɵÀ½ì¹Æá›15aµºÈ¹Æ›16aµÄð
+›1187d›678`µÀɹ›17aÄÆÃ
+›1244d›563`ÄÀͽ»›16aÀû½·µÀ›15aµÁ¹›17aÈƵÂÇÀµÈ½Ã›89aÉÇÈ›16a¹Â¸›17a˽ȼ›16aµ›17aéo›47a¼µÆµ·È¹Æå›17a·›63a¿
+›1244d›1159`Âá›15aÁ›345aÝ›15a·›213a¼¹·
+›1300d›698`µÀɹ›15a½Ç›15a¶›1a¹½Â»›15aÉǹ¸›16a˽ȼ›15aȼ½Ç›14aÅɵÀ½ì¹Æâ
+›1300d›563`˼µÈ›15aÊ
+›1399d›449`":=›24ai›15m*›14m04!+):%1›15m›4a+›10m›24aO:EN>›22aó›16a¯¼¹›17aÊ›160aʽ¸¹¸›17a˽ȼ›16aȼ¹›17a½Â¸½·µÈ¹¸›16aÅɵÀ½ì¹Æ
+›1399d›1113`µÀɹ›17aÄÆÃ
+›1455d›563`¸Ã›1a¹Ç›16aÂÃÈ›14aºÃÆÁ›15aµ›15aÊ›123aȹ»¹Æâ
+›1455d›913`µÀ½¸›15a½Â
+›1553d›449`":=›24aID›23a?BE>qqqFHK>›23a;BML›23aMA:G›23aK>JNBK>=›22aó›19a¯¼¹›20aĵ·›22a¹¸›20aĽ̹À›20aìÀ¹›19a·ÉÆð
+›1553d›1585`¿
+›1610d›625`ÈÀÍ›13a¶›1a¹½Â»›14aƹµ¸›14a޵Ǜ13aǼÛ94aÍ›14aȼ¹›13aÄƹ·¹¸½Â»›15aé&HGM›15m›22a*›14m&.-3-!,%›15m›3a+›10mÝß›13aÄÆÃð
+›1610d›563`ƹ›425aË›13a¶
+›1666d›563`ʽ¸¹Ç›12aÁÃƹ›12a¶½ÈÇ›11aºÃÆ›12aµ›12a·›242a¿›490a¼µÆµ·È¹ÆÝÇ
+›1666d›992`¼µÆµ·È¹Æ›11aĵ·›22a¹È›12aȼµÂ›12a½Â¸½·µÈ¹¸›12a½Â›12aȼ¹›12a·
+›1723d›563`ÄƹµÁ›591aÈå›13aÉǹ›14m›91aoi›1ad›10m›14aÈÛ13aµÂµÀÍι›14aȼ¹›14aĽ̹À
+›1723d›686`¶À¹â›19a­¹ÄÀµ·¹›14aȼ¹›14aÃë¹Â¸½Â»›14aºÃ›14m›121aZWl
+›1779d›10m›563`ìÀ¹â
+›1877d›449`":=›24aID›23a?BE>`›48a":=›23aI:<D>M›23aE>G@MA›257a¿›332aȵ½ÂÇ›21aµ
+›1877d›1212`ó›22a¯¼¹›22aĵ·›22a¹¸›23aĽ̹À›22aìÀ¹›23a·ÃÂ
+›1934d›563`·›246a¿›959aÈâ
+›1934d›582`¼µÆµ·È¹Æ›15aĵ·›22a¹È›14aú›15aµÂ›15a½ÀÀ¹»µÀ›13aÀ¹Â»È¼â›20a­¹ÄÀµ·¹›15aȼ¹›15aÃë¹Â¸½Â»›15aºÃÂ
+›2032d›449`":=›24aID›23a?BE>g›24aIK>›23a<HFF:G=›23aFBLLBG@›22aó›30a¯¼¹›31aĵ·›22a¹¸›31aĽ̹À›30aìÀ¹›31a¸Ã›1a¹ÇÂÝÈ
+›2032d›1488`¿
+›2088d›563`·ÃÁÁ¹Â·¹›22a˽ȼ›21aȼ¹›21aƹÅɽǽȹ›14m›61a%›10m›25a·ÃÁÁµÂ¸â›39a­¹ÄÀµ·¹›21aȼ¹›21aÃë¹Â¸½Â»
+›2088d›14m›1173`/1
+›2145d›10m›624`Èâ
+›2145d›563`ºÃÂ
+›2243d›449`":=›24aID›23a?BE>k›24aNG>QI><M>=›22a;RM>j›13m›47aï›10m›23aó›9a²¼½ÀÇÈ›9aƹµ¸½Â»›10aµ›10aĵ·›22a¹¸›10aĽ̹À›10aìÀ¹á
+›2243d›1690`¿
+›2300d›563`ȼ¹›21a¶›104aµÀɹ›13m›21aï›10m›21aË›308aµÇ›21a½Â›20aµÀ½¸›20a½Â›21aȼ¹›22a·ÉÆƹ›105aȹÌÈâ
+›2300d›671`Íȹ›22aÊ›175aµÇ›21aÁ¹Èä›31aȼ½Ç›21aË›98aÊ›360aÈ›21a·ÃÂ
+›2356d›1068`Èâ
+›2356d›563`­¹ÄÀµ·¹›15aȼ¹›15aÃë¹Â¸½Â»›15aºÃÂ
+›2454d›449`":=›24aID›23a?BE>g›24aPKHG@›23aO>KLBHG›237a¿›432aË›94a¹Æð
+›2454d›1093`ó›11a¯¼¹›13aĵ·›22a¹¸›12aĽ̹À›12aìÀ¹›13a½Ç›11aú›12aµ›12aÇúț31aµÆ¹›11aÊ
+›2511d›563`ǽÛ11a½Â·ÃÁĵȽ¶À¹›11a˽ȼ›12aȼ¹›14m›43a_VlhXYpq›10m›11aÄÆûƵÁâ›18a­¹ÄÀµ·¹›11aȼ¹›12aÃë¹Â¸½Â»
+›2511d›14m›1095`R
+›2567d›10m›624`Èâ
+›2567d›563`ºÃÂ
+›2665d›449`#HNE=GbM›23a<K>:M>›15m›23a*›14m:+%-!,%›15m›2a+›10m›23aó›14m›51a_VlhXYpq›10m›51aµÇ›20aɵ¶À¹›20aÈÛ20a·Æ¹µÈ¹›20aȼ¹›20aìÀ¹
+›2665d›14m›1123`R›10m›203aË
+›2722d›563`½Â¸½·µÈ¹¸ä›33a·›63a¿›22aȼµÈ›22aÍ›115aÊ›577aÈ›22a¸¹ºµÉÀÈ
+›2722d›810`¼¹·›174aÃÉ›21a¼µ›22a¹›22aËƽȹ›21aµ··¹ÇÇ›22aÈÛ21aȼ¹›22a·ÉÆƹÂ
+›2778d›563`¸½Æ¹·ÈÃÆÍ›427aÍ›15aȼ¹›15ai/43043›14aÅɵÀ½ì¹Æâ
+›2778d›738`á›14aÃÆ›15aȼµÈ›15a¸¹Ç½»ÂµÈ¹¸›15a¶
+›2877d›449`#HNE=GbM›23aHI>G›15m›24a*›14m:+%-!,%›15m›2a+›10mh›47a2M:MNLl›15m*›14m›182a.1›15m›6a+›10m›22aó›24a²¼¹Â›14m›58a_VlhXYpq
+›2877d›1245`IBF›14a>11›299aR
+›2933d›10m›563`µÈȹÁÄȹ¸›14aÈÛ13aÃÄ›1a¹Â›15aȼ¹›14a½Â¸½·µÈ¹¸›14aìÀ¹›14aÞºÃÆ›13aƹµ¸½Â»ßá›13a½È›13aºµ½À¹¸ä›19aȼ¹›14a±¨®ð
+›2990d›563`ÇÈ›223aµÇ›19aƹě1aÃÆȹ¸›20a¶›529a¹Æ¼µÄÇ›19aȼ¹›20aìÀ¹ÝÇ
+›2990d›598`ÍÀ¹›19a¹ÆÆÃÆ›19aË›271aÍ›19aȼ¹›20aÆÉÂðȽÁ¹›20aÇÍÇȹÁâ›33a«
+›3046d›563`ÃÆ»µÂ½ÎµÈ½Ã›14a½Ç›16a½Â·ÃÁĵȽ¶À¹›16a˽ȼ›15aȼ¹›17aÈ›300aÍ›16aȼ¹›16aÄÆûƵÁá
+›3046d›1344`ÍÄ›1a¹›16a¹ÌÄ›1a¹·È¹¸›18a¶
+›1;1348;2875;2;14!|
+›1;757;1129;2;15!|
+›1;644;1129;2;15!|
+›1;733;861;2;15!|
+›1;620;861;2;15!|
+
+
+›462d›607`Ò×›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›721`˼½·›714aµÆ½µ¶À¹ðÀ¹Â»È¼á›14a˽ȼ›14a·µÆƽµ»¹ð
+›607d›811`¼›14a»¹Â¹ÆµÀÀÍ›14a¹ÌÄ›1a¹·ÈÇ›15aȹÌÈ›14aìÀ¹Ç›15aÈÛ14a¶›1a¹›15aÊ
+›664d›721`ƹÈÉÆ›18a·µÆƽµ»¹›17a·Ã›806aÍȹ›18aì̹¸ð
+›664d›1105`ÈÆÃÀá›17aµÂ¸›19a¶½ÂµÆÍ›17aìÀ¹Ç›19aÈÛ17a·ÃÂǽÇÈ›18aú›17aÔÐÑð¶
+›720d›941`¿Çâ
+›720d›721`À¹Â»È¼›15a¶ÀÛ1a·
+›819d›607`&HGM›23aGHM›24aEH:=>=g›23a3&-›23a?BE>›15m›24a*›14m:+%-!,%›15m›2a+›10m›23a<:GbM›23a;>›24aHI>G>=›22aó›14m›32a_VlhXYpq
+›819d›1882`R
+›875d›10m›753`µÇ›11aɵ¶À¹›12aÈÛ12aÀÛ1a·µÈ¹›11aȼ¹›12a½Â¸½·µÈ¹¸›12ah3&-›11aìÀ¹ä›18a½È›12aÁ›213aÃÉÆ›11aÇÍÇȹÁ
+›875d›721`Ë›921aÉÇÈ›11a¶›1a¹›13aÛ12aÍ
+›932d›721`ÇÃÁ¹Ë¼¹Æ¹á›15aÃȼ¹Æ˽ǹ›14a¯›99aÃÉÀ¸›14a¼µ›22a¹›15aºµ½À¹¸›15aÈÛ1aÃÛ
+›932d›1217`³›15aË›146aÊ
+›942d›1191`~
+›1030d›607`GH›24aFHK>›23aOBKMN:E›23a?HGM›23a;RM>L›682a¹Â›15aºÆÃÁ›16aµ
+›1030d›1250`ó›16a²¼½ÀÇÈ›15aÄÆÛ1a·¹Çǽ»›16aµ›16a»ÀÍļ›16aȵ¿
+›1087d›721`ʽÆÈɵÀ›12aºÃ›761a¼µÆµ·È¹ÆÇä›18aƹµÀÀÍ›13aȼ½Ç
+›1087d›928`Èá›13aȼ¹›14aÄÆûƵÁ›13aÉǹ¸›14aÉÄ›15aµÀÀ›13aȼ¹›13aÇÈÃƹ¸›14a·
+›1143d›1235`ȹƵÀ›14a¹ÆÆÃÆá›14aµÂ¸›15aƹě1aÃÆȹ¸›16aÈÛ14aȼ¹›16aµÉȼÃÆâ
+›1143d›721`ǼÃÉÀ¸›15a¶›1a¹›16a·ÀµÇǹ¸›15aµÇ›15aµÂ›15a½Â
+›1242d›607`&HGM›23aGHM›24aEH:=>=g›23a;:=›23aL<:E>›23ac›13mñ›10md›23aó›10a¯¼¹›11ah3&-›500aÈ
+›1242d›1594`ìÀ¹›11a½Â¸½·µÈ¹¸›11aȼµÈ›10aȼ¹›10aºÃÂ
+›1298d›721`Ë›657aµÀɹá›16aÃÆ›15a¹»µÈ½Ê›52aâ›20a°Ç¹›14m›16a]SlhZX›10m›15aÈÃ
+›1298d›753`µÇ›15aÇ·µÀ¹¸›15aÈÛ15aµÂ›16a½ÁÄ›1aÃÇǽ¶ÀÍ›15a¼½»¼›15aÊ›308a¹ÀÍ
+›1354d›721`µÂµÀÍι›15aȼ¹›15ah3&-›15aìÀ¹â
+›1453d›607`&HGM›23aGHM›24aEH:=>=g›23a;:=›23a=>LB@G›23aLBS>›24ac›13mé›10md›22aó›13a¯¼¹›15ah3&-›13aìÀ¹›14a½Â¸½·µÈ¹¸›14aȼµÈ
+›1509d›721`ȼ¹›17aºÃ›325aµÇ›16a¹»µÈ½Ê›519aµÀɹâ›25a°Ç¹
+›1509d›862`ÈÝÇ›16a¸¹Ç½»Â›17aǽι›17aË›201a¹›16aÃÆ›17aµÂ›17a½ÁÄ›1aÃÇǽ¶ÀÍ›16aÀµÆ»¹›16aÊ
+›1566d›14m›721`]SlhZX›10m›15aÈÛ14aµÂµÀÍι›15aȼ¹›15ah3&-›15aìÀ¹â
+›1664d›607`.H›24a=>OB<>›23aMRI>›23aLI><B?B>=›318aµÀɹ›13aË›116aʽ¸¹¸›11aºÃÆ›12aȼ¹›12aÅɵÀð
+›1664d›1203`ó›11a©Ã›12a¸¹ºµÉÀÈ›11aÊ›123aµÇ›11aÄÆÃ
+›1721d›721`½ì¹Æ›14ai$%5)#%t380%â›12a®Ä›1a¹·½ºÍ›15aµÂ›15a¹ÌÄÀ½·½È›13aÊ›291aÃÉÆ›14a¯›18a³Â½·½µÂ
+›1721d›1524`µÀɹá›15aµÂ¸›14a»¹È›14aÍ
+›1731d›1923`~
+›1777d›721`ÈÛ14aÁÛ1a¸½ºÍ›15aȼ¹›15a$5)3/,.TWh#,$›14aìÀ¹›15aÈÛ15aÆ¹í¹·È›15aȼ¹›15aÀÛ1a·µÀ›15a¹Â›184aÈâ
+›1777d›1828`ʽÆÃÂÁ¹Â
+›1876d›607`.H›24a?BE>›23aG:F>›23aIKHOB=>=›113aÃÉݸ›16a¼µ›22a¹›15a¶›1a¹¹Â›16a¹ÌÈƹÁ¹ÀÍ›16aǹµ¿Í›15aÈÛ15a»¹È›15aȼ½Ç
+›1876d›1131`ó›15a´›145aÊ
+›1932d›867`ÃÉÝÊ›299aÍĵÇÇ›13a}|§ÝÇ›12a·›63a¿›14aȼµÈ›12aµ›13aìÀ¹ÂµÁ¹›14a¶›1a¹›14aÇÄ›1a¹·ð
+›1932d›721`¹ÆÆÃÆå›13aÍ›83a¹›12aÁµÂµ»¹¸›13aÈÛ13a¶›278a¼¹·
+›1989d›1165`Í›15aȼ¹›15aÄÆûƵÁÛ›19a{¹›15aÁÃƹ›15aǹÂǽ¶À¹Û
+›1989d›721`½ì¹¸›15aÈÛ15a¶›1a¹›16aÄÆÛ1a·¹Çǹ¸›16a¶
+›2087d›607`qqqGHM›23aEH:=>=g›23a;:=›24a3&-›23a?BE>›22aó›25a¯¼¹›26ah3&-›483aµÀ½¸
+›2087d›1570`ìÀ¹›26a¸½¸ÂÝÈ›25aÇÄ›1a¹·½ºÍ›26aµ›25aÊ
+›2144d›916`¼µÆµ·È¹ÆÇ›15aµÇ›15a¶›1a¹½Â»›15aƹǽ¸¹Â›225aÈâ›20a°Ç¹›14m›16a]SlhZX›10m›15aÈÛ15aµÂµð
+›2144d›721`Ƶ»¹›15aú›15a·›513aÈ›16a½Â›15aȼ¹›15aºÃÂ
+›2200d›721`ÀÍι›15aȼ¹›15ah3&-›15aìÀ¹â
+›2299d›607`07,›24a?BE>›23aA:L›23a;:=›24a?HKF:M›286a¿›556aȵ½Â
+›2299d›1179`ó›11a¯¼¹›12aÉÂĵ·›22a¹¸›13aĽ̹À›11aƵÇȹƛ11aìÀ¹›12a¸½¸ÂÝÈ›11a·ÃÂ
+›2355d›774`¼µÆµ·È¹Æ›11a¸½Æ¹·ÈÃÆÍ›11a½Â›11aȼ¹›12aÀµÇÈ›10aÔÐÖ›11aË›416aÈá›11aÃÆ›11a¶›1a¹ÈȹÆá
+›2355d›721`µ›11a·›683aÃƸÇâ›18a­¹ÄÀµ·¹›11aȼ¹›12aºÃÂ
+›2412d›740`¼µÂ»¹›15aÈÛ15aÉǽ»›15aȼ¹›15ah0+›15a¹Åɽʛ77aÈâ
+›2412d›721`·›573aµÀ¹Â
+›2510d›607`LM:KMBG@›23aI:@>›23aGNF;>K›23a<HNE=›23aGHM›24a;>›24a?HNG=›22aó›13a¯¼¹›13aÇȵÆȽ»›12aĵ»¹›14aÞÇÄ›1a¹·ð
+›2567d›721`½ì¹¸›16a˽ȼ›15aȼ¹›16ai23!13).'t0!'%›14aÅɵÀ½ì¹Æß›15a¸Ã›1a¹Ç›16aÂÃÈ›16aÁµÈ·›86aÍ›16aĵ»¹›16a½Â
+›2567d›1830`¼›15aµÂ
+›2623d›721`ȼ¹›15ah$5)›15aìÀ¹â
+›2722d›607`c5&›24a?BE>d›23a#A:K:<M>K›15m›22a*›14m#(!1›17a-4,›15m›4a+›10m›24a=H>L›23aGHM›23a>QBLM›107aó›15a¯¼¹›15aÇÄ›1a¹·½ì¹¸
+›2778d›740`¼µÆµ·È¹Æ›13a¼µÇ›14a¶›1a¹¹Â›15aÉǹ¸›15a½Â›14aȼ¹›14a¸Ã›1a·ÉÁ¹Â›243a¼µÆµ·È¹Æ›13a¸Ã›1a¹Ç›15aÂÃÈ
+›2778d›721`·›771aÈá›15a¶ÉÈ›14aȼµÈ›13a·
+›2835d›1257`Èâ›19a°Ç¹›14m›15a_Slh_Z›10m›16aÈÛ15aµÂµÀÍι›15aȼ¹›15aìÀ¹â
+›2835d›721`¹Ì½ÇÈ›14a˽ȼ½Â›15aȼ¹›15aʽÆÈɵÀ›14aºÃÂ
+›2933d›607`c5&›24a?BE>d›23a<HGM:BGL›23aBEE>@:E›22a<HFF:G=›23aBG›24a<A:K:<M>K›23aI:<D>M›66aó›14a¯¼¹
+›2990d›927`È›11aìÀ¹›12a·Ã›691a¼µÆµ·È¹Æ›11aĵ·›22a¹Èâ
+›2990d›721`ʽÆÈɵÀ›11aºÃ›165aȵ½ÂÇ›11aµÂ›12a½ÀÀ¹»µÀ›10a·ÃÁÁµÂ¸›12a˽ȼ½Â›11aµ›12a·›242a¿
+›3046d›721`°Ç¹›14m›15a_Slh_Z›10m›374aÈ›14aìÀ¹â
+›3046d›978`ÈÛ15aµÂµÀÍι›14aȼ¹›16aºÃÂ
+›1;1191;2720;2;14!|
+
+
+›462d›12m›449`Ãôï›45aÊâáúÛÖçÖß›14aÃååâå›14aÉÚææÖÜÚæ›10m›831aÒØ
+›607d›449`c5&›24a?BE>d›23a&BKLM›23a;RM>›24aBLGbM›23apIK>b›301aÈ›14aìÀ¹Ç›15aµÆ¹›15a¹ÌÄ›1a¹·È¹¸›16aÈÃ
+›607d›1236`ó›14a±½ÆÈɵÀ›14aºÃÂ
+›664d›563`·ÃÁÁ¹Â·¹›23a˽ȼ›21aµ›14m›62a%›10m›25a·ÃÁÁµÂ¸å›25aȼ½Ç›21aìÀ¹›22a¸Ã›1a¹ÇÂÝÈâ›41a°Ç¹›14m›22a_Slh_Z›10m›22aÈÃ
+›664d›14m›945`/1
+›720d›10m›563`µÂµÀÍι›15aȼ¹›15aìÀ¹â
+›821d›449`c5&›24a?BE>d›23a)EE>@:E›23a;RM>›13m›23aò›10m›24a:M›24aLM:KM›23aH?›23a<A:K:<M>K›23aI:<D>M›88aó›15a¯¼¹
+›877d›768`È›10aìÀ¹›11a·Ã›608aÈ›10aÁµÄĽ»›11a·ÃÁÁµÂ¸
+›877d›563`ʽÆÈɵÀ›10aºÃ›163aȵ½ÂÇ›10aµÂ›11a½ÀÀ¹»µÀ›9a·ÃÁÁµÂ¸›11aÃÆ›11aºÃÂ
+›934d›1131`¼µÆµ·È¹Æ›14aĵ·›22a¹ÈÇâ›18a°Ç¹›14m›14a_Slh_Z›10m›15aÈÛ13aµÂµÀÍι
+›934d›563`˽ȼ½Â›13aÃÆ›13aµºÈ¹Æ›14aù›14aÃÆ›13aÁÃƹ›13a·›245a¿
+›990d›702`È›15aìÀ¹â
+›990d›563`ȼ¹›15aºÃÂ
+›1091d›449`c5&›24a?BE>d›23aBGOHD>L›23aNGF:II>=›23a?HGM›13m›23aê›10m›402aÈ›18aìÀ¹›19aƹº¹Æ¹Â·¹Ç
+›1091d›1263`ó›18a¯¼¹›19aʽÆÈɵÀ›18aºÃÂ
+›1148d›563`µ›15aºÃ›121a¼›15a½È›15a¼µÇÂÝÈ›15aÁµÄÄ›1a¹¸å›15aÉǹ›14m›16a_Slh_Z›10mâ
+›1148d›662`È›14a˼½·
+›1248d›449`c5&›24a?BE>d›23a1>?>K>G<>L›23aMHH›23aF:GR›23a?HGML›381aÈ›14aìÀ¹›14aµÈȹÁÄÈð
+›1248d›1307`ó›14a¯¼¹›14aʽÆÈɵÀ›12aºÃÂ
+›1305d›1081`ÈÇ›12aȼµÂ›14m›45a_VlhXYpq›10m›44aµÇ›13a·µÄµ¶À¹›13aú›12a¼µÂ¸À½Â»å
+›1305d›563`¹¸›14aÈÛ12aÁµÄ›13aÁÃƹ›13aµ·ÈɵÀ›12aºÃ›14m›151aR›10m›196aË
+›1361d›563`ȼ¹›18aºÃ›626a¹â›28a°Ç¹›14m›19a_Slh_Z›10m›18aÈÛ18aµÂµÀÍι›18aȼ¹
+›1361d›705`È›18a½Ç›17aÄÆöµ¶ÀÍ›18a½Âì½ȹÀÍ›18aƹ·ÉÆǽÊ
+›1418d›563`ìÀ¹â
+›1519d›449`c5&›24a?BE>d›23a-:II>=›23a?HGM›23aLBS>›24aBL›23aMHH›24a;B@›385aÈ›14aƹº¹Æ¹Â·¹Ç
+›1519d›1355`ó›15a¯¼¹›15aʽÆÈɵÀ›14aºÃÂ
+›1575d›563`µÂ›17aµ·ÈɵÀ›17aºÃ›995a¼›17a½È›16a½Ç
+›1575d›828`È›16aµÂ¸›18aȼ¹›17aǽι›17aú›17aȼ¹›17aÀµÈȹÆá›16aµÂ¸›18aȼ¹›17aÇ·µÀ¹›17aµÈ›17a˼½·
+›1631d›563`½Â›22aÿ›902aÈâ›33a°Ç¹›14m›21a_Slh_Z›10m›20aÈÃ
+›1631d›600`Ê›45a¹¸á›20a¹Ì·¹¹¸Ç›21aȼ¹›20aÀ¹»µÀ›19aÀ½Á½ÈÇ›19aºÃÆ›19aµ›20aʽÆÈɵÀ›19aºÃÂ
+›1688d›563`µÂµÀÍι›15aȼ¹›15aìÀ¹â
+›1789d›449`c5&›24a?BE>d›23a.>@:MBO>›23aI:<D>M›23aE>G@MA›370aÈ›9aìÀ¹›10a½Ç›10aÁµÀºÃÆÁ¹¸â
+›1789d›1236`ó›9a¯¼¹›11aʽÆÈɵÀ›9aºÃÂ
+›1845d›563`°Ç¹›14m›15a_Slh_Z›10m›16aÈÛ15aµÂµÀÍι›15aȼ¹›15aìÀ¹â
+›1946d›449`c5&›24a?BE>d›23a6KHG@›23aO>KLBHG›23aGNF;>K›23aBG›24aL><HG=›23a;RM>›403aÈ
+›1946d›1546`ó›21a¯¼¹›21aʽÆÈɵÀ›20aºÃÂ
+›2002d›563`ìÀ¹›11a½Ç›10aú›11aµ›10aÊ›436aÍ›14m›43a_VlhXYpq›10mâ›17a°Ç¹›14m›11a_Slh_Z›10m›12aÈÛ10aµÂµÀÍι
+›2002d›777`¹ÆǽÛ10aÂÃÈ›11aÇÉÄÄ›1aÃÆȹ¸›11a¶›14m›34aR
+›2059d›10m›563`ȼ¹›15aìÀ¹â
+›2160d›449`5&›24aI:<D>M›23a?:BE>=›23an›15m*›14m›200a%1›15m›5a+›10mg›15m*›14m#(!1›16a-4,›15m›4a+›10mo›22aó›51a²¼½ÀÇÈ›50aÄÆÛ1a·¹Çǽ»
+›2160d›14m›897`&.-3›16a-4,"
+›2216d›10m›1131`¼µÆµ·È¹Æ›11aȵ¿›401aÈá›14m›43a_Vlhs
+›2216d›10m›563`ÇÈÃƹ¸›12a»ÀÍļǛ11aºÃÆ›12aµ›11a·ÃÁÄÀ¹Ì›12a·›239a¹Â›12aºÆÃÁ›11aµ›12aʽÆÈɵÀ›11aºÃ›14m›41aR
+›2273d›563`XYpq›10m›12aºµ½À¹¸›12aÈÛ11aÄ›1aÃǽȽÛ12aȼ¹›12a¹À¹Á¹Â›492aÈ›11aƹÅɽƹ›12aÈÃ
+›2273d›1231`ÈÇ›13aú›12aȼ¹›12a»ÀÍļå›13aȼ½Ç›12aÁ½»¼
+›2329d›1029`ȹƵÀ›13a¹ÆÆÃÆá›14a¶ÉÈ›14aìÆÇÈÀÍ›14aÉǹ›14m›15a_Slh_Z›10m›14aÈÛ14aµÂµÀÍι
+›2329d›563`¶›1a¹›15aƹě1aÃÆȹ¸›14aµÇ›14aºÃÆ›14aµÂ›14a½Â
+›2386d›563`ȼ¹›15aìÀ¹â
+›2486d›449`6A>K>›24a:K>›23aMA>›24a?HGM›23a=BK><MHKB>L_›46aci0+›17a&/.3›16a$)1%#3/18g›23a>M<d›77aó
+›2543d›563`¯¼¹›19a·ÃÁÁµÂ¸›18aÀ½Â¹›18aÇÄ›1a¹·½ì¹¸›19a¹½È¼¹Æ›18aȼ¹›426a8›16aÅɵÀ½ð
+›2543d›1384`i0+t&/.3t$)1%#3/1
+›2599d›563`ì¹Æá›15aÂÃÆ›398a/18â›13az›676aÈ
+›2599d›735`i07,t&/.3t$)1%#3›130aÈ›14aÀ¹µÇÈ›14aù›15aú›15aȼ¹Ç¹›15aÅɵÀ½ì¹ÆÇ›14aÃÉ»¼
+›2656d›1184`µÀɹá›17aȼÆÃÉ»¼›17aȼ¹›16a·ÃÁÁµÂ¸›17a¸¹ì½ȽÃÂ
+›2656d›563`ÈÛ16a¶›1a¹›18aÇÉÄÄÀ½¹¸›17a˽ȼ›16aµ›16a¸¹ºµÉÀÈ›16aÊ
+›2712d›563`Þ$5)3/,.TWh#,$›334aÃÉÆ›15aÀÛ1a·µÀ›14a¯›18a³Â½·½µÂâ
+›2712d›893`ß›13aìÀ¹â›20a®Ä›1a¹µ¿›16aÈÛ14aÍ
+›2722d›1440`~
+›2844d›13m›449`]¬§›56acyx¯rm}mv›18a]{{y{›18abq||msq|
+›2933d›10m›929`˽»›20a¹ÆÆÃÆÇ›22a¶›1a¹›23a¸¹È¹·È¹¸á›14m›57a_VlhXYpq›10m›21a˽ÀÀ›22aµÈȹÁÄÈ
+›2933d›449`®¼ÃÉÀ¸›23aù›23aú›22aȼ¹›23aºÃÀÀÛ14m›523aR
+›2990d›10m›576`Ƚ›417aÃÉÆ›19ah$5)›18aìÀ¹å›21a¼Ã›31a¹Ê›311aÈ›18aÃÉÈÄÉÈ
+›2990d›449`ÈÛ19a·Ã›54aɹ›19a˽ȼ›19aÄÆÛ1a·¹Çǽ»›19aÍ›337aË›42a¹Æá›19aȼ¹›20aƹÇÉÀȵÂ
+›3046d›449`ìÀ¹›23a˽ÀÀ›20aÄÆöµ¶ÀÍ›22aÂÃÈ›22aÄÆÛ1a¸É·¹›23aȼ¹›22a¹ÌÄ›1a¹·È¹¸›23aƹÇÉÀÈÇâ›40a²¼¹Â›23aȼ¹›22aÄÆûƵÁ
+›1;1449;2484;2;15!|
+›1;1336;2484;2;15!|
+›1;1291;2158;2;14!|
+›1;978;2158;2;14!|
+
+
+›462d›607`ÓÏ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›1048`¶›1aÃÀ›14a^2%5%1)38›14a˽ÀÀ›14a¼µ›22a¹›15aȼ¹›15aÊ›186aÉÇ›15aÄ›1a¹ÆÁ½ÈȽ»
+›607d›607`ì½Ǽ¹Çá›15aȼ¹›16a}|§›15aÇÍÁ›438aÊ›133aµÀɹ›15aÑá›15aȼ
+›664d›607`µ›15a·ÃÁÁµÂ¸›15aÄÆÛ1a·¹¸Éƹ›16aÈÛ15a¸¹È¹·È›15aȼµÈ›15aµÂ›15a¹ÆÆÃÆ›14aÛ1a··ÉÆƹ¸â
+›723d›678`®É»»¹Çȹ¸›16a¹ÆÆÃÆ›15aƹ·Ã›22a¹ÆÍ›16aȹ·›301a¹Âá›15a˼¹Â›16aµÄÄÆÃÄƽµÈ¹â›22aªÂ·¹
+›723d›1083`Ê›134a¼Â½ÅɹǛ16aµÆ¹›16a»½Ê
+›780d›607`µ»µ½Âá›22aȼ¹›22aÄÆûƵÁ›14m›21aR›57aoi›1ad›10m›177aʽ¸¹›21aµ›21aÁÃƹ›22a¸¹Èµ½À¹¸›21aµÂµÀÍǽǛ21aú›21aȼ¹
+›780d›14m›1055`_Vl›10m›86a·µÂ›23aÄÆÃ
+›836d›607`¹ÆÆÃÆÇâ
+›957d›607`:KBMAF>MB<›23aHO>K?EHP`›46aI:K:F>M>K›23a<A:G@>=›23a?KHF›13m›23aò›10m›24aMH›13m›23aó›10m›100aó›14a²¼¹Â
+›1014d›721`ÄÆÛ1a·¹Çǽ»›15m›12a*›14m$5)›16a"83%›15m›4a+›10mÇá›12aµ›12a·ÃÁÁµÂ¸›12aË›189aȹƹ¸›13aȼµÈ›12aµÈȹÁÄȹ¸›12aÈÃ
+›1014d›1444`µÇ›12a¹Â·ÃÉÂ
+›1070d›781`Ê›247aȵÀ›9aÃÆ›10aÊ›750aÃƸ½ÂµÈ¹
+›1070d›721`ÁÛ22a¹›9aȼ¹›10a¼ÃƽÎÛ136a¹ÆȽ·µÀ›8aÄ›1aÃǽȽÛ9aÈÛ10aÇÃÁ¹Ë¼¹Æ¹›10a˽ȼ›10aµ›9a·Ãê
+›1111d›15m›1001`JH
+›1127d›10m›721`¹Ì·¹¹¸½Â»›15m›14a"›10mÞÑ›15m›44a!›10m›7aÐßLI›268aÃÉÀ¸›13a½ÁÄÀÍ›13a¶›1a¹½Â»›14aµ¶›1aÃÉÈ›14aÒ׺ț12aºÆÃÁ
+›1127d›1176`â›19a®½Â·¹›14aȼ½Ç›13aË
+›1183d›1126`ÃÉݸ›11a¶›1a¹›13a¶›1a¹Èȹƛ12aÃë›12aÉǽ»›14m›43a_VlhQcndjlfkfgeUha›73ae›10mÛ
+›1183d›721`ȼ¹›12aÃƽ»½Âá›11aÄ›1a¹Æ¼µÄÇ›13aÍ›14m›464aR›370ajcfg
+›1289d›10m›607`;:<DIHBGM>K›23aBG›23a;RM>›13m›23aí›10m›24aLAHNE=›23a;>›13m›24aï›10m›22aó›19a¯¼¹›20aÄÆûƵÁ›19a¼µÇ›19a¸¹È¹·È¹¸›21aµÂ
+›1345d›1062`Ë›529aÈ›17aĵ»¹›16aµÂ¸›17aȼ¹›17aÄƹʽÃÉÇ
+›1345d›721`½Â·ÃÂǽÇȹ·͛16a¶›1a¹È›31a¹¹Â›17aȼ¹›17aÇȵÆÈ›15aú›17aȼ¹›16a·ÉÆƹÂ
+›1402d›721`ùâ
+›1508d›607`;:=›24aIHLM:F;E>›22aIHBGM>K›23aBG›24a;RM>›13m›23aí›10m›23aó›19aȼ¹›19aË›169a˽»›18aȼ¹›14m›19a/›93a.23
+›1508d›10m›1565`ÃƸ›19aºÃÀÀÛ14m›214a.23›17a/
+›1564d›10m›1335`È›20a¶µ·›591a¶À¹ä
+›1564d›721`·ÃÁÁµÂ¸›21a½Ç›20aÇÉÄÄ›1aÃǹ¸›22aÈÛ21aÄ›1aý›104a¿›21aÈÛ20aȼ¹›21aÇȵÆÈ›20aú›21aȼ¹›21aÄ›1aÃÇȵÁ
+›1621d›721`ȼ½Ç›14aù›16a¸½¸ÂÝÈÛ
+›1726d›607`;HI›24aH<<NKK>=›22a;>?HK>›23a>HI›23aó›18a²¼½ÀÇÈ›17aÄÆÛ1a·¹Çǽ»›19aµ›18aĵ»¹á›20aµ›14m›37a./›10m›22a·ÃÁÁµÂ¸
+›1726d›14m›1823`"
+›1783d›10m›753`µÇ›16a¸¹È¹·È¹¸›18a¶›1a¹ºÃƹ›17a츽»›18aȼ¹›14m›36a./›10m›20aȼµÈ›16aǼÃÉÀ¸›17a¼µ›22a¹›17aȹÆÁ½ÂµÈ¹¸›16aȼ¹
+›1783d›721`Ë›14m›612a%›10m›357aÊ
+›1839d›846`È›15aĵ»¹â
+›1839d›721`·ÉÆƹÂ
+›1945d›607`;RM>›13m›23aí›10m›24aBL›24aGHM›23aIHLMIHLM›197aÍȹ›13aºÃÀÀÛ537a¶À¹
+›1945d›1171`ó›13a¯¼¹›14a¶›159a˽»›12aȼ¹›13a¹Â¸›14aú›14aȼ¹›13aÄ›1aÃÇȵÁ
+›2002d›973`Ƚ·½ÄµÈ¹¸›14m›14a/›92a.23›10m›20a·ÃÁÁµÂ¸â
+›2002d›721`½Ç›15aÂÃÈ›14aȼ¹›16aµÂ›14m›209a.23›16a/
+›2107d›10m›607`<A:K:<M>K›13m›23aè›10m›23aBGO:EB=›23aBG›24a?HGM›15m›23a*›14m-!,%›15m›3a+›10m›23aó›25a¯¼¹›26ah$5)›26aìÀ¹›26a¼µÇ›26aƹÅɹÇȹ¸
+›2164d›834`¼µÆµ·È¹Æ›13m›10aè›10m›522aÈÀÍ›10aǹÀ¹·È¹¸›11aºÃ›147a¹È›10aȼ¹
+›2164d›721`ȼµÈ›10a·›204a¶›1a¹›12a½Áµ»¹¸›10aºÆÃÁ›10aȼ¹›11a·ÉÆƹ›290aÈá›10aµÂ¸›11aÍ
+›2220d›782`È›15a¸Ã›1a¹ÇÂÝÈ›15a·Ã›140aÍ›15aÇÉ·›60a¼µÆµ·È¹Æå›14aÇÃÁ¹È¼½Â»›15aÁ½»¼›174aȹ¸á
+›2220d›721`ºÃ›257aȵ½Â›15aµÂ›100a¼›17a·›507aÈ›15a¶›1a¹›16aÄƽÂ
+›2277d›927`Ͷ›1aÛ1a¸ÍÝÇ›15a»É¹ÇÇ›16aµÇ›14aÈÛ15a˼µÈÛ
+›2277d›721`¶ÉÈ›15a½ÈÝÇ›14aµÂ
+›2383d›607`#HNE=GbM›23aHI>G›23auLI><B:E›23aBG<ENLBHGj›15m›46a*›14m:+%›15m›3a+›10m›22aó›17a¯¼¹›19ah$5)›160aȵ½Â¹¸
+›2383d›1835`ìÀ¹›18a·ÃÂ
+›2439d›721`µ›376aBQ>E›15m›22a*›14m:+%›15m›2a+›10mw›620aµÇ›16aÉÂð
+›2439d›761`uLI><B:EvEGTWjL›255a·ÃÁÁµÂ¸á›17a¶ÉÈ›17aȼ¹›17aÄÆûƵÁ›16aË
+›2496d›1579`ÍÀ¹›15a¹ÆÆÃÆ›14aƹě1aÃÆÈ›15aµÇÇÛ1a·½µÈ¹¸
+›2496d›721`µ¶À¹›15aÈÛ14aÃÄ›1a¹Â›16aȼ¹›16aÇÄ›1a¹·½ì¹¸›16aìÀ¹â›20a¯¼¹›15a±¨®ðÇÈ
+›2552d›721`˽ȼ›14aȼ½Ç›15aÁ¹Çǵ»¹›15aÁ½»¼›260aÍ›14aȼ¹›16aìÀ¹›15a·ÃÉÀ¸ÂÝÈ›15a¶›1a¹›16aÃÄ›1a¹Â¹¸â
+›2552d›1186`È›14a½Â¸½·µÈ¹›15a˼
+›2658d›607`$B:@HG:E›23aKNE>›23aBG›24auLI><B:E›15m›23a*›14m›40a%›104a!12›15m›3a+›10m›23aó›17az›17auLI><B:E›17a·ÃÁÁµÂ¸›17aƹð
+›2658d›14m›1246`2/›17a#)!+›15a/
+›2714d›10m›721`ÅɹÇȹ¸›11aȼ¹›11a<HGG><M›10aÃÄ›1a¹ÆµÈ½ÃÂá›11a¶ÉÈ›11aȼ¹›12aÄ›1aý›256a¹Æ¹›11aÂÃÈ›11a½Â›10aȼ¹
+›2714d›1587`ÈÇ›10aÇÄ›1a¹·½ì¹¸›12aË
+›2771d›721`ǵÁ¹›16aÊ›342aȵÀ›14aÀ½Â¹ä›22aȼ½Ç›16auLI><B:E›15aǼÃÉÀ¸›16aÃÂÀÍ›16a¶›1a¹›17a½ÇÇɹ¸
+›2771d›859`¹ÆȽ·µÀ›15aÃÆ›16a¼ÃƽÎÃÂ
+›2827d›745`Í›15aȼ¹›15aÁµ·ÆÃÇ›15aú›14aȼ¹›16a<A:G@>;:K›14aÇÈ›417aÍ›15aȼ¹›16aÉǹÆâ
+›2827d›721`¶›666aÍÀ¹›14aÃÄȽÃÂá›14aµÂ¸›15aÂÃÈ›15a¶
+›2933d›607`B=>GMB?B<:MBHG›22aBG›24a;RM>›13m›23aí›10m›24aLAHNE=›23a;>›13m›23aë›10m›23aó›12a¯¼¹›13ah$5)›12aìÀ¹›12a½Ç›13aÇÉÄÄ›1aÃǹ¸›13aÈÃ
+›2990d›788`ȵ½Â›12aȼ¹›13aÊ›152aÉÁ›219aÈÀÍ›12aÑß›13aµÈ›12aȼ¹›13a¶›1a¹»½Â½»›13aµÂ¸›13aȼ¹›13a¹Â¸
+›2990d›721`·Ã›189a¹ÆǽÛ12a›61a¶›1a¹Æ›13aÞ·ÉÆƹÂ
+›3046d›1039`Íȹ𵸸ƹÇÇ›13m›15aí›10m›295a¼›15aù›15aºµ½À¹¸â
+›3046d›721`ú›15aȼ¹›15aìÀ¹å›15aȼ¹›15a¶›293a½Â¸½·µÈ¹Ç›15a˼½·
+›1;1378;2656;2;14!|
+›1;1243;2000;2;14!|
+›1;2010;1506;2;14!|
+
+
+›462d›12m›449`Ãôï›45aÊâáúÛÖçÖß›14aÃååâå›14aÉÚææÖÜÚæ›10m›831aÓÐ
+›607d›449`)GO:EB=›23aIHBGM›24aGNF;>K›23aBG›23auLI><B:E›15m›23a*›14m›40a%›104a!12›15m›4a+›10m›22aó›17az›18auLI><B:E›16a·ÃÁð
+›607d›14m›1255`2/›17a#)!+›15a/
+›664d›10m›563`ÁµÂ¸á›21aÉǽ»›19aȼ¹›20a=>?IHBGM›19aÃÆ›20aK>L>MIHBGML›18aÃÄ›1a¹ÆµÈ½ÃÂÇá›20aÇÄ›1a¹·½ì¹¸›21aµÂ
+›720d›600`Ê›178aÈ›21a›61a¶›1a¹Æ›22aÞ›13mú›14m›149a.)-32›10m›129a¼›21a½Ç›21aµ›22a·ÃÁĽÀ¹ðȽÁ¹›21a·ÃÂð
+›720d›563`½Â›20aµÀ½¸›21aÄ›1aý›62aÉÁ›14m›162a,!7›23a/›10m›98aá›23a˼½·
+›777d›646`È›18a½Â›19aȼ¹›14m›19az¢~›10mßá›21aÃÆ›18aȼ¹›19a<HGG><M›541aÈ›19aȼµÈ
+›777d›563`Çȵ›655aÃÄ›1a¹ÆµÈ½Ã›18aÇÄ›1a¹·½ì¹¸›20aµ›19aÄ›1aýÂ
+›833d›563`¼µ¸ÂÝÈ›15aÄƹʽÃÉÇÀÍ›15a¶›1a¹¹Â›16a¸¹ì¹¸â
+›925d›449`GHGq!2#))›23a<A:K:<M>K›23aBG›23auLI><B:E›23a<HFF:G=›193a¼µÆµ·È¹Æ›13aÇÈƽ»›14aĵð
+›925d›1403`ó›13a¯¼¹›15a·
+›982d›563`ƵÁ¹È¹Æ›12aú›12aµ›13auLI><B:E›442a¼µÆµ·È¹Æ›12aÂÃÈ›12a½Â›13aȼ¹›14m›13atª¡¤›1a¤
+›982d›10m›1018`·ÃÁÁµÂ¸›13a½Â·Àɸ¹Ç›13aµ›12a·
+›1038d›582`¼µÆµ·È¹Æ›15aǹÈâ
+›1038d›563`·
+›1130d›449`qqqGHM›23aEH:=>=g›23a3&-›24a?BE>›23aBL›24a;:=›22aó›16a²¼¹Â›16aƹµ¸½Â»›16aµ›16ah3&-›15aìÀ¹á›17aȼ¹›16aÄÆÃð
+›1186d›563`»ÆµÁ›14a¸¹È¹·È¹¸›15aÇÃÁ¹›14a¸½Ç·Æ¹ÄµÂ·Í›110a¼›15a¼µÇ›14aÄÆöµ¶ÀÍ›14aµÀƹµ¸Í›14a¶›1a¹¹Â›16aƹð
+›1186d›1196`á›15a˼½·
+›1243d›563`Ä›1aÃÆȹ¸â›20a°Ç¹›14m›15a]SlhZX›10m›15aÈÛ15aµÂµÀÍι›15aȼ¹›15aìÀ¹â
+›1335d›449`.NEE›24auLI><B:E›23a:K@NF>GM›21aó›20az›21auLI><B:E›486aÍ›20aµÆ»Éð
+›1335d›1329`·ÃÁÁµÂ¸›20a¼µÇ›21aµÂ›20a¹ÁÄÈ
+›1391d›645`Èâ
+›1391d›563`Á¹Â
+›1484d›449`0HBGM›24aGNF;>K›23aFBLLBG@›21aBG›24auLI><B:E›15m›9a*›14m›40a%›104a!12›15m›4a+›10m›10aó›9az›10aÄ›1aý›51aÉÁ›106aµÇ
+›1484d›14m›1240`2/›17a#)!+›15a/›10m›276aÈ›10a›61a¶›1a¹Æ›11aË
+›1540d›563`¹ÌÄ›1a¹·È¹¸›16a½Â›16aµ›541aw›13a·ÃÁÁµÂ¸â
+›1540d›843`uLI><B:EvEGTWj=>?IHBGM
+›1632d›449`IHI›24aBEE>@:E›23a:M›23aE>O>E›24aS>KH›22aó›16a®ÃÁ¹È¼½Â»ÝÇ›16aËÆû›17a˽ȼ›16aȼ¹›17ah$5)›17aìÀ¹å›18a½È
+›1688d›563`µÈȹÁÄȹ¸›15aÈÛ14m›35a./›10m›19aµÂ›15a¹Â›184aÈ›14a˼¹Â›16aÂù›16a¼µ¸›15a¶›1a¹¹Â›16aÇȵ·›22a¹¸â
+›1688d›14m›838`/›10m›170aʽÆÃÂÁ¹Â›532a¿
+›1781d›449`IHLM:F;E>›23a<HFF:G=›23aPBMABG›23a:›24aI:@>›22aó›18a²¼½ÀÇÈ›18aÄÆÛ1a·¹Çǽ»›18aµ›19aĵ»¹á›14m›51a_Vlhs
+›1781d›1815`R
+›1837d›563`XYpq›10m›15a¸½Ç·Ã›22a¹Æ¹¸›14aµ›14m›36a.23›10m›455aÍ›15aÄƽÃÆ›14m›34a./›10m›3aâ
+›1837d›779`Ê›14m›134a/›10m›74a·ÃÁÁµÂ¸á›15a˽ȼÃÉÈ›14aµÂ›14m›150a%
+›1929d›10m›449`IK>:F;E>›23a<HFF:G=›23aPBMABG›23a:›24aI:@>›22aó›19a¯¼½Ç›20ah$5)›19aìÀ¹›20a½Ç›14m›20a1›17a!+›2a+8›10m›40a˽Çȹ¸ä›28aµ
+›1929d›14m›1623`%›10m›92aÈ
+›1986d›14m›603`%›10m›258aµÇ›14aºÃɸ›16a¸Éƽ»›15aµ›15aĵ»¹â
+›1986d›14m›563`/1›10m›38a·ÃÁÁµÂ¸›15aË
+›2078d›449`INLA›24a=>>I>K›23aMA:G›23a<E:BF>=›23aBG›24aIHLM:F;E>›320aÈ›25a¹Â›184aÈ
+›2078d›1355`ó›25a¯¼¹›25a·ÉÆƹ›86aʽÆÃÂÁ¹Â
+›2134d›595`µÇ›14m›14a/42(›10m›3a¹¸›17aÁÃƹ›15aúȹ›15aȼµÂ›15a¯›17a³›15a¼µ¸›16a·Àµ½Á¹¸â
+›2134d›563`Ë
+›2144d›1164`~
+›2226d›449`K>?>K>G<>›23aMH›24a:G›23aNGEH:=>=›23a?HGM›22aó›16az›17aµÈȹÁÄÈ›16a¼µÇ›16a¶›1a¹¹Â›18aÁµ¸¹›17aÈÛ16aǹț16aµ
+›2283d›582`¼µÆµ·È¹Æ›15aºÆÃÁ›14aµ›15aºÃ›121a¼›15a¼µ¸ÂÝÈ›15a¶›1a¹¹Â›17a¸¹ì¹¸›16a˽ȼ½Â›15aȼ¹›15ah$5)›15aìÀ¹â
+›2283d›563`·›385aÈ›14a˼½·
+›2375d›449`uLI><B:E›23aLMKBG@›23aH?›24aG>@:MBO>›23aE>G@MA›22aó›14a¯¼¹›14m›16a777›10m›318a¼›15a¯›18a³
+›2375d›1522`·ÃÁÁµÂ¸›15a˼½·
+›2385d›1884`~
+›2431d›563`ÉǹǛ15aÈÛ15aĵÇÇ›15aµ›14auLI><B:E›14a·ÃÁÁµÂ¸›15a½Â›15aȼ¹›15ah$5)›15aìÀ¹›15a½Â›20aµÀ½¸ÀÍ›14a½Â¸½·µÈ¹¸
+›2431d›1616`Ê
+›2488d›563`ȼµÈ›15aȼ¹›15aÇÈƽ»›14aË›251a¹›14aÀ¹Â»È¼Û
+›2488d›901`µÇ›14aú›15a¹»µÈ½Ê
+›2580d›449`uLI><B:E›23aLMKBG@›23aMHH›24aEHG@›799aµÇ›16aÈÛ1aÃ
+›2580d›1045`ó›17a¥ÉÇÈ›17aµÇ›17aȼ¹›17aÄƹʽÃÉÇ›17a¹ÆÆÃÆá›17a¶ÉÈ›17a½È›17aË
+›2636d›808`¹ÀÍ›14a½Â›15aȼ½Ç›15a½ÂÇȵ·¹â
+›2636d›563`ÀµÆ»¹›14aÄ›1aÃǽȽÊ
+›2728d›449`LM:<D›24aGHM›23a>FIMR›23a:M›24a>G=›23aH?›24aI:@>›23acE>O>E›13m›23añ›10md›23aó›18a²¼¹Â›18a¯›18a³›18a»¹ÈÇ›17aÈÛ18aȼ¹
+›2738d›1648`~
+›2785d›563`¹Â¸›17aú›16aµ›17aĵ»¹á›16a½ÈÝÇ›15aÇÉÄÄ›1aÃǹ¸›18aÈÛ16a¹ÂÇÉƹ›17aȼµÈ›16aµÀÀ›15a¹Â›184aÈÇ›16aȼµÈ›16a½ÈÝÇ
+›2785d›1546`ʽÆÃÂÁ¹Â
+›2841d›563`½ÂÇÈÆɷȹ¸›16aÈÛ15a¼µ›22a¹›15a¶›1a¹¹Â›17aǵ›22a¹¸›16aǼµÀÀ›14a¶›1a¹›17aƹÇÈÃƹ¸å›15aȼ½Ç›15ah$5)›157aÈƵð
+›2841d›882`Ê›182aÊ›618aìÀ¹›16a·ÃÂ
+›2897d›563`Ê›416aÈâ
+›2897d›586`¹Â¹Ç›16aȼµÈ›14aƹÅɽƹÁ¹Â
+›2990d›449`NG=>?BG>=›23a<HFF:G=›15m›23a*›14m$5)›16a"83%›15m›4a+›10m›22aó›16a¯¼¹›16ah$5)›156aȵ½ÂÇ›15aµ›16a·ÃÁÁµÂ¸›16aȼµÈ
+›2990d›1361`ìÀ¹›16a·ÃÂ
+›3046d›563`½Ç›15aɸ¹ì¹¸å›16aµÆ¹›15aÍ›236aµÇ›14aÄÆÛ1a¸É·¹¸›17a¶›67a¹³Ú
+›3046d›927`ÃÉ›15aÇÉƹ›16a½È›14aË›277aÍ›15a¯
+›1;958;2988;2;14!|
+›1;1372;1482;2;14!|
+›1;1180;718;2;14!|
+›1;1387;605;2;14!|
+
+
+›462d›607`ÓÑ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›607`4GLNIIHKM>=›23aHK›23aF:E?HKF>=›23auLI><B:E›15m›23a*›14m›40a%›104a!12›15m›3a+›10m›23aó›25a|ÃÉÀ¸ÂÝÈ›25a츛26aµ
+›607d›14m›1437`2/›17a#)!+›15a/
+›664d›10m›721`ÄÆÃÄ›1a¹ÆÀÍ›15aºÃÆÁ¹¸›15aÃÄ›1a¹ÆµÈ½Ã›14a·Ã›1a¸¹›16aÇÈƽ»›14a½Â›15aµ›15auLI><B:E›14a·ÃÁÁµÂ¸â
+›762d›607`4GLNIIHKM>=›23auLI><B:E›15m›22a*›14m›40a%›104a!12›15m›4a+›10m›23aó›18az›19auLI><B:E›18a·ÃÁÁµÂ¸›19a½Â·Àɸ¹¸
+›762d›14m›1126`2/›17a#)!+›15a/
+›818d›10m›721`µÂ›16aÃÄ›1a¹ÆµÈ½Ã›16a·Ã›1a¸¹á›17a˼½·›443aµÇ›16a½ÂµÄÄÆÃÄƽµÈ¹›15a½Â›16aȼ¹
+›818d›1199`¼›16a˼½ÀÇÈ›15aƹ·Ã»Â½Î¹¸á›16aË
+›874d›721`·ÉÆƹ›99aȹÌÈâ
+›874d›846`È›15a·ÃÂ
+›972d›607`5&›24a<A><DLNF›23a=BL:@K>>=`›46a3&-j›13m›23aâ›10m›43a5&j›13m›24aâ›10m›42aó›18a¯¼¹›19aÇÉÁ›19a·›63a¿›19aºÃɸ›19a½Â
+›972d›1826`¼¹·
+›979d›15m›1332`H›154aI
+›1029d›10m›721`µ›16ah5&›626aÈ›16a¸½Çµ»Æ¹¹¸›17a˽ȼ›16aȼµÈ›16aÄƹʽÃÉÇÀÍ
+›1029d›849`ìÀ¹›17a˼¹Â›17aƹµ¸½Â»›17aµ›16aʽÆÈɵÀ›16aºÃÂ
+›1085d›1098`ÈÝÇ›14ah3&-›14aìÀ¹â
+›1085d›721`ƹ·ÃƸ¹¸›15a½Â›15aȼ¹›16aºÃÂ
+›1183d›607`5&›24a=>LB@G›23aLBS>›23a=BL:@K>>=`›46a3&-j›13m›24aå›10m›43a5&j›13m›24aå›10m›42aó›15a¯¼¹›16a¸¹Ç½»Â›16aǽι›15aºÃɸ
+›1190d›15m›1399`H›149aI
+›1240d›10m›721`½Â›12aµ›12ah5&›598aÈ›12a¸½Çµ»Æ¹¹¸›12a˽ȼ›12aȼµÈ›11aÄƹʽÃÉÇÀÍ
+›1240d›890`ìÀ¹›12a˼¹Â›13aƹµ¸½Â»›12aµ›12aʽÆÈɵÀ›11aºÃÂ
+›1296d›1098`ÈÝÇ›14ah3&-›14aìÀ¹â
+›1296d›721`ƹ·ÃƸ¹¸›15a½Â›15aȼ¹›16aºÃÂ
+›1424d›13m›797`m{xuxs›18abq||msq|
+›1424d›607`]¬¨›56al
+›1512d›10m›607`¯¼¹Ç¹›19aÁ¹Çǵ»¹Ç›18a»¹Â¹ÆµÀÀÍ›18a½Â¸½·µÈ¹›18aÇÃÁ¹›18aÄÆöÀ¹Á›18aȼµÈ›18a¸½¸ÂÝÈ›18aÄƹʛ43aÈ›14m›50a_Vs
+›1512d›10m›1932`¹Â›14m›35aR
+›1568d›607`lhXYpq›10m›15aºÆÃÁ›15a»¹Â¹ÆµÈ½Â»›14aµ›16aÊ›368aË›42a¹Æá›15a½È›15aÁ½»¼›192aÈ›15aÃÉÈ
+›1568d›1154`µÀ½¸›15aÃÉÈÄÉÈ›15aìÀ¹å›15a¼Ã›31a¹Ê›209aÈ›14aÂÃÈ›15aÄƽÂ
+›1625d›691`ÃÉ›20a¼µ¸›21aµÂ›292aʽ¸¹¸›20aÂÛ20a¹ÆÆÃÆÇ›19aÛ1a··ÉÆá›22aȼ¹›20a¹Ì½È›20aÇȵÈÉÇ›20aú›19aȼ¹
+›1625d›607`µÇ›20aÍ›208aȽ·½ÄµÈ¹¸Û›34a«ÆÃ
+›1681d›607`ÄÆûƵÁ›13a˽ÀÀ›12a¼µ›22a¹›14aµ›13a^2%5%1)38›154aÉÇ›14aÄ›1a¹ÆÁ½ÈȽ»›13aµ›13a·ÃÁÁµÂ¸›14aÄÆÛ1a·¹¸Éƹ
+›1681d›919`Ê›298aú›13aÏá›13aȼ
+›1737d›607`ÈÛ15a¸¹È¹·È›15aȼµÈ›15aË›364a¹Æ¹›15a½ÇÇɹ¸â
+›1737d›930`µÆ½»›14aÁ¹Çǵ»¹Ç›14aË
+›1849d›607`<:GGHM›23a?BG=›24a?BE>›15m›23a*›14m:+%›15a2/›17a#›15m›2a+›10m›22aó›14m›52a_VlhXYpq›10m›20aºµ½À¹¸›19aÈÛ20aÀÛ1a·µÈ¹›20aȼ¹›21aìÀ¹›20a·ÃÂð
+›1849d›14m›1145`%›127aR
+›1905d›10m›1036`¿›230a¿›666aÍ›14aÇɶð
+›1905d›721`ȵ½Â½Â»›13aȼ¹›14aÞĵ·›22a¹¸›14aÃÆ›14aÉÂĵ·›22a¹¸ß›15aĽ̹À›14aƵÇȹÆÇå›13a½È›14a˽ÀÀ›13aÄÆÛ1a·¹¹¸›15a¶
+›1962d›721`ÇȽÈÉȽ»›13aÇÃÀ½¸›13aÆÉÀ¹Ç›14aºÃÆ›14a¹µ·›834aÈ
+›1962d›1249`¼›14a»ÀÍļâ›19a­¹Á¹¸Íä›20a¤ÂÇȵÀÀ›13aȼ¹›15aƹÅɽǽȹ›13aºÃÂ
+›2018d›880`ÃÉÆ›15aÇÍÇȹÁâ
+›2018d›721`ìÀ¹›15aÛ15aÍ
+›2116d›607`#A:K:<M>KL›23ap›15m*›14m3%73›15m›4a+›10mb›23aL>M›24aH??›23aI:I>K›23ac›24aQ›24al›13m›23aò›10m›19ahh›13mò›10m›18ag›24aR›23al›13m›24aó›10m›26ad›53aó›15a®ÃÁ¹
+›2123d›15m›1556`s›77an
+›2173d›10m›1995`¼›13a·µÂ
+›2173d›721`Ä›1aÃÆȽÛ13aú›14aȼ¹›14aȹÌÈ›13a½Ç›13a½Áµ»¹¸›14aÃÉÈǽ¸¹›13aȼµÈ›13aµÆ¹µ›14aú›13aȼ¹›14aĵě1a¹Æ›15a˼½·
+›2229d›721`¶›1a¹›18aËƽÈȹ›17a¶›202aȹÆâ›27a¯¼¹›13m›18aò›10m›18aÊ›636aÈð
+›2229d›971`Í›18aȼ¹›18aÄƽ›256aµÀɹǛ18a½Â¸½·µÈ¹›17aȼ¹›18aÀ¹ºÈð›18aµÂ¸›18aƽ»¼
+›2286d›721`¼µÂ¸›13aÀ½Á½ÈÇ›12aú›13aȼ¹›13aȹÌÈá›12a˼½ÀÇÈ›13aȼ¹›13m›13aó›10m›15aÊ›150a¹Ç›12aȼ¹›14aÊ›178aÃƸ½ÂµÈ¹
+›2286d›1455`µÀɹ›13a»½Ê›149a¹ÆȽ·µÀ›11a·Ãê
+›2342d›721`ú›10aȼ¹›11a¶µÇ¹À½Â¹å›12aµÀÀ›10aÇÉ·›394a¹Â›11a½Â›11aµ¶ÇÃÀÉȹ›10aĽ̹À›11aÄ›1aÃǽȽÃÂÇ
+›2342d›1145`¼›11a¸½Á¹ÂǽÃÂÇ›11aµÆ¹›10a»½Ê
+›2398d›721`Û14aȼ¹›15aļ›277a¹Æ¼µÄÇ›14aÍ›192aȽ»›13aÇÃÁ¹È¼½Â»›14a½Â›14aÀµÂ¸Ç·µÄ›1a¹
+›2398d›910`Íǽ·µÀ›13aĵ»¹â›20a«›165aÃÉÝƹ›14aÄƽÂ
+›2455d›974`µÇ›14aºÃÆÁµÈȹ¸›14aÈÛ15a¶›1a¹›16aÄƽ›484a¹ÆǵÚ
+›2455d›721`ÁÛ1a¸¹›15aȼµÈ›15aË›463aȹ¸›15a½Â›15aÄ›1aÃÆÈƵ½Èá›13aÃÆ›15aʽ·¹›15aÊ
+›2553d›607`<A><DLNF›23a=H>LGbM›23aF:M<Ak›23a$5)l›13mâ›10m›42aOLh›48a3&-l›13mâ›10m›381aÈ›17a¸¹ìð
+›2553d›1641`ó›17a²¼¹Â›18aȼ¹›18aºÃÂ
+›2560d›15m›1309`H›273aI
+›2609d›10m›1082`µÇ›10aºÃɸ›12a½Â›10aȼ¹›11ah$5)›262a¼¹·›67aµÇ›10aƹ·ÃƸ¹¸å
+›2609d›721`½ȽÛ10a·ÃÁÁµÂ¸›10aË›402aìÀ¹á›12a½ÈÇ›10aÇÉÁ›10a·›63a¿›12aË
+›2666d›721`ȼ½Ç›14aǼÃÉÀ¸›15aµ»Æ¹¹›14a˽ȼ›14aȼµÈ›14aú›14aȼ¹›15ah3&-›454aµÇ›13aËƽÈð
+›2666d›1511`ìÀ¹›15a½ÈǹÀºá›13a¶›1a¹·µÉǹ›16a½È›14aË
+›2722d›1146`µÀɹ›17a˼¹Â›17a¯›18a³›16aÄÆÛ1a·¹Çǹ¸›17aȼ¹›17aÇÃÉÆ·¹â›24a¯¼¹Æ¹ºÃƹ
+›2722d›721`ȹ›16aÉǽ»›17aȼ¹›16aÀµÈȹƛ15aÊ
+›2732d›1389`~
+›2779d›1227`ÃÉÝƹ›13aÈÆͽ»›12aÈÛ14aÉǹ›14a¸½ë¹Æ¹Â›91aÈÇ›13aºÆÃÁ›13aȼÃǹ
+›2779d›721`ȼ½Ç›13a¹ÆÆÃÆ›13a½Â¸½·µÈ¹Ç›13aȼµÈ›14aÍ›523aÈ›13aºÃÂ
+›2835d›845`Í›15a¯›585aÈá›13aÃÆ›14aƹÄÆÛ1a·¹ÇÇ›15aȼ¹›15aÇÃÉÆ·¹›14a˽ȼ
+›2835d›721`ƹµ¸›14a¶›88a³â›20a­¹Á¹¸Íä›19a­¹ÄÀµ·¹›14aȼ¹›15aºÃÂ
+›2845d›909`~
+›2892d›721`¯›17a³â
+›2902d›746`~
+›2990d›607`<A><DLNF›23a=H>LGbM›23aF:M<A›23aBG›24a0+›23a?BE>›243aÈÝÇ›17aÇÉÁ›18a·›63a¿›19aµÇ›18aƹ·ÃÆð
+›2990d›1417`ó›18a¯¼¹›18aºÃ›183a¼¹·
+›3046d›721`¸¹¸›22a½Â›21aȼ¹›22aĵ·›22a¹¸›21aĽ̹À›21aìÀ¹›22a¸½Çµ»Æ¹¹Ç›21a˽ȼ›20aȼµÈ›21a½Â›21aȼ¹›22ah3&-â›38a¯¼½Ç
+›3046d›1024`¿
+›1;1093;1847;2;14!|
+›1;1258;760;2;14!|
+›1;1569;605;2;14!|
+
+
+›462d›12m›604`ÖåáÞáÜ›15aÉÚææÖÜÚæ›10m›970aÓÒ
+›462d›12m›449`Ãôð›45aÓ
+›607d›10m›563`Ë›502aÈ›16aǼÃÉÀ¸›16a¶›1a¹›17aƹ¶É½ÀÈá›16aÉǽ»›15m›16a¤¥¦›55a©ª¦›10m›19aµÂ¸
+›607d›595`ÃÉÀ¸›16aÇÉ»»¹ÇÈ›16aȼµÈ›15aȼ¹›17aºÃ›15m›611a§¨
+›664d›14m›563`TSlhZW›10mâ
+›761d›449`<A><DLNF›23a=H>LGbM›23aF:M<A›23aBG›24a07,›23a?BE>›236aÈÝÇ›13aÇÉÁ›14a·›63a¿›14aµÇ›14aƹ·ÃÆð
+›761d›1284`ó›13a¯¼¹›15aºÃ›175a¼¹·
+›817d›563`¸¹¸›19a½Â›17aȼ¹›18aÉÂĵ·›22a¹¸›19aĽ̹À›17aìÀ¹›18a¸½Çµ»Æ¹¹Ç›17a˽ȼ›17aȼµÈ›17a½Â›18aȼ¹›18ah3&-â›27a¯¼½Ç
+›817d›905`¿
+›874d›563`Ë›502aÈ›16aǼÃÉÀ¸›16a¶›1a¹›17aƹ¶É½ÀÈá›16aÉǽ»›15m›16a¤¥¦›55a©ª¦›10m›19aµÂ¸
+›874d›595`ÃÉÀ¸›16aÇÉ»»¹ÇÈ›16aȼµÈ›15aȼ¹›17aºÃ›15m›611a§¨
+›930d›14m›563`TSlhZ`›10mâ
+›1027d›449`qqq<A><DLNF›23a=H>LGbM›23aF:M<A›23aIK>OBHNL›23a=>?BGBMBHG›21aó›17a~µ·›102aÈ›17a¸¹ì½ð
+›1027d›1682`¼›17aºÃÂ
+›1084d›854`˽·¹›21a½Â›21aȼ¹›21ah$5)›21aìÀ¹å›24aȼ¹›21aÇÉÁ›21a·›63a¿›22aƹ·ÃƸ¹¸›22a½Â›21aȼ¹
+›1084d›563`ȽÛ21aµÄÄ›1a¹µÆÇ›21aÈ›666a¼¹·
+›1140d›563`ǹ·Ã¸›16a¸¹ì½ȽÛ15a¸½Çµ»Æ¹¹Ç›14a˽ȼ›15aȼ¹›15aìÆÇÈ›15aó›15aÉǹ›14m›15aR›57aoi›1ad›10mâ
+›1140d›14m›1551`_Vl
+›1237d›10m›449`=>GHFBG:MHK›23a=H>LGbM›23aF:M<A›23aMA>›23aIK>:F;E>›22aó›22a¯¼¹›23a¸¹ÂÃÁ½ÂµÈÃÆ›22aú›23aȼ¹
+›1294d›563`ƵȽõÀ›20a›61a¶›1a¹Æ›23a˼½·›105a¹Ç›21aȼ¹›22aǽι›22aú›22a¹µ·›80a±¤›22aɽț22a޽›22a¸¹·½Á½ð
+›1294d›763`ÉÁ›176a¼›22a»½Ê›357a¼›22a}
+›1350d›563`·ÆÃÂÇß›14a˼½·›653a¶À¹›13a¸½Çµ»Æ¹¹Ç›14a˽ȼ›13aȼµÈ›14a½Â
+›1350d›789`¼›14a¼µÇ›14a¶›1a¹¹Â›15aƹµ¸›14aºÆÃÁ›14aȼ¹›14aÄ›1aÃÇȵÁ
+›1407d›764`¶À¹›15aó›15aÉǹ›14m›15aR›57aoi›1ad›10mâ
+›1407d›563`ȼ¹›15aÄƹµÁ›14m›243a_Vl
+›1504d›10m›449`qqq=>LB@G›23aLBS>›23a=H>LGbM›23aF:M<A›23aIK>OBHNL›23a=>?BGBMBHG›228aÈÝÇ›10a¸¹ð
+›1504d›1618`ó›10a¯¼¹›11aºÃÂ
+›1560d›1404`È›13a¸½Çµ»Æ¹¹Ç›13a˽ȼ›14aȼ¹›14aìÆÇÈ›13aó
+›1560d›563`ǽ»Â›14aǽι›13a½Â›14aȼ¹›14aǹ·Ã¸›15a¸¹ì½ȽÛ13aú›14aȼ¹›14aºÃÂ
+›1617d›563`Éǹ›14m›16aR›57aoi›1ad›10mâ
+›1617d›14m›674`_Vl
+›1714d›10m›449`$BL<:K=BG@›23a>:KEB>K›23aI:<D>M›23a?HK›23a<A:K:<M>K›13m›23aè›10m›22aó›31a²¼½ÀÇÈ›29aÄÆÛ1a·¹Çǽ»›31aµ
+›1770d›777`È›20aìÀ¹á›21aµ›20aǹ·Ã¸›21a¸¹ì½ȽÛ20aºÃÆ›19aµ›20a·›377aµÇ›19a¹Âð
+›1770d›563`ʽÆÈɵÀ›19aºÃ›667a¼µÆµ·È¹ÆÝÇ›20a»ÀÍļ›20aË
+›1827d›563`·ÃÉ›1183aÍ›18aȼ¹
+›1827d›655`ȹƹ¸ä›24aȼ¹›18aìÆÇÈ›17a¸¹ì½ȽÛ17a˽ÀÀ›16a¶›1a¹›18a¸½Ç·µÆ¸¹¸á›17aµÂ¸›18aƹÄÀµ·¹¸›17a¶
+›1883d›563`ÀµÇÈ›14aù›16aó›14aÉǹ›14m›16a_Slh_Z›10mâ
+›1980d›449`>QMK:›24aCNGD›23a:M›24a>G=›23aH?›24aMA>›23a5&›24a?BE>›22aó›13a®ÃÁ¹›13aɹÌÄ›1a¹·È¹¸›15a¶›125a¹Æ¹›13a¸½Çð
+›1980d›1676`ÍȹǛ14aË
+›2037d›605`Ê›669aÈ›15aÞh5&ß›14aìÀ¹å›15aÈÛ15aÄƹʛ43aÈ›16aȼ½Ç›14a¹ÆÆÃÆ
+›2037d›563`·Ã›22a¹Æ¹¸›15aµºÈ¹Æ›15aȼ¹›16a¹Â¸›16aú›15aµ›15aʽÆÈɵÀ›14aºÃ›382a¹Â
+›2093d›563`ƹ·ÉÆƽ»á›13aÉǹ›14m›14a_Slh_Z›10m›927aÈ
+›2093d›1014`ÈÛ13a·ÃÆƹ·È›13aȼ¹›13a¹ÆÆÃÆ›13aµÂ¸›13aƹËƽȹ›13aȼ¹›13aʽÆÈɵÀ›13aºÃÂ
+›2150d›563`˽ȼ›14m›15a_Zlh_S›10mâ
+›2247d›449`&HGM›15m›24a*›14m-!,%›15m›3a+›10m›23a=H>LGbM›23a<HGM:BG›23a<A:K:<M>K›13m›23aè›10m›525aµÇ
+›2247d›1537`ó›15a©Ã›15a¸¹ì½ȽÛ15aË
+›2303d›563`¹Â·ÃÉ›479a¼µÆµ·È¹Æ›13m›18aè›10m›285aÈ›18aìÀ¹ÝÇ›19aƵÇȹÆÇ
+›2303d›700`ȹƹ¸›20aºÃÆ›18aȼ¹›19a»ÀÍļ›19aú›19a·›221a˼¹Â›20aȼ¹›19aºÃÂ
+›2360d›563`Ë›285a¼µÆµ·È¹Æ›13a˽ÀÀ›13a¶›1a¹›15a½Áµ»¹¸›13a¶›491aÈ›13aú
+›2360d›595`¹Æ¹›14aƹµ¸ä›19aȼ¹›14a·›502aÍ›14aȼ¹›14aµÄÄÆÃÄƽµÈ¹›13aµÁÃÉÂ
+›2416d›563`˼½È¹Çĵ·¹â
+›2513d›449`qqq?HGM›23aG:F>›24a=H>LGbM›23aF:M<A›23aIK>OBHNL›23a=>?BGBMBHG›21aó›10a¯¼¹›12aµÁ¹›11aú›11aȼ¹
+›2570d›563`ºÃ›91a¹Â›15a½Â›15aȼ¹›16aǹ·Ã¸›16a¸¹ì½ȽÛ15a˽ȼ½Â›15aȼ¹›16ah$5)›15aìÀ¹›16a¸½Çµ»Æ¹¹Ç›14a˽ȼ
+›2570d›624`È›15a»½Ê
+›2626d›563`ȼ¹›15aÃƽ»½ÂµÀ›14a¸¹ì½»›15aÛ1a··ÉÆƹ·¹›17aó›14aÉǹ›14m›16aR›57aoi›1ad›10mâ
+›2626d›14m›1375`_Vl
+›2723d›10m›449`F:@GB?B<:MBHG›23a=H>LGbM›22aF:M<A›24aMA>›23aIK>:F;E>›22aó›23a¯¼¹›25aÁµ»Â½ì·µÈ½Ã›23aƹð
+›2780d›563`Ä›1aÃÆȹ¸›18a½Â›19aȼ¹›18aÄ›1aÃÇȵÁ›746a¶À¹›18aó›17aÉǹ
+›2780d›994`¶À¹›17a¸½Çµ»Æ¹¹¸›18a˽ȼ›18aȼµÈ›17a½Â›19aȼ¹›18aÄƹµÁ
+›2836d›14m›563`R›57aoi›1ad›10mâ
+›2836d›14m›595`_Vl
+›2933d›10m›449`-BLLBG@›23aHK›24aNGDGHPG›23aNGBM›23aH?›24aF>:LNK>j›15m›46a*›14m3%73›15m›5a+›10m›22aó›29az›29aɽț30aú›29aÁ¹µÇÉƹ
+›2990d›595`µÇ›14a¹ÌÄ›1a¹·È¹¸á›16a¹½È¼¹Æ›14a˽ȼ½Â›14aµ›15auLI><B:E›14a·ÃÁÁµÂ¸á›14aÃÆ›14aµÇÇÛ1a·½µÈ¹¸›14a˽ȼ
+›2990d›563`Ë
+›3046d›563`ù›15aú›15aȼ¹›15aÅɵÀ½ì¹ÆÇ›15ai3/0t-!1').á›13ai,%&3t-!1').á›13ai(&499›14aÃÆ›15ai5&499â
+
+
+›462d›607`ÓÓ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›982`ȵÆÍ›19aÁ¹Çǵ»¹›19a˽ÀÀ›18a½Â¸½·µÈ¹›18a˼µÈ›15m›19a*›14m›120a!+›15a4-)3›15m›5a+›10m›50aµÇ›19aµÇð
+›607d›721`z›19aÇÉÄÄÀ¹Á¹Â›14m›681a/(82)#›10m›168aË
+›664d›721`ÇÉÁ¹¸›15aÞIM›15aÃÆ›15aLIßâ
+›766d›607`FHK>›23aMA:G›13m›24aí›10m›24aKNE>L›23aHG›23aI:@>k›24a>Q<>LL›23aB@GHK>=›298aȵ½Â¹¸›12aÈÛ1aÃ
+›766d›1624`ó›13az›13aĵ»¹›13a·ÃÂ
+›823d›721`ÁµÂ›1019aÍ›11aȼ¹›11a·ÃÁĽÀ¹ð
+›823d›806`Í›10aǹĵƵȹ›11aÆÉÀ¹Çå›12aȼ¹›11aÄÆûƵÁ›9a½Ç›11aƹÇÈƽ·È¹¸›10aÈÛ10aÐÕÒ×Ó›10a¶
+›873d›14m›1996`}
+›879d›10m›978`È›14m›17a,!7›17a14+%2›10m›74a¹Æ¼µÄÇ›17aÇÃÁ¹È¼½Â»ÝÇ›17aÆÉ›18aµÁÿ›17a½Â›17aµ›18a§›5a¯›17a³
+›879d›721`ȽÁ¹›17a·ÃÂÇȵ›231aâ›27a«
+›893d›2042`~
+›936d›721`IB<MNK>›14a¹Â›184aÈÚ
+›936d›947`ʽÆÃÂÁ¹Â
+›1038d›607`GHM›24a>GHN@A›23aLB@G:MNK>›22a;RM>L›23a:M›24a>G=›24aH?›23a?BE>›23ac›13mí›10md›81aó›15ah$5)›15aìÀ¹Ç›15aµÆ¹
+›1095d›1714`ÍȹǛ10aó›10aÉǹ›14m›10aR›57aoi›1ad›10mâ
+›1095d›721`ÇÉÄÄ›1aÃǹ¸›11aÈÛ10a¹Â¸›11a˽ȼ›9aµÈ›10aÀ¹µÇÈ›9aºÃÉÆ›10aǽ»ÂµÈÉƹ›9aÞÑÑÒß›9a¶›14m›250a_Vl
+›1198d›10m›607`GNF>K:MHK›23a=H>LGbM›23aF:M<A›23aMA>›23aIK>:F;E>›199aÉÁ¹ÆµÈÃÆ›14aú›15aȼ¹›15aƵȽÃð
+›1198d›1489`ó›14a¯¼¹›15aÂ
+›1254d›721`µÀ›12aºÆµ·È½Ã›11a»½Ê›326a¶À¹›12a¸½Çµ»Æ¹¹Ç›12a˽ȼ›11aȼµÈ›12aÄƹʽÃÉÇÀÍ›12aƹµ¸
+›1254d›1018`¹Â›12a½Â›12aȼ¹›12aÄ›1aÃÇȵÁ
+›1311d›1030`¶À¹›14aó›15aÉǹ›14m›16aR›57aoi›1ad›10mâ
+›1311d›721`ºÆÃÁ›14aȼ¹›16aÄƹµÁ›14m›243a_Vl
+›1413d›10m›607`i/1)%.3!3)/.›22aFNLM›24a;>›23a0/131!)3›23aHK›24a,!.$2#!0%k›21a:LLNFBG@›23a0/131!)3›16aò
+›1470d›721`¯¼¹›22ai/1)%.3!3)/.›234aµÇ›21a»½Ê›294aµÀɹå›24aȼ½Ç›22aǼÃÉÀ¸
+›1470d›1129`ÅɵÀ½ì¹Æ›21aË›120a¹Â›21aµÂ›22a½ÀÀ¹»µÀ›20aÊ
+›1526d›789`¹Æ›15a¼µÄÄ›1a¹Âá›16aÉÂÀ¹ÇÇ›15aȼ¹›15a·ÃÁÁµÂ¸›15a¸¹ì½ȽÛ15aìÀ¹›15a¼µÇ›15a¶›1a¹¹Â›16a·ÃÆÆÉÄȹ¸â
+›1526d›721`¹Ê
+›1629d›607`0:@>›23a=>>I>K›24aMA:G›23a3>7›23aK>IHKM>=›23a;R›13m›24aó›10m›2aIM›354a¹Æ¹›19aÄ›1aÃǽȽù¸
+›1629d›1489`ó›19a|¼µÆµ·È¹ÆÇ›19aË
+›1685d›922`Ë›16aȼ¹›16aĵ»¹›17aÀÛ31a¹Æ›14aȼµÂ›17a¯›17a³›16a¼µ¸›17aƹ·ÃƸ¹¸›17a½Â›16aȼ¹›16ah$5)›16aìÀ¹â
+›1685d›721`ºÉÆȼ¹Æ›16a¸Ã›295aË
+›1695d›1435`~
+›1742d›721`¯¼½Ç›15a½ÇÂÝÈ›15aµÂ›15a¹ÆÆÃÆá›15aÉÂÀ¹ÇÇ›16aµ··ÃÁĵ½¹¸›15a¶›433a¼µÆµ·ð
+›1742d›1544`Í›16aµÂ›15a½Â¸½·µÈ½Ã›15aȼµÈ›15a·
+›1798d›842`¹Æ¹›15aǹț14aÃë›15aȼ¹›15aĵě1a¹Æâ›20a®¹¹›16a¸¹Ç·Æ½ÄȽÛ15aú›15aȼ¹›15ai5&499›14aÅɵÀ½ì¹Æâ
+›1798d›721`ȹÆÇ›15aË
+›1901d›607`0:@>›23aPB=>K›24aMA:G›23a3>7›23aK>IHKM>=›23a;R›13m›24aò›10mIM›355a¹Æ¹›20a½Áµ»¹¸›20a¶›1a¹ð
+›1901d›1467`ó›20a|¼µÆµ·È¹ÆÇ›19aË
+›1958d›721`Í›243aÈð¼µÂ¸›15aÁµÆ»½Â›14aȼµÈ›14a¯›18a³›15a¼µ¸›15aƹ·ÃƸ¹¸›16a½Â›15aȼ¹›15ah$5)â›14a¯¼½Ç
+›1958d›744`ø›15aȼ¹›15aƽ»¼
+›1968d›1411`~
+›2014d›721`½ÇÂÝÈ›19aµÂ›21a¹ÆÆÃÆá›21aÉÂÀ¹ÇÇ›20aµ··ÃÁĵ½¹¸›21a¶›452a¼µÆµ·È¹ÆÇ
+›2014d›1466`Í›20aµÂ›21a½Â¸½·µÈ½Ã›19aȼµÈ›20a·
+›2070d›753`¹Æ¹›15aǹț15aÃë›14aȼ¹›15aĵě1a¹Æâ›21a®¹¹›16a¸¹Ç·Æ½ÄȽÛ14aú›15aȼ¹›15ai(&499›15aÅɵÀ½ì¹Æâ
+›2070d›721`Ë
+›2173d›607`0BQ>E›23aPB=MA›24a=BL<K>I:G<Rk›22a?HGM›15m›46a*›14m-!,%›15m›3a+›10m›21a<A:K›13m›22aè›10m›21aqqq<HFINM>=›22aPB=MAj
+›2230d›13m›721`ç›10m›17ak›24a:<MN:E›23aPB=MAj›13m›47aç›10m›695a¼µÆµ·È¹Æá
+›2230d›1270`ó›19a¯¼¹›20a˽¸È¼›19aú›19aȼ¹›19a½Â¸½·µÈ¹¸›20a·
+›2237d›15m›764`m›451al
+›2286d›10m›721`½Â›15aĽ̹ÀÇá›15a¸½ë¹Æ¹¸›16aºÆÃÁ›15aȼµÈ›14a·ÃÁÄÉȹ¸›16aºÆÃÁ›15aȼ¹›16a¯›18a³›15aºÃ›234aÍ
+›2286d›1843`È›15aÁ¹Èƽ·Ç›15aÞ¶
+›2296d›1707`~
+›2343d›721`µÈ›18aÀ¹µÇÈ›17aÈ›31aÛ17aĽ̹ÀÇßâ›29a¯¼¹›18aµ·ÈɵÀ›18a˽¸È¼›18a½Ç›18aµÀË›21aÍÇ›16aÉǹ¸›19a˼¹Â›19a½Áµ»½Â»
+›2343d›906`Ë›697aµ
+›2399d›721`»ÀÍļÇâ
+›2502d›607`0+›24a?HGM›23aIBQ>EL›23aGHGqLJN:K>›21aó›16a¯¼¹›12m›16aÖæã›1aÚØç›17aåÖçÞâ›10m›167a¼µÆµ·È¹ÆÇ›16a½Â›15aȼ¹
+›2502d›1635`ú›16aȼ¹›16a·
+›2558d›788`¿›264aµÇ›11aÂÃÈ›11aÐäЛ11aó›12a˽ÀÀ›10aÄÆöµ¶ÀÍ›12aÄÆÛ1a¸É·¹›12a¸½ÇÈÃÆȹ¸›11a»ÀÍļÇá
+›2558d›721`ĵ·›22a¹¸›12aĽ̹À›11aìÀ¹›12aË
+›2615d›721`ǽ·¹›15aȼ¹›15a§©ÏÒ›16aÄƽ›252aÈ›14a˽ȼ›15aÇÅɵƹ›15aĽ̹ÀÇâ
+›2615d›1114`ȹƛ14a¸Ã›1a¹Ç›16aÄƽÂ
+›2717d›607`qqqL<:E>=›23aLBS>›23a=H>LGbM›23aF:M<A›23aIK>OBHNL›23a=>?BGBMBHG›21aó›35a¯¼¹›36aǹ·Ã¸
+›2774d›1116`È›15aÄÆÛ308aÈ›15aÇ·µÀ¹¸›15aǽι›16aºÆÃÁ›15aȼµÈ›16a½Â›15aȼ¹
+›2774d›721`¸¹ì½ȽÛ16aú›15aȼ¹›16aºÃ›97aʽ¸¹¸›16aµ›16a¸½ë¹Æ¹Â
+›2830d›721`ìÆÇÈ›15a¸¹ì½ȽÛ15aó›14aÉǹ›14m›16aR›57aoi›1ad›10mâ
+›2830d›14m›1188`_Vl
+›2933d›10m›607`MA>K>›23a:K>›24aK>:EER›13m›23aí›10m›24aI:@>Lg›23aGHM›13m›23aî›10m›511a¶À¹›15a·Àµ½Á¹¸
+›2933d›1389`ó›16azÀȼÃÉ»¼›15aȼ¹›17aÄ›1aÃÇȵÁ
+›2990d›970`¹Æ¹›13m›16aî›10m›17aĵ»¹Ç›16a½Â›16aȼ¹›17a¸Ã›1a·ÉÁ¹Â›196a¹Æ¹›16aƹµÀÀÍ›13m›15aí›10m›16aó›16aÉǹ
+›2990d›721`ȼµÈ›15aȼ¹Æ¹›17aË›552aÈá›16aȼ¹Æ¹›17aË
+›3046d›14m›721`R›57aoi›1ad›10mâ
+›3046d›14m›753`_Vl
+›1;479;1918;152;8!|
+›1;1097;877;2;14!|
+
+
+›462d›12m›449`Ãôñ›45aÇáÛâåàÖçÞâáÖß›14aÉÚææÖÜÚæ›10m›869aÓÔ
+›607d›449`qqqMABL›23a?HGM›24aP:L›23a:EK>:=R›23a=>?BG>=›576aÈ›12a¸¹ì½ð
+›607d›1236`ó›12az›12aÇÄÉƽÃÉÇ›12aµ¸¸½È½ÃµÀ›11aºÃÂ
+›664d›563`ȽÛ15aË›191aȹƹ¸›16a½Â›15aȼ¹›15ah$5)›15aìÀ¹›15aó›15aÉǹ›14m›15aR›57aoi›1ad›10mâ
+›664d›689`µÇ›14a¹Â·ÃÉ›14m›602a_Vl
+›770d›10m›449`qqqMABL›23a?HGM›24aP:LGbM›23aEH:=>=›23a;>?HK>›598a¶À¹á›14aµ
+›770d›1260`ó›14a²¼¹Â›15aƹµ¸½Â»›14aȼ¹›15aÄ›1aÃÇȵÁ
+›827d›563`¸¹ì½ȽÛ13aË›190aȹƹ¸›14aºÃÆ›13aµ›13aºÃ›159aµÇÂÝÈ›12aÄƹʽÃÉÇÀÍ›13a¸¹ì¹¸›15a½Â
+›827d›795`µÇ›13a¹Â·ÃÉ›279aÈ›13aȼµÈ›13aË
+›883d›563`ȼ¹›15a¶›1aÛ1a¸Í›16aú›15aȼ¹›15ah$5)›15aìÀ¹›15aó›15aÉǹ›14m›15aR›57aoi›1ad›10mâ
+›883d›14m›1241`_Vl
+›990d›10m›449`5&›24a=:M:›23aGHM›24a:›24aFNEMBIE>›22aH?›24aX›24a;RM>L›301aÈ›14aìÀ¹Ç›15aÞh5&ß›14aµÆ¹›15aÇÉÄð
+›990d›1260`ó›14a±½ÆÈɵÀ›14aºÃÂ
+›1046d›563`Ä›1aÃǹ¸›16aÈÛ14a¶›1a¹›16aÇÃÁ¹›15aÁ›254aÍȹǛ15aÀû›14aó›15aÉǹ›14m›15a_Slh_Z›10mâ
+›1046d›959`ÉÀȽÄÀ¹›14aú›15aÓ›15a¶
+›1152d›449`5&›24a?BE>›23a>G=>=›24aPBMAHNM›22aIHLM:F;E>›22aó›22a²¼½ÀÇÈ›22aƹµ¸½Â»›23a»ÀÍļ›23a¸¹ì½ȽÃÂÇ
+›1209d›924`È›17aìÀ¹á›17aȼ¹›14m›39a.23›10m›263aµÇ›16aÁ¹È›18aɹÌÄ›1a¹·È¹¸ÀÍ›18aó
+›1209d›563`ºÆÃÁ›17aµ›17aʽÆÈɵÀ›16aºÃ›14m›203a/›10m›76a·ÃÁÁµÂ¸›18aË
+›1265d›563`Éǹ›14m›16a_Slh_Z›10mâ
+›1405d›13m›449`]¬©›56a`xry{wm}uyxmv›18abq||msq|
+›1497d›10m›911`ʽ¸¹›10aȼ¹›12aÉǹƛ11a˽ȼ›11aµÂ›11a½Â¸½·µÈ½Ã›10aú›11aȼ¹›11aÄÆûƹÇÇ›11aú›11aȼ¹
+›1497d›449`¯¼¹Ç¹›12aµÆ¹›11aÃÉÈÄÉÈ›11aÈÛ11aÄÆÃ
+›1554d›449`ÄÆÛ1a·¹ÇÇ›18aú›17aÈƵÂÇÀµÈ½Â»›15aȼ¹›17ah$5)›129aÈÛ16aµÂ›17ah,.W›17aìÀ¹â›26a¤º›17aÂÛ17aÃȼ¹Æ›17aÁ¹Çǵ»¹Ç
+›1554d›1089`ìÀ¹›17a½Â
+›1610d›720`ÃÉ›20a·µÂ›20a¶›1a¹›20aµÇÇÉƹ¸›20aȼµÈ›19aȼ¹›20aÄƽ›104a¹ÆǽÛ19a˽ÀÀ›19aµ··ÃƸ›19a˽ȼ
+›1610d›449`µÆ¹›20aÃÉÈÄÉÈá›20aÍ›654aȹ¸›19aÊ
+›1667d›449`˼µÈ›17a¯›17a³›17a½Â›962aÈ›16aÂÃÈ›16a¶›1a¹›17a˼µÈ
+›1667d›703`ȹ¸¹¸›17aÈÛ16aÄÉÈ›17aÛ17aȼ¹›17aĵě1a¹Æ›17aÞµÀȼÃÉ»¼›16aȼ½Ç›16aÁ½»¼
+›1677d›590`~
+›1723d›14m›449`8.4›10m›57aȹ¸¹¸Ûß
+›1723d›538`½Â
+›1783d›591`ʽ¸¹¸›16aȼµÈ›15aÂÛ16aË›535a¹Æ¹›16a½ÇÇɹ¸á›16aȼ¹›16aÄÆûƵÁÝÇ
+›1783d›520`«ÆÛ317aµÆ½»›15aÃÆ›15a¹ÆÆÃÆ›16aÁ¹Çǵ»¹Ç›15aË
+›1839d›449`¹Ì½È›19aÇȵÈÉÇ›19a˽ÀÀ›18a¼µ›22a¹›19aµ›19a^2%5%1)38›18aú›19a22^t24##%22›151aÉÇ›20aÄ›1a¹ÆÁ½ÈȽ»›18aµ
+›1839d›819`Ê›652aÞÐßá›19aȼ
+›1896d›449`·ÃÁÁµÂ¸›16aÄÆÛ1a·¹¸Éƹ›16aÈÛ14a¶›1a¹›16a·ÃÂ츹›226aµÆ½»›14aÃÆ›15a¹ÆÆÃÆÇ›15aÛ1a··ÉÆƹ¸â
+›1896d›1147`È›16aȼµÈ›14aÂÛ15aË
+›2018d›449`c›15m*›14m:+%›16a2/›17a#›15m›1a+›13mö›8aö›8aö›10m›6ad›244a¹Æ›17aȼ¹›16ah$5)›16aìÀ¹á›17aÃÆ›16aµ›16aìÀ¹›16aÇÄ›1a¹·½ì¹¸›18aµÇ›16aµ›16a»ÆµÄ¼½·Ç
+›2018d›14m›606`%›10m›145aó›16a²¼¹Â¹Ê
+›2074d›563`½Â·ÀÉǽÃÂá›23a½Ç›21aÃÄ›1a¹Â¹¸á›25aµ›21aÀ¹ºÈ›22aĵƹ›428az³ã­¨®›21aìÀ¹
+›2074d›1244`ȼ¹Ç½Ç›21aµÂ¸›22aȼ¹›22aºÉÀÀ›22a±
+›2131d›563`ÇÄ›1a¹·½ì·µÈ½Ã›21a½Ç›21aƹě1aÃÆȹ¸›21aÛ22aȼ¹›21aȹÆÁ½ÂµÀå›23a˼¹Â›21aȼ¹›22aìÀ¹›21a½Ç›21a·ÀÃǹ¸á›22aµ
+›2187d›661`¼½Â»›14aƽ»¼›141aȼ¹Ç½Ç›15a½Ç›15a¸½ÇÄÀµ›22a¹¸â
+›2187d›563`ÁµÈ·›177aÈ›14aĵƹ›288aÍ
+›2268d›563`¤Â›18aȼ¹›17aÀû›17aÞh380›931aÍ›17aǹÀºð
+›2268d›892`ß›16aìÀ¹á›17aȼ¹›17aìÀ¹›18aÇÄ›1a¹·½ì·µÈ½ÃÂÇ›17aµÆ¹›17aµ··ÃÁĵ½¹¸›17a¶
+›2325d›563`¹ÌÄÀµÂµÈÃÆÍ›14aȹÌÈâ
+›2431d›449`n›15m*›14m›21a!'%›17a-.›15m›2a+›10mo›23aó›17azÇ›14m›49a_VlhXYpq›10m›17aÇȵÆÈÇ›16aÈÛ17aÄÆÛ1a·¹ÇÇ›18aµ›17aĵ»¹á›18aµ›17aÀ¹ºÈ›17a¶Æµ·›22a¹È›17aµÂ¸
+›2431d›14m›491`/›328aR›10m›918a¿
+›2488d›772`ÉÁ›186a¼›15aÁµ›488aȹ»¹ÆÇá›14aǹĵƵȹ¸
+›2488d›563`ȼ¹›15aĵ»¹›16a›61a¶›1a¹Æ›15aÞ˼½·›99aÍ›15a·ÃÂǽÇÈ›14aú›15aµ›15aǹƽ¹Ç›15aú›15a½Â
+›2544d›563`¶›374aÍ›766aȹƹ¸á›15aȼ¹
+›2544d›587`Í›14aÄ›1a¹Æ½Ã›1a¸Çß›14a½Ç›14a¸½ÇÄÀµ›22a¹¸å›14a˼¹Â›15aȼ¹›14a¹Â¸›15aú›14aȼ¹›14aĵ»¹›14a½Ç›14a¹Â·ÃÉÂ
+›2601d›563`ÁµÈ·›177aÈ›14a¶Æµ·›22a¹È›15a½Ç›14a¸½ÇÄÀµ›22a¹¸â
+›2601d›661`¼½Â»›14aƽ»¼›116a¿›213aÍ
+›2691d›15m›1164`JN
+›2707d›10m›449`&BG=BG@›23aLM:KMBG@›23aI:@>hhh?HNG=›72aó›13azºÈ¹Æ›13aȼ¹›14aȽÈÀ¹›13a¼µÇ›13a¶›1a¹¹Â›15a¸½ÇÄÀµ›22a¹¸á
+›2707d›1864`Í
+›2764d›14m›595`_VlhXYpq›10m›825aȹ¸å›21aµÈ›19aȼ¹›20aǵÁ¹
+›2764d›14m›563`R›10m›203aÇȵÆÈÇ›18aÀÛ1a·µÈ½Â»›18aȼ¹›20aìÆÇÈ›19aĵ»¹›20aÈÛ19a¶›1a¹›20aÄƽÂ
+›2820d›772`ÃÆ¿Ç›21aÃÉÈ›22a½º›22aµÂ›682aȹÆÇÄ›1a¹Æǹ¸
+›2820d›563`ȽÁ¹á›23a½È›21aË›287aÍ›22a¶ÀµÂ¿›22aĵ»¹Ç›22a˽ÀÀ›20a¹¹¸›23aÈÛ22a¶›1a¹›23a½Â
+›2877d›563`¸Éƽ»›15aÄƽ›666a¹›15aµ›14aǽ»Â½ì·µÂ›164aÈ›14aú
+›2877d›787`Ƚ»â›19a®½Â·¹›15aȼ½Ç›14aÃÄ›1a¹ÆµÈ½Ã›14a·µÂ›15aȵ¿›255aÈ›14aµÁÃÉÂ
+›2933d›1064`Èá›18aȼ¹›18aìÆÇÈ›17aĵÆÈ›17aú›17aȼ½Ç›16aÁ¹Çǵ»¹›18a½Ç›17a¸½ÇÄÀµ›22a¹¸
+›2933d›563`ȽÁ¹›17aÛ17aµ›17aÀµÆ»¹›17a¸Ã›1a·ÉÁ¹Â›812aÍ
+›2990d›920`ÃÂÝÈ›13aȼ½Â¿›14aȼµÈ›13aȼ¹›15aÄÆûƵÁ›13a¼µÇ›14a¸½¹¸å›14aȼ¹›15aé?HNG=Ý›12a½Ç
+›2990d›563`ÇÛ14aȼµÈ›13aȼ¹›15aÉǹƛ14aË
+›3046d›563`¸½ÇÄÀµ›22a¹¸›15a˼¹Â›15aȼ½Ç›15aÄÆÛ1a·¹Çǽ»›15a½Ç›15a·ÃÁÄÀ¹È¹¸â
+›3046d›679`Í
+›1;2064;2635;72;8!|
+›1;580;2429;2;14!|
+›1;553;2016;2;14!|
+
+
+›462d›607`ÓÕ›12m›756aËΛ13a¿Ê›15aÓ›354aÅÃÏ
+›462d›1234`Û46aÃÎΛ241a¿ÎÊÇÊÅ›15aÉÃÏÏ¿
+›607d›10m›607`&HGM›15m›23a*›14m-!,%›15m›3a+›10m›23açc:M›13m›23aí›10madè›11aEH:=>=›23aPBMA›13m›12aî›10m›12a;RM>L›23aH?›24aK:LM>KL›23ac›13mí›10m›12a<A:K:<Mq
+›648d›15m›817`JO
+›664d›10m›721`>KLd›49aó›12a¯¼¹›13aÇÄ›1a¹·½ì¹¸›13aºÃ›520aËÂá›13a½º›12aÂÃÈ›12aÐÏÏÜß
+›664d›1256`È›12a޵ț12aȼ¹›12aÁµ»Â½ì·µÈ½Ã›11aǼÃ
+›720d›721`¼µÇ›17a¶›1a¹¹Â›19a½Â·Àɸ¹¸›18a½Â›18aȼ¹›18a¸Ã›264aÈÇå›18a½º›13m›17aî›10m›172a¹ÆÍ›18aÇÁµÀÀá›16a½È
+›720d›1282`ËÂÀõ¸¹¸›17aºÃ›155aǹ¹ÁÇ›17aÊ
+›777d›721`Áµ›659aÈ›11aË›412aËÂÀõ¸¹¸
+›777d›781`Í›11a¶›1a¹›13a¶›1a¹·µÉǹ›13aȼ¹›13a»ÀÍļǛ11aú›12aȼ¹›13aºÃ›60a¹Æ¹›12aÈÛ1aÛ11aÀµÆ»¹›12aÈÛ11a¶›1a¹›13a¸Ã
+›833d›1629`¹Æ›15aȼ¹Í›15aµÄÄ›1a¹µÆâ
+›833d›721`µÂ¸›15a¼¹Â·¹›16a˽ÀÀ›14a¶›1a¹›16a½Áµ»¹¸›15a½Â¸½Ê½¸ÉµÀÀÍ›14a˼¹Æ¹Ê
+›912d›15m›2021`JP
+›928d›10m›607`&HGM›15m›23a*›14m-!,%›15m›3a+›10m›23açc:M›13m›23aí›10madè›9aNG:O:BE:;E>k›23aIKBGMBG@›22aKNE>L›23a?HK›24a@ERIAL›47aó
+›984d›721`¯¼¹›23aÇÄ›1a¹·½ì¹¸›24aºÃ›72aµÇÂÝÈ›21aµ›20aµ½Àµ¶À¹›22aµÈ›23aȼ¹›23aƹÅɹÇȹ¸›23aÁµ»Â½ì·µÈ½ÃÂå
+›984d›1074`È›23aË›139aÊ
+›1040d›721`·›452aÈ›15a˽ÀÀ›13a¶›1a¹›16a½Áµ»¹¸›14a¶›118aȽ»›13aÇÃÀ½¸›15aÆÉÀ¹Ç›14aú›15aǽι
+›1040d›740`¼µÆµ·È¹ÆÇ›14aºÆÃÁ›14aȼ½Ç›14aºÃ›359aÍ›15aÄƽÂ
+›1097d›721`¸¹È¹ÆÁ½Â¹¸›20aºÆÃÁ›19aȼ¹›19a¯›18a³›20aºÃ›427aá›20aµ›19aé<:GGHM›23a?BG=
+›1097d›1323`È›19aÁ¹Èƽ·Çâ›32a«Æ¹Ê½ÃÉÇÀÍ
+›1107d›1182`~
+›1153d›721`?BE>Ý›14aË›273aÊ›495aÈâ
+›1153d›876`µÆ½»›14a˽ÀÀ›14a¼µ›22a¹›15a¶›1a¹¹Â›16a½ÇÇɹ¸›15aºÃÆ›15aȼ½Ç›15aºÃÂ
+›1232d›15m›1358`KG
+›1248d›10m›607`&HGM›15m›23a*›14m-!,%›15m›3a+›10m›23açc:M›13m›23aí›10madè›15aBL›23aOBKMN:E›52aó›15a¯¼¹›16aÇÄ›1a¹·½ì¹¸›17aºÃ›64aµÇ›15aµ›15aʽÆÈɵÀ
+›1248d›1810`È›15aË
+›1304d›721`ùå›14aȼ½Ç›13aÁµ›648aÈÇ›13aÃȼ¹Æ›14aȼµÂ›14aȼÃǹ›14aÇÄ›1a¹·ð
+›1304d›963`Í›14aƹÇÉÀÈ›13a½Â›14aȼ¹›14aÀõ¸½Â»›13aú›14aƹµÀ›13aºÃÂ
+›1361d›843`Í›15a¯›18a³›15a˼¹Â›16aȼ¹›15ah$5)›120aµÇ›14a»¹Â¹ÆµÈ¹¸â
+›1361d›721`½ì¹¸›15a¶›446aìÀ¹›15aË
+›1371d›907`~
+›1439d›15m›1537`KH
+›1455d›10m›607`':MA>KBG@›23a?HGM›23aNL:@>›23aLM:MBLMB<Lhhh=HG>›73aó›14aªÂ·¹›15aȼ¹›15aÇȵÆȽ»›13aĵ»¹
+›1512d›721`¼µÇ›19a¶›1a¹¹Â›20aºÃɸá›14m›51a_VlhXYpq›10m›102a¹Ç›18aù›19aƵĽ¸›19aĵÇÇ›19aȼÆÃÉ»¼›18aȼ¹›19ah$5)
+›1512d›14m›1061`R›10m›202aÁµ¿
+›1568d›721`ìÀ¹á›13aÂÃȽ»›13a˼½·›522a¼›13aºÃ›338aËÇ›11aÉÇ
+›1568d›1035`¼›13a»ÀÍļǛ13aµÆ¹›13aÉǹ¸›14aºÆÃÁ›13a¹µ·›98aÈâ›19a}ý»›12aȼ½Ç›13aµÀÀÃ
+›1625d›721`ÈÛ10aǵ›22a¹›11aȽÁ¹›11aµÂ¸›11aÇĵ·¹›12aȼµÈ›10aË›384aµÇȹ¸›11a¶›81aËÂÀõ¸½Â»
+›1625d›812`Ê›458aÃÉÀ¸›11aÃȼ¹Æ˽ǹ›10a¶›1a¹›12aË›138aÍ›11a¸Ã
+›1681d›721`ȼ¹›11a˼ÃÀ¹›11aú›10aµ›11aºÃ›236a¹›10aµ›11aǽ»Â½ì·µÂ›160aÈ›11aú›10aȽÁ¹á›11aÇÛ11aȼ¹›11aìÆÇÈ
+›1681d›1062`Èâ›18a¤È›11a·µÂ›11aȵ¿›247aÈ›10aµÁÃÉÂ
+›1738d›721`ĵÆÈ›15aú›16aȼ½Ç›15aÁ¹Çǵ»¹›16a½Ç›16aËƽÈȹ›15aÈÛ15aȼ¹›16a¸½ÇÄÀµ›19aá›15aµÂ¸›17aȼ¹Â›16aµÂ›16aµ¸¸½È½ÃµÀ
+›1738d›1596`Í
+›1794d›721`Ä›1a¹Æ½Ã›1a¸›16a˽ÀÀ›15a¶›1a¹›17a¸½ÇÄÀµ›22a¹¸›16aµºÈ¹Æ›16aÄÆÛ1a·¹Çǽ»›16a¹Ê›336aÉÇ›17a»½Ê½Â»
+›1794d›1129`Í›432a¹ÆÍ›16aȹ›16aĵ»¹Çá›16aȼ
+›1851d›721`ȼ¹›15aÉǹƛ15aµÂ›16aµÇÇÉƵ·¹›15aȼµÈ›14aȼ¹›16aÄÆûƵÁ›14a¼µÇÂÝÈ›14a·ÃÀÀµÄǹ¸â
+›1945d›607`1>:=BG@›23a?KHF›23a?BE>›15m›24a*›14m:+%›15a2/›17a#›15m›2a+›10m›22aó›11a¯¼½Ç›11aÁ¹Çǵ»¹›10a½Ç›11aËƽÈȹ›11aÈÛ10aȼ¹›11aÀû›11aÞh380ß
+›1945d›14m›1169`%
+›2002d›10m›878`á›19aµÂ¸›19aƹ·ÃƸǛ19aȼ¹›18aºÉÀÀ›18aìÀ¹›19aÇÄ›1a¹·½ì·µÈ½Ã›19aú›18aȼ¹›19ah$5)›18aìÀ¹›18a¶›1a¹½Â»
+›2002d›721`ìÀ¹›18aÃÂÀÍ
+›2058d›721`ÄÆÛ1a·¹Çǹ¸â
+›2153d›607`2BQ>E›23a@K:IAB<L›23aBG<EN=>=›23a?KHFj›15m›47a*›14m:+%›15a2/›17a#›15m›2a+›10m›22aó›21a¯¼½Ç›21a½Ç›20aƹ·ÃƸ¹¸›22a½Â›20aȼ¹
+›2153d›14m›1479`%
+›2209d›10m›721`Àû›19aÞh380ß›20aìÀ¹›20a˼¹Â¹Ê›361aÍ›20aµ›20auLI><B:EvEGTWjLBQ>Ew
+›2209d›1175`¹Æ›21aµ›20aìÀ¹›20a½Ç›20aƹµ¸›21a¶
+›2266d›721`·ÃÁÁµÂ¸â
+›2360d›607`3ABL›23aBL›24a$5)MH,.TWg›23a5:Qi5-2›22a5>KLBHG›13m›23aæ›10m›614aÈ
+›2360d›1502`ó›13a¯¼½Ç›14a¶µÂ¹ƛ15aµÂÂÃÉ·¹Á¹Â
+›2417d›721`½¸¹Â›216a¹ÆǽÛ18aú›18aȼ¹›19aÄÆûƵÁá›18a¶›1aÃȼ›19aÛ18aȼ¹›19aǷƹ¹Â›19aµÂ¸›19a½Â›18aȼ¹
+›2417d›803`Ƚì¹Ç›18aȼ¹›19aÊ
+›2473d›721`Àû›14aÞh380ß›14aìÀ¹â
+›2568d›607`3HM:E›23aH?›13m›24aî›10m›24a;RM>L›23aH?›24aK:LM>KL›23a=HPGEH:=>=›331aÈÇ›16a¼µ›22a¹›17a¶›1a¹¹Â
+›2568d›1540`ó›17azºÈ¹Æ›17aµÀÀ›16aºÃ›98aÊ
+›2624d›721`¸Ã›545a¹Ç›17aµÂ›18a½Â¸½·µÈ½Ã›17aú›17aȼ¹›18aÈÃȵÀ›17a›61a¶›1a¹Æ›18aú
+›2624d›768`ËÂÀõ¸¹¸á›18aȼ½Ç›17aÁ¹Çǵ»¹›18a»½Ê›606aÉÁ
+›2681d›745`ÍȹǛ17aȼµÈ›17a˽ÀÀ›17a¶›1a¹›18aÛ1a··ÉĽ¹¸›19a¶›169aËÂÀõ¸¹¸›17aºÃ›269aȹÆÝÇ
+›2681d›721`¶›565aÍ›18aȼ¹›18a¸Ã›264aÈÇ›17a½Â›18aȼ¹›18aÄƽÂ
+›2737d›721`Á¹ÁÃÆÍ›829aÊ›298aá›15aµÇ
+›2737d›878`â›21a¤È›15a·µÂ›16aȼ¹Æ¹ºÃƹ›15a¶›1a¹›16a·ÃÁĵƹ¸›16a˽ȼ›15aȼ¹›16aµ›20aµ½Àµ¶À¹›14aÁ¹ÁÃÆÍ
+›2794d›721`ƹě1aÃÆȹ¸›19aÛ19aµ›18aÄƽ›439aèß›18aÈÛ18a¸¹È¹ÆÁ½Â¹›19a˼¹È¼¹Æ›19aȼ¹
+›2794d›1096`ȹƛ19aȹÇÈ›18aǼ¹¹È›19aÞǹ¹›19açÐÏ
+›2850d›721`ƹÇÉÀȵ›316aȹ¸›11a·ÃÆƹ·ÈÀÍ›11aó›11a½º›12aȼ¹Æ¹›12a½Ç›11a½ÂÇÉî·½¹Â›185aá
+›2850d›880`È›10aìÀ¹›12a·µÂ›12a¶›1a¹›13aÄƽ›705aÈ›11aÁ¹ÁÃÆÍ
+›2906d›721`ȼ¹Â›16aÄÆÛ1a·¹ÇÇ›16aÍ›256aÈ›17a½Â›15aÇÁµÀÀ¹Æ›15aǹ·È½ÃÂÇâ›12m›21ak¹a¹›10m›276aÈ
+›2906d›1007`ÃÉÆ›15a¸Ã›1a·ÉÁ¹Â›557a¤º›17aµ›15a¸Ã›1a·ÉÁ¹Â
+›2963d›721`·Ã›154aÍ›11aĵ»¹Ç›12aȼµÈ›11aµÆ¹›11aÄƽ›568aËÂÀõ¸¹¸
+›2963d›788`ȵ½ÂÇ›11aµÂ›402aȹ¸›12a½Â›12aÀµÂ¸Ç·µÄ›1a¹›12aÁÛ1a¸¹á›12aµÀÀ›11a¸Ã
+›3030d›14m›644`àÝ
+›3046d›11m›676`n¬¬›12a´¨¥³¥›14a­¥³³¡§¥³›13a¡²¥›13a³µ°°²¥³³¥¤›15a©¦›12a´¨¥›13m›14aS,-3%/›38a0%›11m›10a±µ¡¬©Í¥²›14a©³›12aµ³¥¤Æ
+›3046d›13m›1478`"-
+›1;479;3014;32;8!|
+›1;607;3001;2;598!|
+›1;1427;2151;2;14!|
+›1;1117;1943;2;14!|
+›1;479;1390;65;8!|
+›1;479;1208;40;8!|
+›1;479;888;40;8!|
+›1;479;624;40;8!|
+
+
+›462d›12m›449`Ãôñ›45aÇáÛâåàÖçÞâáÖß›14aÉÚææÖÜÚæ›10m›869aÓÖ
+›607d›624`ÈÇ›11a˽ÀÀ›10a¶›1a¹›12aƹÃƽ¹Â›588aÍ›10a¶›189aȹÆä›17aȼ½Ç
+›607d›563`ºÃ›322aȹ¸›11aÈÛ11aȼµÈ›11aÁÛ1a¸¹›12aµÉÈÃÁµÈ½·µÀÀ›57aÍ›11aȼ¹›12aÄƽÂ
+›664d›563`·µÂ›15aƹÇÉÀÈ›15a½Â›15aÛ22a¹ÆíÛ207aÊ›298aâ
+›664d›848`Ê›84a˽»›14aȼ¹›15aµ›20aµ½Àµ¶À¹›14aÁ¹ÁÃÆÍ
+
+
+›462d›607`Ó×
+›1851d›12m›1031`1;<F›13aC4:8›14a<F›14a?89G›14a<A›55aG<BA4??L›12a5?4A>
+›1851d›1371`G8A
+
+
+›462d›449`ÎÃÄÃÎÃÊÁÃÏ›10m›1135aÓØ
+›607d›13m›449`ÀËÌËÖËÓÉË×
+›703d›14m›1435`}
+›709d›10m›472`çÐè›22a©½¹À›19a¦¹ÁÄÇÛ20aµÂ¸›19a{ƽµÂ›19a£µÁ½ÀÈÛ18a¦¹ÀÀÍâ›32a§›5a¯›17a³›19a°Ç¹Æ›20a¢É½¸¹›19aºÃÆ›19aȼ¹
+›723d›1481`~
+›765d›12m›572`¿ÔÚá›10m›283a¹·›335a¼Ã›1aÃÀ›19aú›18a~À¹·Èƽ·µÀ›17a~»½Â¹¹Æ½Â»
+›765d›12m›543`Ò›10m›127aµÈ›18a­¨|®â›29a¯›35a¼Â½·µÀ›19aƹě1aÃÆÈá›18a®·
+›822d›543`Ù›21a®·½¹Â·¹á›22a­Ã›22aµÀ›19a¨½À½Èµ›564a¹Â¼µÁá›21a®Ë½Â¸ÃÂá
+›822d›833`Í›175aÆÍ›19a|ÃÀÀ¹»¹›19aú›20a®·½¹Â·¹á›23a®¼Æ½Ê
+›878d›543`®©Õ›15aקzá›15a¥ÉÀÍ›15aÐØ××â›19aÞ®¹·Ã¸›16a~¸½È½ÃÂßâ
+›972d›472`çÑè›22a}Û15a£Ãǹ¿â›19a­¹Ä›1aÃÆÈ›15aºÆÃÁ›14aȼ¹›15a$5)›104a¹Æ›14a®ÈµÂ¸µÆ¸Ç›15a|ÃÁÁ½Èȹ¹â›14m›18aGH@P
+›972d›10m›1218`}ƽÊ
+›1028d›14m›543`"›19a!3›10m›296aÊ›56a¶›1a¹Æ›14aÐØØÏâ
+›1028d›14m›562`.›10m›36aá›14aÐÐÞÓßäÔÖÏá›13a©Ã›22a¹Á
+›1122d›600`ʽ¸›17a¡›40a¼Çâ›30a¯¼¹›19a¡ÃÆÁµÈ›17aú›18a¯›17a³ÝÇ›18a$5)›18a¡½À¹Çâ›14m›29aGH@"›19a!3›10m›217aØá
+›1122d›472`çÒè›22a}µ›104aÉ·›14m›884a.›10m›36aá›18aÒÞÑßäÐÓòÐ
+›1132d›1179`~
+›1179d›543`ª·Èö›1a¹Æ›16aÐØ×Ñâ
+›1272d›600`ʽ¸›16a¡›40a¼Çâ›25a¯›145aÈ›16a¨¹Èƽ·›16a¡½À¹Çâ›14m›24aGH@"›19a!3›10má›16aÑÞÐßäÐÑòЛ76a¹¶ÆɵÆÍ
+›1272d›472`çÓè›22a}µ›103aÉ·›130a³›17a¡Ã›14m›432a.›10m›251aÕá›15a¡
+›1282d›854`~
+›1329d›543`ÐØ×Ðâ
+›1423d›600`ʽ¸›12a¡›40a¼Çâ›17a¯¼¹›14a¡ÃÆÁµÈ›11aú›13a07,›13a¡½À¹Çâ›14m›16aGH@"›19a!3›10má›13aÑÞÒßä×ò›125aÊ›56a¶›1a¹Æ
+›1423d›472`çÔè›22a}µ›99aÉ·›14m›704a.›10m›202aÐÑá›11a©Ã›22a¹Á
+›1479d›543`ÐØ×Ðâ
+›1573d›572`ÃÁµÇ›11a­Ã¿½·›91aµ·›22a¹¸›12aÞ0+›105aÈ›11a¡½À¹›11a¡ÃÆÁµÈâ›14m›12aGH@"›19a!3›10má›12aÕÞÒßäÐÐÔ›67aÏá
+›1573d›472`çÕè›22a¯›222a¿½â›12a«›41a¿›122aß›10a¡Ã›14m›411a.›10m›224aòÐÑ
+›1629d›599`Ê›56a¶›1a¹Æ›15aÐØ×Ôâ
+›1629d›543`©Ã›22a¹Á
+›1723d›472`çÖè›22aÞ›14m›33a-.-N›10m›293aÈ›14a¡½À¹›14a¡ÃÆÁµÈâ›14m›19aGH@"›19a!3›10má›14aÕÞÐßä×òЛ150a¼›14aÐØ×Ôâ
+›1723d›14m›561`;›10m›88aßâ›18a¢¹Â¹Æ½·›15a¡Ã›14m›424a.›10m›226aÐá›13a¨µÆ·
+›1817d›910`±¤ÈÛ422a¹·›339a¼Ã›1aÃÀ›20aú
+›1817d›472`ç×è›22a©½¹À›20a¦¹ÁÄÇÃÂâ›36a}›83a±}°›19a°Ç¹Æ›21a¢É½¸¹â›35a¯›35a¼Â½·µÀ›20aƹě1aÃÆÈá›21a®·
+›1873d›543`~À¹·Èƽ·µÀ›20a~»½Â¹¹Æ½Â»›21aÙ›22a®·½¹Â·¹á›24a­Ã›22aµÀ›19a¨½À½ÈµÆÍ›20a|ÃÀÀ¹»¹›20aú›21a®·½¹Â·¹á
+›1873d›1302`Í
+›1930d›647`¹Â¼µÁá›18a®Ë½Â¸ÃÂá›18a®©Õ›17aקzá›18a¥ÉÀÍ›17aÐØ××â›26aÞ¡›88a±¤ÈÛ143a¹ÆǽÃÂ
+›1930d›543`®¼Æ½Ê›853aÃÆ›17a}›83a±}°›17a±
+›1986d›543`ÑâÏßâ
+›2080d›472`çØè›22a}½»½ÈµÀ›11a~ÅɽÄÁ¹Â›361a͵Ƹá›12a¨zâ›12m›45a¿ÔõÒÉÏ›14m›17a=<A›13a<.-P
+›2080d›10m›892`È›12a|ÃÆÄ›1aÃƵȽÃÂá›12a¨µ›12m›244aÒ
+›2137d›14m›562`%/32›16aB!-4!+›10má›14azÄƽÀ›15aÐØ××â›18azzð§zÐÏzð¯~â
+›2137d›14m›543`#
+›2230d›10m›896`È›16a|ÃÆÄ›1aÃƵȽÃÂâ›14m›24aACJK›17aD1›19a'1›217a%&%1›64a%›16aB!-P
+›2230d›10m›449`çÐÏè›22a}½»½ÈµÀ›15a~ÅɽÄÁ¹Â›14m›487a.›36a!,,%12L›18aE›71a%-#
+›2287d›543`4!+›10m›395aÊ›56a¶›1a¹Æ›15aÐØ×Ôâ›18a~¦ðª§©ÏÒð­¨ðÏÏÑâ
+›2287d›602`á›15aǹ·Ã¸›16a¹¸½È½ÃÂá›14a©Ã›22a¹Á
+›2381d›893`È›14a|ÃÆÄ›1aÃƵȽÃÂâ›14m›17a?›194a.1,!3›16aH2%1›15aB!-4!+›10má›13a­¹Ê½ð
+›2381d›449`çÐÐè›22a}½»½ÈµÀ›12a~ÅɽÄÁ¹Â›14m›331a.-3›14a?)+%›15a?
+›2437d›10m›543`ǽÛ15aÏâÐÏ›14a¹¸½È½ÃÂá›14a®¹ÄȹÁ›250a¹ÆǽÛ15aÐá›14a±›97aÈ›14aÏßâ
+›2437d›1042`¶›1a¹Æ›16aÐØ×Ôâ›18aÞ±›208aµÆ½µÂ
+›2531d›449`çÐÑè›22a}õÀ¸›18a~Æ˽›18a¦Â›350aÈÇä›27a¨Ãƹ›18a¡É›19aºÃÆ›18a¢ÆµÂ¸›19a²½ÎµÆ¸Çâ
+›2531d›902`Éȼâ›32a±½ÆÈɵÀ›17a¡ÃÂ
+›2587d›14m›543`GH@"›19a!3›10m›213aÑÒá›13azÄƽÀ›14aÐØØÏâ
+›2587d›14m›664`.›10m›36aá›14aÐÐÞÐßäÐÒò
+›2681d›449`çÐÒè›22a}õÀ¸›13a~Æ˽›13a¦Â›306a¹ÆǽÃÂÇ›13aú›13a¯›17a³›14aµÂ¸›14m›14aøùú›51aýþú›10mâ›14m›17aGH@P
+›2681d›10m›892`Éȼâ›18a¯¼¹›14a¹˛15aÊ›14m›464aûü
+›2691d›10m›1422`~
+›2738d›14m›543`"›19a!3›10má›14aÐÏÞÒßäÒÑÔòÒ›127aÊ›56a¶›1a¹Æ›14aÐØ×Øâ
+›2738d›14m›562`.›10m›295aÑ×á›13a©Ã›22a¹Á
+›2832d›1454`¼¹Á¹›19aºÃÆ›16a}µÈµ›17a¯ÆµÂǺ¹Æâ
+›2832d›449`çÐÓè›22a©½¹À›17a¦¹ÁÄÇÃÂâ›27a±±·Ã›1a¸¹ä›25az›18a¹˛18a~·Û1a¸½Â»›17a®·
+›2888d›572`¹·›344a¼Ã›1aÃÀ›23aú›22a~À¹·Èƽ·µÀ›21a~»½Â¹¹Æ½Â»›23aÙ›23a®·½¹Â·¹á›25a­Ã›22aµÀ
+›2888d›543`¯›35a¼Â½·µÀ›22aƹě1aÃÆÈá›24a®·›930aÍ
+›2944d›1206`¹Â¼µÁá›15a®Ë½Â¸ÃÂá›15a®©Õ›15aקzá›15aÐØØÐâ
+›2944d›543`¨½À½ÈµÆÍ›13a|ÃÀÀ¹»¹›14aú›15a®·½¹Â·¹á›15a®¼Æ½Ê
+
+
diff --git a/dviware/ln03/rmcs/dviln03.tex_publish b/dviware/ln03/rmcs/dviln03.tex_publish
new file mode 100644
index 0000000000..9b5d9090c6
--- /dev/null
+++ b/dviware/ln03/rmcs/dviln03.tex_publish
@@ -0,0 +1,2480 @@
+\let\iffulldoc=\iftrue %%% Change to \iffalse if you don't have DVItoLN03
+ %%% working yet (any version post V3.1 will do!)
+\let\ifatrmcs=\iffalse %%% Leave this, unless you have RMCS's shield font!
+\let\ifrmcs=\iffalse %%% Leave this completely
+\let\ifdollars=\iffalse %%% Change to \iftrue if still using TEX$... logicals
+%%%
+%%% Make sure that you revise this file to reflect local conditions; this
+%%% includes references to local versions of the \LaTeX user guide, and also
+%%% defining the macros \sitename and \contact
+%
+% Wherever this document introduces information that may vary from site to
+% site, the line(s) will end with %%% SYSDEP
+% Such sections should be modified to match local requirements; in
+% particular, the definition of \contact should be changed to be the name of
+% the local TeX administrator, and \sitename to your favourite name for your
+% site
+%
+\def\contact{\meta{contactname}}%%% SYSDEP
+\def\sitename{\meta{sitename}}%%% SYSDEP
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\iffulldoc
+\documentstyle[11pt,twoside,changebar,graphics]{article}\else
+\documentstyle[11pt,twoside]{article} \let\cbstart=\relax \let\cbend=\relax
+\fi
+%
+\hyphenation{post-am-ble pre-am-ble down-loa-ded sto-red}
+\hyphenation{re-cor-ded}
+%
+\makeatletter
+% This redefines \@arabic to the old (V2.08)
+% form wherein \@arabic{ctr} (and through it, \arabic{ctr}) only
+% produce printed output for values of ctr > 0.
+%
+% This means that \setcounter{page}{0} may be used to ensure that
+% such things as title pages, etc, don't bear a page number, and
+% also so that ``non-standard'' footnotes may be interpolated into
+% the text by means of \footnotetext[0]{$^\dag$ Some text}, say.
+%
+\def\@arabic#1{\ifnum #1>0
+ \number #1%
+ \fi}
+% Define this to squash up lists being used as simulated lines of DCL
+\def\squash{\itemsep=\z@ \relax \parsep=\z@ \parskip=\z@}
+\makeatother
+
+
+\pagestyle{headings}
+\textheight=21cm
+\newfont{\tinyss}{cmss8}
+\newfont{\logo}{logo10 scaled\magstephalf}
+\ifatrmcs
+ \newfont{\shieldfont}{shield}
+ \newcommand{\shield}{{\shieldfont\char`\@}}
+\else
+ \let\shield=\relax
+\fi
+\newenvironment{note}{\quote\centerline{\bf Note}}{\endquote}
+\newcommand{\chapend}{\clearpage \ifodd \count0\else
+ \markboth{}{}\vspace*{\fill}%
+ \centerline{\small This page is left intentionally blank}%
+ \vspace*{\fill}\cleardoublepage
+ \fi}
+
+% Uncomment the next line if you don't mind pages with nothing but numbers
+% \let\chapend=\cleardoublepage
+
+\newcommand{\meta}[1]{$\langle\mbox{\it #1\/}\rangle$}
+
+\newcommand{\ESC}{{\tinyss\raisebox{0.5ex}{E}\kern-.2em%
+ \raisebox{-0.5ex}{C}}}
+
+\newcommand{\TYP}{{\tt.TYP}}
+\newcommand{\DVI}{{\tt.DVI}}
+\newcommand{\TFM}{{\tt.TFM}}
+\newcommand{\LN}{{\tt.LN3}}
+\newcommand{\DVItoLN}{{\sf DVI\-to\-LN03}}
+\ifdollars\newcommand{\logsep}{\$}\else\newcommand{\logsep}{\_}\fi
+
+\newcommand{\BibTeX}{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
+ T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+
+\newcommand{\SliTeX}{{\rm S\kern-.06em{\sc l\kern-.035emi}\kern-.06em T\kern
+ -.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+
+\newcommand{\SLiTeX}{{\rm S\kern-.06em{\sc l\kern-.035emi}\kern-.06em T\kern
+ -.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+
+\newcommand{\MF}{{\logo META}\-{\logo FONT}}
+
+\newcommand{\TeXware}{\TeX\kern-.1em ware}
+
+\newcommand{\Web}{{\sc Web}}
+
+\newcommand\DVItoVDU{{\sf DVIto\kern-.06em VDU}}
+
+\newcommand\bs{\char '134 } % A backslash character for \tt font
+\newcommand\verbsp{\char '40 } % The \verb* space character in \tt font
+\newcommand{\prompt}{{[DCL]\$}}
+\newcommand{\cont}{{\leavevmode\kern.06em\vbox{\hrule width.4em height .8pt}\$}}
+
+\title{DVILN03 User Guide\\for the {\sl VAXen\/} at \sitename}
+\author{Brian Hamilton Kelly\\School of Electrical Engineering \& Science\\
+\shield\\
+Royal Military College of Science\\Shrivenham}
+\date{30th September 1991\\For {\tt DVILN03} Version 4.1}
+\begin{document}
+\setcounter{page}{0}
+{\def\thefootnote{\fnsymbol{footnote}}
+\maketitle
+\begin{abstract}
+ This document describes the operation of the {\tt DVILN03} command on the
+ {\sl VAX\/} computer. This command activates the {\sf DVItoLN03}
+ program, which allows a \TeX{} output file in device-independent \DVI{}
+ form to be converted to a file which may be printed on a DEC
+ LN03\footnote{{\sl VAX\/} and {\sl LN03\/} are registered trademarks of
+ the Digital Equipment Corporation} laser printer.
+
+ It is assumed that the reader is familiar with \LaTeX{} and has read
+ the local \LaTeX{} User Guide~\cite{RMCS:latexguide}.
+ Familiarity with the {\sl VAX/VMS\/} operating system is also assumed.
+
+ If you have a question that you can't answer by reading this document, ask
+ \contact. He should also be informed of any possible \DVItoLN{} bugs or
+ undocumented anomalies. \ifrmcs\else
+
+ Bugs that cannot be resolved locally at \sitename{} can be reported to the
+ author, Brian {\sc Hamilton Kelly}, who may be contacted by E-mail as
+ {\tt<TeX@uk.ac.cranfield.rmcs>} (on the {\sc Janet} network).\fi
+\end{abstract}}
+
+
+\newpage
+\pagenumbering{roman}
+\tableofcontents
+
+\listoffigures
+
+\section*{Acknowledgements}{\small
+The code for handling the Rose-style \verb+\special+s for changebar marking
+was added by Robin Fairbairns of LaserScan, Cambridge, UK, at version 3.1-1.
+
+The algorithms for handling the newer DEClaser printers were provided by
+Karsten Nyblad of TFL, the Danish Telecommunications Research Laboratories;
+they arrived just as all the other enhancements had been completed at
+version 3.9, and were integrated into this new release.
+
+My colleague Niel Kempson has provided much-needed support and encouragement,
+and has made many useful suggestions for enhancements
+over the years (his latest idea, just as I'm about to release this, is to
+make the program capable of handling binary files that {\em aren't\/}
+organized as 512-byte fixed-length records, but that will have to await a
+future release).
+
+Finally, I must acknowledge my great indebtedness to the dedicated band of
+helpers who have acted as $\beta$-site testers (and provided useful
+suggestions for enhancements):
+\begin{itemize}
+\item Phil Taylor (\verb+<P.Taylor@vax.rhbnc.ac.uk>+), of Royal Holloway and
+Bedford New College,
+\item Robin Fairbairns (\verb+<rf@cl.cam.ac.uk>+),
+\item Karsten Nyblad (\verb+<karsten@tfl.dk>+), and
+\item Rob Schumann (\verb+<schumann@ersvm1.dnet.nasa.gov>+), of the European
+Space Agency, at Frascati in Italy.
+\end{itemize}
+(and of course, the dozens of unsuspecting guinea-pigs at the Royal Military
+College of Science!)
+}
+\newpage
+\section*{New and Changed Features}
+\markboth{SUMMARY OF CHANGES}{SUMMARY OF CHANGES}
+\addcontentsline{toc}{section}{New and Changed Features}\cbstart
+\DVItoLN{} V4.1 is a maintenance update which incorporates some minor bug
+fixes (mostly to handle obscure font problems). It is provided as a change
+file to be applied to the {\tt DVITOLN03.WEB} V4.0 file; a new version of
+the {\tt.WEB} file is also included, because both files have now been
+``detabbed''.
+
+The following new features are added in this version:\begin{itemize}
+ \item The \verb|/PAPER_SIZE| qualifier is introduced to allow system
+ managers to specify the default paper size (European \verb|A4| vs.\
+ \verb|US|); this is necessary since the mixing of landscape and portrait
+ orientation output on the same page requires an intimate knowledge of
+ the size of the paper. The qualifier cannot be specified explicitly to
+ produce output as if sent to the non-default paper size, since the
+ switch on the back of the printer also needs to be changed, and the
+ power cycled.
+ \item The \verb|/VERBOSE| qualifier is introduced; in the distributed
+ {\tt.CLD} file, this is on by default, and produces the same terminal
+ output as earlier versions of the program. By making the default
+ \verb|/NOVERBOSE|, or specifying this explicitly on the command line,
+ messages to the terminal are reduced to:\begin{itemize}
+ \item the name of the {\tt.DVI} file being processed;
+ \item the report of the total numbers of bytes of fonts downloaded;
+ \item the numbers of the pages processed.
+ \end{itemize}
+\end{itemize}
+
+The following bugs are fixed in this version:\begin{itemize}
+ \item Optimization of font downloading had made the program incapable of
+ handling fonts containing more than 188 glyphs.
+ \item All rules were output in the orientation specified in the command
+ line, even if some of them should have appeared in the opposite
+ orientation.
+ \item Mixed portrait/landscape material requires knowledge of the
+ physical paper size, because the ``origin'' in landscape mode is related
+ to the {\em bottom\/} edge of the paper.
+ \item Changing the orientation within a page resets the margins to the
+ hardware defaults, which necessitates that the program change them again.
+ \item A font that contains duplicated characters (can only happen with
+ {\tt PK} fonts), if all characters were imaged (e.g., with {\tt
+ testfont}), would result in an illegal font download. The program now
+ detects such erroneous fonts, which is more than any \TeX ware or
+ fontware does (apart from {\tt GFtoPXL})!
+\end{itemize}
+
+\DVItoLN{} V4.0 was \cbend the first public release since V3.1-4; other
+versions have been used internally at the author's site, and some of these
+have been circulated to a dedicated band of $\beta$-site testers---I'm very
+grateful for your help, gentlemen!
+
+\DVItoLN{} V4.0 introduces the following refinements and new features
+compared with V3.1:\begin{itemize}
+ \item Support has been added for virtual font files; for every font, the
+ program will attempt to open a file with name \meta{fontname}{\tt.VF},
+ looking in the directory referenced through the qualifier
+ \verb|/VIRTUAL_DIRECTORY| (sites without any requirement for virtual
+ fonts can speed processing fractionally by making the default
+ \verb|/NOVIRTUAL_DIRECTORY|)\@. Glyphs from such a font will be imaged
+ from the appropriate physical fonts, obeying all \meta{dvi byte}
+ sequences in the {\tt.VF} file.
+
+ \item Support for \TeX's \verb|\special| command has been expanded and
+ improved; it is only necessary to provide sufficient
+ characters of a keyword to identify it uniquely: since all keywords (at
+ present) are unique in their first two letters, then only that many need
+ be provided, although any \verb|\special| sequences will ordinarily be
+ defined within a macro package or style option; authors of these are
+ encouraged to write all keyword parameters in full.
+
+ \item Support for two new \verb|\special| commands:
+ \begin{description}
+ \item[\tt landscape] Any text, rules, or graphics insertion, up to the
+ end of the current page, or the next \verb|\special{portrait}| command,
+ whichever occurs first,
+ will be output in landscape orientation, regardless of whether the
+ document is being processed in landscape or portrait mode.
+ \item[\tt portrait] The opposite of the previous command
+ \end{description}
+ Note that these keywords may be used with or without the `\verb|ln03:|'
+ prefix, since the concept of printing orientation transcends any concept
+ of device dependence.
+
+ \item The qualifiers \verb|/LEFT_MARGIN| and \verb|/TOP_MARGIN| now
+ require that their associated values be specified using the syntax of a
+ \TeX{} \meta{dimension}, that is, by a number (real or integer) followed
+ by a two-letter code for a \TeX{} \meta{physical unit}; the standard
+ units of \TeX{} ({\tt pt sp pc in cm mm dd cc}) are supplemented by {\tt
+ mi} (for micron, i.e.~1$\mu$m) and {\tt px} (for pixel).
+
+ \item The program no longer assumes that \TFM{} files will be found in
+ the directory indicated by the logical name \verb|TEX$FONTS|; instead,
+ this information is conveyed to the program through the
+ command-definition file, using the \verb|/TFM_DIRECTORY| qualifier.
+ System managers are now free to use logical names of the form
+ \verb|TEX_INPUTS| instead, and thus conform to {\sl Digital's\/}
+ recommendations regarding customer-assigned logical names.
+
+ \item Previous versions of the program would abort upon discovering a
+ reference to a font for which character bitmaps could not be found (in
+ either packed or unpacked pixel files). This was somewhat user-hostile,
+ and at variance with the proposed Level~0 DVI-Driver
+ Standard~\cite{Hosek}, so the
+ program now substitutes solid rules of appropriate dimensions for glyphs
+ from such a font. A warning message will be displayed.
+
+ \item A mechanism has been provided by which spurious `{\tt Page wider
+ than TeX reported}' messages may be suppressed by the user: see the
+ descripton of the \verb+/HFUZZ+ qualifier. For completeness of
+ orthogonality, the complementary \verb+/VFUZZ+ qualifier is also
+ provided, but it's extremely unlikely that this would ever be required.
+
+ \item Command-line qualifiers have been provided to support {\sl
+ Digital's\/} new DEClaser~$2100^{\dag}$\footnotetext[0]{$^{\dag}$
+ DEClaser and LN05/LN06 are registered trademarks of {\sl Digital}}
+ and~2200 printers (otherwise known as the
+ LN05 and LN06). The user can control whether printing will be in
+ simplex or duplex mode (printing on both sides of the paper), and from
+ which tray(s) the paper will be fed.
+
+ \item Last, but definitely not least, considerable speed improvements
+ have been made by reorganizing some data structures to reduce the
+ likelihood of the VAX having to page fault.
+ \end{itemize}
+
+\subsection*{V3.1 Changes}
+\DVItoLN{} V3.1 introduced the following refinements and new features
+compared with V3.0:\begin{itemize}
+ \item Support for \TeX's \verb|\special| command was expanded and
+ improved.
+
+ Sixel (or other LN03) files may now be included using the
+ following syntaxes within the parameter of the \verb|\special| command:
+ \begin{itemize}
+ \item \verb*|\special{SX |\meta{filename}\verb|}|
+ \item \verb*|\special{ln03:plotfile |\meta{filename}\verb|}|
+ \item \verb*|\special{ln03:sixel |\meta{filename}\verb|}|
+ \end{itemize}
+ These commands will not normally be inserted directly by users, but
+ through the use of a document style option, such as \verb|graphics|,
+ see~\S\ref{subsec:graphics}.
+ \item The Flavio Rose \verb|\special|s are supported to draw vertical
+ bars beside changed material. The parameters
+ recognized are as follows, with [\,] bracketing material that may be
+ omitted:
+ \begin{itemize}
+ \item \verb*|\special{ln03:defpoint |\meta{point\_no}%
+ \verb|(|[\meta{dimen}]\verb|,|[\meta{dimen}]\verb|)}|.\\
+ Define a point, in terms of $x$ and $y$ coordinates on the
+ page. Either coordinate may be omitted, when the definition
+ takes place with the appropriate current position. This
+ therefore defines point $p_i$ to be at $(x_i,y_i)$.
+ \item \verb*|\special{ln03:connect |\meta{point\_pair}\verb*| |%
+ \meta{point\_pair}[\verb*| |\meta{dimen}]\verb|}|,\\
+ where $$\mbox{\meta{point\_pair}}\equiv
+ \mbox{\meta{point\_no}[\verb|/|\meta{point\_no}]}$$
+ Connect pairs of points together, with a rule of width (height)
+ \meta{dimen}. If omitted, the latter reverts to the usual 2
+ pixels (0.4pt). The points must be capable of being connected
+ by a rule that is either strictly vertical or strictly
+ horizontal. The variant of \meta{point\_pair} with the
+ intervening `{\tt/}' is used with {\tt twoside} printing to
+ specify {\em two\/} pairs of points, one to be used on
+ left-hand pages, and one on right-hand.
+ \item \verb*|\special{ln03:resetpoints |\meta{first}%
+ \verb*| |\meta{last}\verb|}| Cancel all knowledge of the
+ coordinates of points $p_f\ldots p_l$.
+ \end{itemize}
+
+ Again, the user need not worry about creating such \verb|\special|
+ commands directly: the style option \verb|changebar| provides the
+ appropriate macros which are invoked by means of the commands
+ \verb|\cbstart| and \verb|\cbend|, or by the \LaTeX{} environment {\tt
+ changebar}.
+ \item Program now supports an optional file specification on the
+ \verb|/LOG| qualifier.
+ \item Program now provides the \verb|/OUTPUT| qualifier which may be
+ used to direct output to a different file specification (for example,
+ onto a scratch disk), or even directly to the LN03 printer, possibly as
+ a spooled device.
+ \item The program now ensures that all output files are created in the
+ user's current directory (unless overridden by
+ {\tt/OUTPUT}): formerly, the use of a logical name could cause such
+ files to be created in a different directory.
+ \item Correctly reports the relative magnification of fonts loaded at
+ non-standard sizes.
+\end{itemize}
+\subsection*{V3.0 Changes}
+The following enhancements were made to \DVItoLN{} at V3.0:
+\begin{itemize}
+ \item Both packed and unpacked font files may now each be held in
+ ``rooted'' or ``flat'' directory structures.
+ \item Program can handle fonts with the \TeX{} maximum of 256 characters,
+ which permits access to Silvio Levy's Greek fonts
+ \item The \verb|/LOG| and \verb|/NOLOG| qualifiers permit user selection
+ of whether the program's log file (\verb|.TYP|) is retained after
+ processing.
+ \item Program correctly computes the imaging area of standard European
+ A4 paper.
+\end{itemize}
+\newpage
+\setcounter{page}{1}\setcounter{footnote}{0}
+\pagenumbering{arabic}
+
+
+\section{Introduction}
+\subsection{What \LaTeX{} does with your Source File}
+
+When any program\footnote{This document refers mostly to \LaTeX, since that
+is the program most commonly used at the author's site; however, it may be
+assumed that this includes \TeX{} and \SliTeX{} as well} of the \TeX{}
+family is run (\TeX, \LaTeX{} or \SliTeX), it produces two output files.
+One of these is the {\sl log file}, which records all the output that
+\LaTeX{} sent to the terminal (and a lot more besides!). On a {\sl VAX\/}
+implementation of \LaTeX, this file has the file type `{\tt .LIS}'\@.
+However, it is the other file which is of most interest because this
+contains all the instructions to typeset your document; this file is in a
+{\sl Device-Independent Format\/} which is common to {\it every\/} \LaTeX{}
+site in the world and has a file type of `\DVI'\@. Details of the internal
+format of \DVI{} files are explained within the program {\sf DVItype}, which
+describes the definitive method for processing \DVI{} files, but need only
+concern those who are writing \DVI{} processing programs. Details of most
+\TeXware{} files have also been published in various issues of {\sl
+TUGboat}, the newsletter of the \TeX\ Users'
+Group~\cite{TUGboat-DVI,TUGboat-TFM,TUGboat-PXL,TUGboat-PK,TUGboat-GF}.
+
+\subsection{Previewing \LaTeX{} Output}
+Before you can see what wonders \LaTeX{} has wrought for you, it is necessary to
+process this \DVI{} file. As a first stage, you should use \DVItoVDU{} to
+produce a representation of your document on a graphics terminal, rather than
+waste paper unnecessarily; the \DVItoVDU{} User's
+Guide~\cite{RMCS:dvitguide}
+and the local \LaTeX{} User's Guide~\cite{RMCS:latexguide}
+describe how to use this program.
+
+\subsection{Committing \LaTeX{} Output to Paper}\label{sec:font-load}
+However, the time will come (soon, you hope!) when you are ready to commit your
+document to paper; now it is necessary to process the \DVI{} file with the
+command {\tt DVILN03} which activates the {\sf DVItoLN03} program\footnote{The
+command is {\bf not \tt DVITOLN03} because, if it were, the VAX/VMS command
+line interpreter (CLI) would be unable to distinguish between this and the
+{\tt DVITOVDU} command}. For example, to process the file {\tt
+xxx.DVI}, resulting from \LaTeX ing {\tt xxx.TEX}, you would
+type:
+\begin{description}
+ \item[\prompt\footnotemark]
+ \footnotetext{In this document, the prompt from VAX/VMS is shown as
+ {\bf\prompt}}
+ \verb*+DVILN03 xxx+\footnote{The symbol `{\tt\verbsp}' represents
+ mandatory whitespace (one or more spaces or tabs)}
+\end{description}
+\DVItoLN{} reads the \DVI{} file,
+determines which individual characters of each font are used therein and
+writes an output file containing the necessary instructions to download the
+raster patterns corresponding to each character into the LN03 printer. It
+then appends the necessary instructions to typeset your document using the
+downloaded characters.
+
+The resultant output file has the file extension {\tt .LN3}, and can be queued
+for printing to any LN03 laser printer queue by normal {\sl VAX/VMS\/}
+commands. However, because it contains many (long) escape sequences, and also
+takes care of all printer formatting, it must be printed with a number of
+special qualifiers for the print command. The full details (for those who
+wish to set up new laser queues) are given in Appendix~\ref{sec:queues}.
+The \LN{} file is full of escape sequences which are peculiar to the LN03,
+and will cause absolute havoc if passed to any other form of printer;
+therefore, take care not to queue it for printing to an ordinary line
+printer --- even {\tt TYPE}ing it to a VDU is {\em not\/} recommended!
+
+\subsubsection{Printing the \LN{} File}%%% SYSDEP
+To simplify the task of queueing the \LN{} file for printing, \sitename{}
+provides the {\tt TEXPRINT} command; this is actually a {\sl DCL\/}
+symbol\footnote{For further information regarding {\sl DCL\/} symbols,
+see~\cite[chapter 5]{DEC:dcl-concepts}} which may be
+abbreviated to its first four letters, {\tt TEXP}\@. When executed as a
+{\sl DCL\/} command, it invokes a command procedure which queues your file
+for printing on the appropriate LN03 printer.
+
+\begin{note}
+
+ Most of the normal {\tt PRINT} command qualifiers ({\it eg\/ \tt /DELETE},
+ {\tt /COPIES=\it n}, {\it etc\/}) may be used with the {\tt TEXPRINT}
+ command.
+
+ For example, to print {\tt xxx.LN3}, deleting the file after printing
+ three copies, and sending you a message upon completion, type:
+ \begin{description}
+ \item[\prompt]
+ \verb|TEXPRINT/NOTIFY xxx/DELETE/COPIES=3|
+ \end{description}
+\end{note}
+
+\section{Doing more with DVItoLN03}
+The {\tt DVILN03} command normally processes the whole of the \DVI{} file
+and translates it all to a form intelligible to the LN03. It also makes the
+standard \LaTeX{} assumptions, that is, that the text's {\sl reference point\/}
+is located exactly one inch down and one inch across from the top left-hand
+corner of the paper. However, qualifiers to the {\tt DVILN03} command permit
+explicit control over which page shall be printed first, and how many
+following pages are to be printed. It also allows selection of a different
+reference point, and even permits the paper to be ``turned on its side'', into
+the landscape orientation.
+
+The following sections and Appendix~\ref{sec:qualifiers} give full details of
+each of the qualifiers which are accepted by the {\tt DVILN03} command; these
+qualifiers are as follows:
+
+\begin{itemize}
+ \item \verb|/STARTING_PAGE|
+ \item \verb|/NUMBER_OF_PAGES|
+ \item \verb|/TOP_MARGIN|
+ \item \verb|/LEFT_MARGIN|
+ \item \verb|/ORIENTATION|
+ \item \verb|/(NO)LOG|
+ \item \cbstart\verb|/(NO)VERBOSE|\cbend
+ \item \verb|/OUTPUT|
+ \item \verb|/HFUZZ|
+ \item \verb|/VFUZZ|
+ \item \verb|/DEVICE_TYPE|
+ \item \verb|/PRINT_MODE|
+ \item \verb|/(NO)DUPLEX_BY_PAGE_NUMBERS|
+ \item \verb|/FEED_TRAY|
+ \item \cbstart\verb|/PAPER_SIZE|\cbend
+ \item \verb|/(NO)PK_FONT_DIRECTORY|
+ \item \verb|/(NO)PXL_FONT_DIRECTORY|
+ \item \verb|/TFM_DIRECTORY|
+ \item \verb|/(NO)VIRTUAL_DIRECTORY|
+\end{itemize}
+
+(The last four qualifiers are {\em definitely\/} for system wizards only!)
+
+\subsection{Controlling which Pages DVItoLN03 Prints}
+Ordinarily, \DVItoLN{} translates all the pages in the \DVI{} file into a
+form which can be printed by the LN03 printer; however, if you are having
+difficulty in getting right a figure\footnote{Although \DVItoVDU{} is the
+recommended method of previewing your output, it sometimes happens that it
+cannot provide sufficient detail when performing this sort of proof-reading
+operation} on page 23 of a 200-page document, it is rather wasteful
+of paper to keep on printing all 200 pages (not to mention the time taken
+waiting for the output!) Therefore \DVItoLN{} allows the user to
+specify which page shall be used as the starting point for printed output;
+it also permits the user to control how many pages are to be processed.
+
+The value on the \verb|/STARTING_PAGE=| qualifier is used to specify the
+starting page number; this is given as a {\em string\/} and takes the default
+value `{\tt*}'. This default value will match any \LaTeX{} page number and so
+will normally start with the first page in your document, whatever its number.
+However, if you provide a single number, \DVItoLN{} will match this
+with the {\it first\/} occurrence of a page with that number. This means
+that if the pages of document \verb|MY_FILE| are numbered (0), (i), (ii),
+(iii), (1), (2), (3), \dots, say, then selecting \verb|/STARTING_PAGE=2|
+will select page (ii); there is no mechanism to select page (2) instead.
+(Note that {\em raw\/} \TeX{} would have had the values 0, -1, -2, -3, 1, 2
+and 3 for the above page numbers, and therefore page (2) {\em could\/} be
+selected directly; to accommodate such numbering schemes, the
+\verb+/STARTING_PAGE+ qualifier accepts negative numbers.)
+
+(If you've been clever and used raw \TeX's \verb|\count1|\dots{\tt 9} to get
+``fancy'' page numbers, then you can specify these extra numbers, separated by
+periods (`.') to the \verb|/STARTING_PAGE=| qualifier; it is for this reason
+that the qualifier's value must be specified as a string of characters, and
+not as a simple numerical value.
+Thus
+\verb|/STARTING_PAGE=3.*.19| would select the first page where \TeX's
+\verb|\count0| is 3 and \verb|\count2| is 19, no matter what value was in
+\verb|\count1|.)
+
+The number of pages to be printed is specified as the value to the
+\verb|/NUMBER_OF_PAGES=| qualifier; this {\em is\/} a numerical value, and
+takes the default value {\tt 10000000} --- hopefully this will ensure that
+your whole document is printed! Therefore to ensure that the page (2) of
+the earlier example is printed, you would need to issue the {\tt DVILN03}
+command as \begin{description}
+\item[\prompt] \verb+DVILN03 MY_FILE /STARTING_PAGE=2 /NUMBER_OF_PAGES=4+
+\end{description} thus getting pages (ii), (iii), (1) and (2).
+As with all {\sl DCL\/} commands and qualifiers, these may be
+abbreviated to the minimum to make them unambiguous; therefore the above
+command could also have been entered as
+\begin{description}
+\item[\prompt] \verb+DVIL MY_FILE/S=2/N=4+
+\end{description}
+
+\begin{figure}[htbp]
+\centering
+\setlength{\unitlength}{0.5pt}
+\begin{picture}(614,795)
+\footnotesize \tt
+%
+% Main boxes
+%
+\put(0,0){\framebox(614,795){\mbox{}}}
+\put(0,723){\line(1,0){614}}
+\put(72,0){\line(0,1){795}}
+\put(72,723){\makebox(0,0){$\bullet$}}
+\put(70,729){\makebox(0,0)[br]{\tiny Ref.~Point}}
+\put(72,696){\line(1,0){542}}
+\put(72,684){\line(1,0){542}}
+\put(72,659){\line(1,0){542}}
+\put(72,131){\line(1,0){542}}
+\put(72,101){\line(1,0){542}}
+\put(135,131){\line(0,1){528}}
+\put(480,131){\line(0,1){528}}
+\put(491,131){\line(0,1){528}}
+\put(581,131){\line(0,1){528}}
+%
+% Vectors and markers
+%
+\put(0,630){\vector(1,0){72}} % left margin
+\put(5,630){\vector(-1,0){5}}
+\put(5,640){1 in}
+\put(72,550){\vector(1,0){63}} % \oddsidemargin
+\put(77,550){\vector(-1,0){5}}
+\put(100,560){1}
+\put(160,795){\vector(0,-1){72}} % top margin
+\put(160,790){\vector(0,1){5}}
+\put(165,759){1 in}
+\put(275,696){\vector(0,1){27}} % \topmargin
+\put(275,701){\vector(0,-1){5}}
+\put(285,705){2}
+\put(430,716){\vector(0,-1){20}} % \headheight
+\put(430,664){\vector(0,1){20}}
+\put(440,703){3}
+\put(300,659){\vector(0,1){25}} % \headsep
+\put(300,664){\vector(0,-1){5}}
+\put(310,670){4}
+\put(200,131){\vector(0,1){528}} % \textheight
+\put(200,136){\vector(0,-1){5}}
+\put(205,610){5}
+\put(135,200){\vector(1,0){345}} % \textwidth
+\put(140,200){\vector(-1,0){5}}
+\put(307,210){6}
+\put(460,570){\vector(1,0){20}} % \marginparsep
+\put(511,570){\vector(-1,0){20}}
+\put(496,580){7}
+\put(491,500){\vector(1,0){90}} % \marginparwidth
+\put(496,500){\vector(-1,0){5}}
+\put(505,510){8}
+\put(310,151){\vector(0,-1){20}} % \footskip
+\put(310,81){\vector(0,1){20}}
+\put(300,110){9}
+\end{picture}
+
+\vspace{1ex}
+
+{\tt
+\begin{tabular}{l@{\hspace{20pt}}l}
+1 \bs oddsidemargin = 63pt & 6 \bs textwidth = 345pt \\
+2 \bs topmargin = 27pt & 7 \bs marginparsep = 11pt \\
+3 \bs headheight = 12pt & 8 \bs marginparwidth = 90pt \\
+4 \bs headsep = 25pt & 9 \bs footskip = 30pt\\
+\multicolumn{2}{l}{5 \bs textheight = 43\bs baselineskip + \bs topskip (528pt)}
+\end{tabular}}
+
+\caption{Example \LaTeX{} Page Layout\label{fig:layout}}
+\end{figure}
+
+\subsection{Controlling the Appearance of the Printed Page}
+All \LaTeX's page layout dimensions, such as {\tt\bs oddsidemargin}
+are measured from a standard {\sl reference point\/}; figure~\ref{fig:layout}
+shows how \LaTeX{} lays out a page for the {\tt article} style using 10-point
+type.
+
+
+For special effects, you may find it useful to be able to redefine the
+position of this reference point when printing; the qualifiers
+\verb|/LEFT_MARGIN| and \verb|/TOP_MARGIN| implement this change.
+
+Some documents need so-called {\sl landscape orientation\/} for the paper,
+where the printed page is wider than it is high. Assuming that the page
+layout parameters have been suitably redefined, the
+\verb+/ORIENTATION=LANDSCAPE+ qualifier can be used to tell \DVItoLN{}
+to print the document in this orientation. (Note that single pages,
+or even parts of pages, can be printed in the opposite orientation, through
+use of suitable \verb|\special| sequences in the \TeX{} source file.)
+
+\subsubsection{Specifying a new Reference Point}
+The \verb|/LEFT_MARGIN=| and \verb|/TOP_MARGIN=| qualifiers (which may be
+abbreviated to just {\tt/LE=} and {\tt/TO=}) each require a single numeric
+value, followed by a two-letter abbreviation for what \TeX{} calls a
+\meta{physical unit}; this expresses the displacement of the reference point
+from the left-hand and top edges of the paper, respectively.
+The value may be given in any of \TeX's standard \meta{physical unit}s, with
+the addition of {\tt mi}, representing 1$\mu$m (micron), and {\tt px}, which
+represents
+units of {\sl pixels}\footnote{see glossary}, the basic unit of measure on the
+LN03; there are 300 pixels to one inch (the LN03 can therefore print at a
+density of 90,000 $\mbox{dots}/\mbox{in}^2$) and so, as you might expect, the
+default values for these qualifiers are both {\tt 300px} for \TeX's default
+reference point; the same effect could be achieved by specifying this value
+as {\tt 1in} or {\tt25.4mm} or even as {\tt72.27pt}.
+
+\subsubsection{Specifying a Different Paper Orientation}
+Ordinarily, \DVItoLN{} produces its output assuming {\sl portrait\/}
+orientation for the paper (with the paper being higher than it is wide).
+However, you might wish to use different parameters to \LaTeX\
+(\verb|\textwidth|, {\it etc\/}), such that the paper is assumed to be in {\sl
+landscape\/} mode; it is then necessary to tell \DVItoLN{} that it
+should send re-orientation commands to the LN03. This is specified by means
+of the \verb|/ORIENTATION=| qualifier, (which may be abbreviated to
+{\tt/OR=}), and takes the ``values'' {\tt PORTRAIT} or {\tt
+LANDSCAPE} ({\tt P} or {\tt L}); the default is {\tt PORTRAIT}.
+
+\subsection{Including Graphics Images in your
+Document}\label{subsec:graphics}
+
+A local extension to \LaTeX{} at RMCS permits the \DVItoLN{} program to
+include graphic images within a printed document. The images will typically
+have been captured from a graphical display by software which ``reads back''
+such an image to the host computer. The only format supported at present
+for such an image dump requires that it be in DEC's `sixel' format; this is
+documented in the programmers' manuals for the LN03 printer and the VT240/1
+terminals. Such files can be generated by the {\sf ReToS} program from
+sources written in ReGIS; provided that the correct device type is specified
+(\verb+LN03+ or \verb+LN03_PLUS+, as appropriate), the {\sf ReToS} output
+may be imported {\it verbatim}.
+
+To prepare \LaTeX{} to include such an image, include {\tt graphics} as an
+option to the {\tt\bs documentstyle} command; this will define five new
+commands, the first four of which are as follows:
+\begin{description}
+ \item[{\tt\bs smallVT240}] Includes an image dump in a space 1.6inches
+ high and $2\frac23$ inches wide, suitable for a full-screen dump from a
+ VT240/1 terminal measuring $480\times800$ screen pixels, at 1:1 scaling
+ \item[{\tt\bs largeVT240}] For printing a dump at 2:1 scaling, occupying
+ 3.2in$\times5\frac13$in
+ \item[{\tt\bs smallVis550}] For 1:1 scaled dump from a Visual 550
+ terminal, with $585\times768$ screen pixels, in a space measuring
+ 1.95in$\times$2.56in
+ \item[{\tt\bs largeVis550}] For printing a dump at 2:1 scaling,
+ occupying 3.9in$\times$5.12in
+\end{description}
+(The fifth command, \verb|\gino|, is described in \S~\ref{subsub:gino}
+below.)
+
+In each case the commands take one parameter, which must be the name of the
+sixel dump file (including any necessary file extension). The commands ensure
+that a space of the appropriate size is left within the text (you will most
+probably use the commands within a {\tt figure} and/or {\tt picture}
+environment). {\sf DVItoLN03} is passed the filename and instructed to
+treat the file as a sixel dump (by means of \TeX's {\tt\bs special} command)
+through the above macros.
+
+\begin{figure}[hbtp]
+\iffulldoc\centerline{\smallVis550{\ifrmcs TEX$BIB:\fi openclose.small}}\fi
+\caption{Visual 550 Screen Dump printed by the {\tt\bs smallVis550}
+Command}\label{fig:small-six}
+\end{figure}
+
+Figures~\ref{fig:small-six} and~\ref{fig:large-six} illustrate the utility of
+these commands; the dumps were taken from a Visual 550 terminal.
+\ifrmcs It is understood by the author that the Selenar SG640
+terminals in the Computer
+Centre are also capable of performing screen dumps to the VAX; if anyone would
+care to implement a program to effect such a dump, appropriate commands can be
+added to the definitions in {\tt graphics.sty}\fi
+
+The sixel dump will be included {\it verbatim\/} within the resulting
+{\tt.LN3} file by \DVItoLN; it {\bf must} include the necessary {\tt DCS}
+(Device Control String) sequence to introduce the dump, and finish with the
+{\tt ST} (String Terminator) escape sequence. Dumps for printing with the
+commands must specify the scaling through the third parameter of the {\tt
+DCS} sequence, therefore the files will commence with `{\tt\ESC
+P9;0;1q}'\footnote{\ESC\ represents the `escape' character} for printing
+with the ``small'' commands, and `{\tt\ESC P9;0;2q}' for use with the
+``large'' versions; see~\cite{DEC:LN03} for further details.
+
+\subsubsection{GINO Graphics}\label{subsub:gino}
+Thanks to the good offices of Sqn.~Ldr.~John {\sc Baggott}, a student on
+2MESE course at RMCS, a program (\verb+GINOtoSIX+) is now available which
+will convert the metafile ({\tt SAVDRA}) output of GINO to a suitable sixel
+dump, ready for inclusion in your document with the
+\verb+\gino+\footnote{Also defined in the {\tt graphics} style option}
+command. The \verb+\gino+ command takes three parameters, thus:
+\begin{description}
+ \item[] {\tt\bs
+ gino(\meta{width},\meta{height})\char`\{\meta{filename}\char`\}}
+\end{description} where the \meta{width} and \meta{height} are expressed in
+terms of the {\sf picture} environment's current \verb+\unitlength+, and
+reserve an appropriately sized area of the page for the included image.
+The \verb+GINOtoSIX+ program is documented in
+appendix~\ref{appx:GINOtoSIX}.
+
+\begin{figure}[btp]
+\iffulldoc\centerline{\largeVis550{\ifrmcs TEX$BIB:\fi openclose.six}}\fi
+\caption{Visual 550 Screen Dump printed by the {\tt\bs largeVis550}
+Command}\label{fig:large-six}
+\end{figure}
+
+\section{Files Used and Generated by DVItoLN03}
+\subsection{The \DVI{} File}\label{sec:no-extension}
+This file, as already explained, is generated by \LaTeX{} and contains the
+commands to typeset the entire document; its device-independent
+format~\cite{TUGboat-DVI} means
+that it can be processed by different {\sf DVIto}\dots{} programs to permit
+driving many different output devices, from VDUs and dot-matrix printers, with
+lowish resolutions, through laser printers, with resolutions (usually) of 300
+dots per inch, right up to photo-typesetters, some of which have resolutions
+of 5,333$\frac{1}{3}$ dots per inch!
+
+\subsection{The {\tt .LN3} File}
+This file is generated by the {\tt DVILN03} command; the file {\it name\/} is
+the same as that specified for the \DVI{} file. These \LN{} files
+tend to be large (hundreds of blocks long), and there is never any point in
+keeping them after printing (unless you want to print further copies
+immediately\footnote{Even this is to be deprecated; photocopying is
+faster, cheaper, and doesn't tie up the printer queue.}). It is a good idea, therefore,
+to delete such files as soon as possible, since they can quickly consume your
+disk quota; the easiest way is by specifying the {\tt /DELETE} qualifier on
+the end of the {\tt TEXPRINT} command line.
+
+The {\tt /OUTPUT} qualifier may be used to give this output file a different
+file specification; this may be used to override the default action, which
+is to create the file in the current directory, with file extension `\LN{}'
+and the same name as the actual \DVI{} file opened. Thus the qualifier
+could be used to divert the output to a scratch disk, such as ({\tt
+DISK\logsep SCRATCH:}). %%% SYSDEP
+
+This file starts off, as already mentioned in section~\ref{sec:font-load}, by
+downloading the {\sl glyphs}\footnote{see glossary} of the necessary
+characters to the LN03's font memory. The format of this part of the file
+conforms to DEC standard~180~\cite{DEC:FontFileFormat}.
+
+\subsection{The {\tt .TYP} File}
+This file is \DVItoLN's equivalent of the log file generated by \LaTeX; it
+contains all the output (with some differences of format) that \DVItoLN{}
+sent to your terminal (details of font loads, {\it etc\/}) and some further
+information regarding the whereabouts in the file of the start of each page.
+Assuming that the document prints satisfactorily, there is no point in
+keeping the {\tt .TYP} file, and so it should be deleted as soon as
+possible; however, if you believe that \DVItoLN{} is behaving anomalously,
+please keep this file to show \contact.
+
+The default behaviour of \DVItoLN{} is to delete this file providing no
+messages were issued; however, if any warning or error messages {\em were\/}
+produced, the file will be retained automatically. The \verb+/LOG+
+qualifier may be used to ensure retention of the {\tt.TYP} file;
+conversely, the {\tt/NOLOG} qualifier will {\em never\/} keep the file.
+
+The {\tt/LOG} qualifier may optionally take a file specification to override
+part or all of the default specification for the log file; if this is used,
+the file will always be retained.
+
+\subsubsection{The {\tt /VERBOSE} Qualifier}\cbstart
+During operation, the program reports on the terminal the full specification
+of all files read (the input {\tt.DVI} file and any sixel files included
+through a \verb|\special| command). In addition, for each font specified,
+it reports the name of the font, the magnification, and how many bytes were
+downloaded to the printer for that font. Furthermore, it reports the total
+number of bytes downloaded for all the fonts printed. To reassure users
+that the program hasn't died if it's processing a very large input file, it
+also indicates what stage of processing it's reached whilst finding the
+initial starting page and determining which glyphs are imaged from each
+font.
+
+As each page of \TeX{} output is processed, the contents of \TeX's
+\verb|\count0| to \verb|\count9| registers are output between square
+brackets, entirely analogously to \TeX's own behaviour.
+
+Some users/sites find this too much for them; by specifying
+\verb|/NOVERBOSE|, either explicitly on the command line, or by removing the
+line reading {\tt default} for this qualifier in the command-language
+definition {\tt.CLD} file, the majority of this output can be suppressed:
+only the name of the input file, the total download and individual page
+number messages will be output (unless a problem is encountered).
+\cbend
+
+\subsection{Font Files Read by DVItoLN03}
+For every individual {\sl font}, no matter at what ``point size'' it is used,
+\DVItoLN{} needs to read the relevant {\tt .TFM} file, which contains the
+``\TeX{} Font Metrics''. This file will also have been read by \LaTeX{} when it
+was processing your {\tt .TEX} source, and is read again to ensure that the
+fonts have not been revised, which might otherwise lead to erroneous output.
+
+Furthermore, every different {\it size\/} of each separate font requires a
+file describing the actual character ``rasters'', for each character's
+glyph. This installation (\sitename) %%% SYSDEP
+uses packed ({\tt .PK}) format font
+files, which save many of the 100,000 disk blocks formerly occupied by
+\TeX's libraries when {\sl expanded pixel rasters\/} in {\tt .PXL} files
+were the norm; however, \DVItoLN{} is capable of using either (or both)
+forms of font file.
+
+If your document referenced any {\sl virtual fonts\/}\footnote{see
+glossary}, then \DVItoLN{} will need to read the associated {\tt.VF}
+file(s)~\cite{TUGboat-VF}; the latter specifies how each character in the
+font is to be imaged, which might in turn require reference to other real or
+virtual fonts (or even the {\em same\/} font; virtual fonts may be
+recursive!)
+
+\subsubsection{Directory for \TeX{} Font Metrics Files} The \TeX{} Font
+Metrics files ({\tt .TFM})~\cite{TUGboat-TFM} are read by all members of the
+\TeX{} family, and also by many DVI processing programs, including
+\DVItoLN{} and \DVItoVDU\@. Just like these other programs, \DVItoLN{}
+needs to be able to read these files; the program is told
+where to look through the \verb|/TFM_DIRECTORY| qualifier. This will have
+been set up as appropriate by your \TeX{} administrator, and will most
+probably have the value \ifdollars \verb|TEX$FONTS|\footnote{This form goes
+against {\sl Digital's\/} recommendations regarding customer-assigned
+logical names, which should not contain dollar signs}\else
+\verb|TEX_FONTS|\fi. %%% SYSDEP
+
+Ordinary users should {\bf never} have any requirement to use this qualifier
+on command lines, but should you have some peculiar requirement where it is
+necessary to read non-standard {\tt .TFM} files, refer to
+appendix~\ref{appx:private-fonts}.
+
+\subsubsection{Directories for {\tt .PK} Files} Most fonts in use at
+\sitename{} %%% SYSDEP
+are in the packed font file format; all such files are stored here in the
+directory {\tt TEX\logsep ROOT:[FONTS.PK]}; the {\sl VMS\/} logical name
+{\tt TEX\logsep PK} %%% SYSDEP
+has been defined to reference this directory. All magnifications of the same
+font appear in this single directory; they are differentiated from each
+other by the file type extension, which consists of a number followed by the
+letters `{\tt PK}'---the number $N$ for any given magnification $m$ is given
+by \[N=\lfloor(1.2^m\times R)+0.5\rfloor\] where $R$ is the output device's
+resolution in dots per inch and $\lfloor x\rfloor$ represents the floor
+operation, yielding the largest integer $<x$.
+Since the LN03 has a resolution of 300 dots per inch, this equation becomes
+\[N = \lfloor (300 \times 1.2^m) + 0.5 \rfloor\] Therefore, an unmagnified
+Computer Modern Roman 10pt font would be found in {\tt TEX\logsep
+PK:CMR10.300PK}, whilst its \verb|\magstep 5| version would be in {\tt
+TEX\logsep PK:CMR10.746PK}.
+
+The \verb+/PK_FONT_DIRECTORY+ qualifier instructs the \DVItoLN{} program how
+to find these files, and has been assigned the default value
+{\tt TEX\logsep PK:}. %%% SYSDEP
+If you wish to access your own private font files, refer to
+Appendix~\ref{appx:private-fonts}.
+
+Alternatively, packed pixel font files may be held in a directory tree,
+as is done at \sitename{} %%% SYSDEP
+with unpacked raster files; Appendix~\ref{sec:queues} provides the details.
+
+\subsubsection{Directories for {\tt .PXL} Files}
+Any expanded raster pixel files are stored in a directory tree with a
+``pseudo-device'' {\tt TEX\logsep PXL\_ROOT:} as its root: {\tt TEX\logsep
+DISK:[TEX.FONTS.PXL.]} is the definition used at \sitename{} for
+this logical name. Below this root are directories with numerical ``names'';
+the value of the name $N$ for any particular font magnification $m$ may be
+derived as follows:\[N = \lfloor (1.2^m \times 5 \times R) + 0.5\rfloor\]
+where $R$ is the output device's resolution\footnote{The factor $5$ arises
+from the relationship between \TeX's default {\tt\bs magnification} of
+{\tt1000} and the default resolution of 200 dots per inch, which was the
+assumed resolution of all early font files}. Since the LN03 has a resolution
+of 300 dots per inch, this equation simplifies to \[N = \lfloor (1500 \times
+1.2^m) + 0.5 \rfloor\] hence the unmagnified fonts are in directory {\tt
+TEX\logsep PXL\_ROOT:[1500]}; this translates to {\tt TEX\logsep
+DISK:[TEX.FONTS.PXL.1500]} at \sitename. Similarly, those at
+\verb|\magstep 3| are in directory {\tt TEX\logsep PXL\_ROOT:[2592]}.
+
+The \verb+/PXL_FONT_DIRECTORY+ qualifier instructs the \DVItoLN{}
+program how to find these files; at \sitename, %%% SYSDEP
+this has been assigned the default value {\tt TEX\logsep PXL\_ROOT:}.
+
+Alternatively, unpacked pixel font files may be held in a single flat
+directory, as is done at \sitename{} %%% SYSDEP
+with packed pixel files; Appendix~\ref{sec:queues} provides the details.
+
+\subsubsection{Directory for Virtual Font Files}
+The program needs to be able to read {\tt.VF} files for any virtual fonts
+used in the document; in fact, for {\em every\/} font referenced, the
+program checks firstly whether the font is virtual by looking for such a
+{\tt.VF} file: only if such a file cannot be found does the program attempt
+to find files containg raster information instead.
+
+The program looks for these files in the location associated with the
+\verb+/VIRTUAL_DIRECTORY+ qualifier; it may be found convenient to keep such
+files in the same directory as the \TeX{} Font Metrics. At \sitename, this
+qualifier is given the value {\tt TEX\logsep FONTS:}, thus indeed placing
+them in the same directory. %%% SYSDEP
+\ifrmcs\else
+
+If documents at \sitename{} never make use of virtual fonts, then the
+default should be made \verb+/NOVIRTUAL_DIRECTORY+ to gain a slight
+improvement in speed of processing.\fi
+\chapend
+\section*{Glossary of Terms}\markboth{GLOSSARY OF TERMS}{GLOSSARY OF TERMS}
+\addcontentsline{toc}{section}{Glossary}
+\begin{description}
+ \item[Aspect Ratio.]
+ (1) The ratio of the height of a pixel to its width. Most laser
+ printers have a 1:1 aspect ratio; (2) The ratio of the height of a
+ character to its width.
+ \item[Duplex Printing.]
+ A feature of such newer laser printers as the DEClaser
+ model~2200 (LN06), in which the printer contains a mechanism for
+ mechanically turning over the sheet of paper after printing on one
+ side before imaging a second page onto its reverse, thus producing a
+ double-sided document. (See also {\sl Tumbled Printing}.)
+ \item[Font {\rm or} Fount.]
+ A character set of a specified type face and size. Usually includes
+ upper- and lower-case letters, figures, punctuation marks, ligatures
+ and accents.
+ \item[Glyph.]
+ The physical representation of a ``character'' on the printed page is
+ known as that character's {\sl glyph\/}; thus the glyph for italic `A'
+ ({\it A\/}) differs from that for the same character in bold face
+ ({\bf A}).
+ \item[Landscape Orientation.]
+ Printing with the lines of type running parallel with the long edge of
+ the paper, so that the paper when read is wider than it is high.
+ \item[Packed Pixel Files.]
+ In 1985, Tomas Rokicki designed this format, which is now capable of
+ being used by the majority of \TeXware. By utilizing clever data
+ compression techniques, disk occupancy for font files is reduced by
+ 50--80\%.
+ \item[Page Orientation.]
+ With standard paper (either A4 [297mm$\times$210mm] or US
+ [11in$\times$8$\frac12$in]), printing can run parallel to either the
+ short or the long edges; these orientations are known as portrait or
+ landscape, respectively.
+ \item[Pixel.]
+ \DVItoLN{} treats the sheet of paper on which a page will
+ appear as a two-dimensional array of tiny dots known as pixels
+ (short for ``picture elements''); pixels may be either black or
+ white. The number of such pixels per inch, horizontally {\it and}
+ vertically, is determined by the {\sl resolution\/} and {\sl aspect
+ ratio\/} of the printing device. The total printable area of the
+ LN03 (on A4 paper) is $2400\times3400$ pixels.
+
+ \sitename{} %%% SYSDEP
+ has a number of Digital LN03-Plus laser printers with a resolution
+ of 300 dots per inch and an aspect ratio of 1:1.
+ \item[Portrait Orientation.]
+ Printing with the lines of type running parallel with the short edge of
+ the paper, the normal form for books, with the page higher than it
+ is wide.
+ \item[Raster.]
+ In the same way that a television screen is scanned as a {\sl
+ raster\/} of horizontal scan lines, so each character's glyph is built
+ up from rows of pixels. The representation of any character can then
+ be said to occupy a certain number of {\sl rows\/} and {\sl
+ columns\/}.
+ \item[Recto Pages.]
+ The right-hand pages in a book, like \ifodd\count0 this
+ one\else the one opposite\fi.
+ \item[Resolution.]
+ The number of picture elements (``pixels'') appearing per linear or
+ square inch (or suitable metric measure).
+ \item[Simplex Printing.]
+ This is the normal mode of printing with laser printers,
+ except for those that can support {\sl Duplex Printing\/}; text and
+ graphics are imaged on one side of the paper only. {\bf N.B.}
+ Before attempting to pass such sheets through the printer a second
+ time to print on the reverse of each sheet (``poor man's duplex''),
+ check the manufacturer's documentation to ensure that this will not
+ cause damage to your printer.
+ \item[Tumbled Printing.]
+ When printing in {\sl Duplex\/} mode (see above), the reverse of
+ each sheet will usually have its text oriented the same way round as
+ the front side, if the paper is turned over in the manner of reading
+ a book. This (when combined with {\sl Portrait\/} orientation)
+ means that the pages can be bound along the long edge of the paper
+ to form a book.
+
+ Sometimes it is desirable to bind the document along the short edge
+ (like a flip-chart), or more often, along the long edge for
+ {\sl Landscape\/} oriented books; in this case, {\sl Tumble Mode
+ Printing\/} would be selected so that the {\it verso\/} pages are
+ printed `upside-down'---the double-page spread would then have both
+ pages, when bound, in the same apparent orientation.
+ \item[Unpacked Pixel Files.]
+ The original means of representing the fonts used by \TeX{} was in
+ the form of unpacked rasters. Each row of pixels within the
+ character's raster is represented by the appropriate number of
+ 32-bit words; therefore a glyph occupying 65 rows of 36 columns
+ would require {\em two\/} words per row (wasting 28 bits in each
+ row), and thus require a total of 130 words or 520 bytes. In
+ addition, there are a number of other parameters required for each
+ character's glyph, so this character would occupy at least 540 bytes
+ of disk space.
+ \item[Verso Pages.]
+ The left-hand pages in a book, like \ifodd\count0 the one
+ opposite\else this one\fi.
+ \item[Virtual Fonts.]
+ One of the extensions to \TeX, introduced by Knuth~\cite{TeX3} in
+ his major enhancement of 1990 (V3), is the concept of virtual
+ fonts~\cite{TUGboat-VF}. Whilst \TFM{} files exist in the usual way
+ for virtual fonts, and are used by \TeX{} in exactly the same manner
+ as those for ``real'' fonts, there are no associated pixel files.
+ Instead, a {\tt.VF} file provides a mapping for each character in
+ the virtual font; the mapping for any single character might
+ reference one (or more) characters from some real font(s), or
+ perhaps construct a glyph from some pattern of horizontal and
+ vertical rules---{\tt.VF} files contain sequences of \meta{dvi
+ command}s for each glyph, which are interpreted by the output
+ driver. Thus virtual fonts can contain, for example, accented
+ letters formed from a combination of two or more characters, but
+ treated by \TeX{} as single `letters', and hence capable of being
+ considered by \TeX's hyphenation routines. Furthermore, since each
+ character can be `tuned' individually, better positioning of accents
+ on such things as upper-case letters can be achieved.
+\end{description}
+
+\chapend
+\appendix
+\section[Information for System Managers]{How to configure the Directories and
+set up a Printer Queue for an LN03}\label{sec:queues}
+This appendix provides details for system managers configuring an LN03 into
+their system to support \TeXware.
+
+\subsection{Creating the Appropriate Directories}
+\DVItoLN{} will work with packed or unpacked pixel files, or a mixture
+of both. It does not support the use of generic font files, and is unlikely
+to, since that would require it to read the entire raster into memory to
+determine the bounding box size, whilst the other formats both include this
+information in the file, so the glyph's raster can be copied piecemeal.
+In common with other binary files used by \TeXware{} under VMS,
+such files {\em must\/} be organized as 512-byte fixed-length records: if
+you've got them in some other mode, such as Stream-LF or variable-length
+no-carriage-control, then either recreate them with a VMS implementation of
+{\sf GFtoPK, GFtoPX}, or fetch them from somewhere else that {\em does\/}
+have them in the right format.
+
+\subsubsection{Where to put Packed Pixel ({\tt.PK}) Files}
+At RMCS the {\tt.PK} files of all the fonts supported are placed in
+{\bf one} directory; this is referenced {\it via\/} the logical name
+{\tt TEX\logsep PK}, and the latter provided as the default value for the
+\verb+/PK_FONT_DIRECTORY+ qualifier\footnote{Not forgetting to include a
+`{\tt:}' at the end of the logical name; the qualifier provided {\em must\/}
+legally be capable of being prefixed to a partial file specification, which
+may contain a directory part} in the \verb+DVITOLN03.CLD+ command definition
+file. Each font file should include the magnification and resolution
+indication in its file type extension. On the system at RMCS,
+{\tt TEX\logsep PK} points to {\tt TEX\logsep ROOT:[FONTS.PK]},
+and looks like this:
+
+{\small\tt\obeylines\obeyspaces
+Directory TEX\logsep ROOT:[FONTS.PK]
+$\vdots$
+CMBX10.300PK;1 CMBX10.329PK;1 CMBX10.360PK;1
+CMBX10.432PK;1 CMBX10.518PK;1 CMBX10.622PK;1
+CMBX10.746PK;1 CMBX10.896PK;1 \dots
+$\vdots$
+CMINCH.300PK;1 \dots
+$\vdots$
+CMR10.300PK;1 CMR10.329PK;2 CMR10.360PK;2
+CMR10.432PK;1 CMR10.518PK;1 CMR10.622PK;1
+CMR10.746PK;1 CMR10.896PK;1 CMR17.300PK;2
+$\vdots$
+}
+
+\noindent Other sites may prefer to put the font files for different
+magnifications into separate directories, in the fashion used at RMCS
+for {\em unpacked\/} pixel files (see below). In this case, the value
+provided for the \verb+/PK_FONT_DIRECTORY+ qualifier, or by the equivalence
+string of whatever logical
+it references, would end with `{\tt.]}'.
+
+\subsubsection{Where to put Expanded Raster ({\tt.PXL}) Pixel Files}
+At RMCS all the unexpanded raster pixel files relating to each different
+magnification are gathered together into separate subdirectories, with
+the subdirectory ``name'' reflecting the magnification and resolution.
+A pseudo-device
+{\tt TEX\logsep PXL\_ROOT:}
+is then defined such that these
+subdirectories then appear as ``actual'' directories of the pseudo-device.
+On our installation, we define the latter as follows:\begin{description}
+\squash
+\item[\prompt]
+{\tt DEFINE/TRANSLATION\_ATTRIBUTE=CONCEALED TEX\logsep PXL\_ROOT -}
+\item[\cont] {\tt TEX\logsep DISK:[TEX.FONTS.PXL.]}
+\end{description}
+The \verb+/PXL_FONT_DIRECTORY+ qualifier is given this logical name
+as its default value. A listing of this directory might look like this:
+
+{\small\tt\obeylines\obeyspaces
+Directory TEX\logsep PXL\_ROOT:[000000]
+
+1200.DIR;1 1350.DIR;1 1500.DIR;1
+1643.DIR;1 1800.DIR;1 2160.DIR;1
+2592.DIR;1 3000.DIR;1 3110.DIR;1
+3732.DIR;1 4479.DIR;1 5375.DIR;1
+6450.DIR;1 7740.DIR;1
+
+Total of 14 files.
+}
+
+\noindent The files in the individual directories have file type {\tt.PXL};
+that for the unmagnified fonts might look (in part) like this:
+
+{\small\obeylines\obeyspaces\tt
+Directory TEX\logsep PXL\_ROOT:[1500]
+$\vdots$
+AMSSMC10.PXL;1 AMSSMC40.PXL;1 BLACK.PXL;1
+CIRCLE10.PXL;3 CIRCLEW10.PXL;3 CMB10.PXL;1
+CMBSY10.PXL;1 CMBX10.PXL;1 CMBX12.PXL;1
+CMBX5.PXL;1 CMBX6.PXL;1 CMBX7.PXL;1
+CMBX8.PXL;1 CMBX9.PXL;1 \dots
+$\vdots$
+CMR10.PXL;3
+$\vdots$
+}
+
+\noindent The directory which contains the \verb|\magstep 3| files might
+look like this:
+
+{\small\obeylines\obeyspaces\tt
+Directory TEX\logsep PXL\_ROOT:[2592]
+$\vdots$
+CMBX10.PXL;1 CMBX5.PXL;1 CMBX7.PXL;1
+$\vdots$
+CMR10.PXL;1
+$\vdots$
+}
+
+\subsection{Modifying the Command Definition File}
+The distributed installation kit for \DVItoLN{} includes a file {\tt
+DVITOLN03.CLD} which defines the {\tt DVILN03} command and its qualifiers.
+Since individual sites may have different mixtures and arrangements for
+their packed and unpacked (if any) pixel files, and the commonest type of
+output device in use, the sensible place to allow
+for these changes is in this file. Therefore it should be modified
+to reflect local requirements in the definitions of the following
+qualifiers:
+\begin{itemize}
+ \item \verb|/DEVICE_TYPE|,
+ \item \cbstart\verb|/PAPER_SIZE|,
+ \item \verb|/(NO)VERBOSE|,\cbend
+ \item \verb|/TFM_DIRECTORY|,
+ \item \verb|/PK_FONT_DIRECTORY|,
+ \item \verb|/PXL_FONT_DIRECTORY|, and
+ \item \verb|/VIRTUAL_DIRECTORY|.
+\end{itemize}
+
+Furthermore, the line reading `{\tt image "TEX\logsep EXE:DVITOLN03"}' may
+need to be changed to reflect the location of the program's executable image
+at your site.
+
+
+The \verb|/DEVICE_TYPE| qualifier has its possible values defined by that
+section of the \verb|DVITOLN03.CLD| file headed
+`\verb|define type PRINTERS|'\@. Just
+one of these values should be marked as `\verb|default|'; the distributed
+version makes \verb|LN03| the default printer type. \cbstart Similarly, the
+\verb|/PAPER_SIZE| qualifier is set by marking the default
+definition in the `\verb|define type PAPER_TYPES|' section as either
+\verb|A4| or \verb|US|.\cbend
+
+As described above, at RMCS we have our unpacked pixel files in a tree
+structure, whilst our packed files are all in a single directory, with
+logical names defined appropriately. Therefore, the relevant section of our
+{\tt DVITOLN03.CLD}
+file looks like this:\ifdollars
+\begin{verbatim}
+ qualifier PK_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX$PK:",type=$file)
+ qualifier PXL_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX$PXL_ROOT:",type=$file)
+\end{verbatim}\else
+\begin{verbatim}
+ qualifier PK_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX_PK:",type=$file)
+ qualifier PXL_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX_PXL_ROOT:",type=$file)
+\end{verbatim}\fi
+(Where the logical name {\tt TEX\logsep PK} is defined as
+{\tt TEX\logsep ROOT:[FONTS.PK]} and {\tt TEX\logsep PXL\_ROOT} as
+{\tt TEX\logsep DISK:[TEX.FONTS.PXL.]}\footnote{The latter cannot be
+written as {\tt TEX\logsep ROOT:[FONTS.PXL.]} because that would cause VAX
+Record Management Services (RMS) to attempt to interpret the expanded string
+{\tt TEX\logsep DISK:[TEX.][FONTS.PXL.][1500]\dots}!})
+
+Modifications that you may wish to undertake are:\begin{itemize}
+ \item Change either or both {\tt default=} strings to reflect the actual
+ directory specification instead of using a logical name.
+ \item If your site doesn't use one of these file classes at all, remove
+ the line `\verb|default,|' from the relevant qualifier's definition.
+\end{itemize}
+
+At least one of these qualifiers {\em must\/} have a default or explicit value
+provided, through the {\tt.CLD} file or a command-line qualifier; the
+program cannot run without some source of pixel files. If both formats of
+pixel files are in use at a site, then the packed ones will be inspected
+before any attempt to open unpacked files.
+
+To make use of the {\tt DVILN03} command, each user must issue the DCL
+command\footnote{Some sort of logical name or other means of expressing the
+specification of the directory in which {\tt DVITOLN03.CLD} resides will
+most probably be required; at RMCS, we keep all such command definition
+files in the directory
+to which the logical name {\tt TEX\logsep EXE:} refers}%%% SYSDEP
+\begin{description}
+ \item[\prompt] \verb|SET COMMAND DVITOLN03|
+\end{description} to read the (possibly revised) command definition file; \TeX
+nicians can do this for their users automatically by including the above
+\verb|SET COMMAND| in a command procedure that all users of \TeX{} execute.
+
+Even better (because the VMS Command Definition Utility isn't the fastest of
+beasts!) is for the system manager to add the {\tt DVILN03} command to
+\verb|SYS$SHARE:DCLTABLES.EXE| so that the command is always
+available on a system-wide basis; do this by issuing the
+command:\begin{description} \squash
+ \item[\prompt]\verb|SET COMMAND DVITOLN03 -|
+ \item[\cont] \verb|/TABLE=SYS$COMMON:[SYSLIB]DCLTABLES.EXE -|
+ \item[\cont] \verb|/OUT=SYS$COMMON:[SYSLIB]DCLTABLES.EXE|
+\end{description}
+This command can only be executed if you have write access
+to the directory \verb+SYS$SHARE+\footnote{Note that this section now recommends
+placing the revised tables in {\tt SYS\$COMMON}, so that separate nodes in a
+cluster don't end up running different versions of the tables; this would
+not apply, of course, if \TeX{} and its friends were not installed
+cluster-wide.}
+
+\subsection{Creating a Forms Library for use with the Queue}
+The formatting imposed by the VAX printer
+symbiont is controlled by {\sl forms\/};
+the {\tt PRINT} command takes a
+{\tt /FORM=} qualifier which may be used to specify the form to be used when
+printing any particular file. Each form defines the printable size of each
+page, and may specify that certain {\sl setup files\/} be output to the
+printer at the start of each job and/or page. A separate library of such
+setup files may be specified for each queue.
+
+A couple of such setup files will be required for use with an LN03, and at
+this installation they are held in the file \verb|SYS$LIBRARY:LN03CTL.TLB|
+which is a text library\footnote{It is a requirement of the printer
+symbiont that forms libraries be in directory {\tt SYS\$LIBRARY:}}. It is
+necessary, therefore, to create such a library; this need be done only
+once:\begin{description}
+ \item[\prompt] \verb|LIBRARY/CREATE/TEXT SYS$LIBRARY:LN03CTL|
+\end{description}
+For printing {\tt .LN3} files, at least the following two setup
+files will be required:
+\begin{enumerate}
+ \item {\tt RESET.TXT} --- should contain the escape sequence to reset
+ the LN03 to its factory settings, thus clearing any error conditions.
+ This may be just the two character escape sequence `\ESC\verb|c|',
+ although proper resetting of an LN03-Plus requires
+ `\ESC\verb+[!p+\ESC\verb|c|' to ensure that Tektronix mode is correctly
+ cancelled.
+ \item {\tt PORTRAIT.TXT} --- should contain escape sequences to use the
+ LN03 in portrait orientation, using the appropriate paper size; at RMCS
+ we use European A4 paper in extended portrait format; an appropriate
+ sequence would be: `\ESC\verb*|[?22 J|\ESC\verb|[16m|%
+ \ESC\verb|(B|\ESC\verb|)0|\ESC\verb|*<|\ESC\verb|+>|'.
+ This setup sequence actually is required only for
+ non-\TeX{} use of the printer; it defines the paper area to be used,
+ selects a standard (DEC monospaced) font, and designates the G0\dots G3
+ character sets. None of this is strictly necessary for use by \TeX,
+ since \DVItoLN{} puts appropriate escape sequences into the {\tt .LN3}
+ file to control all these features; however, such a setup file would be
+ useful for formatting ordinary (non-\LaTeX) text printing on the LN03.
+\end{enumerate}
+It may be convenient to define other setup files such as {\tt LANDSCAPE.TXT},
+{\tt ELITE.TXT}, {\it etc\/}.
+
+\subsection{Defining Forms for use with LN03 Queue}
+Only one form is required specifically for printing \LN{} files; other
+forms may be defined for convenience when printing other files on the LN03.
+At RMCS, this form is called {\tt PLOT\logsep FORM}, since it is also used to
+``format'' for printing files which constitute screen dumps taken from
+graphics terminals. It has been arbitrarily assigned as form number 83, and
+the example below uses this name and number. Of course, such nomenclature
+needs to be assigned suitably at each site by the system manager.%%% SYSDEP
+
+The following command would generate an appropriate form; the footnotes
+detail items to which particular attention should be paid:
+
+{\small\begin{description}\squash
+ \item[\prompt] \verb|DEFINE/FORM-|
+ \item[\cont]
+ \verb|/DESCRIPTION="Portrait 66x80 without WRAP for laser printers"-|
+ \item[\cont] \verb|/LENGTH=66-|
+ \item[\cont] \verb|/MARGIN=(BOTTOM=0,LEFT=0,RIGHT=0,TOP=0)-|\footnote{No
+ margins around the text; these could
+ introduce spurious spaces, which might
+ even be in the middle of an escape
+ sequence}
+ \item[\cont] \verb|/STOCK=A4-|\footnote{Ensure that print jobs will
+ only be released to the printer when it
+ contains the correct paper type.}
+ \item[\cont] \verb|/NOTRUNCATE-|\footnote{{\tt /NOTRUNCATE/NOWRAP} to
+ ensure that the long character records
+ of the \LN{} files don't get broken up
+ by the symbiont}
+ \item[\cont] \verb|/NOWRAP-|
+ \item[\cont] \verb|/WIDTH=80-|\footnote{The width is still specified as
+ the maximum printable with the printer's
+ in-built fonts, in order that any flag
+ pages printed are of the correct width}
+ \item[\cont] \verb|/SETUP=(RESET,PORTRAIT)-|\footnote{Invoke the
+ appropriate setup files
+ when the form is used}
+ \item[\cont] {\tt\ \ \ PLOT\logsep FORM 83}
+\end{description}}
+
+\subsection{Setting the ``Terminal's'' Physical Characteristics}
+The first step, assuming that a LN03 or LN03-Plus printer has been connected
+to a particular terminal port of the {\sl VAX}, is to configure that port;
+at RMCS the terminal has been connected to
+\verb|_TXA4:|, %%% SYSDEP
+but this will obviously be installation-dependent. Therefore the examples
+refer to the terminal line through the DCL symbol \verb|LASER_TERM|, this
+can be equated to the real device by means of a DCL string assignment such
+as the following:\begin{description} %%% SYSDEP
+ \item[\prompt] \verb|LASER_TERM = "_TXA4:"|
+\end{description}
+Therefore, we will need to issue a command somewhat like this (refer to the
+footnotes for the {\it raison d'\^etre\/} behind some of these settings):
+\begin{description}\squash
+ \item[\prompt]\verb|SET TERMINAL-|
+ \item[\cont] \verb|/PERMANENT-|\footnote{Note that this has to be
+ done to the {\sl permanent\/} characteristics}
+ \item[\cont] \verb|/DEVICE_TYPE=LN03-|\footnote{We set the terminal
+ device type, using {\tt /DEVICE\_TYPE}\@. This
+ should take care of things like {\tt /FORM},
+ {\tt /TAB}, {\it etc}, although we can't do any
+ harm by mentioning these explicitly!}
+ \item[\cont] \verb|/FORM-|
+ \item[\cont] \verb|/TAB-|
+ \item[\cont] \verb|/SPEED=19200-|\footnote{To improve the speed at
+ which documents are printed, it is best if the
+ printer is set up to its fastest speed,
+ 19,200Bd}
+ \item[\cont] \verb|/WIDTH=255-|\footnote{Typically, {\tt .LN3} files
+ contain records up to about 180 characters long
+ (including escape sequences); therefore we don't
+ want the terminal driver to interrupt these,
+ and insert spurious CR-LF pairs,
+ so we set an artificially high {\tt /WIDTH} and
+ also ensure that the ``terminal'' is set {\tt
+ /NOWRAP}}
+ \item[\cont] \verb|/NOWRAP-|
+ \item[\cont] \verb|/PAGE=66-|\footnote{Other (non-{\tt.LN3}) files
+ printed on the device need to use only 66 lines
+ per page}
+ \item[\cont] \verb|/NOBROADCAST-|\footnote{We don't want operator
+ messages to terminals to get to the printer, so
+ set it {\tt /NOBROADCAST}}
+ \item[\cont] \verb|/NOMODEM-|
+ \item[\cont] \verb|/NOHANGUP-|
+ \item[\cont] \verb|/NOECHO-|\footnote{Any input from the printer
+ (possible error status reports) should {\bf
+ not} be echoed back to it, so set the terminal
+ {\tt /NOECHO}}
+ \item[\cont] \verb|/DMA-|
+ \item[\cont] \verb| 'LASER_TERM'|
+\end{description}
+
+Most probably we would arrange for these operations to be performed whenever
+the {\sl VAX\/} is booted, by including the commands in [a command procedure
+which is invoked from within] \verb|SYS$MANAGER:SYSTARTUP_V5.COM|
+
+Now that we've set the characteristics of the terminal line connected to the
+LN03 we need to associate it with a print queue (for transparent spooling,
+{\it e.g.\/} if someone types the command \verb|COPY filename _TXA4:|); in
+this example, we're configuring the queue {\tt SEES\logsep LASER}, using device
+\verb|SYS$SYSDEVICE:| for spooling:--
+
+\begin{description}\small
+\item[\prompt]
+{\tt SET DEVICE/SPOOLED=(SEES\logsep LASER,SYS\$SYSDEVICE) 'LASER\_TERM'}
+\end{description}
+
+Finally, we are ready to create and start the printer queue; we associate the
+appropriate ({\tt PLOT\logsep FORM}) default form with the queue, for use with
+transparent spooling printing, and arrange for the appropriate setup file to
+be used to clear the queue between each job:--
+\begin{description}\small\squash
+\item[\prompt]\verb|INITIALIZE/QUEUE-|
+ \item[\cont] \verb|/NOENABLE_GENERIC-|
+ \item[\cont] \verb|/NOBATCH-|
+ \item[\cont] {\tt /FORM=PLOT\logsep FORM-}
+ \item[\cont] \verb|/NORETAIN-|
+ \item[\cont] \verb|/LIBRARY=LN03CTL-|
+ \item[\cont] \verb|/SCHEDULE=NOSIZE-|
+ \item[\cont]
+ \verb|/SEPARATE=(NOBURST,FLAG=ONE,NOTRAILER,RESET=(PORTRAIT))-|%
+ \footnote{Note that the {\tt RESET} module is not specified here; if
+ it were, the symbiont would insert a spurious blank page after each
+ job}
+ \item[\cont] \verb|/START-|
+ \item[\cont] {\tt /DEFAULT=(NOFEED,NOFLAG,FORM=PLOT\logsep FORM)-}
+ \item[\cont] \verb|/ON='LASER_TERM'-|
+ \item[\cont] \verb|/RECORD_BLOCKING-|
+ \item[\cont] {\tt\ \ \ SEES\logsep LASER}
+\end{description}
+
+\newpage
+\section{{\tt DVILN03} Command Qualifiers}\label{sec:qualifiers}
+As already described, the {\tt DVILN03} command takes \cbstart nineteen
+\cbend
+qualifiers; their functions are as follows:\begin{description}
+ \item[\tt /STARTING\_PAGE=\meta{page\_string}] Takes a string-valued
+ item which specifies the number of the first page to be processed.
+ The format of this string may be defined, using BNF notation, as
+ follows:
+ \begin{itemize}
+ \item[] \meta{page\_string} ::= \meta{string\_item} $|$
+ \meta{page\_string}{\tt.}\meta{string\_item}
+ \item[] \meta{string\_item} ::= {\tt*} $|$ \meta{integer}
+ \end{itemize}
+ The default is `{\tt *}', which matches any page number, and hence
+ will commence by processing the first page in the file. Each
+ successive \meta{string\_item} is used to attempt matches with each
+ succeeding one of \TeX's counters \verb|\count0| \dots
+ \verb|\count9|; the first of these is by convention used for the
+ page number. Successive counters may be used for special effects,
+ for example, to start printing at the first page whose
+ \verb+\count0+ is 3 and \verb+\count3+ is 6, one could use
+ \verb+/STARTING_PAGE=3.*.*.6+.
+ \item[\tt /NUMBER\_OF\_PAGES=\meta{positive\_integer}] Takes a value
+ which indicates the total number of pages to be printed, including
+ the \verb|STARTING_PAGE|\@. The default value (of {\tt 10000000})
+ is normally large enough to print the whole of a document!
+ \item[\tt /TOP\_MARGIN=\meta{dimension}] Specifies how far down
+ from the top edge of the paper the reference point is to be placed.
+ The value may be given in any of \TeX's \meta{physical unit}s ({\tt
+ pt sp pc in cm mm dd cc}), with the addition of {\tt mi} and {\tt
+ px}, and the default value (of {\tt 300px}) places the reference
+ point at the conventional one inch from the top edge.
+ \item[\tt /LEFT\_MARGIN=\meta{dimension}] Specifies how far across from
+ the left edge of the paper the reference point is to be placed.
+ The value may again be given in any \meta{physical unit}, and the
+ default value (of {\tt 300px}) places the reference point at the
+ conventional one inch from the left edge.
+ \item[\tt /ORIENTATION] Takes the values {\tt PORTRAIT} or {\tt
+ LANDSCAPE} and specifies in which orientation the {\tt .LN3} file is
+ to initialize the LN03. Unless you have taken measures to change
+ \LaTeX's assumptions about the paper size (by changing such page
+ layout parameters as \verb+\textheight+), use of
+ \verb|/ORIENTATION=LANDSCAPE| will lead to text overflowing the page.
+ \item[{\tt/\rm[\tt NO\rm]\tt LOG}] Ordinarily, \DVItoLN{} will delete
+ the log file ({\tt .TYP}) provided no anomalies of any form were
+ detected. However, if the program issued {\em any\/} error or
+ warning messages, the file will be retained for later perusal. By
+ specifying {\tt/LOG}, we can force the program always to retain the
+ file, whilst {\tt/NOLOG} will always discard the file, even if
+ errors/warnings were issued.
+
+ Optionally, the {\tt/LOG} qualifier can take a value, which can be a
+ complete or partial file specification to override the defaults
+ which normally apply to this file. For example,
+ \begin{description}
+ \item[\prompt] \verb|DVIL/LOG=.DVI_LOG xx|
+ \end{description}
+ would
+ create the log file as \verb+XX.DVI_LOG+, in the current directory,
+ instead of as \verb+XX.TYP+. Even if there were no errors, the log
+ file would be retained after \DVItoLN{} had finished its
+ processing.
+ \item[{\tt/\rm[\tt NO\rm]\tt VERBOSE}] \cbstart If \verb|/NOVERBOSE| is
+ specified, messages indicating progress during the initial scans of
+ the input file are suppressed, as are those showing the sizes of
+ individual fonts downloaded, and any sixel files read by a
+ \verb|\special| command.\cbend
+ \item[\tt /OUTPUT] This qualifier, if used, must specify a partial or
+ complete file specification to override the defaults for the \LN{}
+ file; for example\begin{description}
+ \item[\prompt] \verb|DVIL/OUTPUT=WORK$DIR:SILK_PURSE SOWS_EAR|
+ \end{description}
+ would direct the output to \verb+SILK_PURSE.LN3+ in
+ directory \verb+WORK$DIR:+ (whatever that might be) instead of to
+ \verb+SOWS_EAR.LN3+ in the current directory.
+ \item[\tt /DEVICE\_TYPE=\meta{device name}] Specifies the type of
+ printer on which the output file is intended to be printed; at
+ \sitename, the default value for this qualifier is
+ \verb|LN03|. %%% SYSDEP
+ Other possible values are \verb|LN05| and \verb|LN06|; certain other
+ combinations of the next three qualifiers may only be specified in
+ association with suitable values for this qualifier.
+ \item[\tt/PRINT\_MODE=(\meta{modelist})] Specifies whether the printer
+ shall print \verb|SIMPLEX| (one side of paper only) or
+ \verb|DUPLEX| (on both sides of the paper: with the LN03
+ and LN05 printers, \verb|DUPLEX| may only be specified in
+ conjunction with the \verb|MASTER| mode.) For duplex printing, the
+ user may in addition specify whether the reverse side of each sheet
+ shall be printed ``right way up'' (\verb|NORMAL|) or ``upside-down''
+ (\verb|TUMBLED|); tumbled output can be useful for generating a
+ document that's intended to be bound along its short edge (in
+ portrait orientation).
+
+ The \verb|MASTER| mode is only of use in conjunction with
+ \verb|DUPLEX|; it causes blank pages to be generated when necessary,
+ but all output appears printed on one side of the paper only---since
+ blank pages are interspersed as necessary, the resultant output may
+ be readily photocopied into a double-sided document.
+
+ To specify more than one mode with this qualifier, enclose a list of
+ modes, separated by commas, within parentheses; for example:
+ \begin{itemize}
+ \item[]\verb|/PRINT_MODE=(DUPLEX,NORMAL,MASTER)|
+ \end{itemize}
+
+ \item[{\tt /\rm[\tt NO\rm]\tt DUPLEX\_BY\_PAGE\_NUMBERS}] This qualifier
+ is present by default, but only has any effect when \verb|DUPLEX| is
+ specified within the \verb|PRINT_MODE| qualifier list; it causes a
+ blank page to be
+ ejected whenever two even-numbered pages follow each other, and also
+ when two odd-numbered pages follow each other; thus odd-numbered
+ pages always appear on the front of a printed sheet, and even-%
+ numbered ones on the reverse. Printers (the people, not the
+ machines!) refer to such pages as {\it recto\/} and {\it verso},
+ respectively, since the odd pages appear on the right, and the even
+ ones on their reverse (the left). Note that page~0 is treated,
+ exceptionally, as an odd-numbered page, so that it will appear on
+ the right, since such pages often form the title or cover page of a
+ document.
+
+ Note that specifying \verb|/NODUPLEX_BY_PAGE_NUMBERS| causes both
+ sides of every sheet (except, possibly, the last) to be printed; no
+ blank pages will be interspersed.
+
+ \item[\tt/FEED\_TRAY=(\meta{traylist})] With the LN06, it is possible
+ to specify from which of its feed trays paper shall be fed; such
+ specifications may apply to all the sheets printed, or the first
+ sheet may be specified to be taken from a different source compared
+ with that used for the subsequent sheets. The syntax requires
+ either one entry, {\tt ALL=\meta{traytype}}, or either
+ {\tt FIRST=\meta{traytype}} and/or {\tt REST=\meta{traytype}}: the
+ \meta{traytype}s can be any one of:
+ \begin{itemize}
+ \item \verb|DEFAULT_TRAY|,
+ \item \verb|TOP_TRAY|,
+ \item \verb|BOTTOM_TRAY|,
+ \item \verb|ENVELOPE_TRAY|,
+ \item \verb|MANUAL_FEED|
+ \end{itemize}
+
+ \noindent{\sl Example:\/}
+ \verb|/FEED_TRAY=(FIRST=TOP_TRAY,REST=BOTTOM_TRAY)|
+
+ The values \verb|TOP_TRAY| and \verb|MANUAL_FEED| may be specified
+ when using the LN05 (DEClaser~2100) printer; the program doesn't yet
+ support the optional 1000-sheet capacity tray that may be fitted to
+ the LN05 and LN06 (mainly because the author hasn't discovered how
+ to address it!)
+
+ Tray selection is not supported, of course, on the original LN03
+ printer.
+
+ \item[\tt/HFUZZ=\meta{dimension}] Control the distance by which text
+ must exceed the right margin (as defined by \TeX{} in the \DVI{}
+ file) before \DVItoLN{} complains that `{\tt Page wider than TeX
+ reported by $x$pt}'.
+
+ When \TeX{} generates a \DVI{} file, it
+ includes in that file information regarding the maximum width and
+ depth of the pages created: when \DVItoLN{} processes the \DVI{}
+ file, it will produce (and it always has produced) warning messages
+ if any characters exceed these limits. Ordinarily, such excursions
+ ``beyond the margins'' will not occur (at least, not without \TeX{}
+ having issued an `{\tt overfull \bs.box}' warning itself), but some
+ macro packages {\em do\/} permit \TeX{} to exceed the
+ boundaries\footnote{For example, the output of {\sc Weave}, when
+ formatted by the {\tt webmac} macros, permits lines of formatted
+ {\sc Pascal} code to exceed the right-hand margin by up to 10pt.}.
+
+ By using this qualifier with some suitable dimension, such messages
+ can be suppressed; however, you should only use this if you truly
+ are being overloaded by such messages, since the default is intended
+ to inform you that \TeX{} didn't do a good job of the setting, and
+ there really {\em will\/} be something sticking out into the margin.
+
+ The default value ({\tt100sp}) corresponds to that formerly
+ `hard-wired' into the program: this is an invisibly small distance,
+ approximately equivalent to the wavelength of visible light(!) but
+ is large enough to absorb any rounding errors that may have
+ occurred.
+
+ \item[\tt/VFUZZ=\meta{dimension}] This is analogous to the \verb+/HFUZZ+
+ qualifier above, but takes care of those occasions on which \TeX{}
+ has set text below the bottom of the area that it has notified as
+ being the maximum depth of the page; the related warning message
+ from \DVItoLN{} is `{\tt Page deeper than TeX reported by
+ $y$pt}'. The author has never found any circumstances under which
+ \TeX{} does this, but the qualifier is available for anyone who does
+ suffer from this warning! Once again, the default value for the
+ qualifier is {\tt100sp}.
+
+ \item[]{\sl The following qualifiers should never need to be used by
+ ordinary users; the information below is mainly intended to help system
+ managers:}
+
+ \item[\tt /PK\_FONT\_DIRECTORY] This must specify a directory (or
+ directory tree) in which the packed pixel files (if used) are to be
+ found. Directory trees are indicated by having `{\tt.]}' as the
+ last two characters of the ``directory'' specification. A logical
+ name may be given for this qualifier, provided it resolves to an
+ appropriate directory specification; do remember to include a
+ terminating `{\tt:}', because the qualifier itself is used verbatim
+ as a prefix to the file specification for each font file. If a
+ multi-valued logical name is used, the equivalence strings must {\em
+ all\/} reference single directories, or must {\em all\/} reference
+ directory trees; only the first equivalence string is examined to
+ determine whether a flat or tree structure is being used. The {\tt
+ DVITOLN03.CLD} command definition file provided has the default
+ value {\tt TEX\logsep PK:} for this qualifier.
+ \item[\tt /PXL\_FONT\_DIRECTORY] This specifies the directory (or
+ directory tree) in which unpacked pixel raster files may be found,
+ if used. The same rules regarding use of logical names apply here
+ as to the previous qualifier. The {\tt.CLD} file provided gives
+ this a default value of {\tt TEX\logsep PXL\_ROOT:}.
+ \item[\tt /TFM\_DIRECTORY]
+ This specifies the directory (or directories)
+ in which the \TeX{} Font Metrics (\TFM) are to be found by the
+ program. The distributed version of the {\tt DVITOLN03.CLD} file
+ has {\tt TEX\logsep FONTS:} as the default value for this qualifier.
+ \item[\tt /VIRTUAL\_DIRECTORY] This specifies the directory (or
+ directories) in which Virtual Font ({\tt.VF}) files are to be found
+ by the program. The distributed version of the {\tt DVITOLN03.CLD}
+ file has {\tt TEX\logsep FONTS:} as the default value for this
+ qualifier, thus placing {\tt.VF} files in the same directory as the
+ \TFM{} files. If virtual fonts are not in use, remove the line
+ `\verb|default,|' from the definition of this qualifier.
+ \item[\tt/PAPER\_SIZE] \cbstart This qualifier must have one of the
+ values (defined in the \verb|PAPER_TYPES| section of the {\tt.CLD}
+ file) specified as default. The value ({\tt A4} or {\tt US}) should
+ reflect the setting of the paper size switch at the rear of the
+ printer. As might be expected, the values prepare the program to
+ use European ($210\times297$mm) or US Letter ($8\frac12\times11$in)
+ paper, respectively.\cbend
+\end{description}
+
+\chapend
+\section{How to use your own Fonts with \TeX\ and
+DVItoLN03}\label{appx:private-fonts}
+Ordinary users should {\bf never} have any requirement to use the qualifiers
+that select the location of the \TFM\ or pixel raster files; exceptionally,
+however, if you need to use a special font that doesn't otherwise exist in
+the standard directories, these qualifiers can be used, in conjunction with
+process logical names, to permit access to the user's own font(s) as well as
+the standard ones.
+
+First of all, both \TeX{} itself and \DVItoLN{} will require access to the
+\TeX{} Font Metrics; as already described, these normally reside in a
+directory to which the logical name {\tt TEX\logsep FONTS}
+refers; one could, of course, simply redefine this
+logical name to point to the new fonts, but then neither \TeX{} nor
+\DVItoLN{} would be able to locate the {\em standard\/} fonts. So one might
+define what {\sl Digital\/} call a search-list (but the author prefers to
+call a multi-valued logical name), like this:
+\begin{description}
+ \item[\prompt] {\tt DEFINE MY\_FONTS [MY\_DIR.TFM],TEX\logsep FONTS}
+\end{description}
+Then to run \LaTeX, one would have to say:
+\begin{description}
+ \item[\prompt] \verb|LATEX/FONT_DIRECTORY=MY_FONTS: MY_FILE|\footnote{Note
+ the `{\tt:}' after the logical name; whatever is
+ provided as the value for the
+ {\tt/FONT\_DIRECTORY} qualifier must legally be
+ capable of being prefixed to a file
+ specification}
+\end{description}
+This will allow \LaTeX{} to access both the standard and your own fonts;
+since your fonts precede the standard ones in the search list, \TFM{} files
+will be taken from your directory in preference to any of the same name that
+might already be in the standard location.
+
+To run \DVItoLN, it must have access not only to the \TFM{} files, but also
+to the pixel raster files (either packed or unpacked). Whichever file
+directory organization has been chosen for these (and packed and unpacked
+rasters can utilize different organizations), the pixel files for your
+private fonts {\em must\/} have the same organization. Therefore, if you
+have only packed pixel files, and the standard fonts are arranged in a flat
+directory, referenced by the logical {\tt TEX\logsep PK},
+you might make the following definition:
+\begin{description}
+ \item[\prompt] {\tt DEFINE MY\_PK\_FILES [MY\_DIR.FONTS.PK],TEX\logsep PK}
+\end{description}
+
+Alternatively, or additionally, if you have unpacked pixel rasters in a
+rooted directory structure, the following definition might suffice, assuming
+that the standard fonts are accessible through
+{\tt TEX\logsep PXL\_ROOT}:
+\begin{description}
+ \item[\prompt]
+ {\tt DEFINE MY\_PXL\_FILES [MY\_DIR.FONTS.PXL.],TEX\logsep PXL\_ROOT}
+\end{description}
+
+Then to run \DVItoLN, providing it with access to the \TFM{} and pixel files
+of both your own and the standard fonts, it would be necessary to invoke the
+program like this:
+\begin{description}\squash
+ \item[\prompt] \verb|DVILN03 /TFM_DIRECTORY=MY_FONTS:|\footnote{Again,
+ note that the `{\tt:}' is necessary on the user-defined
+ logical name so that it may be prepended to a file
+ specification} -
+ \item[\cont] \verb|/PK_FONT_DIRECTORY=MY_PK:|\footnote{And/or {\tt
+ /PXL\_FONT\_DIRECTORY=MY\_PXL\_FILES:}} \verb|MY_FILE|
+\end{description}
+
+Once such a private font has been proven locally in your directory, it would
+be better if you got your local \TeX nician to install the fonts along with
+the standard ones (unless there are licensing restrictions applicable to the
+use of the non-standard fonts), since it will save the usage of all those
+awkward command-line qualifiers!
+
+\chapend
+\section{The GINOtoSIX Program}\label{appx:GINOtoSIX}
+This program was written by Squadron Leader John {\sc Baggott}, who was an
+M.Sc.\ student at RMCS in 1987. It is written in {\sc Fortran} and has a
+full DCL command-line interface. \ifrmcs\else Any site that is interested
+in acquiring a copy of the program is welcome to request it by sending an
+e-mail message to the author of \DVItoLN{},
+\verb+<TeX@uk.ac.cranfield.rmcs>+ ({\sc Janet}).\fi
+
+\subsection{Preparing to use {\tt GINOtoSIX}} Before first attempting to use
+the program, invoke its command definition, by executing the following
+command:
+\begin{description}
+\item[\prompt] \tt SET COMMAND TEX\logsep EXE:GINOTOSIX %%% SYSDEP
+\end{description}
+(Frequent users of the utility may care to put this command into their login
+command procedure.)
+
+\subsection{Using the {\tt GINOtoSIX} Program}
+Whatever graphics are required to be converted to sixel format must firstly
+be output by GINO into a pseudo-code file (using the {\tt SAVDRA} driver).
+Then invoke {\tt GINOtoSIX} as follows:
+\begin{description}
+\item[\prompt] \tt GINOTOSIX \meta{file\_name}
+\end{description}
+
+\subsubsection{Qualifiers applicable to {\tt GINOtoSIX}}
+The utility can take a number of optional qualifiers, as under:
+
+\begin{description}
+\item[\tt/SIZE=(\meta{option,\dots})] Specifies the area, in millimetres, of
+the sixel image. If this qualifier is not used, the default action is to
+copy the window size (or the paper size if windowing is not in effect) of
+the saved picture segment.
+
+Options are as follows:
+ \begin{description}
+ \item[\tt WIDTH:\meta{number}] Specifies the width in mm of the sixel
+ image; defaults to the saved width.
+ \item[\tt HEIGHT:\meta{number}] Specifies the height in mm of the sixel
+ image; defaults to the saved height.
+ \end{description}
+
+If only one option is specified, the parentheses may be omitted.
+
+{\bf N.B.} If this qualifier is used in conjunction with the {\tt/SCALE}
+qualifier, the action is firstly to scale, then window the image. If the
+{\tt/SCALE} qualifier is not used, the image is scaled to fit the size
+specified.
+
+\item[{\tt/\rm[\tt NO\rm]\tt FORMFEED}] Instructs {\tt GINOtoSIX} to append
+a form feed character to the end of the sixel file. This allows the output
+to be queued directly to the LN03 printer for previewing. A formfeed must
+{\bf not} be appended to sixel files that are to be imported into a \LaTeX{}
+document by the \verb+\gino+ command (from the {\tt graphics} style option).
+
+The default is {\tt/NOFORMFEED}.
+\item[\tt/SCALE=\meta{factor}] Scale the stored image by a factor; the
+default factor is $1{\cdot}0$.
+\item[\tt/SEGMENT=\meta{integer}] Specifies which picture segment in the
+{\tt SAVDRA} file is to be used for producing the image, the default is
+$0$. If this qualifier is not used, the maximum record length for the input
+file is used.
+\item[\tt/OUTPUT=\meta{file\_spec}] Controls where the output file will be
+written; \meta{file\_spec} may be a full or partial specification; if not
+specified, the file name will be that of the input file, and its extension
+will be {\tt.SIX}.
+\end{description}
+
+\subsection{Examples of the use of {\tt GINOtoSIX}}
+\begin{enumerate}
+\item \begin{description}\squash
+ \item[\prompt] \verb+GINOTOSIX FRED+
+ \end{description}
+ The program will read the file {\tt FRED.PIC}, and produce a file {\tt
+ FRED.SIX} from segment 0. The size of the sixel image will be the
+ same as the saved picture.
+\item \begin{description}\squash
+ \item[\prompt] \verb+GINOTOSIX/SCALE=0.5-+
+ \item[\cont] \verb+ /OUTPUT=DISK$SCRATCH:[FRED]GRAPH.INC FRED.GNO+
+ \end{description}
+ Read a {\tt SAVDRA} from file {\tt FRED.GNO}, and produce a half-sized
+ image in the file specified.
+\item \begin{description}\squash
+ \item[\prompt] \verb+GINOTOSIX/SIZE=(WIDTH:150,HEIGHT:100) FRED-+
+ \item[\cont] \verb+ /SEGMENT=1/FORMFEED+
+ \end{description}
+ Reads segment 1 of {\tt FRED.PIC}, and scale the image uniformly to
+ fit in a box 150mm wide and 100mm high. A formfeed will be appended
+ to permit the image to be previewed by printing the output file, {\tt
+ FRED.SIX}.
+\end{enumerate}
+
+
+\chapend\begingroup
+\catcode`\|=\active{\catcode`\_=\active
+\gdef|{\bgroup\catcode`\_=\active
+ \let_=\_\def\\##1|{{\it##1\/}\egroup}\\}}
+\section{Error and Warning Messages}
+This chapter describes all the various informational, warning, error and
+fatal error messages that \DVItoLN{} can issue. Most messages attempt to be
+self-explanatory, but this section gives full details of the conditions
+under which the error can be issued, and may therefore help the user in
+discovering why \DVItoLN{} is unable to process his/her \DVI{} file.
+
+\subsection{Fatal Errors}
+The following errors indicate that \DVItoLN{} is unable to proceed further
+with processing your \DVI{} file; where possible, methods are suggested to
+allow you to circumvent the problem. All such error messages commence with
+the text `{\tt Fatal Error:}'\footnote{Simple, isn't it!} which precedes
+the texts listed below.
+If such an error occurs, \DVItoLN{}
+will exit immediately, and the program's exit status will set the DCL symbol
+\verb+$SEVERITY+ to $4$, thus indicating a \verb+SEVERE_ERROR+.
+
+\subsubsection{Capacity Exceeded Errors}
+When \DVItoLN{} is presented with input that results in it using up all of
+some particular internal data structure, it is unable to go on! All these
+errors commence with the text `{\tt Fatal Error: capacity exceeded:}'.
+One possible solution is to recompile \DVItoLN, using a larger value for
+the appropriate parameter noted below. If you find that this is necessary
+at your site, please inform the author of \DVItoLN, who may be contacted by
+electronic mail as \ifrmcs{\tt N::TEX}\else\verb|<TeX@uk.ac.cranfield.rmcs>|
+({\sc Janet})\fi. However, sometimes it is possible to proceed by using the
+\verb|/STARTING_PAGE| and \verb|/NUMBER_OF_PAGES| qualifiers to
+process the \DVI{} file in two or more smaller portions, which {\em don't\/}
+exceed the program's limits.
+
+\begin{description}
+ \item[\tt font file name too long (max length=$x$)] --- You've had it! The
+ limit, $x$, set at $255$ by the \Web\ constant |name_length|,
+ is already at the maximum permitted by VAX/RMS.
+ \item[\tt stack size=$x$] --- \DVI{} files can contain |push| and |pop|
+ commands; \TeX{} reports in the file the maximum number of |push|es
+ that it uses, but the program has an overall limit of $x$, set to $100$
+ through the \Web\ constant |stack_size|; if this value is exceeded, it's
+ most probably due to some \meta{dvi byte} sequence running amok in a
+ virtual font, since \TeX{} would be very hard-pressed to issue that many
+ |push|es.
+ \item[\tt too many blank verso pages] --- When printing in duplex mode, with
+ the printer ``printing'' a blank side whenever two successive odd or
+ even pages occur, the \DVItoLN{} program has to identify all such
+ transitions before printing commences. The current maximum is set by
+ the \Web\ macro |max_blank_pages|, which has a value of $100$. One
+ solution which doesn't necessitate recompiling the program is to
+ reorganize your document so that there are fewer chapters which
+ require an odd number of pages!
+ \item[\tt too many glyphs $n$ > $x$] --- The total characters, $n$, in all
+ the fonts referenced within your document exceeds the storage available,
+ $x$. The latter quantity is set by the constant |max_glyphs|
+ in the \Web, and currently has the value $10000$. It is unlikely
+ that such a document could be printed, unless only a small percentage of
+ those glyphs were actually {\em used\/} in the document, because the
+ downloaded fonts would most probably exceed the memory available on the
+ printer.
+ \item[\tt too many fonts (max fonts=$x$)] --- Your document loads more than
+ $x$ different fonts. $x$ is set by the \Web{} constant
+ |max_fonts|, and currently is set to $100$.
+ \item[\tt too many LN03 fonts] --- You've had it! The LN03-plus is
+ physically unable to image glyphs from more than |max_lnfonts|$+1 (= 14)$,
+ so the ``solution'' is to process your document in sections, such that
+ no section invokes so many glyphs that this limit is exceeded. However,
+ even the \TeX book and \MF book don't require this many fonts, so you've
+ got a very convoluted document: should you perhaps speak to a
+ typographic designer?
+ \item[\tt too many names (name size=$x$)] --- The names of all the fonts
+ used in your document exceed $x$ characters in total; $x$ is set by the
+ \Web\ constant |max_names|, and is currently set to $1000$.
+ \item[\tt too many virtual characters] --- Characters taken from a virtual
+ font that require more than simple imaging of a single character from some
+ real font result in the whole of the character's sequence of \meta{dvi
+ byte}s being stored in memory. If your document makes very intensive
+ use of virtual fonts, it may be necessary to increase |vf_size| from its
+ present value of $10000$
+\end{description}
+
+\subsubsection{Bad \DVI{} File Errors}
+If \DVItoLN{} encounters a malformed \DVI\ file that prevents it from making
+any sort of valiant attempt at processing it, the program aborts with an
+error message that starts `{\tt Fatal error: Bad DVI file}'; the remainder
+of these messages are listed below. This is indicative of a serious error
+in the \DVI{} file; if you didn't generate it yourself, using \TeX, perhaps
+it was corrupted in the process of reaching your machine. Whilst \DVItoLN{}
+will attempt to explain what's wrong with the file, the tool to be used at
+this point is {\sf DVItype}: type the command
+\begin{description}
+\item[\prompt] \verb|DVITYPE|
+\end{description}
+and follow the prompts to generate a printable analysis of the offending
+file.
+
+\pagebreak[3]
+\begin{description}
+ \item[\tt all 223s] --- A \DVI{} file is supposed to finish with at least 4
+ characters having the value $223$; your file appeared to consist of
+ nothing but this character!
+ \item[\tt byte $m$ is not bop] --- \DVItoLN{} expected to find a |bop|
+ command at this point in the \DVI{} file, since it was all ready to
+ start processing a new page. $m$ indicates the byte number within the
+ file.
+ \item[\tt byte $m$ is not post] --- \DVItoLN{} expected to find the start of
+ the postamble at the indicated location in the file.
+ \item[\tt denominator is $d$] --- \TeX{} reports in the \DVI{} file the
+ actual size of the `DVI units' used therein; in fact, they are always
+ {\tt1sp} in \TeX{} output, although it would be feasible for other
+ programs that generate \DVI{} files to select a different unit. \TeX{}
+ reports the actual unit by means of a pair of integers, which, treated
+ as a rational number, will convert `DVI units' to decimicrons
+ ($0{\cdot}1\mu\hbox{m}=10^{-7}\hbox{m}$). Thus the value given to the
+ denominator by \TeX{} is usually $7227\cdot2^{16} = 473628672$, because
+ there are $2^{16}$ scaled points in a point, and there are $7227$ points
+ in 100 inches. The numerator is then $25400000 \equiv 254\hbox{\tt cm} =
+ 100\hbox{\tt in}$. This error message will be issued if the denominator
+ is negative.
+ \item[\tt first byte isn't start of preamble] --- The \DVI{} file is
+ expected to start with the |pre| command, indicating the start of the
+ preamble.
+ \item[\tt ID byte is $k$] --- The second byte of the \DVI{} file indicates
+ which version of DVI is in use; this program supports only version $2$.
+ \item[\tt magnification is $m$] --- The \DVI{} file reports whatever
+ \verb+\magnification+ may have been specified to \TeX; the given value
+ is negative!
+ \item[\tt no 223s] --- As mentioned above (see `{\tt all 223s}'), the
+ postamble is followed by a sequence of at least four bytes having the
+ value $223$; but this \DVI{} file didn't!
+ \item[\tt numerator is $n$] --- See `{\tt denominator is $d$}' above.
+ \item[\tt only $n$ bytes long] --- The \DVI{} file wasn't long enough to
+ have contained a valid preamble and postamble, let alone any useful
+ information!
+ \item[\tt page ended unexpectedly] --- A page being processed finished
+ without an explicit |eop| command, and is corrupt.
+ \item[\tt page link $p$ after byte $q$] --- The start of a page was
+ indicated as being so close after the start of the previous one that
+ there were insufficient bytes to contain the necessary bytes that are
+ required to follow the |bop| code.
+ \item[\tt post pointer $q$ at byte $m$] --- Just after the postamble the
+ address of the postamble itself is supposed to be stored: in the given
+ \DVI{} file, this pointed {\em outside\/} the file!
+ \item[\tt signature in byte $n$ should be 223] --- The {\em whole file\/}
+ (after the end of the postamble) is supposed to be filled with the $223$
+ bytes mentioned above; this file started off correctly, but then
+ degenerated into something else!
+ \item[\tt the file ended prematurely] --- Whilst processing a page,
+ \DVItoLN{} detected the end of the \DVI{} file.
+\end{description}
+
+\subsubsection{Internal Errors}
+These are those errors that fall into the category of ``this can't happen''.
+The error message commences with `{\tt Fatal Error: Internal error}'. Such
+errors reveal some sort of coding error: if you ever see one of these
+errors, please contact the author, Brian {\sc Hamilton Kelly}, providing as
+much information as is necessary for him to reproduce the fault; this should
+include either the \TeX\ source, together with any non-standard style files,
+or the actual \DVI{} file being processed --- the latter can be encoded with
+{\sf VVencode}~\cite{RMCS:VVcode} for transmission by e-mail.
+
+Reports should be sent to \ifrmcs{\tt N::TEX}\else
+ {\tt<TeX@uk.ac.cranfield.rmcs> \sc(Janet)}\fi.
+
+\begin{description}
+ \item[\tt (no dvi\_length)] --- Program couldn't determine the
+ actual length of the \DVI{} file.
+ \item[\tt (word at odd byte $n$)] --- Words written into the
+ downloaded font `file' must start at an even byte in the file.
+ \item[\tt (longword at odd byte $n$)] --- Longwords written
+ into the downloaded font `file' must start at an even byte in the file.
+ \item[\tt (empty font)] --- An internal procedure has been
+ asked to load an unused font to the printer.
+ \item[\tt (-ve delta x)] --- A forward displacement in an
+ output line has somehow managed to become a backwards one, despite
+ sorting the list into non-overlapping segments!
+ \item[\tt (String pool overflow)] --- More \verb+\special+
+ strings are defined at program initialization than the program has room
+ for.
+\end{description}
+
+\subsubsection{Other Fatal Errors}
+Certain other conditions can cause \DVItoLN{} to abandon hope; these just
+commence with `{\tt Fatal Error:}'
+
+\begin{description}
+ {\sloppy\item[{\tt Bad /PK\_FONT\_DIRECTORY qualifier; doesn't end with
+ a `]'}] --- The \linebreak[4] value provided for the
+ \verb+/PK_FONT_DIRECTORY+ qualifier, after applying logical name
+ translation, must end with a `{\tt]}' character; check what value is
+ being used with this qualifier.}
+ \item[{\tt Bad /PXL\_FONT\_DIRECTORY qualifier; doesn't end with
+ a `]'}] \hfil --- \linebreak[4] The value provided for the
+ \verb+/PXL_FONT_DIRECTORY+ qualifier, after applying logical name
+ translation, must end with a `{\tt]}' character; check what value is
+ being used with this qualifier.
+ {\sloppy\item[\tt Bad /\meta{qualifier} value] --- The value provided
+ with the indicated qualifier does not form a valid integer.}
+ {\sloppy\item[\tt Bad pk file---more bits than required] --- The packed
+ pixel file currently being read (as shown by the preceding `{\tt Font
+ \meta{fontname}}') provides more bits for a character packet than
+ indicated in the character's preamble.}
+ Replace the offending font; use {\sf PKtype} to analyze the pixel file.
+ \item[\tt Bad pk file! Bad packet length] --- The packed pixel file
+ contains a character packet of an illegal length.
+ Replace the offending font.
+ \item[\tt Bad pk file, pre command missing] --- The packed
+ pixel file doesn't \linebreak[4] commence with the requisite |pre| command.
+ Replace the offending font.
+ \item[\tt Bad pk file; unexpected byte: $p$] --- Whilst reading a packed
+ pixel file, the byte value $p$ was met: this was invalid in the current
+ context.
+ Replace the offending font.
+ \item[\tt Bad pk file, wrong version] --- The packed pixel file is of a
+ software version incompatible with the \DVItoLN{} program.
+ Replace the offending font.
+ \item[\tt Couldn't create \meta{filename}] --- \DVItoLN{} was
+ unable to create the file indicated: check that you have write access to
+ the current default directory, or that designated by the \verb+/OUTPUT+
+ qualifier.
+ {\sloppy\item[\tt Couldn't open \meta{filename}. Status=\meta{VMS\_Error}]
+ --- When \DVItoLN{} attempted to open the indicated file (for
+ reading), it failed: the VMS-style error was reported by the run-time
+ system. Perhaps the file's organization is incompatible with the type
+ expected by the program, which generally expects text files to be
+ variable-length, with carriage-return carriage control, and binary files
+ to consist of 512-byte fixed-length blocks.}
+ {\sloppy\item[\tt Font not loaded, TFM file \meta{filename} can't be opened]
+ ---\DVItoLN{} \linebreak[4] was unable to locate the indicated \TFM{} file:
+ it must be on your system somewhere, otherwise \TeX{} would have failed
+ too!}
+ \item[\tt no more virtual font bytes] --- Whilst processing a glyph taken
+ from a virtual font, the program used up all the stored characters:
+ really this should be classed as an internal error, and reported to the
+ author.
+ \item[\tt Font not loaded, bad scale ($s$)] --- The \TFM{} file indicated
+ that the font was scaled to an impossibly high value, or negatively.
+ Use {\sf TFtoPL} to analyze the \TFM{} file.
+ \item[\tt Font not loaded, bad design size ($d$)] --- The \TFM{} file
+ indicated that the font's design size was negative or an impossibly
+ large value.
+ Use {\sf TFtoPL} to analyze the \TFM{} file.
+ \item[\tt No device type specified] --- No default value was provided for
+ the qualifier \verb+/DEVICE_TYPE+. Specify an explicit value, and get your
+ \TeX nician to modify the {\tt DVITOLN03.CLD} file to reflect the local
+ environment.
+ \item[\tt No file name provided] --- You'd have been extremely sneaky to get
+ this error; you've managed to bypass DCL's check that a filename be
+ specified to be processed by the program! Be more sensible!
+ {\sloppy\item[\tt ---not loaded, bad TFM file] --- The \TFM{} file
+ didn't specify a valid \linebreak[4] range of characters as being
+ resident in the font. Use {\sf TFtoPL} to analyze the \TFM{} file.}
+ \item[\tt PXL file has bad format] --- The unpacked pixel raster file didn't
+ contain a character directory in the last 517 words.
+ Replace the font, or better, change to using the {\tt.PK} equivalent.
+ \item[\tt starting page number could not be found] --- The starting page
+ (specified with the \verb+/STARTING_PAGE+ qualifier) does not match any
+ page in the \DVI{} file.
+ {\sloppy\item[\tt (VF file) Character \meta{char\_num} does not exist]
+ \hfil --- The specified character has been used in the document, but
+ that character does not exist within the virtual font. Use {\sf VFtoVP}
+ to analyze the file.}
+ {\sloppy\item[\tt (VF file) contains illegal command in character packet]
+ \hfil --- The \linebreak[4] virtual font file contains an illegal command
+ within a character packet. Use {\sf VFtoVP} to analyze the font file.}
+ \item[\tt (VF file) First byte isn't `pre'] --- Virtual font files are
+ expected to commence with a |pre| command; this file doesn't.
+ Use {\sf VFtoVP} to analyze the file.
+ {\sloppy\item[\tt (VF file) Illegal byte $x$ at start of character packet]
+ \hfil --- The \linebreak[4] virtual font file contains an illegal
+ command or font mapping command within or after one or more character
+ packets. Use {\sf VFtoVP} to analyze the font file.}
+ \item[\tt (VF file) invokes unmapped font $f$] --- The virtual font file
+ references a font which it hasn't mapped; use {\sf VFtoVP}.
+ \item[\tt (VF file) References too many fonts] --- The virtual font file
+ at\-tempt\-ed to map more actual fonts than \DVItoLN{} was capable of
+ handling; the font is probably infinitely recursive.
+ Use {\sf VFtoVP} to analyze the file.
+ \item[\tt (VF file) Mapped font size is too big] --- The virtual font
+ references an actual font and the size of the latter, and the scale at
+ which it is invoked, exceeds the legal limits for a virtual font.
+ Use {\sf VFtoVP} to analyze the file.
+ \item[\tt (VF file) Negative packet length] --- The virtual font file is
+ malformed.
+ Use {\sf VFtoVP} to analyze the file.
+ {\sloppy\item[\tt (VF file) Wrong version number in second byte] ---
+ The virtual font file is of a version not supported by \DVItoLN. Use
+ {\sf VFtoVP} to analyze the file.}
+ \item[\tt {VF packet failed [\meta{font\_number},\meta{char\_num}]}]
+ --- Whilst processing \linebreak[4] stored glyphs for a complex character
+ taken from a virtual font, \DVItoLN{} failed to position the elements of
+ the glyph; this might require to be reported as for an internal error,
+ but firstly use {\sf VFtoVP} to analyze the file.
+ \item[\tt Where are the font directories? (/PK\_FONT\_DIRECTORY,
+ etc)] \hfil ---\linebreak[4] The command line specified neither the
+ \verb+/PK_FONT_DIRECTORY+ qualifier, nor \verb+/PXL_FONT_DIRECTORY+.
+ At least one of these qualifiers ought to be supplied with a default
+ value, through the command definition ({\tt DVITOLN03.CLD}) file. Speak
+ to your local \TeX nician.
+\end{description}
+
+\subsection{Non-fatal Error Messages}
+Should one of the following errors be detected, \DVItoLN{} will attempt to
+continue with processing your \DVI{} file; however, the resultant output
+file will probably not produce the expected results. When the program
+finishes, the DCL symbol \verb+$SEVERITY+ will have the value $2$, thus
+permitting a command procedure to detect that an error occurred.
+
+Suggested error recovery techniques are given, when appropriate. Once again,
+the program {\sf DVItype} can provide a more detailed analysis of the
+errors.
+
+\begin{description}
+ {\sloppy\item[\tt arithmetic overflow! parameter changed from $x$ to
+ $y$] \hfil--- When \linebreak[4] processing \meta{dvi byte}s, a command
+ was encountered that attempted to move the horizontal or vertical
+ position to somewhere with a co\"ordinate exceeding $\pm(2^{31}-1)${\tt
+ sp}. Since this would imply being about 38ft from the origin, perhaps
+ you'd be better off using {\sf DVItoAd\-vert\-ising\-Hoard\-ing}!}
+ \item[\tt backpointer in byte $m$ should be $p$] --- The program has
+ detected an inconsistency between the start of the current page and the
+ previous one.
+ \item[\tt bad postamble pointer in byte $m$] --- the word following the
+ |post_post| command is supposed to point back to the start of the
+ postamble: this one didn't!
+ \item[\tt bop occurred before eop] --- Whilst processing a page, a |bop|
+ command was detected before finding the |eop| that should have
+ terminated the current page.
+ \item[\tt byte $m$ is not postpost] --- The byte following the end of
+ the postamble is not the anticipated |post_post| command.
+ {\sloppy\item[\tt character $c$ invalid in font \meta{name}] --- The
+ \DVI{} file has requested that character $c$ be imaged from the
+ currently selected font, and yet the font doesn't contain any such
+ character; something might be printed, but it's anybody's guess as to
+ what!}
+ {\sloppy\item[\tt Couldn't open \bs special inclusion: \meta{file}] ---
+ The \DVI{} file contained a \verb+\special{ln03:sixel +%
+ \meta{file}\verb+}+ command, but the program was unable to open the
+ specified file. The VMS-style error report associated with this message
+ might indicate why the file couldn't be opened.}
+ \item[\tt Diagonal rule in \bs special \meta{special\_pars}] --- A
+ \verb+\special+ command requested the \verb+connect+ operation,
+ but the points specified were not in the same vertical or horizontal
+ line: this \verb+\special+ should only be issued by the macros of the
+ {\tt changebar} style option, and not by the user.
+ \item[\tt identification in byte $m$ should be $i$] --- The \DVI{} file
+ is supposed to contain the version number (currently $2$) at the
+ beginning and the end of the file; the byte-address $m$ indicates which
+ one failed.
+ {\sloppy\item[\tt Invalid point number in \bs special
+ \meta{special\_pars}] --- A \verb+\special+ command, using the {\tt
+ defpoint} or {\tt resetpoints} operations, specified an invalid point
+ number ($>|max_points|$, which is a compile-time constant in the \Web),
+ or the {\tt connect} operation specified a point that hadn't previously
+ been defined.}
+ \item[\tt non-ASCII character in \bs special command] --- The character
+ string parameter of a \verb+\special+ command includes a character not
+ in the {\sc Ascii} character set.
+ \item[\tt ---not loaded, TFM file is bad] --- When reading a \TFM{}
+ file, the program detected some discrepancy, which has probably already
+ been reported. Use {\sf TFtoPL} to analyze the file.
+ \item[\tt Null \bs special argument] --- A \verb+\special+ command has
+ an empty argument.
+ {\sloppy\item[\tt Point number missing] {\tt in \bs special}
+ \meta{special\_pars} --- A point number was expected in a
+ \verb+\special{ln03:defpoint}+ command.}
+ \item[\tt pop illegal at level zero] --- Something's wrong with the
+ \DVI{} file; it attempted to |pop| an environment when none had been
+ stacked.
+ {\sloppy\item[\tt postamble command within a page] --- Whilst processing
+ a page, \DVItoLN{} discovered a |post| command, without any prior
+ |eop|.}
+ \item[\tt preamble command within a page] --- This \DVI{} file is
+ {\em really\/} twisted: a |pre| command was found during a page.
+ \item[\tt push deeper than claimed in postamble] --- The current
+ environment \linebreak[4] was |push|ed more often than \TeX{} had claimed.
+ \item[\tt reference to an unloaded font] --- An attempt has been made to
+ set a character from a font which hadn't been defined within the \DVI{}
+ file.
+ \item[\tt \bs special string of negative length] --- The |xxx| command
+ which \TeX{} uses to pass a \verb+\special+ command in the \DVI{} file
+ invalidly indicated that the string was of negative length!
+ \item[\tt \bs special string too long] --- Just as the previous error,
+ but it was too large positively in this instance.
+ \item[\tt stack not empty at end of page (level $s$)] --- When \TeX{}
+ gets to the end of a page, it's supposed to ensure that all environments
+ that it's instructed to have been saved shall be restored; this \DVI{}
+ file contravenes that requirement.
+ \item[\tt undefined command \meta{dvi\_byte}] --- The \DVI{} file
+ contains a command that is undefined; are you sure it was produced by
+ TeX?
+ {\sloppy\item[\tt Unsupported or malformed \bs special
+ \meta{special\_pars}] --- Couldn't find a \linebreak[4] properly formed
+ operation code string in a \verb+\special+ command.}
+ \item[\tt Unsupported \bs special \meta{special\_pars}] --- A
+ \verb+\special+ command included an operation code, which whilst
+ recognized, was inappropriate in the current context.
+ \item[\tt VF checksum disagreed! TFM: $C_1$ VF: $C_2$] --- The sum check
+ found in a {\tt.VF} file when reading a virtual font disagreed with that
+ previously recorded in the font's \TFM{} file.
+ \item[\tt VF design size disagreed! TFM: $S_1$ VF: $S_2$] --- The design
+ size found in a {\tt.VF} file when reading a virtual font disagreed with
+ that previously recorded in the font's \TFM{} file.
+\end{description}
+
+\subsection{Warning Messages}
+These messages generally indicate some problem that didn't prevent
+\DVItoLN{} from generating a valid output file; however, it might not print
+out as you had anticipated! Provided no errors occur, the exit status of
+the program will have a \verb+$SEVERITY+ of $0$, thus permitting a command
+procedure to detect that warning messages were issued.
+
+\begin{description}
+ \item[\tt cannot find file \meta{file\_spec}] --- \DVItoLN{} failed to
+ locate the file containing the (packed or unpacked) pixel rasters; it
+ will proceed by substituting solid rules for each glyph. Remedy:
+ Install the requisite font file on your system.
+ {\sloppy\item[\tt Characters `\meta{text}' set off paper ( x =
+ $x_s$..$x_e$, y = $y$ )] \hfil --- Some \linebreak[4] portion of the
+ text is imaged outside that area of the paper which can be written by
+ the printer. The $x$ values indicate the left- and right-hand limits of
+ the text, whilst the $y$ value gives the vertical co\"ordinate of the
+ baseline; all such dimensions are given in absolute pixel positions on
+ the physical page. Perhaps you're printing something in landscape mode
+ that was formatted to be printed in portrait, or vice versa?}
+ \item[\tt checksum doesn't match; DVI=$C_1$ vs. TFM=$C_2$] --- When the
+ font definition command was found in the \DVI{} file, its sum check was
+ recorded; this should agree with that of the \TFM{} file itself, because
+ it was written using the latter value when \TeX{} processed the source.
+ Therefore this error indicates that you're trying to use different fonts
+ from those read by \TeX\@. Remedy: Replace the font, or reprocess the
+ source with \TeX.
+ \item[\tt checksum doesn't match in PK file] --- The font's sum check as
+ recorded in the packed pixel file disagrees with that in the \TFM{}\@.
+ This would suggest that the font should be rebuilt, using \MF{} and {\sf
+ GFtoPK}.
+ \item[\tt checksum doesn't match in PXL file] --- The font's sum check as
+ recorded in the unpacked pixel file disagrees with that in the \TFM{}\@.
+ This would suggest that the font should be rebuilt, using \MF{} and {\sf
+ GFtoPX}.
+ \item[\tt ---checksum doesn't match previous definition] --- Each font
+ definition appears twice in the \DVI{} file; the sum check recorded in
+ the second definition disagrees with the first --- use {\sf DVItype}.
+ \item[\tt denominator doesn't match the preamble] --- The denominator of
+ the rational number which gives the size of each DVI unit (in
+ decimicrons) which has been read from the postamble disagrees with that
+ in the preamble --- use {\sf DVItype}.
+ \item[\tt ---design size doesn't match previous definition] --- The
+ font's design size in the second definition of the font disagrees with
+ the first --- use {\sf DVItype}.
+ {\sloppy\item[\tt Discarding earlier packet for character $c$] --- Whilst
+ processing a \linebreak[4] virtual font file, a second definition for a
+ character's glyph was encountered: the first definition will be
+ discarded, and replaced by the last one --- use {\sf VFtoVP}.}
+ \item[\tt extra junk at end of the VF file] --- Some unexpected bytes
+ were discovered after the end of a virtual font ({\tt.VF}) file; to
+ prevent this error recurring, use {\sf VFtoVP} to correct the error and
+ rewrite the virtual font with {\sf VPtoVF}.
+ {\sloppy\item[\tt Font \meta{name} doesn't contain character $c$] \hfil
+ --- No definition was encountered for the glyph of character $c$ when
+ the font file's rasters were read: the character will be imaged by the
+ appropriate amount of whitespace.}
+ \item[\tt ---font name doesn't match previous definition] --- The name
+ of the font given in the second definition within the \DVI{} file
+ disagrees with the original defining occurrence --- use {\sf DVItype}.
+ \item[\tt magnification doesn't match the preamble] --- The
+ magnification reported in the postamble disagreed with that in the
+ preamble --- use {\sf DVItype}.
+ {\sloppy\item[\tt Missing or unknown unit of measure: \meta{text}] ---
+ A unit of measure \linebreak[4] was expected, either within a
+ \verb+\special+ command, or associated with one of the qualifiers
+ \verb+/TOP_MARGIN+, \verb+/LEFT_MARGIN+, \verb+/HFUZZ+ or \verb+/VFUZZ+.
+ A supplementary message will indicate what \meta{physical unit} was
+ assumed ({\tt pt} or {\tt sp}).}
+ \item[\tt more than $m$ rules on page; excess ignored] --- A page
+ contained too many separate rules; the program is restricted to $16384$
+ by the compile-time constant |max_rules|. Perhaps something's run amok
+ in a \LaTeX{} {\tt picture} environment?
+ {\sloppy\item[\tt not enough signature bytes at end of file ($m$)] \hfil---
+ \DVI{} files are \linebreak[4] supposed to end with at least four
+ signature ($223$) bytes --- use {\sf DVItype}.}
+ \item[\tt numerator doesn't match the preamble] --- The numerator of the
+ rational fraction given in the postamble disagrees with that previously
+ read from the preamble --- use {\sf DVItype}.
+ \item[\tt /ORIENTATION must be PORTRAIT or LANDSCAPE;] {\tt assuming
+ PORTRAIT} \hfil-- \linebreak[4] The \verb+/ORIENTATION+ qualifier was given
+ an illegal value; this should never happen, unless the command definition
+ file has been corrupted.
+ \item[\tt Page deeper than TeX reported by $y$pt] --- Characters were
+ positioned further down the page lower than \TeX{} had recorded in the
+ \DVI{} file. This isn't an error, unless accompanied by an indication
+ that characters were set off the paper. See description of the
+ \verb+/VFUZZ+ qualifier.
+ \item[\tt Page wider than TeX reported by $x$pt] --- Characters were
+ imaged beyond the right-hand margin that \TeX{} had recorded in the
+ \DVI{}. \cbstart This isn't an error, unless accompanied by an
+ indication that characters were set off the paper\cbend. See
+ description of the \verb+/HFUZZ+ qualifier.
+ {\sloppy\item[\tt Pixel width discrepancy; font ]\meta{name} {\tt char}
+ $c$ {\tt ---computed width: $W_c$; actual width: $W_a$} --- The width of
+ the indicated character, in pixels, differed from that computed from
+ the \TeX{} font metrics (by at least two pixels). The actual width is
+ always used when imaging glyphs.}
+ \item[\tt PK font pixels non-square] --- The {\sl aspect ratio\/} of the
+ characters in the packed pixel file was not 1:1 --- will probably
+ produce distorted glyphs, since the LN03 printer does print with square
+ pixels.
+ {\sloppy\item[\tt ---scaled size doesn't match previous definition] ---
+ The second \linebreak[4] definition of the font provided a different
+ scaled size from that in the first definition --- use {\sf DVItype}.}
+ \item[\tt there are really $m$ pages, not $n$] --- Although the
+ postamble claimed that there were $n$ pages in the document, there were
+ really $m$ --- use {\sf DVItype}.
+ \item[\tt ---this font was already defined] --- A spurious additional
+ font definition was encountered in the \DVI{} file --- use {\sf DVItype}.
+ \item[\tt ---this font wasn't loaded before] --- When reading the
+ postamble, a definition was encountered for a font that wasn't
+ previously defined in the body of the \DVI{} file --- use {\sf DVItype}.
+ \item[\tt VF data not a multiple of 4 bytes] --- Virtual font files
+ ({\tt.VF}) are supposed to be some multiple of 4 bytes long --- use {\sf
+ VFtoVP}.
+ \item[\tt VF file ended without postamble] --- Whilst reading glyph
+ definitions from a virtual font file, the |post| command was met
+ unexpectedly --- use {\sf VFtoVP}.
+\end{description}
+
+\subsection{Informational Messages}
+These are output to provide the user with an indication of the progress of
+the process of translating the \DVI{} file into an {\tt.LN3} file. If no
+other messages are output, you can be assured that the printed version will
+accord with what \TeX{} intended to put on the paper (although this might
+not be what {\em you\/} intended!)
+
+Provided that no warning or error messages were issued, the program's exit
+status will have a \verb+$SEVERITY+ of \verb+SS$_SUCCESS+ ($1$), thus
+permitting a command procedure to be confident that no warning or errors
+occurred.
+
+\begin{description}
+ \item[\tt (\meta{file\_spec}\dots)] --- Whenever the \DVI{} file, or a
+ file specified as a graphics inclusion, is opened, a left parenthesis
+ and the full VAX/RMS file specification is reported on the terminal;
+ when the file is closed, a matching right parenthesis is displayed.
+
+ In the log (\TYP) file, the file specifications are accompanied by
+ self-explanatory text.
+ \item[{\tt [\meta{page\_no}]}] --- As \DVItoLN{} starts to process a
+ page, a left bracket and the page number (which may consist of a series
+ of integers, separated by periods) is displayed; when the end of the
+ page is encountered, the matching right bracket is displayed.
+ \item[\tt Finding starting page...found]\cbstart\footnotemark\cbend{}
+ --- After the title has been displayed, \DVItoLN{} starts locating the
+ first page to be printed; at the same time, it works out if any blank
+ pages will need to be interspersed during printing. Since this
+ operation can take a significant amount of time on a large document, the
+ first part of this message is displayed so that the user won't think
+ that the program has died; the `{\tt found}' is displayed when this
+ processing is completed.
+ \item[\tt Font \meta{name}] [{\tt (at $m$\%)}] {\tt loaded with}
+ $n$ {\tt bytes of rasters (}$m$ {\tt\hyphenchar\the\font=`\-
+ char\-act\-ers)}\cbstart\footnotemark\cbend{} --- The specified font
+ (at the magnification shown, if not 100\%) has been included in the
+ downloaded fonts; if $n$ seems very small, it may be because the glyphs
+ of the font were too large to be downloaded and hence will be imaged
+ individually wherever they appear.
+ {\sloppy\item[\tt Font \meta{name}] [{\tt (at $m$\%)}] {\tt unavailable;
+ printing rules for glyphs}\cbstart\footnotemark\cbend{} --- The
+ specified font wasn't available at the requested magnification;
+ characters from this font will be imaged by printing solid rules of size
+ determined from the \TeX{} font metrics. Previously, a `{\tt cannot find
+ file}' warning will have been issued for this font.}
+ \item[\tt Font \meta{name}] [{\tt (at $m$\%)}] {\tt is
+ virtual}\cbstart\footnotemark\cbend{} --- The specified font was a
+ virtual one; this may result in the loading of real fonts other than
+ those specified by \TeX{} when the \DVI{} file was generated.
+ {\sloppy\item[\tt Gathering font usage
+ statistics...done]\cbstart\footnote{All these messages are suppressed if
+ the {\tt/NOVERBOSE} qualifier is used.}\cbend{} \hfil--- Once the
+ starting page \linebreak[4] has been found, \DVItoLN{} makes one rapid
+ pass through the \DVI{} file, noting which glyphs are used from each
+ font. Doing this allows us to save time and space that would otherwise
+ be wasted by downloading the whole of a font. It can take a significant
+ amount of time, so the first part of this message is written to the
+ display, and then an additional period will be displayed after
+ processing every ten pages, thus giving the user an assurance that the
+ program hasn't collapsed.}
+ \item[\tt Reading from file \meta{file\_spec}] --- This message is
+ written to the log (\TYP) file only, and records the full file
+ specification of the \DVI{} file being processed.
+ \item[\tt Sixel graphics included from: \meta{file\_spec}] --- This is
+ recorded in the log (\TYP) file whenever a file is read by a
+ \verb+\special{ln03:sixel}+ command.
+ \item[\tt This is DVItoLN03, Vax/VMS Version $V$] --- This banner
+ announcement identifies the version of the program, both on the screen
+ and in the log (\TYP) file.
+ \item[\tt Total of $n$ bytes of rasters downloaded] --- After all fonts
+ have been downloaded, this message gives an indication of the total
+ number of bytes that will be occupied by the downloaded fonts in the
+ printer's memory. It can therefore be compared with the available
+ memory, as reported on a printer test sheet (see~\cite{DEC:LN03}) to
+ determine whether the resultant file can be printed correctly --- if
+ there is insufficient memory, then process your document in smaller
+ sections. {\bf N.B.} If a document contains any pages that are printed
+ in landscape mode, all downloaded fonts will be reoriented to that mode
+ automatically by the printer: this can result in overflowing the
+ available memory.
+\end{description}
+
+\endgroup
+\chapend
+\bibliographystyle{unsrt}
+\addcontentsline{toc}{section}{References}
+\bibliography{local_guides}
+
+\end{document}
diff --git a/dviware/ln03/rmcs/dvitoln03.ch b/dviware/ln03/rmcs/dvitoln03.ch
new file mode 100644
index 0000000000..7b6af0801c
--- /dev/null
+++ b/dviware/ln03/rmcs/dvitoln03.ch
@@ -0,0 +1,1143 @@
+*** UNDER DEVELOPMENT ***
+DVItype change file for LN03 output
+This change file has been produced by adding stuff to the Vax/VMS
+change file, originally due to David R. Fuchs.
+It was originally used to produce a special version of DVItype, the
+outputs of which were further processed by LN03toPP.PLI, Author: Flavio Rose
+of DEC Marlboro
+Modified for DVItype version 2.6 by John Sauter, August 3, 1984.
+Version 0.8, quick fix to correct bug in rule merging.
+Version 0.9, another quick fix to match a Topp bug fix
+(c) 1986 Royal Military College of Science
+The current version, still only experimental, was produced to combine
+both these phases into one.
+Modified for DVItype version 2.7 by B. Hamilton Kelly, March 1986.
+(At Royal Military College of Science, Shrivenham, SWINDON, England.)
+Minor cosmetic changes (eg 2048 rules, etc.) July 1987
+Support for \special added September 1987
+Extensive modifications July 88 and March 89.
+Support for additional qualifiers August 89.
+Support for \specials for changebars added by Robin Fairbairns.
+Avoid problems with non-existent glyphs present in some fonts. (April 1990)
+Tidy up processing of \special command arguments (December 1990)
+Permit use of <physical units> in margin offsets
+Avoid hard-wiring of TEX$... logical names
+Support virtual fonts
+Support \specials for landscape/portrait, mixed on one page
+Draw solid rules for glyphs from missing fonts
+Optimize access to doubly-indexed arrays, to speed processing
+Support DEClaser 2100/2200 (duplex, tray selection, etc)
+DVItoLN03 is now at version 4.1
+
+
+Further work:
+(suggestions possibly welcomed!)
+
+@x <BHK 20-SEP-1991> Limbo
+% Version 4.0 Cosmetic changes to error messages - new release!!!
+@y
+% Version 4.0 Cosmetic changes to error messages - new release!!!
+% Version 4.0-1 Minor (?!) bug-fixes
+% Version 4.0-2 Further corrections to indexing of messages
+% Version 4.0-3 Correct bug that rejected fonts > 188 glyphs
+% Version 4.0-4 Reorient rules as well as glyphs!
+% Version 4.0-5 Need much closed attention to imaging area with mixed
+% orientations!
+% Version 4.0-6 PFS commands reset OPM & margins, so need correction
+% Version 4.0-7 Trouble caused by fonts which have duplicate characters
+% Version 4.0-8 Ensure glyph position checking is against correct limits!
+% Version 4.0-9 Add /PAPER_SIZE qualifier; correct duplexing last page
+% Version 4.1 (Released 1 Oct 1991) Added /[NO]VERBOSE qualifier
+@z
+
+@x <BHK 30-SEP-1991> Limbo
+\def\title{DVI$\,$\lowercase{to}$\,$LN03 V4.0}
+@y
+\def\title{DVI$\,$\lowercase{to}$\,$LN03 V4.1}
+@z
+
+@x <BHK 30-SEP-1991> Limbo
+ \centerline{(Version 4.0, 27th February 1991)}
+@y
+ \centerline{(Version 4.1, 30th September 1991)}
+@z
+
+@x <BHK 20-DEC-1990> Limbo
+\let\maybe=\iftrue
+%\let\maybe=\iffalse
+@y Uncomment-out second next line if documentation required of changes only
+\let\maybe=\iftrue
+\let\maybe=\iffalse
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S1.
+\yskip\hang\&{V4.0} Supports the new DEClaser~2100 and~2200 printers (the
+LN05 and LN06) in addition to the traditional LN03. With the LN06, paper
+feed trays may be selected from the command line, and the duplexing
+facilities controlled also. Support for these printers was provided by
+Karsten Nyblad
+@^Nyblad, Karsten@>
+of TFL, the Danish Telecommunication Research Laboratory, and integrated
+into this new release with the other features mentioned above.
+@y
+\yskip\hang\&{V4.0} Supports the new DEClaser~2100 and~2200 printers (the
+LN05 and LN06) in addition to the traditional LN03. With the LN06, paper
+feed trays may be selected from the command line, and the duplexing
+facilities controlled also. Support for these printers was provided by
+Karsten Nyblad
+@^Nyblad, Karsten@>
+of TFL, the Danish Telecommunication Research Laboratory, and integrated
+into this new release with the other features mentioned above.
+\yskip\hang\&{V4.1} Minor bug fixes; to support mixed orientation printing,
+the program requires knowledge of the actual paper size upon which the
+output is produced, so the \.{/PAPER\_SIZE} qualifier is introduced. A
+\.{/VERBOSE} qualifier is also introduced, such that sites requiring less
+screen output can make the default \.{/NOVERBOSE}.
+@z
+
+@x <BHK 30-SEP-1991> S1.
+@d banner=='This is DVItoLN03, Vax/VMS Version 4.0'
+@y
+@d banner=='This is DVItoLN03, Vax/VMS Version 4.1'
+@z
+
+Since OPM and margins must be reset after PFS sequences, need to define here
+@x <BHK 22-APR-1991 and 20-SEP-1991> S5.
+Whenever bitmaps are sent to the printer (in sixel format), it is necessary
+to establish the ``printing'' position 29 pixels above the current
+reference point. Despite repeated enquiry of DEC, it has not been
+established why this is necessary. Naturally, we call this 29 pixels
+|bitmap_offset|. This same offset also has to be applied to sixel graphics
+included through a \.{\\special} command.
+
+When the paper orientation is selected, we may define the |page_len| and
+|page_wid| in terms of the physical limits of the paper; these sizes are
+as follows (for European A4 paper).
+@^European A4 paper@>
+(These might later become variables, and be alterable by qualifiers in the
+command line.) There is, however, a further complication. In either printing
+orientation, the printable area is of these dimensions; however, this printing
+area starts 0.25~inches from the top left corner of the paper \\{in the
+orientation it enters the printer}. Therefore in portrait mode, we can
+actually print from (75,75) to (2475,3475), with (300,300) being the
+``normal'' \TeX\ origin, but in landscape mode we can print (35,75) to
+(3435,2475), and \TeX's origin should still be at (300,300).
+@y
+Whenever bitmaps are sent to the printer (in sixel format), it is necessary
+to establish the ``printing'' position 29 pixels below the current
+reference point. This is because the printer, apparently arbitrarily, elects
+to put the top of the first row of sixels at a height of 70~decipoints above
+the current baseline: since DEC's `point' is what \TeX\ calls \.{1bp}, this
+offset is $70\over720$in, or $29{1\over6}$ pixels. Naturally, we call this
+|bitmap_offset|. This same offset also has to be applied to sixel
+graphics included through a \.{\\special} command.
+
+When the paper orientation is selected, we may define the |page_len| and
+|page_wid| in terms of the physical limits of the paper; these sizes are
+as follows (for ISO [European] A4 and US letter-size paper).
+@^European A4 paper@>
+@^A4 (ISO, European) paper@>
+@^ISO paper sizes@>
+@^Paper sizes@>
+@^US letter-size paper@>
+Variables are set up with the appropriate set of values, depending upon the
+value provided with the \.{/PAPER\_SIZE} qualifier.
+@.PAPER\_SIZE@>
+@:Qualifiers PAPER SIZE}{\quad\.{PAPER\_SIZE}@>
+There is, however, a further complication. In either printing
+orientation, the printable area is of these dimensions; however, this printing
+area starts 0.25~inches from the top left corner of the paper \\{in the
+orientation it enters the printer}. Therefore in portrait mode, we can
+actually print from (75,75) to (2475,3475), with (300,300) being the
+``normal'' \TeX\ origin, but in landscape mode we can print (33,75) to
+(3433,2475), and \TeX's origin should still be at (300,300). (The strange
+figure 33 arises from DEC's handling of European A4~paper; with U.S. paper,
+\\{without} OPM set, the printable area measures $2400\times3300$
+[$8\times11$in], and has an even $1\over4$in margin all round: with A4
+paper, the printable area, regardless of orientation, starts the same
+$1\over4$in from the leading short edge of the paper, but the printable area
+is extended to 3400 pixels $11{1\over3}$in, thus making the left-edge of the
+printable area, in landscape orientation, lie $11{7\over12}$in from the
+leading edge. Since A4~paper is 297mm long, this position is therefore
+$0{\cdot}10958$in, approximately 33~pixels, from the left-edge.)
+
+This is also a convenient time to introduce certain non-printing control
+characters, which will later be used to form control sequences and device
+control strings (see ISO Std~2022)
+@^ISO Standard 2022@>
+for controlling device-specific functions of the printer. The control
+sequence defined by |DECOPM_on| sets DEC's Origin Positioning Mode, such
+that dimensions are measured from the edge of the paper rather than the
+origin of the printable area (defined by |image_wid@t$\times$@>image_ht|).
+The |DECSLRM| macro produces code to set the left- and right-margins of the
+printable area, whilst |DECSTBM| sets the top- and bottom-margins;
+unfortunately, redefining the page format (through a \\{PFS}\dots sequence)
+cancels the effect of all of these, so they must be re-issued anew whenever
+the printing orientation is changed.
+@z
+
+Closer attention to detail of imaging area
+@x <BHK 18-APR-1991 and 20-SEP-1991> S5.
+@d paper_ht=3400 {in pixels}
+@d paper_wid=2400
+@d y_port_min=75
+@d y_land_min=35
+@d page_x_min=75
+@d y_top=75 {Minimum addressable $y$ pixel}
+@d y_bot=paper_ht+y_port_min {Maximum addressable $y$ pixel}
+@y
+@d A4_image_ht=3400 {in pixels (for European A4 paper)}
+@d US_image_ht=3225 {in pixels (for American $8{1\over2}\times11$ paper)}
+@d image_wid=2400 {(same value, 2400, for U.S. paper)}
+@d y_port_min=75 {Lowest addressable $y$ in portrait mode (75)}
+@d A4_y_land_min=33 {Lowest addressable $y$ in landscape mode}
+@d US_y_land_min=0
+@d page_x_min=75 {Lowest addressable $x$ in portrait mode}
+@d A4_right_marg=5 {Distance from highest $x$ to right-edge in portrait mode}
+@d US_right_marg=75
+@d y_top=75 {Minimum addressable $y$ pixel}
+@d y_bot==(image_ht+y_port_min) {Maximum addressable $y$ pixel in either mode}
+@d paper_ht==(y_top+image_ht+y_land_min) {Physical size of paper}
+@d paper_wd==(page_x_min+image_wid+right_marg)
+@d min_seg_y=0 {Lowest and highest addressable rows, either orientation\dots}
+@d max_seg_y=3510 {and whatever the paper type; esed to declare |seg_list|}
+@z
+
+Since OPM and margins must be reset after PFS sequences, need to define here
+@x <BHK 22-APR-1991> S5.
+@d PFS_landscape=='?23 J' {Extended A4 paper in landscape orientation}
+@d PFS_portrait=='?22 J' {ditto in portrait; each preceded by |csi|}
+@#
+@y
+@d esc==chr(@"1B) {The ASCII ESCape character}
+@d csi==chr(@"9B) {Control Sequence Introducer}
+@#
+@d A4_PFS_landscape==csi+'?23 J' {Extended A4 paper in landscape orientation}
+@d A4_PFS_portrait==csi+'?22 J' {and portrait}
+@#
+@d US_PFS_landscape==csi+'?21 J' {Extended US letter paper in landscape orientation}
+@d US_PFS_portrait==csi+'?20 J' {and portrait}
+@#
+@d DECOPM_on==csi+'?52h' {\&{Set} Origin Placement Mode}
+@d DECSLRM(#)==csi,#:1,';',decslrm_end {Set Left/Right Margins}
+@d decslrm_end(#)==#:1,'s'
+@d DECSTBM(#)==csi,#:1,';',decstbm_end {Set Top/Bottom Margins}
+@d decstbm_end(#)==#:1,'r'
+@#
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S28.
+@:fatal error Font not loaded TFM file}{\qquad\.{TFM file can't be opened}@>
+@y
+@:fatal error Font not loaded ...}{\quad\.{Font not loaded...}@>
+@:fatal error Font not loaded TFM file}{\qquad\.{TFM file can't be opened}@>
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S41.
+9997: error('---not loaded, TFM file is bad');
+@.TFM file is bad@>
+@y
+9997: error('---not loaded, TFM file is bad');
+@:Error: TFM file is bad}{\quad\.{TFM file is bad}@>
+@z
+
+Introduce additional variables to support two differing paper sizes
+@x <BHK 20-SEP-1991> S54.
+@!orientation,@!new_orient,@!cur_orient : page_orientation;
+@y
+@!orientation,@!new_orient,@!cur_orient : page_orientation;
+@!paper_size : page_sizes;
+@!image_ht, @!y_land_min, @!right_marg : integer;
+@z
+
+Introduce additional enumeration type
+@x <BHK 20-SEP-1991> S55.
+@ This type allows us to keep track of whether characters are currently
+being imaged in landscape or portrait orientation.
+
+@<Types...@>=
+@!page_orientation = (@!portrait,@!landscape);
+@y
+@ These types allow us to note for what paper size the printer has been
+configured, and to keep track of whether characters are currently being
+imaged in landscape or portrait orientation.
+
+@<Types...@>=
+@!page_sizes = (@!A4,@!US);
+@!page_orientation = (@!portrait,@!landscape);
+@z
+
+Cosmetic change of module name
+@x <BHK 20-SEP-1991> S65.
+@<Determine the desired |orientation|@>;
+@y
+@<Determine the desired |orientation| and paper size@>;
+@z
+
+Correct usage to explicit |term_out|
+@x <BHK 30-SEP-1991> S70.
+ write_ln(' --- assuming pixel units',crlf);
+@y
+ write_ln(term_out,' --- assuming pixel units',crlf);
+@z
+
+Correct usage to explicit |term_out|
+@x <BHK 30-SEP-1991> S70.
+ write_ln(' --- assuming pixel units',crlf);
+@y
+ write_ln(term_out,' --- assuming pixel units',crlf);
+@z
+
+Closer attention to detail of imaging area; use macros for application
+elsewhere. Support /PAPER_SIZE qualifier
+@x <BHK 18-APR-1991, 10-MAY-1991 & 20-SEP-1991> S72.
+@<Determine the desired |orientation|@>=
+if odd(VAX_cli_present('ORIENTATION')) then
+begin
+ if odd(VAX_cli_present('PORTRAIT')) then orientation:=portrait else
+ if odd(VAX_cli_present('LANDSCAPE')) then orientation:=landscape else
+ warning('/ORIENTATION must be "PORTRAIT" or "LANDSCAPE"; assuming "PORTRAIT"')
+@:Warning: orientation must be}{\quad \.{/ORIENTATION must be ...}@>
+end;
+if orientation=landscape then
+begin page_len:=paper_wid+page_x_min; page_wid:=paper_ht+y_land_min;
+ y_min:=page_x_min; x_min:=y_land_min end else
+begin page_len:=paper_ht+y_port_min; page_wid:=paper_wid+page_x_min;
+ y_min:=y_port_min; x_min:=page_x_min end;
+@y
+@d set_landscape_limits==begin page_len:=image_wid+page_x_min;
+ page_wid:=image_ht+y_land_min;
+ y_min:=page_x_min;
+ x_min:=y_land_min
+ end
+@d set_portrait_limits==begin page_len:=image_ht+y_port_min;
+ page_wid:=image_wid+page_x_min;
+ y_min:=y_port_min;
+ x_min:=page_x_min
+ end
+
+@<Determine the desired |orientation| and paper size@>=
+if odd(VAX_cli_present('PAPER_SIZE.US')) then
+begin {Using US letter-size paper $11\times8{1\over2}$in}
+ image_ht := US_image_ht; y_land_min := US_y_land_min;
+ right_marg := US_right_marg; paper_size := US;
+end else
+begin {Assume ISO A4 paper size $297\times210$mm}
+ image_ht := A4_image_ht; y_land_min := A4_y_land_min;
+ right_marg := A4_right_marg; paper_size := A4;
+end;
+if odd(VAX_cli_present('ORIENTATION')) then
+begin
+ if odd(VAX_cli_present('PORTRAIT')) then orientation:=portrait else
+ if odd(VAX_cli_present('LANDSCAPE')) then orientation:=landscape else
+ warning('/ORIENTATION must be "PORTRAIT" or "LANDSCAPE"; assuming "PORTRAIT"')
+@:Warning: orientation must be}{\quad \.{/ORIENTATION must be ...}@>
+end;
+if orientation=landscape then set_landscape_limits else set_portrait_limits;
+@z
+
+Correct usage to explicit |term_out|
+@x <BHK 30-SEP-1991> S73.
+ write_ln(' --- assuming scaled points',crlf);
+@y
+ write_ln(term_out,' --- assuming scaled points',crlf);
+@z
+
+Correct usage to explicit |term_out|
+@x <BHK 30-SEP-1991> S73.
+ write_ln(' --- assuming scaled points',crlf);
+@y
+ write_ln(term_out,' --- assuming scaled points',crlf);
+@z
+
+Correct indexing of warning message
+@x <BHK 25-MAR-1991> S87.
+@:Warning: checksum doesn't match}{\quad\.{checksum doesn't match}@>
+@y
+@:Warning: checksum doesn\'t match ...}{\quad\.{checksum doesn't match...}@>
+@:Warning: checksum doesn\'t match previous def}{\qquad\.{previous definition}@>
+@z
+
+Correct indexing of warning message
+@x <BHK 25-MAR-1991> S91.
+@:Warning: checksum doesn\'t match}{\quad\.{checksum doesn't match}@>
+@y
+@:Warning: checksum doesn\'t match in TFM file}{\qquad\.{in TFM file}@>
+@z
+
+Closer attention to detail of imaging area
+@x <BHK 18-APR-1991 & 20-SEP-1991> S94.
+ @!seg_list : array [y_land_min..paper_ht+y_port_min] of ^segment;
+@y
+ @!seg_list : array [min_seg_y..max_seg_y] of ^segment;
+@z
+
+Closer attention to detail of imaging area
+@x <BHK 18-APR-1991> S95.
+ for k:=y_land_min to paper_ht+y_port_min do seg_list[k]:=nil;
+@y
+ for k:=y_land_min to image_ht+y_port_min do seg_list[k]:=nil;
+@z
+
+Some of these characters are now defined much earlier
+@x <BHK 22-APR-1991> S101.
+@d esc==chr(@"1B) {The ASCII ESCape character}
+@d csi==chr(@"9B) {Control Sequence Introducer}
+@y
+@z
+
+Note whether the character packet was used \\{this time}
+@x <BHK 02-MAY-1991> S129.
+ch_loc[char_num]:=end_of_packet-packet_length;
+with glyph_map(TeX_font)(char_num) do
+ if loaded=wanted then
+ begin
+ base:=ras_beg+ras_len;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Read and translate raster description@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>
+@y
+packet_used:=false;
+with glyph_map(TeX_font)(char_num) do
+ if loaded=wanted then
+ begin
+ base:=ras_beg+ras_len;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Read and translate raster description@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>;
+ packet_used:=true
+@z
+
+Ensure first record of an included sixels file can be 256 chars long
+Provide support for /VERBOSE qualifier
+@x <BHK 25-MAR-1991 & 30-SEP-1991> S179.
+ monitor(' ('+def_file_name);
+ print_ln('Sixel graphics included from: ',def_file_name);
+@.Sixel graphics included...@>
+ reset(sixel_file);
+ write(ln3_file,csi,y_position:1,'d',csi,cur_seg^.xs:1,'`');
+@y
+ if verbose then monitor(' ('+def_file_name);
+ print_ln('Sixel graphics included from: ',def_file_name);
+@.Sixel graphics included...@>
+ reset(sixel_file);
+ write_ln(ln3_file,csi,y_position:1,'d',csi,cur_seg^.xs:1,'`');
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S179.
+ monitor(') ');
+@y
+ if verbose then monitor(') ');
+@z
+
+Closer attention to detail of imaging area
+PFS commands reset OPM and margin, so must override. Track paper size
+@x <BHK 22-APR-1991> S183.
+ write_ln(ln3_file,csi,PFS_landscape);
+ page_len:=paper_wid+page_x_min; page_wid:=paper_ht+y_land_min;
+ y_min:=page_x_min; x_min:=y_land_min
+ end else
+ begin
+ write_ln(ln3_file,csi,PFS_portrait);
+ page_len:=paper_ht+y_port_min; page_wid:=paper_wid+page_x_min;
+ y_min:=y_port_min; x_min:=page_x_min
+@y
+ if paper_size = US then
+ write(ln3_file,US_PFS_landscape,DECOPM_on)
+ else
+ write(ln3_file,A4_PFS_landscape,DECOPM_on);
+ set_landscape_limits;
+ write_ln(ln3_file,DECSLRM(x_min)(page_wid),DECSTBM(y_min)(page_len))
+ {Set page limits}
+ end else
+ begin
+ if paper_size = US then
+ write(ln3_file,US_PFS_portrait,DECOPM_on)
+ else
+ write(ln3_file,A4_PFS_portrait,DECOPM_on);
+ set_portrait_limits;
+ write_ln(ln3_file,DECSLRM(x_min)(page_wid),DECSTBM(y_min)(page_len))
+ {Set page limits}
+@z
+
+Correct handling of last recto page when duplexing
+@x <BHK (from Karsten Nyblad) 20-SEP-1991> S196.
+ if ptr_blanks>0 then
+ if blank_follows[ptr_blanks]=cur_loc_after_bop then
+ begin
+ decr(ptr_blanks); {and remain in simplex mode}
+ if print_mode>=duplex_master_normal then
+ write(ln3_file,' ',FF) {eject blank page for \\{verso} master}
+ end else
+ begin
+ write(ln3_file,csi,print_mode:1,' x');
+ duplex_to_be_reset:=false
+ end
+@y
+ begin
+ duplex_to_be_reset:=false;
+ if ptr_blanks>0 then
+ if blank_follows[ptr_blanks]=cur_loc_after_bop then
+ begin
+ decr(ptr_blanks); {and remain in simplex mode}
+ duplex_to_be_reset:=true;
+ if print_mode>=duplex_master_normal then
+ write(ln3_file,' ',FF) {eject blank page for \\{verso} master}
+ end else
+ write(ln3_file,csi,print_mode:1,' x')
+ else
+ write(ln3_file,csi,print_mode:1,' x')
+ end
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S209.
+warning('more than ',max_rules:1,' rules on page; excess ignored!');
+@.more than ... rules@>
+@y
+warning('more than ',max_rules:1,' rules on page; excess ignored!');
+@:Warning: more than ... rules}{\quad\.{more than ... rules}@>
+@z
+
+Correct orientation of rules written when orientation=landscape
+@x <BHK 18-APR-1991> S209.
+with page_rules[rules_on_page] do begin
+ horiz := hhh; vert := vvv; height := hheight;
+ width := wwidth; covered := false;
+ end;
+@y
+with page_rules[rules_on_page] do
+ if new_orient=orientation then
+ begin
+ horiz := hhh; vert := vvv; height := hheight;
+ width := wwidth; covered := false;
+ end else
+ if new_orient=landscape then
+ begin {landscape rule will be output in portrait orientation}
+ vert := paper_ht-hhh-left_marg-top_marg;
+ horiz := vvv-hheight+top_marg-left_marg;
+ width := hheight; height := wwidth; covered := false;
+ end else {portrait rule output in landscape}
+ begin
+ vert := hhh-wwidth+left_marg-top_marg;
+ horiz := paper_ht-vvv-left_marg-top_marg;
+ width := hheight; height := wwidth; covered := false;
+ end;
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S233.
+pre: begin error('preamble command within a page!'); goto 9998;
+ end;
+@.preamble command within a page@>
+post,post_post: begin error('postamble command within a page!'); goto 9998;
+@.postamble command within a page@>
+ end;
+othercases begin error('undefined command ',o:1,'!');
+ goto done;
+@.undefined command@>
+@y
+pre: begin error('preamble command within a page!'); goto 9998;
+ end;
+@:Error: preamble command within a page}{\quad\.{preamble command within a page}@>
+post,post_post: begin error('postamble command within a page!'); goto 9998;
+@:Error: postamble command within a page}{\quad\.{postamble command within a page}@>
+ end;
+othercases begin error('undefined command ',o:1,'!');
+ goto done;
+@:Error: undefined command}{\quad\.{undefined command}@>
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S234.
+@<Cases for commands |nop|, |bop|, \dots, |pop|@>=
+nop: goto done;
+bop: begin error('bop occurred before eop!'); goto 9998;
+@.bop occurred before eop@>
+@y
+@<Cases for commands |nop|, |bop|, \dots, |pop|@>=
+nop: goto done;
+bop: begin error('bop occurred before eop!'); goto 9998;
+@:Error: bop occurred before eop}{\quad\\{bop }\.{occurred before }\\{eop}@>
+@z
+
+Correct orientation of rules written when orientation=landscape
+@x <BHK 18-APR-1991> S234.
+ @<Combine and...@>@;
+ do_page:=true;@/
+ @<Output contents of page@>;@/
+ write(ln3_file,LF); {LF after page}
+ new_orient:=orientation;
+ @<Change page orientation@>; {reset, if necessary}
+@y
+ do_page:=true;@/
+ @<Output contents of page@>;@/
+ new_orient:=orientation;
+ @<Change page orientation@>; {reset, if necessary}
+ @<Combine and...@>@; {Rules always output in default orientation}
+ write(ln3_file,LF); {LF after page}
+@z
+
+Change imaging area limits whenever the orientation is changed
+@x <BHK 10-MAY-1991> S244.
+@<Match the \meta{function name} in a \.{\\special}@>=
+case spec_cmd of
+ spec_land: new_orient:=landscape; {|'landscape'| or |'ln03:landscape'|}
+ spec_port: new_orient:=portrait; {|'portrait'| or |'ln03:portrait'|}
+@y
+@<Match the \meta{function name} in a \.{\\special}@>=
+case spec_cmd of
+ spec_land: begin new_orient:=landscape; {|'landscape'| or |'ln03:landscape'|}
+ set_landscape_limits
+ end;
+ spec_port: begin new_orient:=portrait; {|'portrait'| or |'ln03:portrait'|}
+ set_portrait_limits
+ end;
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S246.
+@ @<Finish a command that either sets or puts a character...@>=
+if p<0 then p:=255-((-1-p) mod 256)
+else if p>=256 then p:=p mod 256; {width computation for oriental fonts}
+@^oriental characters@>@^Chinese characters@>@^Japanese characters@>
+if (p<font_bc[cur_font])or(p>font_ec[cur_font]) then q:=invalid_width
+else q:=cur_font_glyph(p).width;
+if q=invalid_width then
+ begin error('character ',p:1,' invalid in font ');
+@.character $c$ invalid...@>
+@y
+@ @<Finish a command that either sets or puts a character...@>=
+if p<0 then p:=255-((-1-p) mod 256)
+else if p>=256 then p:=p mod 256; {width computation for oriental fonts}
+@^oriental characters@>@^Chinese characters@>@^Japanese characters@>
+if (p<font_bc[cur_font])or(p>font_ec[cur_font]) then q:=invalid_width
+else q:=cur_font_glyph(p).width;
+if q=invalid_width then
+ begin error('character ',p:1,' invalid in font ');
+@:Error: character $c$ invalid...}{\quad\.{character $c$ invalid...}@>
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S248.
+@<Finish a command that sets |h:=h+q|, then |goto done|@>=
+if (h>0)and(q>0) then if h>infinity-q then
+ begin error('arithmetic overflow! parameter changed from ',@|
+@.arithmetic overflow...@>
+@y
+@<Finish a command that sets |h:=h+q|, then |goto done|@>=
+if (h>0)and(q>0) then if h>infinity-q then
+ begin error('arithmetic overflow! parameter changed from ',@|
+@:Error: arithmetic overflow...}{\quad\.{arithmetic overflow...}@>
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S251.
+@ @<Finish a command that sets |v:=v+p|, then |goto done|@>=
+if (v>0)and(p>0) then if v>infinity-p then
+ begin error('arithmetic overflow! parameter changed from ',
+@.arithmetic overflow...@>
+@y
+@ @<Finish a command that sets |v:=v+p|, then |goto done|@>=
+if (v>0)and(p>0) then if v>infinity-p then
+ begin error('arithmetic overflow! parameter changed from ',
+@:Error: arithmetic overflow...}{\quad\.{arithmetic overflow...}@>
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S255.
+ monitor('Gathering font usage statistics...');
+@y
+ if verbose then monitor('Gathering font usage statistics...');
+@z
+
+Certain control sequences now defined in \S5
+@x <BHK 22-APR-1991> S266.
+character; whilst the end of the font download is marked by the |ST| (String
+Terminator) character --- this is preceded by a textual comment.
+@y
+character; whilst the end of the font download is marked by the |ST| (String
+Terminator) character --- this is preceded by a textual comment.
+
+Finally, we define the printable area, and designate up to ten downloaded
+fonts to be accessible through |SGR| control sequences.
+@z
+
+Certain control sequences now defined in \S5
+@x <BHK 22-APR-1991> S266.
+{Set page limits}
+write(ln3_file,csi,x_min:1,';',page_wid:1,'s',csi,y_min:1,';',page_len:1,'r');
+@<Designate first 10 fonts to SGRs |10..19|@>@;
+@y
+write(ln3_file,DECSLRM(x_min)(page_wid),DECSTBM(y_min)(page_len));
+{Set page limits}
+@<Designate first 10 fonts to SGRs |10..19|@>@;
+@z
+
+Certain control sequences now defined in \S5
+@x <BHK 22-APR-1991> S267.
+@ We start by writing the LN03 directives to the front of the file. Since the
+introduction of the LN03-Plus, this has been made more complicated, because
+the sequence |esc, 'c'| is meaningful (and \&{not} as |RIS|!) when the
+LN03-Plus is in the Tektronix emulation mode. Therefore, we start off by
+outputting the sequence |esc, '[!p'| which is DEC's private ``soft terminal
+reset'' (|DSCSTR|). (Note that this sequence uses the ``long-winded'' way of
+specifying |csi|; this is because the LN03-plus ignores the eigth bit when it
+is emulating a Tektronix terminal.) However, this won't necessarily reset an
+`ordinary' LN03, so we output the ISO-standard |RIS| (Reset Initial State
+$\equiv$ |esc,'c'|) sequence as well.
+
+There then follow a number of control sequences which set up further
+characteristics of the LN03: (1) |'?27h'| is a DEC private control sequence,
+|DECPSP|, which selects proportional spacing mode, whereby the printer moves
+forward by the recorded width of the character glyph rather than by some fixed
+amount after printing; (2) |'11h'| \&{set}s the |PUM| (Positioning Unit Mode),
+when set, this mode indicates that ``cursor movement'' sequences work in units
+of either decipoints or pixels, which of these is determined by (3) |'7 I'|
+which sets the |SSU| (Select Size Unit) to be in units of a single pixel; (4)
+|'?52h'| is another DEC private sequence, \&{set}ting the |DECOPM| (Origin
+Placement Mode) which places the origin for all measurement to the upper-left
+corner of the physical page (the alternative is 0.25 inches from that point).
+Finally, the sequence ending in |'t'| contains the |page_len| as a parameter,
+and is another DEC private control sequence which sets the |DECLPP| (Lines per
+Physical Page) to be the height of the printable area, in pixels.
+
+@d DECSTR==esc+'[!p'
+@d RIS==esc+'c'
+@d DECPSP_on==csi+'?27h'
+@d PUM_on==csi+'11h'
+@d SSU_pixel==csi+'7 I'
+@d DECOPM_on==csi+'?52h'
+
+@<Generate \.{LN3} file header@>=
+if orientation=landscape then
+ write_ln(ln3_file,DECSTR,RIS,csi,PFS_landscape)
+else
+ write_ln(ln3_file,DECSTR,RIS,csi,PFS_portrait);
+@y
+@ We start by writing the LN03 directives to the front of the file. Since the
+introduction of the LN03-Plus, this has been made more complicated, because
+the sequence |esc, 'c'| is meaningful (and \&{not} as |RIS|!) when the
+LN03-Plus is in the Tektronix emulation mode. Therefore, we start off by
+outputting the sequence |esc, '[!p'| which is DEC's private ``soft terminal
+reset'' (|DSCSTR|). (Note that this sequence uses the ``long-winded'' way of
+specifying |csi|; this is because the LN03-Plus ignores the eighth bit when it
+is emulating a Tektronix terminal.) However, this won't necessarily reset an
+`ordinary' LN03, so we output the ISO-standard |RIS| (Reset Initial State
+$\equiv$ |esc,'c'|) sequence as well.
+
+After setting the correct printing orientation, there then follow a number
+of control sequences which set up further characteristics of the LN03: (1)
+|'?27h'| is a DEC private control sequence, |DECPSP|, which selects
+proportional spacing mode, whereby the printer moves forward by the recorded
+width of the character glyph rather than by some fixed amount after
+printing; (2) |'11h'| \&{set}s the |PUM| (Positioning Unit Mode), when set,
+this mode indicates that ``cursor movement'' sequences work in units of
+either decipoints or pixels, which of these is determined by (3) |'7 I'|
+which sets the |SSU| (Select Size Unit) to be in units of a single pixel;
+(4) the |DECOPM| (Origin Placement Mode) is \&{set}, which places the origin
+for all measurement to the upper-left corner of the physical page (the
+alternative is 0.25 inches from that point). Finally, the sequence ending in
+|'t'| contains the |page_len| as a parameter, and is another DEC private
+control sequence which sets the |DECLPP| (Lines per Physical Page) to be the
+height of the printable area, in pixels.
+
+@d DECSTR==esc+'[!p'
+@d RIS==esc+'c'
+@d DECPSP_on==csi+'?27h'
+@d PUM_on==csi+'11h'
+@d SSU_pixel==csi+'7 I'
+
+@<Generate \.{LN3} file header@>=
+if orientation=landscape then
+ if paper_size = US then
+ write_ln(ln3_file,DECSTR,RIS,US_PFS_landscape)
+ else
+ write_ln(ln3_file,DECSTR,RIS,A4_PFS_landscape)
+else
+ if paper_size = US then
+ write_ln(ln3_file,DECSTR,RIS,US_PFS_portrait)
+ else
+ write_ln(ln3_file,DECSTR,RIS,A4_PFS_portrait);
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S283.
+ write_ln(term_out,' is virtual',crlf);@/
+@y
+ if verbose then write_ln(term_out,' is virtual',crlf);@/
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S316.
+ @<Report name of font file in use@> ;
+ if file_type=unavailable then
+ write(' unavailable; printing rules for glyphs;');
+ print(' with '); write_ln(term_out,' loaded with ');
+@y
+ @<Report name of font file in use@> ;
+ if file_type=unavailable then
+ begin
+ if not verbose then
+ begin
+ write(term_out,'Font ',name);
+ if percent <> 100 then write(term_out,' (at ',percent:1,'%)')
+ end;
+ write(term_out,' unavailable; printing rules for glyphs;');
+ if not verbose then write_ln(term_out,crlf);
+ end;
+ print(' with '); if verbose then write_ln(term_out,' loaded with ');
+@z
+
+Suppress checksum warning if either file has zero
+@x <BHK 25-MAR-1991> S320.
+ if font_check_sum[TeX_font]<>checksum then
+ warning('checksum doesn''t match in PK file')
+@.checksum doesn't match in PK file@>
+@y
+ if (font_check_sum[TeX_font]<>0) and (checksum<>0) and
+ (font_check_sum[TeX_font]<>checksum) then
+ warning('checksum doesn''t match in PK file')
+@:Warning: checksum doesn\'t match in PK file}{\qquad\.{in PK file}@>
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S321.
+write(term_out,'Font ',name);
+if percent<> 100 then write(' (at ',percent:1,'%)');
+@y
+if verbose then
+begin
+ write(term_out,'Font ',name);
+ if percent<> 100 then write(term_out,' (at ',percent:1,'%)');
+end;
+@z
+
+Must increment character counter if we're making dummy directory entry
+@x <BHK 02-MAY-1991> S325.
+@<Generate dummy directory entry for font that won't be used@>=
+begin
+ @<Create null character locator entry@>;
+ loaded:=yes
+end
+@y
+@<Generate dummy directory entry for font that won't be used@>=
+begin
+ @<Create null character locator entry@>;
+ incr(first_txfc); loaded:=yes
+end
+@z
+
+Scream if raster file contains character outside font
+Check if glyph has been previously processed
+@x <BHK 25-MAR, 02-MAY-1991> S328.
+@<Copy glyph from packed file, and find the next one@>=
+begin
+ repeat
+ @<Unpack and write...@>;
+ skip_specials
+ until (glyph_map(TeX_font)(char_num).loaded<>unused) or
+ (flag_byte=pk_post);
+ with glyph_map(TeX_font)(char_num) do
+ if loaded<>unused then
+ begin
+ char_code:=first_txfc;
+ font_code:=ln_font;
+ incr(first_txfc) {This might later be corrected}
+ end;
+@y
+@<Copy glyph from packed file, and find the next one@>=
+begin
+ repeat
+ @<Unpack and write...@>;
+ skip_specials;
+ if (flag_byte<>pk_post) then
+ begin
+ if (char_num<font_bc[TeX_font]) or (char_num>font_ec[TeX_font]) then
+ abort('bad pk file, illegal character (',char_num:1,')');
+@:fatal error Bad pk file illegal character}{\qquad\.{illegal character}@>
+ if not packet_used then {Packet wasn't copied...}
+ if (glyph_map(TeX_font)(char_num).loaded<>unused) then
+ warning('glyph ',char_num:1,
+ ' has multiple definitions; later one(s) ignored')
+@:warning glyph has multiple}{\quad\.{glyph $c$ has multiple definitions}@>
+ end
+ until packet_used or (flag_byte=pk_post);
+ with glyph_map(TeX_font)(char_num) do
+ if loaded<>unused then
+ begin
+ char_code:=first_txfc;
+ font_code:=ln_font;
+ incr(first_txfc) {Count character added to directory, etc}
+ end;
+@z
+
+Suppress checksum warning if either file has zero
+@x <BHK 25-MAR-1991> S333.
+@<Read character directory from |pxl_file|@>=
+
+move_to_pxl(pxl_size-16);
+if font_check_sum[TeX_font]<>long_pxl(pxl_ptr) then
+ warning('checksum doesn''t match in PXL file');
+@.checksum doesn't match in PXL file@>
+@y
+@<Read character directory from |pxl_file|@>=
+move_to_pxl(pxl_size-16); i:=long_pxl(pxl_ptr); {Read checksum from file}
+if (font_check_sum[TeX_font]<>0) and (i<>0) and
+ (font_check_sum[TeX_font]<>i) then
+ warning('checksum doesn''t match in PXL file');
+@:Warning: checksum doesn\'t match in PXL file}{\qquad\.{in PXL file}@>
+@z
+
+Correct bug with fonts that require an overflow beyond 188 glyphs
+@x <BHK 17-APR-1991> S334.
+The character numbers will be those of the LN03 font file, having already been
+mapped to these during the mapping phase; therefore, if the lowest character
+number used is |= left_first| then we must be starting a new font, so must
+initialize the empty font file and indicate that this is a |GL| font
+(left-hand half of eight-bit character table).
+
+@<Determine lowest and highest characters used in the \TeX\ font@>=
+first_txfc:=-1; last_txfc:=-1; {For |ln_font|}
+@y
+The character numbers will be those of the LN03 font file, having already been
+mapped to these during the mapping phase; therefore, if the lowest character
+number used is |= left_first| then we must be starting a new font, so must
+initialize the empty font file and indicate that this is a |GL| font
+(left-hand half of eight-bit character table).
+
+If the \TeX\ font contained more than 188 glyphs that were used, it will
+have been mapped to \&{two} LN03 fonts: |overflow_font| will be set true
+when determining which characters were used in the overflow portion (the
+first font using all of |left_first..right_first| and
+|left_last..right_last|, since such a large font will never be ``fitted in''
+along with other fonts mapped to an LN03 font.
+
+@<Determine lowest and highest characters used in the \TeX\ font@>=
+first_txfc:=-1; last_txfc:=-1; overflow_font:=false; {For |ln_font|}
+@z
+
+Correct bug with fonts that require an overflow beyond 188 glyphs
+@x <BHK 17-APR-1991> S335.
+@ As we cycle through all the allocated characters, we note each code in turn,
+thus determining the highest code used. We also note the lowest one when we
+meet the first code used. If the |TeX_font| extends into a second |ln_font|,
+the corresponding information will be recorded in |final_txfc| and |txfc_next|,
+respectively.
+
+@<Note |last_txfc|, and set |first_txfc| for first character@>=
+if loaded = wanted then
+begin if txf_to_lnf[font_code]=ln_font then
+ begin if first_txfc=-1 then first_txfc:=char_code;
+ last_txfc:=char_code; font_code:=ln_font
+ end
+@y
+@ As we cycle through all the allocated characters, we note each code in turn,
+thus determining the highest code used (if this is |right_last| then any
+subsequent character \\{in this font} will belong to the overflow portion,
+in font |ln_font+1|). We also note the lowest one when we
+meet the first code used. If the |TeX_font| extends into a second |ln_font|,
+the corresponding information will be recorded in |final_txfc| and |txfc_next|,
+respectively.
+
+@<Note |last_txfc|, and set |first_txfc| for first character@>=
+if loaded = wanted then
+begin if not overflow_font then
+ begin if first_txfc=-1 then first_txfc:=char_code;
+ last_txfc:=char_code; font_code:=ln_font;
+ overflow_font:= char_code=right_last
+ end
+@z
+
+Correct bug with fonts that require an overflow beyond 188 glyphs
+@x <BHK 17-APR-1991> S337.
+\yskip\hang|end_txf| This is |true| if the last character of the present
+|TeX_font| is the last character mapped to |ln_font|.
+
+@<Local variables of |add_txf_to_lnf|@>==
+@!first_txfc, @!last_txfc : integer;
+@!txfc_next, @!final_txfc : integer;
+@!begin_txf, @!end_txf : boolean;
+@y
+\yskip\hang|end_txf| This is |true| if the last character of the present
+|TeX_font| is the last character mapped to |ln_font|.
+
+\yskip\hang|overflow_font| Set |true| when we're determining the first and
+last characters used in the second LN03 font (|ln_font+1|) into which a font
+of more than 188 glyphs has overflowed.
+
+\yskip\hang|packet_used| Set |true| iff a character packet, taken from a
+packed pixel file, corresponds to a |wanted| character, and is downloaded.
+If a second packet with the same |char_num| is encountered, the |loaded|
+field will already have been set to |yes| or |no|, and the packet will be
+skipped. This permits us to detect duplicate characters (and ensure that
+we still process \\{all} characters actually used).
+
+@<Local variables of |add_txf_to_lnf|@>==
+@!first_txfc, @!last_txfc : integer;
+@!txfc_next, @!final_txfc : integer;
+@!begin_txf, @!end_txf : boolean;
+@!overflow_font : boolean;
+@!packet_used : boolean;
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S338.
+write_ln(term_out,rasters:0,' bytes of rasters (',font_occupancy[TeX_font]:1,
+ ' characters)' ,crlf);
+@y
+if verbose then write_ln(term_out,rasters:0,' bytes of rasters (',
+ font_occupancy[TeX_font]:1,' characters)' ,crlf);
+@z
+
+Character counter wasn't increment for missing characters!
+@x <BHK 02-MAY-1991> S343.
+ warning('Font ',name,' doesn''t contain character ',char_num:1,crlf);
+@:Warning: Font doesn't contain character}{\quad\.{Font doesn't contain...}@>
+ @<Decide whereabouts to download the character@>;
+ @<Finish off any previous half font on LN03@>;
+ tfm_width := width;
+ num_cols := pixel_width;
+ base := ras_beg + ras_len;
+ @<Create null character locator entry@>;
+ char_code:=first_txfc; font_code:=ln_font
+@y
+ warning('Font ',name,' doesn''t contain character ',char_num:1,crlf);
+@:Warning: Font doesn't contain character}{\quad\.{Font doesn't contain...}@>
+ @<Decide whereabouts to download the character@>;
+ @<Finish off any previous half font on LN03@>;
+ tfm_width := width;
+ num_cols := pixel_width;
+ base := ras_beg + ras_len;
+ @<Create null character locator entry@>;
+ char_code:=first_txfc; font_code:=ln_font;
+ incr(first_txfc)
+@z
+
+Must count character's addition to directory entry, etc
+@x <BHK 02-MAY-1991> S344.
+ move_to_pxl(addr*4);
+ char_code:=to_where;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Copy the rasters themselves@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>
+ end {|with|}
+@y
+ move_to_pxl(addr*4);
+ char_code:=to_where;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Copy the rasters themselves@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>;
+ incr(first_txfc)
+ end {|with|}
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S365.
+ if (pages_counted mod 10)=0 then monitor('.'); {show progress}
+@y
+ if ((pages_counted mod 10)=0) and verbose then
+ monitor('.'); {show progress}
+@z
+
+Suppress spurious `done' message after N pages processed.
+@x <BHK 25-MAR-1991> S365.
+ monitor('done.'+crlf); term_offset:=0
+@y
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S365.
+ monitor('done.'+crlf); term_offset:=0;
+@y
+ if verbose then monitor('done.'+crlf); term_offset:=0;
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S373.
+@<Count the pages and move to the starting page@>=
+monitor('Finding starting page...');
+@y
+@<Count the pages and move to the starting page@>=
+if verbose then monitor('Finding starting page...');
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S373.
+monitor('found.'+crlf); term_offset:=0
+@y
+if verbose then monitor('found.'+crlf); term_offset:=0
+@z
+
+Correct the indexing of some warning messages
+@x <BHK 26-MAR-1991> S377.
+if signed_quad<>numerator then
+ warning('numerator doesn''t match the preamble!');
+@:warning numerator doesn't match}{\quad\.{numerator doesn't match...}@>
+if signed_quad<>denominator then
+ warning('denominator doesn''t match the preamble!');
+@:warning denominator doesn't match}{\quad\.{denominator doesn't match...}@>
+if signed_quad<>mag then if new_mag=0 then
+ warning('magnification doesn''t match the preamble!');
+@:warning magnification doesn't match}{\quad\.{magnification doesn't match...}@>
+@y
+if signed_quad<>numerator then
+ warning('numerator doesn''t match the preamble!');
+@:Warning: numerator doesn't match}{\quad\.{numerator doesn't match...}@>
+if signed_quad<>denominator then
+ warning('denominator doesn''t match the preamble!');
+@:Warning: denominator doesn't match}{\quad\.{denominator doesn't match...}@>
+if signed_quad<>mag then if new_mag=0 then
+ warning('magnification doesn''t match the preamble!');
+@:Warning: magnification doesn't match}{\quad\.{magnification doesn't match...}@>
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S387.
+@!file_name,@!actual_file_spec,@!log_file_name,
+ @!output_file_name:file_spec;
+@!file_message:file_spec;
+@!cmd_j,@!cmd_k:integer;
+@!ask : boolean;
+@y
+@!file_name,@!actual_file_spec,@!log_file_name,
+ @!output_file_name:file_spec;
+@!file_message:file_spec;
+@!cmd_j,@!cmd_k:integer;
+@!ask,@!verbose : boolean;
+@z
+
+Correct indexing of warning and error messages
+@x <BHK 26-MAR-1991> S395.
+if not ask then bomb_out('No file name provided');
+@.No file name provided@>
+@y
+if not ask then bomb_out('No file name provided');
+@z
+
+Provide support for /VERBOSE qualifier
+@x <BHK 30-SEP-1991> S396.
+if odd(VAX_cli_present('LOG')) then
+ VAX_cli_get_value('LOG',log_file_name);
+@y
+if odd(VAX_cli_present('LOG')) then
+ VAX_cli_get_value('LOG',log_file_name);
+verbose := odd(VAX_cli_present('VERBOSE'));
+@z
+
diff --git a/dviware/ln03/rmcs/dvitoln03.cld b/dviware/ln03/rmcs/dvitoln03.cld
new file mode 100644
index 0000000000..83f3ecd129
--- /dev/null
+++ b/dviware/ln03/rmcs/dvitoln03.cld
@@ -0,0 +1,198 @@
+!*************************************************************************
+! CLD file to set up DCL interface for DVItoLN03 command.
+!
+! For DVItoLN03 V4.0... BHK 11-FEB-1991
+! V4.1... BHK 20-SEP-1991
+! (Not all qualifiers are yet supported by the code...)
+!*************************************************************************
+!
+! Types used for certain qualifiers
+!
+define type ORIENTS
+ keyword PORTRAIT,
+ default
+ keyword LANDSCAPE
+!
+! Mark one of these as default, as appropriate to your site
+!
+define type PRINTERS
+ keyword LN03, ! Traditional LN03 or LN03-plus
+ default
+ keyword LN05 ! DEClaser~2100
+ keyword LN06 ! DEClaser~2200
+!
+define type PRINT_MODE
+ keyword DUPLEX,
+ keyword SIMPLEX,
+ keyword NORMAL,
+ keyword TUMBLED,
+ keyword MASTER
+!
+define type FEED_TRAY_LIST
+ keyword ALL,value(required,type=TRAY_TYPES)
+ keyword FIRST,value(required,type=TRAY_TYPES)
+ keyword REST,value(required,type=TRAY_TYPES)
+!
+define type TRAY_TYPES
+ keyword DEFAULT_TRAY
+ keyword TOP_TRAY
+ keyword BOTTOM_TRAY
+ keyword ENVELOPE_TRAY
+ keyword MANUAL_FEED
+!
+! Mark one of these as default, as appropriate to your site
+!
+define type PAPER_TYPES
+ keyword A4, ! ISO A4 paper, 297mm x 210mm
+ default
+ keyword US ! US Letter size, 11in x 8-1/2in
+!
+define verb DVILN03
+ image "TEX_EXE:DVITOLN03"
+ parameter P1,
+ label=FILESPEC,
+ prompt="DVI file",
+ value(required,type=$file)
+ qualifier STARTING_PAGE,
+ default,
+ nonnegatable,
+ value(default="*")
+ qualifier NUMBER_OF_PAGES,
+ default,
+ nonnegatable,
+ value(default=10000000,type=$number)
+ qualifier LEFT_MARGIN,
+ default,
+ nonnegatable,
+ value(default=300px)
+ qualifier TOP_MARGIN,
+ default,
+ nonnegatable,
+ value(default=300px)
+ qualifier HFUZZ, ! Program default is 100sp
+ nonnegatable,
+ value(required)
+ qualifier VFUZZ,
+ nonnegatable,
+ value(required)
+ qualifier ORIENTATION,
+ default,
+ nonnegatable,
+ value(type=orients)
+ qualifier TFM_DIRECTORY,
+ nonnegatable,
+ default,
+ value(default="TEX_FONTS:",type=$file)
+ qualifier VIRTUAL_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX_FONTS:",type=$file)
+ qualifier PK_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX_PK:",type=$file)
+ qualifier PXL_FONT_DIRECTORY,
+ negatable,
+ default,
+ value(default="TEX_PXL_ROOT:",type=$file)
+ qualifier LOG,
+ negatable,
+ value(type=$file)
+ qualifier OUTPUT,
+ nonnegatable,
+ value(required,type=$file)
+ qualifier VERBOSE,
+ negatable,
+ default
+ qualifier PRINT_MODE
+ value(list,type=PRINT_MODE)
+ qualifier DUPLEX_BY_PAGE_NUMBERS
+ default,
+ negatable
+ qualifier FEED_TRAY
+ value(required,list,type=feed_tray_list)
+ qualifier PAPER_SIZE
+ default,
+ nonnegatable,
+ value(type=paper_types)
+ qualifier DEVICE_TYPE ! Never used by program
+ default,
+ value(type=printers)
+!
+! That last qualifier is present just to control these disallow clauses
+!
+ disallow DEVICE_TYPE.LN05 and (PRINT_MODE.TUMBLED or
+ (PRINT_MODE.MASTER and PRINT_MODE.SIMPLEX)) ! DEClaser 2100
+ disallow DEVICE_TYPE.LN03 and (PRINT_MODE.TUMBLED or FEED_TRAY)! Plain LN03
+ disallow DUPLEX_BY_PAGE_NUMBERS and PRINT_MODE.SIMPLEX
+ disallow PRINT_MODE.MASTER and not PRINT_MODE.DUPLEX
+ disallow PRINT_MODE.SIMPLEX and (PRINT_MODE.DUPLEX or PRINT_MODE.MASTER)
+ disallow FEED_TRAY.ALL and (FEED_TRAY.FIRST or FEED_TRAY.REST)
+!
+! The value that DVItoLN03 will use if a qualifier is not specified (and
+! no default is given) can be seen in DVITOLN03.WEB/.CH
+!
+!
+!-----------------------------------------------------------------------
+!
+! DVItoLN03 can handle any font scheme that obeys the following rules:
+!
+! 1. If the PK_FONT_DIRECTORY value ends in ".]" then all PK font
+! files reside in various subdirectories of PK_FONT_DIRECTORY.
+! Each subdirectory name is a different font size.
+! e.g.
+! /PK_FONT_DIRECTORY=TEX_DISK:[TEX.PK.]
+! Font names: TEX_DISK:[TEX.PK.][300]cmr10.pxl
+! TEX_DISK:[TEX.PK.][622]cmr10.pxl
+!
+! 2. If the PK_FONT_DIRECTORY value does NOT end in ".]" then all PK
+! font files reside in PK_FONT_DIRECTORY. Each file type begins
+! with a font size, followed by "PK".
+! e.g.
+! /PK_FONT_DIRECTORY=TEX_DISK:[TEX.PK]
+! Font names: TEX_DISK:[TEX.PK]cmr10.300pk
+! TEX_DISK:[TEX.PK]cmr10.622pk
+!
+! 3. If the PXL_FONT_DIRECTORY value ends in ".]" then all PXL font
+! files reside in various subdirectories of PXL_FONT_DIRECTORY.
+! Each subdirectory name is a different font size.
+! e.g.
+! /PXL_FONT_DIRECTORY=TEX_DISK:[TEX.PXL.]
+! Font names: TEX_DISK:[TEX.PXL.][1500]cmr10.pxl
+! TEX_DISK:[TEX.PXL.][3732]cmr10.pxl
+!
+! 4. If the PXL_FONT_DIRECTORY value does NOT end in ".]" then all PXL
+! font files reside in PXL_FONT_DIRECTORY. Each file type begins
+! with a font size, followed by "PXL".
+! e.g.
+! e.g.
+! /PXL_FONT_DIRECTORY=TEX_DISK:[TEX.PXL]
+! Font names: TEX_DISK:[TEX.PXL]cmr10.1500pxl
+! TEX_DISK:[TEX.PXL]cmr10.3732pxl
+!
+! The above hackery is an attempt to cope with the various font schemes
+! used by VAX/VMS TeX sites. Note that GF files are not handled; I
+! figured any sites using GF files would convert them to PK files sooner
+! or later.
+!
+! NB In the examples above, the values given for the font qualifiers
+! give a directory explicitly, but they may be passed logical names
+! instead: for example, one could have performed the following:
+!
+! $ DEFINE/TRANSLATION_ATTRIBUTES=CONCEALED TEX_PXL_ROOT TEX_DISK:[TEX.PXL.]
+! $ DEFINE TEX_PK TEX_DISK:[TEX.PK]
+!
+! and then the default specifications used in THIS file will access
+! a pixel file for cmr10 as TEX_DISK:[TEX.PXL.1500]CMR10.PXL, whilst
+! a packed file would be sought as TEX_DISK:[TEX.PK]CMR10.300PK
+!
+! Note that /TFM_DIRECTORY must be present by default, and must possess a
+! default value, which indicates, either directly or via a logical name,
+! the directory/ies in which the .TFM files are to be found.
+!
+! If virtual fonts are in use, /VIRTUAL_DIRECTORY should be present by
+! default, and its default value should indicate where the .VF files are
+! to be found; if no .VF files exist, processing can be speeded up by
+! removing DEFAULT from this qualifier, or by specifying /NOVIRTUAL on
+! the command line.
+!-----------------------------------------------------------------------
diff --git a/dviware/ln03/rmcs/dvitoln03.web b/dviware/ln03/rmcs/dvitoln03.web
new file mode 100644
index 0000000000..0690fcd579
--- /dev/null
+++ b/dviware/ln03/rmcs/dvitoln03.web
@@ -0,0 +1,10433 @@
+% This program by D. E. Knuth is not copyrighted and can be used freely.
+% Version 1 was completed in September, 1982.
+% Slight changes were made in October, 1982, for version 0.7 of TeX.
+% Version 1.1 corrected minor bugs (May, 1983).
+% Version 2 was released with version 0.999 of TeX (July, 1983).
+% Version 2.1 corrected a bug when no fonts are present (September, 1983).
+% Version 2.2 corrected bugs in max_*_so_far and put1 (October, 1983).
+% Version 2.3 corrected spacing of accents (March, 1984).
+% Version 2.4 fixed rounding, changed oriental font conventions (April, 1984).
+% Version 2.5 improved the case of zero pages (May, 1984).
+% Version 2.6 introduced max_drift (June, 1984).
+% Version 2.7 had minor editorial changes (August, 1984).
+
+% Version 1.0 of DVItoLN03 was created (as a change file to DVItype) March 1986
+% by Brian HAMILTON KELLY, Royal Military College of Science,
+% Shrivenham, SWINDON, SN6 8LA, United Kingdom
+% Tel: Swindon (0793) 785252 (Int'l +44-793-785252)
+% e-mail: (Janet) tex@@uk.ac.cranfield.rmcs
+%
+% This drew heavily upon Flavio Rose's DVI2LNG program, but also
+% included the work formerly performed as a separate pass by his
+% LN03TOPP program (which had bugs, and was written in PL/I, for
+% which we did not have a compiler!)
+% Version 1.1 corrected minor bugs in the port from PL/I and displayed page
+% numbers as each was processed April 1986
+% Version 1.2 used .PXL files in separate directories for each magnification,
+% in the manner of Andrew Trevorrow's DVItoVDU July 1986
+% Version 1.3 introduced minor cosmetic changes and increased |max_rules| to
+% 2048 July 1987
+% Version 1.4 added support for including sixel graphics
+% through \special Sep 87
+% Version 1.5 merged the original DVItype.WEB and the (now hopelessly huge)
+% change file, and `WEBified' the whole system. Also added proper
+% support for default filenames, so that one CAN reference an
+% older DVI file than the latest version.
+% Version 1.6 supports oversized glyphs (by making them into invisible
+% characters) and also outputs invisible characters as a single
+% pixel high row of white pixels of an appropriate width
+% Version 1.7 prints the glyphs of oversized characters as bitmap sixel dumps.
+% Version 2.0 reads PK files instead of .PXL (if available)
+% Version 2.1 corrects error reading invisible fonts from packed files and
+% with invisible characters of zero TFM width.
+% Version 3.0 includes wholesale rearrangement of some sections of code, to
+% improve its WEB-like quality. It also adds the following
+% functionality:
+% The packed and unpacked font files may be provided in
+% either a flat or a rooted directory structure; if logical
+% names are used to specify these locations (as in the .CLD
+% file provided), the files may be spread over a number of
+% different directories or volumes.
+% The error messages are improved over earlier versions of
+% the program, and are now all indexed in the woven
+% (WEAVEd?) WEB.
+% The program can now handle fonts with more then 128
+% characters, up to TeX's limit of 256. Therefore, it can
+% now process documents which use Silvio Levy's Greek fonts.
+% Retention of the log (.TYP) file may now be forced,
+% suppressed, or allowed to be determined by the success of
+% the processing.
+% Minor revisions and corrections have been made, in
+% particular, it now correctly understands the physical
+% limitations to the imaging area.
+% Version 3.1 correctly computes the magnification of each font for the font
+% loading reports, and also ensures that all output files are
+% opened in the current default directory, even when logical
+% names are used for the input file. It also extracts and
+% reports the full file specification of the source (.DVI) file.
+% Also introduced the /OUTPUT qualifier and file spec on /LOG.
+% Version 3.1-1 adds the `special' commands that were in the original Rose
+% program; this code was developed independently of (and
+% simultaneously with) version 3.1 (see above), and it therefore
+% seemed appropriate to give it a DEC-style version number
+% extension...
+% Version 3.1-2 increases |max_rules| to 16384 to cope with the output of
+% BIGTeX.
+% Version 3.1-3 reports an error status if the opening of a \special sixel
+% file fails. The LN03 is also reset to pixel spacing units
+% after the sixel file has been included.
+% Version 3.1-4 avoids attempting to print non-existent glyphs; some font
+% designers use non-existent characters in ligature sequences
+% (for example, Georgia Tobin ligatures * with characters such
+% as i, j, r, s, to select a variant form of the letter).
+% With earlier versions of this program, having failed to
+% download a glyph for the non-existent character, an attempt
+% would be made to print it is a bitmap when processing the
+% pages.
+% Version 3.2 This version, and all others prior to V4.0, were never
+% released: they were purely internal to RMCS whilst
+% additional functionality was being incorporated.
+% This version tidied up Robin Fairbairns' code, particularly
+% for recognizing <dimen> units.
+% Version 3.2-1 Correct code so that the arguments of \special are treated
+% as |ASCII_code| (they are not *necessarily* |char|s).
+% Version 3.3 Provide qualifiers to define all logicals used, so that
+% sites may chose to use TEX$FONTS or TEX_FONTS, etc.
+% Permit use of units other than pixel for specification
+% of /LEFT_MARGIN and /TOP_MARGIN.
+% Version 3.3-1 Permit /LEFT_MARGIN and /TOP_MARGIN to take dimensionless
+% quantity, with the assumption that it's in pixels.
+% Version 3.4 Look out for virtual fonts, and reject them
+% Version 3.4-1 Read VF file, and parse it
+% Version 3.4-2 Map virtual font characters to real fonts, and load them
+% Version 3.4-3 Now able to print simple characters from a VF
+% Version 3.5 Made do_page capable of recursion to support complex
+% sequences in VF files
+% Version 3.5-1 Revised DVI reading code for input from |vf|
+% Version 3.5-2 Scaled |dvi| movements taken from VF file
+% Version 3.5-3 Corrected computation of scaling of -ve movements
+% Version 3.5-4 Removed confusion caused by empty segments on |seg_list|
+% Version 3.5-5 Use font_scaled_size[vfno] for scaling physical fonts!
+% Version 3.5-6 Corrected storage of -ve parameters in |vf| array
+% Version 3.5-7 Terminate normal text segment preceding composite character
+% Version 3.6 Read TFM files only once; fold upper/lower case names
+% Version 3.6-1 Guard against infinite recursion with font recurse
+% Version 3.6-2 Reference to another virtual font can't map to LN03 font
+% Version 3.6-3 Correct spurious checksum error
+% Version 3.7 Supports landscape and portrait \specials
+% Version 3.7-1 Defers bitmap output of glyphs until |eop|, like rest
+% Version 3.7-2 Correct handling of bitmap glyphs in |out_list|
+% Version 3.8 Support mixture of orientations on same page
+% Version 3.8-1 Moved all |max...| definitions to near front of WEB
+% Version 3.8-2 Changed |varying [name_size] of char| into |file_spec|
+% Version 3.8-3 Included narrative describing TFM files
+% Version 3.8-4 Aggregate all |glyph_info| into one vector |glyphs|
+% Version 3.8-5 Cosmetic changes; errors/warnings not just to TYP file
+% Version 3.8-6 Preliminary moves to set rules for missing fonts
+% Version 3.9 Image glyph from missing font by a solid rule
+% Version 3.9-1 Integrate |pixel_width|, etc into |glyph_map|
+% Version 3.9-2 Integrate |width|, etc into |glyph_map|
+% Version 3.9-3 Further speed-up, by greater use of |with glyph_map|
+% Version 3.9-4 Speed up setting loop, by removing double indexing
+% Version 3.9-5 Defer text too wide message until eop; report phases
+% Version 3.9-6 Couple more little speed-ups, missed before
+% Version 3.9-7 Cosmetic amendments; improved indexing
+% Version 3.9-8 Move <Move to top of form> before Copy_sixel_file
+% Version 3.91 Start unravelling |print_mode| and trays at top of form
+% Version 3.91-1 Acknowledge efforts of Robin and Karsten
+% Version 3.91-2 Ensure |last_page_recto| set even first time through
+% Version 3.91-3 Use Karsten's |blank_follows| mechanism
+% Version 3.91-4 Trim trailing spaces from |cur_name| in error message
+% Version 3.91-5 Determine |ln03_master| from /DEVICE_TYPE setting
+% Version 3.91-6 Provide |rd_scaled_pt|, for decoding /hfuzz, /vfuzz
+% Version 3.91-7 In duplex, don't change tray until 3rd page
+% Version 3.91-8 Insert sixel dumps into |seg_list|
+% Version 4.0 Cosmetic changes to error messages - new release!!!
+
+\outer\def\N#1.#2.{\MN#1.\vfil\eject % beginning of starred section
+ \def\rhead{\uppercase{\ignorespaces#2}} % define running headline
+ \message{*\modno} % progress report
+ {\def\.{\string\.}\def\BS{\string\BS\space}% Prevent expansion during contents write
+ \edef\next{\write\cont{\Z{#2}{\modno}{\the\pageno}}}\next % to contents file
+ }%
+ \ifon\startsection{\bf\ignorespaces#2.\quad}\ignorespaces}
+
+
+% Here is TeX material that gets inserted after \input webmac
+\def\hang{\hangindent 3em\indent\ignorespaces}
+\font\ninerm=cmr9
+\let\mc=\ninerm % medium caps for names like PASCAL
+\font\logo=logo10 % font used for the METAFONT logo
+\def\MF{{\logo META}\-{\logo FONT}}
+\def\PASCAL{P{\mc ASCAL}}
+
+\def\(#1){} % this is used to make section names sort themselves better
+\def\9#1{} % this is used for sort keys in the index
+
+\def\title{DVI$\,$\lowercase{to}$\,$LN03 V4.0}
+\def\contentspagenumber{0}
+\def\topofcontents{\null
+ \def\titlepage{F} % include headline on the contents page
+ \def\rheader{\mainfont\hfil \contentspagenumber}
+ \vfill
+ \centerline{\titlefont The {\ttitlefont DVItoLN03} processor}
+ \vskip 15pt
+ \centerline{(Version 4.0, 27th February 1991)}
+ \centerline{(Vax/VMS Version)}
+ \vfill}
+\def\botofcontents{\vfill
+ \centerline{\mc Acknowledgements}
+ \centerline{\hsize 5in\baselineskip9pt
+ \vbox{\ninerm\noindent
+ This program was originally based upon Flavio Rose's change file
+ which, applied to David Fuch's original \.{DVItype} program, generated
+ his \.{DVI2LNG} program. (The output produced by \.{DVI2LNG} was then
+ further processed by \.{LN03TOPP} to yield a \.{LN3} file to drive a
+ Digital LN03 laser printer.) Further extensions and enhancements were
+ added, and when the \.{WEB} change file grew to twice the size of the
+ original \.{DVITYPE.WEB} source, a manual \.{WEB}merge operation was
+ performed!\endgraf
+ Support for \.{\\changebar} specials was provided by Robin Fairbairns.
+ The code for the newer DEClaser printers is due to Karsten Nyblad.}}}
+\pageno=\contentspagenumber \advance\pageno by 1
+\let\maybe=\iftrue
+%\let\maybe=\iffalse
+\def\meta#1{{$\langle$\rm #1$\rangle$}}
+\def\9#1{}% Used with @@:sort entry}{printed entry@@>
+
+@* Introduction.
+The \.{DVItoLN03} utility program reads binary device-independent (``\.{DVI}'')
+files that are produced by document compilers such as \TeX, and converts them
+into a form suited to driving a Digital LN03 or LN03-Plus laser printer. The
+@^LN03 laser printer@>
+output file (with extension \.{LN3}) contains both the instructions to typeset
+@^LN3 file@>
+the required characters \&{and} the commands necessary to download the
+characters required (until DEC get around to providing the Computer Modern
+fonts in a ROM cartridge!). The LN03-Plus will accept, without complaint,
+any number of downloaded fonts: however, only the first 14 fonts (each
+consisting of up to 188 characters, in the \\{GL} and \\{GR} sets) are
+actually usable for imaging glyphs: attempts to image a glyph from fonts
+|15..| result in the display of a character taken from one of the first 14
+fonts loaded. In view of these limitations, \.{DVItoLN03} only downloads
+the characters which are actually used within the document being processed;
+the maximum possible number of characters, even if taken from different
+\TeX\ fonts, are combined into each single `LN03 font'.
+
+The program was developed by Brian Hamilton Kelly at the Royal Military
+@^Hamilton Kelly, Brian@>
+College of Science.
+@^RMCS@>
+@^Royal Military College of Science@>
+The \.{DVI2LNG} program of Flavio Rose
+@^Rose, Flavio@>
+@:DVI2LNG program}{\.{DVI2LNG} program@>
+was used as a starting point; this had been distributed as a change file to
+be applied to the original \.{DVItype} program,
+@:DVItype Program}{\.{DVItype} program@>
+and ``translated'' the \.{DVI} file into two output files which were then
+further processed by his \.{LN03toPP}
+@:LN03toPP Program}{\.{LN03toPP} program@>
+program (written in PL/I), which required device-specific versions of
+unpacked pixel files. The initial step was to perform the two separate
+passes within a single program (therefore the present program still needs to
+make two passes through the \.{DVI} file). Later work added further
+functionality including use of ``ordinary'' pixel files and support for
+\TeX's \.{\BS special} command to read sixel graphics dump files and include
+them verbatim within the output file. More recent revisions have produced
+major versions 2, 3 and 4:
+
+\yskip\hang\&{V2.0} Provided capability to read pixel rasters from packed
+(\.{PK}) files as well as from the traditional \.{PXL} files. It also manages
+to handle the glyphs of characters which are too large to load into the
+LN03's memory.
+
+\yskip\hang\&{V3.0} Changed method of accessing font files, to allow users
+flexibility in the storage philosophy they adopt. Can now handle large
+(256-character) fonts, such as Levy's Greek.
+@^Levy, Silvio@>
+@^256-character fonts@>
+@:two hundred and fifty six character fonts}{256-character fonts@>
+
+
+\yskip\hang\&{V3.1} Robin Fairbairns of Laser Scan (Cambridge, UK) added
+@^Fairbairns, Robin@>
+support for Rose's \.{\BS special}s for changebar marking at V3.1-1, June
+1989.
+
+\yskip\hang\&{V3.2} Tidied up recognition of \TeX\ \meta{physical unit}s.
+Removed final vestige of `hard-wired' logical names, \\{viz:} \.{TEX\$FONTS}
+@.TEX\$FONTS@>
+
+\yskip\hang\&{V3.3} Permitted \.{/LEFT\UL MARGIN} and \.{TOP\UL MARGIN}
+qualifiers to take dimensioned lengths, instead of being restricted to
+pixels.
+
+\yskip\hang\&{V3.4} Processed virtual font files, provided each character
+was only mapped to a single character from some other font; did not support
+virtual characters which mapped to a sequence of one or more characters from
+other physical fonts, nor could it handle font \.{recurse}.
+
+\yskip\hang\&{V3.5} Handled sequences in virtual font files; still couldn't
+handle font \.{recurse}.
+
+\yskip\hang\&{V3.6} Supports font \.{recurse}; folds multiple references to
+same font (name and scale) onto single invocation.
+
+\yskip\hang\&{V3.7} Supports landscape and portrait specials; whole page only.
+
+\yskip\hang\&{V3.8} Supports mixture of landscape and portrait on same page.
+
+\yskip\hang\&{V3.9} Prints glyphs from missing fonts as solid rules; added
+\.{/HFUZZ} and \.{/VFUZZ} qualifiers.
+
+\yskip\hang\&{V4.0} Supports the new DEClaser~2100 and~2200 printers (the
+LN05 and LN06) in addition to the traditional LN03. With the LN06, paper
+feed trays may be selected from the command line, and the duplexing
+facilities controlled also. Support for these printers was provided by
+Karsten Nyblad
+@^Nyblad, Karsten@>
+of TFL, the Danish Telecommunication Research Laboratory, and integrated
+into this new release with the other features mentioned above.
+
+One of the stated {\it raisons d'\^^Detre\/} for \.{DVItype} is ``to serve as an
+example of a program that reads \.{DVI} files correctly, for system
+programmers who are developing \.{DVI}-related software.'' The paradigms for
+calculation provided by this example have been followed closely in the present
+program (by importing them {\it verbatim\/} from \.{DVItype}!) To quote again
+from \.{DVItype}:\vskip 5pt
+
+ \centerline{\hsize 5in\baselineskip9pt
+ \vbox{\ninerm\noindent
+ ``Programs for typesetting need to be especially careful about how they do
+ arithmetic; if rounding errors accumulate, margins won't be straight,
+ vertical rules won't line up, and so on. But if rounding is done
+ everywhere, even in the midst of words, there will be uneven spacing
+ between the letters, and that looks bad. Human eyes notice differences
+ of a thousandth of an inch in the positioning of lines that are close
+ together; on low resolution devices, where rounding produces effects
+ four times as great as this, the problem is especially critical.
+ Experience has shown that unusual care is needed even on high-resolution
+ equipment; for example, a mistake in the sixth significant hexadecimal
+ place of a constant once led to a difficult-to-find bug in some software
+ for the Alphatype CRS, which has a resolution of 5333 pixels per inch
+ (make that 5333.33333333 pixels per inch). The document compilers that
+ generate \.{DVI} files make certain assumptions about the arithmetic
+ that will be used by \.{DVI}-reading software, and if these assumptions
+ are violated the results will be of inferior quality.''
+ }}
+
+The first \.{DVItype} program was designed by David Fuchs in 1979, and it
+@^Fuchs, David Raymond@>
+went through several versions on different computers as the format of
+\.{DVI} files was evolving to its present form.
+
+The \.{LN3} output file produced by DVItoLN03 always commences by including
+commands to down-load one or more font-files (each of a maximum of 188
+characters) to define just those characters used in the document. The rest of
+the file consists of commands to set those characters where required. Because
+the mapping of source characters to those in the down-loaded fonts is
+arbitrary, the output file is unintelligible to human readers!
+
+Whilst many of the earlier changes tried to preserve the
+``machine-independence'' of the program, no attempt has been made in this
+version, since it is assumed that the LN03 printer will be used on a VAX
+computer. In particular, |random_reading| is used on some of the input files,
+and is necessary.
+
+The |banner| string defined here should be changed whenever \.{DVItoLN03}
+gets modified.
+
+@d banner=='This is DVItoLN03, Vax/VMS Version 4.0'
+
+@ This program is written mostly in standard \PASCAL, except where it is
+necessary to use extensions; for example, \.{DVItoLN03} must read files whose
+names are dynamically specified, and that would be impossible in pure \PASCAL.
+Many features of VAX-\PASCAL\ have been incorporated, and no attempt has been
+made to ensure that all places where such nonstandard constructions are used
+have been listed in the index under ``system dependencies.''
+@!@^system dependencies@>
+
+One of the extensions to standard \PASCAL\ that we shall deal with is the
+ability to move to a random place in a binary file; another is to
+determine the length of a binary file. Such extensions are not necessary
+for reading \.{DVI} files, and they are not important for efficiency
+reasons either. However, when creating the `font files' for
+downloading the necessary characters to the LN03, \.{DVItoLN03} \&{has} to be
+able to perform |random_reading|, to locate the glyph of each character within
+the pixel file. Therefore, if \.{DVItoLN03} is being used with
+\PASCAL s for which random file positioning is not efficiently available,
+and the following definition is changed from |true| to |false|, further work
+will still be required to re-code the processing of the pixel files.
+
+Another extension is to use a default |case| as in \.{TANGLE}, \.{WEAVE},
+etc.
+
+
+@d random_reading==true {should we skip around in the file?}
+@d othercases == otherwise {Vax/VMS default for cases not listed explicitly}
+@d endcases == @+end {follows the default case in an extended |case| statement}
+@f othercases == else
+@f endcases == end
+
+@ The binary input comes from |dvi_file|, and the \.{LN3} file is written to
+|ln3_file|. \.{DVItoLN03} also produces a `log' file using |type_file|.
+Errors and some informational messages are written to this, and are also
+written to \PASCAL's standard |output| file. The term |print| is used instead
+of |write| when this program writes on |type_file|, so that all such output
+could easily be redirected if desired.
+
+Under Vax/VMS we use double-precision for all real values. Furthermore, since
+extensive reference is made to Vax/VMS system services and other library
+routines, we arrange for the \PASCAL\ program to `inherit' all their
+definitions (from \.{STARLET}).
+
+@d print(#)==write(type_file,#)
+@d print_ln(#)==write_ln(type_file,#)
+@d real==double
+
+@p @=[INHERIT ('SYS$LIBRARY:STARLET')]@> program DVI_to_LN03(@!dvi_file,
+ @!tfm_file,@!type_file,@!output,@!ln3_file);
+label @<Labels in the outer block@>@/
+const @<Constants in the outer block@>@/
+type @<Types in the outer block@>@/
+var @<Globals in the outer block@>@/
+procedure jump_out; forward;@#
+@t\2@>@<Procedures for initialization@>@;@#
+procedure initialize; {this procedure gets things started properly}
+ var @!i:integer; {loop index for initializations}
+ begin
+ @<Preset initial values@>@/
+ print_ln(banner);@/
+ @<Set initial values@>@/
+ end;@#
+@<Additional low-level procedures@>@;
+
+@ If the program has to stop prematurely, it goes to the
+`|final_end|'. Another label, |done|, is used when stopping normally.
+
+@d final_end=9999 {label for the end of it all}
+@d done=30 {go here when finished with a subtask}
+
+@<Labels...@>=final_end,done;
+
+@ The following parameters can be changed at compile time to extend or
+reduce \.{DVItoLN03}'s capacity.
+
+As previously mentioned, the LN03-plus is quite happy to accept any number
+of downloaded fonts, but is incapable of imaging glyphs from more than
+fourteen of them! (The basic LN03 won't accept more than 21 half-fonts.)
+Each such font has to be selected by mapping it to one of 10 different
+Select Graphic Renditions; this is reflected by the constant |max_SGR|.
+
+Whenever bitmaps are sent to the printer (in sixel format), it is necessary
+to establish the ``printing'' position 29 pixels above the current
+reference point. Despite repeated enquiry of DEC, it has not been
+established why this is necessary. Naturally, we call this 29 pixels
+|bitmap_offset|. This same offset also has to be applied to sixel graphics
+included through a \.{\\special} command.
+
+When the paper orientation is selected, we may define the |page_len| and
+|page_wid| in terms of the physical limits of the paper; these sizes are
+as follows (for European A4 paper).
+@^European A4 paper@>
+(These might later become variables, and be alterable by qualifiers in the
+command line.) There is, however, a further complication. In either printing
+orientation, the printable area is of these dimensions; however, this printing
+area starts 0.25~inches from the top left corner of the paper \\{in the
+orientation it enters the printer}. Therefore in portrait mode, we can
+actually print from (75,75) to (2475,3475), with (300,300) being the
+``normal'' \TeX\ origin, but in landscape mode we can print (35,75) to
+(3435,2475), and \TeX's origin should still be at (300,300).
+
+The LN03 has a physical (apparently arbitrary) restriction on the maximum size
+of a downloadable glyph. For a glyph to be acceptable, it must satisfy the
+inequality $$
+ 2\times\lceil|num_cols|/2\rceil\times\lceil|num_rows|/8\rceil\le5700$$
+
+The type |file_spec| is used for declaring data objects containing VAX/RMS
+file specifications, and for declaring procedures which handle them.
+
+@d max_line=200 {Maximum length of any line output to the LN03}
+@d max_print=175 {Maximum number of characters imaged on line}
+@#
+@d max_lnfonts=13 {Limitations of the LN03's hardware}
+@d max_SGR=9
+@#
+@d max_special=300 {maximum size of a \.{\\special} command that we can deal
+with}
+@d max_points=256 {number of points for the \.{\\special} rule commands}
+@d max_strings=30 {Distinct string parameters of \.{\\special}s}
+@d pool_size=100 {Total characters in those strings}
+@#
+@d bitmap_offset=29
+@#
+@d paper_ht=3400 {in pixels}
+@d paper_wid=2400
+@d y_port_min=75
+@d y_land_min=35
+@d page_x_min=75
+@d y_top=75 {Minimum addressable $y$ pixel}
+@d y_bot=paper_ht+y_port_min {Maximum addressable $y$ pixel}
+@#
+@d PFS_landscape=='?23 J' {Extended A4 paper in landscape orientation}
+@d PFS_portrait=='?22 J' {ditto in portrait; each preceded by |csi|}
+@#
+@d lnf_bufsize=2000 {Maximum block size of an LN03 ``font file'' in memory ($\approx1$MB)}
+@#
+@d largest_glyph=5700
+@#
+@d max_fonts=100 {maximum number of distinct fonts per \.{DVI} file}
+@d max_glyphs=10000 {maximum number of different characters among all fonts}
+@#
+@d line_length=79 {bracketed lines of output will be at most this long}
+@d terminal_line_length=150 {maximum number of characters input in a single
+ line of input from the command line interpreter}
+@#
+@d stack_size=100 {\.{DVI} files shouldn't |push| beyond this depth}
+@d name_size=1000 {total length of all font file names}
+@#
+@d name_length=255 {a file name shouldn't be longer than this}
+@#
+@d max_rules=16384 {maximum number of rules per page}
+@d max_lap_rules=3 {maximum under/over lap of rules}
+@#
+@d vf_size=10000 {maximum |dvi| commands stored from virtual font files}
+@#
+@d max_blank_pages=100 {blank \\{verso} pages between successive \\{recto}s}
+
+@<Types...@>=
+@!file_spec = varying [name_length] of char;
+
+@ Here are some macros for common programming idioms.
+
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@d do_nothing == {empty statement}
+
+@ If the \.{DVI} file is badly malformed, the whole process must be aborted;
+\.{DVItoLN03} will give up, after issuing an error message about the symptoms
+that were noticed.
+
+Such errors might be discovered inside of subroutines inside of subroutines,
+so a procedure called |jump_out| has been introduced. This procedure, which
+simply transfers control to the label |final_end| at the end of the program,
+contains the only non-local |goto| statement in \.{DVItoLN03}.
+@^system dependencies@>
+
+@d crlf==chr(13)+chr(10)
+@d abort(#)==begin
+ history := fatal_error; print_ln(' ');
+ print_ln(' Fatal error: ',#);
+@!@.Fatal error ...@>
+ write_ln(output,crlf,'Fatal error: ',#,crlf);
+ jump_out;
+ end
+@d bad_dvi(#)==abort('Bad DVI file: ',#,'!')
+@!@.Bad DVI file@>
+@!@:fatal error Bad DVI file}{\quad\.{Bad DVI file} \\{(q.v.)}@>
+@d capacity_exceeded(#)==abort('capacity exceeded [',#,']')
+@!@.capacity exceeded@>
+@!@:fatal error capacity exceeded}{\quad\.{capacity exceeded} \\{(q.v.)}@>
+
+@p procedure jump_out;
+begin goto final_end;
+end;
+
+@* The character set.
+Like all programs written with the \.{WEB} system, \.{DVItoLN03} can be
+used with any character set. But it uses ASCII code internally, because
+the programming for portable input-output is easier when a fixed internal
+code is used, and because \.{DVI} files use ASCII code for file names
+and certain other strings.
+
+The next few sections of \.{DVItoLN03} have therefore been copied from the
+analogous ones in the \.{WEB} system routines. They have been considerably
+simplified, since \.{DVItoLN03} need not deal with the controversial
+ASCII codes less than @'40. If such codes appear in the \.{DVI} file,
+they will be printed as question marks.
+
+All characters still occupy 8 bits of storage, to avoid overhead with |packed
+array|s.
+
+@<Types...@>=
+@!ASCII_code= @=[byte]@> " ".."~"; {a subrange of the integers}
+
+@ The original \PASCAL\ compiler was designed in the late 60s, when six-bit
+character sets were common, so it did not make provision for lower case
+letters. Nowadays, of course, we need to deal with both upper and lower case
+alphabets in a convenient way, especially in a program like \.{DVItoLN03}.
+So we shall assume that the \PASCAL\ system being used for \.{DVItoLN03}
+has a character set containing at least the standard visible characters
+of ASCII code (|"!"| through |"~"|).
+
+Some \PASCAL\ compilers use the original name |char| for the data type
+associated with the characters in text files, while other \PASCAL s
+consider |char| to be a 64-element subrange of a larger data type that has
+some other name. In order to accommodate this difference, we shall use
+the name |text_char| to stand for the data type of the characters in the
+output file. We shall also assume that |text_char| consists of
+the elements |chr(first_text_char)| through |chr(last_text_char)|,
+inclusive. The following definitions should be adjusted if necessary.
+@^system dependencies@>
+
+@d text_char == char {the data type of characters in text files}
+@d first_text_char=0 {ordinal number of the smallest element of |text_char|}
+@d last_text_char=255 {ordinal number of the largest element of |text_char|}
+
+@<Types...@>=
+@!text_file=packed file of text_char;
+
+@ The \.{DVItoLN03} processor converts between ASCII code and
+the user's external character set by means of arrays |xord| and |xchr|
+that are analogous to \PASCAL's |ord| and |chr| functions.
+
+@<Globals...@>=
+@!xord: array [text_char] of ASCII_code;
+ {specifies conversion of input characters}
+@!xchr: array [first_text_char..last_text_char] of text_char;
+ {specifies conversion of output characters}
+
+@ Under our assumption that the visible characters of standard ASCII are
+all present, the following assignment statements initialize the
+|xchr| array properly, without needing any system-dependent changes.
+
+@<Set init...@>=
+for i:=0 to @'37 do xchr[i]:='?';
+xchr[@'40]:=' ';
+xchr[@'41]:='!';
+xchr[@'42]:='"';
+xchr[@'43]:='#';
+xchr[@'44]:='$';
+xchr[@'45]:='%';
+xchr[@'46]:='&';
+xchr[@'47]:='''';@/
+xchr[@'50]:='(';
+xchr[@'51]:=')';
+xchr[@'52]:='*';
+xchr[@'53]:='+';
+xchr[@'54]:=',';
+xchr[@'55]:='-';
+xchr[@'56]:='.';
+xchr[@'57]:='/';@/
+xchr[@'60]:='0';
+xchr[@'61]:='1';
+xchr[@'62]:='2';
+xchr[@'63]:='3';
+xchr[@'64]:='4';
+xchr[@'65]:='5';
+xchr[@'66]:='6';
+xchr[@'67]:='7';@/
+xchr[@'70]:='8';
+xchr[@'71]:='9';
+xchr[@'72]:=':';
+xchr[@'73]:=';';
+xchr[@'74]:='<';
+xchr[@'75]:='=';
+xchr[@'76]:='>';
+xchr[@'77]:='?';@/
+xchr[@'100]:='@@';
+xchr[@'101]:='A';
+xchr[@'102]:='B';
+xchr[@'103]:='C';
+xchr[@'104]:='D';
+xchr[@'105]:='E';
+xchr[@'106]:='F';
+xchr[@'107]:='G';@/
+xchr[@'110]:='H';
+xchr[@'111]:='I';
+xchr[@'112]:='J';
+xchr[@'113]:='K';
+xchr[@'114]:='L';
+xchr[@'115]:='M';
+xchr[@'116]:='N';
+xchr[@'117]:='O';@/
+xchr[@'120]:='P';
+xchr[@'121]:='Q';
+xchr[@'122]:='R';
+xchr[@'123]:='S';
+xchr[@'124]:='T';
+xchr[@'125]:='U';
+xchr[@'126]:='V';
+xchr[@'127]:='W';@/
+xchr[@'130]:='X';
+xchr[@'131]:='Y';
+xchr[@'132]:='Z';
+xchr[@'133]:='[';
+xchr[@'134]:='\';
+xchr[@'135]:=']';
+xchr[@'136]:='^';
+xchr[@'137]:='_';@/
+xchr[@'140]:='`';
+xchr[@'141]:='a';
+xchr[@'142]:='b';
+xchr[@'143]:='c';
+xchr[@'144]:='d';
+xchr[@'145]:='e';
+xchr[@'146]:='f';
+xchr[@'147]:='g';@/
+xchr[@'150]:='h';
+xchr[@'151]:='i';
+xchr[@'152]:='j';
+xchr[@'153]:='k';
+xchr[@'154]:='l';
+xchr[@'155]:='m';
+xchr[@'156]:='n';
+xchr[@'157]:='o';@/
+xchr[@'160]:='p';
+xchr[@'161]:='q';
+xchr[@'162]:='r';
+xchr[@'163]:='s';
+xchr[@'164]:='t';
+xchr[@'165]:='u';
+xchr[@'166]:='v';
+xchr[@'167]:='w';@/
+xchr[@'170]:='x';
+xchr[@'171]:='y';
+xchr[@'172]:='z';
+xchr[@'173]:='{';
+xchr[@'174]:='|';
+xchr[@'175]:='}';
+xchr[@'176]:='~';
+for i:=@'177 to 255 do xchr[i]:='?';
+
+@ The following system-independent code makes the |xord| array contain a
+suitable inverse to the information in |xchr|.
+
+@<Set init...@>=
+for i:=first_text_char to last_text_char do xord[chr(i)]:=@'40;
+for i:=" " to "~" do xord[xchr[i]]:=i;
+
+@* Device-independent file format.
+Before we get into the details of \.{DVItoLN03}, we need to know exactly
+what \.{DVI} files are. The form of such files was designed by David R.
+@^Fuchs, David Raymond@>
+Fuchs in 1979. Almost any reasonable typesetting device can be driven by
+a program that takes \.{DVI} files as input, and dozens of such
+\.{DVI}-to-whatever programs have been written. Thus, it is possible to
+print the output of document compilers like \TeX\ on many different kinds
+of equipment.
+
+A \.{DVI} file is a stream of 8-bit bytes, which may be regarded as a
+series of commands in a machine-like language. The first byte of each command
+is the operation code, and this code is followed by zero or more bytes
+that provide parameters to the command. The parameters themselves may consist
+of several consecutive bytes; for example, the `|set_rule|' command has two
+parameters, each of which is four bytes long. Parameters are usually
+regarded as nonnegative integers; but four-byte-long parameters,
+and shorter parameters that denote distances, can be
+either positive or negative. Such parameters are given in two's complement
+notation. For example, a two-byte-long distance parameter has a value between
+$-2^{15}$ and $2^{15}-1$.
+@.DVI {\rm files}@>
+
+A \.{DVI} file consists of a ``preamble,'' followed by a sequence of one
+or more ``pages,'' followed by a ``postamble.'' The preamble is simply a
+|pre| command, with its parameters that define the dimensions used in the
+file; this must come first. Each ``page'' consists of a |bop| command,
+followed by any number of other commands that tell where characters are to
+be placed on a physical page, followed by an |eop| command. The pages
+appear in the order that they were generated, not in any particular
+numerical order. If we ignore |nop| commands and \\{fnt\_def} commands
+(which are allowed between any two commands in the file), each |eop|
+command is immediately followed by a |bop| command, or by a |post|
+command; in the latter case, there are no more pages in the file, and the
+remaining bytes form the postamble. Further details about the postamble
+will be explained later.
+
+Some parameters in \.{DVI} commands are ``pointers.'' These are four-byte
+quantities that give the location number of some other byte in the file;
+the first byte is number~0, then comes number~1, and so on. For example,
+one of the parameters of a |bop| command points to the previous |bop|;
+this makes it feasible to read the pages in backwards order, in case the
+results are being directed to a device that stacks its output face up.
+Suppose the preamble of a \.{DVI} file occupies bytes 0 to 99. Now if the
+first page occupies bytes 100 to 999, say, and if the second
+page occupies bytes 1000 to 1999, then the |bop| that starts in byte 1000
+points to 100 and the |bop| that starts in byte 2000 points to 1000. (The
+very first |bop|, i.e., the one that starts in byte 100, has a pointer of $-1$.)
+
+@<Glob...@>=
+@!dvi_file:byte_file; {the stuff we are \.{DVItoLN03}ing}
+
+@ The \.{DVI} format is intended to be both compact and easily interpreted
+by a machine. Compactness is achieved by making most of the information
+implicit instead of explicit. When a \.{DVI}-reading program reads the
+commands for a page, it keeps track of several quantities: (a)~The current
+font |f| is an integer; this value is changed only
+by \\{fnt} and \\{fnt\_num} commands. (b)~The current position on the page
+is given by two numbers called the horizontal and vertical coordinates,
+|h| and |v|. Both coordinates are zero at the upper left corner of the page;
+moving to the right corresponds to increasing the horizontal coordinate, and
+moving down corresponds to increasing the vertical coordinate. Thus, the
+coordinates are essentially Cartesian, except that vertical directions are
+flipped; the Cartesian version of |(h,v)| would be |(h,-v)|. (c)~The
+current spacing amounts are given by four numbers |w|, |x|, |y|, and |z|,
+where |w| and~|x| are used for horizontal spacing and where |y| and~|z|
+are used for vertical spacing. (d)~There is a stack containing
+|(h,v,w,x,y,z)| values; the \.{DVI} commands |push| and |pop| are used to
+change the current level of operation. Note that the current font~|f| is
+not pushed and popped; the stack contains only information about
+positioning.
+
+The values of |h|, |v|, |w|, |x|, |y|, and |z| are signed integers having up
+to 32 bits, including the sign. Since they represent physical distances,
+there is a small unit of measurement such that increasing |h| by~1 means
+moving a certain tiny distance to the right. The actual unit of
+measurement is variable, as explained below.
+
+@ Here is a list of all the commands that may appear in a \.{DVI} file. Each
+command is specified by its symbolic name (e.g., |bop|), its opcode byte
+(e.g., 139), and its parameters (if any). The parameters are followed
+by a bracketed number telling how many bytes they occupy; for example,
+`|p[4]|' means that parameter |p| is four bytes long.
+
+\yskip\hang|set_char_0| 0. Typeset character number~0 from font~|f|
+such that the reference point of the character is at |(h,v)|. Then
+increase |h| by the width of that character. Note that a character may
+have zero or negative width, so one cannot be sure that |h| will advance
+after this command; but |h| usually does increase.
+
+\yskip\hang|set_char_1| through |set_char_127| (opcodes 1 to 127).
+Do the operations of |set_char_0|; but use the character whose number
+matches the opcode, instead of character~0.
+
+\yskip\hang|set1| 128 |c[1]|. Same as |set_char_0|, except that character
+number~|c| is typeset. \TeX82 uses this command for characters in the
+range |128<=c<256|.
+
+\yskip\hang|set2| 129 |c[2]|. Same as |set1|, except that |c|~is two
+bytes long, so it is in the range |0<=c<65536|. \TeX82 never uses this
+command, which is intended for processors that deal with oriental languages;
+but \.{DVItoLN03} will allow character codes greater than 255, assuming that
+they all have the same width as the character whose code is $c \bmod 256$.
+@^oriental characters@>@^Chinese characters@>@^Japanese characters@>
+
+\yskip\hang|set3| 130 |c[3]|. Same as |set1|, except that |c|~is three
+bytes long, so it can be as large as $2^{24}-1$.
+
+\yskip\hang|set4| 131 |c[4]|. Same as |set1|, except that |c|~is four
+bytes long, possibly even negative. Imagine that.
+
+\yskip\hang|set_rule| 132 |a[4]| |b[4]|. Typeset a solid black rectangle
+of height |a| and width |b|, with its bottom left corner at |(h,v)|. Then
+set |h:=h+b|. If either |a<=0| or |b<=0|, nothing should be typeset. Note
+that if |b<0|, the value of |h| will decrease even though nothing else happens.
+Programs that typeset from \.{DVI} files should be careful to make the rules
+line up carefully with digitized characters, as explained in connection with
+the |rule_pixels| subroutine below.
+
+\yskip\hang|put1| 133 |c[1]|. Typeset character number~|c| from font~|f|
+such that the reference point of the character is at |(h,v)|. (The `put'
+commands are exactly like the `set' commands, except that they simply put out a
+character or a rule without moving the reference point afterwards.)
+
+\yskip\hang|put2| 134 |c[2]|. Same as |set2|, except that |h| is not changed.
+
+\yskip\hang|put3| 135 |c[3]|. Same as |set3|, except that |h| is not changed.
+
+\yskip\hang|put4| 136 |c[4]|. Same as |set4|, except that |h| is not changed.
+
+\yskip\hang|put_rule| 137 |a[4]| |b[4]|. Same as |set_rule|, except that
+|h| is not changed.
+
+\yskip\hang|nop| 138. No operation, do nothing. Any number of |nop|'s
+may occur between \.{DVI} commands, but a |nop| cannot be inserted between
+a command and its parameters or between two parameters.
+
+\yskip\hang|bop| 139 $c_0[4]$ $c_1[4]$ $\ldots$ $c_9[4]$ $p[4]$. Beginning
+of a page: Set |(h,v,w,x,y,z):=(0,0,0,0,0,0)| and set the stack empty. Set
+the current font |f| to an undefined value. The ten $c_i$ parameters can
+be used to identify pages, if a user wants to print only part of a \.{DVI}
+file; \TeX82 gives them the values of \.{\\count0} $\ldots$ \.{\\count9}
+at the time \.{\\shipout} was invoked for this page. The parameter |p|
+points to the previous |bop| command in the file, where the first |bop|
+has $p=-1$.
+
+\yskip\hang|eop| 140. End of page: Print what you have read since the
+previous |bop|. At this point the stack should be empty. (The \.{DVI}-reading
+programs that drive most output devices will have kept a buffer of the
+material that appears on the page that has just ended. This material is
+largely, but not entirely, in order by |v| coordinate and (for fixed |v|) by
+|h|~coordinate; so it usually needs to be sorted into some order that is
+appropriate for the device in question. \.{DVItoLN03} does do such sorting.)
+
+\yskip\hang|push| 141. Push the current values of |(h,v,w,x,y,z)| onto the
+top of the stack; do not change any of these values. Note that |f| is
+not pushed.
+
+\yskip\hang|pop| 142. Pop the top six values off of the stack and assign
+them to |(h,v,w,x,y,z)|. The number of pops should never exceed the number
+of pushes, since it would be highly embarrassing if the stack were empty
+at the time of a |pop| command.
+
+\yskip\hang|right1| 143 |b[1]|. Set |h:=h+b|, i.e., move right |b| units.
+The parameter is a signed number in two's complement notation, |-128<=b<128|;
+if |b<0|, the reference point actually moves left.
+
+\yskip\hang|right2| 144 |b[2]|. Same as |right1|, except that |b| is a
+two-byte quantity in the range |-32768<=b<32768|.
+
+\yskip\hang|right3| 145 |b[3]|. Same as |right1|, except that |b| is a
+three-byte quantity in the range |@t$-2^{23}$@><=b<@t$2^{23}$@>|.
+
+\yskip\hang|right4| 146 |b[4]|. Same as |right1|, except that |b| is a
+four-byte quantity in the range |@t$-2^{31}$@><=b<@t$2^{31}$@>|.
+
+\yskip\hang|w0| 147. Set |h:=h+w|; i.e., move right |w| units. With luck,
+this parameterless command will usually suffice, because the same kind of motion
+will occur several times in succession; the following commands explain how
+|w| gets particular values.
+
+\yskip\hang|w1| 148 |b[1]|. Set |w:=b| and |h:=h+b|. The value of |b| is a
+signed quantity in two's complement notation, |-128<=b<128|. This command
+changes the current |w|~spacing and moves right by |b|.
+
+\yskip\hang|w2| 149 |b[2]|. Same as |w1|, but |b| is a two-byte-long
+parameter, |-32768<=b<32768|.
+
+\yskip\hang|w3| 150 |b[3]|. Same as |w1|, but |b| is a three-byte-long
+parameter, |@t$-2^{23}$@><=b<@t$2^{23}$@>|.
+
+\yskip\hang|w4| 151 |b[4]|. Same as |w1|, but |b| is a four-byte-long
+parameter, |@t$-2^{31}$@><=b<@t$2^{31}$@>|.
+
+\yskip\hang|x0| 152. Set |h:=h+x|; i.e., move right |x| units. The `|x|'
+commands are like the `|w|' commands except that they involve |x| instead
+of |w|.
+
+\yskip\hang|x1| 153 |b[1]|. Set |x:=b| and |h:=h+b|. The value of |b| is a
+signed quantity in two's complement notation, |-128<=b<128|. This command
+changes the current |x|~spacing and moves right by |b|.
+
+\yskip\hang|x2| 154 |b[2]|. Same as |x1|, but |b| is a two-byte-long
+parameter, |-32768<=b<32768|.
+
+\yskip\hang|x3| 155 |b[3]|. Same as |x1|, but |b| is a three-byte-long
+parameter, |@t$-2^{23}$@><=b<@t$2^{23}$@>|.
+
+\yskip\hang|x4| 156 |b[4]|. Same as |x1|, but |b| is a four-byte-long
+parameter, |@t$-2^{31}$@><=b<@t$2^{31}$@>|.
+
+\yskip\hang|down1| 157 |a[1]|. Set |v:=v+a|, i.e., move down |a| units.
+The parameter is a signed number in two's complement notation, |-128<=a<128|;
+if |a<0|, the reference point actually moves up.
+
+\yskip\hang|down2| 158 |a[2]|. Same as |down1|, except that |a| is a
+two-byte quantity in the range |-32768<=a<32768|.
+
+\yskip\hang|down3| 159 |a[3]|. Same as |down1|, except that |a| is a
+three-byte quantity in the range |@t$-2^{23}$@><=a<@t$2^{23}$@>|.
+
+\yskip\hang|down4| 160 |a[4]|. Same as |down1|, except that |a| is a
+four-byte quantity in the range |@t$-2^{31}$@><=a<@t$2^{31}$@>|.
+
+\yskip\hang|y0| 161. Set |v:=v+y|; i.e., move down |y| units. With luck,
+this parameterless command will usually suffice, because the same kind of motion
+will occur several times in succession; the following commands explain how
+|y| gets particular values.
+
+\yskip\hang|y1| 162 |a[1]|. Set |y:=a| and |v:=v+a|. The value of |a| is a
+signed quantity in two's complement notation, |-128<=a<128|. This command
+changes the current |y|~spacing and moves down by |a|.
+
+\yskip\hang|y2| 163 |a[2]|. Same as |y1|, but |a| is a two-byte-long
+parameter, |-32768<=a<32768|.
+
+\yskip\hang|y3| 164 |a[3]|. Same as |y1|, but |a| is a three-byte-long
+parameter, |@t$-2^{23}$@><=a<@t$2^{23}$@>|.
+
+\yskip\hang|y4| 165 |a[4]|. Same as |y1|, but |a| is a four-byte-long
+parameter, |@t$-2^{31}$@><=a<@t$2^{31}$@>|.
+
+\yskip\hang|z0| 166. Set |v:=v+z|; i.e., move down |z| units. The `|z|' commands
+are like the `|y|' commands except that they involve |z| instead of |y|.
+
+\yskip\hang|z1| 167 |a[1]|. Set |z:=a| and |v:=v+a|. The value of |a| is a
+signed quantity in two's complement notation, |-128<=a<128|. This command
+changes the current |z|~spacing and moves down by |a|.
+
+\yskip\hang|z2| 168 |a[2]|. Same as |z1|, but |a| is a two-byte-long
+parameter, |-32768<=a<32768|.
+
+\yskip\hang|z3| 169 |a[3]|. Same as |z1|, but |a| is a three-byte-long
+parameter, |@t$-2^{23}$@><=a<@t$2^{23}$@>|.
+
+\yskip\hang|z4| 170 |a[4]|. Same as |z1|, but |a| is a four-byte-long
+parameter, |@t$-2^{31}$@><=a<@t$2^{31}$@>|.
+
+\yskip\hang|fnt_num_0| 171. Set |f:=0|. Font 0 must previously have been
+defined by a \\{fnt\_def} instruction, as explained below.
+
+\yskip\hang|fnt_num_1| through |fnt_num_63| (opcodes 172 to 234). Set
+|f:=1|, \dots, |f:=63|, respectively.
+
+\yskip\hang|fnt1| 235 |k[1]|. Set |f:=k|. \TeX82 uses this command for font
+numbers in the range |64<=k<256|.
+
+\yskip\hang|fnt2| 236 |k[2]|. Same as |fnt1|, except that |k|~is two
+bytes long, so it is in the range |0<=k<65536|. \TeX82 never generates this
+command, but large font numbers may prove useful for specifications of
+color or texture, or they may be used for special fonts that have fixed
+numbers in some external coding scheme.
+
+\yskip\hang|fnt3| 237 |k[3]|. Same as |fnt1|, except that |k|~is three
+bytes long, so it can be as large as $2^{24}-1$.
+
+\yskip\hang|fnt4| 238 |k[4]|. Same as |fnt1|, except that |k|~is four
+bytes long; this is for the really big font numbers (and for the negative ones).
+
+\yskip\hang|xxx1| 239 |k[1]| |x[k]|. This command is undefined in
+general; it functions as a $(k+2)$-byte |nop| unless special \.{DVI}-reading
+programs are being used. \TeX82 generates |xxx1| when a short enough
+\.{\\special} appears, setting |k| to the number of bytes being sent. It
+is recommended that |x| be a string having the form of a keyword followed
+by possible parameters relevant to that keyword.
+
+\yskip\hang|xxx2| 240 |k[2]| |x[k]|. Like |xxx1|, but |0<=k<65536|.
+
+\yskip\hang|xxx3| 241 |k[3]| |x[k]|. Like |xxx1|, but |0<=k<@t$2^{24}$@>|.
+
+\yskip\hang|xxx4| 242 |k[4]| |x[k]|. Like |xxx1|, but |k| can be ridiculously
+large. \TeX82 uses |xxx4| when |xxx1| would be incorrect.
+
+\yskip\hang|fnt_def1| 243 |k[1]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<256|; font definitions will be explained shortly.
+
+\yskip\hang|fnt_def2| 244 |k[2]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<65536|.
+
+\yskip\hang|fnt_def3| 245 |k[3]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<@t$2^{24}$@>|.
+
+\yskip\hang|fnt_def4| 246 |k[4]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |@t$-2^{31}$@><=k<@t$2^{31}$@>|.
+
+\yskip\hang|pre| 247 |i[1]| |num[4]| |den[4]| |mag[4]| |k[1]| |x[k]|.
+Beginning of the preamble; this must come at the very beginning of the
+file. Parameters |i|, |num|, |den|, |mag|, |k|, and |x| are explained below.
+
+\yskip\hang|post| 248. Beginning of the postamble, see below.
+
+\yskip\hang|post_post| 249. Ending of the postamble, see below.
+
+\yskip\noindent Commands 250--255 are undefined at the present time.
+
+@ @d set_char_0=0 {typeset character 0 and move right}
+@d set1=128 {typeset a character and move right}
+@d set_rule=132 {typeset a rule and move right}
+@d put1=133 {typeset a character}
+@d put_rule=137 {typeset a rule}
+@d nop=138 {no operation}
+@d bop=139 {beginning of page}
+@d eop=140 {ending of page}
+@d push=141 {save the current positions}
+@d pop=142 {restore previous positions}
+@d right1=143 {move right}
+@d w0=147 {move right by |w|}
+@d w1=148 {move right and set |w|}
+@d x0=152 {move right by |x|}
+@d x1=153 {move right and set |x|}
+@d down1=157 {move down}
+@d y0=161 {move down by |y|}
+@d y1=162 {move down and set |y|}
+@d z0=166 {move down by |z|}
+@d z1=167 {move down and set |z|}
+@d fnt_num_0=171 {set current font to 0}
+@d fnt1=235 {set current font}
+@d xxx1=239 {extension to \.{DVI} primitives}
+@d xxx4=242 {potentially long extension to \.{DVI} primitives}
+@d fnt_def1=243 {define the meaning of a font number}
+@d pre=247 {preamble}
+@d post=248 {postamble beginning}
+@d post_post=249 {postamble ending}
+@d undefined_commands==250,251,252,253,254,255
+
+@ The preamble contains basic information about the file as a whole. As
+stated above, there are six parameters:
+$$\hbox{|@!i[1]| |@!num[4]| |@!den[4]| |@!mag[4]| |@!k[1]| |@!x[k]|.}$$
+The |i| byte identifies \.{DVI} format; currently this byte is always set
+to~2. (Some day we will set |i=3|, when \.{DVI} format makes another
+incompatible change---perhaps in 1992.)
+
+The next two parameters, |num| and |den|, are positive integers that define
+the units of measurement; they are the numerator and denominator of a
+fraction by which all dimensions in the \.{DVI} file could be multiplied
+in order to get lengths in units of $10^{-7}$ meters. (For example, there are
+exactly 7227 \TeX\ points in 254 centimeters, and \TeX82 works with scaled
+points where there are $2^{16}$ sp in a point, so \TeX82 sets |num=25400000|
+and $|den|=7227\cdot2^{16}=473628672$.)
+@^sp@>
+
+The |mag| parameter is what \TeX82 calls \.{\\mag}, i.e., 1000 times the
+desired magnification. The actual fraction by which dimensions are
+multiplied is therefore $mn/1000d$. Note that if a \TeX\ source document
+does not call for any `\.{true}' dimensions, and if you change it only by
+specifying a different \.{\\mag} setting, the \.{DVI} file that \TeX\
+creates will be completely unchanged except for the value of |mag| in the
+preamble and postamble. (Fancy \.{DVI}-reading programs allow users to
+override the |mag|~setting when a \.{DVI} file is being printed; this facility
+has not been implemented in \.{DVItoLN03}.)
+
+Finally, |k| and |x| allow the \.{DVI} writer to include a comment, which is not
+interpreted further. The length of comment |x| is |k|, where |0<=k<256|.
+
+@d id_byte=2 {identifies the kind of \.{DVI} files described here}
+
+@ Font definitions for a given font number |k| contain further parameters
+$$\hbox{|c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.}$$
+The four-byte value |c| is the check sum that \TeX\ (or whatever program
+generated the \.{DVI} file) found in the \.{TFM} file for this font;
+|c| should match the check sum of the font found by programs that read
+this \.{DVI} file.
+@^check sum@>
+
+Parameter |s| contains a fixed-point scale factor that is applied to the
+character widths in font |k|; font dimensions in \.{TFM} files and other
+font files are relative to this quantity, which is always positive and
+less than $2^{27}$. It is given in the same units as the other dimensions
+of the \.{DVI} file. Parameter |d| is similar to |s|; it is the ``design
+size,'' and it is given in \.{DVI} units that have not been corrected for
+the magnification~|mag| found in the preamble. Thus, font |k| is to be
+used at $|mag|\cdot s/1000d$ times its normal size.
+
+The remaining part of a font definition gives the external name of the font,
+which is an ASCII string of length |a+l|. The number |a| is the length
+of the ``area'' or directory, and |l| is the length of the font name itself;
+the standard local system font area is supposed to be used when |a=0|.
+The |n| field contains the area in its first |a| bytes.
+
+Font definitions must appear before the first use of a particular font number.
+Once font |k| is defined, it must not be defined again; however, we
+shall see below that font definitions appear in the postamble as well as
+in the pages, so in this sense each font number is defined exactly twice,
+if at all. Like |nop| commands and \\{xxx} commands, font definitions can
+appear before the first |bop|, or between an |eop| and a |bop|.
+
+@ The last page in a \.{DVI} file is followed by `|post|'; this command
+introduces the postamble, which summarizes important facts that \TeX\ has
+accumulated about the file, making it possible to print subsets of the data
+with reasonable efficiency. The postamble has the form
+$$\vbox{\halign{\hbox{#\hfil}\cr
+ |post| |p[4]| |num[4]| |den[4]| |mag[4]| |l[4]| |u[4]| |s[2]| |t[2]|\cr
+ $\langle\,$font definitions$\,\rangle$\cr
+ |post_post| |q[4]| |i[1]| 223's$[{\G}4]$\cr}}$$
+Here |p| is a pointer to the final |bop| in the file. The next three
+parameters, |num|, |den|, and |mag|, are duplicates of the quantities that
+appeared in the preamble.
+
+Parameters |l| and |u| give respectively the height-plus-depth of the tallest
+page and the width of the widest page, in the same units as other dimensions
+of the file. These numbers might be used by a \.{DVI}-reading program to
+position individual ``pages'' on large sheets of film or paper; however,
+the standard convention for output on normal size paper is to position each
+page so that the upper left-hand corner is exactly one inch from the left
+and the top. Experience has shown that it is unwise to design \.{DVI}-to-printer
+software that attempts cleverly to center the output; a fixed position of
+the upper left corner is easiest for users to understand and to work with.
+Therefore |l| and~|u| are often ignored.
+
+Parameter |s| is the maximum stack depth (i.e., the largest excess of
+|push| commands over |pop| commands) needed to process this file. Then
+comes |t|, the total number of pages (|bop| commands) present.
+
+The postamble continues with font definitions, which are any number of
+\\{fnt\_def} commands as described above, possibly interspersed with |nop|
+commands. Each font number that is used in the \.{DVI} file must be defined
+exactly twice: Once before it is first selected by a \\{fnt} command, and once
+in the postamble.
+
+@ The last part of the postamble, following the |post_post| byte that
+signifies the end of the font definitions, contains |q|, a pointer to the
+|post| command that started the postamble. An identification byte, |i|,
+comes next; this currently equals~2, as in the preamble.
+
+The |i| byte is followed by four or more bytes that are all equal to
+the decimal number 223 (i.e., @'337 in octal). \TeX\ puts out four to seven of
+these trailing bytes, until the total length of the file is a multiple of
+four bytes, since this works out best on machines that pack four bytes per
+word; but any number of 223's is allowed, as long as there are at least four
+of them. In effect, 223 is a sort of signature that is added at the very end.
+@^Fuchs, David Raymond@>
+
+This curious way to finish off a \.{DVI} file makes it feasible for
+\.{DVI}-reading programs to find the postamble first, on most computers,
+even though \TeX\ wants to write the postamble last. Most operating
+systems permit random access to individual words or bytes of a file, so
+the \.{DVI} reader can start at the end and skip backwards over the 223's
+until finding the identification byte. Then it can back up four bytes, read
+|q|, and move to byte |q| of the file. This byte should, of course,
+contain the value 248 (|post|); now the postamble can be read, so the
+\.{DVI} reader discovers all the information needed for typesetting the
+pages. Note that it is also possible to skip through the \.{DVI} file at
+reasonably high speed to locate a particular page, if that proves
+desirable. This saves a lot of time, since \.{DVI} files used in production
+jobs tend to be large.
+
+Unfortunately, however, standard \PASCAL\ does not include the ability to
+@^system dependencies@>
+access a random position in a file, or even to determine the length of a file.
+Almost all systems nowadays provide the necessary capabilities, so \.{DVI}
+format has been designed to work most efficiently with modern operating systems.
+As noted above, \.{DVItoLN03} would need to be modified to limit itself to the
+restrictions of standard \PASCAL\ if |random_reading| is defined to be |false|.
+
+@* Font metric data.
+The idea behind \.{TFM} files is that typesetting routines like \TeX\
+need a compact way to store the relevant information about several
+dozen fonts, and computer centers need a compact way to store the
+relevant information about several hundred fonts. \.{TFM} files are
+compact, and most of the information they contain is highly relevant,
+so they provide a solution to the problem.
+
+The information in a \.{TFM} file appears in a sequence of 8-bit bytes.
+Since the number of bytes is always a multiple of 4, we could
+also regard the file as a sequence of 32-bit words; but \TeX\ uses the
+byte interpretation. Note that the bytes are considered to be unsigned
+numbers.
+
+@<Glob...@>=
+@!tfm_file:byte_file; {a font metric file}
+
+@ The first 24 bytes (6 words) of a \.{TFM} file contain twelve 16-bit
+integers that give the lengths of the various subsequent portions
+of the file. These twelve integers are, in order:
+$$\vbox{\halign{\hfil#&$\null=\null$#\hfil\cr
+|@!lf|&length of the entire file, in words;\cr
+|@!lh|&length of the header data, in words;\cr
+|@!bc|&smallest character code in the font;\cr
+|@!ec|&largest character code in the font;\cr
+|@!nw|&number of words in the width table;\cr
+|@!nh|&number of words in the height table;\cr
+|@!nd|&number of words in the depth table;\cr
+|@!ni|&number of words in the italic correction table;\cr
+|@!nl|&number of words in the lig/kern table;\cr
+|@!nk|&number of words in the kern table;\cr
+|@!ne|&number of words in the extensible character table;\cr
+|@!np|&number of font parameter words.\cr}}$$
+They are all nonnegative and less than $2^{15}$. We must have |bc-1<=ec<=255|,
+|ne<=256|, and
+$$\hbox{|lf=6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ne+np|.}$$
+Note that a font may contain as many as 256 characters (if |bc=0| and |ec=255|),
+and as few as 0 characters (if |bc=ec+1|).
+
+Incidentally, when two or more 8-bit bytes are combined to form an integer of
+16 or more bits, the most significant bytes appear first in the file.
+This is called BigEndian order.
+
+@ The rest of the \.{TFM} file may be regarded as a sequence of ten data
+arrays having the informal specification
+$$\def\arr$[#1]#2${\&{array} $[#1]$ \&{of} #2}
+\vbox{\halign{\hfil\\{#}&$\,:\,$\arr#\hfil\cr
+header&|[0..lh-1]stuff|\cr
+char\_info&|[bc..ec]char_info_word|\cr
+width&|[0..nw-1]fix_word|\cr
+height&|[0..nh-1]fix_word|\cr
+depth&|[0..nd-1]fix_word|\cr
+italic&|[0..ni-1]fix_word|\cr
+lig\_kern&|[0..nl-1]lig_kern_command|\cr
+kern&|[0..nk-1]fix_word|\cr
+exten&|[0..ne-1]extensible_recipe|\cr
+param&|[1..np]fix_word|\cr}}$$
+The most important data type used here is a |@!fix_word|, which is
+a 32-bit representation of a binary fraction. A |fix_word| is a signed
+quantity, with the two's complement of the entire word used to represent
+negation. Of the 32 bits in a |fix_word|, exactly 12 are to the left of the
+binary point; thus, the largest |fix_word| value is $2048-2^{-20}$, and
+the smallest is $-2048$. We will see below, however, that all but one of
+the |fix_word| values will lie between $-16$ and $+16$.
+
+@ The first data array is a block of header information, which contains
+general facts about the font. The header must contain at least two words,
+and for \.{TFM} files to be used with Xerox printing software it must
+contain at least 18 words, allocated as described below. When different
+kinds of devices need to be interfaced, it may be necessary to add further
+words to the header block.
+
+\yskip\hang|header[0]| is a 32-bit check sum that \TeX\ will copy into the
+\.{DVI} output file whenever it uses the font. Later on when the \.{DVI}
+file is printed, possibly on another computer, the actual font that gets
+used is supposed to have a check sum that agrees with the one in the
+\.{TFM} file used by \TeX. In this way, users will be warned about
+potential incompatibilities. (However, if the check sum is zero in either
+the font file or the \.{TFM} file, no check is made.) The actual relation
+between this check sum and the rest of the \.{TFM} file is not important;
+the check sum is simply an identification number with the property that
+incompatible fonts almost always have distinct check sums.
+@^check sum@>
+
+\yskip\hang|header[1]| is a |fix_word| containing the design size of the
+font, in units of \TeX\ points (7227 \TeX\ points = 254 cm). This number
+must be at least 1.0; it is fairly arbitrary, but usually the design size
+is 10.0 for a ``10 point'' font, i.e., a font that was designed to look
+best at a 10-point size, whatever that really means. When a \TeX\ user
+asks for a font `\.{at} $\delta$ \.{pt}', the effect is to override the
+design size and replace it by $\delta$, and to multiply the $x$ and~$y$
+coordinates of the points in the font image by a factor of $\delta$
+divided by the design size. {\sl All other dimensions in the\/\ \.{TFM}
+file are |fix_word|\kern-1pt\ numbers in design-size units.} Thus, for example,
+the value of |param[6]|, one \.{em} or \.{\\quad}, is often the |fix_word|
+value $2^{20}=1.0$, since many fonts have a design size equal to one em.
+The other dimensions must be less than 16 design-size units in absolute
+value; thus, |header[1]| and |param[1]| are the only |fix_word| entries in
+the whole \.{TFM} file whose first byte might be something besides 0 or
+255. @^design size@>
+
+\yskip\hang|header[2..11]|, if present, contains 40 bytes that identify
+the character coding scheme. The first byte, which must be between 0 and
+39, is the number of subsequent ASCII bytes actually relevant in this
+string, which is intended to specify what character-code-to-symbol
+convention is present in the font. Examples are \.{ASCII} for standard
+ASCII, \.{TeX text} for fonts like \.{cmr10} and \.{cmti9}, \.{TeX math
+extension} for \.{cmex10}, \.{XEROX text} for Xerox fonts, \.{GRAPHIC} for
+special-purpose non-alphabetic fonts, \.{UNSPECIFIED} for the default case
+when there is no information. Parentheses should not appear in this name.
+(Such a string is said to be in {\mc BCPL} format.)
+@^coding scheme@>
+
+\yskip\hang|header[12..16]|, if present, contains 20 bytes that name the
+font family (e.g., \.{CMR} or \.{HELVETICA}), in {\mc BCPL} format.
+This field is also known as the ``font identifier.''
+@^family name@>
+@^font identifier@>
+
+\yskip\hang|header[17]|, if present, contains a first byte called the
+|seven_bit_safe_flag|, then two bytes that are ignored, and a fourth byte
+called the |face|. If the value of the fourth byte is less than 18, it has
+the following interpretation as a ``weight, slope, and expansion'': Add 0
+or 2 or 4 (for medium or bold or light) to 0 or 1 (for roman or italic) to
+0 or 6 or 12 (for regular or condensed or extended). For example, 13 is
+0+1+12, so it represents medium italic extended. A three-letter code
+(e.g., \.{MIE}) can be used for such |face| data.
+
+\yskip\hang|header[18..@twhatever@>]| might also be present; the individual
+words are simply called |header[18]|, |header[19]|, etc., at the moment.
+
+@ Next comes the |char_info| array, which contains one |char_info_word|
+per character. Each |char_info_word| contains six fields packed into
+four bytes as follows.
+
+\yskip\hang first byte: |width_index| (8 bits)\par
+\hang second byte: |height_index| (4 bits) times 16, plus |depth_index|
+ (4~bits)\par
+\hang third byte: |italic_index| (6 bits) times 4, plus |tag|
+ (2~bits)\par
+\hang fourth byte: |remainder| (8 bits)\par
+\yskip\noindent
+The actual width of a character is |width[width_index]|, in design-size
+units; this is a device for compressing information, since many characters
+have the same width. Since it is quite common for many characters
+to have the same height, depth, or italic correction, the \.{TFM} format
+imposes a limit of 16 different heights, 16 different depths, and
+64 different italic corrections.
+
+Incidentally, the relation |width[0]=height[0]=depth[0]=italic[0]=0|
+should always hold, so that an index of zero implies a value of zero.
+The |width_index| should never be zero unless the character does
+not exist in the font, since a character is valid if and only if it lies
+between |bc| and |ec| and has a nonzero |width_index|.
+
+@ The remaining details of the format of \.{TFM} files need not concern us
+further; the interested reader is referred to Knuth's standard \.{TFtoPL}
+@^Knuth, D.~E.@>
+@.TFtoPL@>
+program for the whole picture.
+
+@* Input from binary files.
+We have seen that a \.{DVI} file is a sequence of 8-bit bytes. The bytes
+appear physically in what is called a `|packed file of 0..255|'
+in \PASCAL\ lingo.
+
+Packing is system dependent, and many \PASCAL\ systems fail to implement
+such files in a sensible way (at least, from the viewpoint of producing
+good production software). For example, some systems treat all
+byte-oriented files as text, looking for end-of-line marks and such
+things. Therefore some system-dependent code is often needed to deal with
+binary files, even though most of the program in this section of
+\.{DVItoLN03} is written in standard \PASCAL.
+@^system dependencies@>
+
+One common way to solve the problem is to consider files of |integer|
+numbers, and to convert an integer in the range $-2^{31}\L x<2^{31}$ to
+a sequence of four bytes $(a,b,c,d)$ using the following code, which
+avoids the controversial integer division of negative numbers:
+$$\vbox{\halign{#\hfil\cr
+|if x>=0 then a:=x div @'100000000|\cr
+|else begin x:=(x+@'10000000000)+@'10000000000; a:=x div @'100000000+128;|\cr
+\quad|end|\cr
+|x:=x mod @'100000000;|\cr
+|b:=x div @'200000; x:=x mod @'200000;|\cr
+|c:=x div @'400; d:=x mod @'400;|\cr}}$$
+The four bytes are then kept in a buffer and output one by one. (On 36-bit
+computers, an additional division by 16 is necessary at the beginning.
+Another way to separate an integer into four bytes is to use/abuse
+\PASCAL's variant records, storing an integer and retrieving bytes that are
+packed in the same place; {\sl caveat implementor!\/}) It is also desirable
+in some cases to read a hundred or so integers at a time, maintaining a
+larger buffer.
+
+Although plain \.{DVItype} sticks to simple \PASCAL, for reasons of clarity,
+(even if such simplicity is sometimes unrealistic), we do things rather
+differently under Vax/VMS, reading each file one disk block at a time.
+
+@d VAX_block_length=512
+
+@<Types...@>=
+@!eight_bits=[byte] 0..255; {unsigned one-byte quantity}
+@!sixteen_bits=[word] 0..65535; {unsigned two-byte quantity}
+@!byte_block=packed array [0..VAX_block_length-1] of eight_bits;
+@!byte_file=packed file of byte_block;
+
+
+@ To prepare these files for input, we |reset| them. An extension of
+\PASCAL\ is needed in the case of |tfm_file|, since we want to associate
+it with external files whose names are specified dynamically (i.e., not
+known at compile time). The following code uses the VAX-\PASCAL\ |open|
+statement; where |open(f,s)| opens the file associated with file variable |f|
+using the name provided by string variable |s|; once the file variable has
+been associated with the correctly named file, the |reset| statement positions
+the file for reading in the usual manner.
+In the case of opening the |tfm_file|, we firstly close any earlier
+one which may already have been opened. If |eof(f)| is true immediately after
+the file has been opened, we assume that no file named |s| is accessible.
+@^system dependencies@>
+
+To improve the visual appearance of various VAX-\PASCAL\ file manipulation
+statements, the following definition is used to represent the use of the
+`named parameter' passing mechanism which instructs that any errors detected
+shall be ignored, rather than causing a run-time error.
+
+@d VAX_continue==@=error@>:=@=continue@>
+
+@p procedure open_dvi_file; {prepares to read packed bytes in |dvi_file|}
+begin reset(dvi_file);
+dvi_count:=0; cur_block:=0;
+cur_loc:=0;
+end;
+@#
+procedure open_tfm_file; {prepares to read packed bytes in |tfm_file|}
+ var @!trimmed_name:file_spec; {Holds trimmed version of |cur_name|}
+ @!i,@!j:0..name_length; {Indices into |cur_name|}
+begin close(tfm_file,VAX_continue);
+trimmed_name:=''; {Initialize to empty string}
+i:=name_length;
+while cur_name[i]=' ' do decr(i); {we know that the name isn't all spaces!}
+for j:=1 to i do trimmed_name:=trimmed_name+cur_name[j];
+open(tfm_file,cur_name,@=readonly@>,VAX_continue);
+if status(tfm_file)<>0 then
+ abort('Font not loaded, TFM file ',trimmed_name,' can''t be opened');
+@:fatal error Font not loaded TFM file}{\qquad\.{TFM file can't be opened}@>
+reset(tfm_file,VAX_continue);
+tfm_count:=0;
+end;
+
+@ If you looked carefully at the preceding code, you probably asked,
+``What are |cur_loc| and |cur_name|?'' Good question. They're global
+variables: |cur_loc| is the number of the byte about to be read next from
+|dvi_file|, and |cur_name| is a string variable that will be set to the
+current font metric file name before |open_tfm_file| is called. When the
+\.{DVI} file is first |open|ed, we'll make use of the |@=user_action@>| facility
+of the VAX |open| procedure to note that actual file length in |dvi_size|.
+This can then be used as the value of the |dvi_length| function.
+
+Since we read a VAX/RMS blockfull of bytes from the \.{DVI} file, variable
+|dvi_count| allows us to keep track of which byte of the current block is
+the next to be ``read''. Similarly, |tfm_count| tracks the current byte of
+the block read from |tfm_file|. |cur_block| tracks which particular block
+of the whole file is currently in the buffer associated with |dvi_file|;
+this is used when |random_reading| is used to skip around in the file. No
+analogous variable is required for the |tfm_file|.
+
+@<Glob...@>=
+@!cur_loc:integer; {where we are about to look, in |dvi_file|}
+@!cur_name:packed array[1..name_length] of char; {external name,
+ with no lower case letters}
+@!dvi_size:integer; {Actual length of \.{DVI} file, in bytes}
+@!dvi_count:integer; {number of bytes read from current block of |dvi_file|}
+@!cur_block:integer; {relative position of current block of |dvi_file|}
+@!tfm_count:integer; {number of bytes read from current block of |tfm_file|}
+
+@ It turns out to be convenient to read four bytes at a time, when we are
+inputting from \.{TFM} files. The input goes into global variables
+|b0|, |b1|, |b2|, and |b3|, with |b0| getting the first byte and |b3|
+the fourth.
+
+@<Glob...@>=
+@!b0,@!b1,@!b2,@!b3: eight_bits; {four bytes input at once}
+
+@ The |read_tfm_word| procedure sets |b0| through |b3| to the next
+four bytes in the current \.{TFM} file.
+@^system dependencies@>
+
+@d read_tfm_file(#)==begin
+ if tfm_count=VAX_block_length then begin
+ get(tfm_file,VAX_continue); tfm_count:=0;
+ end;
+ #:=tfm_file^[tfm_count];
+ incr(tfm_count);
+ end
+
+@p procedure read_tfm_word;
+begin read_tfm_file(b0); read_tfm_file(b1);
+read_tfm_file(b2); read_tfm_file(b3);
+end;
+
+@ We shall use another set of simple functions to read the next byte or
+bytes from |dvi_file|. There are seven possibilities, each of which is
+treated as a separate function in order to minimize the overhead for
+subroutine calls.
+@^system dependencies@>
+
+Things aren't quite as simple as that, because when processing |dvi|
+commands to set characters on the page, it may prove necessary to take
+further |dvi| commands from a sequence read from a virtual font (\\{q.v.}).
+Therefore, these routines have the option of reading |dvi| bytes from
+|vf[vf_take]|. When reading |dvi| bytes from the \.{DVI} file, |vftake<0|.
+
+(\\{N.B.} |vf_take| and |vf_ptr| will be dealt with \&{much} later.)
+
+@d read_dvi_file(#)==if vf_take<0 then
+ begin
+ while dvi_count>=VAX_block_length do begin
+ get(dvi_file,VAX_continue);
+ dvi_count:=dvi_count-VAX_block_length; incr(cur_block);
+ end;
+ #:=dvi_file^[dvi_count];
+ incr(dvi_count); incr(cur_loc)
+ end
+ else
+ begin {take ``input'' from stored sequence}
+ if vf_take=vf_ptr then abort('no more virtual font bytes');
+@:fatal error no more virtual font bytes}{\quad\.{no more virtual font bytes}@>
+ #:=vf[vf_take]; incr(vf_take)
+ end
+
+@p function get_byte:integer; {returns the next byte, unsigned}
+var b:eight_bits;
+begin if eof(dvi_file) then get_byte:=0
+else begin read_dvi_file(b); get_byte:=b;
+ end;
+end;
+@#
+function signed_byte:integer; {returns the next byte, signed}
+var b:eight_bits;
+begin read_dvi_file(b);
+if b<128 then signed_byte:=b @+ else signed_byte:=b-256;
+end;
+@#
+function get_two_bytes:integer; {returns the next two bytes, unsigned}
+var a,@!b:eight_bits;
+begin read_dvi_file(a); read_dvi_file(b);
+get_two_bytes:=a*256+b;
+end;
+@#
+function signed_pair:integer; {returns the next two bytes, signed}
+var a,@!b:eight_bits;
+begin read_dvi_file(a); read_dvi_file(b);
+if a<128 then signed_pair:=a*256+b
+else signed_pair:=(a-256)*256+b;
+end;
+@#
+function get_three_bytes:integer; {returns the next three bytes, unsigned}
+var a,@!b,@!c:eight_bits;
+begin read_dvi_file(a); read_dvi_file(b); read_dvi_file(c);
+get_three_bytes:=(a*256+b)*256+c;
+end;
+@#
+function signed_trio:integer; {returns the next three bytes, signed}
+var a,@!b,@!c:eight_bits;
+begin read_dvi_file(a); read_dvi_file(b); read_dvi_file(c);
+if a<128 then signed_trio:=(a*256+b)*256+c
+else signed_trio:=((a-256)*256+b)*256+c;
+end;
+@#
+function signed_quad:integer; {returns the next four bytes, signed}
+var a,@!b,@!c,@!d:eight_bits;
+begin read_dvi_file(a); read_dvi_file(b); read_dvi_file(c); read_dvi_file(d);
+if a<128 then signed_quad:=((a*256+b)*256+c)*256+d
+else signed_quad:=(((a-256)*256+b)*256+c)*256+d;
+end;
+
+@ Finally we come to the routines that are used only if |random_reading| is
+|true|. The driver program below needs two such routines: |dvi_length| should
+compute the total number of bytes in |dvi_file|, possibly also
+causing |eof(dvi_file)| to be true; and |move_to_byte(n)|
+should position |dvi_file| so that the next |get_byte| will read byte |n|,
+starting with |n=0| for the first byte in the file.
+@^system dependencies@>
+
+Such routines are, of course, highly system dependent. They are implemented
+in this program by
+
+\yskip\hang(1) utilizing the optional |user_action| parameter of the |open|
+procedure, this allows us to determine the length of the file when it is
+first opened; and
+
+\yskip\hang(2), using the VAX-\PASCAL\ |find| procedure to read a specific
+block of the file, and positioning to the correct byte by resetting the
+|byte_block| pointer appropriately.
+
+\noindent We also make extensive use of VAX-\PASCAL's |varying array|
+extension, which
+facilitates the handling of variable length character strings; without them, it
+would be necessary to keep track of the length of each such string, in the
+fashion used by \.{DVItype} to store font names.
+
+The VAX-\PASCAL\ |find(f,block)| procedure reads (into file variable
+|f|) the specified record of the file; these are numbered from 1 upwards,
+and, since we are working with block-oriented files, each record consists of
+an entire disk block.
+
+@f varying==array
+@d VAX_find_block==@= find@>
+
+@p function dvi_length:integer;
+begin dvi_length:=dvi_size; if dvi_size<0 then
+ abort('Internal error (no dvi_length)');
+@:fatal error internal error no dvi}{\qquad\.{(no dvi_length)}@>
+end;
+@#
+procedure move_to_byte(n:integer);
+begin if n div VAX_block_length <> cur_block then
+ begin cur_block:=n div VAX_block_length;
+ VAX_find_block(dvi_file,cur_block+1,VAX_continue)
+ end;
+ dvi_count:=n mod VAX_block_length; cur_loc:=n;
+end;
+
+@* Reading the font information.
+\.{DVI} file format does not include information about character widths, since
+that would tend to make the files a lot longer. But a program that reads
+a \.{DVI} file is supposed to know the widths of the characters that appear
+in \\{set\_char} commands. Therefore \.{DVItoLN03} looks at the font metric
+(\.{TFM}) files for the fonts that are involved.
+@.TFM {\rm files}@>
+
+The character-width data appears also in other files (e.g., in \.{GF} files
+that specify bit patterns for digitized characters);
+thus, it is usually possible for \.{DVI} reading programs to get by with
+accessing only one file per font. \.{DVItype} has a comparatively easy
+task in this regard, since it needs only a few words of information from
+each font; the \.{DVItoLN03} program has to go to some pains to
+deal with complications that arise when a large number of large font files
+all need to be accessed simultaneously.
+
+@ \.{DVItype} needed to know only two things about a
+given character |c| in a given font |f|: (1)~Is |c| a legal character
+in~|f|? (2)~If so, what is the width of |c|? It also needed to know the
+symbolic name of each font, so it could be printed out, and to know
+the approximate size of inter-word spaces in each font.
+
+For \.{DVItoLN03}, some further information is required, such as which
+character in a downloaded font is to be used to image character |c| in font
+|f|, and whether this imaging can be performed by the LN03 itself (from
+stored downloaded fonts) or whether the glyph needs to be imaged by
+downloading a bitmapped representation each time it occurs, or even replacing
+it by a solid rule if no suitable file of bitmaps is available.
+
+The answers to these questions appear implicitly in the following data
+structures. The current number of known fonts is |nf|. Each known font has
+an internal number |f|, where |0<=f<nf|; the external number of this font,
+i.e., its font identification number in the \.{DVI} file, is |font_num[f]|,
+and the external name of this font is the string that occupies positions
+|font_name[f]| through |font_name[f+1]-1| of the array |names|. The latter
+array consists of |ASCII_code| characters, and |font_name[nf]| is its first
+unoccupied position.
+
+Various metrical data is saved for comparison with values to be read later
+from the file(s) containing the characters' bitmaps: |font_check_sum|,
+|font_scaled_size| and |font_design_size|.
+A horizontal motion in the range |-4*font_space[f]<h<font_space[f]|
+will be treated as a `kern' that merely advances the program's conception of
+physical horizontal position; larger movements will result in computation of a
+freshly rounded position, thus eliminating cumulative errors which might
+otherwise lead to unsightly character placement on the page.
+
+The legal characters run from |font_bc[f]| to |font_ec[f]|, inclusive; more
+precisely, a given character |c| is valid in font |f| if and only if
+|font_bc[f]<=c<=font_ec[f]| and |char_width(f)(c)<>invalid_width|.
+To cut down on page faulting with small working sets, the dimensions of each
+character are held within the |glyph_map| structure (see following section),
+so that all information relating to a particular glyph is held in one
+contiguous section of memory: the original \.{DVItype}, and earlier versions
+of \.{DVItoLN03}, used to have separate arrays |width[0..max_glyphs]|, etc.,
+which could require references to locations separated by |max_glyphs|
+integers, making inefficient use of virtual memory.
+
+To obviate reloading of fonts with identical names and scaling, a further
+array |font_map[f]| ordinarily holds the value |f|, but can point to a
+different set of metrics if such multiple loading has been avoided.
+
+Virtual fonts will almost certainly introduce different physical fonts; such
+fonts are given a relative reference number internally, but we will want to
+supply a value for the |font_num| array that's unique to each such font.
+Therefore we keep track of the highest font number allocated by \TeX\ and
+then use this as a base value when reading virtual fonts.
+
+@d invalid_width==@'17777777777
+
+@<Glob...@>=
+@!nf:0..max_fonts; {the number of known fonts}
+@!font_num:array [0..max_fonts] of integer; {external font numbers}
+@!font_name:array [0..max_fonts] of 0..name_size; {starting positions
+ of external font names}
+@!names:array [0..name_size] of ASCII_code; {characters of names}
+@!font_check_sum:array [0..max_fonts] of integer; {check sums}
+@!font_scaled_size:array [0..max_fonts] of integer; {scale factors}
+@!font_design_size:array [0..max_fonts] of integer; {design sizes}
+@!font_space:array [0..max_fonts] of integer; {boundary between ``small''
+ and ``large'' spaces}
+@!font_bc:array [0..max_fonts] of integer; {beginning characters in fonts}
+@!font_ec:array [0..max_fonts] of integer; {ending characters in fonts}
+@!font_map:array [0..max_fonts] of 0..max_fonts; {internal cross-reference}
+@!highest_font:0..max_fonts;
+
+@ An array |glyphs| has one element for each of the potential characters in
+each font. Each element is a record of type |glyph_info| (defined below).
+When a font definition is first read, during the gathering of font usage
+statistics in the first pass, the row of this array corresponding to the
+font being defined is set to indicate that every character is |unused|. As
+any character in this font is found in a wanted page during that first pass,
+the usage is noted. Later revisions take place when mapping characters from
+\TeX's fonts to those dowloaded to the printer.
+
+During the second pass through the wanted pages, the character codes in
+|glyphs| are used to generate the \.{LN3} file.
+
+|glyph_map(f)(c)=glyphs[glyph_base[f]+c]| permits us access to information
+relating to an individual glyph; fields of this record, named |width|, |height|
+and |depth| are accessible through macro
+|char_width(f)(c)=glyphs[glyph_base[f]+c].width| and its analogues; this works
+because |glyph_base[f]| contains the index into |glyphs| at which character~0
+appears (or would appear, if |font_bc[f]>0|). |glyph_ptr| is the first unused
+position of the |glyphs| array.
+
+@d char_glyph_end(#)==#]
+@d glyph_map(#)==glyphs[glyph_base[#]+char_glyph_end
+@d char_width_end(#)==#].width
+@d char_height_end(#)==#].height
+@d char_depth_end(#)==#].depth
+@d char_width(#)==glyphs[glyph_base[#]+char_width_end
+@d char_height(#)==glyphs[glyph_base[#]+char_height_end
+@d char_depth(#)==glyphs[glyph_base[#]+char_depth_end
+
+@<Glob...@>=
+@!glyphs: array [0..max_glyphs] of glyph_info;
+@!glyph_base : array [0..max_fonts] of integer; {index into |glyphs|}
+@!glyph_ptr : 0..max_glyphs; {index into |glyphs|, |width|, |height| and
+|depth|}
+
+@ The array |glyphs| contains elements whose fields are used as follows:
+
+\yskip\centerline{\vbox{\offinterlineskip\hrule
+ \halign{\vrule#&\strut\quad#\hfil\quad&\vrule#&\quad#\hfil\quad&\vrule#\cr
+ height2pt&\omit&&\omit&\cr
+ &\hfil Field Name\quad&&Used for&\cr
+ height2pt&\omit&&\omit&\cr
+ \noalign{\hrule}
+ height2pt&\omit&&\omit&\cr
+ &|width|&&Character width in \.{DVI} units&\cr
+ &|height|&&Character height in \.{DVI} units&\cr
+ &|depth|&&Character depth in \.{DVI} units&\cr
+ &|font_code|&&Number of downloaded LN03 font containing glyph&\cr
+ &|char_code|&&LN03 character code to access glyph&\cr
+ &|loaded|&&Indicates status of glyph, as below&\cr
+ height2pt&\omit&&\omit&\cr
+ }\hrule
+ }
+}
+
+The values that may be assumed by the |loaded| field are as follows:
+
+\item{$\bullet$} when a font is first met, all characters are set with
+the value |unused|;
+\item{$\bullet$} as the document is scanned, whenever a particular glyph
+is used this field is set to |wanted|;
+\item{$\bullet$} other values are set once the wanted pages have been
+scanned, and the character font downloads created.
+
+\noindent Further values for the |loaded| field, and other fields, will be
+defined for accessing virtual fonts.
+
+@<Types...@>==
+@!download_status = (@!unused,@!wanted@|@<Other values of |download_status|@>@+);@/
+@!glyph_info =
+ packed record
+ @!width:integer; {character width, in \.{DVI} units}
+ @!height:integer; {character height, in \.{DVI} units}
+ @!depth:integer; {character depth, in \.{DVI} units}
+ @!char_code : eight_bits;
+ @!loaded : download_status;
+ @!font_code : 0..max_fonts;
+ @<Other fields of |glyph_info|@>@;
+ end;
+
+
+@ @<Set init...@>=
+nf:=0; glyph_ptr:=0; font_name[0]:=0; font_space[0]:=0; font_map[0]:=0;
+highest_font:=0;
+
+@ It is, of course, a simple matter to print the name of a given font.
+
+@p procedure print_font(@!f:integer); {|f| is an internal font number}
+var k:0..name_size; {index into |names|}
+begin if f=nf then print('UNDEFINED!')
+@.UNDEFINED@>
+else begin for k:=font_name[f] to font_name[f+1]-1 do
+ print(xchr[names[k]]);
+ end;
+end;
+
+@ Auxiliary arrays |in_width|, |in_height| and |in_depth| are used to hold
+the relevant sections of the |tfm_file| as they are
+input. The global variable |tfm_check_sum| is set to the check sum that
+appears in the current \.{TFM} file.
+
+@<Glob...@>=
+@!in_width:array[0..255] of integer; {\.{TFM} width data in \.{DVI} units}
+@!in_height:array[0..15] of integer; {\.{TFM} height data in \.{DVI} units}
+@!in_depth:array[0..15] of integer; {\.{TFM} depth data in \.{DVI} units}
+@!tfm_check_sum:integer; {check sum found in |tfm_file|}
+
+@ Here is a procedure that absorbs the necessary information from a
+\.{TFM} file, assuming that the file has just been successfully reset
+so that we are ready to read its first byte. (A complete description of
+\.{TFM} file format appears in the documentation of \.{TFtoPL} and will
+not be repeated here.) The procedure does not check the \.{TFM} file
+for validity, nor does it give explicit information about what is
+wrong with a \.{TFM} file that proves to be invalid; \.{DVI}-reading
+programs need not do this, since \.{TFM} files are almost always valid,
+and since the \.{TFtoPL} utility program has been specifically designed
+to diagnose \.{TFM} errors. The procedure simply returns |false| if it
+detects anything amiss in the \.{TFM} data.
+
+There is a parameter, |z|, which represents the scaling factor being
+used to compute the font dimensions; it must be in the range $0<z<2^{27}$.
+
+@p function in_TFM(@!z:integer):boolean; {input \.{TFM} data or return |false|}
+label 9997, {go here when the format is bad}
+ 9998, {go here when the information cannot be loaded}
+ 9999; {go here to exit}
+var k:integer; {index for loops}
+@!lh:integer; {length of the header data, in four-byte words}
+@!nw:integer; {number of words in the width table}
+@!nh:integer; {number of words in the height table}
+@!nd:integer; {number of words in the depth table}
+@!gp:0..max_glyphs; {new value of |glyph_ptr| after successful input}
+@!alpha,@!beta:integer; {quantities used in the scaling computation}
+begin @<Read past the header data; |goto 9997| if there is a problem@>;
+@<Store character-width indices at the end of the |width| table@>;
+@<Read and convert the width values, setting up the |in_width| table@>;
+@<Move the widths from |in_width| to |width|, and append |pixel_width| values@>;
+glyph_ptr:=gp; in_TFM:=true; goto 9999;
+9997: error('---not loaded, TFM file is bad');
+@.TFM file is bad@>
+9998: in_TFM:=false;
+9999: end;
+
+@ @<Read past the header...@>=
+read_tfm_word; lh:=b2*256+b3;
+read_tfm_word; font_bc[nf]:=b0*256+b1; font_ec[nf]:=b2*256+b3;
+if font_ec[nf]<font_bc[nf] then font_bc[nf]:=font_ec[nf]+1;
+@<Mark all glyphs of font |nf| as |unused|@>;
+{now |gp=glyph_ptr+font_ec[nf]-font_bc[nf]+1|}
+read_tfm_word; nw:=b0*256+b1;
+if (nw=0)or(nw>256) then goto 9997;
+nh:=b2*256+b3;
+if (nh=0)or(nh>16) then goto 9997;
+read_tfm_word; nd:=b0*256+b1;
+if (nd=0)or(nd>16) then goto 9997;
+for k:=2 to 3+lh do
+ begin if eof(tfm_file) then goto 9997;
+ read_tfm_word;
+ if k=4 then
+ if b0<128 then tfm_check_sum:=((b0*256+b1)*256+b2)*256+b3
+ else tfm_check_sum:=(((b0-256)*256+b1)*256+b2)*256+b3;
+ end;
+
+@ Whenever the program reads a \.{TFM} file, either during the main
+processing loop, or when such files are read in whilst mapping virtual fonts
+to physical ones, the |glyph_map| row corresponding to the physical file is
+preset to indicate that none of the glyphs are used, and also to signify
+that, in the absence of further information, the characters are taken from
+the current font. This little segment of code used to appear in-line within
+procedure |in_TFM|.
+
+We also indicate here that no glyphs from the font as a whole are currently
+used. Once a glyph is referenced (either directly, or from within a
+character packet in a virtual font), we'll mark the font as |wanted|, thus
+indicating (so far as we currently know) the font \\{is} physical; this may
+be changed later, if the font is found to be virtual. This information is
+stored in yet another array, |font_type|.
+
+@<Mark all glyphs of font |nf| as |unused|@>=
+font_type[nf]:=unused;
+if glyph_ptr+font_ec[nf]-font_bc[nf]+1 > max_glyphs then
+ capacity_exceeded('too many glyphs: ',glyph_ptr+font_ec[nf]-font_bc[nf]+1:1,
+ ' > ',max_glyphs:1);
+@:capacity exceeded too many glyphs}{\quad\.{too many glyphs}@>
+glyph_base[nf]:=glyph_ptr-font_bc[nf];
+gp:=glyph_ptr+font_ec[nf]-font_bc[nf]+1;
+for m:= glyph_ptr to gp-1 do
+ with glyphs[m] do
+ begin
+ loaded := unused;
+ font_code := nf
+ end
+
+@ At this point, we've arrived at the start of the |char_info| section of
+the |tfm_file|; from each 32-bit word, we extract the indices into the
+|width|, |height| and |depth| sections of the file.
+@<Store character-width indices...@>=
+if gp>0 then for k:=glyph_ptr to gp-1 do
+with glyphs[k] do
+ begin read_tfm_word;
+ if b0>nw then goto 9997;
+ width:=b0;
+ if (b1 div 16)>nh then goto 9997;
+ height:=b1 div 16;
+ if (b1 mod 16)>nd then goto 9997;
+ depth:=b1 mod 16;
+ end;
+
+@ The most important part of |in_TFM| is the width computation, which
+involves multiplying the relative widths in the \.{TFM} file by the
+scaling factor in the \.{DVI} file. This fixed-point multiplication
+must be done with precisely the same accuracy by all \.{DVI}-reading programs,
+in order to validate the assumptions made by \.{DVI}-writing programs
+like \TeX82.
+
+Let us therefore summarize what needs to be done. Each width in a \.{TFM}
+file appears as a four-byte quantity called a |fix_word|. A |fix_word|
+whose respective bytes are $(a,b,c,d)$ represents the number
+$$x=\left\{\vcenter{\halign{$#$,\hfil\qquad&if $#$\hfil\cr
+b\cdot2^{-4}+c\cdot2^{-12}+d\cdot2^{-20}&a=0;\cr
+-16+b\cdot2^{-4}+c\cdot2^{-12}+d\cdot2^{-20}&a=255.\cr}}\right.$$
+(No other choices of $a$ are allowed, since the magnitude of a \.{TFM}
+dimension must be less than 16.) We want to multiply this quantity by the
+integer~|z|, which is known to be less than $2^{27}$. Let $\alpha=16z$.
+If $|z|<2^{23}$, the individual multiplications $b\cdot z$, $c\cdot z$,
+$d\cdot z$ cannot overflow; otherwise we will divide |z| by 2, 4, 8, or
+16, to obtain a multiplier less than $2^{23}$, and we can compensate for
+this later. If |z| has thereby been replaced by $|z|^\prime=|z|/2^e$, let
+$\beta=2^{4-e}$; we shall compute
+$$\lfloor(b+c\cdot2^{-8}+d\cdot2^{-16})\,z^\prime/\beta\rfloor$$ if $a=0$,
+or the same quantity minus $\alpha$ if $a=255$. This calculation must be
+done exactly, for the reasons stated above; the following program does the
+job in a system-independent way, assuming that arithmetic is exact on
+numbers less than $2^{31}$ in magnitude.
+
+@<Read and convert the width values...@>=
+@<Replace |z| by $|z|^\prime$ and compute $\alpha,\beta$@>;
+for k:=0 to nw-1 do
+ begin read_tfm_word;
+ in_width[k]:=(((((b3*z)div@'400)+(b2*z))div@'400)+(b1*z))div beta;
+ if b0>0 then if b0<255 then goto 9997
+ else in_width[k]:=in_width[k]-alpha;
+ end;
+@<Read and convert the height and depth values@>
+
+@ Similarly, we store away the sets of distinct character heights and
+depths; we don't need to convert |z| again.
+
+@<Read and convert the height and depth values@>=
+for k:=0 to nh-1 do
+ begin read_tfm_word;
+ in_height[k]:=(((((b3*z)div@'400)+(b2*z))div@'400)+(b1*z))div beta;
+ if b0>0 then if b0<255 then goto 9997
+ else in_height[k]:=in_height[k]-alpha;
+ end;
+for k:=0 to nd-1 do
+ begin read_tfm_word;
+ in_depth[k]:=(((((b3*z)div@'400)+(b2*z))div@'400)+(b1*z))div beta;
+ if b0>0 then if b0<255 then goto 9997
+ else in_depth[k]:=in_depth[k]-alpha;
+ end
+
+@ @<Replace |z|...@>=
+begin alpha:=16*z; beta:=16;
+while z>=@'40000000 do
+ begin z:=z div 2; beta:=beta div 2;
+ end;
+end
+
+@ A \.{DVI}-reading program usually works with font files instead of
+\.{TFM} files, so \.{DVItype} is atypical in that respect. \.{DVItoLN03}
+actually checks information in the \.{TFM} file, \&{and} also reads an
+appropriate \.{PXL} file. Font files
+should, however, contain exactly the same character width data that is
+found in the corresponding \.{TFM}s; check sums are used to help
+ensure this. In addition, font files usually also contain the widths of
+characters in pixels, since the device-independent character widths of
+\.{TFM} files are generally not perfect multiples of pixels.
+
+The |pixel_width| field of the |glyph_map| contains this information; when
+|glyphs[k].width| is the device-independent width of some character in
+\.{DVI} units, |glyphs[k].pixel_width| is the corresponding width of that
+character in an actual font. The macro |char_pixel_width| is set up to be
+analogous to |char_width|.
+
+Similarly, |pixel_height| and |pixel_depth| are available; these are used
+for replacing the glyph for a character for which the required bitmaps are
+unavailable by the appropriately-sized rule.
+
+@d pixel_width_end(#)==#].pixel_width
+@d pixel_height_end(#)==#].pixel_height
+@d pixel_depth_end(#)==#].pixel_depth
+@d char_pixel_width(#)==glyphs[glyph_base[#]+pixel_width_end
+@d char_pixel_height(#)==glyphs[glyph_base[#]+pixel_height_end
+@d char_pixel_depth(#)==glyphs[glyph_base[#]+pixel_depth_end
+
+@<Other fields of |glyph_info|@>=
+@!pixel_width, @!pixel_height, @!pixel_depth : integer;
+
+@ The following variables are used to hold the conversion factors for
+translating device-independent units into device pixels.
+
+@<Glob...@>=
+@!conv:real; {converts \.{DVI} units to pixels}
+@!true_conv:real; {converts unmagnified \.{DVI} units to pixels}
+@!numerator,@!denominator:integer; {stated conversion ratio}
+@!mag:integer; {magnification factor times 1000}
+
+@ The following code computes pixel widths by simply rounding the \.{TFM}
+widths to the nearest integer number of pixels, based on the conversion factor
+|conv| that converts \.{DVI} units to pixels. However, such a simple
+formula will not be valid for all fonts, and it will often give results that
+are off by $\pm1$ when a low-resolution font has been carefully
+hand-fitted. For example, a font designer often wants to make the letter `m'
+a pixel wider or narrower in order to make the font appear more consistent.
+\.{DVI}-to-printer programs should therefore input the correct pixel width
+information from font files whenever there is a chance that it may differ.
+A warning message may also be desirable in the case that at least one character
+is found whose pixel width differs from |conv*width| by more than a full pixel.
+@^system dependencies@>
+(And similarly for the height and depth values.)
+
+@d pixel_round(#)==round(conv*(#))
+
+@<Move the widths from |in_width| to |width|, and append |pixel_width| values@>=
+if in_width[0]<>0 then goto 9997; {the first width should be zero}
+if gp>0 then for k:=glyph_ptr to gp-1 do
+with glyphs[k] do
+begin
+ if width=0 then
+ begin width:=invalid_width; pixel_width:=0;
+ end
+ else begin width:=in_width[width];
+ pixel_width:=pixel_round(width);
+ end;
+ height:=in_height[height];
+ pixel_height:=pixel_round(height);
+ depth:=in_depth[depth];
+ pixel_depth:=pixel_round(depth)
+end
+
+@* Output to the terminal. Whilst DVItoLN03 is processing \.{DVI} files, it
+reports its progress by outputting various messages to the terminal: in
+particular, when processing each page, it reports the page number, enclosed in
+`\.{[]}' brackets. Under Vax/VMS, output to the terminal is not normally
+visible until |writeln| is called, since the operating system buffers output
+until a line is complete. However, this would mean, for example, that output
+would only appear as each line was filled.
+
+We therefore arrange to |open| the |output| file (synonymous with |term_out|)
+specifying null carriage control; output may then be made to appear by calling
+|write_ln|, but this will not give the usual accompanying newline. To start
+printing on a newline, the character sequence |crlf| must be output
+explicitly.
+
+The |term_out| file is used for terminal output.
+@^system dependencies@>
+The number of characters already output to a terminal line is counted
+in |term_offset| so that a suitable line break may be chosen when the line
+becomes ``full'.
+
+Messages giving page number strings being processed are contained in a
+variable of type |file_spec|, because some messages may contain VAX/VMS file
+names.
+
+@d term_out==output {the terminal, considered as an output file}
+
+@<Glob...@>=
+ @!term_offset : 0..line_length;
+
+@ When each page is processed, the page number (as generated by \TeX) is written
+out to the user's terminal, enclosed in `\.{[]}' brackets. The procedure
+|monitor| ensures that such output does not overlap the right-margin. It
+does this by counting the characters already output to the line; up to
+|line_length| characters will be output. We use here the VAX-\PASCAL-specific
+function |length| which returns the number of characters in a |varying of char|
+which are actually occupied.
+
+@d VAX_length==@= length@>
+
+@p procedure monitor(s : file_spec);
+ begin if VAX_length(s)+2>line_length-term_offset then {Line is fullish!}
+ begin write_ln(term_out,crlf); term_offset:=0; end;
+ if (term_offset>0) and (s[1]='[') then {Space before a |'['|}
+ begin write(term_out,' '); incr(term_offset); end;
+ write_ln(term_out,s);
+ term_offset:=term_offset+VAX_length(s)
+ end;
+
+@*Displaying error messages. Later we shall make extensive use of the
+following definitions, particularly when scanning the \.{DVI} file. However,
+they are defined up here so that warnings may be issued by the code that
+follows. Normally (when invoked from within |do_page|) the variable |a| will
+contain the byte number within the \.{DVI} file at which a problem was
+encountered; however, to give |show| something to work with when these macros
+are used elsewhere, we also define a constant of that name, which will thus
+always be within scope.
+
+@d show(#)==begin
+ if a<0 then print_ln(#) else print_ln('[',a:1,'] ',#);
+ if term_offset>0 then write_ln(crlf);
+ write_ln(term_out,#,crlf); term_offset:=0
+ end
+@d error(#)==begin
+ history := error_given;
+ show('Error: ',#)
+@.Error:@>
+end
+@d warning(#)==begin
+ if history = spotless then history := warning_given;
+ show('Warning: ',#)
+@.Warning:@>
+end
+
+@<Constants...@>==
+ a = -1;
+
+@* Optional modes of output.
+\.{DVItoLN03} will print different quantities of information based on some
+options that the user must specify: the typeout can be confined to a
+restricted subset of the pages by specifying the desired starting page and
+the maximum number of pages. Further options permit
+the selection of a different position for the origin on the page, which
+by default is set to the ``standard'' of one inch from the top and left
+edges of the paper, and selection of ``portrait'' or ``landscape'' orientation
+for the output on the printed page. All options are selected through the
+use of VAX/VMS command qualifiers, but procedure |dialog| could be adapted
+to carry out an interactive dialogue with a user on systems without VMS'
+excellent facilities for defining commands.
+
+The starting page is specified by giving a sequence of 1 to 10 numbers or
+asterisks separated by dots. For example, the specification `\.{1.*.-5}'
+can be used to refer to a page output by \TeX\ when $\.{\\count0}=1$
+and $\.{\\count2}=-5$. (Recall that |bop| commands in a \.{DVI} file
+are followed by ten `count' values.) An asterisk matches any number,
+so the `\.*' in `\.{1.*.-5}' means that \.{\\count1} is ignored when
+specifying the first page. If several pages match the given specification,
+\.{DVItoLN03} will begin with the earliest such page in the file. The
+default specification `\.*' (which matches all pages) therefore denotes
+the page at the beginning of the file.
+
+This version of \.{DVItoLN03} uses the VMS Command Language Interpreter utility
+routines to determine whether command line qualifiers are present, and to
+fetch their values, which are then stored in the following variables.
+@^Command Language Interpreter@>
+@^system dependencies@>
+The default options that hold unless over-ridden by command line qualifiers
+are:
+
+\yskip\hang$\bullet$ \.{/starting\_page}=\.{*}
+\yskip\hang$\bullet$ \.{/number\_of\_pages}=\.{1000000}
+\yskip\hang$\bullet$ \.{/top\_margin} = \.{300px}
+\yskip\hang$\bullet$ \.{/left\_margin}=\.{300px}
+\yskip\hang$\bullet$ \.{/orientation}=\.{portrait}
+
+@<Glob...@>=
+@!left_marg,@!top_marg : integer;
+@!orientation,@!new_orient,@!cur_orient : page_orientation;
+@!h_fuzz,@!v_fuzz:integer; {controls how pedantic program is}
+@!page_len,@!page_wid,@!y_min,@!x_min : integer;
+@!max_pages:integer; {at most this many |bop..eop| pages will be printed}
+@!resolution:real; {pixels per inch}
+@!new_mag:integer; {if positive, overrides the postamble's magnification}
+
+@ This type allows us to keep track of whether characters are currently
+being imaged in landscape or portrait orientation.
+
+@<Types...@>=
+@!page_orientation = (@!portrait,@!landscape);
+
+@ The starting page specification is recorded in two global arrays called
+|start_count| and |start_there|. For example, `\.{1.*.-5}' is represented
+by |start_there[0]=true|, |start_count[0]=1|, |start_there[1]=false|,
+|start_there[2]=true|, |start_count[2]=-5|.
+We also set |start_vals=2|, to indicate that count 2 was the last one
+mentioned. The other values of |start_count| and |start_there| are not
+important, in this example.
+
+@<Glob...@>=
+@!start_count:array[0..9] of integer; {count values to select starting page}
+@!start_there:array[0..9] of boolean; {is the |start_count| value relevant?}
+@!start_vals:0..9; {the last count considered significant}
+@!count:array[0..9] of integer; {the count values on the current page}
+
+@ @<Set init...@>=
+max_pages:=1000000; start_vals:=0; start_there[0]:=false;
+top_marg:=300; left_marg:=300; orientation:=portrait;
+
+@ Here is a simple subroutine that tests if the current page might be the
+starting page.
+
+@p function start_match:boolean; {does |count| match the starting spec?}
+var k:0..9; {loop index}
+@!match:boolean; {does everything match so far?}
+begin match:=true;
+for k:=0 to start_vals do
+ if start_there[k]and(start_count[k]<>count[k]) then match:=false;
+start_match:=match;
+end;
+
+@ The global variable |buf_ptr| is used while scanning each line of input;
+it points to the first unread character in |buffer|, into which the command
+line interpreter places strings by interaction with the CLI interface
+procedures.
+
+@<Glob...@>=
+@!buffer: varying[terminal_line_length] of char;
+@!buf_ptr:0..terminal_line_length; {the number of characters read}
+
+@ The compiler needs to know about the ``foreign'' routines used for access to
+the Command Line Interpreter. VAX-\PASCAL\ permits the ``declaration'' of
+external procedures, where the declaration consists of the procedure heading
+alone, followed by the reserved word |extern|, in a manner analogous to
+standard \PASCAL's |forward| directive.
+@^system dependencies@>
+
+We also require the following special definitions, types, variables and
+procedures to be able to get information from the command line interpreter.
+The macro |VAX_string_or_empty| is used so as not to confuse W{\mc EAVE}'s
+formatting of these foreign procedure interfaces.
+
+
+@d VAX_volatile==@=[volatile]@>
+@d VAX_immed==@=%immed @>
+@d VAX_external==@=[external]@>
+@d VAX_descr==@=%descr @>
+@d VAX_ref==@=%ref @>
+@d VAX_cli_present==@= cli$present@>
+@d VAX_cli_get_value==@= cli$get_value@>
+@d VAX_cli_negated==@"000381F8
+@d VAX_lib_find_file==@= lib$find_file@>
+@#
+@f VAX_volatile==do_nothing
+@f VAX_descr==var
+@f VAX_ref==var
+@f VAX_immed==integer
+@f VAX_external==var
+@#
+@d VAX_string_or_empty(#)==VAX_volatile varying[@!#] of char := VAX_immed 0
+
+@f extern==forward
+
+@<Procedures for init...@>=
+VAX_external @+function VAX_cli_present(
+ VAX_descr @!entity:VAX_string_or_empty(s1_len)) : integer; extern;@#@t\2@>
+
+VAX_external @+function VAX_cli_get_value(
+ VAX_descr @!entity:VAX_string_or_empty(s1_len);
+ VAX_descr @!returns:VAX_string_or_empty(s2_len);
+ VAX_ref @!retlen:VAX_volatile sixteen_bits := VAX_immed 0):integer;
+ extern;@#@t\2@>
+
+VAX_external @+function VAX_lib_find_file(
+ VAX_descr @!part_spec:VAX_volatile file_spec;
+ VAX_descr @!result_spec:VAX_volatile file_spec;
+ VAX_ref @!context:VAX_volatile integer;
+ VAX_descr @!def_spec:VAX_volatile file_spec := VAX_immed 0;
+ VAX_descr @!related_spec:VAX_volatile file_spec := VAX_immed 0;
+ VAX_ref @!stv_addr:VAX_volatile integer := VAX_immed 0;
+ VAX_ref @!user_flags:VAX_volatile integer := VAX_immed 0): integer;
+ extern;@#@t\2@>
+
+@ The following function |get_value| inputs the string corresponding to a
+command-line qualifier and converts it to its numerical value. Calls of the
+|VAX_cli_get_value(s,a)| return to the buffer parameter |a| the value placed
+by the user on the command qualifier whose name is given by the string |s|;
+being a system service type function, it also reports its success (or failure)
+as its result. The other system service used is |VAX_cli_present(s)| which
+returns an odd (success) status indication if the qualifier whose name is
+given by the string |s| \&{is} present in the command line.
+
+One VAX-\PASCAL\ extension permits string variables to be used in place of
+files for reading and writing values. The |VAX_string_read(b,i,...)|
+procedure reads values into variables |i,...| from the characters stored in
+the string variable |b|. The |VAX_string_status| function returns a value in
+a manner entirely analogous to VAX-\PASCAL's external I/O |status| function,
+but relating to the success of the previous string read.
+
+@d VAX_string_read==@= readv@>
+@d VAX_string_status==@= statusv@>
+
+@p function get_value(qualifier: varying [$u1] of char):integer;
+ var @!i,@!stat,@!len : integer; {local workspace}
+ buffer: varying [terminal_line_length] of char; {buffer for qualifier
+ string}
+begin
+ if odd(VAX_cli_present(qualifier)) then
+ begin stat:=VAX_cli_get_value(qualifier,buffer); buffer:=buffer+' ';
+ {append a space to ensure end can be found}
+ VAX_string_read(buffer,i,VAX_continue);
+ if VAX_string_status > 0 then
+ abort('Bad /',qualifier,' value! (=',buffer,')')
+@:fatal error Bad qualifier}{\quad \.{Bad /}\meta{qualifier} \.{value}@>
+ else
+ get_value:=i
+ end else get_value:=-1
+end;
+
+@ Here is a routine that scans a (possibly signed) integer and computes
+the decimal value. If no decimal integer starts at |buf_ptr|, the
+value 0 is returned. The integer should be less than $2^{31}$ in
+absolute value.
+
+@p function get_integer:integer;
+var x:integer; {accumulates the value}
+@!negative:boolean; {should the value be negated?}
+begin if buffer[buf_ptr]='-' then
+ begin negative:=true; incr(buf_ptr);
+ end
+else negative:=false;
+x:=0;
+while (buffer[buf_ptr]>='0')and(buffer[buf_ptr]<='9') do
+ begin x:=10*x+xord[buffer[buf_ptr]]-"0"; incr(buf_ptr);
+ end;
+if negative then get_integer:=-x @+ else get_integer:=x;
+end;
+
+@ One feature of the new DEClaser~2200 (otherwise known as the LN06) is a
+capability of selecting from which paper tray a sheet shall be fed; the
+printer has two separate trays, which can be loaded with different sizes or
+colours of paper: a popular use is to have letterhead paper loaded in one
+tray, and plain paper for continuation sheets in the other. Both on this
+printer, and on the DEClaser~2100 (LN05), any of five different types of
+paper tray can be inserted into (respectively, either, or the only) tray
+slot. Paper cassettes are available to hold three different American sizes
+of paper (letter, legal or executive), the ISO standard A4 size used in
+Europe, or a stack of up to 15 envelopes.
+
+The DEClaser~2200 can be fitted with a separate envelope feeder (in addition
+to the two paper trays), which can hold up to 40~envelopes. This envelope
+feeder is supported by the program, but we don't (yet!) support one
+further option of the LN06 which is a large capacity input tray that can
+hold 1000 sheets.
+
+In addition, both the 2100 and 2200 models can await manual feeding of
+sheets. Selection of paper source is not supported on the LN03, of course.
+
+\noindent Here are the values that may be listed with the \.{/feed\_tray}
+qualifier:
+\yskip\hang\.{ALL=}\meta{tray type} All sheets will be fed from the
+specified tray.
+\yskip\hang\.{FIRST=}\meta{tray type} Feed the first sheet from the
+specified tray; subsequent sheets will be fed from the \.{DEFAULT\_TRAY},
+unless the next qualifier is used:
+\yskip\hang\.{REST=}\meta{tray type} Feed the second and subsequent sheets
+from the specified tray; the first sheet will be fed from the
+\.{DEFAULT\_TRAY}, unless the \.{FIRST} tray has also been specified.
+
+\noindent\meta{Tray types} can take the following values:
+\yskip\hang\.{DEFAULT\_TRAY} Use whichever tray is set as the default by the
+printer's initialization sequence.
+\yskip\hang\.{TOP\_TRAY} (This is the only tray on the DEClaser~2100.)
+\yskip\hang\.{BOTTOM\_TRAY}
+\yskip\hang\.{ENVELOPE\_TRAY} Feed envelopes, from the large-capacity
+envelope tray option on the DEClaser~2200.
+\yskip\hang\.{MANUAL\_FEED} Wait for the operator to insert each sheet
+manually.
+
+\noindent The following values look as though they could be defined as a
+ \PASCAL\ enumeration type, but we need to ensure a particular
+ mapping to ordinal values, so we engage in a Knuthian trick here.
+@^Knuth, D.~E.@>
+@:TeX the Program}{{\sl\TeX\ the Program}@>
+The values correspond to the $P_s$ parameter of the |DECASTC| (Automatic
+Sheet-feeder Tray Control) control sequence.
+
+@d default_tray=0
+@d top_tray=1
+@d bottom_tray=2
+@d envelope_feeder=3
+@d manual_feed=99
+
+@<Types...@>=
+@!tray_type=default_tray..manual_feed;
+
+@ Here is a procedure which converts the \.{/feed\_tray} qualifier to the
+appropriate numeric value.
+
+@p procedure @!read_tray(option:file_spec; var result:tray_type);
+begin
+ result:=default_tray;
+ if odd(VAX_cli_present(option+'.TOP_TRAY')) then
+ result:=top_tray
+ else if odd(VAX_cli_present(option+'.BOTTOM_TRAY')) then
+ result:=bottom_tray
+ else if odd(VAX_cli_present(option+'.ENVELOPE_TRAY')) then
+ result:=envelope_feeder
+ else if odd(VAX_cli_present(option+'.MANUAL_FEED')) then
+ result:=manual_feed;
+ if device_type=ln03 then result:=default_tray
+end;
+@ The selected options are put into global variables by the |dialog|
+procedure, which is called just as \.{DVItoLN03} begins. As already
+explained, the |term_out| file is opened during the initialization phase, with
+\.{carriage\_control}=\.{none}. Having announced the program's name, the
+command line interpreter library procedures are invoked to retrieve the
+qualifiers and file name from the command line.
+
+@p procedure dialog;
+var k:integer; {loop variable}
+begin rewrite(term_out); {prepare the terminal for output}
+write_ln(term_out,banner,crlf);@/
+@<Determine the desired |start_count| values@>;
+@<Determine the desired |max_pages|@>;
+@<Determine the desired |resolution|@>;
+@<Determine the desired |new_mag|@>;
+@<Determine the desired |left_marg| and |top_marg|@>;
+@<Determine the desired |orientation|@>;
+@<Determine the desired ``fuzzes''@>;
+@<Determine the desired |print_mode|@>;
+@<Determine the desired \\{feed\_trays}@>;
+@<Determine the desired |duplex_by_page_numbers|@>;
+@<Print all the selected options@>;
+end;
+
+
+@ @<Determine the desired |start...@>=
+start_vals:=0; start_there[0]:=false;
+if odd(VAX_cli_present('STARTING_PAGE')) then
+ begin k:=VAX_cli_get_value('STARTING_PAGE',buffer); buffer:=buffer+' ';
+ if (buffer[1]<>' ') then begin
+ buf_ptr:= 1; k:=0;
+ if buffer[1]<>' ' then
+ repeat if buffer[buf_ptr]='*' then
+ begin start_there[k]:=false; incr(buf_ptr);
+ end
+ else begin start_there[k]:=true; start_count[k]:=get_integer;
+ end;
+ if (k<9)and(buffer[buf_ptr]='.') then
+ begin incr(k); incr(buf_ptr);
+ end
+ else start_vals:=k { anything ill-formed we just stop }
+ until start_vals=k
+ end
+end
+
+@ @<Determine the desired |max_pages|@>=
+max_pages:=1000000;
+max_pages:=get_value('NUMBER_OF_PAGES');
+if max_pages<=0 then max_pages:=1000000;
+
+@ @<Determine the desired |resolution|@>=
+resolution:=300.0; { this is the LN03's resolution }
+
+@ @<Determine the desired |new_mag|@>=
+new_mag:=0; { no provision for magnified LN03 output yet }
+
+@ The value associated with the \.{/left\UL margin} and \.{/top\UL margin}
+qualifiers consists of a number and a specifier for a \TeX\ \meta{physical
+unit}. The values provided are translated into pixels; this uses the same
+mechanism as is used for interpreting similar dimensions in \.{\BS special}
+commands, so the qualifier is copied into the |spec_par| buffer used for
+that interpretation. The characters have to be converted from external
+representation into |ASCII_code| for this.
+
+@<Determine the desired |left_marg|...@>=
+if odd(VAX_cli_present('LEFT_MARGIN')) then
+begin
+ k:=VAX_cli_get_value('LEFT_MARGIN',buffer); buffer:=buffer+' ';
+ @<Copy qualifier into |spec_par|@>;
+ if rd_dimension(left_marg) then
+ begin
+ print_ln(' --- assuming pixel units');
+ write_ln(' --- assuming pixel units',crlf);
+ term_offset:=0
+ end
+@.assuming pixel units@>
+end else left_marg := -1;
+if left_marg<0 then left_marg:=300;
+
+if odd(VAX_cli_present('TOP_MARGIN')) then
+begin
+ k:=VAX_cli_get_value('TOP_MARGIN',buffer); buffer:=buffer+' ';
+ @<Copy qualifier into |spec_par|@>;
+ if rd_dimension(top_marg) then
+ begin
+ print_ln(' --- assuming pixel units');
+ write_ln(' --- assuming pixel units',crlf);
+ term_offset:=0
+ end
+@.assuming pixel units@>
+end else top_marg := -1;
+if top_marg<0 then top_marg:=300;
+
+@ Here's how we copy the |char| values from the |buffer| (whence they have
+been read from the command-line qualifier) into the |spec_par| buffer,
+converting to |ASCII_code| in the process.
+
+@<Copy qualifier into |spec_par|@>=
+ buf_ptr:=1; spec_len:=1;
+ while buf_ptr<=buffer.length do
+ begin
+ spec_par[spec_len]:=xord[buffer[buf_ptr]];
+ incr(spec_len); incr(buf_ptr)
+ end;
+ spec_ptr:=1
+
+@ When the paper orientation is selected, we may define the |page_len| and
+|page_wid| in terms of the physical limits of the paper; these sizes have
+been defined at the start of this \.{web}.
+
+@<Determine the desired |orientation|@>=
+if odd(VAX_cli_present('ORIENTATION')) then
+begin
+ if odd(VAX_cli_present('PORTRAIT')) then orientation:=portrait else
+ if odd(VAX_cli_present('LANDSCAPE')) then orientation:=landscape else
+ warning('/ORIENTATION must be "PORTRAIT" or "LANDSCAPE"; assuming "PORTRAIT"')
+@:Warning: orientation must be}{\quad \.{/ORIENTATION must be ...}@>
+end;
+if orientation=landscape then
+begin page_len:=paper_wid+page_x_min; page_wid:=paper_ht+y_land_min;
+ y_min:=page_x_min; x_min:=y_land_min end else
+begin page_len:=paper_ht+y_port_min; page_wid:=paper_wid+page_x_min;
+ y_min:=y_port_min; x_min:=page_x_min end;
+
+@ The value associated with the \.{/hfuzz} and \.{/vfuzz}
+qualifiers consists of a number and a specifier for a \TeX\ \meta{physical
+unit}. The values provided are translated into scaled points, entirely
+analogously with the translation of the value on the \.{/top\_margin}
+qualifier into pixels.
+
+These ``fuzz'' values are used to control how pedantic the program is when
+it discovers characters which extend beyond the right-hand margin as
+reported (in the \.{DVI} file) by \TeX. The default values for these
+qualifiers is \.{100sp}, which implies that ``errors'' smaller than this
+(it's a very small quantity, approximately equal to the wavelength of
+visible light) will be ignored. Normally \TeX\ wouldn't dream of exceeding
+the margin (well, not without issuing an \.{overfull \\hbox} warning), but
+with some macro packages it isn't so fussy. For example, the output of W{\sc
+EAVE}, when formatting the \PASCAL\ part of a program, can extend beyond the
+margin by up to \.{10pt}. By selecting a larger value of ``fuzz'',
+spurious warning messages from DVItoLN03 can be suppressed.
+
+@<Determine the desired ``fuzzes''@>=
+if odd(VAX_cli_present('HFUZZ')) then
+begin
+ k:=VAX_cli_get_value('HFUZZ',buffer); buffer:=buffer+' ';
+ @<Copy qualifier into |spec_par|@>;
+ if rd_scaled_pt(h_fuzz) then
+ begin
+ print_ln(' --- assuming scaled points');
+@.assuming scaled points@>
+ write_ln(' --- assuming scaled points',crlf);
+ term_offset:=0
+ end
+end else h_fuzz := 0;
+decr(h_fuzz); {when used, we watch for |h-max_h| exceeding this value}
+if h_fuzz<0 then h_fuzz:=99; {corresponds to default of \.{100sp}}
+
+if odd(VAX_cli_present('VFUZZ')) then
+begin
+ k:=VAX_cli_get_value('VFUZZ',buffer); buffer:=buffer+' ';
+ @<Copy qualifier into |spec_par|@>;
+ if rd_scaled_pt(v_fuzz) then
+ begin
+ print_ln(' --- assuming scaled points');
+@.assuming scaled points@>
+ write_ln(' --- assuming scaled points',crlf);
+ term_offset:=0
+ end
+end else v_fuzz := 0;
+decr(v_fuzz);
+if v_fuzz<0 then v_fuzz:=99
+
+@ The program can support the traditional LN03 (and LN03-plus) printers (but
+not the LN03R ScriptPrinter, for which a DVI to PostScript program
+@^PostScript@>
+is required), the LN05 (DEClaser~2100) and the LN06 (DEClaser~2200).
+
+This variable reminds of which mode is in use:
+
+@<Glob...@>=
+@!device_type:(@!ln03,@!ln05,@!ln06);
+
+@ This section determines which value was used with the \.{/DEVICE\_TYPE}
+qualifier. It is an error (something's gone wrong with the command
+definition file) if this qualifier doesn't have a value.
+
+@<Determine the device type@>=
+device_type:=ln03;
+if not odd(VAX_cli_present('DEVICE_TYPE')) then
+ abort('No device type specified')
+@:fatal error No device type specified}{\quad\.{No device type specified}@>
+else
+ if odd(VAX_cli_present('DEVICE_TYPE.LN03')) then
+ device_type:=ln03
+ else
+ if odd(VAX_cli_present('DEVICE_TYPE.LN05')) then
+ device_type:=ln05
+ else
+ if odd(VAX_cli_present('DEVICE_TYPE.LN06')) then
+ device_type:=ln06
+
+@ The new DEClaser printers (models 2100 and 2200, otherwise known as the
+LN05 and LN06) are capable of a number of extra ``tricks'', compared with
+the original LN03; in particular, the DEClaser~2200 can print on both sides
+of the paper (``duplex'' printing). The \.{/print\_mode} qualifier of the
+command line interface allows us to select a number of different modes of
+operation.
+
+\noindent The possible modes are as follows:
+\yskip\hang\.{SIMPLEX} Print on one side of paper only; this is the default,
+and the only method compatible with the DEClaser~2100 (LN05) and the
+original LN03 (but see below).
+\yskip\hang\.{DUPLEX} Print on both sides of the paper; which page gets
+printed on the reverse of such a sheet is further controlled by the
+\.{/duplex\_by\_page\_numbers} qualifier.
+\yskip\hang\.{MASTER} Can be used in conjunction with the \.{DUPLEX} value
+to produce a master set of sheets for photocopying or other production
+process. The program behaves as if the printer were operating in duplex
+mode, but actually prints on only one side of the paper, and ``prints'' a
+blank page if it would have left the \\{verso} page blank. This option can
+be used with the DEClaser~2100 (LN05), and with the traditional LN03, even
+though those printers don't support genuine duplexing.
+\yskip\hang\.{TUMBLED} Can be used in conjunction with genuine duplex
+printing only (and thus is restricted to the DEClaser~2200). Causes
+\\{verso} (left-hand) pages to be printed upside-down, therefore making the
+final document suitable for binding along the short edge (long edge in
+landscape mode) to make a flip-chart style document.
+\yskip\hang\.{NORMAL} The opposite of \.{TUMBLED}. This is the default.
+
+\noindent Once again, we define an `enumeration' type with known values:
+
+@d default_print_mode=0
+@d true_simplex_normal=1
+@d true_simplex_tumbled=2
+@d true_duplex_normal=3
+@d true_duplex_tumbled=4
+@d duplex_master_normal=5
+@d duplex_master_tumbled=6
+@d ln03_master=7 {we have to handle this by software, since no printer support}
+
+@<Glob...@>=
+@!print_mode:default_print_mode..ln03_master;
+
+@ Here's where we analyse the \.{/print\_mode} qualifier, and set
+|print_mode| accordingly:
+
+@<Determine the desired |print_mode|@>=
+@<Determine the device type@>;
+print_mode:=default_print_mode;
+if odd(VAX_cli_present('PRINT_MODE')) then
+ if odd(VAX_cli_present('PRINT_MODE.DUPLEX')) then
+ if odd(VAX_cli_present('PRINT_MODE.MASTER')) then
+ if odd(VAX_cli_present('PRINT_MODE.TUMBLED')) then
+ print_mode:=duplex_master_tumbled
+ else print_mode:=duplex_master_normal
+ else
+ if odd(VAX_cli_present('PRINT_MODE.TUMBLED')) then
+ print_mode:=true_duplex_tumbled
+ else print_mode:=true_duplex_normal
+ else
+ if odd(VAX_cli_present('PRINT_MODE.TUMBLED')) then
+ print_mode:=true_simplex_tumbled
+ else print_mode:=true_simplex_normal;
+if device_type=ln03 then
+ if print_mode>=duplex_master_normal then
+ print_mode:=ln03_master
+ else
+ print_mode:=default_print_mode
+
+@ Now we decide which tray shall be used for the first and subsequent sheets
+
+@<Determine the desired \\{feed\_trays}@>=
+if odd(VAX_cli_present('FEED_TRAY')) then
+ if odd(VAX_cli_present('FEED_TRAY.ALL')) then
+ begin
+ read_tray('FEED_TRAY.ALL',first_tray);
+ following_tray:=first_tray
+ end
+ else
+ begin
+ read_tray('FEED_TRAY.FIRST',first_tray);
+ read_tray('FEED_TRAY.REST',following_tray)
+ end
+
+@ Here are the variables needed to save the print tray(s) selection; also
+one which determines in which manner duplexing shall take place
+
+@<Glob...@>=
+@!first_tray,@!following_tray:tray_type;
+@!duplex_by_page_numbers:boolean;
+
+@ When we are printing on both sides of the paper, or simulating that
+operation with the \.{MASTER} option on the \.{/PRINT\_MODE} qualifier, we
+will usually elect to print \\{verso} pages when the page number (held in
+|count[0]|) is even, and \\{recto} pages when it is odd (or zero). If two
+odd or two even pages appear in succession, the other side of the sheet will
+be left blank (or a blank page ejected in \.{MASTER} mode).
+
+This is the default mode of operation, when the \.{/DUPLEX\_BY\_PAGE\_NUMBERS}
+qualifier is present; if this qualifier is negated, then the \\{verso} side
+of the sheet will be covered with whatever page follows that printed on the
+\\{recto} side, regardless of the page number; no blank pages appear, unless
+explicitly generated by \TeX.
+
+@<Determine the desired |duplex_by_page_numbers|@>=
+duplex_by_page_numbers:=odd(VAX_cli_present('DUPLEX_BY_PAGE_NUMBERS'))
+
+@ After the dialogue is over, we print the options so that the user
+can see what \.{DVItoLN03} thought was specified.
+
+These macros allow us to show which |print_mode| and feed tray have been
+selected:
+
+@d show_print_mode==begin
+print('Print mode is ');
+case print_mode of
+ true_simplex_normal,true_duplex_normal,duplex_master_normal:
+ print('normal ');
+ true_simplex_tumbled,true_duplex_tumbled,duplex_master_tumbled:
+ print('tumbled ')
+endcases;
+if print_mode=ln03_master then print('ln03 ');
+if print_mode>=duplex_master_normal then print('master ');
+if print_mode>=true_duplex_normal then
+ print_ln('duplex')
+else
+ print_ln('simplex')
+end
+@#
+@d show_tray(#)==case # of
+ default_tray: print_ln('fed from the default tray');
+ top_tray: print_ln('fed from the top tray');
+ bottom_tray: print_ln('fed from the bottom tray');
+ envelope_feeder: print_ln('taken from the envelope feeder');
+ manual_feed: print_ln('manually fed')
+endcases
+
+@<Print all the selected options@>=
+print_ln('Options selected:');
+@.Options selected@>
+print(' Starting page = ');
+for k:=0 to start_vals do
+ begin if start_there[k] then print(start_count[k]:1)
+ else print('*');
+ if k<start_vals then print('.')
+ else print_ln(' ');
+ end;
+print_ln(' Maximum number of pages = ',max_pages:1);
+print_ln(' Printing starts ',top_marg:1,' pixels from the top of the paper, and');
+print_ln(' ',left_marg:1,' pixels from the left-hand edge');
+print_ln(' Orientation = ',orientation);
+print_ln(' Resolution = ',resolution:12:8,' pixels per inch');
+if new_mag>0 then print_ln(' New magnification factor = ',new_mag/1000:8:3);
+if h_fuzz>99 then print_ln(' Horizontal overruns less than ',
+ (h_fuzz+1)/65536.0:1:2,'pt will be ignored');
+if v_fuzz>99 then print_ln(' Depth overruns less than ',
+ (v_fuzz+1)/65536.0:1:2,'pt will be ignored');
+if (first_tray<>default_tray) or (following_tray<>default_tray) then
+ if first_tray<>following_tray then
+ begin
+ print('First sheet is '); show_tray(first_tray);
+ print('Following sheets are '); show_tray(following_tray)
+ end
+ else
+ begin
+ print('Paper is '); show_tray(first_tray)
+ end;
+if print_mode<>default_print_mode then
+ show_print_mode;
+if print_mode>=true_duplex_normal then
+begin
+ print('Duplexing is ');
+ if not duplex_by_page_numbers then print('not ');
+ print_ln('controlled by page numbers')
+end
+
+@* Defining fonts.
+\.{DVItoLN03} reads the postamble first and loads
+all of the fonts defined there; then it processes the pages. Therefore
+a \\{fnt\_def} command should match a previous definition if and only
+if the \\{fnt\_def} being processed is not in the postamble.
+
+
+Since the ``wanted'' pages are read twice, {\it viz.} whilst gathering the
+font usage statistics and to perform the actual type setting, font
+definitions in the \.{DVI} file will actually be met {\bf three} times. The
+original logic of \.{DVItype} using the global variable |in_postamble|
+covers the first two occasions during the initial scan and the reading of
+the postamble. The variable |substitution_pass| prevents us from getting a
+``font already defined'' message when each definition is met for the third
+time.
+
+@<Glob...@>=
+@!substitution_pass:boolean; {are we performing the actual type setting?}
+@!in_postamble:boolean; {are we reading the postamble?}
+
+@ @<Set init...@>=
+substitution_pass:=false;
+in_postamble:=false;
+
+@ Under the VAX/VMS operating system, no distinction is made between fonts
+names \.{cmr10} and \.{CMR10}, for example. However, if \TeX\ encounters
+a font name not written in the same case as those of the preloaded
+format in use, it will think it is a distinct font (and under some other
+operating systems, of course, the case of the name could be significant).
+The following function allows us to fold upper-case letters in a font name
+to lower-case, and thus avoid such infelicitous duplication.
+
+@p function lower(@!ch:ASCII_code): ASCII_code;
+begin
+ if (ch>="A") and (ch<="Z") then
+ lower:=ch+"a"-"A"
+ else
+ lower:=ch
+end;
+
+@ The following subroutine does the necessary things when a \\{fnt\_def}
+command is being processed.
+
+@p procedure define_font(@!e:integer); {|e| is an external font number}
+var @!f:0..max_fonts; {local index into font data structures}
+@!p:integer; {length of the area/directory spec}
+@!newly_defined: boolean; {first time font has been defined}
+@!n:integer; {length of the font name proper}
+@!c,@!q,@!d:integer; {check sum, scaled size, and design size}
+@!r:0..name_length; {index into |cur_name|}
+@!j,@!k:0..name_size; {indices into |names|}
+@!mismatch:boolean; {do names disagree?}
+begin if nf=max_fonts then capacity_exceeded('too many fonts (max fonts=',
+ max_fonts:1,')');
+@:capacity exceeded too many fonts}{\quad \.{too many fonts}@>
+if e > highest_font then highest_font := e;
+font_num[nf]:=e; f:=0; font_map[nf]:=nf;
+while font_num[f]<>e do incr(f);
+@<Read the font parameters into position for font |nf|, and
+ print the font name@>;
+if in_postamble then
+ begin if (f<nf) and not substitution_pass then
+ warning('---this font was already defined!');
+@:Warning: this font was already defined}{\quad \.{this font was already defined}@>
+ end
+else begin if f=nf then warning('---this font wasn''t loaded before!');
+@:Warning: this font wasn't loaded before}{\quad \.{this font wasn't loaded before}@>
+ end;
+newly_defined:=f=nf;@/
+@<Avoid reloading the font metrics, if identical font already present@>;
+if f=nf then @<Load the new font, unless there are problems@>
+else
+begin
+ @<Check that the current font definition matches the old one@>;
+ if newly_defined and (font_map[nf]<nf) then
+ begin
+ print('---is identical to font ',font_num[f]:1);
+@.is identical to font ...@>
+ incr(nf) {the ``new'' font is officially present, but remapped}
+ end
+end;
+end;
+
+@ When we reach the point at which it might be found necessary to read the
+\TeX\ font metrics from the \.{TFM} file, we can save a little effort if
+we've already loaded a font with identical name and at the same scaled size.
+In fact, this is essential with such virtual fonts as \.{recurse}, because
+otherwise we might go on loading the same \.{TFM} file \\{ad infinitum}!
+Variable |mismatch| is misused in the |while| loop such that the loop will
+exit if the name of font |f| is identical to that of font |nf|. If the
+names differ, the loop continues until |f=nf|.
+
+@<Avoid reloading the font metrics, if identical font already present@>=
+f:=font_map[f]; {it might already map elsewhere!}
+if f=nf then {it's got to \&{be} a new font, of course!}
+begin
+ f:=0; mismatch:=true;
+ while (f<nf) and mismatch do
+ begin
+ if font_scaled_size[f]=q then {don't try name unless same size}
+ @<Compare two font names, and set |mismatch| accordingly@>;
+ if mismatch then incr(f)
+ end; {|while f|}
+ if f<nf then {the font already exists, under a different identity}
+ font_map[nf]:=f;
+end
+
+@ If the \.{DVI} file has previously defined this font, we check that the
+parameters of this |fnt_def| command match those previously read: there's
+something amiss if they differ (and the user is supposed to determine what
+by using \.{DVItype}).
+
+@<Check that the current...@>=
+begin if font_check_sum[f]<>c then
+ warning('---checksum doesn''t match previous definition!');
+@:Warning: checksum doesn't match}{\quad\.{checksum doesn't match}@>
+if font_scaled_size[f]<>q then
+ warning('---scaled size doesn''t match previous definition!');
+@:Warning: scaled size doesn't match}{\quad\.{scaled size doesn't match}@>
+if font_design_size[f]<>d then
+ warning('---design size doesn''t match previous definition!');
+@:Warning: design size doesn't match}{\quad\.{design size doesn't match}@>
+@<Compare two font names, and set |mismatch| accordingly@>;
+if mismatch then warning('---font name doesn''t match previous definition!');
+@:Warning: font name doesn't match}{\quad\.{font name doesn't match}@>
+end
+
+@ This little chunk of code compares the font names stored in
+|names[font_name[f]..font_name[f+1]-1]| and
+|names[font_name[nf]..font_name[nf+1]-1]|; if any character differs, or the
+lengths of the names differ, then |mismatch| will be set.
+
+@<Compare two font names, and set |mismatch| accordingly@>=
+begin
+ j:=font_name[f]; k:=font_name[nf]; mismatch:=false;
+ while j<font_name[f+1] do
+ begin
+ if names[j]<>names[k] then mismatch:=true;
+ incr(j); incr(k);
+ end; {|while j|}
+ if k<>font_name[nf+1] then mismatch:=true
+end
+@ @<Read the font parameters into position for font |nf|...@>=
+c:=signed_quad; font_check_sum[nf]:=c;@/
+q:=signed_quad; font_scaled_size[nf]:=q;@/
+d:=signed_quad; font_design_size[nf]:=d;@/
+p:=get_byte; n:=get_byte;
+if font_name[nf]+n+p>name_size then
+ capacity_exceeded('too many names (name size=',name_size:1,')');
+@:capacity exceeded too many names}{\quad\.{too many names}@>
+font_name[nf+1]:=font_name[nf]+n+p;
+if not substitution_pass then
+ print('Font ',e:1,': ');
+if n+p=0 then print('null font name!')
+@.null font name@>
+else for k:=font_name[nf] to font_name[nf+1]-1 do names[k]:=lower(get_byte);
+incr(nf); if not substitution_pass then print_font(nf-1); decr(nf)
+
+@ @<Load the new font, unless there are problems@>=
+begin @<Move font name into the |cur_name| string@>;
+open_tfm_file;
+if (q<=0)or(q>=@'1000000000) then
+ abort('Font not loaded, bad scale (',q:1,')!')
+@:fatal error Font not loaded bad scale}{\qquad\.{bad scale}@>
+ else if (d<=0)or(d>=@'1000000000) then
+ abort('Font not loaded, bad design size (',d:1,')!')
+@:fatal error Font not loaded bad design size}{\qquad\.{bad design size}@>
+ else if in_TFM(q) then @<Finish loading the new font info@>;
+end
+
+@ Strictly speaking, we should derive the width of a `thin space' from
+|param[6]| in the |tfm_file|, but this program (in common with such paragons
+of virtue as \.{DVItype}!) doesn't bother to read that far in the file; so
+we assume that \.{1em} in the font is equivalent to the design size, and
+knowing that an \.{em} in the Computer Modern fonts is \.{18u\#} wide, take
+one-sixth of this to represent the `thin space'.
+
+@<Finish loading...@>=
+begin font_space[nf]:=q div 6; {this is a 3-unit ``thin space''}
+if (c<>0)and(tfm_check_sum<>0)and(c<>tfm_check_sum) then
+ warning('checksum doesn''t match; DVI=',c:1,' vs. TFM=',tfm_check_sum:1);
+@:Warning: checksum doesn\'t match}{\quad\.{checksum doesn't match}@>
+print('---loaded at size ',q:1,' DVI units');
+d:=round((100.0*conv*q)/(true_conv*d));
+if d<>100 then
+ print(' (this font is magnified ',d:1,'%)');
+@.this font is magnified@>
+incr(nf); {now the new font is officially present}
+font_space[nf]:=0; {for |out_space| and |out_vmove|}
+end
+
+@ The string |cur_name| is supposed to be set to the external name of the
+\.{TFM} file for the current font. This usually means that we need to
+prepend the name of the default directory, and
+to append the suffix `\.{.TFM}'. Furthermore, we change lower case letters
+to upper case, since |cur_name| is a \PASCAL\ string.
+If |p=0|, i.e., if no font directory has been specified, \.{DVItoLN03}
+is supposed to use the default font directory, which is a
+system-dependent place where the standard fonts are kept; in the current
+implementation, this will have been read into |tfm_directory| from the
+command-line qualifier \.{/font\UL directory}.
+@^system dependencies@>
+
+@<Move font name into the |cur_name| string@>=
+for k:=1 to name_length do cur_name[k]:=' ';
+if p=0 then
+ begin for k:=1 to tfm_directory.length do
+ cur_name[k]:=tfm_directory.body[k];
+ r:=tfm_directory.length;
+ end
+else r:=0;
+for k:=font_name[nf] to font_name[nf+1]-1 do
+ begin incr(r);
+ if r+4>name_length then
+ capacity_exceeded('font file name too long (max length=',name_length:1,')');
+@:capacity exceeded font file name}{\quad\.{font file name too long}@>
+ if (names[k]>="a")and(names[k]<="z") then
+ cur_name[r]:=xchr[names[k]-@'40]
+ else cur_name[r]:=xchr[names[k]];
+ end;
+cur_name[r+1]:='.'; cur_name[r+2]:='T'; cur_name[r+3]:='F'; cur_name[r+4]:='M'
+
+@* Accumulation of page. We save a page before outputting it, to minimize the
+complexity of the page for the LN03.
+
+The page is stored as a series of linked lists of ``segments'', with
+(potentially) one such list being stored for each pixel position in the
+vertical direction.
+
+The individual segments are a structure, containing the $x$-coordinates of the
+start and finish of the text. We also record the current font in which the
+text is to be set, and a pointer to the next segment in the list.
+
+We therefore declare here the structure to hold the segment, and an array of
+pointers, one for each vertical pixel position. We also provide a further two
+segment pointers, one for the ``current'' segment, and another pointing to a
+list of allocated, but otherwise unused, segments. Thus it is only necessary
+to call for storage allocation when the free list is exhausted.
+
+If a glyph proved to have too large a bitmap for it to have been downloaded
+as a character into the LN03, a segment was appended which references that
+glyph alone; this is necessary to ensure that the bitmaps are only output
+once the |eop| has been met, to accommodate changes of orientation brought
+about by \.{\\special} commands.
+
+@d max_text=max_print {Largest text segment held in a record}
+
+@<Types in the...@>=
+ @!string = varying [10] of char;
+ {to hold character representations of integers}
+ @!segment = packed record
+ @!next : ^segment; {pointer to next segment, or |nil|}
+ @!xs,@!xe : integer; {$x$-coords of start and finish of text}
+ @!font : integer; {LN03 downloaded font \#; external font for bitmaps}
+ @!ch : eight_bits; {character from LN03 internal font}
+ @!seg_type : (@!glyph_string,@!bitmap,@!sixel_dump);
+ @!direction : page_orientation; {|landscape| or |portrait|}
+ @!text : varying [max_text] of char; {sequence for output to printer}
+ end;
+
+@ There is one |seg_list| pointer for each possible horizontal row of pixels
+on the paper; |cur_seg| points to the current segment, whilst |free_list_seg|
+maintains a list of free segments. Any characters which would appear outside
+the bounds of the paper are accumulated in segments of the |lost_seg| list.
+
+@<Globals in the ...@>=
+ @!seg_list : array [y_land_min..paper_ht+y_port_min] of ^segment;
+ @!cur_seg, @!free_seg_list : ^segment;
+ @!lost_seg : ^segment; {For segments set off the paper}
+ @!seg_max : integer; {could be used for statistics}
+
+@ @<Set initial...@>=
+ free_seg_list:=nil; cur_seg:=nil; lost_seg:=nil;
+ for k:=y_land_min to paper_ht+y_port_min do seg_list[k]:=nil;
+ seg_max:=0;
+ top_of_page:=true;
+
+@ The procedure |new_segment| allocates storage for a new segment. The
+program maintains a |free_seg_list| to which processed segments are returned;
+however, if no free segments remain on this list (as will obtain on first use
+of the program), the \PASCAL\ |new| function is used to allocate an
+appropriate area.
+
+After the segment has been allocated, as many fields as possible are
+completed: (1) the |next| field points to the existing |seg_list| to which
+this new segment now belongs; (2) the |font| field records the font currently
+selected; (3) the |seg_list| is made to point to this new segment. If the
+text is known to be invalid (for the case in which it has been discovered that
+the text will not fit on the physical paper), then the new segment is added
+instead to the |lost_seg| list, and the |font| field is used to record the
+$y$-position at which \TeX\ had tried to locate the text.
+
+@p procedure new_segment(@!valid,@!offset:boolean;
+ @!font_code,@!ch_code:integer);
+ begin
+ @<Find or create a new |cur_seg|@> ;
+ @<Set fields of |cur_seg|@>
+ end; {|new_segment|}
+
+@ If the |free_seg_list| is empty, either we've never allocated any segments
+before, or we've used them all. We therefore use the standard \PASCAL\
+allocator function, |new|.
+
+Alternatively, we just detach the first segment from the |free_seg_list|.
+
+@<Find or create a new |cur_seg|@>=
+if free_seg_list = nil then
+begin new(cur_seg);
+ incr(seg_max)
+end else
+begin
+ cur_seg:=free_seg_list;
+ free_seg_list:=cur_seg^.next
+end
+
+@ If the character being set is correctly within the imaging area of the
+paper, we add the new segment to the segment list associated with its vertical
+position on the page, and record the |ln_font| in which the character shall be
+output.
+
+Alternatively, we add the segment to the list of |lost_seg|s, and use the
+|font| field to record the vertical |y_pos| at which \TeX\ \\{thought} it
+was imaging the text.
+
+References to actual paper positions are always offset by the setting of
+|left_marg| and |top_marg|.
+
+@d x_pos==hh+left_marg {Actual paper coordinates}
+@d y_pos==vv+top_marg
+
+@<Set fields of |cur_seg|@>=
+with cur_seg^ do
+ if valid then
+ begin
+ ch:=ch_code;
+ direction:=new_orient;
+ if offset then {oversized glyphs and sixel graphics inclusions}
+ begin
+ next:=seg_list[y_pos+bitmap_offset]; {Goes on `lower' list}
+ seg_type:=bitmap; {this is corrected externally if necessary}
+ font:=cur_font; {record index into fonts for later file opening}
+ seg_list[y_pos+bitmap_offset]:=cur_seg {Put at front of the list}
+ end
+ else
+ begin
+ next:=seg_list[y_pos];
+ seg_type:=glyph_string;
+ font:=font_code; {record number of a \\{downloaded} font}
+ seg_list[y_pos]:=cur_seg {Put at front of the list}
+ end
+ end else
+ begin next:=lost_seg; {Don't put it on paper}
+ font:=y_pos; {Remember where \TeX\ wanted to put it}
+ lost_seg:=cur_seg
+ end
+
+
+@ Procedure |finish_seg| is used to discard segments which record text which
+was set off the paper, after making appropriate error indications in the log
+(\.{TYP}) file. Discarded segments are returned to the |free_seg_list|.
+
+The procedure is also called when a glyph is met that cannot become a member
+of that held in |cur_seg|; this just results in |cur_seg:=nil|. The segment
+is already attached to some part of |seg_list| array, so nothing further is
+required, and nothing gets lost!
+
+@p procedure finish_seg;
+ begin
+ while (cur_seg<>nil) and (cur_seg=lost_seg) do
+ begin {We've got something set off the paper}
+ with cur_seg^ do
+ begin
+ warning('Characters ''',text,''' set off paper ');
+@:Warning: Characters set off paper}{\quad\.{Characters ... set off paper}@>
+ write_ln(term_out,'(see log file)',crlf);
+ print_ln('( x = ',xs:1,'..',xe:1,', y = ',font:1,' ) - ignored');
+ lost_seg:=next; next:=free_seg_list; free_seg_list:=cur_seg;
+ cur_seg:=lost_seg
+ end;
+ end;
+ cur_seg:=nil {Forget that we've got a current segment}
+ end;
+
+@ The function |str_int| yields a minimum length ASCII representation for its
+integer parameter |num|. It does this by invoking the VAX-\PASCAL\ specific
+function |dec(n,f,d)|, which yields an |f| character-long string containing
+the decimal representation of the integer |n| occupying |d| digits at the
+right-hand end of the string; if necessary leading `\.0' characters are
+inserted to ensure that |d| digits are printed. (The leading |f-d| characters
+of the string would be filled with the space character `\.\SP', but we
+ensure that |f| and |d| are both just wide enough to avoid such a problem!)
+
+@d VAX_decimal==@=dec@>
+
+@p function str_int(num : integer) : string;
+ var field,digits : integer;
+ begin if num = 0 then digits:=1 else
+ digits:=trunc(ln(abs(num))/ln(10))+1;
+ {$\bigl\lceil\log_{10}\vert\hbox{\\{num}}\vert\bigr\rceil$ is number of digits
+ required}
+ field:=digits;
+ if num < 0 then incr(field);
+ str_int:=VAX_decimal(num,field,digits)
+ end;
+
+@ We define here some non-printing control characters, which will later be
+required for control and escape sequences.
+
+@d LF==chr(@"0A)
+@d FF==chr(@"0C)
+@d esc==chr(@"1B) {The ASCII ESCape character}
+@d csi==chr(@"9B) {Control Sequence Introducer}
+@d dcs==chr(@"90) {Device Control String}
+@d st==chr(@"9C) {String Terminator}
+
+@ The following |move_forward| procedure includes within the text of a segment
+the appropriate LN03 |HPR| (Horizontal Position Relative) control sequence to
+instruct the printer to move the printing position to the right. This
+sequence consists of the control sequence introducer, |csi|, followed by the
+motion expressed in pixels, followed by the sequence terminator `\.a'.
+
+@p procedure move_forward(dist:integer);
+ begin
+ cur_seg^.text:=cur_seg^.text + csi+str_int(dist)+'a';
+ end;
+
+@ Because of the restrictions of \PASCAL, we have to make a |forward|
+declaration of procedure |do_page|. The procedure is called (recursively)
+to interpret the |dvi| bytes stored from a character packet in a virtual
+font. It also implements the normal operations for interpreting the
+contents of a page read from the \.{DVI} file.
+
+@p function do_page(@!vf_start:integer):boolean; forward;
+
+@ Procedure |ord_text| adds a single character, |ch|, taken from the
+|cur_font|, to a segment preparatory to its being ``set'' on the paper. The
+procedure cannot be declared at this point in the \.{WEB} source because it
+references a number of procedures that haven't yet been declared. However,
+we'll arrange for it to appear in the correct part of the \PASCAL\ later on.
+
+If the character is taken from a virtual font, and requires more than the
+simple operation of setting a single character from a single font, then this
+procedure calls |do_page| recursively to interpret the sequence of |dvi|
+bytes that have been stored into |vf| from the \.{VF} file.
+
+This macro is equivalent to |glyph_map(cur_font)(#)|, assuming that
+|cur_base=glyph_base[cur_font]|.
+
+@d cur_font_glyph(#)==glyphs[cur_base+#]
+
+@<Declare the |ord_text| Procedure@>=
+procedure ord_text(ch:integer);
+ var @!good : boolean;
+begin
+ with cur_font_glyph(ch) do
+ begin
+ @<Check if glyph appears within printable area@>;
+ @<Allocate segment to hold text string@>;
+ if loaded=virtual then
+ begin
+ finish_seg; {Whatever precedes this character to be treated
+separately}
+ if not do_page(seq_off) then
+ abort('VF packet failed [',cur_font:1,',',ch:1,']!');
+@:fatal error VF packet failed}{\quad\.{VF packet failed}@>
+ finish_seg; {Don't run into next character or record this one's
+width twice}
+ end
+ else begin
+ @<Ensure entered text does not overflow |cur_seg|@>;
+ @<Set character onto page@>
+ end
+ end
+end {|procedure ord_text|}
+
+@ If the character would be set off the physical paper addressable by the LN03
+printer, the segment belongs to the |lost_seg| list.
+
+@<Check if glyph appears within printable area@>=
+if (x_pos<x_min) or (x_pos>page_wid) or (y_pos<y_min) or (y_pos>page_len) then
+begin
+ good := false;
+ if (cur_seg<>nil) then
+ begin
+ if (cur_seg<>lost_seg) then
+ finish_seg {earlier glyphs OK, even though this is off paper}
+ else
+ if cur_seg^.font<>y_pos then finish_seg {these were off paper, but on
+ a different row}
+ end;
+end else@/
+begin {The character fits on the paper}
+ good := true;
+ if cur_seg<>nil then
+ begin
+ if cur_seg=lost_seg then finish_seg {report earlier off-paper chars}
+ else
+ if cur_seg^.seg_type=bitmap then finish_seg; {previous segment contains
+ single oversized glyph}
+ if loaded=no then finish_seg {this segment will be ditto}
+ end
+end
+
+@ If there is no |cur_seg| to hold the text, one is allocated, and the start and
+finish coordinates of the text therein recorded. The |text| field is set to be
+the null string.
+
+@<Allocate segment to hold text string@>=
+if cur_seg = nil then
+begin new_segment(good,loaded=no,font_code,ch);
+ cur_seg^.xs:=x_pos;
+ cur_seg^.xe:=x_pos;
+ cur_seg^.text:=''
+end
+
+@ Checks are made that this segment (1) would not produce too large a
+contiguous sequence of characters (which might therefore lead to an overlong
+output record); (2) that the character does not need to be positioned to the
+\&{left} of those already in the segment; (3) that the LN03 font used for this
+character is the same as that for the other characters of the segment. If any
+of these checks fail, we commence a new segment; these tests are bypassed if
+we're setting a single oversized glyph.
+
+If any additional rightward movement is needed, the appropriate escape sequence
+is added to the |text| in the |cur_seg|.
+
+@<Ensure entered text does not overflow |cur_seg|@>=
+if cur_seg^.seg_type=glyph_string then
+begin
+ if (VAX_length(cur_seg^.text)>=max_text-8) or
+ (x_pos<cur_seg^.xe) or
+ (font_code<>cur_seg^.font) then
+ begin finish_seg;
+ @<Allocate segment...@> {tests enumerated above failed}
+ end
+ else
+ if x_pos>cur_seg^.xe then {We need to move rightward}
+ move_forward(x_pos-cur_seg^.xe) {Add character to segment}
+end
+
+@ Characters whose glyphs proved too large to download in an LN03 font are
+saved up to be printed as a pixel dump; other glyphs are recorded in the
+current segment for imaging through the downloaded fonts.
+
+If the character being stored is only being recorded to support generation
+of an error message, it is translated back from ASCII to the external
+representation for printing of the message in the |type_file|.
+
+@<Set character onto page@>=
+if good then
+ with cur_seg^ do
+ case loaded of
+ yes:
+ text:=text+chr(char_code);
+ no, missing:
+ finish_seg; {needn't consider further}
+ othercases
+ do_nothing;
+ endcases
+else
+ cur_seg^.text:=cur_seg^.text+xchr[ch]
+
+
+@* Packed file format.
+This format was designed by Tomas Rokicki in August, 1985.
+@^Rokicki, Tomas@>
+
+It constitutes a compact representation of the data contained in a
+\.{GF} file. The information content is the same, but packed (\.{PK}) files
+are almost always less than half the size of their \.{GF} counterparts. They
+are also easier to convert into a raster representation because they do not
+have a profusion of \\{paint}, \\{skip}, and \\{new\_row} commands to be
+separately interpreted. In addition, the \.{PK} format expressedly forbids
+\&{special} commands within a character. The minimum bounding box for each
+character is explicit in the format, and does not need to be scanned for as in
+the \.{GF} format. Finally, the width and escapement values are combined with
+the raster information into character ``packets'', making it simpler in many
+cases to process a character.
+
+A \.{PK} file is organized as a stream of 8-bit bytes. At times, these bytes
+might be split into 4-bit nybbles or single bits, or combined into multiple
+byte parameters. When bytes are split into smaller pieces, the `first' piece
+is always the most significant of the byte. For instance, the first bit of
+a byte is the bit with value 128; the first nybble can be found by dividing
+a byte by 16. Similarly, when bytes are combined into multiple byte
+parameters, the first byte is the most significant of the parameter. If the
+parameter is signed, it is represented by two's-complement notation.
+
+The set of possible eight-bit values are separated into two sets, those that
+introduce a character definition, and those that do not. The values that
+introduce a character definition comprise the range from 0 to 239; byte values
+above 239 are interpreted commands. Bytes which introduce character
+definitions are called flag bytes, and various fields within the byte indicate
+various things about how the character definition is encoded. Command bytes
+have zero or more parameters, and can never appear within a character
+definition or between parameters of another command, where they would be
+interpeted as data.
+
+A \.{PK} file consists of a preamble, followed by a sequence of one or more
+character definitions, followed by a postamble. The preamble command must
+be the first byte in the file, followed immediately by its parameters.
+Any number of character definitions may follow, and any command but the
+preamble command and the postamble command may occur between character
+definitions. The very last command in the file must be the postamble.
+
+@ The packed file format is intended to be easy to read and interpret by
+device drivers. The small size of the file reduces the input/output overhead
+each time a font is defined. For those drivers that load and save each font
+file into memory, the small size also helps reduce the memory requirements.
+The length of each character packet is specified, allowing the character raster
+data to be loaded into memory by simply counting bytes, rather than
+interpreting each command; then, each character can be interpreted on a demand
+basis. This also makes it possible for a driver to skip a particular
+character quickly if it knows that the character is unused.
+
+@ First, the command bytes shall be presented; then the format of the
+Character definitions will be defined. Eight of the possible sixteen
+commands (values 240 through 255) are currently defined; the others are
+reserved for future extensions. The commands are listed below. Each command
+is specified by its symbolic name (e.g., \\{pk\_no\_op}), its opcode byte,
+and any parameters. The parameters are followed by a bracketed number
+telling how many bytes they occupy, with the number preceded by a plus sign if
+it is a signed quantity. (Four byte quantities are always signed, however.)
+
+\yskip\hang|pk_xxx1| 240 |k[1]| |x[k]|. This command is undefined in general;
+it functions as a $(k+2)$-byte \\{no\_op} unless special \.{PK}-reading
+programs are being used. \MF\ generates \\{xxx} commands when encountering
+a \&{special} string. It is recommended that |x| be a string having the form
+of a keyword followed by possible parameters relevant to that keyword.
+
+\yskip\hang\\{pk\_xxx2} 241 |k[2]| |x[k]|. Like |pk_xxx1|, but |0<=k<65536|.
+
+\yskip\hang\\{pk\_xxx3} 242 |k[3]| |x[k]|. Like |pk_xxx1|, but
+|0<=k<@t$2^{24}$@>|. \MF\ uses this when sending a \&{special} string whose
+length exceeds~255.
+
+\yskip\hang\\{pk\_xxx4} 243 |k[4]| |x[k]|. Like |pk_xxx1|, but |k| can be
+ridiculously large; |k| musn't be negative.
+
+\yskip\hang|pk_yyy| 244 |y[4]|. This command is undefined in general; it
+functions as a five-byte \\{no\_op} unless special \.{PK} reading programs
+are being used. \MF\ puts |scaled| numbers into |yyy|'s, as a result of
+\&{numspecial} commands; the intent is to provide numeric parameters to
+\\{xxx} commands that immediately precede.
+
+\yskip\hang|pk_post| 245. Beginning of the postamble. This command is
+followed by enough |pk_no_op| commands to make the file a multiple
+of four bytes long. Zero through three bytes are usual, but any number
+is allowed.
+This should make the file easy to read on machines which pack four bytes to
+a word.
+
+\yskip\hang|pk_no_op| 246. No operation, do nothing. Any number of
+|pk_no_op|'s may appear between \.{PK} commands, but a |pk_no_op| cannot be
+inserted between a command and its parameters, between two parameters, or
+inside a character definition.
+
+\yskip\hang|pk_pre| 247 |i[1]| |k[1]| |x[k]| |ds[4]| |cs[4]| |hppp[4]|
+|vppp[4]|. Preamble command. Here, |i| is the identification byte of the
+file, currently equal to 89. The string |x| is merely a comment, usually
+indicating the source of the \.{PK} file. The parameters |ds| and |cs| are
+the design size of the file in $1/2^{20}$ points, and the checksum of the
+file, respectively. The checksum should match the \.{TFM} file and the
+\.{GF} files for this font. Parameters |hppp| and |vppp| are the ratios
+of pixels per point, horizontally and vertically, multiplied by $2^{16}$; they
+can be used to correlate the font with specific device resolutions,
+magnifications, and ``at sizes''. Usually, the name of the \.{PK} file is
+formed by concatenating the font name (e.g., amr10) with the resolution at
+which the font is prepared in pixels per inch multiplied by the magnification
+factor, and the letters \.{PK}. For instance, amr10 at 300 dots per inch
+should be named AMR10.300PK; at one thousand dots per inch and magstephalf,
+it should be named AMR10.1095PK.
+
+@ We put a few of the above opcodes into definitions for symbolic use by
+this program.
+
+@d pk_id = 89 {the version of \.{PK} file described}
+@d pk_xxx1 = 240 {\&{special} commands}
+@d pk_yyy = 244 {\&{numspecial} commands}
+@d pk_post = 245 {postamble}
+@d pk_no_op = 246 {no operation}
+@d pk_pre = 247 {preamble}
+
+@ The \.{PK} format has two conflicting goals; to pack character raster and
+size information as compactly as possible, while retaining ease of translation
+into raster and other forms. A suitable compromise was found in the use of
+run-encoding of the raster information. Instead of packing the individual
+bits of the character, we instead count the number of consecutive `black' or
+`white' pixels in a horizontal raster row, and then encode this number. Run
+counts are found for each row, from the top of the character to the bottom.
+This is essentially the way the \.{GF} format works.
+Instead of presenting each row individually, however, let us concatenate all
+of the horizontal raster rows into one long string of pixels, and encode this
+row. With knowledge of the width of the bit-map, the original character glyph
+can be easily reconstructed. In addition, we do not need special commands to
+mark the end of one row and the beginning of the next.
+
+Next, let us put the burden of finding the minimum bounding box on the part
+of the font generator, since the characters will usually be used much more
+often than they are generated. The minimum bounding box is the smallest
+rectangle which encloses all `black' pixels of a character. Let us also
+eliminate the need for a special end of character marker, by supplying
+exactly as many bits as are required to fill the minimum bounding box, from
+which the end of the character is implicit.
+
+Let us next consider the distribution of the run counts. Analysis of several
+dozen pixel files at 300 dots per inch yields a distribution peaking at four,
+falling off slowly until ten, then a bit more steeply until twenty, and then
+asymptotically approaching the horizontal. Thus, the great majority of our
+run counts will fit in a four-bit nybble. The eight-bit byte is attractive for
+our run-counts, as it is the standard on many systems; however, the wasted four
+bits in the majority of cases seems a high price to pay. Another possibility
+is to use a Huffman-type encoding scheme with a variable number of bits for
+each run-count; this was rejected because of the overhead in fetching and
+examining individual bits in the file. Thus, the character raster definitions
+in the \.{PK} file format are based on the four-bit nybble.
+
+@ The analysis of the pixel files yielded another interesting statistic: fully
+37\char`\%\
+of the raster rows were duplicates of the previous row. Thus, the \.{PK}
+format allows the specification of repeat counts, which indicate how many times
+a horizontal raster row is to be repeated. These repeated rows are taken out
+of the character glyph before individual rows are concatenated into the long
+string of pixels.
+
+For elegance, we disallow a run count of zero. The case of a null raster
+description should be gleaned from the character width and height being equal
+to zero, and no raster data should be read. No other zero counts are ever
+necessary. Also, in the absence of repeat counts, the repeat value is set to
+be zero (only the original row is sent.) If a repeat count is seen, it takes
+effect on the current row. The current row is defined as the row on which the
+first pixel of the next run count will lie. The repeat count is set back to
+zero when the last pixel in the current row is seen, and the row is sent out.
+
+This poses a problem for entirely black and entirely white rows, however. Let
+us say that the current row ends with four white pixels, and then we have five
+entirely empty rows, followed by a black pixel at the beginning of the next
+row, and the character width is ten pixels. We would like to use a repeat
+count, but there is no legal place to put it. If we put it before the white
+run count, it will apply to the current row. If we put it after, it applies
+to the row with the black pixel at the beginning. Thus, entirely white or
+entirely black repeated rows are always packed as large run counts (in this
+case, a white run count of 54) rather than repeat counts.
+
+@ Now let us turn our attention to the actual packing of the run counts and
+repeat counts into nybbles. There are only sixteen possible nybble values.
+We need to indicate run counts and repeat counts. Since the run counts are
+much more common, we will devote the majority of the nybble values to them.
+We therefore indicate a repeat count by a nybble of 14 followed by a packed
+number, where a packed number will be explained later. Since the repeat
+count value of one is so common, we indicate a repeat one command by a single
+nybble of 15. A 14 followed by the packed number 1 is still legal for a
+repeat one count, however. The run counts are coded directly as packed
+numbers.
+
+For packed numbers, therefore, we have the nybble values 0 through 13. We
+need to represent the positive integers up to, say, $2^{31}-1$. We would
+like the more common smaller numbers to take only one or two nybbles, and
+the infrequent large numbers to take three or more. We could therefore
+allocate one nybble value to indicate a large run count taking three or more
+nybbles. We do this with the value 0.
+
+@ We are left with the values 1 through 13. We can allocate some of these, say
+|dyn_f|, to be one-nybble run counts.
+These will work for the run counts |1..dyn_f|. For subsequent run
+counts, we will use a nybble greater than |dyn_f|, followed by a second nybble,
+whose value can run from 0 through 15. Thus, the two-byte nybble values will
+run from |dyn_f+1..(13-dyn_f)*16+dyn_f|. We have our definition of large run
+count values now, being all counts greater than |(13-dyn_f)*16+dyn_f|.
+
+We can analyze our several dozen pixel files and determine an optimal value of
+|dyn_f|, and use this value for all of the characters. Unfortunately, values
+of |dyn_f| that pack small characters well tend to pack the large characters
+poorly, and values that pack large characters well are not efficient for the
+smaller characters. Thus, we choose the optimal |dyn_f| on a character basis,
+picking the value which will pack each individual character in the smallest
+number of nybbles. Legal values of |dyn_f| run from 0 (with no one-byte run
+counts) to 13 (with no two-byte run counts).
+
+@ Our only remaining task in the coding of packed numbers is the large run
+counts. We use a scheme suggested by D.~E.~Knuth
+@^Knuth, D.~E.@>
+which will simply and elegantly represent arbitrarily large values. The
+general scheme to represent an integer |i| is to write its hexadecimal
+representation, with leading zeros removed. Then we count the number of
+digits, and prepend one less than that many zeros before the hexadecimal
+representation. Thus, the values from one to fifteen occupy one nybble;
+the values sixteen through 255 occupy three, the values 256 through 4095
+require five, etc.
+
+For our purposes, however, we have already represented the numbers one
+through |(13-dyn_f)*16+dyn_f|. In addition, the one-nybble values have
+already been taken by our other commands, which means that only the values
+from sixteen up are available to us for long run counts. Thus, we simply
+normalize our long run counts, by subtracting |(13-dyn_f)*16+dyn_f+1| and
+adding 16, and then representing the result according to the scheme above.
+
+@ The final algorithm for decoding the run counts based on the above scheme
+might look like this, assuming a procedure called \\{pk\_nyb} is available
+to get the next nybble from the file, and assuming that the global
+|repeat_count| indicates whether a row needs to be repeated. Note that this
+routine is recursive, but since a repeat count can never directly follow
+another repeat count, it can only be recursive to one level.
+
+@<Packed number procedure@>=
+function pk_packed_num : integer ;
+var i, j, k : integer ;
+begin
+ i := get_nyb ;
+ if i = 0 then begin
+ repeat j := get_nyb ; incr(i) ; until j <> 0 ;
+ while i > 0 do begin j := j * 16 + get_nyb ; decr(i) ; end ;
+ pk_packed_num := j - 15 + (13-dyn_f)*16 + dyn_f ;
+ end else if i <= dyn_f then
+ pk_packed_num := i
+ else if i < 14 then
+ pk_packed_num := (i-dyn_f-1)*16+get_nyb+dyn_f+1
+ else begin
+ if i = 14 then
+ repeat_count := pk_packed_num
+ else
+ repeat_count := 1 ;
+ pk_packed_num := pk_packed_num ;
+ end ;
+end ;
+
+@ For low resolution fonts, or characters with `gray' areas, run encoding can
+often make the character many times larger. Therefore, for those characters
+that cannot be encoded efficiently with run counts, the \.{PK} format allows
+bit-mapping of the characters. This is indicated by a |dyn_f| value of
+14. The bits are packed tightly, by concatenating all of the horizontal raster
+rows into one long string, and then packing this string eight bits to a byte.
+The number of bytes required can be calculated by |(width*height+7) div 8|.
+This format should only be used when packing the character by run counts takes
+more bytes than this, although, of course, it is legal for any character.
+Any extra bits in the last byte should be set to zero.
+
+@ At this point, we are ready to introduce the format for a character
+descripter. It consists of three parts: a flag byte, a character preamble,
+and the raster data. The most significant four nybbles of the flag byte
+yield the |dyn_f| value for that character. (Notice that only values of
+0 through 14 are legal for |dyn_f|, with 14 indicating a bit mapped character;
+thus, the flag bytes do not conflict with the command bytes, whose upper nybble
+is always 15.) The next bit (with weight 16) indicates whether the first run
+count is a black count or a white count, with a one indicating a black count.
+For bit-mapped characters, this bit should be set to a zero. The next bit
+(with weight 8) indicates whether certain later parameters (referred to as size
+parameters) are given in one-byte or two-byte quantities, with a one indicating
+that they are in two-byte quantities. The last two bits are concatenated on to
+the beginning of the length parameter in the character preamble, which will be
+explained below.
+
+However, if the last three bits of the flag byte are all set (normally
+indicating that the size parameters are two-byte values and that a 3 should be
+prepended to the length parameter), then a long format of the character
+preamble should be used instead of one of the short forms.
+
+Therefore, there are three formats for the character preamble, and which one
+is used depends on the least significant three bits of the flag byte. If the
+least significant three bits are in the range zero through three, the short
+format is used. If they are in the range four through six, the extended short
+format is used. Otherwise, if the least significant bits are all set, then
+the long form of the character preamble is used. The preamble formats are
+explained below.
+
+\yskip\hang Short form: |flag[1]| |pl[1]| |cc[1]| |tfm[3]| |dm[1]| |w[1]|
+|h[1]| |hoff[+1]| |voff[+1]|.
+If this format of the character preamble is used, the above
+parameters must all fit in the indicated number of bytes, signed or unsigned
+as indicated. Almost all of the standard \TeX\ font characters fit; the few
+exceptions are fonts such as \.{aminch}.
+
+\yskip\hang Extended short form: |flag[1]| |pl[2]| |cc[1]| |tfm[3]| |dm[2]|
+|w[2]| |h[2]| |hoff[+2]| |voff[+2]|. Larger characters use this extended
+format.
+
+\yskip\hang Long form: |flag[1]| |pl[4]| |cc[4]| |tfm[4]| |dx[4]| |dy[4]|
+|w[4]| |h[4]| |hoff[4]| |voff[4]|. This is the general format which
+allows all of the
+parameters of the \.{GF} file format, including vertical escapement.
+\vskip\baselineskip
+The |flag| parameter is the flag byte. The parameter |pl| (packet length)
+contains the offset
+of the byte following this character descripter, with respect to the beginning
+of the |tfm| width parameter. This is given so a \.{PK} reading program can,
+once it has read the flag byte, packet length, and character code (|cc|), skip
+over the character by simply reading this many more bytes. For the two short
+forms of the character preamble, the last two bits of the flag byte should be
+considered the two most-significant bits of the packet length. For the short
+format, the true packet length might be calculated as |(flag mod 4)*256+pl|;
+for the extended format, it might be calculated as |(flag mod 4)*65536+pl|.
+
+The |w| parameter is the width and the |h| parameter is the height in pixels
+of the minimum bounding box. The |dx| and |dy| parameters are the horizontal
+and vertical escapements, respectively. In the short formats, |dy| is assumed
+to be zero and |dm| is |dy| but in pixels;
+in the long format, |dx| and |dy| are both
+in pixels multiplied by $2^{16}$. The |hoff| is the horizontal offset from the
+upper left pixel to the reference pixel; the |voff| is the vertical offset.
+They are both given in pixels, with right and down being positive. The
+reference pixel is the pixel which occupies the unit square in \MF; the
+\MF\ reference point is the lower left hand corner of this pixel. (See the
+example below.)
+
+@ \TeX\ requires that all characters which have the same character codes
+modulo 256 also have the same |tfm| widths, and escapement values. The \.{PK}
+format does not itself make this a requirement, but in order for the font to
+work correctly with the \TeX\ software, this constraint should be observed.
+The current version of \TeX\ (1.5) cannot output character codes greater
+than 255 anyway.
+
+Following the character preamble is the raster information for the
+character, packed by run counts or by bits, as indicated by the flag byte.
+If the character is packed by run counts and the required number of nybbles
+is odd, then the last byte of the raster description should have a zero
+for its least significant nybble.
+
+@ As an illustration of the \.{PK} format, the character \char4\ from the font
+amr10 at 300 dots per inch will be encoded. This character was chosen
+because it illustrates some
+of the borderline cases. The raster for the character looks like this (the
+row numbers are chosen for convenience, and are not \MF's row numbers.)
+
+\vskip\baselineskip
+\centerline{\vbox{\baselineskip=10pt
+\halign{\hfil#\quad&&\hfil#\hfil\cr
+0& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+1& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+2& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+3& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+4& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+5& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+6& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+7\cr
+8\cr
+9& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+10& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+11& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+12& & & & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M& & \cr
+13& & & & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M& & \cr
+14& & & & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M& & \cr
+15& & & & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M& & \cr
+16& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+17& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+18& & & & &M&M& & & & & & & & & & & & &M&M& & \cr
+19\cr
+20\cr
+21\cr
+22& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+23& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+24& & &M&M& & & & & & & & & & & & & & & & &M&M\cr
+25& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+26& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+27& & &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+28&*& &M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M\cr
+&\hphantom{M}&\hphantom{M}\cr
+}}}
+The width of the minimum bounding box for this character is 20; its height
+is 29. The `*' represents the reference pixel; notice how it lies outside the
+minimum bounding box. The |hoff| value is $-2$, and the |voff| is~28.
+
+The first task is to calculate the run counts and repeat counts. The repeat
+counts are placed at the first transition (black to white or white to black)
+in a row, and are enclosed in brackets. White counts are enclosed in
+parentheses. It is relatively easy to generate the counts list:
+\vskip\baselineskip
+\centerline{82 [2] (16) 2 (42) [2] 2 (12) 2 (4) [3]}
+\centerline{16 (4) [2] 2 (12) 2 (62) [2] 2 (16) 82}
+\vskip\baselineskip
+Note that any duplicated rows that are not all white or all black are removed
+before the repeat counts are calculated. The rows thus removed are rows 5, 6,
+10, 11, 13, 14, 15, 17, 18, 23, and 24.
+
+@ The next step in the encoding of this character is to calculate the optimal
+value of |dyn_f|. The details of how this calculation is done are not
+important here; suffice it to say that there is a simple algorithm which in one
+pass over the count list can determine the best value of |dyn_f|. For this
+character, the optimal value turns out to be 8 (atypically low). Thus, all
+count values less than or equal to 8 are packed in one nybble; those from
+nine to $(13-8)*16+8$ or 88 are packed in two nybbles. The run encoded values
+now become (in hex, separated according to the above list):
+\vskip\baselineskip
+\centerline{\tt D9 E2 97 2 B1 E2 2 93 2 4 E3}
+\centerline{\tt 97 4 E2 2 93 2 C5 E2 2 97 D9}
+\vskip\baselineskip\noindent
+which comes to 36 nybbles, or 18 bytes. This is shorter than the 73 bytes
+required for the bit map, so we use the run count packing.
+
+@ The short form of the character preamble is used because all of the
+parameters fit in their respective lengths. The packet length is therefore
+18 bytes for the raster, plus
+eight bytes for the character preamble parameters following the character
+code, or 26. The |tfm| width for this character is 640796, or {\tt 9C71C} in
+hexadecimal. The horizontal escapement is 25 pixels. The flag byte is
+88 hex, indicating the short preamble, the black first count, and the
+|dyn_f| value of 8. The final total character packet, in hexadecimal, is:
+\vskip\baselineskip
+$$\vbox{\halign{\hfil #\quad&&{\tt #\ }\cr
+Flag byte&88\cr
+Packet length&1A\cr
+Character code&04\cr
+|tfm| width&09&C7&1C\cr
+Horizontal escapement (pixels)&19\cr
+Width of bit map&14\cr
+Height of bit map&1D\cr
+Horizontal offset (signed)&FE\cr
+Vertical offset&1C\cr
+Raster data&D9&E2&97\cr
+&2B&1E&22\cr
+&93&24&E3\cr
+&97&4E&22\cr
+&93&2C&5E\cr
+&22&97&D9\cr}}$$
+
+@* Routines to access the packed pixel files. We shall require routines to
+access the packed file; sometimes this may even require access to individual
+\&{bits}, but mostly we shall be accessing bytes or nybbles.
+
+We also need a function that will get a single byte from the \.{PK} file.
+Again, buffering may be done in this procedure.
+
+@p function pk_byte : eight_bits ;
+var temp : eight_bits ;
+begin
+ temp := pxl_file^[pk_loc mod VAX_block_length] ;
+ pk_loc := pk_loc + 1 ;
+ if (pk_loc mod VAX_block_length)=0 then
+ get(pxl_file) ;
+ pk_byte := temp ;
+end ;
+
+@ As we are reading the packed file, we often need to fetch (signed or
+unsigned) 16 and 32 bit quantities. Here we have three procedures to do this.
+
+@p function get_16 : integer ;
+var a : integer ;
+begin a := pk_byte ; get_16 := a * 256 + pk_byte ; end ;
+@#
+function get_16_signed : integer ;
+var a : integer ;
+begin a := get_16; if a>32767 then a := a-65536;
+ get_16_signed := a ; end ;
+@#
+function get_32 : integer ;
+var a : integer ;
+begin a := get_16 ; if a > 32767 then a := a - 65536 ;
+get_32 := a * 65536 + get_16 ; end ;
+
+@ Now we read and check the preamble of the pk file. In the preamble, we
+find the |hppp|, |dsize|, |checksum|. After we've read the preamble, no
+character locators will be available.
+
+@d two_to_the_20th==@"100000
+
+@<Read preamble@>=
+pk_loc:=0; char_num:=-1; {Ensure that |char_num| is ``undefined''}
+if pk_byte <> pk_pre then abort('Bad pk file, pre command missing') ;
+@:fatal error Bad pk file ...}{\quad\.{Bad pk file}@>
+@:fatal error Bad pk file pre command missing}{\qquad\\{pre }\.{command missing}@>
+if pk_byte <> pk_id then abort('Bad pk file, wrong version') ;
+@:fatal error Bad pk file wrong version}{\qquad\.{wrong version}@>
+pk_j := pk_byte ;
+for pk_i := 1 to pk_j do dummy:=pk_byte ; { Skip over PK file comment }
+dsize := get_32 ;
+checksum := get_32 ;
+hppp := get_32 ; vppp := get_32 ;
+magnification := round(hppp * 72.27 / 65536) ; {|* 5| in PKtoPX}
+if hppp <> vppp then warning('PK font pixels non-square');
+@:Warning: PK font pixels non-square}{\quad\.{PK font pixels non-square}@>
+dsize:=(dsize/two_to_the_20th)*(magnification/resolution);
+for pk_i:=0 to 255 do ch_loc[pk_i]:=0;
+
+@ Of course, we need to define the above variables.
+
+@<Glob...@>=
+@!checksum : integer ; {checksum of pixel file}
+@!hppp, @!vppp : integer ; {horizontal and vertical points per inch}
+@!pk_loc : integer ; { byte currently being accessed in |pk_file| }
+@!dummy : integer ; { used to ``absorb'' unwanted bytes from |pk_file| }
+
+@* Character unpacking.
+This is the procedure where we read the character packet and decode it into
+standard pixel raster format; if a glyph is encountered that is not used in the
+present document, its packet is skipped. We create one row at a time, checking
+for repeat
+commands, and then repeat the row as many times as is necessary. The information
+gleaned from the beginning of the character packet is to be placed in various
+local variables. We also check that the length of the character packet is
+correct.
+
+If the character's raster is null (as is the case with the invisible fonts used
+by Sli\TeX), the |num_cols| and |num_rows| are set to suitable dummy values (see
+the section $\langle$Complete remainder of Character Definition
+parameters$\rangle$ for further information).
+
+@<Unpack and write character@>=
+dyn_f := flag_byte div 16 ;
+flag_byte := flag_byte mod 16 ;
+turn_on := flag_byte >= 8 ;
+if turn_on then flag_byte := flag_byte - 8 ;
+if flag_byte = 7 then
+ @<Read long character preamble@>
+else if flag_byte > 3 then
+ @<Read extended short character preamble@>
+else
+ @<Read short character preamble@> ;@/
+byte_width:=(num_cols+7) div 8; {Bytes required per row in |lnf_file|}
+ch_loc[char_num]:=end_of_packet-packet_length;
+with glyph_map(TeX_font)(char_num) do
+ if loaded=wanted then
+ begin
+ base:=ras_beg+ras_len;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Read and translate raster description@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>
+ end
+ else
+ @<Skip through unwanted raster@> ;
+if end_of_packet <> pk_loc then abort('Bad pk file! Bad packet length.')
+@.Bad pk file@>
+
+@ A simplified version of this code is also used when printing the bitmap of
+an oversized glyph in sixels.
+
+@<Unpack and store character@>=
+dyn_f := flag_byte div 16 ;
+flag_byte := flag_byte mod 16 ;
+turn_on := flag_byte >= 8 ;
+if turn_on then flag_byte := flag_byte - 8 ;
+if flag_byte = 7 then
+ @<Read long character preamble@>
+else if flag_byte > 3 then
+ @<Read extended short character preamble@>
+else
+ @<Read short character preamble@> ;@/
+byte_width:=(num_cols+7) div 8; {Bytes required per row in |lnf_file|}
+ch_loc[char_num]:=end_of_packet-packet_length;
+if char_num=ch then
+begin
+ base:=ras_beg+ras_len;@/
+ @<Read and translate raster description@>;
+end
+else
+ @<Skip through unwanted raster@> ;
+if end_of_packet <> pk_loc then abort('Bad pk file! Bad packet length.')
+@.Bad pk file@>
+
+@ We need a whole lot of globals used but not defined up there. Some of these
+have the same names as certain fields of |pxl_dir_type|, or of local variables
+of procedures |add_txf_to_lnf| and |copy_char|. This is in order that the
+segments of \.{WEB} code invoked above reference these globals therein, but the
+appropriate local variables when within those procedures (when being used for
+\.{PXL} files).
+
+@<Glob...@>=
+@!pk_i, @!pk_j : integer ; {index pointers}
+@!flag_byte : integer ; {the byte that introduces the character definition}
+@!end_of_packet : integer ; {where we expect the end of the packet to be}@/
+{Following are also names of fields in a record of type |pxl_dir_type|}@/
+@!num_cols, @!num_rows : sixteen_bits; {width and height of character}
+@!x_off, @!y_off : signed_word ; {$x$ and $y$ offsets of character}
+@!tfm_width : integer ; {character tfm width}
+@#
+@!tfms : array [0..255] of integer ; {character tfm widths}
+@!dx, @!dy : integer ; {escapement values}
+@!dxs, @!dys : array [0..255] of integer ; {escapement values}
+@!ch_loc : array[0..255] of integer; {has the character been seen (and where)?}
+@!dyn_f : integer ; {dynamic packing variable}
+@!char_num : integer ; {the character we are reading}
+@!packet_length : integer ; {the length of the character packet}
+@!base : integer ; {index into |lnf_bytes|}
+@!to_where : integer ; {\&{cf.} |to_where| in |copy_char|}
+@!len : integer ; {\&{cf.} |len| in |copy_char|}
+@!byte_width : integer ; {Bytes per row in the |lnf_file| bitmap}
+
+@ To skip over the raster of an unwanted character, we can simply jump forward
+in the PK file to |end_of_packet|.
+
+@<Skip through unwanted raster@>=
+while pk_loc<end_of_packet do dummy := pk_byte;
+
+@ Now, the preamble reading modules. First, we have the general case: the
+long character preamble format.
+
+@<Read long character preamble@>=
+begin
+ packet_length := get_32 ; char_num := get_32 ;
+ end_of_packet := packet_length + pk_loc ;
+ packet_length := packet_length + 9 ;
+ tfm_width := get_32 ;
+ dx := get_32 ; dy := get_32 ;
+ num_cols := get_32 ;
+ num_rows := get_32 ;
+ x_off := get_32 ; y_off := get_32 ;
+end
+
+@ This module reads the character preamble with double byte parameters.
+
+@<Read extended short character preamble@>=
+begin
+ packet_length := (flag_byte - 4) * 65536 + get_16 ;
+ char_num := pk_byte ;
+ end_of_packet := packet_length + pk_loc ;
+ packet_length := packet_length + 4 ;
+ pk_i := pk_byte ;
+ tfm_width := pk_i * 65536 + get_16 ;
+ dx := get_16 * 65536 ;
+ dy := 0 ;
+ num_cols := get_16 ;
+ num_rows := get_16 ;
+ x_off := get_16_signed ; y_off := get_16_signed ;
+end
+
+@ Here we read the most common character preamble, that with single byte
+parameters.
+
+@<Read short character preamble@>=
+begin
+ packet_length := flag_byte * 256 + pk_byte ;
+ char_num := pk_byte ;
+ end_of_packet := packet_length + pk_loc ;
+ packet_length := packet_length + 3 ;
+ pk_i := pk_byte ;
+ tfm_width := pk_i * 65536 + get_16 ;
+ dx := pk_byte * 65536 ;
+ dy := 0 ;
+ num_cols := pk_byte ;
+ num_rows := pk_byte ;
+ x_off := pk_byte ; y_off := pk_byte ;
+ if x_off > 127 then x_off := x_off - 256 ;
+ if y_off > 127 then y_off := y_off - 256 ;
+end
+
+@ Now we have the most important part of unravelling packed pixel files, where
+we actually interpret the commands in the raster description. First of all,
+we need a procedure to get a single nybble from the file, as well as one to
+get a single bit.
+
+We also are now able to ``declare'' |pk_packed_num|.
+
+@p function get_nyb : integer ;
+var temp : eight_bits ;
+begin
+ if bit_weight = 0 then begin
+ input_byte := pk_byte ;
+ bit_weight := 16 ;
+ end ;
+ temp := input_byte div bit_weight ;
+ input_byte := input_byte - temp * bit_weight ;
+ bit_weight := bit_weight div 16 ;
+ get_nyb := temp ;
+end ;
+@#
+function get_bit : boolean ;
+var temp : boolean ;
+begin
+ bit_weight := bit_weight div 2 ;
+ if bit_weight = 0 then begin
+ input_byte := pk_byte ;
+ bit_weight := 128 ;
+ end ;
+ temp := input_byte >= bit_weight ;
+ if temp then
+ input_byte := input_byte - bit_weight ;
+ get_bit := temp ;
+end ;
+@#
+@t\4@>@<Packed number procedure@>
+
+@ Now, the globals to help communication between these procedures.
+
+@<Glob...@>=
+@!input_byte : eight_bits ; {the byte we are currently decimating}
+@!bit_weight : eight_bits ; {weight of the current bit}
+@!nybble : eight_bits ; {the current nybble}
+@!row_addr : integer ; {whereabouts in |lnf_file| of start of each pixel row}
+@!bitmap_start : integer ; {and of start of \&{first} pixel row}
+
+@ And the main procedure.
+
+@<Read and translate raster description@>=
+bit_weight := 0 ; row_addr:=base; {Note where row of pixels starts}
+bitmap_start:=base;
+if dyn_f = 14 then
+ @<Get raster by bits@>
+else @<Create normally packed raster@>
+
+@ If |dyn_f=14|, then we need to get the raster representation
+one bit at a time.
+
+@<Get raster by bits@>=
+begin
+for pk_i := 1 to num_rows do begin
+ bite:=0; bite_weight:=7;
+ for pk_j := 1 to num_cols do begin
+ if get_bit then bite:=bite+power[bite_weight];
+ decr(bite_weight);
+ if bite_weight<0 then begin
+ bite_weight:=7;
+ put_lnf(bite);
+ bite:=0
+ end
+ end;
+ if bite_weight<7 then put_lnf(bite)
+end;
+end
+
+@ We need the |power| array, which contains powers of two, as well as the |bite|
+variable (which accumulates eight pixels) and |bite_weight|, which directs which
+pixel is to be ``blackened''. The array |gpower| contains 0..8 black pixels,
+staring at the left-hand end.
+
+@<Globals...@>=
+@!bite : integer; {accumulates 8 pixels to go to |lnf_file|}
+@!bite_weight : integer; {next bit of |bite| to be filled (leftmost=0)}
+@!power:array [0..7] of integer; {|power[i]| contains $2^{7-i}$}
+@!gpower:array [0..8] of integer; {|gpower[i]| contains ones in leftmost |i| bits}
+
+@ @<Set initial...@>=
+power[0]:=128;
+for i:=1 to 7 do power[i]:=power[i-1] div 2;
+gpower[0]:=0;
+for i:=1 to 8 do gpower[i]:=gpower[i-1]+power[i-1];
+
+@ Otherwise, we translate the bit counts into the raster rows. |run_ct|
+contains the number of bits of the current color, and |turn_on| indicates
+whether or not they should be black. |rows_left| contains the number of
+rows to be sent.
+
+@<Create normally packed raster@>=
+begin
+rows_left := num_rows ;
+h_bit := num_cols ;
+repeat_count := 0 ;
+bite:=0; bite_weight:=8;
+while rows_left > 0 do begin
+ run_ct := pk_packed_num ;
+ while run_ct>0 do begin
+ if (run_ct<bite_weight) and (run_ct<h_bit) then begin
+ if turn_on then
+ bite:=bite+gpower[bite_weight]-gpower[bite_weight-run_ct];
+ h_bit:=h_bit-run_ct;
+ bite_weight:=bite_weight-run_ct;
+ run_ct:=0
+ end
+ else if (run_ct>=h_bit) and (h_bit<=bite_weight) then begin
+ if turn_on then
+ bite:=bite+gpower[bite_weight]-gpower[bite_weight-h_bit];
+ put_lnf(bite); bite:=0;
+ for pk_i:=1 to repeat_count do
+ for pk_j:=1 to byte_width do repeat_row;
+ row_addr:=base;
+ rows_left := rows_left - repeat_count - 1 ;
+ repeat_count := 0 ;
+ bite:=0; bite_weight:=8;
+ run_ct := run_ct - h_bit ;
+ h_bit := num_cols ;
+ end
+ else begin
+ if turn_on then bite:=bite+gpower[bite_weight];
+ put_lnf(bite);
+ run_ct:=run_ct-bite_weight;
+ h_bit:=h_bit-bite_weight;
+ bite:=0; bite_weight:=8
+ end
+ end;
+ turn_on := not turn_on ;
+end ;
+if (rows_left <> 0) or (h_bit <> num_cols) then
+ abort('Bad pk file---more bits than required!');
+@.Bad pk file@>
+end
+
+@ We need to declare the repeat flag, bit counter, and color flag here.
+
+@<Glob...@>=
+@!repeat_count : integer ; {how many times to repeat the next row?}
+@!rows_left : integer ; {how many rows left?}
+@!turn_on : boolean ; {are we black here?}
+@!h_bit : integer ; {what is our horizontal position?}
+@!run_ct : integer ; {how many bits of current color left?}
+
+@ Another necessary section of code skips over any \MF\ \.{special}s between
+characters and before or after the postamble.
+
+It is convenient to use the following definitions in creating readable |case|
+statements; they will also be necessary for interpreting the \.{DVI} file.
+
+@d four_cases(#)==#,#+1,#+2,#+3
+@d eight_cases(#)==four_cases(#),four_cases(#+4)
+@d sixteen_cases(#)==eight_cases(#),eight_cases(#+8)
+@d thirty_two_cases(#)==sixteen_cases(#),sixteen_cases(#+16)
+@d sixty_four_cases(#)==thirty_two_cases(#),thirty_two_cases(#+32)
+
+@p procedure skip_specials ;
+var i, j, k : integer ;
+begin
+ repeat
+ flag_byte := pk_byte ;
+ if flag_byte >= pk_xxx1 then
+ case flag_byte of
+ four_cases(pk_xxx1):
+begin
+ i := 0 ;
+ for j := pk_xxx1 to flag_byte do i := 256 * i + pk_byte ;
+ for j := 1 to i do dummy:=pk_byte ;
+end ;
+ pk_yyy: dummy:=get_32 ;
+ pk_post: do_nothing;
+ pk_no_op: do_nothing;
+ pk_pre, eight_cases(pk_pre+1):
+ abort('Bad pk file; unexpected byte: ', flag_byte:1,'!') ;
+@.Bad pk file@>
+ endcases ;
+ until (flag_byte < pk_xxx1) or (flag_byte = pk_post) ;
+end ;
+
+@* Pixel file format.
+A \.{PXL} file is an expanded raster description of a single font at a
+particular resolution and contains essentially the same information as
+that contained in a \.{GF} file. \.{PXL} files are used by many existing
+device-driver programs for dot matrix devices. By convention, \.{PXL} files
+are for 200 pixels per inch. However, the LN03 requires pixel files generated
+at 300 pixels per inch; the font naming conventions for access to these files
+are specified elsewhere.
+
+All words in a \.{PXL} files are in 32-bit format, with the four lower
+bits zero on 36-bit machines. The raster information is contained in a
+sequence of binary words which record white pixels as zeros and black
+pixels as ones.
+
+The first word of the \.{PXL} file and the last word contain the |pxl_id|
+which is currently equal to 1001.
+
+This first word is followed by a sequence of raster information words where
+each line of pixels in the glyphs is represented by one or more words of
+binary information. The number of words used to represent each row of pixels
+for any particular glyph is fixed and it is set by the value of
+|max_m-min_m+1| for that particular glyph. Each white pixel is represented by
+a zero and each black pixel is represented by a one in the corresponding bit
+positions (the first 32 only of each word on 36-bit machines). The unused bit
+positions toward the end of each set of words for each row of pixels are
+filled with zeros. It should be noted that this representation is more
+wasteful of space than it needs to be, but it may possibly simplify the
+subsequent use of the information by a device-driver program.
+
+The font directory follows, occupying a fixed position with respect to the
+end of the file (in words 517 through 6 from this end), and assigns 4
+words for each of the potential 128 different glyphs that could be
+contained in this particular font in the order of their ascending ascii
+values (not in the order that the glyphs appear in the raster section,
+which may be entirely arbitrary). This means that the first four words are
+for the ascii zero glyph. All four words reserved for any missing glyphs
+are set to zero. A detailed description of these directory entries is given in
+the next section.
+
+The final five words in the \.{PXL} file contain information relative to
+the entire file.
+
+The first of these five words is a checksum which should
+match the checksum contained in the \.{TFM} file that \TeX\ used in
+reference to this font, although, if this checksum is zero, no validity
+checking will be done.
+
+The second of these five words is an integer that is 1000 times the
+magnification factor at which this font was produced.
+
+The third word contains the design size of the font measured in \.{FIXes}
+($2^{-20}$ unmagnified points).
+
+The fourth word contains a pointer to the first word of the font directory.
+
+The fifth (and last word of the entire file) contains a duplicate of the
+|pxl_id| as contained in the first word of the file.
+
+@d pxl_id=1001 {current version of \.{PXL} format}
+
+@ As mentioned above, the pixel file's glyph directory consists of four
+longwords for each possible glyph. The use of each of these longwords is as
+follows:
+
+\yskip\hang\&{Word 0.} This is treated as being split into two unsigned
+sixteen-bit quantities, containing the Pixel Width in the left half-word (the
+leftmost 16 bits) and the Pixel Height in the right half-word (the next 16
+bits). These dimensions are those of the smallest bounding-box, measured in
+pixels, and they have nothing necessarily to do with the width and height
+figures that appear in the \.{TFM} file.
+
+\yskip\hang\&{Word 1.} Again is split into two sixteen-bit half-words, but
+this time they are each treated as \\{signed} quantities. Together, these give
+the offset of the glyph's reference point \&{from} its upper-left-hand corner
+of the bounding box, measured in pixels, with the $x$-offset ($\delta x$) in the left
+half-word and the $y$-offset ($\delta y$) in the right half-word. Two's complement
+representation is used. Remember that although the positive $x$ direction means
+`rightward' and positive $y$ is `downward' on the page, these offsets specify
+the distance \&{to} the reference point \&{from} the upper left-hand corner of
+the raster with +ve $x$ implying that the left-most column of the raster is to
+the \&{left} of the reference point, and +ve $y$ implying that the top-most
+row of the raster is \&{above} the baseline.
+
+\yskip\hang\&{Word 2.} This contains the number of the word in this \.{PXL}
+file where the Raster Description for this particular glyph begins, measured
+from the first word of the file, which is numbered zero.
+
+\yskip\hang\&{Word 3.} Contains the \.{TFM} width, measured in \.{FIXes},
+where 1 \.{FIX} is $1/(2^{20})$ times the design size.
+
+We now define an appropriate structure to hold such directory entries:
+
+@<Types in the outer block@>=
+ @!signed_word= [word] -32768..32767;@/
+ @!pxl_dir_type=packed record@/
+ num_cols,num_rows : sixteen_bits;
+ x_off,y_off : signed_word;
+ addr : [byte(4)] integer;
+ tfm_width : [byte(4)] integer
+ end;
+
+@ We need a |file| object to reference the pixel file, and also an array to hold
+its directory. Furthermore, when a pixel file directory is read in, we need
+variables |magnification| and |dsize| to hold quantities taken from the last
+five longwords of the file.
+
+@<Globals in the outer block@>=
+ @!pxl_file: byte_file;
+ @!pxl_dir : packed array [0..127] of pxl_dir_type;
+ @!pxl_block,@!pxl_ptr : integer;
+ @!pxl_size:integer;
+ @!magnification,@!dsize:real;
+
+@*Procedures to access the pixel file. The following definitions and
+declarations provide a means of accessing bytes, words (signed \AM\ unsigned)
+and longwords in the |pxl_file|.
+
+@d pxl_byte(#)==pxl_file^[#]
+
+@d pxl_word(#)==(pxl_byte(#+1)+256*pxl_byte(#))
+
+@d pxl_long(#)==(pxl_byte(#+3)+256*(pxl_byte(#+2)+@|256*(pxl_byte(#+1)+@|
+256*pxl_byte(#))))
+
+@d must_get(#)==
+ if # = VAX_block_length then
+ begin get(pxl_file,VAX_continue);
+ incr(pxl_block); #:=0
+ end
+
+@p procedure move_to_pxl(n:integer);
+ begin
+ if n div VAX_block_length <> pxl_block then
+ begin pxl_block:=n div VAX_block_length;
+ VAX_find_block(pxl_file,pxl_block+1,VAX_continue)
+ end;
+ pxl_ptr:=n mod VAX_block_length
+ end;
+
+@ The |long_pxl| function reads a longword (in Bigendian order) from the
+|pxl_file| and converts it to correct (signed) VAX longword notation.
+
+@p function long_pxl(var index:integer) : integer;
+ begin
+ if pxl_byte(index)<=@"80 then
+ long_pxl:=pxl_long(index)
+ else
+ long_pxl:=pxl_byte(index+3)+256*(pxl_byte(index+2)+256*(
+ pxl_byte(index+1)+256*(pxl_byte(index)-256)));
+ index:=index+4;
+ must_get(index)
+ end;
+
+@ The |sign_pxl_word| function reads a signed shortword (two bytes).
+
+@p function sign_pxl_word(var index:integer) : integer;
+ begin
+ if pxl_byte(index)>=@"80 then
+ sign_pxl_word:=pxl_word(index)-@"10000
+ else
+ sign_pxl_word:=pxl_word(index);
+ index:=index+2;
+ must_get(index)
+ end;
+
+@ The |word_pxl| function reads an unsigned two-byte word.
+
+@p function word_pxl(var index:integer) : integer;
+ begin word_pxl:=pxl_word(index);
+ index:=index+2; must_get(index)
+ end;
+
+@*Handle rasters of oversized glyphs. Because of a physical limitation of the
+LN03, it is not legal to download the glyph of a character which would occupy
+more than 5,700 bytes. (Details appear under ``\&{Copy one character's
+rasters}''.)
+
+Any such glyph which has not been downloaded will have its |loaded| flag set to
+|no| in its |glyph_map| entry. When we attempt to add such a character to
+the output lists, we add instead a separate segment which indicates that it
+holds a single oversized glyph. When this segment is eventually processed,
+we output the glyph itself as a bitmap dump, using sixel graphics.
+
+To save us having to keep on opening and closing the pixel file containing
+the glyph, we maintain the ``name'' of the currently open file in a global
+string, and only open a new file if the glyph required comes from a
+different \TeX\ font. The global variable |open_file_name| is a textual
+representation of the full file specification of the currently open pixel
+file. (Note that this same variable name also appears as a \&{formal
+parameter} of the |add_txf_to_lnf| function; it is referenced in the
+$\langle$Open the file containing the glyph bitmaps$\rangle$ W{\mc EB}
+section, used in the following code, and the aforementioned function.)
+
+@<Globals...@>=
+@!open_file_name : file_spec;
+
+@ Of course, when we start (and even after we've created the font file(s) for
+down-loading) there is no pixel file open. Let's indicate that:
+
+@<Set initial...@>=
+open_file_name:='';
+
+@ Procedure |print_glyph| has to refer to |change_pixel_file|, which is more
+convenient to declare along with the font downloading procedures. So we'll
+cheat and put a |forward| declaration here!
+
+@p procedure change_pixel_file( TeX_font : integer); forward;
+
+@ The procedure |print_glyph| opens the associated pixel file (if necessary)
+by calling |change_pixel_file|. It firstly outputs absolute positioning
+commands to establish the correct ``printing'' position (the strange
+|bitmap_offset| was incorporated when the reference to the glyph was stored
+in the |segment|), and then outputs suitable escape sequences to locate the
+printing position at the correct offset relative to that position, as
+determined by the glyph's first pixel relative to its reference point.
+
+If the pixels come from a |pixel_file|, then we can locate the required
+character glyph through the character directory. In the case of a
+|packed_file|, it may happen than this character has already been output, and
+so its position within the file is known; in this case either it was the last
+character read (has already been dumped as a bitmap), when its glyph will be in
+the |lnf_file|: otherwise we position |pk_loc| to the correct position in the
+file. If the character has never been read (|ch_loc=0|) then we read and
+process characters into the \&{same} part of the |lnf_file| until the desired
+character has been read. When reading |packed_file|s, we utilize an entry in
+the |pxl_dir| in preference to the globals |x_off|, etc, so save repetition of
+many lines of \.{WEB} code.
+
+The lines of pixel rasters are then output, six at a time, in sixel graphics
+format.
+
+@p procedure print_glyph(@!glyph_seg : segment; @!y_loc : integer);
+ var @!sixel_line : array [1..6,1..300] of eight_bits;
+ @!i,@!j,@!k,@!l,@!m,@!n,@!len : integer;
+ @!last_sixel,@!matching: integer;
+ @!ch : integer;
+ @<Declare the procedure |put_sixel|@> ;
+begin
+ write_ln(ln3_file);
+ change_pixel_file(glyph_seg.font);@/
+ write(ln3_file,csi,y_loc:1,'d',csi,glyph_seg.xs:1,'`');
+ ch:=glyph_seg.ch;
+ with pxl_dir[ch] do
+ begin
+ @<Read raster for oversized glyph into memory@> ;
+ @<Prepare to write glyph bitmap at correct position@> ;
+ write_ln(ln3_file,dcs,'9;0;1q'); {Prepare to meet a sixel dump!}
+ @<Convert glyph's raster to sixels@>;
+ write_ln(ln3_file,st); {Finish sixel dump}
+ end; {with}
+end;
+
+@ We are making use of a record of |pxl_dir| to hold the various quantities
+regarding the dimensions of the glyph which have been (or are about to be) read
+from the font file. In the case of an unpacked raster, we need only position
+the file to the correct longword, but for a packed file, it's now time to
+start reading the bytes and reconstituting the raster in a free part of the
+|lnf_file|.
+
+@<Read raster for oversized glyph into memory@>=
+if pxl_ident=pixel_file then move_to_pxl(addr*4)
+else begin
+ ras_beg:=2*VAX_block_length;
+ if ch_loc[ch]=0 then
+ @<Find packed raster and read into memory@> ;
+ if char_num<>ch then
+ @<Move back in packed file and read raster into memory@> ;
+ base:=ras_beg
+end;
+
+@ If the character has not yet been read from the packed font file, we need to
+read forwards until the character is met. We then are able to access its
+raster, which will have been created in memory as the character was read.
+The character cannot be missing or the font download would not have resulted
+in the |loaded| field having the value |no|.
+
+@<Find packed raster and read into memory@>=
+repeat ras_len:=0;@/
+ @<Unpack and store character@>;
+ skip_specials
+until (ch_loc[ch]<>0) or (flag_byte=pk_post);
+
+@ If we've previously read the wanted character's glyph, but it has since been
+superseded by another's, we need to backtrack the packed font file to the
+correct position and read the raster all over again.
+
+@<Move back in packed file and read raster into memory@>=
+begin {character not already in |lnf_file|}
+ pk_loc:=ch_loc[ch];
+ VAX_find_block(pxl_file,(pk_loc div VAX_block_length)+1,VAX_continue);
+ ras_len:=0; flag_byte:=pk_byte; {We know there's no \.{special}s}@/
+ @<Unpack and store character@>;
+ skip_specials
+end
+
+@ Having read the glyph into memory, we now need to position the LN03 to start
+writing its first sixel at the appropriate position relative to the reference
+point. We do this by sending Horizontal and Vertical Positioning control
+sequences, either Relative for forward movement, or Backward when negative
+movement is necessary. The signs are reversed because the offsets are those
+of the top left-most pixel of the glyph relative to the reference point.
+
+@<Prepare to write glyph bitmap at correct position@>=
+if x_off<0 then
+ write(ln3_file,csi,abs(x_off):1,'a') {Horizontal Position Relative}
+else
+ if x_off>0 then write(ln3_file,csi,x_off:1,'j');{Horizontal Position Backward}
+if y_off<0 then
+ write(ln3_file,csi,abs(y_off):1,'e') {Vertical Position Relative}
+else
+ if y_off>0 then write(ln3_file,csi,y_off:1,'k') {Vertical Position Backward}
+
+@ This routine outputs the sixel character, |x|, in the optimum sixel encoding
+making use of repeat counts if the same sixel is repeated more than twice.
+The current output record is terminated if it's getting too long, and a new
+one commenced.
+
+@<Declare the procedure |put_sixel|@>=
+procedure @!put_sixel(x:integer);
+begin
+ if x = last_sixel then incr(matching) else
+ @<Output |matching| copies of |last_sixel|@> ;
+ if len >=128 then
+ begin
+ write_ln(ln3_file);
+ len:=0
+ end
+end
+
+@ If we have a new sixel (|x|) which differs from the previous one
+(|last_sixel|) we have to output the latter the correct number of times. The
+number of successive calls of |put_sixel| will have been counted in
+|matching|. After performing the output, we record that |x| has now been
+``output'' once.
+
+@<Output |matching| copies of |last_sixel|@>=
+begin
+ if matching < 3 then
+ @<Output explicit copies of |last_sixel|@>
+ else
+ @<Output repeat count for |last_sixel|@> ;
+ matching:=1;
+ last_sixel:=x
+end
+
+@ If |last_sixel| has only been output once or twice, we send the explicit
+copies of it
+
+@<Output explicit copies of |last_sixel|@>=
+begin
+ len:=len+matching;
+ while matching > 0 do
+ begin
+ write(ln3_file,chr(last_sixel));
+ decr(matching)
+ end
+end
+
+@ On the other hand, it's more efficient to use a sixel repeat count if there
+are three or more copies of |last_sixel| required. The introducer for such a
+repeat count is the `\.!' character, which is followed by the ASCII character
+representation of the count. The actual sixel to be output then follows this
+count.
+
+@<Output repeat count for |last_sixel|@>=
+begin
+ write(ln3_file,'!',matching:1,chr(last_sixel));
+ len:=len+5
+end
+
+@ To produce the bitmap sixel dump of the glyph, we read the pixels into the
+array |sixel_line|; this contains 6 rows, each capable of holding 300
+|eight_bits|, containing 8 pixels of the character's raster. We index this with
+|k|, which thus runs |1..6|
+
+Variable |i| is used to run through the |num_rows| lines of rasters, whilst |j|
+indexes the bytes from the pixel file, and into |sixel_line|.
+
+@<Convert glyph's raster to sixels@>=
+i:=0; k:=1;
+while i < num_rows do
+begin
+ @<Read rows of pixels into sixel buffer@>;
+ incr(k); incr(i);
+ if k > 6 then
+ begin
+ @<Output line of sixels@>;
+ k:=1
+ end
+end;
+if k>1 then
+begin
+ while k <= 6 do
+ begin {Fill in bottom incomplete rows of sixels}
+ for j:=1 to (num_cols+7) div 8 do
+ sixel_line[k,j]:=0;
+ incr(k)
+ end;
+ @<Output line of sixels@>
+end
+
+@ The following section outputs the six rows of pixels in
+|sixel_line| as $8\times{|num_cols|}$ columns of sixel graphics.
+
+The variable |m| runs through the values 128,64,32,..,1, and is used to divide
+an |eight_bit| to extract the most-significant bit of eight pixels in rows 6..1
+(indexed by |n|) of |sixel_line|. Each bit is transferred into the least
+significant bit of |l|, initially zeroed for each sixel.
+
+As each sixel is completed, it is output to the \.{LN3} file. To prevent the
+output of too many characters to the |ln3_file|, which is of type |text|, the
+output is broken every 128 bytes. A ``graphics'' end-of-record is inserted
+after every line of sixels.
+
+@<Output line of sixels@>=
+len:=0; last_sixel:=0; matching:=0;
+for j:=1 to (num_cols+7) div 8 do
+begin
+ m:=128;
+ while m>0 do
+ begin
+ l:=0;
+ for n:=6 downto 1 do
+ if odd(sixel_line[n,j] div m) then
+ l:=2*l + 1
+ else
+ l:=2*l;
+ put_sixel(l+63);
+ m:=m div 2
+ end;
+end;
+put_sixel(0); {Flushes the |last_sixel| from the ``buffer''}
+write_ln(ln3_file,'-') {Sixel `CR-LF'}
+
+
+@ We are now in a position to be able to include the declaration of |ord_text|
+into the \PASCAL\ generated from the \.{WEB}
+
+@p @<Declare the |ord_text| Procedure@>;
+@*Output the individual segments forming a page. At the end of each page, we
+have a number of linked lists containing each of the segments set on any
+individual ``line'' of the paper. We have to re-order these, such that they
+are output in the most efficient manner, with appropriate changes of (lnf)
+font as necessary.
+
+When pages are actually being ``set'', |font_in_use[lnf]| will contain either
+-1, which indicates that the LN03 font required is not currently mapped to a
+|SGR| (Select Graphic Rendition) code, or a number in the range |0..9|, from
+which the |SGR| font number to be used to invoke that font as the current one is
+derived (by adding 10).
+
+The array |who_uses| maps these |SGR| indices back to the number of an LN03
+font. Finally, the current |SGR| in use is held in |cur_out|, to minimise
+the number of |SGR| commands that need to be included in the output stream.
+
+@<Globals...@>=
+@!font_in_use:array [0..max_lnfonts] of -1..max_SGR;
+@!who_uses:array [0..max_SGR] of -1..max_lnfonts;
+@!cur_out:0..max_SGR;
+
+@ First of all, we shall require a procedure to output an arbitrary string
+(most commonly an escape sequence) to the LN03 printer. This will typically
+be used to activate the |HPA| (Horizontal Position Absolute) control sequence.
+
+@p procedure esc_out(str:varying[str_len] of char); {Escape sequence to LN3}
+ begin
+ ln3_cnt:=ln3_cnt+VAX_length(str);
+ write(ln3_file,str)
+ end;
+
+@ Then we require a procedure to output as much of a segment as
+possible to the current line, and delete that section from the segment as
+stored before returning.
+
+One useful extension of VAX-\PASCAL\ that we utilize are the functions |min|
+and |max|. These each take an arbitrary number of parameters, and return a
+result, of the same type, that is equal to the smallest or largest
+(numerically) of the parameters provided.
+
+@d VAX_min==@= min@>
+@d VAX_max==@= max@>
+
+@p procedure print_seg;
+ var @!text_len,@!uselen,@!i,@!j,@!ln_font,@!delta_x:integer;
+ @!csi_present:integer;
+ begin
+ with cur_seg^ do
+ begin
+ text_len:=VAX_length(text);
+ uselen:=VAX_min(text_len,max_line-ln3_cnt,max_print-ln3_print);
+ if (uselen>0) or (text_len=0) then {`Use' empty segment}
+ begin {Otherwise, throw segment back if none of it will fit!}
+ if uselen <> text_len then {Text won't all fit!}
+ @<Determine position at which to split output line@>;
+ @<Select correct font, if necessary@> ;
+ @<Set horizontal position on paper@>;
+ write(ln3_file,substr(text,1,uselen));
+ @<Count characters output to printer, perform split if necessary@>
+ end
+ end
+ end;
+
+@ If a segment is too long to fit in its entirety upon the output line to be
+sent to the LN03, we split it into smaller segments. This cannot be done at
+an arbitrary cut-off point, since the segment might include embedded control
+sequences (which will be |HPR| ones, ending with `\.a'); therefore, we need to
+select a split point which will not destroy the contiguity of such sequences.
+
+@<Determine position at which to split output line@>=
+begin
+ csi_present:=0;
+ @<Find rightmost \.{ESC} or \.{CSI} character in segment@> ;
+ @<Split \\{after} the |HPR| control sequence, if in last 8 characters@>
+end
+
+@ Finding the right-most control sequence starts off by locating the character
+which introduces it; this used to be \.{ESC} but nowadays the eight-bit
+\.{CSI} character is used instead.
+
+@<Find rightmost \.{ESC} or \.{CSI} character in segment@>=
+for i:=1 to uselen do
+ if (text[i] = csi) or (text[i] = esc) then csi_present:=i
+
+@ If that right-most control sequence introducer was earlier than eight
+characters from the end of the part of the string that we \\{can} use (or
+didn't exist) there's no need to split the segment. Otherwise, we need to
+locate the `\.a' which completes the Horizontal Position Relative sequence,
+and split after it.
+
+@<Split \\{after} the |HPR| control sequence, if in last 8 characters@>=
+if (csi_present>0) and ((uselen-csi_present)<=8) then
+begin i:=csi_present;
+ while (i<uselen) and (text[i]<>'a') do incr(i);
+ if text[i]<>'a' then uselen:=csi_present-1
+end
+
+@ Whenever we output a segment, we must ensure that the LN03 will image the
+characters therein from the correct downloaded font. The following code
+firstly checks whether the font is currently designated (and thus selectable)
+within the LN03. It then selects the necessary font by outputting a suitable
+|SGR| (Select Graphic Rendition) to access the appropriately designated font.
+
+@<Select correct font, if necessary@>=
+if font_in_use[font]<0 then {not currently designated}
+@<Select Graphic Rendition@>;
+if font_in_use[font]<>cur_out then
+begin cur_out:=font_in_use[font];@/
+ esc_out(csi+str_int(10+cur_out)+'m'); {|SGR| for the font}
+end
+
+@ Although we permit a maximum of |max_lnfonts| to have been downloaded to the
+LN03, the machine itself may only access one of ten of these through the
+ISO-standard |SGR| (Select Graphic Rendition) control sequence. If a
+different font is required, it may be necessary to designate that it shall be
+selectable by a different |SGR| sequence.
+
+@<Select Graphic Rendition@>=
+begin
+ font_in_use[who_uses[max_SGR]]:=-1;
+ font_in_use[font]:=max_SGR;
+ who_uses[max_SGR]:=font;
+ esc_out(dcs+'1;'+str_int(10+max_SGR)+'}U0000'+@=dec@>(font,2,2)+
+ '002SK00GG'+st)
+end
+
+
+@ We need to output appropriate ISO-standard control sequences to position the
+segment at the correct position on the current line; if the segment is the
+first to be output on the current line, this positioning should use the |HPA|
+(Horizontal Position Absolute) sequence, otherwise the |HPR| (Horizontal
+Position Relative) sequence is preferred.
+
+@<Set horizontal position on paper@>=
+if cur_seg=out_list then {Leftmost segment of line}
+ esc_out(csi+str_int(xs)+'`') { HPA to |xs|}
+else@/
+begin
+ delta_x:=xs-prev_seg^.xe; {Distance from end of next leftward segment}
+ if delta_x>0 then esc_out(csi+str_int(delta_x)+'a') {HPR}
+ else if delta_x<0 then abort('Internal error (-ve delta x)')
+@:fatal error Internal error ...}{\quad\.{Internal error}@>
+@:fatal error Internal error negative delta x}{\qquad\.{(-ve delta x)}@>
+end
+
+@ After we have output the first |uselen| characters to the \.{LN3} file, we
+then check whether that's finished off this segment. If it has, we can
+discard the segment, but otherwise we perform the split at the predetermined
+point.
+
+@<Count characters output to printer, perform split if necessary@>=
+ln3_cnt:=ln3_cnt+uselen; ln3_print:=ln3_print+uselen;
+if uselen=text_len then
+ cur_seg:=nil {All of segment used}
+else
+ @<Split segment which would create too long an output line@>
+
+@ Having previously determined the split point for the segment (including none
+at all), we now reduce the segment to the part following that point.
+
+This is complicated by the fact that we must determine whereabouts we have
+actually got to on the current line. To do this, we increment the ``current
+position'' by each character's width, whilst any |HPR| sequences have to be
+``read'' in as numbers and added to the count.
+
+@<Split segment which would create too long an output line@>=
+begin i:=1;
+ while i<=uselen do
+ begin
+ if (text[i]<>esc) and (text[i]<>csi) then
+ xs:=xs+ch_widths[font,ord(text[i])]
+ else
+ @<Read back the horizontal skip specified in the |HPR| sequence@> ;
+ incr(i);
+ end;
+ text:=substr(text,uselen+1,text_len-uselen)
+end
+
+@ Whenever we meet a \.{ESC} or \.{CSI} character, we assume that it starts a
+Horizontal Position Relative command, locate the first digit of its parameter
+(which will follow a `\.[' after the \.{ESC} or come immediately after the
+\.{CSI}), and the `\.a' which finishes the control sequence. The characters in
+between represent a decimal number, which we can ``read'' using a Vax-\PASCAL\
+extension. The current placing position is then incremented by this amount.
+
+@<Read back the horizontal skip specified in the |HPR| sequence@>=
+begin
+ if text[i]=esc then j:=i+2 else j:=i+1;
+ while text[j]<>'a' do incr(j);
+ if text[i]=esc then
+ VAX_string_read(substr(text,i+2,j-i-2)+' ',delta_x)
+ else
+ VAX_string_read(substr(text,i+1,j-i-1)+' ',delta_x);
+ xs:=xs+delta_x; i:=j;
+end
+
+
+
+@ As we shall see later, if the string of characters in a \TeX\
+\.{\\special} command commences with the character string |'SX '| (i.e.,
+`old style'), or |'ln03:plotfi[le] '| or |'ln03:sixel '| (`new style'), a
+segment will be inserted into the page list referencing the appropriate
+file; when the time comes to process that segment, the following procedure
+will be invoked. The |text| field of |cur_seg| will be the name of a
+VAX/VMS file which is assumed to contain an image encoded into DEC's
+standard ``sixel'' format.
+
+This file is then opened, and the records therein copied to the \.{.LN3}
+file; the |y_position| parameter, and the starting position recorded in
+field |xs| are used in appropriate escape sequences to position this
+graphics dump at the desired position on the page before this operation.
+
+The name of the file included is reported on the terminal and in the log file.
+@p procedure Copy_sixel_file(@!y_position:integer);
+var
+ @!open_stat : integer; {records whether |open| was successful}
+ @!sixel_record, {holds records being copied from included file}
+ @!stat_msg : varying [256] of char; {just holds an error indication}
+ @!sixel_file : text; {The file of graphics details to be copied}
+begin
+ open(sixel_file,cur_seg^.text,@=readonly@>,@=256@>,
+ @=user_action@>:=file_open,VAX_continue);
+ open_stat := status(sixel_file);
+ if open_stat<>0 then
+ begin
+ case open_stat of
+ 2: stat_msg := 'PAS-E-ERRDUROPE';
+ 3: stat_msg := 'PAS-E-FILNOTFOU';
+ 5: stat_msg := 'PAS-E-ACCMETINC';
+ 6: stat_msg := 'PAS-E-RECLENINC';
+ 7: stat_msg := 'PAS-E-RECTYPINC';
+ 8: stat_msg := 'PAS-E-ORDSPEINC';
+ othercases
+ stat_msg := str_int(open_stat);
+ endcases;
+ error('Couldn''t open \special inclusion: ',cur_seg^.text,
+ ' - ignored (status=',stat_msg,')');
+@:Error: Couldn't open special inclusion}{\quad\.{Couldn't open \\special inclusion}@>
+ end else
+ begin
+ monitor(' ('+def_file_name);
+ print_ln('Sixel graphics included from: ',def_file_name);
+@.Sixel graphics included...@>
+ reset(sixel_file);
+ write(ln3_file,csi,y_position:1,'d',csi,cur_seg^.xs:1,'`');
+ while not eof(sixel_file) do
+ begin
+ read_ln(sixel_file,sixel_record);
+ write_ln(ln3_file,sixel_record)
+ end;
+ close(sixel_file,@=disposition:=save@>,VAX_continue);
+ monitor(') ');
+ write_ln(ln3_file,SSU_pixel); {Make sure that we still have pixel SSUs}
+ end;
+end;
+
+@ Whilst traversing the lists, we require some additional variables:
+During this output phase, we split the lines
+of output such that no line contains more than |max_line| characters
+altogether, of which no more than |max_print| may be printable ones. The
+counters |ln3_cnt| and |ln3_print| permit us to exercise this control. The
+|boolean| variable |top_of_page| controls the inclusion of a |FF| character in
+the output file to split the pages.
+
+If the page contains glyphs in both of the possible orientations, this is
+recorded in |two_orientations|. Segments corresponding to the orientation
+not currently being output are shuffled off onto the |deferred_list| whilst
+this processing takes place.
+
+@<Globals in the ...@>=
+ @!out_list,@!prev_seg,@!right_seg,@!left_seg:^segment;
+ @!x_left,@!x_max:integer;
+ @!ln3_cnt,@!ln3_print:integer;
+ @!still_fits,top_of_page:boolean;
+ @!two_orientations:boolean;
+ @!deferred_list:^segment;
+
+
+@ The actual traversing of the lists takes place here; since we now support
+the concept of mixing orientations on the one page, it's sometimes necessary
+to traverse the lists twice!
+
+@<Output contents of page@>=
+repeat
+ two_orientations := false; {assume that we \&{don't} need two passes!}
+ for k:=y_top to y_bot do {Cycle through each possible list}
+ if seg_list[k] <> nil then
+ begin
+ out_list:=nil; deferred_list:=nil;
+ repeat {until we've emptied current line}
+ @<Save segments which require opposite orientation@> ;
+ @<Process bitmaps and other ``empty'' segments@>;
+ @<Construct a list of non-overlapping segments@> ;
+ @<Output list of non-overlapping segments@> ;
+ until seg_list[k]=nil;
+ if deferred_list<>nil then two_orientations:=true;
+ seg_list[k]:=deferred_list
+ end;
+ if two_orientations then {prepare for second (and last) pass}
+ begin
+ if cur_orient=landscape then new_orient:=portrait
+ else new_orient:=landscape;
+ @<Change page orientation@>
+ end;
+until not two_orientations;
+if lost_seg <> nil then
+begin cur_seg:=lost_seg;
+ finish_seg {Output remaining errors}
+end;
+
+@ If, when outputting stored information in |cur_orient|, we encounter some
+segment(s) in the opposite orientation, we save them in a subsidiary list,
+and stuff them back into |seg_list[k]| after processing the current row.
+
+@<Save segments which require opposite orientation@>=
+prev_seg:=nil; cur_seg:=seg_list[k];
+repeat
+ right_seg:=cur_seg^.next; {we know that |cur_seg<>nil|}
+ if cur_seg^.direction<>cur_orient then
+ begin
+ if prev_seg<>nil then
+ prev_seg^.next:=right_seg {in middle of list}
+ else
+ seg_list[k]:=right_seg; {at beginning of list}
+ cur_seg^.next:=deferred_list; {add segment to front of deferred list}
+ deferred_list:=cur_seg
+ end else
+ prev_seg:=cur_seg; {latest non-empty node}
+ cur_seg:=right_seg {next node on |seg_list|}
+until cur_seg=nil
+
+
+@ Now that the program can support landscape and portrait orientation within
+the same document, we need a method of telling the LN03 to switch between
+the modes. This code is called before output of the first object to the
+page, if |new_orient<>orientation|, and again at the end of the page, to
+reset to the default |orientation| for the next page.
+
+@<Change page orientation@>=
+if new_orient<>cur_orient then
+begin
+ if new_orient=landscape then
+ begin
+ write_ln(ln3_file,csi,PFS_landscape);
+ page_len:=paper_wid+page_x_min; page_wid:=paper_ht+y_land_min;
+ y_min:=page_x_min; x_min:=y_land_min
+ end else
+ begin
+ write_ln(ln3_file,csi,PFS_portrait);
+ page_len:=paper_ht+y_port_min; page_wid:=paper_wid+page_x_min;
+ y_min:=y_port_min; x_min:=page_x_min
+ end;
+ cur_orient:=new_orient
+end
+
+@ When handling characters from a virtual font, the situation can arise in
+which a totally empty segment (one that contains no text) has been added to
+the list. Such segments can be discarded! Other segments can appear to
+contain no text, but actually reference a single oversized glyph, which must
+therefore be output as a bitmap.
+
+@<Process bitmaps and other ``empty'' segments@>=
+prev_seg:=nil; cur_seg:=seg_list[k];
+if cur_seg<>nil then
+repeat
+ right_seg:=cur_seg^.next; {we know that |cur_seg<>nil|}
+ if (VAX_length(cur_seg^.text)=0) or (cur_seg^.seg_type<>glyph_string) then
+ begin
+ @<Output segment which references an external bitmap@>;
+ if prev_seg<>nil then
+ prev_seg^.next:=right_seg {in middle of list}
+ else
+ seg_list[k]:=right_seg; {at beginning of list}
+ cur_seg^.next:=free_seg_list; {add segment to front of free list}
+ free_seg_list:=cur_seg
+ end else
+ prev_seg:=cur_seg; {latest non-empty node}
+ cur_seg:=right_seg {next node on |seg_list|}
+until cur_seg=nil
+
+@ Character glyphs which were too large to be downloaded into the LN03's
+internal fonts have the |seg_type| field of the segment set to |bitmap|;
+when we meet such a segment, we output the bitmap immediately. Similarly,
+sixel dumps referenced in \.{\\special} commands have the value |sixel_dump|
+for this field, and |Copy_sixel_file| is called to copy the referenced file.
+
+@<Output segment which references an external bitmap@>=
+case cur_seg^.seg_type of
+ bitmap: print_glyph(cur_seg^,k);
+ sixel_dump: Copy_sixel_file(k);
+ othercases do_nothing;
+endcases
+
+@ For as many as possible of all the segments which belong at the current
+absolute vertical position, we construct a list in which none of the segments
+overlap each other. We are then able to output these in one sequence which
+will contain only characters and \&{forward} horizontal movement commands.
+
+@<Construct a list of non-overlapping segments@>=
+x_left:=1000000000; {A very high value; ensure |right_seg| \AM\ |left_seg| get set}
+repeat
+ prev_seg:=nil; right_seg:=nil;
+ x_max:=-1;
+ cur_seg:=seg_list[k];
+ @<Find segment of current line which extends furthest to the right@> ;
+ @<Transfer right-most segment to the |out_list|@>
+until right_seg = nil;
+
+@ We start by locating the segment (of those available) which extends furthest
+to the right, and also the one which precedes it. These are then pointed to
+by |right_seg| and |prev_seg|, respectively.
+
+@<Find segment of current line which extends furthest to the right@>=
+while cur_seg<>nil do
+begin
+ if (cur_seg^.xe > x_max) and (cur_seg^.xe <= x_left) then
+ begin x_max:=cur_seg^.xe;
+ right_seg:=cur_seg; {Points to rightmost segment}
+ left_seg:=prev_seg {Points to first of at least 2, or is |nil|}
+ end;
+ prev_seg:=cur_seg;
+ cur_seg:=cur_seg^.next;
+end
+
+@ At this point, we have |right_seg| pointing to the segment which extends
+furthest to the right, whilst |left_seg| will point to the segment immediately
+before this (which may, or may not, overlap |right_seg|).
+
+We then put it at the front of the |out_list|; further non-overlapping
+segments will later be placed in front of it. We ensure that the next
+|right_seg| that we select will not overlap by noting the left-most extent of
+the segment we've just put on the |out_list|.
+
+@<Transfer right-most segment to the |out_list|@>=
+if right_seg <> nil then
+begin
+ @<Remove |right_seg| from list@> ;
+ right_seg^.next:=out_list; {Put rightmost at start of |out_list|}
+ out_list:=right_seg;
+ x_left:=right_seg^.xs {Don't consider anything right of its LHS}
+end
+
+@ If |left_seg| is |nil| then |right_seg| is the first segment associated
+with the line, and so we remove it from the front of the list. Otherwise, we
+detach it from the middle of the list.
+
+@<Remove |right_seg| from list@>=
+if left_seg = nil then
+ seg_list[k]:=seg_list[k]^.next
+else
+ left_seg^.next:=left_seg^.next^.next
+
+@ Once we've constructed the list out of as many segments as possible for the
+current ``line'', we can output them all and go back for some more.
+
+@<Output list of non-overlapping segments@>=
+while out_list <> nil do
+begin
+ ln3_cnt:=0; ln3_print:=0; {Nothing as yet on line}
+ esc_out(csi+str_int(k)+'d'); {Move to correct line on paper}
+ cur_seg:=out_list; prev_seg:=nil;
+ still_fits:=true;
+ @<Output current segment, in chunks if necessary@> ;
+ @<Return processed segments to the |free_seg_list|@>;
+ write_ln(ln3_file)
+end
+
+@ Once we have a single segment ready for output, we call |print_seg| to
+output as much of it as will fit in the space remaining in the output buffer.
+If this is the whole segment, we can then repeat the process with the next
+segment in the |out_list|, noting the address of this segment so that it may
+be returned to the |free_seg_list|. On the other hand, if |print_seg| decided
+to split the segment, we break out of the loop.
+
+@<Output current segment, in chunks if necessary@>=
+while (cur_seg <> nil) and still_fits do
+begin right_seg:=cur_seg;
+ print_seg; {Will leave |cur_seg=nil| if all text output}
+ if cur_seg = nil then
+ begin
+ cur_seg:=right_seg^.next; {Next segment for output}
+ prev_seg:=right_seg
+ end else
+ still_fits:=false;
+end;
+
+@ Once a segment (or group of segments) have been output, it is safe to
+discard them. We do this by returning them to the |free_seg_list|, so that
+new nodes will be allocated therefrom in preference to using |new|. The first
+such freed segment is that at the begining of the |out_list|, whilst the last
+is that most recently output, noted in |prev_seg|.
+
+@<Return processed segments to the |free_seg_list|@>=
+if prev_seg <> nil then
+begin prev_seg^.next:=free_seg_list;
+ free_seg_list:=out_list;
+ out_list:=cur_seg
+end
+
+@ When \.{DVItoLN03} first starts, any output produced will be printed on the
+first page. Subsequently, it is necessary to insert a form-feed character to
+terminate the preceding page before any output for another page may commence.
+The |boolean| |top_of_page| is used to keep track of whether the form-feed is
+required.
+
+This code is called whenever something is about to be output to the page: if
+the orientation is incorrect at that time, the appropriate change is made.
+It's also the appropriate time to change paper trays, and select the
+printing mode.
+
+@<Move to top of form@>=
+if top_of_page then
+begin
+ top_of_page:=false;
+ if pages_printed>0 then write_ln(ln3_file,FF);
+ @<Change tray for second sheet, if requested@>;
+ @<Skip to a \\{recto} page, if necessary@>
+end;
+@<Change page orientation@>
+
+@ With the DEClaser~2200, it is possible (through the \.{FIRST} and \.{REST}
+selectors of the \.{/FEED\_TRAY} qualifier) to arrange for the second and
+subsequent sheets to be printed on paper from a different input tray than
+that used for the first sheet. The code in this module effects this tray
+change, when the second sheet to be printed is first met: it firstly
+determines whether we're printing a \\{recto} page, when duplexing (this
+information is later used for selecting the printing mode for the current
+page). The ``cascade'' of |if| clauses is to reduce the processing overhead
+except for the first three pages printed.
+
+The macro here is used to change trays; the control sequence ending in
+|'!v'| is the |DECASTC| (Automatic Sheet-feeder Tray Control) command, to
+select the desired tray.
+
+@d select_tray(#)==case # of
+ default_tray: do_nothing;
+ othercases
+ write(ln3_file,csi,#:1,'!v')
+endcases
+
+@d odd_page==(odd(count[0])or(count[0]=0))
+
+@d recto_page==(duplex_by_page_numbers and odd_page) or
+ (not duplex_by_page_numbers and not odd(pages_printed))
+
+@d starting_second_sheet==
+ (((print_mode<true_duplex_normal)or(print_mode>true_duplex_tumbled)) and
+ (pages_printed=1)) {non-duplex; change at second page}
+ or
+ (((print_mode=true_duplex_normal)or(print_mode=true_duplex_tumbled)) and
+ this_page_recto) {duplex; change at second sheet}
+
+@<Change tray for second sheet, if requested@>=
+this_page_recto:=recto_page;
+if pages_printed<=2 then
+ if pages_printed>0 then
+ if starting_second_sheet then
+ if following_tray<>first_tray then
+ select_tray(following_tray)
+
+@ When we are printing in duplex mode (even simulated duplex, in response to
+the \.{MASTER} option of the \.{/PRINT\_MODE} qualifier), we have to arrange
+to leave a page blank if two \\{recto} or two \\{verso} pages follow each
+other. This information will already have been put into |this_page_recto|,
+when the paper tray was selected.
+
+For efficiency reasons, when printing in a duplex mode on the DEClaser~2200
+(LN06), we switch into simplex mode for a \\{recto} page which is followed
+by another such: this information was recorded in the array |blank_follows|
+when the starting page was being located. This speeds up processing,
+because the printer doesn't need to perform the mechanical reversal of the
+page only to find that is has nothing to be printed upon it.
+
+@<Skip to a \\{recto} page, if necessary@>=
+@<Reset duplexing, if appropriate@>;
+if print_mode>=true_duplex_normal then
+begin
+ if last_page_recto=this_page_recto then
+ begin
+ if (print_mode=ln03_master) or not this_page_recto then
+ write(ln3_file,' ',FF) {Eject an extra page on LN03, or make
+ \\{recto} page blank}
+ end else
+ if (print_mode<ln03_master) and (ptr_blanks>0) and
+ duplex_by_page_numbers and this_page_recto then
+ if blank_follows[ptr_blanks]=cur_loc_after_bop then
+ begin {This page has blank \\{verso} side}
+ write(ln3_file,csi,true_simplex_normal:1,' x');
+ duplex_to_be_reset:=true;
+ decr(ptr_blanks)
+ end
+end;
+last_page_recto:=this_page_recto;
+
+@ If the previous page was printed in simplex mode, because it was a
+\\{recto} page to be followed by another one then when we meet that next
+\\{recto} page we have a look to see if the following page is yet another
+\\{recto} one. If not, we have to reset the required duplexing mode.
+
+@<Reset duplexing, if appropriate@>=
+if duplex_to_be_reset then {previous page was temporary excursion into
+ simplex mode}
+ if ptr_blanks>0 then
+ if blank_follows[ptr_blanks]=cur_loc_after_bop then
+ begin
+ decr(ptr_blanks); {and remain in simplex mode}
+ if print_mode>=duplex_master_normal then
+ write(ln3_file,' ',FF) {eject blank page for \\{verso} master}
+ end else
+ begin
+ write(ln3_file,csi,print_mode:1,' x');
+ duplex_to_be_reset:=false
+ end
+
+@ When we come to the end of the document when printing in any duplexing
+mode, we may just have printed a \\{recto} page; we must either eject the
+second side as blank (in true duplex modes) or print an extra blank page (in
+any of the master modes). This is accomplished by printing a form-feed, and
+following it with a space; the form-feed on its own would just result in the
+printer symbiont suppressing that which it would have inserted, but the
+space fools it into sending a second form-feed itself.
+
+@<Conditionally eject last page@>=
+if (print_mode>=true_duplex_normal) and last_page_recto then
+ if (print_mode>=duplex_master_normal) or not duplex_to_be_reset then
+ write(ln3_file,FF,' ')
+
+@ Here are the variables required to control \\{recto}/\\{verso} printing
+
+@<Glob...@>=
+@!last_page_recto:boolean; {|true| if previous page was \\{recto}}
+@!this_page_recto:boolean; {used to save multiple evaluation of |recto_page|}
+@!pages_printed:integer; {counts each page generated for
+ \.{/noduplex\_by\_page\_numbers}}
+@!duplex_to_be_reset:boolean; {Used to reset any duplex mode after one sheet
+ has been printed in simplex}
+@!cur_loc_after_bop:integer; {Records |cur_loc| after the current page's
+ |bop| command was processed}
+
+@ These variables have to be initialized, of course
+
+@<Set initial...@>==
+pages_printed:=0; last_page_recto:=false; duplex_to_be_reset:=false;
+
+@ When we first start writing the output file, we have to add commands to
+tell the DEClaser printers from which tray to take the first sheet of paper,
+and which printing mode to use. The control sequence ending in |' x'| is
+the |DECSPDM| (Set Duplex Print Mode) command.
+
+@<Select printing mode and feed tray on DEClaser printers@>=
+if first_tray<>default_tray then
+ select_tray(first_tray);
+if (print_mode>default_print_mode) and (print_mode<ln03_master) then
+ write_ln(ln3_file,csi,print_mode:1,' x');
+
+@*Procedures for recognizing and manipulating strings. We have a
+requirement for recognizing various ASCII strings in this program. Some of
+these strings specify functionality required from a \.{\BS special} command,
+whilst others are the two-letter abbreviations used to specify the units of
+dimensions: such dimensions can appear within \.{\BS special} commands and
+also in some command line qualifiers.
+
+The following data structures support the recognition of the strings used:
+for commands, we need the following texts:
+
+\yskip\hang\.{sx\ } ``Old-style'' introducer for inclusion of an LN03 sixel
+file within the program's output. Note that support for this command will
+be removed in a future release following V4.0.
+
+\yskip\hang\.{landscape} Output the following information in landscape orientation.
+
+\yskip\hang\.{portrait} Output the following information in portrait orientation.
+
+\yskip\hang\.{ln03:} New-style introducer for all LN03-specific \.{\BS
+special}s. All the remaining command strings are to be found following this
+introducer.
+
+\yskip\hang\.{sixel\ } Command to include a pixel file into the program's
+output.
+
+\yskip\hang\.{plotfile\ } Alternative name to include a sixel file.
+
+\yskip\hang\.{defpoint\ } Define the coordinates of a point on the page:
+used in conjunction with \.{connect} to draw changebars.
+
+\yskip\hang\.{connect\ } Draw a changebar line between a pair of previously
+defined points.
+
+\yskip\hang\.{resetpoints\ } Clear all recorded details for a specified
+range of named points.
+
+\noindent Dimensions recognized are as in \TeX, with the addition of \.{px}
+(representing a dimension unit of one pixel) and \.{mi} (representing one
+micrometre or micron).
+
+The creation of these strings could have been much cleaner through use of
+{W\sc EB}'s string pool feature, but it was felt that it was nevertheless
+better to avoid the use of the auxiliary \.{.POOL} file.
+
+@<Types...@>=
+@!pool_pointer = 0..pool_size;
+@!str_number = 0..max_strings;
+
+@ @<Globals...@>=
+@!str_pool : packed array [pool_pointer] of ASCII_code;
+@!str_start : array [str_number] of pool_pointer;
+@!pool_ptr : pool_pointer; {First unused position in |str_pool|}
+@!str_ptr : str_number; {Number of current string being created}
+
+@ Here's how we initialize all the strings for recognition. Note that
+string $0$ is reserved for the null string. The macro definitions allow us
+to refer to the various strings symbolically; note that the related numbers
+will need to be changed if the order of initialization below is altered!
+|min_string_match| specifies the minimum number of characters which are
+required to match when the string being compared has been specified in
+truncated form; at present, all strings are unique in their first two
+characters.
+
+@d min_string_match=2
+@#
+@d dimen_pt=1
+@d dimen_mm=dimen_pt+1
+@d dimen_in=dimen_mm+1
+@d dimen_px=dimen_in+1
+@d dimen_cm=dimen_px+1
+@d dimen_pc=dimen_cm+1
+@d dimen_bp=dimen_pc+1
+@d dimen_dd=dimen_bp+1
+@d dimen_cc=dimen_dd+1
+@d dimen_sp=dimen_cc+1
+@d dimen_mi=dimen_sp+1
+@d spec_sx=dimen_mi+1
+@d spec_land=spec_sx+1
+@d spec_port=spec_land+1
+@d spec_ln=spec_port+1
+@d spec_six=spec_ln+1
+@d spec_plt=spec_six+1
+@d spec_set=spec_plt+1
+@d spec_con=spec_set+1
+@d spec_rst=spec_con+1
+
+@<Set initial...@>=
+pool_ptr := 0; str_ptr := 0; str_start[0] := 0;
+make_string('pt');
+make_string('mm');
+make_string('in');
+make_string('px');
+make_string('cm');
+make_string('pc');
+make_string('bp');
+make_string('dd');
+make_string('cc');
+make_string('sp');
+make_string('mi');
+make_string('sx ');
+make_string('landscape');
+make_string('portrait');
+make_string('ln03:');
+make_string('sixel ');
+make_string('plotfile ');
+make_string('defpoint ');
+make_string('connect ');
+make_string('resetpoints ');
+incr(str_ptr); str_start[str_ptr]:=pool_ptr;
+
+@ Here's the procedure for putting the strings into the pool. We make use
+here of a couple of auxiliary macros for adding characters to the string
+pool, and another for reporting errors with the arguments of a \.{\BS
+special}.
+
+@d print_spec == for spec_ptr:= 1 to spec_len-1 do
+ begin print(xchr[spec_par[spec_ptr]]);
+ write(term_out,xchr[spec_par[spec_ptr]])
+ end;
+ print(''''); write(term_out,'''')
+@d spec_error(#) == begin error(#,' `'); print_spec end
+
+@d append_char(#) == {Put |ASCII_code| \# at the end of the |str_pool|}
+ begin
+ str_pool[pool_ptr] := #;
+ incr(pool_ptr)
+ end
+@d str_room(#) == {make sure that |str_pool| can take a string of length \#}
+ begin
+ if pool_ptr + # > pool_size then
+ abort('Internal error (String pool overflow)')
+@:fatal error Internal error String pool overflow}{\qquad\.{(String pool overflow)}@>
+ end
+
+@<Procedures for...@> =
+procedure make_string(@!s : packed array [@!low..@!high : integer] of char);
+var
+ @!i : integer;
+begin
+ str_room(high-low+1);
+ incr(str_ptr);
+ str_start[str_ptr] := pool_ptr;
+ for i := low to high do append_char(xord[s[i]]);
+end;
+
+@ This module has a set of functions (and one procedure) in it that are
+generally used in decoding \.{\BS special} commands. All these procedures,
+together with those in the following two sections, are ``low-level'' and
+included at an early point in the \PASCAL\ so that they are available to all
+routines provided through {W\mc EB}'s \.{@@p} directive.
+
+The functions are:
+\item{$\bullet$} |rd_char|, which reads a character from |spec_par| at
+|spec_ptr|,
+\item{$\bullet$} |rd_nb_char|, which reads a non-blank character, using
+|rd_char|,
+\item{$\bullet$} |rd_int|, which reads an integer, using the two |rd_char|s,
+\item{$\bullet$} |rd_real|, which reads a `real' number, but without exponent.
+
+All the functions return a |boolean|, which is |true| if they `failed' (which,
+in the case of the |rd_char|s, means they got to the end of the line).
+|rd_real| accepts |'.'| as `0.0' (!). (Personally, I wouldn't give you twopence
+for these number routines: they have several curious properties, including the
+pleasing way they collapse when presented with an isolated minus-sign!)
+[This comment was made by Robin Fairbairns
+@^Fairbairns, Robin@>
+of LaserScan (Cambridge UK), who wrote them and provided the other features
+that support \.{\\changebar} commands through appropriate \.{\\special}
+strings.]
+
+The one procedure in the module is |bksp_char|, which backspaces by one
+character, except, of course, at the beginning of the buffer.
+
+@<Additional low...@>=
+function rd_char (var ch : [volatile] ASCII_code) : boolean;
+begin
+if spec_ptr>spec_len
+then begin ch:=" "; rd_char:=true; end
+else begin ch:=spec_par[spec_ptr]; incr(spec_ptr); rd_char:=false; end;
+end;
+
+function rd_nb_char (var ch : [volatile] ASCII_code) : boolean;
+var
+@! end_of_line : boolean;
+begin
+repeat end_of_line := rd_char(ch) until end_of_line or (ch<>" ");
+rd_nb_char := end_of_line;
+end;
+
+procedure bksp_char;
+begin
+if spec_ptr>1 then decr(spec_ptr);
+end;
+
+function rd_int ( var res : [volatile] integer ) : boolean;
+var
+@!ch : ASCII_code;
+@!end_of_line,negative : boolean;
+begin
+res := 0; negative := false;
+end_of_line:=rd_nb_char(ch);
+if ch="-" then begin
+ negative := true;
+ end_of_line := rd_char(ch);
+ end;
+if end_of_line then rd_int:=true else rd_int:=not (ch in ["0".."9"]);
+while (not end_of_line) and (ch in ["0".."9"]) do begin
+ res:=res*10+(ch-"0");
+ end_of_line:=rd_char(ch);
+ end;
+if not end_of_line then bksp_char;
+if negative then res:=-res;
+end;
+
+function rd_real (var res : [volatile] real ) : boolean;
+var
+@!ch : ASCII_code;
+@!end_of_line,negative:boolean;
+@!in_fract:boolean;
+@!fract:real;
+@!dec_pt:real;
+
+begin
+res:=0.0; fract:=0.0; dec_pt:=1.0; negative := false;
+end_of_line:=rd_nb_char(ch);
+if ch="-" then begin
+ negative := true;
+ end_of_line := rd_char(ch);
+ end;
+if end_of_line then rd_real:=true
+else begin
+ rd_real:=false; {initial estimate}
+ if ch in ["0".."9"]
+ then in_fract:=false
+ else if ch="."
+ then begin
+ in_fract:=true;
+ end_of_line:=rd_char(ch);
+ end
+ else rd_real:=true;
+ end;
+while (not end_of_line) and (ch in ["0".."9"])
+do begin
+ if in_fract then begin
+ dec_pt:=dec_pt*0.1;
+ fract:=fract+dec_pt*(ch-"0");
+ end
+ else res:=res*10.0+(ch-"0");
+ end_of_line:=rd_char(ch);
+ if not(end_of_line or in_fract) then
+ if ch="." then begin
+ in_fract:=true;
+ end_of_line:=rd_char(ch);
+ end;
+ end;
+if not end_of_line then bksp_char;
+if negative then res:=-res-fract else res:=res+fract;
+end;
+
+@ Here is a function which matches characters from the buffer into which
+the string associated with the \.{\BS special} command is read against those
+strings in the |str_pool|. It returns the index number of that particular
+string. It is not necessary for the whole stored string to be matched; it
+will be noted that all strings are unique in their first two characters;
+provided at least these characters are matched \&{and} the first non-matched
+character in the \.{\BS special} command is a space character, then a match
+will still be found. The function returns a pointer to string $0$ (the null
+string) if no match is found.
+
+Here is a macro which allows us to find the length of a string in the pool:
+
+@d str_length(#) == (str_start[#+1]-str_start[#])
+
+@<Additional low...@>=
+function find_match : str_number;
+var
+ @!i,@!l : integer;
+ @!m : str_number;
+ @!chr_ptr : pool_pointer;
+ @!eol,@!found : boolean;
+begin
+ eol := false; {We start by skipping over any leading spaces}
+ while (spec_par[spec_ptr] = " ") and not eol do
+ if spec_ptr >= spec_len then
+ eol := true
+ else
+ incr(spec_ptr);
+ m := 0; {Assume the worst!}
+ if eol then spec_error('Unsupported or malformed \special ')
+@:Error: Unsupported or malformed special}{\quad\.{Unsupported or malformed \\special}@>
+ else
+ begin
+ i := spec_ptr; {Point into the body of the \.{\BS special} command}
+ m := dimen_pt;
+ found := false;
+ repeat
+ l := str_length(m);
+ chr_ptr := str_start[m];
+ while ((spec_par[i] = str_pool[chr_ptr]) or
+ (spec_par[i] = str_pool[chr_ptr]+"A"-"a")) and
+ not eol and not found do
+ begin
+ decr(l);
+ if l=0 then found := true else
+ begin
+ if spec_ptr >= spec_len then eol := true
+ else
+ incr(i);
+ incr(chr_ptr);
+ end;
+ end;
+ if eol or (spec_par[i] = " ") then
+ if i-spec_ptr > min_string_match then found := true;
+ if not found then
+ begin
+ i := spec_ptr; incr(m);
+ end
+ until found or (m > str_ptr);
+ if not found then m := 0
+ else spec_ptr:=i+1;
+ end;
+ find_match := m;
+end;
+
+@ This module defines a `derived' function for reading, as an integer number of
+pixels, a `dimension' from the \.{\BS special}'s arguments (where `dimension'
+is---roughly---what one gets in \TeX). It firstly reads a \meta{real number}
+from the argument string, and then multiplies this by an appropriate factor
+determined by the following two character string, which should be one of \TeX's
+\meta{physical unit} designators (\.{pt}, \.{bp}, etc) with the addition of
+\.{px}, denoting pixels, and \.{mi} for microns ($\mu\hbox{m}$).
+
+The function has a |boolean| result, which once again is |true| if it fails to
+find what was expected.
+
+@d spec_warning(#)==
+ begin
+ warning(#,' `'); print_spec
+ end
+
+@<Additional low...@>=
+function rd_dimension ( var res : [volatile] integer ) : boolean;
+var
+@! dimen_found : str_number;
+@! real_value : real;
+begin
+if rd_real(real_value) then rd_dimension:=true
+else begin
+ rd_dimension:=false;
+ dimen_found := find_match;
+ case dimen_found of
+ dimen_pt: real_value:=real_value*resolution/72.27;
+ dimen_in: real_value:=real_value*resolution;
+ dimen_px: do_nothing;
+ dimen_pc: real_value:=real_value*12.0*resolution/72.27;
+ dimen_cm: real_value:=real_value*resolution/2.54;
+ dimen_mm: real_value:=real_value*resolution/25.4;
+ dimen_bp: real_value:=real_value*resolution/72.0;
+ dimen_dd: real_value:=real_value*(1238.0/1157.0)*resolution/72.27;
+ dimen_cc: real_value:=real_value*(14856.0/1157.0)*resolution/72.27;
+ dimen_mi: real_value:=real_value*resolution/25400.0;
+ dimen_sp: real_value:=real_value*resolution/65536.0/72.27;
+ othercases
+ begin
+ spec_warning('Missing or unknown unit of measure:');
+@:Warning: Missing or unknown unit of measure}{\quad\.{Missing or unknown unit of measure}@>
+ rd_dimension:=true; {Assumes value is in pixels}
+ end;
+ endcases;
+end;
+res := round(real_value);
+end;
+
+@ This analogous function reads a dimension and converts it to scaled
+points; this is used by the \.{/hfuzz} and \.{/vfuzz} qualifiers.
+
+@<Additional low...@>=
+function rd_scaled_pt ( var res : [volatile] integer ) : boolean;
+var
+@! dimen_found : str_number;
+@! real_value : real;
+begin
+if rd_real(real_value) then rd_scaled_pt:=true
+else begin
+ rd_scaled_pt:=false;
+ dimen_found := find_match;
+ case dimen_found of
+ dimen_pt: real_value:=real_value*65536.0;
+ dimen_in: real_value:=real_value*65536.0*72.27;
+ dimen_px: real_value:=real_value/conv;
+ dimen_pc: real_value:=real_value*12.0*65536.0;
+ dimen_cm: real_value:=real_value*65536.0*72.27/2.54;
+ dimen_mm: real_value:=real_value*65536.0*72.27/25.4;
+ dimen_bp: real_value:=real_value*65536.0*72.27/72.0;
+ dimen_dd: real_value:=real_value*(1238.0/1157.0)*65536.0;
+ dimen_cc: real_value:=real_value*(14856.0/1157.0)*65536.0;
+ dimen_mi: real_value:=real_value*65536.0*72.27/25400.0;
+ dimen_sp: do_nothing;
+ othercases
+ begin
+ spec_warning('Missing or unknown unit of measure:');
+@:Warning: Missing or unknown unit of measure}{\quad\.{Missing or unknown unit of measure}@>
+ rd_scaled_pt:=true; {Assumes value is in sp}
+ end;
+ endcases;
+end;
+res := round(real_value);
+end;
+
+@ Collection of rules for a page is fairly trivial, but it's now called from
+three places, so we make it a procedure. All rules are collected and placed
+into |page_rules|. Later, the rules will be merged.
+
+@p procedure Collect_rule(hhh, vvv, wwidth, hheight : integer);
+begin
+if rules_on_page<max_rules then incr(rules_on_page) else
+if not rule_limit_exceeded then begin
+warning('more than ',max_rules:1,' rules on page; excess ignored!');
+@.more than ... rules@>
+rule_limit_exceeded:=true end;
+with page_rules[rules_on_page] do begin
+ horiz := hhh; vert := vvv; height := hheight;
+ width := wwidth; covered := false;
+ end;
+end;
+
+@ This module defines three procedures:
+
+\yskip\hang$\bullet$ |reset_points|, which resets the |present| flags of a
+range of |point|s,
+
+\yskip\hang$\bullet$ |define_point|, which gives a value to a |point|, and
+
+\yskip\hang$\bullet$ |connect_points|, which makes connection between two
+|point|s.
+
+The macro simplifies the task of finding the next comma in the \.{\BS
+special} string.
+
+@d find_comma == repeat end_of_line:=rd_nb_char(ch)
+ until end_of_line or (ch<>",")
+
+@p procedure reset_points;
+var
+@!low,high : integer;
+begin
+rd_int(low); rd_int(high);
+if (0<low) and (low<=high) and (high<=max_points)
+then begin
+ for k:=low to high do point[k].present:=false;
+ end
+else if (0<low) and (low<=max_points)
+then point[low].present:=false;
+end;
+
+procedure define_point;
+var
+@! which : integer; {the point number}
+@! h_val, v_val : integer; {its coordinates}
+@! ch : ASCII_code;
+@! end_of_line : boolean;
+begin
+if rd_int(which) then
+ spec_error('Point number missing in \special ')
+@:Error: Point number missing in special}{\quad\.{Point number missing in \\special}@>
+else if (which<=0) or (which>max_points) then
+ spec_error('Invalid point number in \special ')
+@:Error: Invalid point number in special}{\quad\.{Invalid point number in \\special}@>
+else begin
+ find_comma;
+ if ch="("
+ then begin
+ if rd_dimension(h_val)
+ then begin
+ h_val:=hh;
+ v_val:=vv;
+ end
+ else begin
+ if rd_nb_char(ch) then do_nothing;
+ if ch=","
+ then begin
+ if rd_dimension(v_val) then v_val:=vv;
+ end
+ else v_val:=vv;
+ end;
+ end
+ else
+ begin
+ h_val:=hh; v_val:=vv;
+ end;
+ {now we've got |h_val|, |v_val| and |which| all set (to something!)}
+ with point[which] do
+ begin hh := h_val; vv := v_val; present := true end;
+ end;
+end;
+
+procedure connect_points;
+var
+@! a1,b1, a2,b2 : integer;
+@! width : integer;
+@! half_width : integer;
+@! end_of_line, bad_point : boolean;
+@! ch : ASCII_code;
+begin
+end_of_line:=rd_int(a1);
+end_of_line:=rd_nb_char(ch);
+if ch="/"
+then end_of_line:=rd_int(b1)
+else begin
+ if not end_of_line then bksp_char; b1:=a1;
+ end;
+find_comma;
+if not end_of_line then bksp_char;
+end_of_line:=rd_int(a2);
+end_of_line:=rd_nb_char(ch);
+if ch="/"
+then end_of_line:=rd_int(b2)
+else begin
+ if not end_of_line then bksp_char; b2:=a2;
+ end;
+
+find_comma;
+if not end_of_line then bksp_char;
+if rd_dimension(width) then width:=2; {default dimension is 2 pixels, ~0.4 pts}
+if odd(count[0])
+then begin b1:=a1; b2:=a2; end;
+
+{check the point numbers}
+if (b1<=0) or (b1>max_points) or (b2<=0) or (b2>max_points)
+then bad_point:=true
+else bad_point:=false;
+if not bad_point then begin
+ if (not point[b1].present) or (not point[b2].present)
+ then bad_point:=true;
+ end;
+if bad_point then
+ spec_error('Invalid point number in \special ')
+@:Error: Invalid point number in special}{\quad\.{Invalid point number...}@>
+else begin
+ half_width := width div 2;
+ if point[b1].hh=point[b2].hh
+ then Collect_rule(point[b1].hh-half_width,
+ VAX_max(point[b1].vv,point[b2].vv),
+ width,
+ abs(point[b2].vv-point[b1].vv))
+ else if point[b1].vv=point[b2].vv
+ then Collect_rule(VAX_min(point[b1].hh,point[b2].hh),
+ point[b1].vv+half_width,
+ abs(point[b1].hh-point[b2].hh),
+ width)
+ else spec_error('Diagonal rule in \special ');
+@:Error: Diagonal rule in special}{\quad\.{Diagonal rule in \\special}@>
+ end;
+end;
+
+
+@* Translation to symbolic form.
+The main work of \.{DVItoLN03} is accomplished by the |do_page| procedure,
+which produces the output for an entire page, assuming that the |bop|
+command for that page has already been processed. This procedure is
+essentially an interpretive routine that reads and acts on the \.{DVI}
+commands.
+
+@ The definition of \.{DVI} files refers to six registers,
+$(h,v,w,x,y,z)$, which hold integer values in \.{DVI} units. In practice,
+we also need registers |hh| and |vv|, the pixel analogs of $h$ and $v$,
+since it is not always true that |hh=pixel_round(h)| or
+|vv=pixel_round(v)|. Note that the current font is neither stacked
+nor restored by |push| and |pop| commands.
+
+The stack of $(h,v,w,x,y,z)$ values is represented by eight arrays
+called |hstack|, \dots, |zstack|, |hhstack|, and |vvstack|.
+
+@<Glob...@>=
+@!h,@!v,@!w,@!x,@!y,@!z,@!hh,@!vv:integer; {current state values}
+@!hstack,@!vstack,@!wstack,@!xstack,@!ystack,@!zstack:
+ array [0..stack_size] of integer; {pushed down values in \.{DVI} units}
+@!hhstack,@!vvstack:
+ array [0..stack_size] of integer; {pushed down values in pixels}
+
+@ Three characteristics of the pages (their |max_v|, |max_h|, and
+|max_s|) are specified in the postamble, and a warning message
+is printed if these limits are exceeded. Actually |max_v| is set to
+the maximum height plus depth of a page, and |max_h| to the maximum width,
+for purposes of page layout. Since characters can legally be set outside
+of the page boundaries, it is not an error when |max_v| or |max_h| is
+exceeded. But |max_s| should not be exceeded.
+
+The postamble also specifies the total number of pages; \.{DVItoLN03}
+checks to see if this total is accurate.
+
+@<Glob...@>=
+@!max_v:integer; {the value of |abs(v)| should probably not exceed this}
+@!max_h:integer; {the value of |abs(h)| should probably not exceed this}
+@!max_h_saved,@!max_v_saved:integer; {`Static' value for oversize messages}
+@!max_s:integer; {the stack depth should not exceed this}
+@!max_v_so_far,@!max_h_so_far,@!max_s_so_far:integer; {the record high levels}
+@!total_pages:integer; {the stated total number of pages}
+@!page_count:integer; {the total number of pages seen so far}
+
+@ @<Set init...@>=
+max_v:=@'17777777777-99; max_h:=@'17777777777-99; max_s:=stack_size+1;@/
+max_v_so_far:=0; max_h_so_far:=0; max_s_so_far:=0; page_count:=0;
+
+@ Here is a procedure which will be required when decoding |xxx| commands.
+If the string of characters in a \TeX\ \.{\\special} command commences with
+the character string |'SX '| (i.e., `old style'), or |'ln03:plotfi[le] '| or
+|'ln03:sixel '| (`new style'), the following procedure will copy the
+remainder of the \.{\\special} command's parameter string (which is assumed
+to be the name of a VAX/VMS file containing a graphics image encoded into
+DEC's standard ``sixel'' format) into the |text| field of a |segment|; the
+remaining fields are used to record the page co\"ordinates at which the dump
+shall be placed.
+
+@p procedure include_sixel_dump;
+begin
+ finish_seg; {ensure that we have no |cur_seg|}
+ new_segment(true,true,0,0); {|font_code| and |ch_code| irrelevant}
+ with cur_seg^ do
+ begin
+ seg_type:=sixel_dump; {that's the flavour of segment}
+ text:='';
+ while spec_ptr <= spec_len do
+ begin
+ text := text + xchr[spec_par[spec_ptr]];
+ incr(spec_ptr)
+ end;
+ xs:=x_pos; {record starting position of dump's placement}
+ end;
+ finish_seg {detach the segment; it's attached to correct |seg_list|}
+end;
+
+@ Before we get into the details of |do_page|, it is convenient to
+consider a simpler routine that computes the first parameter of each
+opcode.
+
+@p function first_par(o:eight_bits):integer;
+begin case o of
+sixty_four_cases(set_char_0),sixty_four_cases(set_char_0+64):
+ first_par:=o-set_char_0;
+set1,put1,fnt1,xxx1,fnt_def1: first_par:=get_byte;
+set1+1,put1+1,fnt1+1,xxx1+1,fnt_def1+1: first_par:=get_two_bytes;
+set1+2,put1+2,fnt1+2,xxx1+2,fnt_def1+2: first_par:=get_three_bytes;
+right1,w1,x1,down1,y1,z1: first_par:=signed_byte;
+right1+1,w1+1,x1+1,down1+1,y1+1,z1+1: first_par:=signed_pair;
+right1+2,w1+2,x1+2,down1+2,y1+2,z1+2: first_par:=signed_trio;
+set1+3,set_rule,put1+3,put_rule,right1+3,w1+3,x1+3,down1+3,y1+3,z1+3,
+ fnt1+3,xxx1+3,fnt_def1+3: first_par:=signed_quad;
+nop,bop,eop,push,pop,pre,post,post_post,undefined_commands: first_par:=0;
+w0: first_par:=w;
+x0: first_par:=x;
+y0: first_par:=y;
+z0: first_par:=z;
+sixty_four_cases(fnt_num_0): first_par:=o-fnt_num_0;
+end;
+end;
+
+@ Here is another subroutine that we need: It computes the number of
+pixels in the height or width of a rule. Characters and rules will line up
+properly if the sizes are computed precisely as specified here. (Since
+|conv| is computed with some floating-point roundoff error, in a
+machine-dependent way, format designers who are tailoring something for a
+particular resolution should not plan their measurements to come out to an
+exact integer number of pixels; they should compute things so that the
+rule dimensions are a little less than an integer number of pixels, e.g.,
+4.99 instead of 5.00.)
+
+@p function rule_pixels(x:integer):integer;
+ {computes $\lceil|conv|\cdot x\rceil$}
+var n:integer;
+begin n:=trunc(conv*x);
+if n<conv*x then rule_pixels:=n+1 @+ else rule_pixels:=n;
+end;
+
+@ Strictly speaking, the |do_page| procedure is really a function with
+side effects, not a `\&{procedure}'\thinspace; it returns the value |false|
+if \.{DVItoLN03} should be aborted because of some unusual happening. The
+subroutine is organized as a typical interpreter, with a multiway branch
+on the command code followed by |goto| statements leading to routines that
+finish up the activities common to different commands. We will use the
+following labels:
+
+@d fin_set=41 {label for commands that set or put a character}
+@d fin_rule=42 {label for commands that set or put a rule}
+@d move_right=43 {label for commands that change |h|}
+@d move_down=44 {label for commands that change |v|}
+@d change_font=45 {label for commands that change |cur_font|}
+
+@ Some \PASCAL\ compilers severely restrict the length of procedure bodies,
+so we shall split |do_page| into two parts, one of which is
+called |special_cases|. The different parts communicate with each other
+via the global variables mentioned above, together with the following ones:
+
+@<Glob...@>=
+@!s:integer; {current stack size}
+@!cur_font:integer; {current internal font number}
+@!cur_base:integer; {$\equiv$|glyph_base[cur_font]|, to index into |glyphs|}
+
+@ Here is the overall setup. The parameter is an extension from the
+original program to accommodate virtual font character sequences; in normal
+operation (when processing bytes from the \.{DVI} file), this parameter is
+negative, and |do_page| processes one complete page of the file. If a
+character being set on the current page is taken from a virtual font, and
+doesn't simply map to a single physical character from some other font, then
+|do_page| will be called recursively, with a parameter that points to the
+first byte of a sequence of |dvi| bytes which implements the virtual
+character.
+
+@p @t\4@>@<Declare the function called |special_cases|@>@;
+@t\4@>@<Declare the function called |reduce_rules|@>@;
+function do_page; {|do_page(@!vf_start:integer):boolean;|}
+label fin_set,fin_rule,move_right,done,9998,9999;
+var o:eight_bits; {operation code of the current command}
+@!p,@!q:integer; {parameters of the current command}
+@!a:integer; {byte number of the current command}
+@!hhh:integer; {|h|, rounded to the nearest pixel}
+@!saved_font:integer; {implicit |push| around virtual font character}
+@!old_take:integer; {ditto for taking |dvi| from array |vf|}
+begin
+ if vf_start < 0 then
+ begin {initialize the state variables if not recursing}
+ s:=0; h:=0; v:=0; w:=0; x:=0; y:=0; z:=0; hh:=0; vv:=0;
+ end;
+ saved_font:=cur_font; {for later restoration}
+ cur_font:=nf; {set current font undefined}
+ old_take:=vf_take;
+ vf_take:=vf_start; {ensure |dvi| bytes taken from appropriate source}
+while true do @<Translate the next command in the \.{DVI} file;
+ |goto 9999| with |do_page=true| if it was |eop|;
+ |goto 9998| if premature termination is needed@>;
+9998: print_ln('!'); do_page:=false;
+9999: cur_font:=saved_font;
+cur_base:=glyph_base[cur_font];
+vf_take:=old_take;
+end;
+
+@ Error messages are written to the log file with full details of their position
+within the \.{DVI} file, and, in a shorter form, to the terminal.
+
+
+@<Translate the next command...@>=
+begin a:=cur_loc;
+o:=get_byte; p:=first_par(o);
+if eof(dvi_file) then bad_dvi('the file ended prematurely');
+@:Bad DVI file the file ended prematurely}{\quad\.{the file ended prematurely}@>
+@<Start translation of command |o| and |goto| the appropriate label to
+ finish the job@>;
+fin_set: @<Finish a command that either sets or puts a character, then
+ |goto move_right| or |done|@>;
+fin_rule: @<Finish a command that either sets or puts a rule, then
+ |goto move_right| or |done|@>;
+move_right: @<Finish a command that sets |h:=h+q|, then |goto done|@>;
+done:
+end
+
+@ The multiway switch in |first_par|, above, was organized by the length
+of each command; the one in |do_page| is organized by the semantics.
+
+@<Start translation...@>=
+if o<set_char_0+128 then @<Translate a |set_char| command@>
+else case o of
+ four_cases(set1): goto fin_set;
+ four_cases(put1): goto fin_set;
+ set_rule: goto fin_rule;
+ put_rule: goto fin_rule;
+ @t\4@>@<Cases for commands |nop|, |bop|, \dots, |pop|@>@;
+ @t\4@>@<Cases for horizontal motion@>@;
+ othercases if special_cases(o,p,a) then goto done@+else goto 9998
+ endcases
+
+@* Rule Accumulation.
+We accumulate all rules generated on a page. At the end of the page,
+the rules are combined to form larger rules when possible, then
+output.
+
+A special record describes the rule rectangles encountered.
+@<Types...@>=
+@!rules = record {rule record}
+@!horiz,@; {Horizontal Coordinate}
+@!width,@; {Width in Horizontal Direction}
+@!vert,@; {Vertical Coordinate}
+@!height:integer; {Height in Vertical Direction}
+@!covered:boolean; {Indicates if combined}
+end;
+
+@ An array of |rules| is defined along with an index.
+@<Glob...@>=
+@!page_rules:array[1..max_rules] of rules; {rules generated on this page}
+@!rules_on_page: 0..max_rules; {count of rules found on this page}
+@!rule_limit_exceeded: boolean; {used to produce just one warning message}
+
+@ Initialize |rules_on_page| to show no rules yet.
+@<Set init...@>=
+@!rules_on_page := 0; {set no rules found yet}
+@!rule_limit_exceeded := false; {so we haven't got too many, either!}
+
+@ This module used to contain the code for collecting rules, but now it's
+limited to calling a procedure elsewhere that does the job.
+
+@<Collect Rules for Page@>=
+Collect_rule(hh, vv, rule_pixels(q), rule_pixels(p));
+
+@ Rules can now be combined and output in the \.{LN3} file. To accomplish
+this the rules are scanned in vertical and then in horizontal order. During
+the scan adjacent rules are combined and marked as used. At completion, rules
+that aren't marked as |covered| are output.
+
+@<Combine and output Rules@>=
+if rules_on_page > 0 then
+ begin
+ reduce_rules;
+ for rules_on_page := rules_on_page downto 1 do
+ with page_rules[rules_on_page] do
+ if not covered then
+ write_ln(ln3_file,csi,'1;',horiz+left_marg:1,';',
+ vert-height+top_marg:1,';',
+ height:1,';',width:1,'!|');
+ rules_on_page := 0
+ end;
+
+@ |reduce_rules| implements the rule reduction algorithm. Maps are generated
+for traversing all rules both horizontally and vertically. Rules can overlap
+or underlap by up to |max_lap_rules| in |height| or |width|.
+
+@<Declare the function called |reduce_rules|@>=
+procedure reduce_rules;
+var
+horiz_map: array[1..max_rules] of 0..max_rules;
+verti_map: array[1..max_rules] of 0..max_rules;
+hi,hj,vi,vj: 0..max_rules;
+ht,vt:integer;
+begin
+for hi := 1 to rules_on_page do horiz_map[hi] := hi;
+for vi := 1 to rules_on_page do verti_map[vi] := vi;
+@<Build Horizontal Map@>@;
+@<Traverse Horizontally@>@;
+@<Build Vertical Map@>@;
+@<Traverse Vertically@>@;
+end;
+
+@ Build map for horizontal combination by sorting the rules into
+increasing vertical order and within the same vertical line into
+increasing horizontal order. This allows for rule combination by
+looking for |width| overlap.
+@<Build Horiz...@>=
+for hi := 1 to rules_on_page-1 do
+ for hj := (hi+1) to rules_on_page do
+ if (page_rules[horiz_map[hi]].vert > page_rules[horiz_map[hj]].vert) or
+ ((page_rules[horiz_map[hi]].vert = page_rules[horiz_map[hj]].vert) and
+ (page_rules[horiz_map[hi]].horiz > page_rules[horiz_map[hj]].horiz)) then
+ begin ht:=horiz_map[hi]; horiz_map[hi]:=horiz_map[hj];
+ horiz_map[hj]:=ht end;
+
+@ Build map for vertical combination by sorting the rules into
+increasing horizontal order and within the same horizontal line into
+increasing vertical order. This allows for rule combination by
+looking for |height| overlap.
+@<Build Verti...@>=
+for vi := 1 to rules_on_page-1 do
+ for vj := (vi+1) to rules_on_page do
+ if (page_rules[verti_map[vi]].horiz > page_rules[verti_map[vj]].horiz) or
+ ((page_rules[verti_map[vi]].horiz = page_rules[verti_map[vj]].horiz) and
+ (page_rules[verti_map[vi]].vert > page_rules[verti_map[vj]].vert)) then
+ begin vt:=verti_map[vi]; verti_map[vi]:=verti_map[vj];
+ verti_map[vj]:=vt end;
+
+@ Traverse mapped rules looking for adjoining vertical rules. We actually
+look for |height| overlap within |max_lap_rules|. Rules that have been
+combined with other rules are set |covered := true|.
+@<Traverse Verti...@>=
+for vi:=1 to rules_on_page-1 do
+ with page_rules[verti_map[vi]] do
+ if not covered then
+ for vj:= vi+1 to rules_on_page do
+ if not page_rules[verti_map[vj]].covered then
+ begin
+ vt := vert - (page_rules[verti_map[vj]].vert -
+ page_rules[verti_map[vj]].height);
+ if ((horiz = page_rules[verti_map[vj]].horiz) and
+ (width = page_rules[verti_map[vj]].width) and
+ (abs(vt) <= max_lap_rules)) then
+ begin
+ vert := page_rules[verti_map[vj]].vert;
+ height := height + page_rules[verti_map[vj]].height - vt;
+ page_rules[verti_map[vj]].covered := true;
+ end;
+ end;
+
+@ Traverse mapped rules looking for adjoining horizontal rules. We actually
+look for |width| overlap within |max_lap_rules|. Rules that have been
+combined with other rules are set |covered := true|.
+@<Traverse Horiz...@>=
+for hi:=1 to rules_on_page-1 do
+ with page_rules[horiz_map[hi]] do
+ if not covered then
+ for hj:= hi+1 to rules_on_page do
+ if not page_rules[horiz_map[hj]].covered then
+ begin
+ ht := (horiz+width) - page_rules[horiz_map[hj]].horiz;
+ if ((vert = page_rules[horiz_map[hj]].vert) and
+ (height = page_rules[horiz_map[hj]].height) and
+ (abs(ht) <= max_lap_rules)) then
+ begin
+ width := width + page_rules[horiz_map[hj]].width - ht;
+ page_rules[horiz_map[hj]].covered := true;
+ end;
+ end;
+
+@ @<Declare the function called |special_cases|@>=
+function special_cases(@!o:eight_bits;@!p,@!a:integer):boolean;
+label change_font,move_down,done,9998;
+var q:integer; {parameter of the current command}
+@!k:integer; {loop index}
+@!bad_char:boolean; {has a non-ASCII character code appeared in this \\{xxx}?}
+@!pure:boolean; {is the command error-free?}
+@!vvv:integer; {|v|, rounded to the nearest pixel}
+begin pure:=true;
+case o of
+@t\4@>@<Cases for vertical motion@>@;
+@t\4@>@<Cases for fonts@>@;
+four_cases(xxx1): @<Translate an |xxx| command and |goto done|@>;
+pre: begin error('preamble command within a page!'); goto 9998;
+ end;
+@.preamble command within a page@>
+post,post_post: begin error('postamble command within a page!'); goto 9998;
+@.postamble command within a page@>
+ end;
+othercases begin error('undefined command ',o:1,'!');
+ goto done;
+@.undefined command@>
+ end
+endcases;
+move_down: @<Finish a command that sets |v:=v+p|, then |goto done|@>;
+change_font: @<Finish a command that changes the current font,
+ then |goto done|@>;
+9998: pure:=false;
+done: special_cases:=pure;
+end;
+
+@ If we meet a |bop|, something's gone amiss, because |do_page| should never
+see one of these commands.
+
+When |eop| is met, we have to cater for two possibilities:
+\item{$\bullet$} It's the end of a page in the \.{DVI} file, in which case
+we must output all the glyphs, rules and bitmaps that we've accumulated;
+having done this, we reset |max_h_so_far| and |max_v_so_far| so that each
+page's dimensions are considered under the same conditions.
+\item{$\bullet$} It terminates a stored sequence of |dvi| bytes
+corresponding to a character taken from a virtual font.
+
+If |push| is met, we don't bleat about exceeding the maximum stack size
+reported by \TeX\ if the command has been read from a virtual character
+sequence.
+
+@<Cases for commands |nop|, |bop|, \dots, |pop|@>=
+nop: goto done;
+bop: begin error('bop occurred before eop!'); goto 9998;
+@.bop occurred before eop@>
+ end;
+eop:if vf_take<0 then
+ begin
+ if s<>0 then error('stack not empty at end of page (level ',
+ s:1,')!');
+@:Error: stack not empty}{\quad\.{stack not empty...}@>
+ if max_h<>max_h_saved then
+ warning('Page wider than TeX reported by ',
+ (max_h-max_h_saved)/65536.0:1:4,'pt');
+@:Warning: Page wider than TeX reported}{\quad\.{Page wider than }\TeX\.{...}@>
+ if max_v<>max_v_saved then
+ warning('Page deeper than TeX reported by ',
+ (max_v-max_v_saved)/65536.0:1:4,'pt');
+@:Warning: Page deeper than TeX reported}{\quad\.{Page deeper than }\TeX\.{...}@>
+ @<Move to top of form@>;@/
+ @<Combine and...@>@;
+ do_page:=true;@/
+ @<Output contents of page@>;@/
+ write(ln3_file,LF); {LF after page}
+ new_orient:=orientation;
+ @<Change page orientation@>; {reset, if necessary}
+ max_h:=max_h_saved; max_h_so_far:=max_h;
+ max_v:=max_v_saved; max_v_so_far:=max_v;
+ top_of_page:=true;
+ goto 9999;
+ end else
+ begin
+ do_page:=true;
+ goto 9999
+ end;
+push: begin
+ if s=max_s_so_far then
+ begin max_s_so_far:=s+1;
+ if (s=max_s) and (vf_take<0) then
+ error('push deeper than claimed in postamble!');
+@:Error: push deeper than claimed}{\quad\.{push deeper than claimed...}@>
+ if s=stack_size then
+ begin capacity_exceeded('stack size=',stack_size:1);
+@:capacity exceeded stack size}{\quad\.{stack size}@>
+ goto 9998;
+ end;
+ end;
+ hstack[s]:=h; vstack[s]:=v; wstack[s]:=w;
+ xstack[s]:=x; ystack[s]:=y; zstack[s]:=z;
+ hhstack[s]:=hh; vvstack[s]:=vv; incr(s); goto done;
+ end;
+pop: begin
+ if s=0 then error('pop illegal at level zero')
+@:Error: pop illegal at level zero}{\quad\.{pop illegal at level zero}@>
+ else begin decr(s);
+ if (vv <> vvstack[s]) and (vvstack[s]>=0) then finish_seg;
+ {different row of pixels}
+ hh:=hhstack[s]; vv:=vvstack[s];
+ h:=hstack[s]; v:=vstack[s]; w:=wstack[s];
+ x:=xstack[s]; y:=ystack[s]; z:=zstack[s];
+ end;
+ goto done;
+ end;
+
+@ Rounding to the nearest pixel is best done in the manner shown here, so as
+to be inoffensive to the eye: When the horizontal motion is small, like a
+kern, |hh| changes by rounding the kern; but when the motion is large, |hh|
+changes by rounding the true position |h| so that accumulated rounding errors
+disappear. We allow a larger space in the negative direction than in
+the positive one, because \TeX\ makes comparatively
+large backspaces when it positions accents.
+
+@d out_space==if (p>=font_space[cur_font])or(p<=-4*font_space[cur_font]) then
+ hh:=pixel_round(h+p)
+ else hh:=hh+pixel_round(p);
+ q:=p; goto move_right
+
+@<Cases for horizontal motion@>=
+four_cases(right1):begin out_space @+end;
+w0,four_cases(w1):begin w:=p; out_space @+end;
+x0,four_cases(x1):begin x:=p; out_space @+end;
+
+@ Vertical motion is done similarly, but with the threshold between
+``small'' and ``large'' increased by a factor of five. The idea is to make
+fractions like ``$1\over2$'' round consistently, but to absorb accumulated
+rounding errors in the baseline-skip moves.
+
+@d out_vmove==if abs(p)>=5*font_space[cur_font] then vv:=pixel_round(v+p)
+ else vv:=vv+pixel_round(p);
+ finish_seg;
+ goto move_down
+
+@<Cases for vertical motion@>=
+four_cases(down1):begin out_vmove @+end;
+y0,four_cases(y1):begin y:=p; out_vmove @+end;
+z0,four_cases(z1):begin z:=p; out_vmove @+end;
+
+@ @<Cases for fonts@>=
+sixty_four_cases(fnt_num_0): goto change_font;
+four_cases(fnt1): goto change_font;
+four_cases(fnt_def1): begin define_font(p); goto done; end;
+
+@ We need a certain amount of extra space in order to store the details of
+\.{\BS special} commands as we work on them.
+
+@<Glob...@>=
+@!spec_par:packed array [1..max_special] of ASCII_code; {used to hold a
+\.{\BS special} command}
+@!spec_len: integer; {the space-stripped length of a \.{\BS special} command}
+@!spec_ptr: integer; {pointer while decoding a \.{\BS special} command}
+@!spec_cmd: str_number; {identifies a command string in a \.{\BS special}}
+@!spec_unsupported : boolean;
+@!spec_ch : ASCII_code;
+@!point : array [1..max_points] of point_type;
+
+@ This data structure records the co\"ordinates of a point generated by the
+\.{defpoint} \.{\BS special}. Such co\"ordinates are recorded in LN03
+dimensions.
+
+@<Types...@>=
+@!point_type = packed record
+ @!hh,@!vv : integer;
+ @!present : boolean;
+end;
+
+@ Let's preset that which we've just defined\dots
+
+@<Preset...@>=
+for k:=1 to max_points do point[k].present:=false;
+
+@ |xxx| commands in the DVI file arise from \.{\\special} commands in the
+{\TeX} source file. \.{\\special} commands may be used for a variety of
+things, so we must decode them further here.
+
+We support two sorts of \.{\\special} name. The first derives from the
+original (pre-V3) of this driver, of which there is but one example,
+`\.{\\special\{SX\ file-name\}}'. The second sort takes the form:\par
+\leavevmode\hbox{`\.{\\special\{LN03:}\meta{function-name}[\.\ %
+\meta{other-parameters}[\.\ \dots]]\.\}'},\par
+\noindent as in Flavio Rose's original. The \meta{function name}s
+\.{landscape} and \.{portrait} can appear with or without the \.{LN03:}
+prefix We support both versions, with the addition (over early versions of
+this driver) that command decoding is case-insensitive.
+
+This module does various sanity checks on the \.{\BS special} command's
+parameter, ending up with its characters in |spec_par|, the count of characters
+in |spec_len|, and |spec_ptr| pointing to the first character not yet `looked
+at'.
+
+The module (if successful) calls one of the subsidiary routines
+|Copy_sixel_file|, |define_point|, |connect_points| or |reset_points|, actually
+to implement the \.{\BS special} command before going to |done|.
+
+@<Translate an |xxx| command and |goto done|@>=
+begin bad_char:=false;
+if p<0 then error('\special string of negative length!');
+@:Error: special string of negative length}{\quad\.{\\special string of negative length}@>
+if p>max_special then
+begin error('\special string too long!');
+@:Error: special string too long}{\quad\.{\\special string too long}@>
+ p:=max_special
+end;
+for k:=1 to p do
+ begin q:=get_byte;
+ if (q<" ")or(q>"~") then bad_char:=true else
+ spec_par[k]:=q;
+ end;
+
+{intialize the \.{\\special} decoding routines}
+spec_len:=p; spec_ptr:=1;
+
+{\dots\ and start decoding!!!}
+@<Find start of \.{\\special}'s string(s)@>;
+if not bad_char then begin
+@<Match first command in \.{\\special}@>;
+@<Match the \meta{function name} in a \.{\\special}@>;
+end;
+if bad_char then error('non-ASCII character in \special command!')
+@:Error: non-ASCII character in special}{\quad\.{non-ASCII character in \\special}@>
+else if spec_unsupported
+then spec_error('Unsupported \special ');
+@:Error: Unsupported special}{\quad\.{Unsupported \\special}@>
+spec_unsupported:=false;
+goto done;
+end
+
+@ If there's any space characters at the start of the \.{\\special}
+string, we can safely skip past them\dots
+
+@<Find start of \.{\\special}'s string(s)@>=
+if rd_nb_char(spec_ch) then
+ begin
+ error('Null \special argument!');
+@:Error: Null special argument}{\quad\.{Null \\special argument}@>
+ goto done;
+ end;
+bksp_char
+
+@ We have a very limited choice of commands that may be given without being
+preceded by the device specifier `\.{ln03:}'\dots
+
+@<Match first command in \.{\\special}@>=
+spec_cmd := find_match;
+case spec_cmd of
+ spec_sx: spec_cmd := spec_six; {Substitute |'ln03:sixel'| for |'sx'|}
+ spec_ln: spec_cmd := find_match; {Find string following |'ln03:'|}
+ spec_land, spec_port: do_nothing; {Recognize again in next section}
+ othercases
+ spec_cmd:=0; {Command \&{must} start with |'sx '| or |'ln03:'|!}
+endcases
+
+@ The majority of \.{\\special} \meta{function name}s will be recognized
+here\dots
+
+@<Match the \meta{function name} in a \.{\\special}@>=
+case spec_cmd of
+ spec_land: new_orient:=landscape; {|'landscape'| or |'ln03:landscape'|}
+ spec_port: new_orient:=portrait; {|'portrait'| or |'ln03:portrait'|}
+ spec_six, spec_plt: {|'ln03:sixel'| or |'ln03:plotfile'|}
+ include_sixel_dump;
+ spec_set: {|'ln03:defpoint'|}
+ define_point;
+ spec_con: {|'ln03:connect'|}
+ connect_points;
+ spec_rst: {|'ln03:resetpoints'|}
+ reset_points;
+ othercases
+ spec_unsupported:=true
+endcases
+
+
+@ @<Translate a |set_char|...@>=
+goto fin_set
+
+@ @<Finish a command that either sets or puts a character...@>=
+if p<0 then p:=255-((-1-p) mod 256)
+else if p>=256 then p:=p mod 256; {width computation for oriental fonts}
+@^oriental characters@>@^Chinese characters@>@^Japanese characters@>
+if (p<font_bc[cur_font])or(p>font_ec[cur_font]) then q:=invalid_width
+else q:=cur_font_glyph(p).width;
+if q=invalid_width then
+ begin error('character ',p:1,' invalid in font ');
+@.character $c$ invalid...@>
+ print_font(cur_font);
+ if cur_font<>nf then print('!'); {font |nf| has `\.!' in its name}
+ end;
+ if font_type[cur_font]=missing then
+ @<Substitute a solid rule for character from missing font@>
+ else
+ ord_text(p);
+if o>=put1 then goto done;
+if q=invalid_width then q:=0
+else hh:=hh+cur_font_glyph(p).pixel_width;
+goto move_right
+
+@ @<Finish a command that either sets or puts a rule...@>=
+q:=signed_quad;
+if (p>0)and(q>0) then @<Collect Rules...@>@;
+if o=put_rule then goto done;
+hh:=hh+rule_pixels(q); goto move_right
+
+@ A sequence of consecutive rules, or consecutive characters in a fixed-width
+font whose width is not an integer number of pixels, can cause |hh| to drift
+far away from a correctly rounded value. \.{DVItoLN03} ensures that the
+amount of drift will never exceed |max_drift| pixels.
+
+Since \.{DVItype} is intended to diagnose strange errors, it checks
+carefully to make sure that |h| and |v| do not get out of range.
+Normal \.{DVI}-reading programs need not do this, but \.{DVItoLN03} makes some
+of these same checks and reports characters which are ``set'' outside the page
+(as reported by \TeX\ itself).
+
+No warning is given when |max_h_so_far| exceeds |max_h| by less than~100,
+since 100 units is invisibly small; it's approximately the wavelength of
+visible light, in the case of \TeX\ output. Rounding errors can be expected
+to make |h| and |v| slightly more than |max_h| and |max_v|, every once in
+a~while; hence small discrepancies are not cause for alarm.
+
+@d infinity==@'17777777777 {$\infty$ (approximately)}
+@d max_drift=2 {we insist that abs|(hh-pixel_round(h))<=max_drift|}
+
+@<Finish a command that sets |h:=h+q|, then |goto done|@>=
+if (h>0)and(q>0) then if h>infinity-q then
+ begin error('arithmetic overflow! parameter changed from ',@|
+@.arithmetic overflow...@>
+ q:1,' to ',infinity-h:1);
+ q:=infinity-h;
+ end;
+if (h<0)and(q<0) then if -h>q+infinity then
+ begin error('arithmetic overflow! parameter changed from ',@|
+ q:1,@| ' to ',@|(-h)-infinity:1);
+ q:=(-h)-infinity;
+ end;
+@<Record current position of any text output@>;
+hhh:=pixel_round(h+q);
+if abs(hhh-hh)>max_drift then
+ if hhh>hh then hh:=hhh-max_drift
+ else hh:=hhh+max_drift;
+h:=h+q;
+if abs(h)>max_h_so_far then
+ begin if abs(h)>max_h+h_fuzz then
+ max_h:=abs(h);
+ max_h_so_far:=abs(h);
+ end;
+goto done
+
+@ If the |cur_font| wasn't available for downloading to the LN03, instead of
+imaging the glyph we output a solid rule of the dimensions given by the
+\.{TFM} file (on the proviso that the \.{DVI} file couldn't have been
+generated by \TeX\ if the font was totally unknown).
+
+@<Substitute a solid rule for character from missing font@>=
+ with cur_font_glyph(p) do
+ Collect_rule(hh,vv+pixel_depth,pixel_width,pixel_height+pixel_depth)
+
+@ Procedure |do_page| gets to label |move_right| to record the rightmost
+excursion of any character that's just been set: however, with virtual
+fonts, we can end up with |cur_seg=nil|.
+
+@<Record current position of any text output@>=
+if ((o<set_char_0+128) or
+ ((o>=set1) and (o<set1+4)) or
+ ((o>=put1) and (o<put1+4))) and
+ (cur_seg<>nil) then
+ cur_seg^.xe:=x_pos;
+
+@ @<Finish a command that sets |v:=v+p|, then |goto done|@>=
+if (v>0)and(p>0) then if v>infinity-p then
+ begin error('arithmetic overflow! parameter changed from ',
+@.arithmetic overflow...@>
+ p:1,' to ',infinity-v:1);
+ p:=infinity-v;
+ end;
+if (v<0)and(p<0) then if -v>p+infinity then
+ begin error('arithmetic overflow! parameter changed from ',
+ p:1, ' to ',(-v)-infinity:1);
+ p:=(-v)-infinity;
+ end;
+vvv:=pixel_round(v+p);
+if abs(vvv-vv)>max_drift then
+ if vvv>vv then vv:=vvv-max_drift
+ else vv:=vvv+max_drift;
+v:=v+p;
+if abs(v)>max_v_so_far then
+ begin if abs(v)>max_v+v_fuzz then
+ max_v:=abs(v);
+ max_v_so_far:=abs(v);
+ end;
+goto done
+
+@ @<Finish a command that changes the current font...@>=
+font_num[nf]:=p; cur_font:=0;
+while font_num[cur_font]<>p do incr(cur_font);
+if cur_font=nf then
+ error('reference to an unloaded font');
+@:Error: reference to unloaded font}{\quad\.{reference to unloaded font}@>
+cur_font:=font_map[cur_font]; cur_base:=glyph_base[cur_font];
+finish_seg;
+goto done
+
+@* Font usage pass. Whilst gathering the font usage statistics, each |bop|
+command will cause various variables to be updated which the ``real'' pass
+through the file would not expect to have changed. Therefore, we copy the
+state of these variables after recognising the start of the first page
+requested, and restore them (and the file position), before commencing the
+true output pass. The Boolean |scanning| inhibits output to the \.{TYP} file
+during this phase.
+
+@<Globals...@>=
+@!start_page_count:integer;
+@!scanning:boolean;
+
+@ @<Preset...@>=
+scanning:=false;
+
+@ Having found the first page which is eligible for translation to LN03
+format, we skip rapidly through the remainder of the file, noting whether any
+particular character of each font is actually used in the output. The file is
+then further read until the postamble is reached, and the character usage
+information used to generate the appropriate down-line loadable font(s) for
+the LN03.
+@^down-line loading of fonts@>
+
+@<Gather font usage statistics@>=
+begin
+ monitor('Gathering font usage statistics...');
+@.Gathering font usage statistics@>
+ start_loc:=old_backpointer; { Remember where the first page started }
+ start_page_count:=page_count-1; { Preserve, since |bop|s will change this }
+ scanning:=true;@/
+ skip_pages; { Note usage of any required characters }
+ scanning:=false; {We've completed the scanning phase}
+ if signed_quad<>old_backpointer then
+ error('backpointer in byte ',cur_loc-4:1,
+ ' should be ',old_backpointer:1,'!');
+@:Error: backpointer in byte should be}{\quad\.{backpointer...should be...}@>
+ substitution_pass:=true; {Prevents spurious ``font already defined''s}
+ read_postamble;@/
+ @<Assign font/char mapping@>;@/
+ @<Download font files@>;@/
+ @<Restore pointers after font usage pass@>;@/
+ in_postamble:=false;
+end
+
+@ After we've finished the font usage pass, we must restore all the various
+pointers into the |dvi_file| to their state preceding the pass, so that the
+main program can just carry on with the actual setting of the glyphs.
+
+@<Restore pointers after font usage pass@>=
+old_backpointer:=start_loc; {for when the next |bop| is met}
+move_to_byte(start_loc+1); {Go back to just after |bop| of starting page}
+for k:=0 to 9 do count[k]:=signed_quad; {fill in page number array}
+p:=signed_quad; {Swallow the |old_backpointer|}
+page_count:=start_page_count
+
+@*Map characters to LN03 fonts. At this point, we know which characters have
+actually been invoked in each of the \TeX\ fonts. Since the LN03 has
+limited font memory, as many characters as practicable are packed into a
+188-character LN03 font; these characters will typically be taken from at
+least two \TeX\ fonts.
+@^LN03 laser printer@>
+
+We therefore require to know, for each \TeX\ character, to which LN03 font it has
+been allocated, and what character value it occupies in that font. When
+characters are actually being typeset, only ten LN03 fonts are directly
+accesible at any one time (corresponding to the Select Graphic Rendition
+parameters 10..19); if the character to be typeset is allocated to a different
+LN03 font, a suitable escape sequence will need to be output to change the
+font which the LN03 is accessing.
+
+The following declarations accomplish this mapping$\ldots$
+
+@d left_first="!" {These are the ``printable'' character ranges}
+@d left_last="~" {which may appear in an LN03 font}
+@d right_first=left_first+128
+@d right_last=left_last+128
+
+@ For any particular \TeX\ font, |the_txf|, we count in
+|font_occupancy[the_txf]| the number of characters invoked from that font.
+To save all that indexing of arrays for this, the counting actually takes
+place in |usage|. The array |txf_to_lnf| provides the number of the LN03
+internal font into which |the_txf| has been mapped, whilst |txf_ord| is a
+list of |the_txf|s in the order in which they were mapped (largest first).
+For each of the LN03's internal fonts, |lnf|, the array element
+|last_lnf[lnf]| contains the character code of the last character used
+therein to map a character. |ch_widths| is an array which records the actual
+width, in pixels, of each character created within an LN03 font.
+
+The scalar variables used in this section include: (1) |txf_size| which
+records how many characters are used in the next largest \TeX\ font
+remaining; (2) |lnf_spare| records the number of unallocated glyphs
+remaining in the LN03 font-file currently being filled; (3) |total_rasters|
+counts the number of bytes of character rasters downloaded (this is reported
+on the terminal and the \.{TYP} log file, and may be important to
+installations without additional RAM font memory on the LN03); (4)
+|pxl_ident| reminds us whether |the_txf| exists as a packed or unpacked
+pixel file.
+
+@<Globals in...@>=
+@!font_occupancy:packed array [0..max_fonts] of 0..256; {Number of characters used}
+@!usage:-1..256;
+@!next_lnf:0..max_lnfonts+1; {Next LN03 font index to be allocated}
+@!next_txf:0..max_fonts; {Next \TeX\ font to be mapped}
+@!txf_size:-1..256; {Occupancy of largest remaining \TeX\ font}
+@!txf_to_lnf:packed array [0..max_fonts] of -1..max_lnfonts; {Maps \TeX\ font to LN03 font}
+@!txf_ord:packed array [0..max_fonts] of -1..max_fonts; {Contains \TeX\ font numbers in
+order of mapping}
+@!the_txf:0..max_fonts; {TeX font currently being mapped}
+@!lnf_spare:integer; {``Spare'' room in current LN03 font}
+@!last_lnf:packed array [0..max_lnfonts] of left_first..right_last;
+{``Last'' character allocated in an LN03 font}
+@!total_rasters:integer; {Total size of down-loaded fonts}
+@!ch_widths:array [0..max_lnfonts,left_first..right_last] of integer;
+@!pxl_ident:pixel_types;
+
+@ At present, none of the LN03 fonts are `in use'; neither have any of them
+been mapped to |SGR| (Select Graphic Rendition) codes.
+
+We also clear out the variable in which we accumulate the count of all bytes
+transferred as character rasters.
+
+@<Set initial...@>=
+for m:=0 to max_lnfonts do font_in_use[m]:=-1;
+for m:=0 to max_SGR do who_uses[m]:=-1;
+total_rasters:=0;
+
+@ We now perform the actual mapping. Each \TeX\ font is considered in turn,
+starting with the largest (most densely occupied) as yet unallocated. The
+characters of this font are mapped to the next available LN03 font, and the
+remaining space in the LN03 font is allocated to the largest \TeX\ fonts which
+will fit. When no such \TeX\ font will fit in the remaining space, a new LN03
+font is ``opened''.
+
+Before we go ahead and map \TeX\ characters to physical ones, we have to
+ensure that we're not still considering virtual fonts.
+
+@<Assign font/char mapping@>=
+@<Remap any virtual fonts@>;
+@<Determine occupancy of each \TeX\ font@>;
+next_lnf:=0; next_txf:=0; {Order of fonts}
+repeat
+ lnf_spare:=left_last-left_first+1+right_last-right_first+1; {therefore =
+ 188}
+ txf_size:=-1; {We're searching for largest font}
+ @<Find largest unallocated font@> ;
+ if txf_size>0 then {Assuming there are any unallocated}
+ begin
+ if next_lnf>max_lnfonts then capacity_exceeded('too many LN03 fonts');
+@:capacity exceeded too many LN03 fonts}{\quad\.{too many LN03 fonts}@>
+ m:=left_first-1; {We'll start with the ``!'' character}
+ @<Map characters in \TeX\ font to allocated LN03 font@>;
+ @<Fit further \TeX\ fonts into LN03 font file@>;
+ incr(next_lnf)
+ end; {Fitted largest \TeX font, and some more, into an LN03 font}
+until txf_size<=0; {Repeat until all fonts mapped}
+
+@ We firstly require to know how many different characters have been invoked
+from each of the \TeX\ fonts used in the document. The following section of
+code performs this feat.
+
+
+To speed things up, we avoid the double indexing of |glyphs| that would
+occur if we used |glyph_map|; these definitions help.
+
+@d first_glyph_index(#)==glyph_base[#]+font_bc[#]
+@d last_glyph_index(#)==glyph_base[#]+font_ec[#]
+@<Determine occupancy of each \TeX\ font@>=
+for m:=0 to nf-1 do {Determine how occupied each \TeX\ font is}
+begin usage:=0;
+ for n:=first_glyph_index(m) to last_glyph_index(m) do
+ if glyphs[n].loaded=wanted then incr(usage);
+ font_occupancy[m]:=usage;
+ txf_ord[m]:=-1; {Font unallocated}
+ txf_to_lnf[m]:=-1
+end
+
+@ Because we want to avoid having a single \TeX\ font overlapping two separate
+fonts in the LN03 (which would require more control sequences to be output),
+we prefer to have a large font starting off a new |ln_font|. This can be
+achieved by finding the largest font that has not yet been allocated a
+``home''.
+
+(After mapping this font, we can use up the remaining unallocated characters of
+the |ln_font| by putting smaller \TeX\ fonts into the same |ln_font|.)
+
+It might prove embarrassing to attempt to map a virtual font, so we only
+load fonts that are marked as |wanted|; this excludes |virtual| fonts, and
+also those referenced from such a font from which all the glyphs are
+|unused|.
+
+@<Find largest unallocated font@>=
+for n:=0 to nf-1 do
+if (font_type[n]=wanted) and (font_occupancy[n]>txf_size) then
+ begin txf_size:=font_occupancy[n];
+ the_txf:=n
+ end
+@ Having fitted a ``fullish'' \TeX\ font into a fresh LN03 font, we now
+attempt to fill up the space remaining in the latter by squeezing in as many
+smaller fonts as will fit. |lnf_spare| has been set to indicate how many
+unallocated glyphs remain in the LN03 font, so we find the largest font whose
+occupancy is not greater than this amount, and map it in; this process is
+repeated until there is no \TeX\ font remaining that will fit in the
+|lnf_spare| space remaining, at which point a new LN03 font is started (if
+necessary).
+
+@<Fit further \TeX\ fonts into LN03 font file@>=
+while lnf_spare>0 do {Now find any \TeX\ font that fits in remainder}
+begin usage:=-1; {Performs same function as |txf_size| above}
+ for n:=0 to nf-1 do {Find largest remaining that fits}
+ if (font_type[n]=wanted) and {provided it's physical, unmapped and}
+ (font_occupancy[n]>usage) and {it's more densely used}
+ (font_occupancy[n]<=lnf_spare) then {and it fits in space available}
+ begin usage:=font_occupancy[n];
+ the_txf:=n
+ end;@t\2@>
+ if usage > 0 then {There's one that fits!}
+ begin
+ m:=last_lnf[next_lnf]; {Last character allocated in LN03 font}
+ @<Map characters in \TeX\...@>;
+ end else
+ lnf_spare:=0; {Nothing else fits; force new LN03 font}
+end { while spare space remains in LN03 font}
+
+
+@ The following code maps the characters in the current (|the_txf|) \TeX\ font
+to character positions in the current (|next_lnf|) LN03 font. No attempt is
+made to make the mapped characters intelligible if the \.{LN3} file is
+printed; this would be a ``nice'' revision of the program, but well nigh
+impossible!
+
+@<Map characters in \TeX\...@>=
+txf_to_lnf[the_txf]:=next_lnf; {Map \TeX\ font to LN03 font}
+txf_ord[next_txf]:=the_txf; {Save \TeX\ font numbers, largest first}
+font_type[the_txf]:=yes; {Avoid considering this font again!}
+incr(next_txf);
+for k:=first_glyph_index(the_txf) to last_glyph_index(the_txf) do
+ with glyphs[k] do
+ if loaded=wanted then {Work through the characters of the \TeX\ font}
+ begin
+ @<Put LN03 code for this \TeX\ character into |m|@> ;
+ decr(lnf_spare); {Count one less free}
+ char_code:=m;
+ end;
+last_lnf[next_lnf]:=m {Note ``last'' character allocated in LN03 font}
+
+
+@ As we allocate characters from |the_txf| to the LN03 font |next_lnf|, we
+have to ensure that the character codes used are those of \&{printing}
+characters on the LN03. The LN03 uses the customary \.{C0} and \.{C1} control
+code sets of the ISO/ASCII standards, and so the only printable characters are
+`\.\SP' to `\.\TL' (|left_first..left_last|) and the corresponding
+positions with the eighth bit set (|right_first..right_last|). This coding
+scheme has ``holes'' in it, so we need to make appropriate adjustments.
+
+Furthermore, if we permit a large font (with more than 188 characters used) to
+span across into a second LN03 internal font, we have to make the transition
+to the beginning of the second font, noting the false ``last character used''
+and revising |lnf_spare| to reflect the new (unused) font.
+
+@<Put LN03 code for this \TeX\ character into |m|@>=
+if m=right_last then {Start another LN03 font for spanning \TeX\ font}
+ begin last_lnf[next_lnf]:=right_last;
+ lnf_spare:=left_last-left_first+1+right_last-right_first+1;
+ m:=left_first;
+ incr(next_lnf)
+ end
+else
+ if m=left_last then m:=right_first {make transition to GR set in font}
+ else incr(m); {Next free character in LN03 font}
+
+@*Generating LN03 font for downloading.
+The following code generates the content of an LN03 font file, in memory,
+and then calls |add_txf_to_lnf| to put the rasters into this file.
+The file type extension is \.{.LN3}, and this file is always opened in the
+user's default directory.
+
+
+The next section of code actually generates the \.{LN3} file, starting with
+its ``set up'' information. The program continues by creating and downloading
+each necessary LN03 font, by successive calls of the function
+|add_txf_to_lnf|, which returns as result the number of bytes downloaded in
+the rasters of the characters contained therein; this is added to
+|total_rasters| so that DVItoLN03 can report the size of all the fonts loaded.
+
+The first (or only) LN03 font file downloaded is introduced by the |DCS|
+(Device Control Sequence) |'0;1;0y'|; these three parameters indicate,
+respectively, that the font file is in Digital font file format, is \&{not} to
+print a summary sheet, and is to replace all previously downloaded fonts.
+Successive LN03 fonts are separated from the previous ones by a simple |','|
+character; whilst the end of the font download is marked by the |ST| (String
+Terminator) character --- this is preceded by a textual comment.
+
+@<Download font files@>=
+@<Generate \.{LN3} file header@>;
+total_rasters:=0;
+if next_txf > 0 then {Unlikely that no characters were used, but...}
+begin
+ write_ln(ln3_file,dcs,'0;1;0y'); {Replace all fonts with these}
+ for m:=0 to next_txf-1 do {Cycle through the ``used'' \TeX\ fonts}
+ begin k:=txf_ord[m]; {Get \TeX\ font number corresponding to next largest font}
+ name_pxl_file(k,file_name,pxl_ident);
+ if (m>0) then
+ @<Separate LN03 internal fonts@> ;
+ @<Copy glyphs to LN03 font; report size of rasters@>
+ end;
+ write_ln(ln3_file,';DVItoLN03 font load',st); {End of all fonts}
+end;
+print_ln('Total of ',total_rasters:1,' bytes of rasters downloaded');
+write_ln(term_out,'Total of ',total_rasters:1,
+ ' bytes of rasters downloaded',crlf);
+@:Total of n bytes of rasters}{\.{Total of $n$ bytes of rasters...}@>
+@<Complete mapping of virtual characters@>; {point to the real ones}
+{Set page limits}
+write(ln3_file,csi,x_min:1,';',page_wid:1,'s',csi,y_min:1,';',page_len:1,'r');
+@<Designate first 10 fonts to SGRs |10..19|@>@;
+
+@ We start by writing the LN03 directives to the front of the file. Since the
+introduction of the LN03-Plus, this has been made more complicated, because
+the sequence |esc, 'c'| is meaningful (and \&{not} as |RIS|!) when the
+LN03-Plus is in the Tektronix emulation mode. Therefore, we start off by
+outputting the sequence |esc, '[!p'| which is DEC's private ``soft terminal
+reset'' (|DSCSTR|). (Note that this sequence uses the ``long-winded'' way of
+specifying |csi|; this is because the LN03-plus ignores the eigth bit when it
+is emulating a Tektronix terminal.) However, this won't necessarily reset an
+`ordinary' LN03, so we output the ISO-standard |RIS| (Reset Initial State
+$\equiv$ |esc,'c'|) sequence as well.
+
+There then follow a number of control sequences which set up further
+characteristics of the LN03: (1) |'?27h'| is a DEC private control sequence,
+|DECPSP|, which selects proportional spacing mode, whereby the printer moves
+forward by the recorded width of the character glyph rather than by some fixed
+amount after printing; (2) |'11h'| \&{set}s the |PUM| (Positioning Unit Mode),
+when set, this mode indicates that ``cursor movement'' sequences work in units
+of either decipoints or pixels, which of these is determined by (3) |'7 I'|
+which sets the |SSU| (Select Size Unit) to be in units of a single pixel; (4)
+|'?52h'| is another DEC private sequence, \&{set}ting the |DECOPM| (Origin
+Placement Mode) which places the origin for all measurement to the upper-left
+corner of the physical page (the alternative is 0.25 inches from that point).
+Finally, the sequence ending in |'t'| contains the |page_len| as a parameter,
+and is another DEC private control sequence which sets the |DECLPP| (Lines per
+Physical Page) to be the height of the printable area, in pixels.
+
+@d DECSTR==esc+'[!p'
+@d RIS==esc+'c'
+@d DECPSP_on==csi+'?27h'
+@d PUM_on==csi+'11h'
+@d SSU_pixel==csi+'7 I'
+@d DECOPM_on==csi+'?52h'
+
+@<Generate \.{LN3} file header@>=
+if orientation=landscape then
+ write_ln(ln3_file,DECSTR,RIS,csi,PFS_landscape)
+else
+ write_ln(ln3_file,DECSTR,RIS,csi,PFS_portrait);
+cur_orient:=orientation; new_orient:=orientation;
+write_ln(ln3_file,DECPSP_on,PUM_on,SSU_pixel,DECOPM_on,csi,page_len:1,'t');
+@<Select printing mode and feed tray on DEClaser printers@>
+
+@ If we are starting the download of any except the first \TeX\ font, it may
+be that the previous \TeX\ font was the last loaded into the current LN03
+font, which means we will be starting a new LN03 font here. Therefore we need
+to separate the two LN03 fonts from each other: the comma (`\.,') character is
+used by the LN03 for this purpose.
+
+@<Separate LN03 internal fonts@>=
+if (txf_to_lnf[k]<>txf_to_lnf[txf_ord[m-1]]) then
+ write_ln(ln3_file,',')
+
+@ The function |add_txf_to_lnf| performs all the work of creating an LN03 font
+from the rasters in the font file. The result returned by this function
+gives the total number of bytes created in the LN03 font for the given \TeX\
+file.
+
+@<Copy glyphs to LN03 font; report size of rasters@>=
+total_rasters:=total_rasters+
+ add_txf_to_lnf(txf_to_lnf[k],k,file_name,pxl_ident)
+
+@ We may have both packed and unpacked files available from which to take
+pixel bitmaps, so we require some indication of what type of file is
+actually available.
+
+@<Types...@>=
+@!pixel_types = (@!unavailable,@!packed_file,@!pixel_file);
+
+@ The user has the option of using either pixel files (\.{.PXL}) and/or packed
+pixel files (\.{.PK}) as the source of font raster information. There is the
+further option of the directories in which these files are held being either
+``flat'' (with all font files of one class in the same directory) or
+``nested'' (where separate sub-directories are provided for each different
+magnification).
+
+File naming conventions used are illustrated by the following examples, which
+show the names under which \.{cmr10} will be found at magsteps 0--2:
+
+\yskip\centerline{\vbox{\offinterlineskip
+ \hrule
+ \halign{&\vrule#&\strut\hfil#\hfil&\quad\tt#\quad&\quad\tt#\quad&
+ \quad\tt#\quad&\quad\tt#\quad&\vrule#\cr
+ height2pt&\multispan5 &height2pt\cr
+ &\omit\strut Magnif-\hfil&\multispan2\hfil Packed Pixels\hfil&
+ \multispan2\hfil Unpacked Pixels\hfil&\cr
+ &\omit\strut\hfil ication&\hfil\rm Flat\hfil&\hfil\rm Nested\hfil&
+ \hfil\rm Flat\hfil&\hfil\rm Nested\hfil&\cr
+ height2pt&\multispan5 &height2pt\cr
+ \noalign{\hrule}
+ height2pt&\multispan5 &height2pt\cr
+ &0&CMR10.300PK&[300]CMR10.PK&CMR10.1500PXL&[1500]CMR10.PXL&\cr
+ &$1\over2$&CMR10.329PK&[329]CMR10.PK&CMR10.1643PXL&[1643]CMR10.PXL&\cr
+ &1&CMR10.360PK&[360]CMR10.PK&CMR10.1800PXL&[1800]CMR10.PXL&\cr
+ &2&CMR10.432PK&[432]CMR10.PK&CMR10.2160PXL&[2160]CMR10.PXL&\cr
+ height2pt&\multispan5 &height2pt\cr}
+ \hrule
+}}
+
+The program determines which class(es) of files are available from the
+qualifiers \.{/PXL\_FONT\_DIRECTORY} (for the unpacked files) and
+\.{/PK\_FONT\_DIRECTORY} (for the packed files). At least one of these
+qualifiers must be present; if the qualifier provided is a VMS logical name,
+it has been translated repeatedly until a VMS directory specification resulted.
+Examination of (the first translation of) this specification then determines
+whether the flat or nested structure is being used: if the directory
+specification ends with the characters `\.{.]}' it indicates that the raster
+files will be found in sub-directories, whilst absence of the `\..' indicates
+a flat structure. The variables |pk_rooted| and |pxl_rooted| will already
+have been set to reflect this.
+
+Whether packed or unpacked pixel files are used, it is necessary to
+compute a number which relates the magnification to either the sub-directory
+name or the file extension. Since actual file names may well have been
+computed using low-accuracy (possibly integer) arithmetic by operating system
+commands, the possibility exists that the numbers may have been truncated to
+the ``wrong'' integer compared with those that \.{DVItoLN03} computes;
+therefore, we always arrange to look for the files using both the computed
+number and those $\pm1$ from it.
+
+The variable |dir_off| is used to compute the offset from the central figure,
+which is held in |p|. The variables |file_stat| and |find_ctxt| are used in
+conjunction with Vax/VMS system calls to determine whether the requested file
+exists; |found_file| takes the values $-1$, indicating that the file wasn't
+found, or $+1$ if it is found. It also can take the value $0$ whilst the
+search is proceding, so a simple boolean cannot be used instead.
+
+The following procedure converts the \TeX\ font referenced by |TeX_font| into
+the correct strings for the directory and file name under which \.{DVItoLN03}
+expects to find the pixel file.
+
+@p procedure name_pxl_file ( @!TeX_font : integer;@/
+ var @!open_file_name: file_spec;
+ var @!what_it_was: pixel_types);
+ var @!p,@!dir_off,@!file_stat,@!find_ctxt,@!found_file : integer;@/
+ @!found_name,@!expected_file_spec : file_spec;
+begin
+ found_file := -1;
+ expected_file_spec:='';@/
+ @<Locate packed pixel file@>;@/
+ if found_file<0 then
+ @<Locate unpacked pixel file@>;
+ if found_file<0 then
+ begin
+ warning('cannot find file ',expected_file_spec);
+@:Warning: cannot find file}{\quad\.{cannot find file}@>
+ what_it_was:=unavailable
+ end
+end;
+
+
+@ We only look for packed pixel files if the \.{/PK\_FONT\_DIRECTORY}
+qualifier was present, in which case its value will have been placed into the
+string |tex_pk_font|. If the final characters of (the first logical name
+translation of) this string were `\.{.]}', then a nested directory structure
+is assumed (as indicated in |pk_rooted|), and the file is sought in the form
+\hbox{\meta{disk}\meta{directory}\.[\meta{size}\.]\meta{name}\.{.PK}}.
+Alternatively, if the directory is flat, the filename sought will be
+\hbox{\meta{disk}\meta{directory}\meta{name}\..\meta{size}\.{PK}}.
+
+Unfortunately, it is necessary to reconstruct the desired string for each
+offset tried. The \meta{size} is effectively computed from 1.5
+times the font design size compared with the \TeX ware default of 200
+pixels/inch, yielding 300 for unmagnified fonts.
+
+@d append_name==for n:=font_name[TeX_font] to font_name[TeX_font+1]-1 do
+ open_file_name:=open_file_name+xchr[names[n]]
+
+@d flat_file_spec(#)==begin open_file_name := # ;
+ append_name;
+ open_file_name:=open_file_name+'.'+str_int(p+dir_off)
+ end
+
+@d rooted_file_spec(#)==begin open_file_name:= # + '[' +
+ str_int(p+dir_off) + ']';
+ append_name;
+ open_file_name:=open_file_name+'.'
+ end
+
+@<Locate packed pixel file@>==
+if tex_pk_font.length > 0 then
+begin
+ dir_off:=0;
+ p:=round(((resolution/1000)*mag*font_scaled_size[TeX_font])/font_design_size[TeX_font]);
+ repeat
+ if not pk_rooted then
+ flat_file_spec(tex_pk_font)
+ else
+ rooted_file_spec(tex_pk_font);
+ open_file_name:=open_file_name+'PK';
+ @<Attempt to find file with specification |open_file_name|@>
+ until found_file<>0;
+ if found_file>0 then
+ begin
+ open_file_name:=found_name;
+ what_it_was:=packed_file
+ end
+end;
+
+@ To determine the correct file of pixels to be read, the quantity |p| is
+computed; since it is a \TeX ware convention that all pixel files are assumed
+(at magnification=1000) to be at a |resolution| of 200 dots/inch, and the
+LN03's |resolution| is \&{300} dots/inch, then an ordinary unmagnified font
+will be sought with a
+$\langle$\\{size}$\rangle$ of \.{1500}, whilst one magnified \.{\BS magstep 1}
+will have a $\langle$\\{size}$\rangle$ of \.{1800}, \\{etc.} Computation of
+|p| yields the appropriate value for the Vax/VMS directory or file type to be
+used, and |VAX_lib_find_file| is used to verify that the file exists; to allow
+for rounding errors, the directories |p|$\pm1$ are also sought.
+
+@<Locate unpacked pixel file@>==
+if tex_pxl_font.length > 0 then
+begin
+ dir_off:=0;
+ p:=round(((resolution/200)*mag*font_scaled_size[TeX_font])/font_design_size[TeX_font]);
+ repeat
+ if not pxl_rooted then
+ flat_file_spec(tex_pxl_font)
+ else
+ rooted_file_spec(tex_pxl_font);
+ open_file_name:=open_file_name+'PXL';
+ @<Attempt to find file with specification |open_file_name|@>
+ until found_file<>0;
+ if found_file>0 then
+ begin
+ open_file_name:=found_name;
+ what_it_was:=pixel_file
+ end
+end
+
+@ Now that we've got a full file specification (barring the version number) in
+|open_file_name|, we call upon the Vax/VMS system services to try to locate
+the file. Before doing this, we make a note of the file specification if it's
+that for the default file name (with |dir_off = 0|), and we haven't
+previously noted a file name.
+
+The find\_file system service requires a context variable (because it is
+capable of finding a number of files matching a `wild-carded' file
+specification), but we're not interested in that; therefore we always set
+|find_ctxt| to zero before searching. \&{N.B.} This may not be written as the
+constant |0| in the procedure call, because the system service writes a value
+back to this variable.
+
+The system service returns an odd status if the search is successful;
+otherwise we change |dir_off| to a suitable new value, unless we've already
+tried |p| and $p\pm1$, in which case we indicate the absence of the file by
+setting |found_file = -1|.
+
+@<Attempt to find file with specification |open_file_name|@>=
+if (dir_off=0) and (expected_file_spec='') then
+ expected_file_spec:=open_file_name;
+find_ctxt:=0;
+file_stat:=VAX_lib_find_file(open_file_name,found_name,find_ctxt);
+found_file:=0;
+if odd(file_stat) then found_file:=1
+else
+begin
+ if dir_off=1 then found_file:=-1;
+ if dir_off=-1 then dir_off:=1 else dir_off:=-1
+end
+
+@ Although up to |max_lnfonts| may be downloaded by this program, the LN03 is
+only capable of accessing any ten of these at any one time; it accomplishes
+this by allocating the |SGR| (Select Graphic Rendition) designators |10..19|
+to the first ten fonts downloaded. Fonts are designated by means of their
+16-character internal font identifiers, allocated during the generation of
+each font.
+
+@<Designate first 10 fonts to SGRs |10..19|@>=
+for m:=0 to VAX_min(max_SGR,next_lnf-1) do {Match first 10 fonts to |SGR| designators}
+begin font_in_use[m]:=m; who_uses[m]:=m;
+ write_ln(ln3_file,dcs,'1;1',m:1,'}U00000',m:1,'002SK00GG',st)
+end;
+write_ln(ln3_file,csi,'10m'); {|SGR| 10 --- select most used font}
+cur_out:=0 {We won't need to |SGR| if first output uses |SGR| 10}
+
+@*Format of Virtual Fonts. The following description is cribbed almost
+verbatim from Knuth's description of \.{VFtoVP}.
+@^Knuth, D.~E.@>
+@:VFtoVP program}{\.{VFtoVP} program@>
+
+The idea behind \.{VF} files is that a general
+interface mechanism is needed to switch between the myriad font
+layouts provided by different suppliers of typesetting equipment.
+Without such a mechanism, people must go to great lengths writing
+inscrutable macros whenever they want to use typesetting conventions
+based on one font layout in connection with actual fonts that have
+another layout. This puts an extra burden on the typesetting system,
+interfering with the other things it needs to do (like kerning,
+hyphenation, and ligature formation).
+
+These difficulties go away when we have a ``virtual font,''
+i.e., a font that exists in a logical sense but not a physical sense.
+A typesetting system like \TeX\ can do its job without knowing where the
+actual characters come from; a device driver can then do its job by
+letting a \.{VF} file tell what actual characters correspond to the
+characters \TeX\ imagined were present. The actual characters
+can be shifted and/or magnified and/or combined with other characters
+from many different fonts. A virtual font can even make use of characters
+from virtual fonts, including itself.
+
+Virtual fonts also allow convenient character substitutions for proofreading
+purposes, when fonts designed for one output device are unavailable on another.
+
+@ A \.{VF} file is organized as a stream of 8-bit bytes, using conventions
+borrowed from \.{DVI} and \.{PK} files. Thus, a device driver that knows
+about \.{DVI} and \.{PK} format will already contain most of the mechanisms
+necessary to process \.{VF} files.
+
+
+A preamble appears at the beginning, followed by a sequence of character
+definitions, followed by a postamble. More precisely, the first byte of
+every \.{VF} file must be the first byte of the following ``preamble
+command'':
+
+\yskip\hang|pre| 247 |i[1]| |k[1]| |x[k]| |cs[4]| |ds[4]|.
+Here |i| is the identification byte of \.{VF}, currently 202. The string
+|x| is merely a comment, usually indicating the source of the \.{VF} file.
+Parameters |cs| and |ds| are respectively the check sum and the design size
+of the virtual font; they should match the first two words in the header of
+the \.{TFM} file for the virtual font.
+
+\yskip
+After the |pre| command, the preamble continues with font definitions;
+every font needed to specify ``actual'' characters in later
+\\{set\_char} commands is defined here. The font definitions are
+exactly the same in \.{VF} files as they are in \.{DVI} files, except
+that the scaled size |s| is relative and the design size |d| is absolute:
+
+\yskip\hang|fnt_def1| 243 |k[1]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<256|.
+
+\yskip\hang|@!fnt_def2| 244 |k[2]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<65536|.
+
+\yskip\hang|@!fnt_def3| 245 |k[3]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |0<=k<@t$2^{24}$@>|.
+
+\yskip\hang|@!fnt_def4| 246 |k[4]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+Define font |k|, where |@t$-2^{31}$@><=k<@t$2^{31}$@>|.
+
+\yskip\noindent
+These font numbers |k| are ``local''; they have no relation to font numbers
+defined in the \.{DVI} file that uses this virtual font. The dimension~|s|,
+which represents the scaled size of the local font being defined,
+is a |fix_word| relative to the design size of the virtual font.
+Thus if the local font is to be used at the same size
+as the design size of the virtual font itself, |s| will be the
+integer value $2^{20}$. The value of |s| must be positive and less than
+$2^{24}$ (thus less than 16 when considered as a |fix_word|).
+The dimension~|d| is a |fix_word| in units of printer's points; hence it
+is identical to the design size found in the corresponding \.{TFM} file.
+
+@d vf_id_byte=202
+
+@<Glob...@>=
+@!vf_file:byte_file;
+
+@ The preamble is followed by zero or more character packets, where each
+character packet begins with a byte that is $<243$. Character packets have
+two formats, one long and one short:
+
+\yskip\hang|long_char| 242 |pl[4]| |cc[4]| |tfm[4]| |dvi[pl]|. This long form
+specifies a virtual character in the general case.
+
+\yskip\hang|short_char0..short_char241|
+|pl[1]| |cc[1]| |tfm[3]| |dvi[pl]|. This short form specifies a
+virtual character in the common case
+when |0<=pl<242| and |0<=cc<256| and $0\le|tfm|<2^{24}$.
+
+\yskip\noindent
+Here |pl| denotes the packet length following the |tfm| value; |cc| is
+the character code; and |tfm| is the character width copied from the
+\.{TFM} file for this virtual font. There should be at most one character
+packet having any given |cc| code.
+
+The |dvi| bytes are a sequence of complete \.{DVI} commands, properly
+nested with respect to |push| and |pop|. All \.{DVI} operations are
+permitted except |bop|, |eop|, and commands with opcodes |>=243|.
+Font selection commands (|fnt_num0| through |fnt4|) must refer to fonts
+defined in the preamble.
+
+Dimensions that appear in the \.{DVI} instructions are analogous to
+|fix_word| quantities; i.e., they are integer multiples of $2^{-20}$ times
+the design size of the virtual font. For example, if the virtual font
+has design size $10\,$pt, the \.{DVI} command to move down $5\,$pt
+would be a \\{down} instruction with parameter $2^{19}$. The virtual font
+itself might be used at a different size, say $12\,$pt; then that
+\\{down} instruction would move down $6\,$pt instead. Each dimension
+must be less than $2^{24}$ in absolute value.
+
+Device drivers processing \.{VF} files treat the sequences of |dvi| bytes
+as subroutines or macros, implicitly enclosing them with |push| and |pop|.
+Each subroutine begins with |w=x=y=z=0|, and with current font~|f| the
+number of the first-defined in the preamble (undefined if there's no
+such font). After the |dvi| commands have been
+performed, the |h| and~|v| position registers of \.{DVI} format and the
+current font~|f| are restored to their former values;
+then, if the subroutine has been invoked by a \\{set\_char} or \\{set}
+command, |h|~is increased by the \.{TFM} width
+(properly scaled)---just as if a simple character had been typeset.
+
+(The following commands, already defined as macros with respect to the
+\.{DVI} file, have the same interpretation when they appear in a virtual
+font file: \hang |set_char_0|, |set1|, |set_rule|, |put1|, |put_rule|, |nop|,
+|push|, |pop|, |right1|, |w0|, |w1|, |x0|, |x1|, |down1|, |y0|, |y1|, |z0|,
+|z1|, |fnt_num_0|, |fnt1|, |xxx1|, |xxx4|, |fnt_def1|, |pre|, |post|.)
+
+@d long_char=242 {\.{VF} command for general character packet}
+@d improper_DVI_for_VF==139,140,243,244,245,246,247,248,249,250,251,252,
+ 253,254,255
+
+@ The character packets are followed by a trivial postamble, consisting of
+one or more bytes all equal to |post| (248). The total number of bytes
+in the file should be a multiple of~4.
+
+@ Here are some functions, analogous to those for the |dvi_file|, for
+reading one or more bytes from the |vf_file|.
+
+Note that variable |flushing| is used to suppress the warning (when |eof| is
+met on the |vf_file|) if bytes are merely being read to discard the
+postamble.
+
+@p procedure read_vf_file(var x:eight_bits);
+ label 9999;
+ begin while vf_count >= VAX_block_length do
+ begin get(vf_file,VAX_continue); vf_count:=vf_count-VAX_block_length;
+ incr(vf_block);
+ if eof(vf_file) then
+ begin if not flushing then
+ warning('VF file ended without postamble!');
+@:Warning: VF file ended without postamble}{\quad\.{VF file ended without postamble}@>
+ x := post; goto 9999
+ end
+ end;
+ x := vf_file^[vf_count];
+ incr(vf_count); incr(vf_loc);
+9999:
+ end;
+@#
+function @!vf_one: integer; {returns the next byte, unsigned}
+ var @!b: eight_bits;
+begin
+ read_vf_file(b); vf_one:=b
+end;
+@#
+function vf_byte:integer; {returns the next byte, signed}
+var b:eight_bits;
+begin read_vf_file(b);
+if b<128 then vf_byte:=b @+ else vf_byte:=b-256;
+end;
+@#
+function vf_two:integer; {returns the next two bytes, unsigned}
+var a,@!b:eight_bits;
+begin read_vf_file(a); read_vf_file(b);
+vf_two:=a*256+b;
+end;
+@#
+function vf_pair:integer; {returns the next two bytes, signed}
+var a,@!b:eight_bits;
+begin read_vf_file(a); read_vf_file(b);
+if a<128 then vf_pair:=a*256+b
+else vf_pair:=(a-256)*256+b;
+end;
+@#
+function vf_three:integer; {returns the next three bytes, unsigned}
+var a,@!b,@!c:eight_bits;
+begin read_vf_file(a); read_vf_file(b); read_vf_file(c);
+vf_three:=(a*256+b)*256+c;
+end;
+@#
+function vf_trio:integer; {returns the next three bytes, signed}
+var a,@!b,@!c:eight_bits;
+begin read_vf_file(a); read_vf_file(b); read_vf_file(c);
+if a<128 then vf_trio:=(a*256+b)*256+c
+else vf_trio:=((a-256)*256+b)*256+c;
+end;
+@#
+function vf_quad:integer; {returns the next four bytes, signed}
+var a,@!b,@!c,@!d:eight_bits;
+begin read_vf_file(a); read_vf_file(b); read_vf_file(c); read_vf_file(d);
+if a<128 then vf_quad:=((a*256+b)*256+c)*256+d
+else vf_quad:=(((a-256)*256+b)*256+c)*256+d;
+end;
+
+@ Here are the globals required to manipulate the VF file.
+
+@<Glob...@>=
+@!vf_count, @!vf_block, @!vf_loc : integer;
+@!flushing : boolean;
+
+@*Handling Virtual Fonts. Before we look around the fonts, we'd better see
+if any of the fonts so far loaded are virtual ones; this can be determined
+by whether a \.{VF} file exists for the given font.
+
+We use a |while| loop, because the analysis of a virtual font most probably
+will result in the addition of one or more new fonts, some of which may
+themselves be virtual; to prevent infinite recursion with a self-referential
+font, such additional fonts are only loaded if glyphs within the font are
+activated.
+
+@<Remap any virtual fonts@>=
+TeX_font:=0; vf_ptr:=0;
+while TeX_font < nf do {Currently defined fonts, and any this defines anew}
+begin
+if font_type[TeX_font]=wanted then
+ @<Locate virtual font metrics@>;
+incr(TeX_font)
+end;
+
+@ This module determines the name of the \.{VF} file, if it exists,
+corresponding to the current \TeX\ font.
+
+@<Locate virtual font metrics@>=
+if not no_virt_support then
+begin
+ file_name:='';
+ for n:=font_name[TeX_font] to font_name[TeX_font+1]-1 do
+ if (names[n]>="a") and (names[n]<="z") then
+ file_name:=file_name+xchr[names[n]+"A"-"a"]
+ else
+ file_name:=file_name+xchr[names[n]];
+ open(vf_file,file_name,@=readonly@>,@=access_method@>:=@=direct@>,
+ @=user_action@>:=file_open,@=default@>:=tex_virtual+'.VF;0',
+ VAX_continue);
+ file_stat:=status(vf_file);
+ if (file_stat<>0) and (file_stat<>3) then
+ begin
+ case file_stat of
+ 2: file_message := 'PAS-E-ERRDUROPE';
+ 5: file_message := 'PAS-E-ACCMETINC';
+ 6: file_message := 'PAS-E-RECLENINC';
+ 7: file_message := 'PAS-E-RECTYPINC';
+ 8: file_message := 'PAS-E-ORDSPEINC';
+ othercases
+ file_message := str_int(file_stat);
+ endcases;
+ abort('Couldn''t open virtual font ',file_name,'. Status=',file_message);
+@:fatal error Couldn't open virtual font}{\quad\.{Couldn't open virtual font}@>
+ end
+ else if file_stat=0 then
+ begin
+ reset(vf_file);
+ vf_block:=0; vf_count:=0; vf_loc:=0;
+ font_type[TeX_font]:=virtual;
+ open_file_name:=def_file_name;@/
+ @<Find name and magnification of font file@>;@/
+ @<Report name of font file in use@>;@/
+ print_ln(' [virtual]');
+ write_ln(term_out,' is virtual',crlf);@/
+ read_VF;@/
+ close(vf_file,@=disposition@>:=@=save@>,VAX_continue);
+ end;
+end
+
+@ Globals for storing virtual font files: unlike \.{VFtoVP},
+@.VFtoVP@>
+we don't read the \\{entire} file into memory. We do, however, store those
+|dvi| bytes that belong to some wanted character packets, but only for
+glyphs which are more complex than simply imaging a character from some
+other font; this is efficient, and also feasible, since VF files are never
+very large (unlike physical font files!) Much of this code is, once again,
+lifted from \.{VFtoVP}.
+
+The array |vf| is global, along with the pointer into it, |vf_ptr|, because
+we accumulate therein all setting sequences read from all virtual font files
+processed. Most of the other variables are only required when actually
+reading a particular virtual font, so are local to |read_VF|.
+
+\yskip\hang |vf_take| When |dvi| bytes are to be ``read'' from array |vf|, the
+variable |vf_take| will be non-negative and hence index an element of the
+array; during normal input from the \.{DVI} file, a negative value ensures
+that input is taken from the file itself.
+
+\yskip\hang |TeX_font| will always point to the current virtual font being
+processed, amongst all the fonts (both virtual and physical) that are in
+the usual data structures. This global variable has the same name as
+parameters of the procedures |name_pxl_file| and |add_txf_to_lnf|, in order
+that common sections of code may be shared from the W{\mc EB}.
+
+\yskip\hang |font_type| records whether a font is |virtual| or physical (in which
+case the value |wanted| will have been set when the font's \.{TFM} file was
+first read.
+
+@<Glob...@>=
+@!vf:packed array[0..vf_size] of eight_bits; {the \.{VF} input data goes here}
+@!vf_ptr:0..vf_size; {first unused location in |vf|}
+@!vf_take:-1..vf_size; {next byte to be ``read'' from |vf|}
+@!TeX_font:0..max_fonts; {index into font metrics database for current virtual}
+@!font_type: array [0..max_fonts] of download_status;
+
+@ To ensure that we start by reading genuine |dvi| bytes from the \.{DVI}
+file, we must make |vf_take| negative.
+
+@<Preset...@>==
+vf_take:=-1;
+
+@ Here's the main procedure for reading virtual font files. It exists as a
+procedure purely in order that local variable declarations can be made to
+cater for those code sections which are also invoked within |define_font|.
+
+When we encounter a font definition in the \.{VF} file, we read its
+associated \.{TFM} file in the usual fashion; we associate a ``\TeX\ font
+number'' with this font, determined from the highest font previously used
+within the previous actual or virtual fonts, via the variable |font_base|.
+
+@p procedure read_VF;
+var @!f: 0..max_fonts; {Local index}
+ @!p: integer; {length of the area/directory spec}
+ @!n: integer; {length of the font name proper}
+ @!c,@!q,@!d: integer; {check sum, scaled size, design size}
+ @!r: 0..name_length; {index into |cur_name|}
+ @!j,@!k: 0..name_size; {indices into |names|}
+ @!mismatch: boolean; {names differ}
+ @!font_base: 0..max_fonts; {offset for local font numbers}
+ @!z,@!alpha,@!beta: integer; {to facilitate |fix_word| multiplications}
+ @!font_ref:array[0..max_fonts] of integer; {local font numbers}
+ @!font_ext:array[0..max_fonts] of integer; {``external'' font numbers}
+ @!font_ptr:0..max_fonts; {number of local fonts}
+ @!packet_start:array[0..255] of 0..vf_size; {character packet boundaries}
+ @!packet_found:boolean; {at least one packet has appeared}
+ @!temp_byte:eight_bits;@+@!temp_int:integer; {registers for simple calculations}
+ @!pl:integer; {packet length}
+ @<Declare |read_VF|'s local procedures@>@;
+begin
+ font_base:=highest_font+1; flushing:=false;@/
+ @<Read the whole \.{VF} file@>;
+end;
+
+@ Again we cautiously verify that we've been given decent data.
+
+@d vf_abort(#)==
+ abort('(VF file) ',#,crlf)
+@!@:fatal error VF file ...}{\quad\.{(VF file)}@>
+
+@<Read the whole \.{VF} file@>=
+temp_byte:=vf_one;
+if temp_byte<>pre then vf_abort('First byte isn''t `pre''');
+@:fatal error VF file First byte}{\qquad\.{First byte isn't \it pre}@>
+@<Read the preamble command@>;
+@<Read and store the font definitions and character packets@>;
+@<Read and verify the postamble@>
+
+@ Here's where we read the preamble of the virtual font file. Note that we
+make the assumption throughout that a `DVI unit' is \.{1sp} (as it always is
+in output generated by \TeX), so that $\hbox{`DVI unit'}=16\hbox{\.{fix}}$.
+
+@<Read the preamble command@>=
+temp_byte:=vf_one;
+if temp_byte<>vf_id_byte then vf_abort('Wrong version number in second byte!');
+@:fatal error VF file Wrong VF version}{\qquad\.{Wrong VF version...}@>
+temp_byte:=vf_one; {read the length of introductory comment}
+for k:=1 to temp_byte do temp_int:=vf_one; {and discard it}
+temp_int:=vf_quad;
+if (temp_int<>0) and (font_check_sum[TeX_font]<>0) and
+ (temp_int<>font_check_sum[TeX_font]) then
+ error('VF checksum disagreed! TFM:',font_check_sum[TeX_font]:1,
+ ' VF:',temp_int:1);
+@:Error: VF checksum disagreed}{\quad\.{VF checksum disagreed}@>
+z:=vf_quad div 16; {convert to |dvi| units}
+if z<>font_design_size[TeX_font] then
+ error('VF design size disagreed! TFM:',font_design_size[TeX_font]:1,
+ ' VF:',z:1);
+@:Error: VF design size disagreed}{\quad\.{VF design size disagreed}@>
+z:=font_scaled_size[TeX_font]; {but we're using it at this size}
+@<Replace |z| by $|z|^\prime$ and compute $\alpha,\beta$@>;
+
+@ The remainder of the file will consist of font definitions and character
+packets; once any of the latter has been met, it is not legal for the former
+to appear again.
+
+@<Read and store the font definitions and character packets@>=
+for k:=0 to 255 do packet_start[k]:=vf_size;
+font_ptr:=0; packet_found:=false;
+repeat temp_byte:=vf_one;
+ if temp_byte<>post then
+ if temp_byte>long_char then @<Read and store a font definition@>
+ else @<Read and store a character packet@>;
+until temp_byte=post
+
+@ The postamble of the virtual font file should consist purely of |post|
+bytes; furthermore, the file should be a multiple of four bytes long.
+
+@<Read and verify the postamble@>=
+flushing:=true;
+while (temp_byte=post)and not eof(vf_file) do temp_byte:=vf_one;
+if not eof(vf_file) then
+ warning('extra junk at end of the VF file.');
+@:Warning: extra junk at end of VF file}{\quad\.{extra junk...VF file}@>
+if vf_loc mod 4 <> 0 then
+ warning('VF data not a multiple of 4 bytes')
+@:Warning: VF data not a multiple of 4 bytes}{\quad\.{VF data not a multiple of 4 bytes}@>
+
+@ The font definition reads as follows:
+
+\yskip\hang|fnt_defN| 243..6 |k[1..4]| |c[4]| |s[4]| |d[4]| |a[1]| |l[1]| |n[a+l]|.
+
+\noindent where |k| is a local font number; this is used as an offset from
+|font_base| when reading the associated \.{TFM} file.
+
+@<Read and store a font definition@>=
+begin if packet_found or(temp_byte>=pre) then
+ vf_abort('Illegal byte ',temp_byte:1,' at start of character packet!');
+@:fatal error VF file Illegal byte}{\qquad\.{Illegal byte...at start...}@>
+case temp_byte of
+ fnt_def1: font_ref[font_ptr]:=vf_one;
+ fnt_def1+1: font_ref[font_ptr]:=vf_two;
+ fnt_def1+2: font_ref[font_ptr]:=vf_three;
+ fnt_def1+3: font_ref[font_ptr]:=vf_quad {there are no other cases}
+endcases;@/
+font_ext[font_ptr]:=font_base+font_ptr; {invent ``external'' font number}
+if font_ptr=max_fonts then vf_abort('References too many fonts!');
+@:fatal error VF file References}{\qquad\.{References too many fonts}@>
+@<Move the font parameters into position for font |nf|,
+ and print the font name@>;
+print(' (local font ',font_ref[font_ptr]:1,' of font ',font_num[TeX_font]:1,')');
+if highest_font<font_ext[font_ptr] then
+ highest_font:=font_ext[font_ptr];
+@<Avoid reloading the font metrics...@>;
+if f<nf then
+begin font_ext[font_ptr] := font_num[f];
+ print_ln('---is identical to font ',font_num[f]:1);
+ incr(nf)
+end else
+ @<Read the local font's \.{TFM} file and record the characters it contains@>;
+incr(font_ptr);
+end
+
+@ We need to position some of this information in a similar fashion to when
+\.{TFM} files are read during normal font definitions from the \.{DVI} file:
+
+@<Move the font parameters into position for font |nf|,
+ and print the font name@>=
+if nf = max_fonts then
+ capacity_exceeded('too many fonts (max fonts=',max_fonts:1,')');
+@:capacity exceeded too many fonts}{\quad\.{too many fonts}@>
+font_num[nf]:=font_ext[font_ptr]; {record invented ``external'' font number}
+font_map[nf]:=nf; {until we know better, this font is new}
+c:=vf_quad; font_check_sum[nf]:=c; {|c[4]|}
+q:=vf_quad; font_scaled_size[nf]:=q; {|s[4]|}
+if (q<0) or (q>@'77777777) then {|s| is negative or exceeds $2^{24}-1$}
+ vf_abort('Mapped font size is too big!');
+@:fatal error VF file Mapped font size too big}{\qquad\.{Mapped font size too big}@>
+d:=vf_quad div 16; font_design_size[nf]:=d; {|d[4]| in sp}
+@<Determine actual scaling for physical font@>;
+font_scaled_size[nf]:=q; {store revised scaling}
+p:=vf_one; {|a[1]|}
+n:=vf_one; {|l[1]|}
+if font_name[nf]+n+p>name_size then
+ capacity_exceeded('too many names (name size=',name_size:1,')');
+@:capacity exceeded too many names}{\quad\.{too many names}@>
+font_name[nf+1]:=font_name[nf]+n+p;
+print('Font ',font_num[nf]:1,': ');
+if n+p=0 then print('null font name!')
+@.null font name@>
+else
+ for k:=font_name[nf] to font_name[nf+1]-1 do names[k]:=lower(vf_one);
+incr(nf); print_font(nf-1); decr(nf); f:=nf;
+
+@ When a |fnt_defN| is read from a virtual font file, the parameter |s| (in
+variable |q|) represents the scaled size relative to the design size of the
+virtual font. The latter was stored (in |font_design_size[TeX_font]|; scaled
+by $2^{-4}$) when the original definition of the virtual font was read from
+the \.{DVI} file, and has been checked during the reading of the virtual
+font's preamble. Therefore, we will later call |in_TFM| to read the \.{TFM}
+file for the physical font and adjust all dimensions by the appropriate
+amount. To do this, we have to compute a new |q| by performing ``correct''
+arithmetic on the expression $\hbox{|font_design_size[TeX_font]|}\times q$.
+
+We utilize the same algorithm as is used for converting the width information
+in a \.{TFM} file; local variable |z| has already been set to the virtual
+font's design size, and converted to $|z|^\prime$, so we just need to split up
+the value |s| into its constituent bytes and perform the multiplications.
+
+By applying a cast to treat |q| as |unsigned|, we ensure that |b0<>0| for
+negative values of |q|.
+
+@d VAX_unsigned_type == unsigned
+
+@<Determine actual scaling for physical font@>=
+b0:=(q::VAX_unsigned_type div @'100000000)::eight_bits;
+b1:=(q mod @'100000000) div @'200000;
+b2:=(q mod @'200000) div @'400; b3:=q mod @'400;
+q:=(((((b3*z) div @'400)+(b2*z)) div @'400)+(b1*z))div beta;
+if b0>0 then q:=q-alpha; {assume $|q|<2^{25}$}
+
+
+@ @<Read the local font's \.{TFM} file...@>=
+begin
+ @<Move font name into the |cur_name| string@>;
+ open_tfm_file;
+ font_bc[nf]:=0; font_ec[nf]:=256; {will cause error if not modified soon}
+ if in_TFM(q) then @<Finish loading the new font info@>;
+ if font_bc[nf]<=font_ec[nf] then
+ if font_ec[nf]>255 then abort('---not loaded, bad TFM file!');
+@:fatal error Font not loaded Bad TFM file}{\qquad\.{Bad TFM file}@>
+ print_ln('')
+end
+
+@ Here is a procedure for ``outputting'' a |dvi| sequence by storing it in
+|vf|; each command is output in the minimum number of bytes.
+
+We cheat and abuse VAX-\PASCAL's variant records to provide a simple
+conversion between integers (signed or unsigned) and bytes in bigendian
+order. Variable |byte_ct| determines how many bytes are actually required.
+
+Parameter |code| is the command code being output; this will be incremented
+(by |1..3|) if |2..4| parameter bytes are necessary. |param| is obviously
+the parameter for |code|; |signed| is negative if |param| is to be
+interpreted in twos-complement notation. Otherwise, |signed=0|, except for
+|set_rule| and |put_rule| (which require that all four bytes are output for
+the parameter) when |signed=1|. For output of the second parameter of these
+latter two commands, |code=0|, which suppresses output of the |code| byte.
+
+The following definition is used for any bytes which must be copied to array
+|vf|.
+
+@d vf_store(#)==begin vf[vf_ptr]:=#; incr(vf_ptr) end
+
+@<Declare |read_VF|'s local procedures@>=
+procedure vf_to_dvi(@!code:eight_bits;@!param:integer;@!signed:integer);
+ var @!byte_ct:0..3; {offset to be added to |code|}
+ @!cheat:packed record
+ case boolean of
+ false: (b0,b1,b2,b3:eight_bits);
+ true: (fullword:integer)
+ end;
+begin
+ cheat.fullword:=param; byte_ct:=3; {assume needs 4-byte parameter}
+ if signed<=0 then
+ with cheat do
+ if ((b3=0) and ((signed=0) or (b2<128)))
+ or ((b3=255) and (signed<0) and (b2>=128)) then
+ begin
+ byte_ct:=2; {if |b3| superfluous, store 3-byte parameter}
+ if ((b2=0) and ((signed=0) or (b1<128)))
+ or ((b2=255) and (signed<0) and (b1>=128)) then
+ begin
+ byte_ct:=1; {if |b3| and |b2| superfluous, store two bytes}
+ if ((b1=0) and ((signed=0) or (b0<128)))
+ or ((b1=255) and (signed<0) and (b0>=128)) then
+ byte_ct:=0; {|b3|, |b2| and |b1| all superfluous; one byte parameter}
+ end
+ end;
+ if code<>0 then
+ vf_store(code+byte_ct); {store the appropriate command byte}
+ if byte_ct>2 then vf_store(cheat.b3);
+ if byte_ct>1 then vf_store(cheat.b2);
+ if byte_ct>0 then vf_store(cheat.b1);
+ vf_store(cheat.b0);
+end;
+
+@ This function computes how many bytes form the parameters of a command
+taken from a character packet in the \.{VF} file; in the case of any special
+sequences amongst these bytes (|xxx1..xxx4|), we read and discard all the
+bytes here, since we don't support such sequences in virtual fonts. The
+number of bytes thus discarded is returned, negated.
+
+Any occurrence of a command which is illegal in a character packet causes
+the font to be rejected.
+
+@<Declare |read_VF|'s local procedures@>=
+function vf_skip( @!o:eight_bits) : integer;
+ var @!temp : integer;
+begin
+ case o of
+ sixty_four_cases(set_char_0),sixty_four_cases(set_char_0+64),
+ w0,x0,y0,push,pop,sixty_four_cases(fnt_num_0):
+ vf_skip:=0;
+ set1,put1,fnt1,right1,w1,x1,down1,y1,z1:
+ vf_skip:=1;
+ set1+1,put1+1,fnt1+1,right1+1,w1+1,x1+1,down1+1,y1+1,z1+1:
+ vf_skip:=2;
+ set1+2,put1+2,fnt1+2,right1+2,w1+2,x1+2,down1+2,y1+2,z1+2:
+ vf_skip:=3;
+ set1+3,set_rule,put1+3,put_rule,right1+3,w1+3,x1+3,down1+3,
+ y1+3,z1+3,fnt1+3:
+ vf_skip:=4;
+ xxx1: begin temp:=vf_one; vf_skip:=-1-temp @+end;
+ xxx1+1: begin temp:=vf_two; vf_skip:=-2-temp @+end;
+ xxx1+2: begin temp:=vf_three; vf_skip:=-3-temp @+end;
+ xxx1+3: begin temp:=vf_quad; vf_skip:=-4-temp @+end;
+ improper_DVI_for_VF:
+ vf_abort('contains illegal command in character packet');
+@:fatal error VF file contains illegal command}{\qquad\.{contains illegal command...}@>
+ endcases;
+ if (o>=xxx1) and (o-xxx1<4) then
+ begin
+ decr(vf_ptr); {``unstore'' the |xxx| command byte}
+ while temp>0 do
+ begin o:=vf_one; decr(temp) end {discard |xxx| sequence bytes}
+ end
+end;
+
+@ This procedure adds to the saved packet a command to select a font; this
+will be an pseudo external font number, converted from the local font number
+used when a physical font is mapped into the virtual one. The procedure has
+the side-effect of setting its second parameter to index the stored metrics
+of the newly-selected font.
+
+@<Declare |read_VF|'s local procedures@>=
+procedure store_fnt(@!num:integer; var @!f:integer);
+var@!k:0..max_fonts;
+begin
+ f:=-1; {this value allows us to detect lack of the font}
+ for k:=0 to font_ptr-1 do {scan the local font reference numbers}
+ if font_ref[k]=num then f:=k; {find its entry}
+ if f<0 then
+ vf_abort('packet ',c:1,'invokes unmapped font ',num:1);
+@:fatal error VF file packet invokes}{\qquad\.{packet invokes unmapped font}@>
+ num:=font_ext[f]; {convert to pseudo external number}
+ f:=0; while font_num[f]<>num do incr(f);
+ if num < 64 then vf_store(fnt_num_0+num) else
+ vf_to_dvi(fnt1,num,0); {|fntN k[N]|}
+end;
+
+@ This procedure adds to the saved packet a command to set a character; it
+is required because we have to read all the bytes of such a command (in
+order to determine to what character a packet is being mapped).
+
+@<Declare |read_VF|'s local procedures@>=
+procedure store_char(@!cc:integer);
+begin
+ if cc < 128 then vf_store(set_char_0+cc) else
+ vf_to_dvi(set1,cc,0); {|setN c[N]|}
+end;
+
+@ When a character packet is being read from the virtual font file, we utilize
+this procedure to store the bytes, translating any font selection commands to
+reference the pseudo external fonts that have been created corresponding to
+each local font of the virtual font file.
+
+The packet taken from the \.{VF} file is surrounded by a |push|/|pop| pair
+to maintain the program's conception of the current position. We start by
+assuming local font $0$, which is that loaded as pseudo external font
+|font_base|.
+
+After the packet has been copied, an |eop| is inserted into the stored
+packet to permit detection of the end when the packet is later ``played
+back''.
+
+@<Declare |read_VF|'s local procedures@>=
+procedure vf_copy(@!pl,@!cc : integer);
+ var @!f:-1..max_fonts; {index into physical font data structures}
+ @!param_len:integer; {count of parameter bytes}
+ @!local_font:integer; {index into local font data structures}
+ @!mapped_char:integer; {index into a locally referenced font}
+ @!command:eight_bits; {next |dvi| command in \.{VF} file}
+ @!simple_packet, {packet contains only one |setN|, with maybe one |fntN|}
+ @!one_set,@!one_fnt:boolean; {|false| if more than one of each}
+ @!start_ptr,seq_ptr:0..vf_size; {pointers into bytes stored in |vf|}
+ @!scaling_required:boolean; {dimension needs revision before storing}
+begin
+ if vf_ptr+pl>=vf_size then capacity_exceeded('too many virtual characters');
+@:capacity exceeded too many virt}{\quad\.{too many virtual characters}@>
+ start_ptr:=vf_ptr; vf_store(push);
+ store_fnt(0,f);
+ glyph_map(TeX_font)(cc).font_code:=f;
+ one_set:=false; one_fnt:=false; simple_packet:=true; seq_ptr:=vf_ptr;
+ while pl>0 do
+ begin
+ command:=vf_one;
+ vf_store(command);
+ decr(pl);
+ param_len:=vf_skip(command);
+ @<Act upon any font changing command@>;
+ @<Act upon any character setting command@>;
+ @<Act upon commands that require scaling of parameters@>@;
+ case command of
+ sixty_four_cases(set_char_0),sixty_four_cases(set_char_0+64),
+ four_cases(set1): one_set:=true;
+ sixty_four_cases(fnt_num_0),four_cases(fnt1): one_fnt:=true;
+ set_rule, put_rule: {these have \\{two} 4-byte parameters}
+ begin param_len:=param_len-4; simple_packet:=false
+ end;
+ othercases
+ simple_packet:=false;
+ endcases;
+ if param_len<0 then {|abs(param_len)| bytes already copied}
+ pl:=pl+param_len
+ else
+ while param_len>0 do {copy remaining bytes of |command|}
+ begin command:=vf_one; vf_store(command);
+ decr(pl); decr(param_len)
+ end
+ end;
+ vf_store(pop);
+ vf_store(eop);
+ if simple_packet then vf_ptr:=start_ptr {discard the packet}
+ else with glyph_map(TeX_font)(cc) do
+ begin loaded:=virtual; {indicate where \AM\ how to find it}
+ seq_off:=start_ptr
+ end
+end;
+
+@ If a character packet contains any command to select a font, the command
+must be expanded, and the local font number converted into a reference to
+the appropriate pseudo external font. Since this may have the effect of
+reading some bytes from the packet, we reduce our goal by the appropriate
+quantity.
+
+If this is the first font changing command in the packet, the internal font
+it defines is placed into the current character's |glyph_map| entry, to
+permit later overwriting with the entry for the physical character. If,
+moreover, it is the first command \\{stored} in the packet, apart from the
+initial |push| and the invocation of local font $0$, we can over-write the
+latter.
+
+@<Act upon any font changing command@>=
+case command of
+ sixty_four_cases(fnt_num_0): local_font:=command-fnt_num_0;
+ fnt1: local_font:=vf_one;
+ fnt1+1: local_font:=vf_two;
+ fnt1+2: local_font:=vf_three;
+ fnt1+3: local_font:=vf_quad;
+othercases
+ do_nothing
+endcases;
+if (command>=fnt_num_0) and (command<=fnt1+3) then
+begin decr(vf_ptr); {``unstore'' the command byte}
+ store_fnt(local_font,f);
+ param_len := -param_len; {indicate bytes already copied}
+ if vf_ptr=seq_ptr then {we can overwrite the `|fnt_num_0|'}
+ vf_ptr:=start_ptr+1; {by writing immediately after the |push|}
+ if not one_fnt then glyph_map(TeX_font)(cc).font_code:=f
+ else simple_packet:=false
+end;
+
+@ Character packets usually contain one or more commands to set a character;
+this code reads all necessary bytes to determine the code for the character
+being set. Note that this code is \&{not} activated for commands to \\{put}
+characters, since these usually appear only in more complex character
+packets. If no previous character setting command has been met, then the
+character code is written into the |glyph_map|.
+
+@<Act upon any character setting command@>=
+case command of
+ sixty_four_cases(set_char_0),sixty_four_cases(set_char_0+64):
+ mapped_char:=command-set_char_0;
+ set1: mapped_char:=vf_one;
+ set1+1: mapped_char:=vf_two;
+ set1+2: mapped_char:=vf_three;
+ set1+3: mapped_char:=vf_quad;
+othercases
+ do_nothing
+endcases;
+if (command>=set_char_0) and (command<=set1+3) then
+begin decr(vf_ptr); {``unstore'' the command byte previously copied}
+ store_char(mapped_char); {store a new character setting sequence}
+ param_len:=-param_len; {indicate this many bytes already consumed}
+ with glyph_map(f)(mapped_char) do
+ if loaded=unused then loaded:=wanted;
+ if not one_set then glyph_map(TeX_font)(cc).char_code:=mapped_char
+ else simple_packet:=false;
+ if font_type[f]=unused then font_type[f]:=wanted;
+end;
+
+@ Many other |dvi| commands within a character packet require that the
+parameters be read, because they must be scaled by the size at which the
+virtual font is used. We start by assuming that the |dvi| bytes \&{will} be
+read from the \.{VF} file, and thus negate |param_len| so that the main loop
+will know that those bytes have been read. If we \&{don't} read the
+command's parameters, |param_len| will be negated back again, and thus lead
+to that number of bytes being copied verbatim from the \.{VF} file to |vf|.
+
+@<Act upon commands that require scaling of parameters@>==
+param_len:=-param_len;
+scaling_required:=false;
+case command of
+set_rule,put_rule:
+ begin q:=vf_quad; {read height of rule}
+ decr(vf_ptr); {``unstore'' command byte}
+ @<Determine actual scaling for physical font@>;
+ vf_to_dvi(command-3,q,1); {store command and first parameter}
+ q:=vf_quad; {read width of rule}
+ param_len:=-8; {we've consumed 8 bytes from |pl|}
+ @<Determine actual scaling for physical font@>;
+ vf_to_dvi(0,q,1) {store second parameter}
+ end;
+right1,w1,x1,down1,y1,z1:
+ begin q:=vf_byte; scaling_required:=true end;
+right1+1,w1+1,x1+1,down1+1,y1+1,z1+1:
+ begin q:=vf_pair; scaling_required:=true end;
+right1+2,w1+2,x1+2,down1+2,y1+2,z1+2:
+ begin q:=vf_trio; scaling_required:=true end;
+right1+3,w1+3,x1+3,down1+3,y1+3,z1+3:
+ begin q:=vf_quad; scaling_required:=true end;
+othercases
+ param_len:=-param_len
+endcases;
+if scaling_required then
+begin
+ decr(vf_ptr); {``unstore'' the command byte}
+ @<Determine actual scaling for physical font@>;
+ vf_to_dvi(command+param_len+1,q,-1) {store command again, with revised dimension}
+end;
+
+@ When a character packet is found, we only bother with it if it defines a
+character that's used in the document being processed; other character
+packets are merely skipped.
+
+If the packet consists merely of commands to set a single character from one
+of the physical fonts to which the virtual font is mapped, then we can
+simply alter the information in the |glyph_map| to redirect requests to the
+appropriate character of the physical font; the |glyph_map| of that font is
+in turn marked to indicate that the character is used in the current
+document.
+
+On the other hand, if the character packet requires more complex positioning
+commands, the whole packet is stored in array |vf|; the starting position of
+the sequence is recorded in field |seq_off| of the |glyph_map| entry, whilst
+the |loaded| field is given the value |virtual|. Field |font_code| will
+contain the internal font number assigned to local font zero of the virtual
+font, whereas the font selection commands stored in |vf| use the pseudo
+external font numbers, since these bytes will require interpretation by the
+normal dvi-reading routines.
+
+@<Other values of |download_status|@>==,@!virtual
+
+@ @<Other fields of |glyph_info|@>==@!seq_off : integer;
+
+@ The \.{VF} format supports arbitrary 4-byte character codes, but \.{VPL}
+format presently does not.
+
+Since the |tfm| widths in the character packets are unscaled, it would be
+difficult to ensure that they correspond with those determined when the
+virtual font's metrics were read, so they will be ignored at this time.
+
+@d nonexistent(#)==((#<font_bc[TeX_font])or(#>font_ec[TeX_font])or
+ (char_width(TeX_font)(#)=invalid_width))
+
+@<Read and store a character packet@>=
+begin if temp_byte=long_char then
+ begin pl:=vf_quad; c:=vf_quad; temp_int:=vf_quad;
+ {|pl[4]| |cc[4]| |tfm[4]|}
+ end
+else begin pl:=temp_byte; c:=vf_one; temp_int:=vf_trio;
+ {|pl[1]| |cc[1]| |tfm[3]|}
+ end;
+if nonexistent(c) then vf_abort('Character ',c:1,' does not exist!');
+@:fatal error VF file Character c does not exist}{\qquad\.{Character does not exist}@>
+if packet_start[c]<vf_size then
+ warning('Discarding earlier packet for character ',c:1);
+@:Warning: Discarding earlier packet}{\quad\.{Discarding earlier packet...}@>
+if pl<0 then vf_abort('Negative packet length!');
+@:fatal error VF file Negative packet length}{\qquad\.{Negative packet length}@>
+packet_start[c]:=vf_ptr;
+if glyph_map(TeX_font)(c).loaded <> unused then
+ vf_copy(pl,c)
+else
+ while pl>0 do {discard unwanted character packet}
+ begin temp_byte:=vf_one;
+ decr(pl)
+ end;
+packet_found:=true;
+end
+
+@ Once all characters from physical fonts have been downloaded (and hence
+may be assumed to have been mapped to character positions in the LN03's
+downloaded fonts), we can complete the |glyph_map| entries for any virtual
+fonts that may be present; for simple characters, this just involves copying
+the entry for the appropriate character in the physical font.
+
+We start with the most recently loaded font, so that chains through a number
+of virtual fonts will be completed correctly.
+
+@<Complete mapping of virtual characters@>=
+for TeX_font:=nf-1 downto 0 do
+ if font_type[TeX_font]=virtual then {only process virtual fonts}
+ begin
+ for m:=first_glyph_index(TeX_font) to last_glyph_index(TeX_font) do
+ {cover all possible characters}
+ with glyphs[m] do
+ if loaded=wanted then
+ glyphs[m]:=glyph_map(font_code)(char_code)
+ else if loaded=virtual then {first char in sequence from this \TeX\ font}
+ if font_type[font_code]=wanted then {provided it's a physical font}
+ font_code:=txf_to_lnf[font_code] {maps to this LN03 font}
+ end;
+
+
+@*Description of LN03 Font Files. The font files downloaded conform to DEC
+standard 180; the definitions given below have been derived by the author from
+the description of this standard included in the ``Font File Format Manual'',
+Version 1, Variant 0, available on request from DEC.
+
+Although we refer herein to font `files' they actually are always considered
+to reside in memory, either that available in the basic printer, or extra
+memory provided by plug-in RAM cartridges; presumably the same format is also
+used to encode the built-in fonts, and those available in plug-in ROM
+cartridges.
+
+A font file is divided into ten regions; all data items may be referenced
+\\{via} their offsets within one of these regions, which are predeterminable
+for any particular combination of characters included in the file. All
+multi-byte quantities in a font file are stored in Vax/VMS standard form, with
+the least-significant byte being at the \&{lower} address; this is the
+opposite to the normal `Bigendian' order of most \TeX ware.
+
+Since it is necessary to build the entire font file in memory before it can be
+included in the \.{LN3} file for downloading to
+the printer, we allocate a large array of memory sufficiently large to store
+the rasters for the largest imaginable font file; the definition of
+|lnf_bufsize| probably exceeds the maximum amount of memory available on the
+printer by a comfortable margin! This program refers to this `file' in memory
+as the \.{LNF} file, although it is never written to a file as such; if this
+program is adapted for use on a computer without virtual memory, it might
+@^system dependencies@>
+be necessary to utilize a random-access file to build the |lnf_file|.
+
+Since the partially-built LN03 font file must be retained between successive
+calls of |add_txf_to_lnf|, its data structures need to be declared globally.
+Information in this ``file'' can consist of single bytes, unsigned (two-byte)
+words, and signed (four-byte) longwords, as well as four-character strings, so
+we define an |lnf_block| as a \PASCAL\ variant record so that this may be
+(ab)used to permit the different methods of access.
+
+We also declare here the |pxl_dir_type| which describes the 16-byte directory
+record in a \.{PXL} file for any character's glyph.
+
+@<Types...@>=
+type @!lnf_block=packed record
+ case integer of
+ 0: (@!bytes:packed array[0..511] of eight_bits);
+ 1: (@!words:packed array[0..255] of sixteen_bits);
+ 2: (@!longs:packed array [0..127] of integer);
+ 3: (@!str:packed array [0..127] of packed array [1..4] of char)
+ end;
+
+@ Many variables used by |add_txf_to_lnf| are declared globally, so that the
+information contained therein is preserved between successive calls of the
+function. |lnf| is the large memory-held `file' referred to above.
+
+The variables |psize|, |lsize| and |msize| accumulate counts of raster bytes
+generated in portrait, landscape and mixed modes (this program only creates
+portrait mode rasters). |ras_beg| and |ras_len| are used to form the
+descriptor pointing to the Character Definition Region, whilst
+|lnf_pool_offset| points to the string pool. |lnf_len| keeps track of the
+total size of the `file', whilst |using_GR| is set true when the |GR|
+(right-hand half) of the font is being generated. (The LN03 supports use of
+the |GL| and |GR| characters sets, corresponding to characters in the
+(hexadecimal) range |@"21..@"7E| and |@"A1..@"FE|, respectively.)
+
+The variable |file_stat| receives the exit status from VAX-Pascal's file
+handling routines.
+
+@<Globals...@>=
+ @!lnf: array[0..lnf_bufsize] of lnf_block;
+ @!psize,@!lsize,@!msize: integer;
+ @!ras_beg,@!ras_len: integer;
+ @!lnf_pool_offset,@!lnf_len: integer;
+ @!using_GR: boolean;
+ @!file_stat:integer;
+
+@ The first region of an |lnf_file| is the file header. This contains, as its
+first longword (32-bit) quantity, a count of the total size of the file, in
+bytes. This is followed by the string |'FONT'|, to confirm that this is a DEC
+Std 180 font. This is followed immediately by a ``string descriptor''
+pointing to the font-file identifier. Font files contain many such descriptors;
+each consists of two longwords, the first contains the string's length (in its
+lower half), whilst the latter is the offset (relative to the start of the
+file) of the first character of the string.
+
+The font-file identifier descriptor is followed immediately (which is unusual)
+by the characters of the identifier itself; for details of the content of this
+string, read DEC Std 180. The date and time of creation of the font follows;
+this program arbitrarily sets these to 14:00:00 on 11-SEP-1973.
+
+There then follow a number of descriptors pointing to the remaining regions of
+the font file; these are, in order: |fnt_attr| font attributes region;
+|fnt_params| font parameters region; |fnt_char_directory| font character
+directory region; |fnt_seg_list| font segment list region; |fnt_future| font
+future information region; |fnt_strings| font string pool region; |fnt_kerns|
+font kerning information region; |fnt_chars| font character defintions region.
+
+The header finishes with the character count information field, which contains
+five longwords and three character locators (|fnt_first|$\to$|fnt_space|), the
+organization flags, a count of the number of parameters used in each raster
+definition and the raster expansion information field, which records the
+number of characters defined in this file, and the number of bytes of rasters
+required to define them; this field occupies a further 12 longwords
+(|font_in_file_count|$\to$|fnt_mix_comp|).
+
+@d fnt_total_size=0
+@d fnt_identifier=fnt_total_size+4
+@d fnt_version=fnt_identifier+4
+@d fnt_file_id=@"14 {Where font identification appears}
+@d fnt_date=@"58 {Where creation date starts}
+@d fnt_attr=fnt_date+12 {Font attributes descriptor}
+@d fnt_params=fnt_attr+8 {Font parameters descriptor}
+@d fnt_char_directory=fnt_params+8 {Character directory descriptor}
+@d fnt_seg_list=fnt_char_directory+8 {Font segment list descriptor}
+@d fnt_future=fnt_seg_list+8 {Future info descriptor}
+@d fnt_strings=fnt_future+8 {String pool descriptor}
+@d fnt_kerns=fnt_strings+8 {Font kerning infor descriptor}
+@d fnt_chars=fnt_kerns+8 {Character definitions descriptor}
+@d fnt_first=fnt_chars+8 {First character in font}
+@d fnt_last=fnt_first+4 {Last character in font}
+@d fnt_less_than=fnt_last+4 {Locator for characters less then first}
+@d fnt_greater_than=fnt_less_than+4 {Locator for characters greater than last}
+@d fnt_error=fnt_greater_than+4 {Locator for the error character}
+@d fnt_extension=fnt_error+4 {Extension count and use}
+@d fnt_space=fnt_extension+8 {Space character code}
+@d fnt_organisation=fnt_space+4 {Organisation flags}
+@d fnt_no_of_params=fnt_organisation+4 {Number of character parameters}
+@d fnt_in_file_count=fnt_no_of_params+4 {Number of locators in this file}
+@d fnt_null_count=fnt_in_file_count+4 {Null locator count}
+@d fnt_char_count=fnt_null_count+4 {Number of character definitions}
+@d fnt_alt_blocks=fnt_char_count+4 {Number of alternate character blocks}
+@d fnt_rasters=fnt_alt_blocks+4 {Number of rasters}
+@d fnt_compressed=fnt_rasters+4 {Number of compressed rasters}
+@d fnt_portrait=fnt_compressed+4 {Portrait mode byte count}
+@d fnt_landscape=fnt_portrait+4 {Landscape byte count}
+@d fnt_mixed=fnt_landscape+4 {``Mixed'' byte count}
+@d fnt_port_comp=fnt_mixed+4 {Portrait compressed byte count}
+@d fnt_land_comp=fnt_port_comp+4 {Landscape compressed byte count}
+@d fnt_mix_comp=fnt_land_comp+4 {``Mixed'' compressed byte count}
+
+@ The font attributes region always follows the header; items within this
+region are referenced through their local offsets from the start of the
+region.
+
+The |fnt_attr_flags| carries 32 bits of font attribute information; these are
+set arbitrarily by this program --- see the coding for details.
+
+The character set designator (within the string pool) uniquely identifies the
+character set contained within this font, and is accessed by the descriptor
+|fnt_char_set|. Similarly the |fnt_type_ID|, |fnt_type_family|, |fnt_font_ID|,
+|fnt_type_cat| and |fnt_descr| descriptors access further strings in the
+string pool.
+
+Further fields in the font attributes region define numerical attributes of
+the font (|fnt_type_size| thru |fnt_dev_char|). The attributes region
+concludes with a further two descriptors, pointing to strings giving the names
+of the foundry and designer responsible for the font.
+
+Numerical quantities referring to the dimensions of characters in DEC LN03
+font files are commonly in ``points'' or ``centipoints'' (the latter obviously
+being $1\over{100}$th of the former). However, these are not true printer's
+points (of which there are 72.27 to an inch); rather they are that horrible
+compromise which imagines that there are exactly 72 points to an inch (and
+which \TeX\ refers to as a \.{bp}). Centipoints are also referred to as
+`Gutenbergs', in tribute to the inventor of movable type. It is quite
+convenient for the LN03 (with 300 dots per inch) to work internally in
+Gutenbergs, of which there are 7200 to an inch, since 24 Gutenbergs therefore
+translate into a single pixel.
+
+@d fnt_attributes=fnt_mix_comp+4 {Start of attributes region}@#
+
+{Following define offsets within the Font Attributes Region of the ``file''}
+@d fnt_attr_flags=0 {Flags e.g. roman}
+@d fnt_char_set=fnt_attr_flags+4 {DESCR for character set designator}
+@d fnt_designator_len=7 {Number of characters in set desginator string}
+@d fnt_type_ID=fnt_char_set+8 {DESCR for Font Type Family ID}
+@d fnt_type_ID_len=7 {Number of chars in Font Family ID string}
+@d fnt_type_family=fnt_type_ID+8 {DESCR for Type Family Name}
+@d fnt_type_family_len=16 {Number of chars in Type Family String}
+@d fnt_font_ID=fnt_type_family+8 {DESCR for Font ID string}
+@d fnt_font_ID_len=16 {Number of chars in Font ID string}
+@d fnt_string_pool_len=fnt_designator_len+fnt_type_ID_len+fnt_type_family_len+fnt_font_ID_len
+@d fnt_type_cat=fnt_font_ID+8 {DESCR for Type Category}
+@d fnt_descr=fnt_type_cat+8 {DESCR for Font Description}
+@d fnt_type_size=fnt_descr+8 {Font type size, in LN03 points}
+@d fnt_average_width=fnt_type_size+4 {in centipoints}
+@d fnt_resolution=fnt_average_width+4 {in $2^{-16}$ centipoints per pixel}
+@d fnt_weight=fnt_resolution+4 {Coded 0..35. Normal is 16}
+@d fnt_horiz_prop=fnt_weight+4 {0..35. Unexpanded/uncompressed is 16}
+@d fnt_horiz_ratio=fnt_horiz_prop+4 {Ratio to a "normal" font}
+@d fnt_pixel_aspect=fnt_horiz_ratio+4 {Ratio of X:Y of device's pixels}
+@d fnt_rotation=fnt_pixel_aspect+4 {Ratio giving tangent of rotation}
+@d fnt_dev_char=fnt_rotation+4 {Device specific characteristics}
+@d fnt_foundry=fnt_dev_char+4 {DESCR of name of foundry}
+@d fnt_designer=fnt_foundry+8 {DESCR of name of font designer}@#
+
+@d fnt_attr_len=fnt_designer+8 {Length of Font Attributes Region of file}
+
+@ The next region of the font file is the font parameters region. All fields
+of this region are referenced by means of their offsets within the region.
+The first field is a 32-bit flags field, of which only two bits have defined
+meanings.
+
+The next field contains 8 items
+(|fnt_underline_offset|$\to$|fnt_shadow_offset|) which define the position for
+electronic over-, through- and under-lining, and the slant of the characters
+and the delta offsets for emboldening. None of these features are utilized by
+DVItoLN03.
+
+The next field (|fnt_superscript|$\to$|fnt_subscript|) describe the horizontal
+and vertical offsets within the characters for the placement of super- and
+sub-scripts. The following field (|fnt_centreline|$\to$|fnt_digit_width|)
+define various horizontal spacing parameters, whilst the final field of the
+font parameters region (|fnt_topline_offset| thru |fnt_white_below|) define
+vertical spacing parameters.
+
+@d fnt_parameters=fnt_attributes+fnt_attr_len {Start of Parameters Region}@#
+
+{Following define offsets within the Font Parameters Region of the ``file''}
+@d fnt_param_flags=0
+@d fnt_underline_offset=fnt_param_flags+4 {All following in LN03 centipoints}
+@d fnt_underline_thickness=fnt_underline_offset+4
+@d fnt_thru_offset=fnt_underline_thickness+4 {Where strike-through line goes}
+@d fnt_thru_thickness=fnt_thru_offset+4
+@d fnt_overline_offset=fnt_thru_thickness+4
+@d fnt_overline_thickness=fnt_overline_offset+4
+@d fnt_slant=fnt_overline_thickness+4 {Ratio giving tan of slope from vertical}
+@d fnt_shadow_offset=fnt_slant+4 {$\delta x$ and $\delta y$}
+@d fnt_superscript=fnt_shadow_offset+4 {|y| and |x| offsets}
+@d fnt_subscript=fnt_superscript+8
+@d fnt_centreline=fnt_subscript+8 {Distance from left to centre widest char}
+@d fnt_min_space=fnt_centreline+4 {Minimum acceptable width of interword space}
+@d fnt_max_space=fnt_min_space+4
+@d fnt_mean_space=fnt_max_space+4 {Width of space for monospace fonts}
+@d fnt_em_width=fnt_mean_space+4 {Width of an |em| space}
+@d fnt_en_width=fnt_em_width+4 {Width of an |en| space}
+@d fnt_thin_space=fnt_en_width+4
+@d fnt_digit_width=fnt_thin_space+4 {All digits usually same width}
+@d fnt_topline_offset=fnt_digit_width+4 {From baseline to top of type size}
+@d fnt_accent=fnt_topline_offset+4 {Where floating accents go}
+@d fnt_halfline_offset=fnt_accent+4 {Where centre bar of an \.H appears}
+@d fnt_overall_height=fnt_halfline_offset+4 {Sum of |height+depth|}
+@d fnt_height=fnt_overall_height+4 {Includes ``leading'' above}
+@d fnt_depth=fnt_height+4
+@d fnt_H_height=fnt_depth+4
+@d fnt_ex_height=fnt_H_height+4
+@d fnt_white_above=fnt_ex_height+4
+@d fnt_white_below=fnt_white_above+4@#
+
+@d fnt_params_len=fnt_white_below+4 {Length of Font Parameters Region}
+
+@ The next major region contains the character directory.
+
+@d fnt_char_dir=fnt_parameters+fnt_params_len {Where directory goes}
+
+@ The next regions are: Table of Font Segments, Future Information, String
+Pool and Kerning Information. These are followed by the Character Definition
+Region, which contains details of the rasters for each character's glyph.
+
+Each character definition commences with |fnt_char_pars| of parameter
+information; these are accessed through the offsets defined below.
+
+In this version of the standard, each character is allocated 16 bytes of
+parameter information.
+
+@d fnt_char_pars=16 {Size of character parameters --- fixed}@#
+
+@d fnt_kern_index=0 {Zero, or index into kerning table}
+@d fnt_char_flags=fnt_kern_index+1 {Only 24 bits of flags}
+@d fnt_char_width=fnt_char_flags+3 {In LN03 centipoints (or ``Gutenbergs'')}
+@d fnt_left_bearing=fnt_char_width+4 {White space to left of raster}
+@d fnt_raster_baseline=fnt_left_bearing+4 {Baseline relative to top of raster}
+
+@ The character's parameters are followed by the encoded character raster:
+this itself contains a number of counts preceding the rasters themselves; the
+following definitions facilitate access to these fields.
+
+@d fnt_char_orient=0 {0=Portrait, etc.}
+@d fnt_char_type1=fnt_char_orient+1 {81H=Aligned expanded bit string}
+@d fnt_char_type2=fnt_char_type1+1 {Unused if |fnt_char_type1| = 81H}
+@d fnt_char_rows=fnt_char_orient+4 {Number of rows in raster}
+@d fnt_char_cols=fnt_char_rows+2 {Number of columns in raster}
+@d fnt_char_raster=fnt_char_cols+2 {Where rasters actually start}
+
+
+
+@* Locating files containing character definitions. This procedure
+determines the ``name'' of the required pixel file, and compares it with that
+which is currently open, if any. If these names differ, we close the currently
+open file, if any, and open the new one. Although the file will have already
+been opened and checked for validity during font file generation, we still
+perform the checks, because that also sets certain pointers correctly.
+
+This procedure is used by |print_glyph| to output a bitmap image of any
+oversized rasters. Note that it \&{has} parameter list |( TeX_font : integer)|;
+this is omitted here because it has already been declared |forward|.
+
+Note also that the variable |open_file_name| referenced is the \&{global}
+variable of the same name, used by |print_glyph|, and not the identically
+named formal parameter of |add_txf_to_lnf|. The same name has to be used
+because these \.{WEB} code sections incorporated are used in that function
+also.
+
+@p procedure change_pixel_file; {|change_pixel_file(TeX_font : integer);|}
+ var @!new_file : file_spec;
+ i: integer; {Used when reading the directory}
+begin
+ name_pxl_file(TeX_font,new_file,pxl_ident);
+ if new_file<>open_file_name then
+ begin
+ if (open_file_name<>'') then
+ close(pxl_file,@=disposition@>:=@=save@>,VAX_continue);
+ open_file_name:=new_file;@/
+ @<Open the file containing the glyph bitmaps@>;
+ if pxl_ident=pixel_file then begin
+ @<Check validity of PXL file@>;
+ @<Read character directory from |pxl_file|@>
+ end else begin
+ @<Read preamble@>;
+ skip_specials
+ end
+ end
+end;
+
+@* Creating the font file. The following function allocates the used
+characters of the |TeX_font| to the predetermined locations in the |ln_font|;
+the character rasters are taken from the LN03 font file |open_file_name|, which
+has been set up to include the appropriate directory and file-name. After each
+font file has been constructed in memory, it is converted to sixel format (See
+below) and added to the records in the \.{LN3} file |ln3_file|.
+
+The use of each of the parameters and local variables is as follows:
+
+\yskip\hang|ln_font| The serial number of the LN03 font being generated.
+Should a font have to cross the boundaries between internal fonts, this will
+be updated (it's not a |var| parameter, so won't upset anything in the
+caller). It is used in the procedure as a cross-check that the character
+glyph currently being considered actually belongs to the font being created.
+
+
+\yskip\hang|TeX_font| The identifying number of the \TeX\ font;
+|font_num[TeX_font]| is that given by the \.{DVI} file.
+
+\yskip\hang|open_file_name| Full file specification from which the rasters
+should be read.
+
+\yskip\hang|file_type| Indicates whether the |open_file_name| contains a
+|packed_file| or a |pixel_file|.
+
+\yskip\hang|rasters| Counts the number of bytes created in the current
+|font_file|. The variable is initialized to four times the number of
+characters added since each character requires a four-byte character locator
+in the font file directory region.
+
+\yskip\hang|i| and |j| General loop counters.
+
+Further local variables will be declared for the function as necessary.
+
+@p function add_txf_to_lnf(ln_font,TeX_font:integer;
+ open_file_name:file_spec;
+ file_type:pixel_types):integer;
+var @<Local variables of |add_txf_to_lnf|@>@; {will be declared later}
+ @!rasters:integer; {bytes added to font}
+ @!i,@!j:integer; {general purpose pointers}
+ @t\4@>@<Local procedures of |add_txf_to_lnf|@>@;
+begin
+ if file_type<>unavailable then
+ @<Open the file containing the glyph bitmaps@>;
+ @<Find name and magnification of font file@> ;
+ case file_type of
+ pixel_file:
+ @<Prepare to use \.{PXL} file@>;
+ packed_file:
+ @<Prepare to use \.{PK} file@> ;
+ unavailable:
+ begin
+ font_type[TeX_font]:=missing;
+ open_file_name := '[unavailable]'
+ end;
+ endcases;
+ max_ctr := font_ec[TeX_font];
+ @<Report name of font file in use@> ;
+ if file_type=unavailable then
+ write(' unavailable; printing rules for glyphs;');
+ print(' with '); write_ln(term_out,' loaded with ');
+ @<Determine lowest and highest characters used in the \TeX\ font@>;
+ rasters:=4*font_occupancy[TeX_font];
+ @<Cycle through the characters of |TeX_font|, downloading as required@> ;
+ @<Tidy up after copying rasters from \.{PXL} file@>;
+end; {|add_txf_to_lnf|}
+
+@ These variables used to be local to |add_txf_to_lnf|; however, some W{\mc
+EB} modules invoked therein are now also used externally, but reference the
+variables. Therefore they are now global.
+
+\yskip\hang|percent| Gives the magnification of the current font, for use in
+font loading reports. (An unmagnified font is at 100\%.)
+
+\yskip\hang|name| Holds the ``\TeX-oriented'' font name, for inclusion in
+reports on the terminal, whilst the full file specification (from
+|open_file_name|) is reported in the log file.
+
+@<Glob...@>=
+@!percent:integer;
+@!name: file_spec;
+@!name_ptr: 0..name_size; {pointer for indexing |name|}
+
+@ As each font is downloaded, we want to report its name and its magnification
+(if not \.{\BS magstep 0}) on the terminal, whilst the logfile will receive
+the full file specification. So we can commence by saving the name of the
+font file, and the percentage magnification.
+
+@<Find name and magnification of font file@>=
+name := '';
+for name_ptr:=font_name[TeX_font] to font_name[TeX_font+1]-1 do
+ name := name + xchr[names[name_ptr]]; {ASCII representation of font name}
+percent:=round((mag*0.1*font_scaled_size[TeX_font])/font_design_size[TeX_font]);
+
+@ With rasters held in an unpacked pixel file, we need to check the file's
+validity, and then transfer the directory information into |pxl_dir|.
+
+@<Prepare to use \.{PXL} file@>=
+begin
+ @<Check validity of PXL file@>;
+ @<Read character directory from |pxl_file|@>
+end
+
+@ On the other hand, with packed pixel files, we need to read through the
+preamble and skip over any specials which precede the first character raster
+in the file.
+
+@<Prepare to use \.{PK} file@>=
+begin
+ @<Read preamble@>; skip_specials;
+ if font_check_sum[TeX_font]<>checksum then
+ warning('checksum doesn''t match in PK file')
+@.checksum doesn't match in PK file@>
+end
+
+@ Once we've successfully opened the font file, we can report its name (and any
+non-standard magnification).
+
+@<Report name of font file in use@>=
+print('Font ',name,' (at ',percent:1,'%) loaded from ',open_file_name);
+write(term_out,'Font ',name);
+if percent<> 100 then write(' (at ',percent:1,'%)');
+
+@ We now set about creating (a portion of) an LN03 font file from the required
+characters of |TeX_font|. We assume at first that it will be possible to pack
+the entire |TeX_font| into a single LN03 font, but may need to revise this
+opinion if the font turns out to be longer than 188 characters.
+
+A |while| control construct is used instead of the obvious |for| loop, because
+there may be a necessity for premature termination of the loop.
+
+@<Cycle through the characters of |TeX_font|, downloading as required@>=
+char_ctr:=font_bc[TeX_font];
+while (char_ctr<=max_ctr) do
+begin
+ @<Download character of font@>;
+ incr(char_ctr);
+end;
+@<Verify that all glyphs were available@>;
+
+@ For each character in the |TeX_font|, we need to see whether it has been
+marked as being used, and, if so, whether it belongs to the |ln_font|
+currently being created.
+
+@<Download character of font@>=
+with glyph_map(TeX_font)(char_ctr) do
+if loaded<>unused then
+begin
+ @<Decide whereabouts to download the character@> ;
+ @<Finish off any previous half font on LN03@> ;
+ case file_type of
+ packed_file:
+ @<Copy glyph from packed file, and find the next one@>;
+ pixel_file:
+ copy_char(char_ctr,to_where);
+ unavailable:
+ @<Generate dummy directory entry for font that won't be used@>;
+ endcases;
+end
+
+@ We need to decide whereabouts to put this character glyph in the LN03 font
+file being created. In the case of unpacked pixel files, we can simply use
+the mapping determined at an earlier stage. However, the glyphs in packed
+pixel files appear in the same order as the original \MF\ source, so it is
+necessary to download them to the LN03 in the order of arrival, otherwise we
+may find ourselves jumping between the ``left-hand'' and ``right-hand'' parts
+of the code table.
+
+It is at this point that we update |first_txfc| to the next available slot in
+the |ln_font|, if necessary, to skip over the non-existent characters between
+|left_last| and |right_first|, or from |right_last| to the beginning of an
+overflow font (if we're using packed files; unpacked ones, being restricted
+to 128 characters, can never require an overflow).
+
+@<Decide whereabouts to download the character@>=
+if first_txfc=left_last+1 then
+ first_txfc:=right_first
+else if (first_txfc=right_last+1) and (file_type=packed_file) then
+ @<Prepare for overflow portion, if necessary@>;
+to_where:=first_txfc
+
+@ If a font is completely unavailable (perhaps the user has requested it at
+a magnification not provided on the current system), we still have to go
+ahead and `complete' the font for the LN03, because the font file's headers
+already reflect the previously determined mapping. However, we shall
+\\{never} image characters from the font, so we just make the character
+locator entries in the font's ``directory'' zero.
+
+@<Generate dummy directory entry for font that won't be used@>=
+begin
+ @<Create null character locator entry@>;
+ loaded:=yes
+end
+
+@ Sometimes we find that we cannot complete the bitmap information relating
+to a particular character, because the glyph is too large, or missing (or
+the font itself is missing). Since we will already have completed the LN03
+font's description relating to number of characters, etc., we must still
+provide an entry in the font directory; the LN03 will not attempt to image a
+character for which the directory entry is zero, so that's what we put
+there!
+
+@<Create null character locator entry@>==
+begin
+ lnf_long(fnt_char_dir+4*(to_where-dir_base),0);
+ decr(num_chars); incr(null_chars)
+end
+
+
+@ Whenever we first meet a character taken from the ``right-hand'' half of the
+LN03 font (the set designated as GR, in ISO2022/ANSI X3.64 parlance), we need
+to finish off the half font which has been created in the left-hand table.
+Similarly, if we meet a character from the ``left-hand'' half (GL) when we had
+previously been adding characters to the GR set, it implies that we are
+commencing output, to GL, of characters taken from a \TeX\ font which was too
+large to be loaded into the 188 characters of the previous |ln_font|.
+
+The font file to date is written out and a new one initialized to hold the GR
+character set. Such successive font files are separated from each other by a
+simple `\.,' character in the \.{LN3} file.
+
+@<Finish off any previous half font on LN03@>=
+if ((not using_GR) and (to_where>=right_first)) or
+ (using_GR and (to_where<=left_last)) then
+begin output_LNF;
+ write_ln(ln3_file,',');@/
+ using_GR:=not using_GR;
+ init_LNF
+end
+
+@ If glyphs are being taken from a file of packed pixel rasters, we need to
+copy the glyph to the LN03 file as the raster is built up from the file.
+Having thus disposed of this glyph, we then scan through the file until
+finding the \&{next} wanted glyph.
+
+@<Copy glyph from packed file, and find the next one@>=
+begin
+ repeat
+ @<Unpack and write...@>;
+ skip_specials
+ until (glyph_map(TeX_font)(char_num).loaded<>unused) or
+ (flag_byte=pk_post);
+ with glyph_map(TeX_font)(char_num) do
+ if loaded<>unused then
+ begin
+ char_code:=first_txfc;
+ font_code:=ln_font;
+ incr(first_txfc) {This might later be corrected}
+ end;
+ if flag_byte=pk_post then char_ctr := 255 {Break out}
+end
+
+@ Here are some local variables of |add_txf_to_lnf|, used in the above code:
+
+\yskip\hang|char_ctr| Used to cycle through all possible character codes in
+the |TeX_font|.
+
+\yskip\hang|max_ctr| Unpacked pixel files (by their very architecture) can
+contain a maximum of 128 glyphs; packed files (in this implementation) may
+contain up to 256. This variable permits more efficient operation by limiting
+the values assumed by |char_ctr|.
+
+@<Local variables of |add_txf_to_lnf|@>==
+@!char_ctr:integer;
+@!max_ctr:integer;
+
+
+@ After having downloaded the last character of |TeX_font| which belongs in
+|ln_font|, we arrange things so that any further characters will be loaded into
+|ln_font+1|. We accordingly want to start at |left_first| (which ought to
+be the value held in |txfc_next|), and ensure that the font is written out to
+the GR part of |ln_font|, before incrementing to the next font.
+
+This code can only be invoked when working with packed pixel files, because
+fonts which run over more than one LN03 font must exceed 188 characters in
+length, and unpacked pixel files are limited to 128 characters!
+
+@<Prepare for overflow portion, if necessary@>=
+begin
+ incr(ln_font);
+ last_txfc := final_txfc; {|first_txfc>right_last|, therefore\dots}
+ @<Are we starting or finishing an LN03 font ``file''?@>; {|begin_txf:=false|}
+ first_txfc := txfc_next {This will be our next character}
+end
+
+
+@ The first job |add_txf_to_lnf| has to do is to open the (packed or
+unpacked) pixel file; the file directory and font name are passed in to the
+function (as parameter |open_file_name|).
+
+Note that this \.{WEB} section is expanded by \.{TANGLE} in the context of
+procedure |change_pixel_file| \&{and} of function |add_txf_to_lnf|. In the
+first context, the string variable |open_file_name| referenced herein is the
+\&{global} variable of that name, whilst within |add_txf_to_lnf| it is the
+formal parameter of that function.
+
+Assuming the file is opened succesfully, the size of the file is taken from
+variable |file_len|, which is set up by the \.{user\_action} procedure with
+which the file is opened.
+
+The first block of the file is then read (into the associated file variable
+|pxl_file|).
+
+@<Open the file containing the glyph bitmaps@>=
+begin open(pxl_file,open_file_name,@=readonly@>,@=access_method@>:=@=direct@>,
+ @=user_action@>:=file_open,VAX_continue);
+file_stat:=status(pxl_file); ask:=file_stat<>0;
+if ask then
+begin
+ case file_stat of
+ 2: file_message := 'PAS-E-ERRDUROPE';
+ 3: file_message := 'PAS-E-FILNOTFOU';
+ 5: file_message := 'PAS-E-ACCMETINC';
+ 6: file_message := 'PAS-E-RECLENINC';
+ 7: file_message := 'PAS-E-RECTYPINC';
+ 8: file_message := 'PAS-E-ORDSPEINC';
+ othercases
+ file_message := str_int(file_stat);
+ endcases;
+ abort('Couldn''t open ',open_file_name,'. Status=',file_message);
+@:fatal error Couldn't open file}{\quad\.{Couldn't open file} (pxl/pk)@>
+end;
+reset(pxl_file)
+end
+
+@ We apply some simple checks to determine whether the \.{PXL} file passed in
+has a valid format. At the same time, we set up the local variable |pxl_size|
+which gives the total length of the \.{PXL} file, in bytes, excluding the
+identification longword of 1001 at its end.
+
+@<Check validity...@>=
+pxl_size:=file_len;
+pxl_block:=0;
+move_to_pxl(pxl_size-4);
+i:=pxl_ptr+4; {Point {\bf after} the last block}
+repeat
+ i:=i-4
+until (i<0) or (pxl_long(i)=pxl_id);
+pxl_size:=i+VAX_block_length*pxl_block;
+if i<0 then abort('PXL file has bad format');
+@:fatal error PXL file has bad format}{\quad\.{PXL file has bad format}@>
+
+@ Having found the end of the \.{PXL} file, we are able to extract the
+last four longwords. These give us, starting with the last, the longword
+address of the start of the character directory within the file, the ``design
+size'' (in scaled points), the ``magnification'' of the font (will be 1500
+for fonts designed for 300 pixels/inch devices) and the font checksum.
+This latter quantity should match that read from the \.{TFM} file by \TeX.
+
+After using these longwords, we then go to the first byte of the character
+directory, and copy it into |pxl_dir|. Each character's entry consists
+of the following fields:
+\yskip\hang|num_cols| the number of pixels printed for each row of the
+character;
+\yskip\hang|num_rows| number of rows of pixels printed;
+\yskip\hang|x_off| offset (in pixels) of the left-hand edge of the raster,
+relative to the reference point;
+\yskip\hang|y_off| similarly for top of raster relative to the baseline;
+\yskip\hang|addr| the longword address within the \.{PXL} file of the start
+of the rasters;
+\yskip\hang|tfm_width| the character's width, in the same format as for
+|tfm_file|.
+
+@<Read character directory from |pxl_file|@>=
+
+move_to_pxl(pxl_size-16);
+if font_check_sum[TeX_font]<>long_pxl(pxl_ptr) then
+ warning('checksum doesn''t match in PXL file');
+@.checksum doesn't match in PXL file@>
+magnification:=long_pxl(pxl_ptr);
+dsize:=long_pxl(pxl_ptr);
+dsize:=(dsize/two_to_the_20th)*(magnification/1500.0);@/
+move_to_pxl(long_pxl(pxl_ptr)*4); {Go to start of directory}
+for i:=0 to 127 do
+ with pxl_dir[i] do
+ begin num_cols:=word_pxl(pxl_ptr);
+ num_rows:=word_pxl(pxl_ptr);
+ x_off:=sign_pxl_word(pxl_ptr);
+ y_off:=sign_pxl_word(pxl_ptr);
+ addr:=long_pxl(pxl_ptr);
+ tfm_width:=long_pxl(pxl_ptr)
+ end
+
+@ We need to determine the lowest and highest ordinal character positions of
+those characters used in the \TeX\ font being encoded into the LN03 font file;
+the variables |first_txfc| and |last_txfc| are used for this purpose. If there
+are no characters used at all in the \TeX\ font some malfunction must have
+occurred, because |add_txf_to_lnf| should not have been invoked under those
+circumstances.
+
+The character numbers will be those of the LN03 font file, having already been
+mapped to these during the mapping phase; therefore, if the lowest character
+number used is |= left_first| then we must be starting a new font, so must
+initialize the empty font file and indicate that this is a |GL| font
+(left-hand half of eight-bit character table).
+
+@<Determine lowest and highest characters used in the \TeX\ font@>=
+first_txfc:=-1; last_txfc:=-1; {For |ln_font|}
+txfc_next:=-1; final_txfc:=-1; {and for |ln_font+1|}
+for i:=first_glyph_index(TeX_font) to last_glyph_index(TeX_font) do
+ with glyphs[i] do
+ @<Note |last_txfc|, and set |first_txfc| for first character@> ;
+@<Are we starting or finishing an LN03 font ``file''?@>
+
+@ As we cycle through all the allocated characters, we note each code in turn,
+thus determining the highest code used. We also note the lowest one when we
+meet the first code used. If the |TeX_font| extends into a second |ln_font|,
+the corresponding information will be recorded in |final_txfc| and |txfc_next|,
+respectively.
+
+@<Note |last_txfc|, and set |first_txfc| for first character@>=
+if loaded = wanted then
+begin if txf_to_lnf[font_code]=ln_font then
+ begin if first_txfc=-1 then first_txfc:=char_code;
+ last_txfc:=char_code; font_code:=ln_font
+ end
+ else {This must be overflow of |TeX_font| into |ln_font+1|}
+ begin if txfc_next=-1 then txfc_next:=char_code;
+ final_txfc:=char_code; font_code:=ln_font+1
+ end
+end
+
+@ If the lowest character code used is |left_first|, then we shall have to
+initialize a new LN03 font file. Similarly, if the last character used is the
+last character allocated to this LN03 font, we shall later have to finish off
+the latter. We therefore note these two conditions in |begin_txf| and
+|end_txf|, and initialize the font ``file'' if the former condition pertains.
+
+@<Are we starting or finishing an LN03 font ``file''?@>=
+if last_txfc<0 then
+ abort('Internal error (empty font)');
+@:fatal error Internal error empty font}{\qquad\.{(empty font)}@>
+begin_txf:=first_txfc=left_first;
+end_txf:=last_txfc=last_lnf[ln_font];
+if begin_txf then
+begin using_GR:=false;
+ init_LNF
+end
+
+@ Here are some more local variables of |add_txf_to_lnf|, used in the above
+code:
+
+\yskip\hang|first_txfc| The lowest character code allocated to a character of
+|TeX_font| when the mapping took place.
+
+\yskip\hang|last_txfc| Similarly, the highest code used.
+
+\yskip\hang|txfc_next| The lowest character code for a character of |TeX_font|
+allocated to |ln_font+1| when the mapping took place.
+
+\yskip\hang|final_txfc| Similarly, the highest code used by |TeX_font| in
+|ln_font+1|
+
+\yskip\hang|begin_txf| A boolean, which is |true| if this |TeX_font| commences
+a new font file in the LN03.
+
+\yskip\hang|end_txf| This is |true| if the last character of the present
+|TeX_font| is the last character mapped to |ln_font|.
+
+@<Local variables of |add_txf_to_lnf|@>==
+@!first_txfc, @!last_txfc : integer;
+@!txfc_next, @!final_txfc : integer;
+@!begin_txf, @!end_txf : boolean;
+@ After all the required character glyphs have been copied from the \.{PXL}
+file, we can close it.
+
+If, and only if, the very last character code was that of the highest mapped
+into this font, we can output the LN03 font to the \.{LN3} file.
+
+Finally, we report the number of bytes of rasters created in the font file.
+
+@<Tidy up after copying rasters from \.{PXL} file@>=
+close(pxl_file,@=disposition@>:=@=save@>,VAX_continue);
+
+if end_txf then output_LNF;
+
+print_ln(rasters:0,' bytes of rasters (',font_occupancy[TeX_font]:1,
+ ' characters)');
+write_ln(term_out,rasters:0,' bytes of rasters (',font_occupancy[TeX_font]:1,
+ ' characters)' ,crlf);
+add_txf_to_lnf:=rasters {Total bytes of rasters added to file}
+
+@* Procedures to access the font file. The definitions which follow facilitate
+access to the individual bytes, words, longwords and strings of the
+``|lnf_file|'' by accessing the appropriate entity in the variant record
+representation of the file's blocks. The procedures allow us to write bytes,
+words and longwords into the memory representation of the |lnf_file|.
+
+@d lnf_bytes(#)==lnf[(#) div VAX_block_length].bytes[(#) mod VAX_block_length]
+@d lnf_words(#)==lnf[(#) div VAX_block_length].words[((#) mod VAX_block_length)
+div 2]
+@d lnf_longs(#)==lnf[(#) div VAX_block_length].longs[((#) mod VAX_block_length)
+div 4]
+@d lnf_str(#)==lnf[(#) div VAX_block_length].str[((#) mod VAX_block_length) div
+4]
+
+@<Local procedures of |add_txf_to_lnf|@>=
+
+procedure lnf_byte(byte_address:integer; byte_val:eight_bits);
+begin
+ lnf_bytes(byte_address):=byte_val
+end;
+
+procedure lnf_word(byte_address:integer; word_val:sixteen_bits);
+begin if odd(byte_address) then
+ abort('Internal error (word at odd byte ',byte_address:1,')');
+@:fatal error Internal error word at odd byte}{\qquad\.{(word at odd byte)}@>
+ lnf_words(byte_address):=word_val
+end;
+
+procedure lnf_long(byte_address,long_val:integer);
+begin if odd(byte_address) then
+ abort('Internal error (longword at odd byte ',byte_address:1,')');
+@:fatal error Internal error longword at odd byte}{\qquad\.{(longword at odd byte)}@>
+ if byte_address mod 4 = 0 then
+ lnf_longs(byte_address):=long_val
+ else
+ begin if long_val<0 then
+ begin long_val:=long_val+@'17777777777; {$2^{31}-1$}
+ long_val:=long_val+1;
+ lnf_words(byte_address+2):=(long_val div 65536)+32768
+ end else
+ lnf_words(byte_address+2):=(long_val div 65536);
+ lnf_words(byte_address):=long_val mod 65536
+ end
+end;
+
+@ When we are ``outputting'' to the |lnf_file| from \.{PK} files, it's more
+convenient to call the following procedure; in fact, it might prove handy for
+use in |copy_char| too!
+
+@<Additional low-level...@>=
+
+procedure put_lnf(@!item : integer);
+begin lnf_bytes(base):=item;
+ incr(base)
+end;
+@#
+procedure repeat_row;
+begin put_lnf(lnf_bytes(row_addr));
+ incr(row_addr)
+end;
+
+@ For downloading the bitmap of an oversized glyph, we need to ``read'' six
+rows of pixels from either the |pxl_file| itself, or from the character's
+bitmap which has been formed in |lnf_file| from the |packed_file|.
+
+@<Read rows of pixels into sixel buffer@>=
+if pxl_ident=packed_file then
+ for j:=1 to ((num_cols+7) div 8) do
+ begin
+ sixel_line[k,j]:=reverse[lnf_bytes(base)];
+ incr(base)
+ end else
+ begin
+ for j:=1 to (num_cols+7) div 8 do
+ begin
+ sixel_line[k,j]:=pxl_byte(pxl_ptr);
+ incr(pxl_ptr); must_get(pxl_ptr)
+ end;
+ while (pxl_ptr mod 4) <> 0 do
+ begin
+ incr(pxl_ptr); must_get(pxl_ptr)
+ end
+ end
+
+
+@ It could happen that a glyph is imaged that doesn't exist in the font; we
+then mark this in the |loaded| field of the |glyph_map| as |missing|; such
+glyphs will result in appropriate $(x,y)$ positioning commands being output
+to the LN03, by derivation from the font metrics data.
+
+@<Other values of |download_status|@>= ,@!missing
+
+@ After we've read through the (packed or unpacked) pixel file, we should have
+managed to download glyphs for all the characters used in the current document.
+If the following check finds a character without an associated glyph, it
+downloads a dummy, invisible glyph of the appropriate width.
+
+@<Verify that all glyphs were available@>=
+for char_num := font_bc[TeX_font] to font_ec[TeX_font] do
+ with glyph_map(TeX_font)(char_num) do
+ if loaded=wanted then
+ begin
+ loaded := missing; {Ensure we don't try to image the glyph}
+ term_offset := 20; {Ensure we get a newline before warning}
+ warning('Font ',name,' doesn''t contain character ',char_num:1,crlf);
+@:Warning: Font doesn't contain character}{\quad\.{Font doesn't contain...}@>
+ @<Decide whereabouts to download the character@>;
+ @<Finish off any previous half font on LN03@>;
+ tfm_width := width;
+ num_cols := pixel_width;
+ base := ras_beg + ras_len;
+ @<Create null character locator entry@>;
+ char_code:=first_txfc; font_code:=ln_font
+ end
+
+@*Copy one character's rasters. For each character taken from an unpacked
+(\.{PXL}) file, the function |add_txf_to_lnf| calls this procedure |copy_char|,
+which
+provides the main action of the function, by converting the \.{PXL} file
+rasters to the format required by the \.{LN03}, and storing them away in the
+appropriate part of the ``|lnf_file|'' in memory.
+
+The global variable |base| is used as a pointer into the appropriate byte of the
+Character Definitions Region of the LN03 font file, and commences at the
+location determined from the ``size so far'' as recorded by |ras_beg| and
+|ras_len|.
+
+Having verified that the \.{PXL} file contains the character glyph required
+(if the character is absent, the address field of the directory entry will not
+point to an address within the file), the |move_to_pxl| procedure is called to
+make the appropriate bytes of the characters rasters accessible to the
+program.
+
+The character parameters section of the character definition is then completed
+in the font file; the first four bytes contain the kerning information (null,
+because \TeX\ does all the kerning for us, and we don't want the LN03 to upset
+it) and 24 bits of flags --- the only bit that we set in this flag field is
+the `flag flag' bit.
+
+LN03 pixels (of which there are 300 to an inch) can be converted to DEC
+centipoints (or Gutenbergs) by multiplying by 7200/300 = 24.
+
+@d Pxl_to_Gut=24
+
+@<Local procedures of |add_txf_to_lnf|@>=
+
+procedure copy_char(char_num,to_where:integer);
+ var @!i,@!j,@!k,@!n,@!len:integer;
+begin
+ base:=ras_beg+ras_len; {Where to start saving the parameters/rasters}
+ with pxl_dir[char_num] do
+ if (addr>0) and (addr<=(pxl_size div 4)-8) then
+ {Only process characters which lie within the file!}
+ with glyph_map(TeX_font)(char_num) do
+ begin
+ move_to_pxl(addr*4);
+ char_code:=to_where;@/
+ @<Process |tfm_width| information@>;
+ @<Validate size of character's glyph@>;
+ @<Complete remainder of Character Definition parameters@>;
+ @<Copy the rasters themselves@>;
+ @<Calculate the number of bytes of rasters transferred@>;
+ @<Complete the entry in the font character directory@>
+ end {|with|}
+end;
+
+
+@ The true character width (in scaled points) is taken from the |tfm_width| field of
+the pixel file directory; this value is converted to pixels and stored in the
+|ch_widths| array, where it is used by the procedures which set characters on
+the page. The value is also converted to Gutenbergs and stored in the
+|fnt_char_width| field for the character raster in the font file. If the
+width differs from that computed from the \.{TFM} file by more than one pixel,
+this is reported, and the value derived from the \.{PXL} file substituted in
+preference.
+
+
+@<Process |tfm_width| information@>=
+ch_wid:=round((dsize*resolution*tfm_width)/(two_to_the_20th*72.27));
+lnf_word(base,@"0000); {No kerning, lowest byte of flags=0}
+lnf_word(base+2,@"8000); {Highest bit of flags (flag flag) = 1}
+lnf_long(base+fnt_char_width,trunc(ch_wid*(7200.0/resolution)));
+ch_widths[ln_font,to_where]:=ch_wid;
+tfm_wid:=pixel_width;
+if abs(ch_wid-tfm_wid) > 1 then
+begin warning('Pixel width discrepancy; font ',open_file_name,' char ',char_num:1);
+@:Warning: Pixel width discrepancy}{\quad\.{Pixel width discrepancy}@>
+ show('---computed width: ',tfm_wid:1,'; actual width: ',ch_wid:1);
+end;
+pixel_width:=ch_wid
+
+@ The above section of code needs some workspace in which to perform those width
+computations. They may as well be local to |add_txf_to_lnf|.
+
+\yskip\hang|ch_wid| Holds the actual width of the character, in pixels,
+derived from the |tfm_width| field of the pixel file's directory.
+
+\yskip\hang|tfm_wid| Holds the character width as calculated from the
+|ch_widths| entry which came from the TFM file for this font.
+
+@<Local variables of |add_txf_to_lnf|@>==
+@!ch_wid,@!tfm_wid:integer;
+
+@ The \.{PXL} file directory entry contains |x_off| and |y_off| fields, which
+define the starting point of the raster relative to the character's reference
+point. These are passed to the font file as the |fnt_left_bearing| and
+|fnt_raster_baseline| fields of the raster entry, in Gutenbergs.
+
+The flags longword of the raster is then created, and indicates that the
+raster is in portrait orientation (relative to memory, not to the output
+device) and is an aligned expanded bit string. (Unfortunately, although
+DEC Std 180 permits run-length encoding of rasters, the LN03 itself does not
+support this facility, so rasters have to be downloaded in fully expanded form.)
+
+Invisible fonts (used by Sli\TeX) will have the bounding box info (|num_cols|
+and |num_rows|) both equal to zero. Since the LN03 isn't very happy with such
+characters (!), we will later insert a null character locator in the font's
+directory; we still go through the motions of generating character
+parameters and the (empty) bitmap in the font file, but bytes occupied by
+these will be overwritten with the next real bitmap. Although instructions
+to image such a null character are accepted by the printer, unfortunately
+the printer seems to image some other character at random! Therefore we
+mark the glyph as |missing|, so that no attempt is made to image it later.
+Oversized glyphs are also not inserted into the font file; so it is only for
+genuine printable glyphs that the value of |base| will be advanced to
+reserve the space occupied by the character's parameters.
+
+This module is always called in the context |with
+glyph_map(TeX_font)(char_num) do|.
+
+@<Complete remainder of Character Definition parameters@>=
+lnf_long(base+fnt_left_bearing,int(-Pxl_to_Gut*x_off));
+lnf_long(base+fnt_raster_baseline,int(-Pxl_to_Gut*y_off));
+lnf_long(base+fnt_char_pars+fnt_char_orient,@"00008100); {Aligned,bit-expanded}
+if num_rows=0 then loaded := missing; {``Invisible'' glyph}
+lnf_word(base+fnt_char_pars+fnt_char_cols,num_cols);
+lnf_word(base+fnt_char_pars+fnt_char_rows,num_rows);
+if loaded=yes then
+ base:=base+fnt_char_pars+fnt_char_raster
+
+@ Here are some further values than can be allocated to the |loaded| field
+of |glyph_map|: values could be:\par
+\item{$\bullet$} |yes| if character's glyph was included in a downloaded LN03
+font;
+\item{$\bullet$} |no| if the glyph exceeded the LN03's capability for the
+area of a downloaded glyph. In this case a null character locator will have
+been inserted in the directory of the downloaded font, and the actual
+glyph's bitmap will be sent to the printer each and every time it occurs in
+the document.
+
+@<Other values of |download_status|@>= ,@!yes ,@!no
+
+@ The LN03 has a physical (apparently arbitrary) restriction on the maximum size
+of a downloadable glyph. For a glyph to be acceptable, it must satisfy the
+inequality $$
+ 2\times\lceil|num_cols|/2\rceil\times\lceil|num_rows|/8\rceil\le5700$$
+
+The following section prevents such an oversized glyph from being included in
+the downloaded font; it is always called in the context |with
+glyph_map(TeX_font)(char_num) do|.
+
+@<Validate size of character's glyph@>=
+if ((num_rows+7) div 8) * 2 * ((num_cols+1) div 2) > largest_glyph then
+ loaded:=no {Indicate oversized glyph unavailable}
+else
+ loaded:=yes {Indicate glyph successfully downloaded}
+
+
+@ After further setting up of values in the font file, we copy the bits of the
+rasters from the \.{PXL} file to the LN03 font file; this requires that we
+reverse each byte.
+
+As each byte is copied, we get another; the |must_get| procedure will read in
+a new block from the \.{PXL} file if necessary. At the end of each row, the
+next is started from the next complete longword of the \.{PXL} file.
+
+Only character glyphs which are capable of being downloaded are entered into
+the file; invisible and oversized glyphs don't need to have the bitmap
+copied, and they'll eventually end up with a null character locator in the
+font file's directory.
+
+This module is always called in the context |with
+glyph_map(TeX_font)(char_num) do|.
+
+@<Copy the rasters themselves@>=
+if loaded=yes then
+for i:=1 to num_rows do
+begin
+ for j:=1 to (num_cols+7) div 8 do {Whole bytes required}
+ begin lnf_bytes(base):=reverse[pxl_byte(pxl_ptr)];@/
+ incr(pxl_ptr); must_get(pxl_ptr); incr(base)
+ end; {Copied bytes for one row of pixels}
+ while (pxl_ptr mod 4)<>0 do
+ begin incr(pxl_ptr); {Row held in 32-bit words in \.{PXL} file}
+ must_get(pxl_ptr)
+ end
+end
+
+@ The |copy_char| procedure requires an array to be set up to ``reverse''
+individual bytes' bits, since the \.{PXL} file stores the first pixel of
+a row at the most significant bit of the long-word, whilst DEC Std 180
+requires the first pixel to be the least significant bit of the first byte.
+
+We therefore create a global array |reverse|, which we initialize with
+appropriate patterns to reverse any byte proferred as an index.
+
+@<Globals...@>=
+@!reverse: packed array [0..255] of eight_bits;
+
+@ @<Procedures for...@>=
+procedure Generate_Reversal;
+ var @!index,@!patt,@!cnt,@!rev: eight_bits;
+begin
+ for index:=0 to 255 do
+ begin rev:=0; patt:=index;
+ for cnt:=1 to 8 do
+ begin rev:=2*rev;
+ if odd(patt) then rev:=rev+1;
+ patt:=patt div 2
+ end;
+ reverse[index]:=rev
+ end;
+end;
+
+@ @<Set initial...@>=
+ Generate_Reversal;
+
+@ The number of bytes required for the character glyph in landscape and
+portrait modes is computed, and added to the accumulated sum of these for all
+characters; the ``mixed'' mode count is increased by the larger of these
+quantities.
+
+The value |len| is also computed to be added to the Character Definitions
+descriptor held in |ras_beg,ras_len|. None of these quantities are updated
+unless the character glyph has actually been copied into the font file,
+i.e., |loaded=yes|.
+
+@<Calculate the number of bytes of rasters transferred@>=
+if loaded=yes then
+begin
+i:=((num_rows+7) div 8)*num_cols; {Bytes required for raster in landscape mode}
+lsize:=lsize+i;
+j:=((num_cols+7) div 8); {Bytes/column}
+psize:=psize+j*num_rows; {bytes added to portrait rasters}
+msize:=msize+VAX_max(i,j*num_rows); {bytes added to mixed mode rasters}
+len:=j*num_rows+fnt_char_pars+fnt_char_raster {Allow for the parameters}
+end else len:=0
+
+@ After transferring the rasters for one character's glyph, we finally
+complete the entry in the font file's character directory. We record the
+address of the character's rasters in the appropriate character locator,
+update the count of rasters stored, and round up to the next \\{word}
+boundary in the font file (note that it is not a requirement of DEC Std 180
+that rasters start on a \\{longword} boundary.)
+
+If the glyph was not copied into the font file, because it exceeded the
+LN03's maximum size of glyph, or because it was invisible, then a null entry
+is made for the character locator, and the next raster, if any, will
+overwrite that just stored.
+
+@<Complete the entry in the font character directory@>=
+if loaded<>yes then
+begin
+ lnf_long(fnt_char_dir+4*(to_where-dir_base),0);
+ incr(null_chars); decr(num_chars)
+end
+else begin
+ lnf_long(fnt_char_dir+4*(to_where-dir_base),ras_beg+ras_len);
+ ras_len:=ras_len+len; rasters:=rasters+len;
+ if odd(ras_len) then
+ begin
+ lnf_byte(base,0); {Null byte to round raster to word boundary}
+ incr(ras_len);
+ incr(rasters)
+ end
+end
+
+@ The following procedure initialises the ``fixed'' area of the \.{LN03} font
+file as held in memory. We start by clearing the whole of the first block of
+the file; this is sufficient to ensure that the whole of the file header,
+attributes and parameters regions are zeroed, which reduces the number of
+individual assigments necessary.
+
+The counts of space occupied by the rasters, and the raster sizes in portrait,
+landscape and mixed modes are also initialized.
+
+@<Local procedures of |add_txf_to_lnf|@>=
+procedure init_LNF;
+var @!i,@!j:integer;
+begin
+ for i:=0 to 127 do lnf_longs(4*i):=0; {Clear the lnf header}
+ ras_len:=0; psize:=0; lsize:=0; msize:=0;@/
+ @<Complete the font file's header region@>@;
+ @<Complete the font file's attributes region@>@;
+ @<Complete the font file's parameters region@>@;
+ @<Complete the font file's string pool region@>@;
+end;
+
+@ The font file's header contains some identification material, and a number
+of descriptors which point to other regions of the font file.
+
+@<Complete the font file's header region@>=
+lnf_str(fnt_identifier):='FONT';
+lnf_long(fnt_version,1); {Font File Format is V1.0}
+file_ID:='U0000'+@=dec@>(ln_font,2,2)+'002SK00GG0001UZZZZ02F000';
+if using_GR then file_ID[21]:='O';
+lnf_long(12,VAX_length(file_ID)); lnf_long(16,fnt_file_id);
+for j:=1 to VAX_length(file_ID) do lnf_byte(j+fnt_file_id-1,xord[file_ID[j]]);
+{For the moment, we set creation date to 11-SEP-1973 14:00:00}
+lnf_word(fnt_date,1973); lnf_word(fnt_date+2,9); lnf_word(fnt_date+4,11);
+lnf_word(fnt_date+6,14); lnf_word(fnt_date+8,0); lnf_word(fnt_date+10,0);
+lnf_long(fnt_attr,fnt_attr_len); lnf_long(fnt_attr+4,fnt_attributes);
+lnf_long(fnt_params,fnt_params_len); lnf_long(fnt_params+4,fnt_parameters);
+if using_GR then
+ num_chars:=last_lnf[ln_font]-right_first+1
+else
+ if last_lnf[ln_font]<left_last then
+ num_chars:=last_lnf[ln_font]-left_first+1
+ else
+ num_chars:=left_last-left_first+1;
+lnf_long(fnt_char_directory,4*num_chars);
+lnf_long(fnt_char_directory+4,fnt_char_dir);
+lnf_pool_offset:=fnt_char_dir+4*num_chars;
+lnf_long(fnt_seg_list,0); { Empty |seg_list| descriptor }
+lnf_long(fnt_seg_list+4,0);
+lnf_long(fnt_future,0); lnf_long(fnt_future+4,0);
+lnf_long(fnt_strings,4*((fnt_string_pool_len+3) div 4)); {Rounded to longword boundary}
+lnf_long(fnt_strings+4,lnf_pool_offset);
+ras_beg:=lnf_pool_offset+4*((fnt_string_pool_len+3) div 4);
+{We fill in address of Kerning Table, but leave it of length zero}
+lnf_long(fnt_kerns+4,0);
+lnf_long(fnt_chars+4,ras_beg); {We can't fill in length until finished}
+lnf_long(fnt_first,left_first); lnf_long(fnt_last,num_chars-1+left_first);
+{No definitions (Yet!!!!) for less than, greater than and error characters}
+{No usage of Extension field}
+lnf_long(fnt_space," "); {Space character value}
+lnf_long(fnt_organisation,@"A8);
+ {Expanded rasters;Identical Orientation; Large Values used}
+lnf_long(fnt_no_of_params,fnt_char_pars);
+lnf_long(fnt_in_file_count,num_chars);
+null_chars:=0; lnf_long(fnt_null_count,null_chars); {Null count maybe revised later}
+lnf_long(fnt_char_count,num_chars);
+{Alternate blocks remains at zero}
+lnf_long(fnt_rasters,num_chars);
+{Compressed rasters remains at zero; psize, etc., are filled in at end}
+if using_GR then dir_base:=right_first else dir_base:=left_first;
+{Establish offset into font's character locators}
+
+@ These used to be local variables of |add_txf_to_lnf|, used in the
+previous section. However, since we now require to use |num_chars| and
+|null_chars| to update the font file before it is finally output, they have
+to be global. (Strictly speaking, |file_ID| could remain local, but that
+would require much shuffling of the W{\mc EB}!)
+
+\yskip\hang|file_ID| Holds the fixed-length string which identifies any
+particular font file to the LN03.
+
+\yskip\hang|num_chars| Gives the number of characters defined in each half of
+the LN03 font file.
+
+\yskip\hang|null_chars| Counts any null character locators added to the file
+for oversized or missing glyphs.
+
+\yskip\hang|dir_base| Code of the first character loaded in the current half
+font; used to derive the correct offset into |font_char_dir| for completing
+locators.
+
+@<Global...@>=
+@!file_ID:packed array [1..31] of char;
+@!num_chars,@!null_chars:integer;
+@!dir_base:integer;
+@ The font file's attributes region contains mostly descriptors (of strings in
+the string pool region) which identify the font, font family, \\{etc.}
+
+@<Complete the font file's attributes region@>=
+lnf_long(fnt_attributes+fnt_attr_flags,2); {Roman}
+lnf_long(fnt_attributes+fnt_char_set,fnt_designator_len);
+lnf_long(fnt_attributes+fnt_char_set+4,lnf_pool_offset);
+lnf_long(fnt_attributes+fnt_type_ID,fnt_type_ID_len);
+lnf_long(fnt_attributes+fnt_type_ID+4,lnf_pool_offset+fnt_designator_len);
+lnf_long(fnt_attributes+fnt_type_family,fnt_type_family_len);
+lnf_long(fnt_attributes+fnt_type_family+4,
+ lnf_pool_offset+fnt_designator_len+fnt_type_ID_len);
+lnf_long(fnt_attributes+fnt_font_ID,fnt_font_ID_len);
+lnf_long(fnt_attributes+fnt_font_ID+4,
+ lnf_pool_offset+fnt_designator_len+fnt_type_ID_len+fnt_type_family_len);
+{Type category, Font description descriptors empty}
+{Following values are purely arbitrary at present; try harder later}
+lnf_long(fnt_attributes+fnt_type_size,10); {``10pt''}
+lnf_long(fnt_attributes+fnt_average_width,500); {5.00pt}
+lnf_word(fnt_attributes+fnt_resolution+2,24); {24.0000 centipoints/pixel}
+lnf_long(fnt_attributes+fnt_weight,16); {``Normal'' weight}
+lnf_long(fnt_attributes+fnt_horiz_prop,16); {Neither expanded nor compressed}
+lnf_word(fnt_attributes+fnt_horiz_ratio,1); {1:1 relative to a ``normal'' font}
+lnf_word(fnt_attributes+fnt_horiz_ratio+2,1);
+lnf_word(fnt_attributes+fnt_pixel_aspect,1); {``Square'' pixels}
+lnf_word(fnt_attributes+fnt_pixel_aspect+2,1);
+lnf_word(fnt_attributes+fnt_rotation+2,1); {tan = 0/1 = $0^\circ$}
+{Device characteristics = 0}
+{Foundry and Designer have empty descriptors}
+
+@ The font file's parameters region contain information relating to all the
+characters as a whole. Since they relate to such features as electronic
+underlining, which are not utilized by the \.{LN3} file generated by
+DVItoLN03, the values used are purely arbitrary. (The values are those used
+by Flavio Rose's original \.{LN03toPP} (PL/I) program.)
+
+@<Complete the font file's parameters region@>=
+{Params flags = 0}
+lnf_long(fnt_parameters+fnt_underline_offset,30);
+lnf_long(fnt_parameters+fnt_underline_thickness,20);
+lnf_long(fnt_parameters+fnt_thru_offset,-60);
+lnf_long(fnt_parameters+fnt_thru_thickness,20);
+lnf_long(fnt_parameters+fnt_overline_offset,-150);
+lnf_long(fnt_parameters+fnt_overline_thickness,20);
+lnf_word(fnt_parameters+fnt_slant+2,1); {tan = 0/1 = $0^\circ$}
+lnf_word(fnt_parameters+fnt_shadow_offset+2,30); {$\delta x$ only}
+lnf_long(fnt_parameters+fnt_superscript,-90); {$\delta y$ only}
+lnf_long(fnt_parameters+fnt_subscript,40); {$\delta y$ only}
+lnf_long(fnt_parameters+fnt_centreline,60);
+lnf_long(fnt_parameters+fnt_min_space,240); {Note |min>max|!}
+lnf_long(fnt_parameters+fnt_max_space,60);
+lnf_long(fnt_parameters+fnt_mean_space,100);
+lnf_long(fnt_parameters+fnt_em_width,240);
+lnf_long(fnt_parameters+fnt_en_width,120);
+lnf_long(fnt_parameters+fnt_thin_space,40);
+lnf_long(fnt_parameters+fnt_digit_width,120);
+lnf_long(fnt_parameters+fnt_topline_offset,-160);
+lnf_long(fnt_parameters+fnt_accent,-120);
+lnf_long(fnt_parameters+fnt_halfline_offset,-70);
+lnf_long(fnt_parameters+fnt_overall_height,240);
+lnf_long(fnt_parameters+fnt_height,-180);
+lnf_long(fnt_parameters+fnt_depth,60);
+lnf_long(fnt_parameters+fnt_H_height,160);
+lnf_long(fnt_parameters+fnt_ex_height,120);
+lnf_long(fnt_parameters+fnt_white_above,20);
+lnf_long(fnt_parameters+fnt_white_below,20);
+
+@ The string pool region of the font file contains the majority of the
+character strings which are required to identify the font.
+
+@<Complete the font file's string pool region@>=
+lnf_byte(lnf_pool_offset,"0"); {Char set designator}
+if using_GR then
+ lnf_byte(lnf_pool_offset+1,"<")
+else
+ lnf_byte(lnf_pool_offset+1,"B");
+lnf_byte(lnf_pool_offset+2,9); {HT character}
+for i:=4 to fnt_designator_len do
+ lnf_byte(lnf_pool_offset+i-1,"Z"); {|'ZZZZ'|---full char set}
+for i:=1 to fnt_type_ID_len do
+ lnf_bytes(lnf_pool_offset+i-1+fnt_designator_len):=
+ lnf_bytes(i-1+fnt_file_id); {Copy first 7 of |file_ID|}
+for i:=1 to fnt_type_family_len do
+ lnf_bytes(lnf_pool_offset+i-1+fnt_designator_len@|+fnt_type_ID_len) :=
+ " "; {Type family is all spaces}
+for i:=1 to fnt_font_ID_len do
+ lnf_bytes(lnf_pool_offset+i-1+fnt_designator_len@|+fnt_type_ID_len@|
+ +fnt_type_family_len) := lnf_bytes(i-1+fnt_file_id); {Copy first 16 of |file_ID|}
+
+@ The following procedure is invoked whenever an \.{LN03} font file in memory
+is ready to be written to the output |ln3_file|. Firstly we complete those
+fields of the font file header region which we were unable to complete before,
+storing away the total length (at front \&{and} back) and repeating the
+`\.{FONT}' indication at the end of the file. We also complete the character
+definitions region descriptor, and fill in the counts of bytes loaded as
+portrait, landscape and mixed mode rasters.
+
+Obviously it is not possible to include the file \\{verbatim} in the output as
+a binary image, since the terminal output driver and/or the printer symbiont
+would probably eliminate most of those characters which are unprintable.
+Therefore the LN03 requires that the binary file be encoded into ``sixel''
+format; this is more usually used to transfer graphics information to DEC
+printers, one sixel being a printable character (in the range `\.?'$\to$`\.\~')
+which encodes the numbers |0..63| representing a column of six pixels.
+
+@<Local procedures of |add_txf_to_lnf|@>=
+procedure output_LNF;
+ var @!i,@!j,@!k,@!records,@!sixel_ct:integer;
+ @!line_out:varying [128] of char;
+ @!transform : six_pack;
+begin
+ lnf_len:=ras_beg+ras_len+8; {Make room for Trailing identifier}
+ lnf_long(fnt_total_size,lnf_len); {Total size noted into first longword}
+ lnf_long(lnf_len-8,lnf_len); {and into penultimate longword}
+ lnf_long(lnf_len-4,lnf_longs(fnt_identifier)); {Copy |'FONT'| from 2nd longword to last}
+ lnf_long(fnt_chars,ras_len); {Length of character definitions}
+ lnf_long(fnt_in_file_count,num_chars); {We might have excluded some}
+ lnf_long(fnt_null_count,null_chars); {which will be reflected here}
+ lnf_long(fnt_rasters,num_chars); {and so we only made this many rasters}
+ lnf_long(fnt_portrait,psize);
+ lnf_long(fnt_landscape,lsize);
+ lnf_long(fnt_mixed,msize);
+ @<Sixelize and write@>
+end;
+
+@ To convert eight-bit bytes to sixels, which the \.{LN03} requires, we use
+(abuse?) \PASCAL's variant record mechanism, to map three bytes into 4 six-bit
+characters.
+
+@<Types in...@>==
+ @!six_pack = packed record
+ case boolean of
+ false: (@!bytes : packed array [0..2] of eight_bits);
+ true: (@!sixels: packed array [1..4] of [bit(6)] 0..63)
+ end;
+
+@ The three bytes have to be placed in the record such that the earlier bytes
+(least significant in the file) are at the left-ward end of the record. The
+resultant six-bit integers are converted to ``printable'' characters by adding
+the |ASCII| character `\.{?}', thus giving characters in the range
+`\.{?}'$\to$`\.{\~}'. It is these characters that DEC calls ``sixels'', being
+a representation of six pixels in one character.
+
+It is most convenient to process 96 bytes at a time, thus yielding 128
+characters records (of sixel characters). Accordingly, we firstly ensure that
+the file is some multiple of 96 bytes long.
+
+@<Sixelize and write@>=
+ while (lnf_len mod 96) <> 0 do
+ begin lnf_word(lnf_len,0); { Clear out remainder of ``last record'' }
+ lnf_len:=lnf_len+2
+ end; { Can't work in longwords, in case on odd word boundary }
+ records:=lnf_len div 96;
+ i:=0; j:=0; {Block/byte in |lnf| array}
+ while records > 0 do
+ begin
+ line_out:=''; {Null string}
+ sixel_ct:=0; {We write 128 sixels (=96 bytes) per record}
+ repeat
+ k:=2;
+ repeat
+ transform.bytes[k]:=lnf[i].bytes[j]; {Store bytes from left}
+ incr(j); decr(k);
+ while j>=512 do
+ begin incr(i); j:=j-512 end
+ until k<0; {3 bytes at a time}
+ for k:=4 downto 1 do
+ begin
+ line_out:=line_out+chr(transform.sixels[k]+"?");
+ incr(sixel_ct)
+ end;
+ until sixel_ct=128;
+ write_ln(ln3_file,line_out);
+ decr(records)
+ end
+
+@* Skipping pages.
+A routine that's much simpler than |do_page| is used to pass over
+pages that are not being translated. The |skip_pages| subroutine
+is assumed to begin just after the preamble has been read, or just
+after a |bop| has been processed. It continues until either finding a
+|bop| that matches the desired starting page specifications, or until
+running into the postamble.
+
+In this version of \.{DVItoLN03}, it is necessary to ``read'' through all
+the pages twice; on the first pass, we gather statistics about the usage
+of each character in every font, to minimize the number of rasters
+which have to be loaded into the LN03. This procedure |skip_pages| has
+therefore been modified to permit its use during this scan.
+
+In such use, it is first called in the normal fashion, truly to skip pages
+until |start_match| indicates that the first page to be output has been
+found (or the beginning of the postamble, in the event that the specified
+first page does not exist). This results in |started| becoming |true|.
+A further call of |skip_pages|, with |started| asserted, records the use of
+each character. Whilst this ``scanning'' phase is
+taking place, the Boolean |scanning| inhibits writing to the \.{TYP} file.
+
+@p procedure skip_pages;
+label 9999; {end of this subroutine}
+var p:integer; {a parameter}
+@!k:0..255; {command code}
+@!down_the_drain:integer; {garbage}
+@!pages_counted:integer; {counts ``wanted'' pages whilst usage is calculated }
+begin
+pages_counted:=1; {We've already met the first page requested}
+while true do
+ begin if eof(dvi_file) then bad_dvi('the file ended prematurely');
+@:Bad DVI file the file ended prematurely}{\quad\.{the file ended prematurely}@>
+ k:=get_byte;
+ p:=first_par(k);
+ case k of
+ bop: begin @<Pass a |bop| command, setting up the |count| array@>;
+ if not started and start_match then
+ begin started:=true; goto 9999;
+ end;
+ if started then
+ begin incr(pages_counted); {We've got another page that's wanted}
+ if (pages_counted mod 10)=0 then monitor('.'); {show progress}
+ if pages_counted>max_pages then {We can skip to the postamble}
+ begin old_backpointer:=first_backpointer;
+ move_to_byte(post_loc);
+ monitor('done.'+crlf); term_offset:=0
+ end;
+ end;
+ end;
+ set_rule,put_rule: down_the_drain:=signed_quad;
+ fnt_def1,fnt_def1+1,fnt_def1+2,fnt_def1+3: begin define_font(p);
+ print_ln(' ');
+ end;
+ xxx1,xxx1+1,xxx1+2,xxx1+3: while p>0 do
+ begin down_the_drain:=get_byte; decr(p);
+ end;
+ post: begin in_postamble:=true;
+ monitor('done.'+crlf); term_offset:=0;
+ goto 9999;
+ end;
+ @<Cases that would set characters on paper@>;
+ @<Cases that would change fonts@>;
+ othercases do_nothing
+ endcases;
+ end;
+9999:end;
+
+@ If (!) we meet a command that would require a character to be set on the
+paper, we note that the relevant character has been used, provided the page
+being ``skipped'' is one that is to be printed (\\{i.e.} |started| has been
+set). The |pages_counted| variable is used to inhibit the gathering of such
+statistics after the specified number of pages have been ``read''.
+
+We mark both the individual glyph and the font itself as being |wanted|.
+
+@<Cases that would set characters on paper@>=
+sixty_four_cases(set_char_0),sixty_four_cases(set_char_0+64), @/
+four_cases(set1),four_cases(put1): @/
+ if started and (pages_counted<=max_pages) then
+ begin
+ cur_font_glyph(p).loaded:=wanted;
+ font_type[cur_font]:=wanted
+ end
+
+@ Whenever a font change would have occurred, we determine the |cur_font| so
+that the above section, which notes the use of a character, can relate this to
+the correct font.
+
+@<Cases that would change fonts@>=
+sixty_four_cases(fnt_num_0),four_cases(fnt1): @/
+ begin font_num[nf]:=p; cur_font:=0;
+ while font_num[cur_font]<>p do incr(cur_font);
+ cur_font:=font_map[cur_font];
+ cur_base:=glyph_base[cur_font]
+ end
+
+@ Global variables called |old_backpointer| and |new_backpointer|
+are used to check whether the back pointers are properly set up.
+Another one tells whether we have already found the starting page.
+
+@<Glob...@>=
+@!old_backpointer:integer; {the previous |bop| command location}
+@!new_backpointer:integer; {the current |bop| command location}
+@!started:boolean; {has the starting page been found?}
+
+@ @<Set init...@>=
+old_backpointer:=-1; started:=false;
+
+@ @<Pass a |bop|...@>=
+new_backpointer:=cur_loc-1; incr(page_count);
+for k:=0 to 9 do count[k]:=signed_quad;
+if signed_quad<>old_backpointer
+ then error('backpointer in byte ',cur_loc-4:1,
+ ' should be ',old_backpointer:1,'!');
+@:Error: backpointer in byte should be}{\quad\.{backpointer...should be...}@>
+old_backpointer:=new_backpointer
+
+@* Using the backpointers.
+The routines in this section of the program are brought into play only
+if |random_reading| is |true|.
+First comes a routine that illustrates how to find the postamble quickly.
+
+@<Find the postamble, working back from the end@>=
+n:=dvi_length;
+if n<53 then bad_dvi('only ',n:1,' bytes long');
+@:Bad DVI file only n bytes long}{\quad\.{only $n$ bytes long}@>
+m:=n-1;
+repeat if m=0 then bad_dvi('no 223s'); {ignore trailing zeroes}
+@:Bad DVI file no 223s}{\quad\.{no 223s}@>
+ move_to_byte(m); k:=get_byte; decr(m);
+until k<>0;
+repeat if m=0 then bad_dvi('all 223s');
+@:Bad DVI file all 223s}{\quad\.{all 223s}@>
+move_to_byte(m); k:=get_byte; decr(m);
+until k<>223;
+if k<>id_byte then bad_dvi('ID byte is ',k:1);
+@:Bad DVI file ID byte is wrong}{\quad\.{ID byte is wrong}@>
+move_to_byte(m-3); q:=signed_quad;
+if (q<0)or(q>m-33) then bad_dvi('post pointer ',q:1,' at byte ',m-3:1);
+@:Bad DVI file post pointer is wrong}{\quad\.{post pointer is wrong}@>
+move_to_byte(q); k:=get_byte;
+if k<>post then bad_dvi('byte ',q:1,' is not post');
+@:Bad DVI file byte n is not post}{\quad\.{byte $n$ is not }\\{post}@>
+post_loc:=q; first_backpointer:=signed_quad
+
+@ Note that the last steps of the above code save the locations of the
+the |post| byte and the final |bop|. We had better declare these global
+variables, together with another one that we will need shortly.
+
+@<Glob...@>=
+@!post_loc:integer; {byte location where the postamble begins}
+@!first_backpointer:integer; {the pointer following |post|}
+@!start_loc:integer; {byte location of the first page to process}
+
+@ The next little routine shows how the backpointers can be followed
+to move through a \.{DVI} file in reverse order. Ordinarily a \.{DVI}-reading
+program would do this only if it wants to print the pages backwards or
+if it wants to find a specified starting page that is not necessarily the
+first page in the file; otherwise it would of course be simpler and faster
+just to read the whole file from the beginning.
+
+@<Count the pages and move to the starting page@>=
+monitor('Finding starting page...');
+@.Finding starting page@>
+q:=post_loc; p:=first_backpointer; start_loc:=-1;
+if p<0 then in_postamble:=true
+else begin repeat
+ {now |q| points to a |post| or |bop| command; |p>=0| is prev pointer}
+ if p>q-46 then
+ bad_dvi('page link ',p:1,' after byte ',q:1);
+@:Bad DVI file page link wrong}{\quad\.{page link wrong...}@>
+ q:=p; move_to_byte(q); k:=get_byte;
+ if k=bop then incr(page_count)
+ else bad_dvi('byte ',q:1,' is not bop');
+@:Bad DVI file byte n is not bop}{\quad\.{byte $n$ is not }\\{bop}@>
+ for k:=0 to 9 do count[k]:=signed_quad;
+ if start_match then start_loc:=q;
+ p:=signed_quad;
+ @<Note whether we've two \\{recto} pages in succession@>;
+ until p<0;
+ if start_loc<0 then abort('starting page number could not be found!');
+@:fatal error starting page number}{\quad\.{starting page number...}@>
+ move_to_byte(start_loc+1); old_backpointer:=start_loc;
+ for k:=0 to 9 do count[k]:=signed_quad;
+ p:=signed_quad; started:=true;
+ end;
+if page_count<>total_pages then
+ warning('there are really ',page_count:1,' pages, not ',total_pages:1,'!');
+@:Warning: there are really n pages}{\quad\.{there are really $n$ pages}@>
+monitor('found.'+crlf); term_offset:=0
+
+@ One of the reasons for using the above routine (which seems rather
+wasteful if the user wants to print pages starting from the beginning of the
+\.{DVI} file) is so that we can determine whether any particular \\{recto}
+page is followed by another, without an intervening \\{verso} page. This
+information can then be used at printing time to change the printing mode of
+the DEClaser~2200 (LN06), which supports duplex printing, such that the
+first of these pages be printed in simplex mode. Doing this speeds up the
+printing cycle compared with merely outputting a blank \\{verso} page,
+since the mechanical operation of turning over the paper is thereby avoided.
+
+Therefore we construct an array of pointers into the \.{DVI} file where an
+entry indicates that the page is followed by a blank \\{verso} sheet. Here
+are the necessary data structures:
+
+@<Glob...@>=
+@!blank_follows:array[1..max_blank_pages] of integer;
+@!ptr_blanks:0..max_blank_pages;
+@!next_is_recto:boolean;
+
+@ Naturally we initialize this such that a final \\{recto} page will have
+its blank \\{verso} side treated by the same mechanism.
+
+@<Set init...@>=
+next_is_recto:=true; ptr_blanks:=0;
+
+@ As we work our way backwards through the file, we have the opportunity to
+recognize that a \\{recto} page is followed directly by another of the same,
+without an intervening \\{verso} page. This code relies upon \TeX\ having
+used its \.{\\count0} for the page number, which is the usual convention,
+even when other counters are used to provide additional information in page
+numbering (such as the chapter number). When we later process the
+information in the |blank_follows| array, we do so in reverse order, which
+therefore corresponds with the processing of the file in the forward
+direction.
+
+@<Note whether we've two \\{recto} pages in succession@>=
+if odd_page and next_is_recto then
+ if ptr_blanks=max_blank_pages then
+ capacity_exceeded('too many blank verso pages')
+@:capacity exceeded too many blank verso}{\quad\.{too many blank }\\{verso}\.{ pages}@>
+ else
+ begin
+ incr(ptr_blanks); blank_follows[ptr_blanks]:=cur_loc
+ end;
+next_is_recto:=odd_page
+
+@* Reading the postamble.
+Now imagine that we are reading the \.{DVI} file and positioned just
+four bytes after the |post| command. That, in fact, is the situation,
+when the following part of \.{DVItoLN03} is called upon to read, translate,
+and check the rest of the postamble.
+
+@p procedure read_postamble;
+var k:integer; {loop index}
+@!p,@!q,@!m:integer; {general purpose registers}
+begin post_loc:=cur_loc-5;
+print_ln('Postamble starts at byte ',post_loc:1,'.');
+@.Postamble starts at byte n@>
+if signed_quad<>numerator then
+ warning('numerator doesn''t match the preamble!');
+@:warning numerator doesn't match}{\quad\.{numerator doesn't match...}@>
+if signed_quad<>denominator then
+ warning('denominator doesn''t match the preamble!');
+@:warning denominator doesn't match}{\quad\.{denominator doesn't match...}@>
+if signed_quad<>mag then if new_mag=0 then
+ warning('magnification doesn''t match the preamble!');
+@:warning magnification doesn't match}{\quad\.{magnification doesn't match...}@>
+max_v:=signed_quad; max_h:=signed_quad;@/
+max_v_saved:=max_v; max_h_saved:=max_h;@/
+print('maxv=',max_v:1,', maxh=',max_h:1);@/
+max_s:=get_two_bytes; total_pages:=get_two_bytes;@/
+print_ln(', maxstackdepth=',max_s:1,', totalpages=',total_pages:1);
+@<Process the font definitions of the postamble@>;
+@<Make sure that the end of the file is well-formed@>;
+end;
+
+@ When we get to the present code, the |post_post| command has
+just been read.
+
+@<Make sure that the end of the file is well-formed@>=
+q:=signed_quad;
+if q<>post_loc then
+ error('bad postamble pointer in byte ',cur_loc-4:1,'!');
+@:Error: bad postamble pointer}{\quad\.{bad postamble pointer}@>
+m:=get_byte;
+if m<>id_byte then error('identification in byte ',cur_loc-1:1,
+@:Error: identification in byte p should be n}{\quad\.{identification...should be $n$}@>
+ ' should be ',id_byte:1,'!');
+k:=cur_loc; m:=223;
+while (m=223)and not eof(dvi_file) do m:=get_byte;
+if not eof(dvi_file) and (m<>0) then bad_dvi('signature in byte ',cur_loc-1:1,
+@:Bad DVI file signature...should be}{\quad\.{signature...should be...}@>
+ ' should be 223')
+else if cur_loc<k+4 then
+ warning('not enough signature bytes at end of file (',
+@:Warning: not enough signature bytes}{\quad\.{not enough signature bytes...}@>
+ cur_loc-k:1,')');
+
+@ @<Process the font definitions...@>=
+repeat k:=get_byte;
+if (k>=fnt_def1)and(k<fnt_def1+4) then
+ begin p:=first_par(k);
+ define_font(p);
+ if not substitution_pass then print_ln(' ');
+ k:=nop;
+ end;
+until k<>nop;
+if k<>post_post then
+ error('byte ',cur_loc-1:1,' is not postpost!')
+@:Error: byte n is not postpost}{\quad\.{byte $n$ is not }\\{postpost}@>
+
+@* The main program.
+Now we are ready to put it all together. This is where \.{DVItoLN03} starts,
+and where it ends. These macros define various possible exit values for the
+program, through the VAX/VMS system service \.{\$exit}.
+@^system dependencies@>
+
+@d VAX_exit==@=$exit@>
+@d VAX_ss_normal==@= sts$k_success @>
+@d VAX_ss_warning==@= sts$k_warning + sts$m_inhib_msg @>
+@d VAX_ss_error==@= sts$k_error + sts$m_inhib_msg @>
+@d VAX_ss_fatal==@= sts$k_severe + sts$m_inhib_msg @>
+
+@p begin initialize; {get all variables initialized}
+ dialog; {set up all the options}
+ write_ln(term_out,'(',actual_file_spec,crlf);
+ print_ln('Reading from file ',actual_file_spec);
+ @<Process the preamble@>;
+ @<Find the postamble, working back from the end@>;
+ in_postamble:=true; read_postamble; in_postamble:=false;
+ @<Count the pages and move to the starting page@>;
+ if not in_postamble then @<Gather font usage statistics@>;
+ if not in_postamble then @<Translate up to |max_pages| pages@>;
+ close(ln3_file,@=disposition:=save@>,VAX_continue);
+ monitor(')');
+final_end:
+ ask := (history > spotless) or odd(VAX_cli_present('LOG'));
+ if VAX_cli_present('LOG') = VAX_cli_negated then ask := false;
+ if ask then
+ close(type_file,@=disposition:=save@>,VAX_continue)
+ else
+ close(type_file,@=disposition:=delete@>,VAX_continue);
+ case history of { Issue an appropriate VAX exit status }
+ spotless: VAX_exit(VAX_ss_normal); { Everything OK! }
+ warning_given: VAX_exit(VAX_ss_warning);
+ error_given: VAX_exit(VAX_ss_error);
+ fatal_error: VAX_exit(VAX_ss_fatal)
+ end;
+end.
+
+@ The main program needs a few global variables in order to do its work.
+
+@<Glob...@>=
+@!k,@!m,@!n,@!p,@!q:integer; {general purpose registers}
+
+@ A \.{DVI}-reading program that reads the postamble first need not look at the
+preamble; but \.{DVItoLN03} looks at the preamble in order to do error
+checking, and to display the introductory comment.
+
+@<Process the preamble@>=
+open_dvi_file;
+p:=get_byte; {fetch the first byte}
+if p<>pre then bad_dvi('First byte isn''t start of preamble!');
+@:Bad DVI file First byte isn\'t}{\quad\.{First byte isn't...}@>
+p:=get_byte; {fetch the identification byte}
+if p<>id_byte then
+ error('identification in byte 1 should be ',id_byte:1,'!');
+@:Error: identification in byte p should be n}{\quad\.{identification...should be $n$}@>
+@<Compute the conversion factor@>;
+p:=get_byte; {fetch the length of the introductory comment}
+print('''');
+while p>0 do
+ begin decr(p); print(xchr[get_byte]);
+ end;
+print_ln('''')
+
+@ The conversion factor |conv| is figured as follows: There are exactly
+|n/d| \.{DVI} units per decimicron, and 254000 decimicrons per inch,
+and |resolution| pixels per inch. Then we have to adjust this
+by the stated amount of magnification.
+
+@<Compute the conversion factor@>=
+numerator:=signed_quad; denominator:=signed_quad;
+if numerator<=0 then bad_dvi('numerator is ',numerator:1);
+@:Bad DVI file numerator is wrong}{\quad\.{numerator is wrong}@>
+if denominator<=0 then bad_dvi('denominator is ',denominator:1);
+@:Bad DVI file denominator is wrong}{\quad\.{denominator is wrong}@>
+print_ln('numerator/denominator=',numerator:1,'/',denominator:1);
+conv:=(numerator/254000.0)*(resolution/denominator);
+mag:=signed_quad;
+if new_mag>0 then mag:=new_mag
+else if mag<=0 then bad_dvi('magnification is ',mag:1);
+@:Bad DVI file magnification is wrong}{\quad\.{magnification is wrong}@>
+true_conv:=conv; conv:=true_conv*(mag/1000.0);
+print_ln('magnification=',mag:1,'; ',conv:16:8,' pixels per DVI unit')
+
+@ The code shown here uses a convention that has proved to be useful: If the
+starting page was specified as, e.g., `\.{1.*.-5}', then all page numbers in
+the file are displayed by showing the values of counts 0, 1, and~2, separated
+by dots. These numbers are displayed on the terminal when DVItoLN03 is working
+on that page.
+
+The parameter |-1| in the call of |do_page| indicates to the latter that
+this is \&{not} a recursive call of the function, and hence that it should
+initialize its data structures for a fresh page.
+
+@<Translate up to...@>=
+begin while max_pages>0 do
+ begin decr(max_pages);
+ print_ln(' '); print(cur_loc-45:1,': beginning of page ');
+ text_out:='[';
+ last_counter:=0;
+ for k:=0 to 9 do if count[k]<>0 then last_counter:=k;
+ for k:=0 to last_counter do
+ begin
+ if (k=0) or (count[k]<>0) then
+ begin
+ print(count[k]:1); text_out:=text_out+str_int(count[k])
+ end;
+ if k<last_counter then
+ begin print('.'); text_out:=text_out+'.' end
+ else print_ln(' ');
+ end;
+ monitor(text_out); {Let user know which page has started}
+ cur_loc_after_bop:=cur_loc; {For checking on blank \\{verso} pages}
+ if not do_page(-1) then bad_dvi('page ended unexpectedly');
+@:Bad DVI file page ended unexpectedly}{\quad\.{page ended unexpectedly}@>
+ incr(pages_printed);
+ repeat k:=get_byte;
+ if (k>=fnt_def1)and(k<fnt_def1+4) then
+ begin p:=first_par(k); define_font(p); k:=nop;
+ end;
+ until k<>nop;
+ write_ln(term_out,']'); incr(term_offset); {Let user know page has finished}
+ if k=post then
+ begin in_postamble:=true; goto done;
+ end;
+ if k<>bop then bad_dvi('byte ',cur_loc-1:1,' is not bop');
+@:Bad DVI file byte n is not bop}{\quad\.{byte $n$ is not }\\{bop}@>
+ @<Pass a |bop|...@>;
+ end;
+done: @<Conditionally eject last page@>
+end
+
+@ A string variable |text_out| is provided to hold the
+characters of a page number. We also use |last_counter| to indicate the
+last significant item in the |count| array when displaying the page number.
+
+@<Globals...@>=
+ @!text_out : file_spec;
+ @!last_counter : 0..9;
+
+@ No output for the terminal occurs before the pages are processed except
+for error and font load messages, all of which end with a newline. Therefore,
+we are quite safe in resetting |term_offset| during the initialisation phase.
+
+@<Set initial...@>=
+ term_offset:=0;
+
+@* System-dependent changes.
+Here are the remaining changes to the program
+that are necessary to make \.{DVItoLN03} work on Vax/VMS.
+@^system dependencies@>
+
+We define here various variables required by the VAX.
+
+\yskip\hang |history| is used to record whether any warning or error
+messages (including fatal errors) have been reported.
+
+\yskip\hang |type_file| and |ln3_file| are |file| variables used for writing
+the log and
+output files, respectively. Advantage is taken of VAX-\PASCAL's |varying|
+arrays to hold variable length strings: |file_name| is used generally for
+names of files, whilst |def_file_name| initially holds the specification of
+the \.{.dvi} file being processed, from which the name is later extracted for
+use in forming the names of generated files.
+
+The remaining variables are used during the parsing of the file
+specification.
+
+@<Glob...@>==
+@!history: exit_status;
+@!type_file: text;
+@!ln3_file: text;
+@!file_name,@!actual_file_spec,@!log_file_name,
+ @!output_file_name:file_spec;
+@!file_message:file_spec;
+@!cmd_j,@!cmd_k:integer;
+@!ask : boolean;
+
+@ Here is the enumeration type used for |history|.
+
+@<Types...@>==
+@!exit_status = (@!spotless,@!warning_given,@!error_given,@!fatal_error);
+@ We now do all the VMS specific things to open the files required, etc. The
+\.{DVIfile} is opened with a fixed block length, and with \.{direct} access
+method, to permit |random_reading|. A |user_action| procedure is called, to
+perform the actual opening of the file; this gives us access to the various
+VAX data structures (|FAB|,|RAB| and |XAB|) and thus we are able to determine
+the actual length of the file.
+
+The |output| file (directed to the terminal) is opened without
+|carriage_control|, in order that |write_ln| may be used to ensure that
+each partial line of output is displayed on the screen.
+
+@<Preset init...@>=
+open(output,'SYS$OUTPUT',@=carriage_control:=none@>,VAX_continue);
+history := spotless; { We haven't had any errors (yet!) }
+@<Get name of \.{DVI} file from command-interpreter, and open it@>@;
+@<Extract just the file name from the specification of the \.{DVI} file@>@;
+@<Extract the |log_file_name| from the \.{/LOG} qualifier@>@;
+@<Create and open the \.{TYP} log file@>@;
+@<Extract the \TeX\ Font Metric directory from the qualifiers@>;
+@<Extract the font directories from the qualifiers@>@;
+@<Extract the virtual font directory from the qualifiers@>@;
+@<Extract the |output_file_name| from the \.{/OUTPUT} qualifier@>@;
+@<Create and open the \.{LN3} output file@>@;
+
+@ When we parse the qualifiers pertaining to the physical font directories,
+we use the variable length strings |tex_pxl_font| and |tex_pk_font| to hold
+the directory specifications derived from the command line qualifiers
+\.{/PXL\_FONT\_DIRECTORY} and \.{/PK\_FONT\_DIRECTORY}, respectively. Iff,
+after applying logical name translation (if necessary), a file directory
+specification is found to end in the sequence `\.{.]}', then a rooted file
+directory structure will be assumed; this is recorded in the variables
+|pk_rooted| and |pxl_rooted|.
+
+There is no such complication for the \.{/TFM\_DIRECTORY} qualifier; its
+value is merely copied to |tfm_directory|.
+
+@<Glob...@>=
+@!tex_pxl_font,@!tex_pk_font,@!tfm_directory:file_spec;
+@!pxl_rooted,@!pk_rooted:boolean;
+
+@ Originally, this program had the location of the \TeX\ Font Metrics files
+(\.{.TFM}) `hard-wired' into it, just as the VMS implementation of \TeX\
+itself did, through the logical name \.{TEX\$FONTS}. \TeX\ has since been
+modified so that such information is communicated to the program through a
+command-line qualifier, and this program too now makes use of the same
+mechanism.
+
+This permits two things:
+
+\yskip\hang$\bullet$ The site manager can chose whether to use logical names
+of the form \.{TEX\UL FONTS} or \.{TEX\$FONTS} ({\sl Digital\/} recommends that
+customers should \&{not} define logical names containg the `\.\$' character,
+since the logicals which they themselves define \&{always} contain this
+character, and may at some future date conflict with customer-defined
+logicals).
+
+\yskip\hang$\bullet$ Individual users may define their own logical names
+that provide a search-list for a number of directories; this can prove
+useful whilst testing a new font that should not be installed for general
+access.
+
+@<Extract the \TeX\ Font Metric directory from the qualifiers@>=
+if odd(VAX_cli_present('TFM_DIRECTORY')) then
+ k:=VAX_cli_get_value('TFM_DIRECTORY',tfm_directory)
+else
+ tfm_directory:=''
+
+@ At this point we ``read'' the font directory specifications passed as the
+values of the qualifiers \.{/PXL\_FONT\_DIRECTORY} and
+\.{/PK\_FONT\_DIRECTORY}. At least one of these must be provided with a
+value. The specifications are transferred to the variables |tex_pxl_font| and
+|tex_pk_font| respectively, and logical name translation is applied. If the
+resultant string doesn't end with a `\.]', an error is signalled. If the
+character \&{preceding} this bracket is `\..', the final `\.]' is discarded.
+
+@<Extract the font directories from the qualifiers@>==
+tex_pk_font:=''; tex_pxl_font:='';
+ask:=odd(VAX_cli_present('PK_FONT_DIRECTORY'));
+if ask then
+begin
+ VAX_cli_get_value('PK_FONT_DIRECTORY',tex_pk_font);
+ Translate(tex_pk_font,file_name);
+ if file_name[file_name.length] <> ']' then
+ abort('Bad /PK_FONT_DIRECTORY qualifier; doesn''t end with a `]''');
+@:fatal error Bad pk_font_directory}{\quad\.{Bad /PK_FONT_DIRECTORY qualifier}@>
+ pk_rooted := file_name[file_name.length-1] = '.';
+end;
+if odd(VAX_cli_present('PXL_FONT_DIRECTORY')) then
+begin
+ VAX_cli_get_value('PXL_FONT_DIRECTORY',tex_pxl_font);
+ Translate(tex_pxl_font,file_name);
+ if file_name[file_name.length] <> ']' then
+ abort('Bad /PXL_FONT_DIRECTORY qualifier; doesn''t end with a `]''');
+@:fatal error Bad pxl_font_directory}{\quad\.{Bad /PXL_FONT_DIRECTORY qualifier}@>
+ pxl_rooted := file_name[file_name.length-1] = '.';
+ ask:=true;
+end;
+if not ask then abort('Where are the font directories? (/PK_FONT_DIRECTORY, etc)');
+@:fatal error Where are the font directories}{\quad\.{Where are the font directories?}@>
+
+@ Similarly, we determine the directory in which virtual font metrics are to
+be found; if the qualifier \.{/VIRTUAL\UL DIRECTORY} is negated, then
+virtual font support is explicitly suppressed.
+
+@<Extract the virtual font directory from the qualifiers@>==
+tex_virtual:='';
+i := VAX_cli_present('VIRTUAL_DIRECTORY');
+no_virt_support := i = VAX_cli_negated;
+if odd(i) then
+ VAX_cli_get_value('VIRTUAL_DIRECTORY',tex_virtual);
+
+@ The variable length string |tex_virtual| receives this definition. If
+\.{/NOVIRTUAL\UL DIRECTORY} has been specified, this is recorded in
+|no_virt_support|.
+
+@<Glob...@>=
+@!tex_virtual:file_spec;
+@!no_virt_support:boolean;
+
+@ We now ask the Vax/VMS command-line interpreter to give us the file
+specification furnished by the user to the command which invokes DVItoLN03.
+The file is opened \.{readonly} to preclude any possibility of corrupting or
+deleting it, and the \.{user\_action} paramter of the VAX-\PASCAL\ |open|
+procedure is used, so that we can determine the full file specification and
+length of the file, which is also opened for random (\.{direct}) access.
+
+We can't use |abort| for the fatal error reports, because the log file
+hasn't yet been opened, so we define this instead:
+
+@d bomb_out(#)==begin write_ln(output,crlf,'Fatal error: ',#,crlf); jump_out end
+
+@<Get name of \.{DVI} file from command-interpreter, and open it@>=
+def_file_name:='';
+ask:=odd(VAX_cli_get_value('FILESPEC',def_file_name));
+if not ask then bomb_out('No file name provided');
+@.No file name provided@>
+@:fatal error no file name provided}{\quad\.{No file name provided}@>
+open(dvi_file,def_file_name,@=readonly@>,@=access_method:=direct@>,
+ @=user_action@>:=file_open,@=default@>:='.DVI;0',VAX_continue);
+ask:=status(dvi_file)<>0; dvi_size:=file_len;
+if ask then bomb_out('Couldn''t open ',def_file_name);
+@:fatal error couldn\'t open DVI}{\quad\.{Couldn't open .DVI file}@>
+actual_file_spec:=def_file_name;
+
+@ The user has the option to specify an explicit file name on the \.{/LOG}
+qualifier. If none is specified, or the qualifier is absent, the log file
+will be created in the current directory, with the same name as the input
+file and a file extension of `\.{.TYP}'. These are also the defaults used
+if the relevant portion of the file specification is not given with the
+\.{/LOG} qualifier.
+
+@<Extract the |log_file_name| from the \.{/LOG} qualifier@>=
+log_file_name:=''; {Null name specified in case defaults required}
+if odd(VAX_cli_present('LOG')) then
+ VAX_cli_get_value('LOG',log_file_name);
+
+@ After we've successfully opened the \.{DVI} file (and are thus assured that
+it exists), we strip off any node, device or directory specification from the
+front of the string, and also remove any trailing file type or version number
+specification. This makes use of the VAX-\PASCAL\ |substr| function, but
+could readily be recoded into standard \PASCAL.
+
+@<Extract just the file name from the specification of the \.{DVI} file@>=
+cmd_j:=1; {Strip off any leading node, device or directory name}
+for cmd_k:=1 to def_file_name.length do
+ if (def_file_name[cmd_k]=']')
+ or (def_file_name[cmd_k]=':')
+ or (def_file_name[cmd_k]='>')
+ then cmd_j:=cmd_k+1;
+if cmd_j<=def_file_name.length then
+ def_file_name:=substr(def_file_name,cmd_j,def_file_name.length-cmd_j+1);@/
+cmd_j:=0; {and then strip off any trailing file type or version indication}
+for cmd_k:=1 to def_file_name.length do
+ if (cmd_j=0) and @/
+ ((def_file_name[cmd_k]='.') or (def_file_name[cmd_k]=';')) then
+ cmd_j:=cmd_k;
+if cmd_j=0 then cmd_j:=def_file_name.length+1;
+def_file_name:=substr(def_file_name,1,cmd_j-1);
+
+@ We now |open| the \.{TYP} file in the current directory, to act as a log
+file for this run of DVItoLN03. The file is opened with |disposition:=save|
+so that it will still `exist' even in the event of a crash; this means that the
+user can interrupt the program (with Ctrl-Y) and be assured that the only
+file that will be retained is the log.
+
+@<Create and open the \.{TYP} log file@>=
+file_name:=def_file_name+'.TYP';
+open(type_file,log_file_name,@=new@>,@=32767@>,@=disposition:=save@>,
+ @=default@>:=file_name,VAX_continue);
+ask:=status(type_file)>0;
+if ask then bomb_out('Couldn''t create ',file_name);
+@:fatal error couldn\'t create TYP}{\quad\.{Couldn't create .TYP file}@>
+rewrite(type_file);
+
+@ A particularly useful qualifier for those with limited disk quota is
+\.{/OUTPUT}, which permits a user to specify a different output file
+specification from the default, which is to open the output file in the
+current directory with a name taken from the input (\.{.DVI}) file, and file
+extension `\.{.LN3}'. Using this qualifier permits a user to divert the
+output to a scratch disk.
+
+@<Extract the |output_file_name| from the \.{/OUTPUT} qualifier@>=
+output_file_name := ''; {Prepare to use the default name}
+if odd(VAX_cli_present('OUTPUT')) then
+ VAX_cli_get_value('OUTPUT',output_file_name);
+
+@ Finally, we create and |open| the \.{LN3} file. Again this is opened with
+|disposition:=delete|.
+
+@<Create and open the \.{LN3} output file@>=
+file_name := def_file_name+'.LN3';
+open(ln3_file,output_file_name,@=new@>,@=256@>,@=disposition@>:=@=delete@>,
+ @=carriage_control@>:=@=none@>,
+ @=default@>:=file_name,VAX_continue);
+ask:=status(ln3_file)>0;
+if ask then begin
+ abort('Couldn''t create ',file_name);
+@:fatal error couldn\'t create LN3 file}{\quad\.{Couldn't create .LN3 file}@>
+ goto final_end
+end;
+rewrite(ln3_file);
+
+@ Whenever a binary file is opened, the optional |user_action| parameter is
+provided to the call of the VAX-\PASCAL\ |open| procedure; this therefore
+invokes the procedure |file_open| (in the next section) which is therefore
+able to determine the full specification of the file opened, and also its
+exact length; the former is placed into |def_file_name|, and the latter in
+|file_len|.
+
+The following definitions permit more \PASCAL-like references to the VAX/RMS
+data structures within |file_open|
+
+@d VAX_FAB_type == @=fab$type@>
+@d VAX_RAB_type == @=rab$type@>
+@d VAX_NAM_type == @=nam$type@>
+@d VAX_XAB_type == @=xab$type@>
+@d VAX_RMS_open == @=$OPEN@>
+@d VAX_RMS_connect == @=$CONNECT@>
+@d VAX_fab_to_nam == @=fab$l_nam@> {Pointer in FAB to NAM block}
+@d VAX_nam_length == @=nam$b_rsl@> {Length of resultant file name}
+@d VAX_nam_address == @=nam$l_rsa@> {and its whereabouts}
+@d VAX_fab_to_xab == @=fab$l_xab@> {Pointer in FAB to first XAB}
+@d VAX_xab_code == @=xab$b_cod@> {Byte in XAB which identifies its type}
+@d VAX_xab_fhc == @=xab$c_fhc@> {XAB contains file header characteristics}
+@d VAX_xab_next == @=xab$l_nxt@> {Pointer to another XAB}
+@d VAX_end_block == @=xab$l_ebk@> {Number of file block containing EOF}
+@d VAX_first_free == @=xab$w_ffb@> {First free byte in last block}
+
+@<Glob...@>=
+@!def_file_name : file_spec;
+@!file_len : integer;
+
+@ Here is the procedure |file_open|, which determines the actual length of
+the file being opened. It also extracts the full file specification of the
+\.{DVI} which it opens, and reports this back in |def_file_name|.
+
+Vax/VMS uses RMS (Record Management Services) to handle file operations, and
+this utilizes various structures, in particular, the FAB (File Access Block)
+and the RAB (Record Access Block). There are also a number of different
+XABs (eXtension Access Block), one of which contains the required
+information relating to the size of the file.
+
+A |user_action| procedure such as this is invoked by the VAX-\PASCAL\ |open|
+procedure after it has set up the FAB and RAB structures. The user is
+therefore able at that time to change these structures to alter the processing
+algorithms used by RMS. The file has \&{not}, however, been opened at that
+time; it is necessary to call the RMS \.{\$OPEN} service. Once the RAB has
+been completed to the user's satisfaction, the \.{\$CONNECT} service is called
+to associate the file variable with the records of the file.
+
+Due to the nonsensical manner in which the |FAB|, etc., are declared in
+\.{SYS\$LIBRARY:STARLET.PAS}, wherein the pointers to |XAB|s are declared
+to be of type |unsigned|, it is necessary for us to use type casts
+for assignments and usage as a pointer!
+
+@<Procedures for init...@>=
+function file_open(var @!fab:VAX_FAB_type; var @!rab:VAX_RAB_type;
+ var @!f_spec:byte_file): integer;
+type @!xab_ptr = ^VAX_XAB_type;
+ @!nam_ptr = ^VAX_NAM_type;
+ @!char_ptr = ^char;
+var @!status:integer;@/
+ @!nam : nam_ptr;
+ @!xab : xab_ptr;
+ @!actual_length : integer;
+ @!next : char_ptr;
+ @!i : integer;
+begin file_len:=-1; {In case we can't determine actual file size}
+ status:=VAX_RMS_open(fab); {Fill in the FAB and RAB}
+ if odd(status) then
+ begin status:=VAX_RMS_connect(rab); {Link the RAB to RMS}
+ if odd(status) then
+ begin
+ nam:=fab.VAX_fab_to_nam::nam_ptr;
+ if nam<>nil then
+ begin
+ actual_length := nam^.VAX_nam_length;
+ def_file_name := ''; {Reset to empty}
+ next:=nam^.VAX_nam_address::char_ptr;
+ for i:=1 to actual_length do
+ begin
+ def_file_name := def_file_name + next^;
+ next:=(next::integer + 1)::char_ptr;
+ end;
+ end;
+ xab:=fab.VAX_fab_to_xab::xab_ptr;
+ {Find the File Header Characteristics}
+ while (xab<>nil) and (xab^.VAX_xab_code<>VAX_xab_fhc) do
+ xab:=xab^.VAX_xab_next::xab_ptr;
+ if xab<>nil then
+ with xab^ do
+ file_len:=int((VAX_end_block-1)*VAX_block_length+VAX_first_free);
+ end;
+ end;
+ file_open:=status; {Return success or failure}
+end; {|file_open|}
+
+@ This function provides us with logical name translation. It utilizes the
+\.{SYS\$TRNLNM} system service in preference to the obsolete \.{SYS\$TRNLOG}.
+
+On entry, any terminal `\.:' on the string |log_name| is discarded before
+attempting logical name translation. If the latter succeeds, the translation
+is written back to |equivalence_string| and the function returns |true|; if
+translation fails, the original |log_name| is returned in |equivalence_string| and
+|false| returned.
+
+It is necessary to provide the local variable |copy_name| during the
+translation process, because VAX-\PASCAL\ does not permit the address of a
+|var| parameter to be taken, so we cannot use |equivalence_string| to receive
+the successive translations, and yet the address of the string must be passed
+to the system service as the buffer to receive the translated logical name.
+Similarly, we cannot use |log_name|, since that will be a local copy, so that
+|string_size| will be that of the original logical name.
+
+The next macro is used to hide the VAX-\PASCAL\ conformant schema from W{\mc
+EAVE}, and thus permit more meaningful formatting.
+
+@d VAX_conformant_schema(#)==VAX_volatile varying [#] of char
+@#
+@d VAX_trnlnm == @=$TRNLNM@>
+@d VAX_lnm_case_blind==@= lnm$m_case_blind@>
+
+@<Procedures for initialization@>==
+function Translate(log_name : VAX_conformant_schema(string_size);
+ var equivalence_string : VAX_conformant_schema(buf_size) ) : boolean;
+ var @!i, @!status : integer;
+ @!copy_name : VAX_volatile file_spec;
+ @!return_length : VAX_volatile integer;
+ @!attributes : unsigned;
+ @!item_list : VAX_volatile array [0..1] of VMS_item_list;
+begin
+ equivalence_string := log_name; {In case translation fails}
+ copy_name := log_name;
+ if copy_name[copy_name.length] = ':' then
+ decr(copy_name.length);
+ attributes := VAX_lnm_case_blind;
+ return_length := 0;
+ with item_list[0] do
+ begin
+ buffer_length := buf_size;
+ item_code := @=LNM$_STRING@>;
+ buffer_addr := @=iaddress@>(copy_name.body);
+ ret_len_addr := @=iaddress@>(return_length);
+ end;
+ item_list[1].next_item := 0;
+ status := VAX_trnlnm(attributes,'LNM$DCL_LOGICAL',copy_name,,item_list);
+ if not odd(status) then
+ Translate := false
+ else
+ begin
+ copy_name.length := return_length;
+ return_length := 0;
+ while odd(VAX_trnlnm(attributes,'LNM$DCL_LOGICAL',copy_name,,item_list)) do
+ begin
+ copy_name.length := return_length;
+ return_length := 0;
+ end;
+ Translate := true;
+ equivalence_string := copy_name;
+ end;
+end;
+
+@ Here are the new types introduced within that function. Many Vax/VMS system
+services make use of an |item_list| to pass information in and out. An
+|item_list| consists of a number of |item_list| elements, with each element
+containing the following fields:
+
+\centerline{\vtop{\offinterlineskip\hrule
+ \halign{\vrule#&\ \strut#\hfil\ &\ #\hfil\ &\ #\hfil\ &\vrule#\cr
+ height2pt&\omit&\omit&\omit&\cr
+ &\hfil Name & \hfil Type & \hfil Usage&\cr
+ height2pt&\omit&\omit&\omit&\cr
+ \noalign{\hrule}
+ height2pt&\omit&\omit&\omit&\cr
+ &|buffer_length| & 16-bit word & Size of buffer&\cr
+ &|item_code| & unsigned 16-bit word & Code for desired operation&\cr
+ &|buffer_address| & Pointer to char & Address of buffer&\cr
+ &|ret_len_addr| & Pointer to integer & To receive length of
+ translation&\cr
+ height2pt&\omit&\omit&\omit&\cr}
+ \hrule
+}}\yskip
+
+\noindent This structure is overlaid with a single 32-bit integer whose use is
+solely to hold the value zero indicating the end of the list.
+
+@<Types in the...@>==
+ @!VMS_item_list =
+ packed record
+ case boolean of
+ true: (
+ @!buffer_length : sixteen_bits;@/
+ @!item_code : sixteen_bits;@/
+ @!buffer_addr : integer;@/
+ @!ret_len_addr : integer);
+ false: (
+ @!next_item : integer)
+ end;
+
+@* Index.
+Pointers to error messages appear here together with the section numbers
+where each ident\-i\-fier is used.
diff --git a/dviware/ln03/rmcs/ginotosix.cld b/dviware/ln03/rmcs/ginotosix.cld
new file mode 100644
index 0000000000..a68e935531
--- /dev/null
+++ b/dviware/ln03/rmcs/ginotosix.cld
@@ -0,0 +1,31 @@
+
+ define type SIZE
+ keyword WIDTH,
+ value(type=$number, default=0),
+ nonnegatable ,
+ default
+ keyword HEIGHT,
+ value(type=$number, default=0),
+ nonnegatable,
+ default
+
+ define verb GINOTOSIX
+ image TEX$EXE:GINOTOSIX.EXE
+ parameter P1,
+ label=INPUT_FILESPEC,
+ prompt="File",
+ value(type=$file, required)
+ qualifier SIZE,
+ value(list, type=SIZE),
+ nonnegatable,
+ default
+ qualifier SCALE,
+ value(default=0)
+ qualifier SEGMENT,
+ value(type=$number, default=0)
+ nonnegatable
+ qualifier OUTPUT,
+ value(type=$file),
+ nonnegatable
+ qualifier FORMFEED
+ negatable
diff --git a/dviware/ln03/rmcs/ginotosix.for b/dviware/ln03/rmcs/ginotosix.for
new file mode 100644
index 0000000000..a232e5e4e0
--- /dev/null
+++ b/dviware/ln03/rmcs/ginotosix.for
@@ -0,0 +1,159 @@
+ IMPLICIT NONE
+C
+C PROGRAM DESCRIPTION:
+C
+C Converts a GINO SAVDRA file into a sixel file suitable for importing
+C into TeX via the /special{SX filename} command
+C
+C AUTHORS:
+C
+C Sqn Ldr J P Baggott MBE MA CEng MIEE RAF
+C
+C CREATION DATE: 1 Dec 88
+C
+C
+C C H A N G E L O G
+C
+C Date | Name | Description
+C ----------------+-------+-----------------------------------------------------
+C
+C
+C
+ CHARACTER*4096 LINE !Line buffer
+ INTEGER*4 COUNT !Number of chars in line
+ INTEGER*4 START !Start of outpur line in buffer
+ INTEGER*4 ILLEGAL !Position of illegal sequence in buffer
+ INTEGER*4 STATE !Window state retuned by WINENQ
+ INTEGER*4 SEGMENT !Segment number in saved drawing
+ REAL*4 SAVEDWINDOW(4) !Window bounds of saved drawing
+ REAL*4 WIDTH !Desired width
+ REAL*4 HEIGHT !Desired height
+ REAL*4 SCALE !Desired scale factor
+ CHARACTER*255 INPUT !Name of input file
+ CHARACTER*255 OUTPUT !Name of output file
+ LOGICAL FORMFEED !Do we want a formfeed at the end of the
+ !file?
+
+ COMMON/GINOTOSIX/INPUT,OUTPUT,WIDTH,HEIGHT,SCALE,SEGMENT,FORMFEED
+
+C Get the parameters from the command line
+
+ CALL CLI
+
+ CALL GINO
+
+C First use the dummy driver to find the window size of the saved drawing
+
+ CALL DUMMY
+
+ OPEN (UNIT=3,
+ 1 FILE = INPUT,
+ 1 STATUS = 'OLD',
+ 1 READONLY)
+
+ CALL WINDOW(2)
+
+ CALL GETDRA(3,SEGMENT,3,1)
+ CALL WINENQ(STATE,1,4,SAVEDWINDOW)
+
+ CALL DEVEND
+
+C Now open the LN03 driver and set up the transformations to rotate the
+C picture through 90 degrees and scale it to the user's desired size
+
+ IF (HEIGHT.EQ.0.0) HEIGHT = SAVEDWINDOW(4)-SAVEDWINDOW(3)
+ IF (WIDTH.EQ.0.0) WIDTH = SAVEDWINDOW(2)-SAVEDWINDOW(1)
+ IF (SCALE.EQ.0.0) THEN
+ SCALE = WIDTH/(SAVEDWINDOW(2)-SAVEDWINDOW(1))
+ SCALE = MIN(SCALE,HEIGHT/(SAVEDWINDOW(4)-SAVEDWINDOW(3)))
+ END IF
+
+ OPEN (UNIT=1,
+ 1 FILE = 'GINOTOSIX.TMP',
+ 1 RECL = 4096,
+ 1 STATUS = 'NEW')
+
+ OPEN (UNIT=3,
+ 1 FILE = INPUT,
+ 1 STATUS = 'OLD',
+ 1 READONLY)
+
+ CALL LN03
+
+ CALL LINWID(0.2)
+ CALL WINDO2(0.0,HEIGHT,0.0,WIDTH)
+ CALL CHASWI(1)
+ CALL SCALE2(SCALE,SCALE)
+ CALL ROTAT2(90.0)
+ CALL SHIFT2(-SAVEDWINDOW(1),-SAVEDWINDOW(4))
+ CALL GETPIC(3,SEGMENT)
+ CALL DEVEND
+
+ CLOSE(3)
+
+C Next, open the sixel file produced by GINO, and prepare to filter it to
+C remove <ESC>c (printer reset), split lines longer than 256 bytes, and
+C remove the FORTRAN carriage controls
+
+ OPEN (UNIT=1,
+ 1 FILE = 'GINOTOSIX.TMP',
+ 1 STATUS = 'OLD',
+ 1 DISPOSE = 'DELETE')
+
+ OPEN (UNIT=2,
+ 1 FILE = OUTPUT,
+ 1 ACCESS = 'SEQUENTIAL',
+ 1 CARRIAGECONTROL = 'NONE',
+ 1 FORM = 'FORMATTED',
+ 1 RECORDTYPE = 'VARIABLE',
+ 1 RECL = 256,
+ 1 STATUS = 'NEW')
+
+C Repeat until end-of-file
+
+ DO WHILE (.TRUE.)
+
+ READ (1,999,END=500) COUNT,LINE(1:COUNT)
+
+C Remove all occurences of <ESC>c
+
+ ILLEGAL = INDEX(LINE(1:COUNT),CHAR(27)//'c')
+
+ DO WHILE (ILLEGAL.GT.0)
+ IF (ILLEGAL.EQ.COUNT-1) THEN
+ IF (COUNT.GT.2) LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)
+ ELSE
+ LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)//LINE(ILLEGAL+2:COUNT)
+ END IF
+ COUNT = COUNT-2
+ IF (COUNT.GT.2) THEN
+ ILLEGAL = INDEX(CHAR(27)//'c',LINE(1:COUNT))
+ ELSE
+ ILLEGAL = 0
+ END IF
+ END DO
+
+C Split lines longer than 256 bytes
+
+ START=1
+
+ DO WHILE (START.LE.COUNT.AND.COUNT.GT.0)
+ WRITE(2,998)LINE(START:MIN(START+255,COUNT))
+ START = START+256
+ END DO
+
+ END DO
+
+500 IF (FORMFEED) WRITE(2,997) '0C'X
+
+C Close the files and exit
+
+ CLOSE(1)
+ CLOSE(2)
+
+ CALL GINEND
+
+997 FORMAT(A1)
+998 FORMAT(A)
+999 FORMAT(X,Q,A)
+ END
diff --git a/dviware/ln03/rmcs/ginotosix.hlp b/dviware/ln03/rmcs/ginotosix.hlp
new file mode 100644
index 0000000000..b43cca9140
--- /dev/null
+++ b/dviware/ln03/rmcs/ginotosix.hlp
@@ -0,0 +1,173 @@
+1 GINOTOSIX
+
+Take a GINO psuedo-code file (produced using the SAVDRA driver) and create
+a sixel file in a format suitable for import into a LaTeX .LN3 file. The
+default action is to produce an image the same size and scale as the saved
+picture, using segment 0. The output filename is made from the supplied
+file-spec, with a type of .SIX. See the GINO documentation for more
+information on SAVDRA and picture segments, and the LaTeX user guides for
+more information on LaTeX.
+
+Format:
+
+ GINOTOSIX file-spec
+
+To import the image into a LaTeX document, the \documentstyle option
+"graphics" should be used, and the command
+
+ \gino(width,height){file-spec}
+
+inserted at the point where the image is wanted. `width' and `height'
+MUST be specified explicitly as lengths, e.g.
+
+ \gino(150mm,100mm){FRED.SIX}
+
+This program was written by Sqn Ldr Jon Baggott (2 MESE). As he has left
+the college, any problems should be directed towards Brian Hamilton Kelly
+(SEES).
+
+N.B. This command is NOT available by default; see Limitations below.
+
+2 Parameters
+
+
+file-spec
+
+ Specifies the name of the SAVDRA file. The default file type is .PIC
+ Wildcard characters are not allowed in the file specification.
+
+
+2 Command_Qualifiers
+
+
+/SIZE
+
+ /SIZE=(option[,...])
+
+ Specifies the size (in millimetres) of the sixel image. If the qualifier
+ is not used, the default action is to copy the window size (or the paper
+ size if windowing is not in effect) of the saved picture segment.
+
+ WIDTH:n specifies the width in mm of the sixel image.
+ Defaults to the saved width.
+
+ HEIGHT:n specifies the height in mm of the sixel image.
+ Defaults to the saved height.
+
+ If only one option is specified, the parentheses may be omitted.
+
+ NOTE: if this qualifier is used in conjunction with the /SCALE
+ qualifier, the action is first to scale, then window the
+ image. If the /SCALE qualifier is not given, the image is
+ scaled to fit the size specified.
+
+
+/FORMFEED
+
+ /FORMFEED
+ /NOFORMFEED (default)
+
+ Instructs GINOTOSIX to append a formfeed to the end of the sixel file.
+ This allows the output file to be queued direct to a LN03 laser printer
+ for previewing. A formfeed must NOT be included if the file is to be
+ included in a LaTeX document.
+
+
+/SCALE
+
+ /SCALE=x
+
+ Scale the stored image by a factor of x. The default scale factor is 1.0.
+
+ NOTE: if this qualifier is used in conjunction with the /SIZE
+ qualifier, the action is to first scale, then window the
+ image. If the /SIZE qualifier is not given, the stored size is
+ scaled to produce the image size.
+
+
+/SEGMENT
+
+ /SEGMENT=n
+
+ Specifies the picture segment number in the SAVDRA file to use for
+ producing the image. The default value is 0. is not specified, the
+ maximum record length specified for the input file is used.
+
+
+/OUTPUT
+
+ /OUTPUT=output-file-spec
+
+ Controls where the sixel file is written. The specification of
+ an output file is determined as follows:
+
+ NODE - if the node is not specified, the current node is
+ used.
+
+ DEVICE - if the device is not specified, the current default
+ device is used.
+
+ DIRECTORY - if the directory is not specified, the current
+ default directory is used.
+
+ NAME - if the file name is not specified or is an asterisk
+ wildcard, the name of the current input file is
+ used.
+
+ TYPE - if the file type is not specified, or is an asterisk
+ wildcard, the type of the file is set to .SIX
+
+ VERSION - if the file version is not specified or is an
+ asterisk wildcard, a version number of 0 is used. If
+ a file with the same name and version number exists,
+ GINOTOSIX will issue a (FORTRAN!) error message.
+
+
+ NOTE: Wildcard characters are not permitted in the directory
+ specification.
+
+
+2 Limitations
+
+GINOTOSIX only becomes available by defining it as a DCL command.
+To do this, you MUST execute the DCL command
+
+ SET COMMAND TEX$EXE:GINOTOSIX
+
+(just once) some time before issuing the GINOtosix command. If you use
+this facility regularly, you may care to put the SET COMMAND in your
+LOGIN.COM file (somewhere after invoking @SYS$COM:LATEX).
+
+
+GINOTOSIX was written in VAX FORTRAN and uses GINO routines. Some errors
+are therefore trapped by FORTRAN or by GINO, rather than being handled
+correctly.
+
+A scratch file is written and deleted in the default directory using the
+name "GINOTOSIX.TMP". Write access to the current default directory is
+therefore required.
+
+
+2 Examples
+
+
+1. $ GINOTOSIX FRED
+
+GINOTOSIX will read the file FRED.PIC, and produce a file FRED.SIX from
+segment 0. The size of the sixel image will be the same as the saved
+picture.
+
+
+2. $ GINOTOSIX/SCALE=0.5/OUTPUT=DISK$SCRATCH:[FRED]GRAPH.INC FRED.GNO
+
+GINOTOSIX will read FRED.GNO, and produce a half-size image in
+DISK$SCRATCH:[FRED]GRAPH.INC.
+
+
+3. $ GINOTOSIX/SIZE=(WIDTH:150,HEIGHT:100) FRED/SEGMENT=1/FORMFEED
+
+GINOTOSIX will read segment 1 of FRED.PIC, and uniformly scale the image
+to fit in a box 150mm wide and 100mm high. A formfeed will be appended to
+the end of the output file (FRED.SIX).
+
+
diff --git a/dviware/ln03/rmcs/graphics.sty b/dviware/ln03/rmcs/graphics.sty
new file mode 100644
index 0000000000..8fe9618e5c
--- /dev/null
+++ b/dviware/ln03/rmcs/graphics.sty
@@ -0,0 +1,27 @@
+%-----------------------------------------------------------------------------
+% GRAPHICS.STY
+% ~~~~~~~~~~~~
+% The actual macros defined by this are called \largeVT, etc; the `240'
+% is actually part of the ``parameter template''. Dirty, but it works!!
+%
+% \gr@phins{sixel_file}{height}{width}
+%-----------------------------------------------------------------------------
+\def\gr@phins#1#2#3{{\hbox to#3{\vbox to#2{\special{ln03:sixel #1}\vfil}\hfil}}}
+
+\def\largeVT240#1{\gr@phins{#1}{3.2in}{5.33333in}}
+\def\smallVT240#1{\gr@phins{#1}{1.6in}{2.66667in}}
+\def\largeVis550#1{\gr@phins{#1}{3.90in}{5.12in}}
+\def\smallVis550#1{\gr@phins{#1}{1.95in}{2.56in}}
+\def\gino(#1,#2)#3{\gr@phins{#3}{#2\unitlength}{#1\unitlength}}
+
+%
+%-----------------------------------------------------------------------------
+% \MatlabPlot{sixel_file}
+%-----------------------------------------------------------------------------
+\def\MatlabPlot#1{\gr@phins{#1}{3.00in}{5.00in}}
+
+%
+%-----------------------------------------------------------------------------
+% \SixelPlot{sixel_file}{height}{width}
+%-----------------------------------------------------------------------------
+\def\SixelPlot#1#2#3{\gr@phins{#1}{#2}{#3}}
diff --git a/dviware/ln03/rmcs/local.mf b/dviware/ln03/rmcs/local.mf
new file mode 100644
index 0000000000..13d3452d17
--- /dev/null
+++ b/dviware/ln03/rmcs/local.mf
@@ -0,0 +1,187 @@
+%
+%--------------------------------------------------------------------------
+% This file can be loaded after PLAIN.MF.
+% It introduces conventions that are commonly used at RMCS.
+%--------------------------------------------------------------------------
+base_version:=base_version&"/RMCS 08-AUGUST-1989";
+
+%
+%--------------------------------------------------------------------------
+% Define these for on-line graphics; necessary to set the VMS logical name
+% MF$TERM to be one of the strings "go140", "tek" or "gp" to support
+% the GraphOn, Tektronix or GraphicsPlus terminals, respectively.
+% The following values are appropriate for Tektronix 4010 etc,
+% since METAFONT doubles them before output as coordinates.
+%--------------------------------------------------------------------------
+screen_rows:=336; screen_cols:=512;
+
+
+
+%
+%--------------------------------------------------------------------------
+% Some new internal commands from TEXHAX26.88
+%
+% Submitted by Charles R. LaBrec
+% crl@maxwell.physics.purdue.edu
+%--------------------------------------------------------------------------
+newinternal blacker_min;
+def define_whole_blacker_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp+blacker);
+ if $<=blacker_min-1: $:=blacker_min; fi endfor enddef;
+def define_whole_vertical_blacker_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp+blacker);
+ if $<=blacker_min-1: $:=blacker_min _o_; fi endfor enddef;
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def declnIII = % DEC LN03 (Ricoh, write white)
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=300; % rather obvious really
+ blacker:=0.2; % make pens a bit blacker
+%blacker:=0.3; % From John Sauter TeXHAX V88 #07
+%blacker:=0.65; % he also gives this value, but bad for small fonts
+%blacker:=0.4; % This value by BHK --- how's it look?
+ blacker_min:=2; % minimum width of 2 pixels
+%fillin:=-0.2; % darken diagonals a bit
+%fillin:=-0.4; % From Stan (?) UCB - TeXHAX V87.32
+ fillin:=-0.6; % BHK is trying this huge value!
+ o_correction:=0.5; % don't overshoot as much
+enddef;
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def hpljII = % Hewlett Packard (Canon SX write white)
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=300; % rather obvious really
+ blacker:=0.2; % make pens a bit blacker
+ blacker_min:=2; % minimum width of 2 pixels
+ fillin:=-0.2; % darken diagonals a bit
+ o_correction:=0.5; % don't overshoot as much
+enddef;
+
+%
+%--------------------------------------------------------------------------
+% Epson FX-1000 dot matrix printer (240 x 216 dpi)
+% From TUGboat 1987, vol 8, no 1, pp 29--33
+%--------------------------------------------------------------------------
+mode_def epson = %
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles at all
+ pixels_per_inch:=240; % Epson high resolution
+ blacker:=0; % Epson is black enough
+ blacker_min:=2; % minimum width of 2 pixels
+ fillin:=0; % Epson fills OK
+ o_correction:=.2; % Epson overshoots too much
+ aspect_ratio:=9/10; % Epson is actually 240 x 216 dpi
+enddef;
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def ibmnom = % ibm mode: for the IBM3812 nominal
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=240;
+ blacker:=.2; % (this value is conjectural)
+ blacker_min:=1; % minimum width of 1 pixel
+ fillin:=-0.1; % (ditto)
+ o_correction:=0.6; % (ditto)
+enddef;
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def ibmulf = % ibm mode: for the IBM3812 Ulf Holleberg
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=240;
+ blacker:=.4; % (this value is conjectural)
+ fillin:=-0.2; % (ditto)
+ o_correction:=0.4; % (ditto)
+enddef;
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def ibm = % ibm mode: for the IBM3820
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=240;
+ blacker:=.78; % (this value is conjectural)
+ fillin:=0.25; % (ditto)
+ o_correction:=.5; % (ditto)
+enddef;
+
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def ibmsch = % ibm PC screen for Arbortext's PREVIEW
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=118; %
+ blacker:=0; % let it be
+ blacker_min:=1; % minimum width of 1 pixel
+ fillin:=0; % and do not compensate for diagonal fillin
+ o_correction:=.2; % but don't overshoot much
+enddef;
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def ibmvga = % ibm PC screen fonts for DVIVGA
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=110; %
+ blacker:=0.3; % blacker pens
+ blacker_min:=1; % minimum width of 1 pixel
+ fillin:=0; % and do not compensate for diagonal fillin
+ o_correction:=0.0; %
+enddef;
+
+%
+%--------------------------------------------------------------------------
+% LAseventyfive mode: for DEC LA75 printer
+%--------------------------------------------------------------------------
+%
+mode_def declalxxv =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=144; % pixels per inch
+ blacker:=0.3; % blacker pens
+ blacker_min:=1; % minimum width of 1 pixel
+ fillin:=-0.1; % compensate for light diagonals
+ o_correction:=0.0 % overshoot
+enddef;
+
+
+%
+%--------------------------------------------------------------------------
+%
+%--------------------------------------------------------------------------
+mode_def laser = % A convenient synonym for DEC LN03
+ declnIII_;
+enddef;
+
+mode_def localfont =
+ declnIII_;
+enddef;
diff --git a/dviware/ln03/rmcs/local_guides.bib b/dviware/ln03/rmcs/local_guides.bib
new file mode 100644
index 0000000000..5de407fd06
--- /dev/null
+++ b/dviware/ln03/rmcs/local_guides.bib
@@ -0,0 +1,306 @@
+%
+% BibTeX Preamble Entries
+% ~~~~~~~~~~~~~~~~~~~~~~~
+%
+% Define the various special names such as TeX, LaTeX etc
+%
+% Use \defs, so we don't need to worry about whether to use
+% \newcommand or \renewcommand.
+%
+@PREAMBLE{ "\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08emT\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} "
+ # "\def\SLiTeX{{\rm S\kern-.06em{\sc l\kern-.035emi}\kern-.06em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} "
+ # "\def\DVItoVDU{DVIto\kern-.15em VDU} "
+ # "\newfont{\mf}{logo10}\def\MF{{\mf META}\-{\mf FONT}}"
+ # "\let\METAFONT=\MF"
+ # "\def\TB{TUGboat}"
+ }
+%
+% Some useful abbreviations
+%
+@STRING{TB = "TUGboat"}
+
+%
+%
+% BibTeX Reference Entries
+% ~~~~~~~~~~~~~~~~~~~~~~~~
+%
+%
+@TECHREPORT{RMCS:dvilguide,
+ TITLE = "{DVILN03} {U}ser {G}uide",
+ AUTHOR = "Hamilton Kelly, Brian",
+ INSTITUTION = "School of Electrical Engineering \& Science",
+ ADDRESS = "Royal Military College of Science, Shrivenham, Swindon,
+ SN6~8LA",
+ YEAR = "1991",
+ MONTH = "February",
+ NOTE="(For DVILN03 Version 4.0)"
+ }
+
+@TECHREPORT{RMCS:dvitguide,
+ TITLE = "{\DVItoVDU} {U}ser {G}uide",
+ AUTHOR = "Kempson, Niel",
+ INSTITUTION = "School of Electrical Engineering \& Science",
+ ADDRESS = "Royal Military College of Science, Shrivenham,
+ Swindon, SN6~8LA",
+ YEAR = "1988",
+ MONTH = "July",
+ NOTE="(For {\DVItoVDU} Version 2.0)"
+ }
+
+@TECHREPORT{RMCS:VVcode,
+ AUTHOR = "Kempson, Niel",
+ TITLE = "{VVcode}: A new {E}ncoding {S}cheme for {D}ata {T}ransfer",
+ INSTITUTION = "School of Electrical Engineering \& Science",
+ ADDRESS = "Royal Military College of Science, Shrivenham,
+ Swindon, SN6~8LA",
+ YEAR = 1991}
+% <<optional_techreport_fields>>...
+
+@TECHREPORT{RMCS:latexguide,
+ TITLE = "{\LaTeX} {U}ser {G}uide for the {{\sl VAXen\/}} at {RMCS}",
+ AUTHOR = "Kempson, Niel and {Hamilton Kelly}, Brian",
+ INSTITUTION = "School of Electrical Engineering \& Science",
+ ADDRESS = "Royal Military College of Science, Shrivenham, Swindon,
+ SN6~8LA",
+ YEAR = "1988",
+ MONTH = "July",
+ NOTE="(Second Edition)"
+ }
+
+@TECHREPORT{RMCS:lseguide,
+ TITLE = "Using {{\sc LSEdit}} with {\LaTeX} and {\BibTeX} at {RMCS}",
+ AUTHOR = "Kempson, Niel",
+ INSTITUTION ="School of Electrical Engineering \& Science",
+ ADDRESS = "Royal Military College of Science, Shrivenham, Swindon,
+ SN6~8LA",
+ NOTE = "(Adapted from a guide produced by Lear Siegler, Inc., Grand
+ Rapids, Michigan)",
+ YEAR = "1988",
+ MONTH = "May"
+ }
+
+@MANUAL {DEC:dcl,
+ TITLE = "Guide to Using {DCL} and Command Procedures on
+ {\sl {VAX/VMS}}",
+ ORGANIZATION = "Digital Equipment Corporation",
+ NOTE = "AA-Y501A-TE",
+ ADDRESS = "Maynard, MA",
+ YEAR = "1984",
+ MONTH = "September"
+ }
+
+@MANUAL {DEC:dcl-concepts,
+ TITLE = "{\sl {VAX/VMS\/}} {DCL} Concepts Manual",
+ ORGANIZATION = "Digital Equipment Corporation",
+ NOTE = "AA-LA10A-TE",
+ ADDRESS = "Maynard, MA",
+ YEAR = "1988",
+ MONTH = "April"
+ }
+
+@MANUAL{DEC:FontFileFormat,
+ TITLE = "Font File Format User Manual",
+ ORGANIZATION = "Digital Equipment Corporation",
+ EDITION = "{Revision 0.10}",
+ MONTH = "September",
+ YEAR = "1985",
+ NOTE = "(Version 1, Variant 0)"
+ }
+
+@MANUAL{DEC:LN03,
+ TITLE = "LN03 Programmers' Reference Manual",
+ ORGANIZATION = "Digital Equipment Corporation",
+ EDITION = "second",
+ MONTH = Nov,
+ YEAR = 1985,
+ NOTE = "EK-OLN03-RM-002"
+ }
+
+@MANUAL {DEC:LSE,
+ TITLE = "Guide to {\sl {VAX}\/} Language-Sensitive Editor and
+ {\sl {VAX\/}} Source Code Analyzer",
+ ORGANIZATION = "Digital Equipment Corporation",
+ NOTE = "AI-FY24B-TK",
+ ADDRESS = "Maynard, MA",
+ YEAR = "1987",
+ MONTH = "August"
+ }
+
+@BOOK {knuth:texbook,
+ AUTHOR = "Knuth, Donald Erwin",
+ TITLE = "The {\TeX}book",
+ PUBLISHER = "Addison-Wesley",
+ YEAR = 1984,
+ MONTH = "October",
+ NOTE = "ISBN 0-201-13448-9"
+ }
+
+@BOOK {lamport:latexbook,
+ TITLE = "{\LaTeX}{\rm :} A Document Preparation System",
+ AUTHOR = "Lamport, Leslie",
+ PUBLISHER = "Addison-Wesley",
+ NOTE = "ISBN 0-201-15790-X",
+ YEAR = "1986"
+ }
+
+@BOOK {knuth:ACP1,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "The Art of Computer Programming",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = "1982",
+ VOLUME = "1 / Fundamental Algorithms",
+ EDITION = "2nd",
+ NOTE = "ISBN 0-201-03809-9"
+ }
+
+@BOOK {knuth:ACP2,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "The Art of Computer Programming",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = "1982",
+ VOLUME = "2 / Seminumerical Algorithms",
+ EDITION = "2nd",
+ NOTE = "ISBN 0-201-03822-6"
+ }
+
+@BOOK {knuth:ACP3,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "The Art of Computer Programming",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = "1982",
+ VOLUME = "3 / Sorting and Searching",
+ EDITION = "2nd",
+ NOTE = "ISBN 0-201-03803-X"
+ }
+@BOOK{knuth:CAT-A,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "Computers \& Typesetting",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = 1986,
+ VOLUME = "A --- The {\TeX}book",
+ NOTE = "ISBN 0-201-13447-0 (A uniform edition of \cite{knuth:texbook})"
+ }
+@BOOK{knuth:CAT-B,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "Computers \& Typesetting",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = 1986,
+ VOLUME = "B --- {\TeX}: The Program",
+ NOTE = "ISBN 0-201-13437-3"
+ }
+@BOOK{knuth:CAT-C,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "Computers \& Typesetting",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = 1986,
+ VOLUME = "C --- The {\MF}book",
+ NOTE = "ISBN 0-201-13445-4"
+ }
+@BOOK{knuth:CAT-D,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "Computers \& Typesetting",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = 1986,
+ VOLUME = "D --- {\MF}: The Program",
+ NOTE = "ISBN 0-201-13438-1"
+ }
+@BOOK{knuth:CAT-E,
+ AUTHOR = "Donald Erwin Knuth",
+ TITLE = "Computers \& Typesetting",
+ PUBLISHER = "Addison-Wesley Publishing Company",
+ YEAR = 1986,
+ VOLUME = "E --- Computer Modern Typefaces",
+ NOTE = "ISBN 0-201-13446-2"
+ }
+@ARTICLE{TUGboat-LN03,
+ AUTHOR = "Barbara Beeton",
+ TITLE = "Update: {\MF} {\tt mode\_def} Settings for Various {\TeX}
+ Output Devices",
+ JOURNAL = "TUGboat, the \TeX\ Users Group Newsletter",
+ YEAR = 1987,
+ VOLUME = 8,
+ NUMBER = 2,
+ PAGES = "132--3",
+ MONTH = nov,
+ NOTE = "(Values provided by Stan Osborne)"
+ }
+@ARTICLE{TUGboat-DVI,
+ AUTHOR = "Fuchs, David",
+ TITLE = "The {F}ormat of {\TeX's} {{\tt DVI}} {F}iles",
+ JOURNAL = "\TB",
+ YEAR = 1982,
+ VOLUME = 3,
+ NUMBER = 2,
+ PAGES = "14--19",
+ MONTH = oct
+ }
+@ARTICLE{TUGboat-GF,
+ AUTHOR = "{({\it Anon.})}",
+ TITLE = "Generic {F}ont {F}ile {F}ormat",
+ JOURNAL = "\TB",
+ YEAR = 1985,
+ VOLUME = 6,
+ NUMBER = 1,
+ PAGES = "8--11",
+ MONTH = mar
+ }
+@ARTICLE{TUGboat-PK,
+ AUTHOR = "Rokicki, Tomas",
+ TITLE = "Packed {({\tt PK})} {F}ont {F}ile {F}ormat",
+ JOURNAL = TB,
+ YEAR = 1985,
+ VOLUME = 6,
+ NUMBER = 3,
+ PAGES = "115--120",
+ MONTH = Nov
+ }
+@ARTICLE{TUGboat-PXL,
+ AUTHOR = "Fuchs, David",
+ TITLE = "The {F}ormat of {{\tt PXL}} {F}iles",
+ JOURNAL = TB,
+ YEAR = 1981,
+ VOLUME = 2,
+ NUMBER = 3,
+ PAGES = "8--12",
+ MONTH = nov
+ }
+@ARTICLE{TUGboat-TFM,
+ AUTHOR = "Fuchs, David",
+ TITLE = "{\TeX} {F}ont {M}etric {F}iles",
+ JOURNAL = TB,
+ YEAR = 1981,
+ VOLUME = 2,
+ NUMBER = 1,
+ PAGES = "12--16",
+ MONTH = feb
+ }
+@ARTICLE{TUGboat-VF,
+ AUTHOR = "Knuth, Donald Erwin",
+ TITLE = "Virtual {F}onts: {M}ore {F}un for {G}rand {W}izards",
+ JOURNAL = TB,
+ YEAR = 1990,
+ VOLUME = 11,
+ NUMBER = 1,
+ PAGES = "13--23",
+ MONTH = Apr
+ }
+@ARTICLE{TeX3,
+ AUTHOR = "Knuth, Donald Erwin",
+ TITLE = "The new versions of {\TeX} and {\MF}",
+ JOURNAL = TB,
+ YEAR = 1989,
+ VOLUME = 10,
+ NUMBER = 3,
+ PAGES = "325--328",
+ MONTH = Nov
+ }
+@ARTICLE{Hosek,
+ AUTHOR = "Hosek, Don",
+ TITLE = "Report from the {{\tt DVI}} {D}river {S}tandards {C}ommittee",
+ JOURNAL = TB,
+ YEAR = 1990,
+ VOLUME = 11,
+ NUMBER = 4,
+ PAGES = 570,
+ MONTH = Nov
+ }
diff --git a/dviware/ln03/rmcs/openclose.six b/dviware/ln03/rmcs/openclose.six
new file mode 100644
index 0000000000..445a805f4c
--- /dev/null
+++ b/dviware/ln03/rmcs/openclose.six
@@ -0,0 +1,103 @@
+[7 IP9;0;2q
+-~!766@~
+-~!766?~
+-~!368?K!4AcW!188?o!4GO_!19?w!13?o!5Go!19?w!33?o!5GO!25?w!70?~
+-~!368?ogca`__!14?w!112?w!61?_OGCA@!3?}C!4A{!3?{!4AC~!13?~!5?~!4?}C!3AC!3?{!4AC~!3?{!5Q[!4?}C!3AC!13?B!5Cw!3?}!3?_}!4?K!5Q_!3?AA~AA!5?{!5Q[!3?{ACWCA{!46?~
+-~!389?~!112?~!60?B!6A!3?B!5?B!3?@!4A@B!13?@!5A@!4?B!8?@!4A@B!3?@!5A!5?B!18?@!5A@!3?G!3PON!5?!5A@!5?@AA@!4?@!5A!4?B!5?B!46?~
+-~!38?}!5@}!3?o_!4O_!3?_!5O_!3?o_!4O_!13?~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!74?~!45?{A!4@E!5?@~!6?_!5O_!3?_!5O!4?_!5O_!3?
+_!4O_~!10?~??~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!34?~
+-~!38?N!5ON!3?~N!4ON!3?N!5QB!3?^!5?^!13?^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!74?~!45?FG!4OK!5?O^O!5?N!5ON!3?@!5QK!3?N!5QB!3?
+N!4OG^!10?~??^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!34?~
+-~!48?B!69?B!55?B!12?o!30?@!4A@!38?{!5?B!120?~!112?~!32?B!55?B!43?@!4A@!44?B!80?~
+-~!187?~!74?~!126?~!87?__OOGCC!9AC!3GO_!3?~!263?~
+-~!37?~!36_~!37_~!36_~!37_~!36_~!37_~!15_!111?~!80?__OGCA@!22?@AC~O_!261?~
+-~!37?^!36?^!37?^!36?^!37?~!36?^!19?_OO!3GKcuyj\NJD~ZF~!126?~!74?oGCCA@!32?~?@ACGO_!256?~
+-~!187?~!45?__OGGKEA!3@?_OwGKFB@!3?_WE~??~!30?}CGoGC}!4?!5_!5?!4_?o!3?_?!4_!6?_e!6?__}__!5?_!4?_!5?!4_?}!4?!5_!10?~!67?_WCCAA@!38?~!6?@AKO_!252?~
+-~!187?Fw!37?_OGKCA@@??__OGGCA`\E@@!6?oKB??~?~~!30?~!5?~!3?W!5c~!3?N!4O~!4?~@!4?~!4?__~__!6?^__O!4?^!4_^_!3?^!4_P~!3?^!5cF!9?~!59?__OGCAA@@!44?~!10?@EGo!249?~
+-~!188?@Fw!28?_WGCE@@??_OOGCCA@!5?{B@!7?oKB!5?~?~~!50?A!4CB!70?~!50?__OGCCAA@!53?~!14?@EGo!245?~
+-~!190?@Ew!20?oGCCB@?_OGGCAA@!10?wM@!7?_[B!8?~?~~!107?_o!17?~!38?__O!4GCAA@@!62?~!18?@EGO_!240?~
+-~!193?BKO_!10?_OGCaPOGCCA@@!16?oKB!6?_WE@!10?~?~~!106?@?~!17?~!16?!5_!4O!5GCCAA!4@!74?~!22?@AKO_!236?~
+-~!196?@EGo??_oWKJCAA@!24?}@!6?wE@!10?!3@~~@~!5@!101?CCFCC!15?~BBFFJRb!33B!9D!11H!3P!4`!45@~!27@BLP``!193@!38?~
+-~!197?_WCBBLO_!28?_[B!4?oKB!16?~~?~!126?~!7?@AKO_!55?!5@AACC!5GOO__!27?~!32?@ACGo!226?~
+-~!192?_OGCA@!6?@BKGW_!22?wF!3?oKB!19?~~?~!126?~!12?@AKo!69?!4@AAC!4GOO__!12?~!37?@EGO_!221?~
+-~!188?_OKA@!17?@ACGGO_!14?_^?_WF!22?~~?~!126?~!16?BCW_!80?!3@AC!5GO_~!42?@@ACGO_!214?~
+-~!184?_OKA@!28?@@AEGGW__!5?~WE@!24?~B?~!126?~!20?@ACGO_!86?~@!3ACCGGOO!3_!36?@ACCGOO_!206?~
+-~!181?_WE@!41?!3@B}D!4GOO__!19?~??~!126?~!25?@ACGO_!81?~!13?@@AACC!3GOO__!31?@AACCGOO_!197?~
+-~!178?_WE@!47?}@!9?!7@!4A!8C~CC~!9C!3A!114?~!31?@AACGO__!73?~!26?!4@AAC!4G!3O__!24?@!3ACCGGOO_!186?~
+-~!175?_WE@!50?~!29?~??~!126?~!39?@@ACGGOO__!63?~!42?!4@!3ACC!4G!3O!4_!15?!4@AAC!4GOO__!171?~
+-~!171?_OKB!54?~!29?~??~!126?~!49?!3@AC!5GOO__!49?~!62?!5@AA!4C!7GOO!5_!5?!5@AACC!7GOO__!151?~
+-~!168?_WE@!56?}@!29?~??~!126?~!63?!4@AA!3C!6G!5O!4_!25?~!87?!7@!4A!5C!9G!4P!3`!4aA!4C!7G!4O!7_!117?~
+-~!166?wE@!58?_^!30?~??~!126?~!87?!9@!5A!7C!4G~!8G!7O!10_!98?!11@!7A!5CDD!7H!6I!5KSS!7W!9g!9O!9_!61?~
+-~!163?oKB!61?~!31?~??~!126?~!112?~!25?!22@!14A!18C!42G!29O!34_!4`!21@!13B@@!39?~
+-~!160?_WF!64?~!28?!3G~GG~!5G!121?N!112G~!188G!36HG!38?~
+-~!158?_[B!65?oN!31?~??~!239?~!263?~
+-~!156?oM@!67?~!32?~??~!239?~!4?CA~!105?E!3@`QK!43?~??_??~!6?_OGF!3?~??_??~!3?o_!4O_!26?A@@!3`]!31?~
+-~!154?WE@!69?N!32?F??~!239?~!4?OO^OO!103?WSQP!3O!43?FWE@EWF!3?[A@!7?FWE@EWF!3?^!5?^!26?G!5ON!31?~
+-~!262?~!239?~!263?~
+-~!262?~!105?_OGCGO_!127?~!263?~
+-~!256?!6_~!5_!100?NO_?_ON!14?!113_~!225_!38?~
+-~!262?~!108?@!17?~FXbDHIQQacCC!4G!5O__!89?~!263?~
+-~!262?~!126?~??@EW_!4?!4@ACGGOO__?!4@!3ACC!7GOO__!69?~!263?~
+-~!262?~!126?~!5?@EW_!13?@AACCGGO_!12?@@!3ACC!4GO__!55?~!263?~
+-~!262?~!126?~!8?@EW_!19?@@AACCGOO_!16?@@AACCGGOO_!44?~!263?~
+-~!262?~!126?~!12?BCW_!25?!3@AACGGO_!17?@AACCGO_!36?~!263?~
+-~!262?~!126?~!16?BCW_!31?@@AACGGO_!16?@@ACGGO_!28?~!263?~
+-~!256?!6@~!5@!121?~!20?@@ACGO_!33?@@AACGGOO_!14?@EGO_!23?~!263?~
+-~!262?~!126?~!27?@ACCGOO_!35?@@AACGOO_!10?@@ACGo!17?~!263?~
+-~!262?~!126?~!35?!3@AACGGOO!3_!31?@@AACGOO_!7?@EGOO_!11?~!263?~
+-~!262?~!126?~!48?!4@AA!3C!4G!4O__!21?@@AAC!3GO__??BCW_!7?~!263?~
+-~!262?~!84?!7_!3?]!4`Q{!3?wCA@ACw!15?~!67?!7@!4A!5C!7G!6O!3_``ACGGPQcgO_?~!263?~
+-~!262?~!94?G!4OGF!3?BCGOGCB!15?~!112@~NzJJTTd!3D!15H!6P!7`!187@!38?~
+-~!256?!6CF!5C!121?~!112?~??@ACGO`@@ACC!4GO_!19?!16@!7A!9C!18G!9O!9_!157?~
+-~!389?~!112?~!8?@ACGO_!5?!5@AC!5GOO__!71?!20@!8A!11C!23G!11O!11_!73?~
+-~!323?{!5Cw!3?{!55?~!112?~!14?@AACGO__!13?!5@AACC!5GOO__!137?!23@!11A!39?~
+-~!323?~!5A@!3?~A!4@}!3?o!5H}!3?E!5Ho!3?}!5HM!19?~!112?~!22?@@ACGGO__!22?!5@AA!4C!5G!4O!3_!187?~
+-~!323?@??_!6?@!5?@!4?!6@!4?!5@!5?!5@!20?~!112?~!31?@@AACGGOO!3_!33?!6@!5A!4C!7G!5O!4_!156?~
+-~!326?~!10?!5Go!3?o!4GoK!36?~!112?~!43?!4@AC!5GOO__!49?!9@!7A!4C!12G!6O!8_!110?~
+-~!326?N!6G!3?E!5HN!3?b!4C~!37?~!112?~!58?!7@AA!5C!7GOO!4_!68?!13@!9A!9C!18G!9O!11_!41?~
+-~!347?!4@!38?~!112?~!85?!12@!4A!7C!11G!9O!9_!126?~
+-~!351?_!7?!5_!7?_!17?~!112?~!137?!20@!11A!13C!34G!9O!39?~
+-~!338?!7O!4?A@~!6?n!5On!3?{A@?@A{!14?~!112?~!263?~
+-~!349?GGNGG!4?F!5GF!3?@ACGCA@!14?F!112?F!263?~
+-~!38?W!4CGo!721?~
+-~!38?_OGCA@!30?!601_!91?~
+-~!38?!7@!721?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!182?__!3O!4G!3C!15A!5C!6GO!3_!542?~
+-~!173?_O!3GE!3@!42?!3@AA!3C!3GO__!528?~
+-~!166?oGGCA@@!65?!3@ACC!3Go!518?~
+-~!160?oGGE@@!82?!3@AAC!3GOO_!506?~
+-~!39?CA~!75?!9_!28?_OGE@@!100?!3@AAC!3GOO_!183?!8_!303?~
+-~!39?OO^OO!30?w!33GwGGKI!4H!9G!8H!5I!6K!4GggWKIH!9G!11g!16W!81G!3HIIK!3GWW!3g!109G!3g!5W!10G!6K!8I!28H!8G!37H!11I!12K!31G!75W!46G!91?~
+-~!74?~!28?_WCA@!25?!3_!3O!6GcSKB!3A!12@!122?!3@!3AC!6GOO!4_!56?!4_!5O!9G!3C!4A!9@!371?~
+-~!74?~!25?_WE@!16?__O!3GCCAAB@@!8?_WE@!160?!8@!6A!24C!7A!11@!405?~
+-~!74?~!23?wE@!12?oGGCAA@!17?oGE@!625?~
+-~!74?~!20?_WF!9?oGGE@@!20?oGCB!629?~
+-~!74?~!19?wF!5?_OGE@@!23?wE@!633?~
+-~!74?~!17?{B!3?_WCA@!24?_OKB!636?~
+-~!74?~!15?_]@_OKA@!24?_OKB!640?~
+-~!74?~!14?{bWE@!25?oKA@!643?~
+-~!74?~!12?_}F@!24?_WE@!647?~
+-~!74?~!10?_{B!23?oGE@!651?~
+-~!74?~!8?ok^@!20?oGCB!655?~
+-~!74?~!6?oM|B!17?_OKA@!659?~
+-~!74?~!4?oNoN!13?__WCCB!664?~
+-~!74?~??oKrN!9?__WGKB!670?~
+-~!74?~okZE@?__O!3GCCB!676?~
+-~!37?!638@!91?~
+-~!600?!3Gw!3G!6?W!56?GO_!93?~
+-~!603?~!8?A}!6?{ACWCA{!3?{!5Q[!13?!7C!3?!7C!5?_PIC!90?~
+-~!75?!3C{!3C!46?K!28?{!17?{!5Cw!421?B!7?AABAA!4?B!5?B!3?@!5A!34?A@!94?~
+-~!78?~!7?~A!3@A!3?o!5H}!3?~A!4@}!3?E!5Ho!5?@~!6?}!5HM!3?~A!4@}!3?@@~@@_!14?~AEIQa@!3?}!5HM!3?E!5Ho!3?~}!4@}!3?}!5@}!3?~A!4@}!3?E!5Ho!3?}!5HM!514?~
+-~!78?@!7?@!9?!6@!3?@!5?@!4?!5@!5?!5@!5?!5@!4?@!5?@!6?@@!15?@!5?@!4?!5@!5?!5@!4?N?!4@!5?!5@!4?@!5?@!4?!5@!5?!5@!515?~
+-F!766CF
+\
+
diff --git a/dviware/ln03/rmcs/openclose.small b/dviware/ln03/rmcs/openclose.small
new file mode 100644
index 0000000000..93daa15afe
--- /dev/null
+++ b/dviware/ln03/rmcs/openclose.small
@@ -0,0 +1,103 @@
+[7 IP9;0;1q
+~!766@~
+-~!766?~
+-~!368?K!4AcW!188?o!4GO_!19?w!13?o!5Go!19?w!33?o!5GO!25?w!70?~
+-~!368?ogca`__!14?w!112?w!61?_OGCA@!3?}C!4A{!3?{!4AC~!13?~!5?~!4?}C!3AC!3?{!4AC~!3?{!5Q[!4?}C!3AC!13?B!5Cw!3?}!3?_}!4?K!5Q_!3?AA~AA!5?{!5Q[!3?{ACWCA{!46?~
+-~!389?~!112?~!60?B!6A!3?B!5?B!3?@!4A@B!13?@!5A@!4?B!8?@!4A@B!3?@!5A!5?B!18?@!5A@!3?G!3PON!5?!5A@!5?@AA@!4?@!5A!4?B!5?B!46?~
+-~!38?}!5@}!3?o_!4O_!3?_!5O_!3?o_!4O_!13?~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!74?~!45?{A!4@E!5?@~!6?_!5O_!3?_!5O!4?_!5O_!3?
+_!4O_~!10?~??~!9?_!5O_!3?_!5O_!3?o_!4O_!13?~!4`@@!4?o_!3O_!3?_!5O_!3?_!4O_o!3?o!4?o!4?_!5O_!3?o_!4O_!4?_!4O_!3?o!4?o!14?~!5`]!3?_!5O_!3?_!5O!4?o_!4O_!3?_!5O_!3?o_!4O_!3?_!5O!4?_!5O_!34?~
+-~!38?N!5ON!3?~N!4ON!3?N!5QB!3?^!5?^!13?^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!74?~!45?FG!4OK!5?O^O!5?N!5ON!3?@!5QK!3?N!5QB!3?
+N!4OG^!10?~??^!6O!3?N!5ON!3?N!5ON!3?~N!4ON!13?^!10?^!8?N!5QB!3?N!4ON~!3?N!4ONO!3?N!5QB!3?^!5?^!3?FG!4OG!3?F!3GC~!14?^?@ACGO!3?N!5QB!3?@!5QK!3?~N!4ON!3?N!5ON!3?^!5?^!3?@!5QK!3?N!5QB!34?~
+-~!48?B!69?B!55?B!12?o!30?@!4A@!38?{!5?B!120?~!112?~!32?B!55?B!43?@!4A@!44?B!80?~
+-~!187?~!74?~!126?~!87?__OOGCC!9AC!3GO_!3?~!263?~
+-~!37?~!36_~!37_~!36_~!37_~!36_~!37_~!15_!111?~!80?__OGCA@!22?@AC~O_!261?~
+-~!37?^!36?^!37?^!36?^!37?~!36?^!19?_OO!3GKcuyj\NJD~ZF~!126?~!74?oGCCA@!32?~?@ACGO_!256?~
+-~!187?~!45?__OGGKEA!3@?_OwGKFB@!3?_WE~??~!30?}CGoGC}!4?!5_!5?!4_?o!3?_?!4_!6?_e!6?__}__!5?_!4?_!5?!4_?}!4?!5_!10?~!67?_WCCAA@!38?~!6?@AKO_!252?~
+-~!187?Fw!37?_OGKCA@@??__OGGCA`\E@@!6?oKB??~?~~!30?~!5?~!3?W!5c~!3?N!4O~!4?~@!4?~!4?__~__!6?^__O!4?^!4_^_!3?^!4_P~!3?^!5cF!9?~!59?__OGCAA@@!44?~!10?@EGo!249?~
+-~!188?@Fw!28?_WGCE@@??_OOGCCA@!5?{B@!7?oKB!5?~?~~!50?A!4CB!70?~!50?__OGCCAA@!53?~!14?@EGo!245?~
+-~!190?@Ew!20?oGCCB@?_OGGCAA@!10?wM@!7?_[B!8?~?~~!107?_o!17?~!38?__O!4GCAA@@!62?~!18?@EGO_!240?~
+-~!193?BKO_!10?_OGCaPOGCCA@@!16?oKB!6?_WE@!10?~?~~!106?@?~!17?~!16?!5_!4O!5GCCAA!4@!74?~!22?@AKO_!236?~
+-~!196?@EGo??_oWKJCAA@!24?}@!6?wE@!10?!3@~~@~!5@!101?CCFCC!15?~BBFFJRb!33B!9D!11H!3P!4`!45@~!27@BLP``!193@!38?~
+-~!197?_WCBBLO_!28?_[B!4?oKB!16?~~?~!126?~!7?@AKO_!55?!5@AACC!5GOO__!27?~!32?@ACGo!226?~
+-~!192?_OGCA@!6?@BKGW_!22?wF!3?oKB!19?~~?~!126?~!12?@AKo!69?!4@AAC!4GOO__!12?~!37?@EGO_!221?~
+-~!188?_OKA@!17?@ACGGO_!14?_^?_WF!22?~~?~!126?~!16?BCW_!80?!3@AC!5GO_~!42?@@ACGO_!214?~
+-~!184?_OKA@!28?@@AEGGW__!5?~WE@!24?~B?~!126?~!20?@ACGO_!86?~@!3ACCGGOO!3_!36?@ACCGOO_!206?~
+-~!181?_WE@!41?!3@B}D!4GOO__!19?~??~!126?~!25?@ACGO_!81?~!13?@@AACC!3GOO__!31?@AACCGOO_!197?~
+-~!178?_WE@!47?}@!9?!7@!4A!8C~CC~!9C!3A!114?~!31?@AACGO__!73?~!26?!4@AAC!4G!3O__!24?@!3ACCGGOO_!186?~
+-~!175?_WE@!50?~!29?~??~!126?~!39?@@ACGGOO__!63?~!42?!4@!3ACC!4G!3O!4_!15?!4@AAC!4GOO__!171?~
+-~!171?_OKB!54?~!29?~??~!126?~!49?!3@AC!5GOO__!49?~!62?!5@AA!4C!7GOO!5_!5?!5@AACC!7GOO__!151?~
+-~!168?_WE@!56?}@!29?~??~!126?~!63?!4@AA!3C!6G!5O!4_!25?~!87?!7@!4A!5C!9G!4P!3`!4aA!4C!7G!4O!7_!117?~
+-~!166?wE@!58?_^!30?~??~!126?~!87?!9@!5A!7C!4G~!8G!7O!10_!98?!11@!7A!5CDD!7H!6I!5KSS!7W!9g!9O!9_!61?~
+-~!163?oKB!61?~!31?~??~!126?~!112?~!25?!22@!14A!18C!42G!29O!34_!4`!21@!13B@@!39?~
+-~!160?_WF!64?~!28?!3G~GG~!5G!121?N!112G~!188G!36HG!38?~
+-~!158?_[B!65?oN!31?~??~!239?~!263?~
+-~!156?oM@!67?~!32?~??~!239?~!4?CA~!105?E!3@`QK!43?~??_??~!6?_OGF!3?~??_??~!3?o_!4O_!26?A@@!3`]!31?~
+-~!154?WE@!69?N!32?F??~!239?~!4?OO^OO!103?WSQP!3O!43?FWE@EWF!3?[A@!7?FWE@EWF!3?^!5?^!26?G!5ON!31?~
+-~!262?~!239?~!263?~
+-~!262?~!105?_OGCGO_!127?~!263?~
+-~!256?!6_~!5_!100?NO_?_ON!14?!113_~!225_!38?~
+-~!262?~!108?@!17?~FXbDHIQQacCC!4G!5O__!89?~!263?~
+-~!262?~!126?~??@EW_!4?!4@ACGGOO__?!4@!3ACC!7GOO__!69?~!263?~
+-~!262?~!126?~!5?@EW_!13?@AACCGGO_!12?@@!3ACC!4GO__!55?~!263?~
+-~!262?~!126?~!8?@EW_!19?@@AACCGOO_!16?@@AACCGGOO_!44?~!263?~
+-~!262?~!126?~!12?BCW_!25?!3@AACGGO_!17?@AACCGO_!36?~!263?~
+-~!262?~!126?~!16?BCW_!31?@@AACGGO_!16?@@ACGGO_!28?~!263?~
+-~!256?!6@~!5@!121?~!20?@@ACGO_!33?@@AACGGOO_!14?@EGO_!23?~!263?~
+-~!262?~!126?~!27?@ACCGOO_!35?@@AACGOO_!10?@@ACGo!17?~!263?~
+-~!262?~!126?~!35?!3@AACGGOO!3_!31?@@AACGOO_!7?@EGOO_!11?~!263?~
+-~!262?~!126?~!48?!4@AA!3C!4G!4O__!21?@@AAC!3GO__??BCW_!7?~!263?~
+-~!262?~!84?!7_!3?]!4`Q{!3?wCA@ACw!15?~!67?!7@!4A!5C!7G!6O!3_``ACGGPQcgO_?~!263?~
+-~!262?~!94?G!4OGF!3?BCGOGCB!15?~!112@~NzJJTTd!3D!15H!6P!7`!187@!38?~
+-~!256?!6CF!5C!121?~!112?~??@ACGO`@@ACC!4GO_!19?!16@!7A!9C!18G!9O!9_!157?~
+-~!389?~!112?~!8?@ACGO_!5?!5@AC!5GOO__!71?!20@!8A!11C!23G!11O!11_!73?~
+-~!323?{!5Cw!3?{!55?~!112?~!14?@AACGO__!13?!5@AACC!5GOO__!137?!23@!11A!39?~
+-~!323?~!5A@!3?~A!4@}!3?o!5H}!3?E!5Ho!3?}!5HM!19?~!112?~!22?@@ACGGO__!22?!5@AA!4C!5G!4O!3_!187?~
+-~!323?@??_!6?@!5?@!4?!6@!4?!5@!5?!5@!20?~!112?~!31?@@AACGGOO!3_!33?!6@!5A!4C!7G!5O!4_!156?~
+-~!326?~!10?!5Go!3?o!4GoK!36?~!112?~!43?!4@AC!5GOO__!49?!9@!7A!4C!12G!6O!8_!110?~
+-~!326?N!6G!3?E!5HN!3?b!4C~!37?~!112?~!58?!7@AA!5C!7GOO!4_!68?!13@!9A!9C!18G!9O!11_!41?~
+-~!347?!4@!38?~!112?~!85?!12@!4A!7C!11G!9O!9_!126?~
+-~!351?_!7?!5_!7?_!17?~!112?~!137?!20@!11A!13C!34G!9O!39?~
+-~!338?!7O!4?A@~!6?n!5On!3?{A@?@A{!14?~!112?~!263?~
+-~!349?GGNGG!4?F!5GF!3?@ACGCA@!14?F!112?F!263?~
+-~!38?W!4CGo!721?~
+-~!38?_OGCA@!30?!601_!91?~
+-~!38?!7@!721?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!766?~
+-~!182?__!3O!4G!3C!15A!5C!6GO!3_!542?~
+-~!173?_O!3GE!3@!42?!3@AA!3C!3GO__!528?~
+-~!166?oGGCA@@!65?!3@ACC!3Go!518?~
+-~!160?oGGE@@!82?!3@AAC!3GOO_!506?~
+-~!39?CA~!75?!9_!28?_OGE@@!100?!3@AAC!3GOO_!183?!8_!303?~
+-~!39?OO^OO!30?w!33GwGGKI!4H!9G!8H!5I!6K!4GggWKIH!9G!11g!16W!81G!3HIIK!3GWW!3g!109G!3g!5W!10G!6K!8I!28H!8G!37H!11I!12K!31G!75W!46G!91?~
+-~!74?~!28?_WCA@!25?!3_!3O!6GcSKB!3A!12@!122?!3@!3AC!6GOO!4_!56?!4_!5O!9G!3C!4A!9@!371?~
+-~!74?~!25?_WE@!16?__O!3GCCAAB@@!8?_WE@!160?!8@!6A!24C!7A!11@!405?~
+-~!74?~!23?wE@!12?oGGCAA@!17?oGE@!625?~
+-~!74?~!20?_WF!9?oGGE@@!20?oGCB!629?~
+-~!74?~!19?wF!5?_OGE@@!23?wE@!633?~
+-~!74?~!17?{B!3?_WCA@!24?_OKB!636?~
+-~!74?~!15?_]@_OKA@!24?_OKB!640?~
+-~!74?~!14?{bWE@!25?oKA@!643?~
+-~!74?~!12?_}F@!24?_WE@!647?~
+-~!74?~!10?_{B!23?oGE@!651?~
+-~!74?~!8?ok^@!20?oGCB!655?~
+-~!74?~!6?oM|B!17?_OKA@!659?~
+-~!74?~!4?oNoN!13?__WCCB!664?~
+-~!74?~??oKrN!9?__WGKB!670?~
+-~!74?~okZE@?__O!3GCCB!676?~
+-~!37?!638@!91?~
+-~!600?!3Gw!3G!6?W!56?GO_!93?~
+-~!603?~!8?A}!6?{ACWCA{!3?{!5Q[!13?!7C!3?!7C!5?_PIC!90?~
+-~!75?!3C{!3C!46?K!28?{!17?{!5Cw!421?B!7?AABAA!4?B!5?B!3?@!5A!34?A@!94?~
+-~!78?~!7?~A!3@A!3?o!5H}!3?~A!4@}!3?E!5Ho!5?@~!6?}!5HM!3?~A!4@}!3?@@~@@_!14?~AEIQa@!3?}!5HM!3?E!5Ho!3?~}!4@}!3?}!5@}!3?~A!4@}!3?E!5Ho!3?}!5HM!514?~
+-~!78?@!7?@!9?!6@!3?@!5?@!4?!5@!5?!5@!5?!5@!4?@!5?@!6?@@!15?@!5?@!4?!5@!5?!5@!4?N?!4@!5?!5@!4?@!5?@!4?!5@!5?!5@!515?~
+-F!766CF
+\
+
diff --git a/dviware/ln03/rmcs/test.pic b/dviware/ln03/rmcs/test.pic
new file mode 100644
index 0000000000..b32713caaa
--- /dev/null
+++ b/dviware/ln03/rmcs/test.pic
@@ -0,0 +1,252 @@
+62A31Y6Z72+ GINO-F 2.7B + BAGGOTT 19-DEC-1988 16 40 +*.B1
+03*
+72B4PB5368Q28RPX110000000G11G2PG4O407608PG5PG61G7PG9PD8O407608QYO407608Q
+72YPYPB7E2Y13315PE5TRACKING PERFORMANCE FOR TX/RX S*.E5PACING=4.25E+05*L
+72M *UWAVELENGTH=1.51*.E51*LM *UTX EIRP=1.0E+05W R*LX *UNOISE TEM*.E5P=5
+7200.0K *.E2Y139945E5R*LX *UA*LE *USPACING=0.50 *LLAMBDA *UR*LX *UA*LE *
+72.E5GAIN= 2.0 TARGET VEL=200.0*LM/S *UTA*.E5RGET RCS= 50.0*LM*.E694E52
+72WINDOW= 32.0*LS *.E5DOA/FD WEIGHTING=0.0050*.E238043Y309783E48E5 R*LX
+72*.E2445652E48E5 T*LX *.E266134Y241965E17156P24739PE177845Y251792E26809
+724Y25112PE43E266965Y254713E43E271626Y2472QE43E238261Y309612E44E236888Y3
+7211356E47E235514Y3131QE47E23414P314843E47E232767Y316586E47E231393Y31833
+72PE47E23002P320075E47E228646Y321817E47E227273Y323562E47E225899Y325306E4
+077B611
+03*
+72B31B5368Q28RPX110000000G11G2PG4O407608PG5PG61G7PG9PD8O407608QYO407608Q
+72YPYPB7E2296196Y139945E5POSITION ERRORS (*LKM)*.E2463315Y235053E112228E
+72262349E1Y233015E211247PE1Y235053E216259PE1Y233015E221271PE1Y235053E226
+72283PE1Y233015E2312952E1Y235053E2363073E1Y233015E2413193E1Y235053E24583
+7203E1Y233832E245329PE1Y235053E2448278E1Y233832E2443267E1Y235053E2438254
+72E1Y233832E2433242E1Y235053E242823PE1Y233832E242322PE1Y235053E2418206E1
+72Y233832E2408182Y235053E1Y233832E240317PE1Y235053E2398158E1Y233832E2393
+72145E1Y235053E2388134E1Y233832E238312PE1Y235053E237811PE1Y233832E237309
+727E1Y235053E2368086E1Y233832E2358062Y235053E1Y233832E235305PE1Y235053E2
+72348037E1Y233832E2343024E1Y235053E2338013E1Y233832E2333RE1Y235053E23279
+729PE1Y233832E2322976E1Y235053E2317965E1Y233832E230794P235053E1Y233832E2
+72302928E1Y235053E2297917E1Y233832E2292904E1Y235053E2287893E1Y233832E228
+72288PE1Y235053E2277868E1Y233832E2272855E1Y235053E2267844E1Y233832E22578
+722P235053E1Y233832E2252807E1Y235053E2247796E1Y233832E2242783E1Y235053E2
+72237772E1Y233832E223276PE1Y235053E2227747E1Y233832E2222736E1Y235053E221
+727722E1Y233832E2207698Y235053E1Y233832E2202687E1Y235053E2197674E1Y23383
+722E2192663E1Y235053E218765PE1Y233832E218264PE1Y235053E2177627E1Y233832E
+722172615E1Y235053E2167603E1Y233832E215758P235053E1Y233832E2152566E1Y235
+72053E2147554E1Y233832E2142542E1Y235053E213753PE1Y233832E2132518E1Y23505
+723E2127506E1Y233832E2122493E1Y235053E211748PE1Y233832E2107457Y235053E1Y
+72233832E2102445E1Y235053E297434E1Y233832E292421E1Y235053E287409E1Y23383
+722E282397E1Y235053E277385E1Y233832E272373E1Y235053E267361E1Y233832E2573
+7237Y235053E1Y233832E252325E1Y235053E247313E1Y233832E242301E1Y235053E237
+72289E1Y233832E232276E1Y235053E227264E1Y233832E222252E1Y235053E21724PE1Y
+72233832E2464945Y24049PE50 *.E2414825E55 *.E2364703E510 *.E2314582E515
+72 *.E2264462E520 *.E221434PE525 *.E216422PE530 *.E21141QE535 *.E263979E
+72540 *.E213859E545 *.E212228Y235053E1Y153533E2Y161685E114266E2Y169836E1
+7212228E2Y177988E114266E2Y18614PE112228E2Y194293E114266E2Y202446E112228E
+722Y210597E114266E2Y21875PE112228E2Y226902E114266E212228Y233423E113451E2
+72Y231792E112228E2Y230163E113451E2Y228533E112228E2Y225272E113451E2Y22364
+72PE112228E2Y22201PE113451E2Y22038PE112228E2Y21712PE113451E2Y21549PE1122
+7228E2Y21386PE113451E2Y212227E112228E2Y208966E113451E2Y207336E112228E2Y2
+7205707E113451E2Y204076E112228E2Y200815E113451E2Y199184E112228E2Y197554E
+72113451E2Y195923E112228E2Y192663E113451E2Y191033E112228E2Y1894QE113451E
+722Y18777PE112228E2Y18451PE113451E2Y18288PE112228E2Y18125PE113451E2Y1796
+722PE112228E2Y17636PE113451E2Y174728E112228E2Y173098E113451E2Y171466E112
+72228E2Y168207E113451E2Y166576E112228E2Y164945E113451E2Y163315E112228E2Y
+72160054E113451E2Y158423E112228E2Y156792E113451E2Y155163E112228E2463315Y
+72235053E1Y153533E2Y161685E1461277E2Y169836E1463315E2Y177988E1461277E2Y1
+728614PE1463315E2Y194293E1461277E2Y202446E1463315E2Y210597E1461277E2Y218
+7275PE1463315E2Y226902E1461277E2463315Y233423E1462092E2Y231792E1463315E2
+72Y230163E1462092E2Y228533E1463315E2Y225272E1462092E2Y22364PE1463315E2Y2
+722201PE1462092E2Y22038PE1463315E2Y21712PE1462092E2Y21549PE1463315E2Y213
+7286PE1462092E2Y212227E1463315E2Y208966E1462092E2Y207336E1463315E2Y20570
+727E1462092E2Y204076E1463315E2Y200815E1462092E2Y199184E1463315E2Y197554E
+721462092E2Y195923E1463315E2Y192663E1462092E2Y191033E1463315E2Y1894QE146
+722092E2Y18777PE1463315E2Y18451PE1462092E2Y18288PE1463315E2Y18125PE14620
+7292E2Y17962PE1463315E2Y17636PE1462092E2Y174728E1463315E2Y173098E1462092
+72E2Y171466E1463315E2Y168207E1462092E2Y166576E1463315E2Y164945E1462092E2
+72Y163315E1463315E2Y160054E1462092E2Y158423E1463315E2Y156792E1462092E2Y1
+7255163E1463315E2475543Y235053E5 0*.E2Y226902E5 1*.E2Y21875PE5 2*.E2Y
+72210597E5 3*.E2Y202446E5 4*.E2Y194293E5 5*.E2Y18614PE5 6*.E2Y177988
+72E5 7*.E2Y169836E5 8*.E2Y161685E5 9*.E2Y153533E5 10*.E2473505Y147417
+72E5X10*.E2461277Y14538PE51 *.E2463315Y153533E112228E262349E1Y15557PE2
+7211247PE1Y153533E216259PE1Y15557PE221271PE1Y153533E226283PE1Y15557PE231
+722952E1Y153533E2363073E1Y15557PE2413193E1Y153533E2458303E1Y154754E24532
+729PE1Y153533E2448278E1Y154754E2443267E1Y153533E2438254E1Y154754E2433242
+72E1Y153533E242823PE1Y154754E242322PE1Y153533E2418206E1Y154754E2408182Y1
+7253533E1Y154754E240317PE1Y153533E2398158E1Y154754E2393145E1Y153533E2388
+72134E1Y154754E238312PE1Y153533E237811PE1Y154754E2373097E1Y153533E236808
+726E1Y154754E2358062Y153533E1Y154754E235305PE1Y153533E2348037E1Y154754E2
+72343024E1Y153533E2338013E1Y154754E2333RE1Y153533E232799PE1Y154754E23229
+7276E1Y153533E2317965E1Y154754E230794P153533E1Y154754E2302928E1Y153533E2
+72297917E1Y154754E2292904E1Y153533E2287893E1Y154754E228288PE1Y153533E227
+727868E1Y154754E2272855E1Y153533E2267844E1Y154754E225782P153533E1Y154754
+72E2252807E1Y153533E2247796E1Y154754E2242783E1Y153533E2237772E1Y154754E2
+7223276PE1Y153533E2227747E1Y154754E2222736E1Y153533E2217722E1Y154754E220
+727698Y153533E1Y154754E2202687E1Y153533E2197674E1Y154754E2192663E1Y15353
+723E218765PE1Y154754E218264PE1Y153533E2177627E1Y154754E2172615E1Y153533E
+722167603E1Y154754E215758P153533E1Y154754E2152566E1Y153533E2147554E1Y154
+72754E2142542E1Y153533E213753PE1Y154754E2132518E1Y153533E2127506E1Y15475
+724E2122493E1Y153533E211748PE1Y154754E2107457Y153533E1Y154754E2102445E1Y
+72153533E297434E1Y154754E292421E1Y153533E287409E1Y154754E282397E1Y153533
+72E277385E1Y154754E272373E1Y153533E267361E1Y154754E257337Y153533E1Y15475
+724E252325E1Y153533E247313E1Y154754E242301E1Y153533E237289E1Y154754E2322
+7276E1Y153533E227264E1Y154754E222252E1Y153533E21724PE1Y154754E2463315Y23
+72024PE142322P22731PE138312P234456E1343024Y175067E1302928Y173392E126283P
+72171702E1222736Y17SE118264P168285E1142542Y16656PE1102445Y164822E162349Y
+72163076E122252Y160418E2343024Y175067E44E2302928Y173392E47E226283P171702
+72E47E2222736Y17SE47E218264P168285E47E2142542Y16656PE47E2102445Y164822E4
+727E262349Y163076E47E222252Y160418E47E2296196Y262227E5VELOCITY ERRORS (*
+72LM/S) *.E2463315Y357336E112228E262349E1Y355298E211247PE1Y357336E2162
+7259PE1Y355298E221271PE1Y357336E226283PE1Y355298E2312952E1Y357336E236307
+723E1Y355298E2413193E1Y357336E2458303E1Y356114E245329PE1Y357336E2448278E
+721Y356114E2443267E1Y357336E2438254E1Y356114E2433242E1Y357336E242823PE1Y
+72356114E242322PE1Y357336E2418206E1Y356114E2408182Y357336E1Y356114E24031
+727PE1Y357336E2398158E1Y356114E2393145E1Y357336E2388134E1Y356114E238312P
+72E1Y357336E237811PE1Y356114E2373097E1Y357336E2368086E1Y356114E2358062Y3
+7257336E1Y356114E235305PE1Y357336E2348037E1Y356114E2343024E1Y357336E2338
+72013E1Y356114E2333RE1Y357336E232799PE1Y356114E2322976E1Y357336E2317965E
+721Y356114E230794P357336E1Y356114E2302928E1Y357336E2297917E1Y356114E2292
+72904E1Y357336E2287893E1Y356114E228288PE1Y357336E2277868E1Y356114E227285
+725E1Y357336E2267844E1Y356114E225782P357336E1Y356114E2252807E1Y357336E22
+7247796E1Y356114E2242783E1Y357336E2237772E1Y356114E223276PE1Y357336E2227
+72747E1Y356114E2222736E1Y357336E2217722E1Y356114E2207698Y357336E1Y356114
+72E2202687E1Y357336E2197674E1Y356114E2192663E1Y357336E218765PE1Y356114E2
+7218264PE1Y357336E2177627E1Y356114E2172615E1Y357336E2167603E1Y356114E215
+72758P357336E1Y356114E2152566E1Y357336E2147554E1Y356114E2142542E1Y357336
+72E213753PE1Y356114E2132518E1Y357336E2127506E1Y356114E2122493E1Y357336E2
+7211748PE1Y356114E2107457Y357336E1Y356114E2102445E1Y357336E297434E1Y3561
+7214E292421E1Y357336E287409E1Y356114E282397E1Y357336E277385E1Y356114E272
+72373E1Y357336E267361E1Y356114E257337Y357336E1Y356114E252325E1Y357336E24
+727313E1Y356114E242301E1Y357336E237289E1Y356114E232276E1Y357336E227264E1
+72Y356114E222252E1Y357336E21724PE1Y356114E2464945Y362772E50 *.E2414825E
+7255 *.E2364703E510 *.E2314582E515 *.E2264462E520 *.E221434PE525 *.E216
+72422PE530 *.E21141QE535 *.E263979E540 *.E213859E545 *.E212228Y357336E1Y
+72275815E2Y284873E114266E2Y29393PE112228E2Y30299PE114266E2Y312047E112228
+72E2Y321105E114266E2Y330163E112228E2Y33922PE114266E2Y348278E112228E2Y355
+72524E113451E2Y353713E112228E2Y351902E113451E2Y35009PE112228E2Y346466E11
+723451E2Y344655E112228E2Y342844E113451E2Y341033E112228E2Y337408E113451E2
+72Y335597E112228E2Y333786E113451E2Y331975E112228E2Y32835PE113451E2Y32654
+72PE112228E2Y324727E113451E2Y322917E112228E2Y319293E113451E2Y31748PE1122
+7228E2Y31567PE113451E2Y31386PE112228E2Y310236E113451E2Y308423E112228E2Y3
+720661PE113451E2Y3048QE112228E2Y301178E113451E2Y299365E112228E2Y297553E1
+7213451E2Y295742E112228E2Y29212PE113451E2Y290307E112228E2Y288495E113451E
+722Y286684E112228E2Y283062E113451E2Y28125PE112228E2Y279437E113451E2Y2776
+7226E112228E2463315Y357336E1Y275815E2Y284873E1461277E2Y29393PE1463315E2Y
+7230299PE1461277E2Y312047E1463315E2Y321105E1461277E2Y330163E1463315E2Y33
+72922PE1461277E2Y348278E1463315E2Y355524E1462092E2Y353713E1463315E2Y3519
+7202E1462092E2Y35009PE1463315E2Y346466E1462092E2Y344655E1463315E2Y342844
+72E1462092E2Y341033E1463315E2Y337408E1462092E2Y335597E1463315E2Y333786E1
+72462092E2Y331975E1463315E2Y32835PE1462092E2Y32654PE1463315E2Y324727E146
+722092E2Y322917E1463315E2Y319293E1462092E2Y31748PE1463315E2Y31567PE14620
+7292E2Y31386PE1463315E2Y310236E1462092E2Y308423E1463315E2Y30661PE1462092
+72E2Y3048QE1463315E2Y301178E1462092E2Y299365E1463315E2Y297553E1462092E2Y
+72295742E1463315E2Y29212PE1462092E2Y290307E1463315E2Y288495E1462092E2Y28
+726684E1463315E2Y283062E1462092E2Y28125PE1463315E2Y279437E1462092E2Y2776
+7226E1463315E2475543Y357336E5-40*.E2Y348278E5-35*.E2Y33922PE5-30*.E2Y330
+72163E5-25*.E2Y321105E5-20*.E2Y312047E5-15*.E2Y30299PE5-10*.E2Y29393PE5
+72-5*.E2Y284873E5 0*.E2Y275815E5 5*.E2473505Y2697QE5X10*.E2461277Y2676
+7263E51 *.E2463315Y275815E112228E262349E1Y277852E211247PE1Y275815E2162
+7259PE1Y277852E221271PE1Y275815E226283PE1Y277852E2312952E1Y275815E236307
+723E1Y277852E2413193E1Y275815E2458303E1Y277038E245329PE1Y275815E2448278E
+721Y277038E2443267E1Y275815E2438254E1Y277038E2433242E1Y275815E242823PE1Y
+72277038E242322PE1Y275815E2418206E1Y277038E2408182Y275815E1Y277038E24031
+727PE1Y275815E2398158E1Y277038E2393145E1Y275815E2388134E1Y277038E238312P
+72E1Y275815E237811PE1Y277038E2373097E1Y275815E2368086E1Y277038E2358062Y2
+7275815E1Y277038E235305PE1Y275815E2348037E1Y277038E2343024E1Y275815E2338
+72013E1Y277038E2333RE1Y275815E232799PE1Y277038E2322976E1Y275815E2317965E
+721Y277038E230794P275815E1Y277038E2302928E1Y275815E2297917E1Y277038E2292
+72904E1Y275815E2287893E1Y277038E228288PE1Y275815E2277868E1Y277038E227285
+725E1Y275815E2267844E1Y277038E225782P275815E1Y277038E2252807E1Y275815E22
+7247796E1Y277038E2242783E1Y275815E2237772E1Y277038E223276PE1Y275815E2227
+72747E1Y277038E2222736E1Y275815E2217722E1Y277038E2207698Y275815E1Y277038
+72E2202687E1Y275815E2197674E1Y277038E2192663E1Y275815E218765PE1Y277038E2
+7218264PE1Y275815E2177627E1Y277038E2172615E1Y275815E2167603E1Y277038E215
+72758P275815E1Y277038E2152566E1Y275815E2147554E1Y277038E2142542E1Y275815
+72E213753PE1Y277038E2132518E1Y275815E2127506E1Y277038E2122493E1Y275815E2
+7211748PE1Y277038E2107457Y275815E1Y277038E2102445E1Y275815E297434E1Y2770
+7238E292421E1Y275815E287409E1Y277038E282397E1Y275815E277385E1Y277038E272
+72373E1Y275815E267361E1Y277038E257337Y275815E1Y277038E252325E1Y275815E24
+727313E1Y277038E242301E1Y275815E237289E1Y277038E232276E1Y275815E227264E1
+72Y277038E222252E1Y275815E21724PE1Y277038E2463315Y284873E112228E2463315Y
+72284493E142322P28431PE138312P284964E1343024Y353457E1302928E126283PE1222
+72736E118264PE1142542E1102445E162349E122252E2343024E44E2302928E47E226283
+72PE47E2222736E47E218264PE47E2142542E47E2102445E47E262349E47E222252E47E2
+72296196Y38451PE5HEADING ERRORS (DEG)*.E2463315Y47962PE112228E262349E1Y4
+727758PE211247PE1Y47962PE216259PE1Y47758PE221271PE1Y47962PE226283PE1Y477
+7258PE2312952E1Y47962PE2363073E1Y47758PE2413193E1Y47962PE2458303E1Y47839
+726E245329PE1Y47962PE2448278E1Y478396E2443267E1Y47962PE2438254E1Y478396E
+722433242E1Y47962PE242823PE1Y478396E242322PE1Y47962PE2418206E1Y478396E24
+7208182Y47962PE1Y478396E240317PE1Y47962PE2398158E1Y478396E2393145E1Y4796
+722PE2388134E1Y478396E238312PE1Y47962PE237811PE1Y478396E2373097E1Y47962P
+72E2368086E1Y478396E2358062Y47962PE1Y478396E235305PE1Y47962PE2348037E1Y4
+7278396E2343024E1Y47962PE2338013E1Y478396E2333RE1Y47962PE232799PE1Y47839
+726E2322976E1Y47962PE2317965E1Y478396E230794P47962PE1Y478396E2302928E1Y4
+727962PE2297917E1Y478396E2292904E1Y47962PE2287893E1Y478396E228288PE1Y479
+7262PE2277868E1Y478396E2272855E1Y47962PE2267844E1Y478396E225782P47962PE1
+72Y478396E2252807E1Y47962PE2247796E1Y478396E2242783E1Y47962PE2237772E1Y4
+7278396E223276PE1Y47962PE2227747E1Y478396E2222736E1Y47962PE2217722E1Y478
+72396E2207698Y47962PE1Y478396E2202687E1Y47962PE2197674E1Y478396E2192663E
+721Y47962PE218765PE1Y478396E218264PE1Y47962PE2177627E1Y478396E2172615E1Y
+7247962PE2167603E1Y478396E215758P47962PE1Y478396E2152566E1Y47962PE214755
+724E1Y478396E2142542E1Y47962PE213753PE1Y478396E2132518E1Y47962PE2127506E
+721Y478396E2122493E1Y47962PE211748PE1Y478396E2107457Y47962PE1Y478396E210
+722445E1Y47962PE297434E1Y478396E292421E1Y47962PE287409E1Y478396E282397E1
+72Y47962PE277385E1Y478396E272373E1Y47962PE267361E1Y478396E257337Y47962PE
+721Y478396E252325E1Y47962PE247313E1Y478396E242301E1Y47962PE237289E1Y4783
+7296E232276E1Y47962PE227264E1Y478396E222252E1Y47962PE21724PE1Y478396E246
+724945Y485054E50 *.E2414825E55 *.E2364703E510 *.E2314582E515 *.E226446
+722E520 *.E221434PE525 *.E216422PE530 *.E21141QE535 *.E263979E540 *.E213
+72859E545 *.E212228Y47962PE1Y398097E2Y40625PE114266E2Y414402E112228E2Y42
+722554E114266E2Y430706E112228E2Y438858E114266E2Y44701PE112228E2Y455163E1
+7214266E2Y463315E112228E2Y471467E114266E212228Y47799PE113451E2Y476358E11
+722228E2Y474728E113451E2Y473097E112228E2Y469836E113451E2Y468206E112228E2
+72Y466576E113451E2Y464945E112228E2Y461684E113451E2Y460054E112228E2Y45842
+723E113451E2Y456793E112228E2Y453532E113451E2Y451902E112228E2Y45027PE1134
+7251E2Y44864PE112228E2Y44538PE113451E2Y44375PE112228E2Y44212PE113451E2Y4
+724049PE112228E2Y437228E113451E2Y435597E112228E2Y433967E113451E2Y432336E
+72112228E2Y429076E113451E2Y427445E112228E2Y425815E113451E2Y424184E112228
+72E2Y420923E113451E2Y419293E112228E2Y417663E113451E2Y416032E112228E2Y412
+7277PE113451E2Y41114PE112228E2Y40951PE113451E2Y40788PE112228E2Y40462PE11
+723451E2Y40299PE112228E2Y401358E113451E2Y399727E112228E2463315Y47962PE1Y
+72398097E2Y40625PE1461277E2Y414402E1463315E2Y422554E1461277E2Y430706E146
+723315E2Y438858E1461277E2Y44701PE1463315E2Y455163E1461277E2Y463315E14633
+7215E2Y471467E1461277E2463315Y47799PE1462092E2Y476358E1463315E2Y474728E1
+72462092E2Y473097E1463315E2Y469836E1462092E2Y468206E1463315E2Y466576E146
+722092E2Y464945E1463315E2Y461684E1462092E2Y460054E1463315E2Y458423E14620
+7292E2Y456793E1463315E2Y453532E1462092E2Y451902E1463315E2Y45027PE1462092
+72E2Y44864PE1463315E2Y44538PE1462092E2Y44375PE1463315E2Y44212PE1462092E2
+72Y44049PE1463315E2Y437228E1462092E2Y435597E1463315E2Y433967E1462092E2Y4
+7232336E1463315E2Y429076E1462092E2Y427445E1463315E2Y425815E1462092E2Y424
+72184E1463315E2Y420923E1462092E2Y419293E1463315E2Y417663E1462092E2Y41603
+722E1463315E2Y41277PE1462092E2Y41114PE1463315E2Y40951PE1462092E2Y40788PE
+721463315E2Y40462PE1462092E2Y40299PE1463315E2Y401358E1462092E2Y399727E14
+7263315E2475543Y47962PE5-10*.E2Y471467E5 -9*.E2Y463315E5 -8*.E2Y455163E5
+72 -7*.E2Y44701PE5 -6*.E2Y438858E5 -5*.E2Y430706E5 -4*.E2Y422554E5 -3*.E
+722Y414402E5 -2*.E2Y40625PE5 -1*.E2Y398097E5 0*.E2473505Y391984E5X10*.E
+722461277Y389946E51 *.E2463315Y398097E112228E262349E1Y400135E211247PE1
+72Y398097E216259PE1Y400135E221271PE1Y398097E226283PE1Y400135E2312952E1Y3
+7298097E2363073E1Y400135E2413193E1Y398097E2458303E1Y39932PE245329PE1Y398
+72097E2448278E1Y39932PE2443267E1Y398097E2438254E1Y39932PE2433242E1Y39809
+727E242823PE1Y39932PE242322PE1Y398097E2418206E1Y39932PE2408182Y398097E1Y
+7239932PE240317PE1Y398097E2398158E1Y39932PE2393145E1Y398097E2388134E1Y39
+72932PE238312PE1Y398097E237811PE1Y39932PE2373097E1Y398097E2368086E1Y3993
+722PE2358062Y398097E1Y39932PE235305PE1Y398097E2348037E1Y39932PE2343024E1
+72Y398097E2338013E1Y39932PE2333RE1Y398097E232799PE1Y39932PE2322976E1Y398
+72097E2317965E1Y39932PE230794P398097E1Y39932PE2302928E1Y398097E2297917E1
+72Y39932PE2292904E1Y398097E2287893E1Y39932PE228288PE1Y398097E2277868E1Y3
+729932PE2272855E1Y398097E2267844E1Y39932PE225782P398097E1Y39932PE2252807
+72E1Y398097E2247796E1Y39932PE2242783E1Y398097E2237772E1Y39932PE223276PE1
+72Y398097E2227747E1Y39932PE2222736E1Y398097E2217722E1Y39932PE2207698Y398
+72097E1Y39932PE2202687E1Y398097E2197674E1Y39932PE2192663E1Y398097E218765
+72PE1Y39932PE218264PE1Y398097E2177627E1Y39932PE2172615E1Y398097E2167603E
+721Y39932PE215758P398097E1Y39932PE2152566E1Y398097E2147554E1Y39932PE2142
+72542E1Y398097E213753PE1Y39932PE2132518E1Y398097E2127506E1Y39932PE212249
+723E1Y398097E211748PE1Y39932PE2107457Y398097E1Y39932PE2102445E1Y398097E2
+7297434E1Y39932PE292421E1Y398097E287409E1Y39932PE282397E1Y398097E277385E
+721Y39932PE272373E1Y398097E267361E1Y39932PE257337Y398097E1Y39932PE252325
+72E1Y398097E247313E1Y39932PE242301E1Y398097E237289E1Y39932PE232276E1Y398
+72097E227264E1Y39932PE222252E1Y398097E21724PE1Y39932PE2463315Y40286PE142
+72322P405285E138312P398962E1343024Y465947E1302928E126283PE1222736E118264
+72PE1142542E1102445E162349E122252Y4741QE2343024Y465947E44E2302928E47E226
+72283PE47E2222736E47E218264PE47E2142542E47E2102445E47E262349E47E222252Y4
+14741QE47B6235
+03*
+04B2
+
diff --git a/dviware/ln03/rmcs/test.six b/dviware/ln03/rmcs/test.six
new file mode 100644
index 0000000000..4c467d52b2
--- /dev/null
+++ b/dviware/ln03/rmcs/test.six
@@ -0,0 +1,129 @@
+[7 IP0;0;1q"1;1
+-
+-
+-
+-
+!9_!4?!8_!8?_!9?!8_!11?__!5?!5_!6?__!12?!7_!17?!9_!4?!9_???!9_!4?!9_!5?!7_!4?!9_!4?__!5?_!9?_!7?__!12?!7_!4?!9_!17?!9_!5?!7_!4?!9_!16?!9_!4?__!6?_!16?!9_!4?__!6?_!18?!7_!4?!9_!8?_!9?!7_!6?!5_!6?__!12?!7_!22?__!19?!7_!4?!9_!4?!9_!18?!7_!4?!9_!46?_!16?_???!9
+_!16?!9_!4?__!12?!7_!4?!9_!33?_!21?!9_!7?_!11?_!34?!9_!4?__!6?_!16?!9_!6?!5_!5?!9_!4?!8_!21?_!22?!7_!4?!9_!18?!7_!4?!9_!29?!9_!29?__!12?!7_!6?!5_!7?!8_!4?!9_!16?!9_!4?!9_???__!6?_!4?!8_!17?!9_!5?!7_!6?!7_!18?!7_!12?__-
+!4B~~BBB???@~~!4br~~!5?w~nn~w!4?}~~!6BFB??~~~ow{]NFB!5?B~~~B!5?~~~}{o_?~~~??}~~BBbbbfb!15?~~!6b~~r??~~!8b??~~!6br~~??~~!8b???}~F!5B~~??~~!6br~~??~~~N][]N~~~!5?w~n~w!4?~~~}{o_??~~~?}~~!5BFB??~~~!7b!16?~~~!7b??{}~F!5B~~{?~~~!5b~~~!15?!4B~~~BB???@FN}{ow}NF@!6
+?_ow{]M??~~~!5br~~[?@FN}{ow}NF@!14?[]~v!4bBFB??~~~!5b~~~!5?w~n~w!4?{}~F!5BFB!5?B~~~B!5?~~~}{o_?~~~?{}~FB!4bfB???!9w???_ow{}n~~~_!15?AFFBBBbr~~[?^~~!6zr_??~~~!7b!4?___{{{___??{}~FBbrz~~~{?^~~!6zr_??oowwoowwo_!15?@~~?ooo?~~@!5?w~n~w!4?@N~w!4?w~N@?~~~!7b???~~
+~!9?~~~!7b???~~~}{o_?~~~??}~~BBbbbfb???!4B~~~BB???~~~!5_~~~???!9w!5?A~~B!19?^~!6zrb!5?A~~B!8?AF~~!7?oowwoowwo_!16?BBB~~!4B???@FN}{ow}NF@!14?~~!8b!6?B~~BB!4?~~!6br~~??~~!5br~~???!9w!6?A~~B!18?{}FFBbrz~~~??~~!8b!4?___{{!4_??{}FFBbrz~~~??^~!7zr_??@~~?ooo?~~@!
+14?~~!6b~~r??Owo_??_owo!15?~~N}{o_?~~???}~F!5B~~!5?B~~BB!5?]~v!5bBFB??~~!8b!16?BBB~~!4B???~~!8b??~~FN][[]N~~??~~!5br~~!4?!9w??^~!7zr_??}~FBbrz~~~??{}FFBbrz~~~!15?}~FBbrz~~~??~~?_ow{]NFB-
+!4?~~!7?~~FN^~zp_???w~N!4BN~w??~~~!5_owo??~~~FN]{wo_!5?_~~~_!5?~~~?@FN}~~~??~~~__bbr~~!15?~~!6B@@???~~!8b??~~BBFN^~xp_??~~!8B???~~o!4_o~~??~~BBFN^~xp_??~~~!5?~~~???w~NBBBN~w??~~~?@FN}{~~~?~~~!4_owo??~~~!7b!16?~~~!7B??^~~o!4_o~~^?~~~FN^~zp`!20?~~~!6?ow}NFN}
+{o_??G[]NFB@!5?~~~BFN^~xp_???ow}NFN}{o_!15?_or!4bv~}[?~~~!5B@@!4?w~NBBBN~w??^~~o!4_owo!5?_~~~_!5?~~~?@FN}~~~?^~~o_bbbr~~^??!9M!4?!5B~~~B!6?owwwoo???_ow{}nfb`_???_oo!4_o~~^?~~~!7b!4?BBB^^^BBB??^~~}nfb`o~~^?_oo!5_o~~^?~~~?~~~?~~~!15?@~~~F~~~@!4?w~NBBBN~w!4?@
+N~ww~N@???~~~!7b???~~~!7_??~~~!7b???~~~?@FN}~~~??~~~__bbr~~^!6?~~~!5?~~~!5B~~~???!9M!6?~~!11?owww!5?_oo!4_o~~!6?~~!11?~~!7?~~@?~~@?~~!19?~~!8?ow}NFN}{o_!14?~~!8b!6?_~~__!4?~~BBFN^~xp_??~~!6B@!4?!9M!7?~~!11?owww!4?^~{}nfb`o~~??~~!8b!4?BBB^^!4B??^~{}nfb`o~~?
+?_oo!5_~~p???@~~~F~~~@!15?~~BFN^~zp`???_ox~^N^zp_!15?~~??@FN}~~_??~~o!4_o~~!5?_~~__!5?_op!5b~~u??~~!8b!19?~~!7?~~!8b??~~!7?~~??~~!6B@!5?!9M??_oo!5_o~~??~~}nfb`o~~??^~{}nfb`o~~!6?owww!5?~~}nfb`o~~??~~FFFN]{wo_-
+!4?@@!7?@@!4?@B@??@@@!6?@@@??@!6B@@???@@@!4?@B@!5?!5B!5?@@@!5?@@@???@!6B@!16?@@!11?@!9B??@@!6?@B@??@@!12?@!6B@???@@!6?@B@??@@@!5?@@@??@@@!5?@@@?@@@!5?!4@??@!6B@???@!9B!16?@@@!11?@!6B@???@@@!4?@B@!20?@@@!5?@@@!5?@@@!14?@@@!5?@B@??@@@!5?@@@!16?@!5B@@???@@@!1
+0?@@@!5?@@@???@!5B@@!6?!5B!5?@@@!5?@@@???@!5B@@!22?@@@!7?@BBB@@!4?!9B!4?@!6B@???@!9B!17?@!6B@!4?@!6B@@???@@@?@@@?@@@!16?@@@?@@@!4?@@@!5?@@@!5?!4@!5?@!9B???@!9B??@!9B???@@@!5?@@@???@!6B@!8?@@@!5?@@@!5?@@@!18?@@!11?@BBB!6?@!6B@!7?@@!11?@@!7?@@??@@??@@!19?@@!
+7?@@@!5?@@@!14?@!9B!6?!5B!4?@@!6?@B@??@@!27?@@!11?@BBB!6?@!6B@???@!9B!17?@!5B@@!4?@!6B@@!5?@@@?@@@!16?@@!5?@B@!4?@@!5?@@!15?@@!6?@@@???@!6B@!6?!5B!6?@!6B@@???@!9B!19?@@!7?@!9B??@@!7?@@??@@!24?@!6B@@!4?@!6B@!5?@!6B@!7?@BBB!6?@!6B@???@@!6?@B@-
+{{!5[{{w!31?www!31?ow{!6[{w??w{{!5[{w!6?!4w!5?ow{!6[{w!5?[{{[[!4?wwwo!5?ww??ow{!5[{w!15?ow{!4[{{{w!14?w{{!7[???ow{!4[{{{w_!16?www!32?www!18?www!27?w{{!5[{{w!31?www!31?ow{!6[{w!6?www!8?[{{{[!5?wwwo!4?www!27?Ow{!5[{w_!14?ow{!4[{{{w_!14?!4[{{{[[!7?www!6?w{{!5
+[{w_?_ow{!5[{w??w{{!7[!4?[[[{{{[[[!15?Gww!5?wwG??w{{!7[??www!23?Ow{!5[{w_?_ow{!4[{{w_?ow{!4[{{{w!14?_ow{!4[{{w_!21?_o_!29?[[[{{!4[!6?!4w!5?w{!6[{{w??ow{!5[{w??w{!8[!4?[[[{{!4[!15?w{!7[{w??ow{!5[{w??_ow{!5[{w!27?w{!8[???ow{!4[{{{w!14?_ow{!4[{{w!16?_ow{{{wo_
+???Ow{!5[{w!15?Gww!5?wwG!4?[[{{[!5?wwwo!4?ww???w{!6[{w??_ow{!5[{w??Gww!5?wwG!27?Ow{!5[{{w??Ow{!5[{w!15?ow{!4[{{{w!27?w{!6[{w???ow{!5[{w!6?www!13?_o_??w{!8[???w{!7[{w!14?Gww!6?wwG?w{!8[!6?[{{[[!4?_ow{!5[{w??ww!6?ww!4?[[[{{!4[!5?[[{{[!5?wwwo!4?ww???ow{!5[{w!
+15?ow{!4[{{{w!14?_ow{!4[{{w??ow{!4[{{{w??w{!8[??_ow{!4[{{w-
+~~!4{[NNF??CM]{wow[ME!17?w~^\^~w!4?{}~!4v~}{w!14?FN^!5[wwo??~~~!4[]NF!4?w~^\\^~w???~~!15?~~!6?~~@FN}wo?~~??~~???[[[{{!4?!9v??~~ow{]NFB~~!14?B!7FM}{w?~~~w{]NFB~~~!16?~~~!7?{}~FFF~~}!4?}}~M}}~M}{w?~~~!5FM}{w?{}~!5F~~~??{}~FFF~~}!16?~~~!4{[NNF??CM]{wow[ME!17?
+w~^\^~w!4?{}~!4v~}{w!14?~~~??[[[{{w!4?w~^\^~w!7?~~~!6?~~~FN}wo~~~???!9v!19?_ow[NFB!14?~~~w{]NFB~~~!18?~~~!7?w~^\^~w!4?~~~!4{]NFB?~~~???[[[{{w?~~~!7[!7?~~~!19?@N~w?w~N@???~~~!7[??~~~!11?!9v!7?_ow[NFB?~~~ow{]NF~~~?~~~w{]NF~~~!14?~~~ow{]NF~~~?}}~M}}~E}}{???_o
+w{]NFB@???S}~!4vff!20?~~!8?w~^\\^~w???~~[!4{[NNE??~~???[[[{{??~~!8[!7?~~!19?~~[[!4{MNF??~~!10?BFM]!4[{wo???!9v!15?B!7FM}{??~~ow{]NFB~~!14?~~_ow{]NF~~??}}NM}{MNM}{??@BB@~~?@BB!7?_ow[NF!16?N~w}}}w~N!7?~~!6?~~@FN}wo~~???~~!6?~~??~~!7?~~???N~w}}}w~N!4?!9v!20?[
+[[~~u!6?_ow[NF!15?~~ow{]NF~~???S}~!5vfF!15?~~!6?~~???~~!6?~~!4?w~^\^~w!5?_ow{]NFB@??~~!8[???~~!7?~~!15?N~w_}}}w~N??~~!8[!7?~~!6?~~!4?[[[{{??~~!6[~~!7?~~!11?~~!6?~~@FN}wo~~???~~???[[[{{???!9v???~~ow{]NF~~!15?~~_ow{]NF~~??~~ow{]NF~~???B!6FN}{??~~_ow{]NF~~-
+NN?@BFN]K???G[MFBBFN]K!15?GNN@???@NNG??FN^!5\@@!15?CM]!5[^NF??NNN!9?GNN@!4?@NNG?FN]!6[ME!5?[^^[[!4?NN!4?@FNNN??FN]!5[NF!4?!9@??FN^\!5[NF!6?M^^^M!4?CM]!5[NFB?FN^\!5[NFB!16?FN^[[[!4?FN^[[[^NN]K??NNN?NNN?NNN?N^^!6[NFB?FN^!5[^^N??FN^[[[NN^K!15?NNN?@BFN]K???G[M
+FBBFN]K!15?GNN@???@NNG??FN^!5\@@!15?FN^!5[^NF??GNN@???@NNG!4?[^^^[!5?NNN???@FNNN???!9@!15?G[]^^\!4[!7?M^^^M???FN^\!5[NFB!18?NNN!5?GNN@???@NNG??NNN?@BFN]K??BFN]!5[NFB?N^^!7[!7?NNN!21?@NNN@!5?N^^!7[??N^^!7[!4?!9@???G[]^^\!4[??BFN^\!4[NFB?FN^\!4[^NF!6?M^^^M??
+?BFN^\!4[NFB?NNN?NNN?NNN??@BB@!9?[[!5\^NF!19?NN!6?GNN@!4?@NNG?NN??@BFN]K???FN]!5[NF??N^!8[!7?NN!19?NN???@BFN]K??FN]!5[ME???CM]!5[NF???!9@!16?CM]!5[NF??FN^\!5[NF!6?M^^^!4?BFN^\!4[NF??NN??NN???NN!6?NN!7?[[]^^\[[[!18?NNN?NNN!6?[[^^[!5?NN!4?@FNNG??N^!6[NF??BFM
+]!5[NF!4?NNN?NNN!5?!9@!15?CM]!5[^NE??G[]^^\!4[!6?M^^^M!4?FN^\!4[^NE???[!5\^NF!15?N^!6[NF???FN]!5[NF??GNN@???@NNG??@BB@!8?NN!11?N^!7[NF!16?!4N?NNN???N^!8[!6?[^^[[!4?BFM]!5[NF??NN!6?NN!7?NN!9?[[^^[!5?NN!4?@FNNG??FN]!5[NF???!9@???FN^\!4[^NE!6?M^^^!4?BFN^\!4[N
+F??FN^\!4[^NE??CM]!5[NF??BFN^\!4[NF-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+!1342?_ow{]K-
+!1336?_ow{]NFB@-
+!1326?___{{ow{}NFB@-
+!1322?__ow~!4^!4B-
+!1314?_oww{]MFFB@@!11?___{{!4_-
+!1310?CMNFBB@!20?BBB~~!4B-
+!1340?___}}!4_-
+!1340?BBB^^!4B-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+!181?!4M}}MMM!1256?{}!5M]{w-
+!164?_oo_oo?_oo!11?~~!6?AFN}{w{}NF!1226?_oo_oo?_oo!7?~~M]}}}mFB???AFN}{w{}NF-
+!165?|!7~|!11?NN!6?CMNFB@BFNM!1227?|!7~|[{wo???NN???@BFNM???CMNFB@BFNM-
+!164?@BB@BB?@BB!1255?@BB@^~wprz{{~~[[wo-
+!1435?@B^~zrx{}}~^MM[{w-
+!1439?@@N^|xww{~~~^FM}{-
+!1445?FFM{w{}~^^NFn}{__-
+!1450?FN][{}^^NFbb~~e__-
+!1454?BFN]}~^^NNFbr~}oo_-
+!1458?BFNM}}nnFFbpr~~ooo_-
+!1463?@BFN~~nNFB@`~~-
+!1467?@B!6FB@-
+\
diff --git a/dviware/ln03/rmcs/test.tex b/dviware/ln03/rmcs/test.tex
new file mode 100644
index 0000000000..cf9bd62bf4
--- /dev/null
+++ b/dviware/ln03/rmcs/test.tex
@@ -0,0 +1,12 @@
+\documentstyle[graphics,a4wide]{report}
+\nofiles
+\begin{document}
+
+text before graph
+
+\setlength{\unitlength}{1mm}\rule{1in}{0.4pt}
+\gino(150,100){TEST.SIX}
+
+text after graph
+
+\end{document}
diff --git a/dviware/ln03/rmcs/texprint.com b/dviware/ln03/rmcs/texprint.com
new file mode 100644
index 0000000000..d010e77947
--- /dev/null
+++ b/dviware/ln03/rmcs/texprint.com
@@ -0,0 +1,144 @@
+$!- TEXPRINT.COM ---------------------------------------------------------------
+$! ~~~~~~~~~~~~
+$! Command file to print a file to the laser printer queue designated by
+$! P1.
+$!
+$! This command procedure is invoked by the user typing TEXPRINT followed
+$! by the name(s) of the file(s) to be printed. The login procedures
+$! executed by users of TeX/LaTeX should arrange to define the DCL symbol
+$! TEXPRINT thus:
+$! $ TEXP*rint :== @TEX_COM:TEXPRINT devname
+$! where devname is the name of the output device's queue; as published,
+$! this procedure assumes that the full name of the queue is given by
+$! devname+"$LASER"
+$!
+$! Parameters:
+$!
+$! P1 (required) The name of the queue to be used for printing
+$! P2 (required) Name of file(s) to be printed and/or optional
+$! qualifiers. If this consists of qualifiers,
+$! they are placed globally, and the filename must
+$! follow in P3... Multiple file names should be
+$! separated by commas
+$! P3-P8 (optional) Further optional qualifiers, which will be
+$! appended to the last filename used.
+$!------------------------------------------------------------------------------
+$!
+$! Ensure printer queue specified
+$!
+$ SAY := WRITE SYS$OUTPUT
+$ IF P1 .EQS. ""
+$ THEN
+$ SAY "%TEXPRINT-F-NOQUEUE, No laser printer queue specified"
+$ EXIT %X10000004
+$ ENDIF
+$ queue_name = P1 + "$LASER"
+$ xxx = F$GETQUI("DISPLAY_QUEUE","QUEUE_STATUS",queue_name)
+$ IF xxx .EQS. ""
+$ THEN
+$ SAY "%TEXPRINT-F-BADQUEUE, No such queue ''queue_name'"
+$ EXIT %X10000004
+$ ENDIF
+$!
+$! Ensure file name specified
+$!
+$Get_Name:
+$ IF P2 .EQS. ""
+$ THEN
+$ INQUIRE P2 "_File name"
+$ GOTO Get_Name
+$ ENDIF
+$!
+$! Extract leading qualifier or single filename from P2...
+$!
+$ param_ctr = 2
+$ had_name = "FALSE"
+$ global_qual = ""
+$ file_list = ""
+$ related_spec = ".LN3"
+$ had_warning = "FALSE"
+$Next_Param:
+$ next_par = F$EDIT(P'param_ctr,"TRIM,UPCASE")
+$ first_part = F$ELEMENT(0,",",next_par)
+$ following = F$ELEMENT(1,",",next_par) .NES. ","
+$!
+$! If Pn starts with a "/", it must be a global qualifier, if we haven't
+$! yet had any file names, or a trailing qualifier after the last file.
+$!
+$ IF F$EXTRACT(0,1,first_part) .EQS. "/"
+$ THEN
+$ IF had_name
+$ THEN
+$ file_list = file_list + next_par
+$ param_ctr = param_ctr + 1
+$ IF param_ctr .GT. 8 THEN $ GOTO Print_It
+$ GOTO Next_Param
+$ ENDIF
+$ global_qual = global_qual + next_par
+$ param_ctr = param_ctr + 1
+$ IF param_ctr .GT. 8
+$ THEN
+$ SAY "%TEXPRINT-E-NOFILES, No files selected for printing"
+$ EXIT %X10000002
+$ ENDIF
+$ GOTO Next_Param
+$ ENDIF
+$!
+$! Otherwise, what's in first_part is a filename, with an optional trailing
+$! qualifier (local to that file).
+$!
+$ IF had_name
+$ THEN
+$ SAY "%TEXPRINT-W-PARAMS, Too many parameters \''next_par'\"
+$ had_warning = "TRUE"
+$ param_ctr = param_ctr + 1
+$ IF param_ctr .GT. 8 THEN $ GOTO Print_It
+$ GOTO Next_Param
+$ ENDIF
+$!
+$! Extract file name preceding any local qualifiers, and default to .LN3
+$!
+$ elem_ctr = 1
+$Next_Element:
+$ file_name = F$ELEMENT(0,"/",first_part)
+$ first_part = first_part - file_name
+$ next_file = F$PARSE(file_name,,related_spec,,"SYNTAX_ONLY")
+$ IF F$SEARCH(next_file) .EQS. ""
+$ THEN
+$ SAY "%TEXPRINT-W-NOSUCHFILE, Couldn't find file ''next_file'"
+$ had_warning = "TRUE"
+$ ELSE
+$ had_name = "TRUE"
+$ IF file_list .NES. "" THEN $ file_list = file_list + ","
+$ file_list = file_list + next_file + first_part
+$ related_spec = next_file
+$ ENDIF
+$!
+$! Now go back for next element of next_par, if applicable
+$!
+$ IF .NOT. following then $ GOTO Print_It
+$ first_part = F$ELEMENT(elem_ctr,",",next_par)
+$ elem_ctr = elem_ctr + 1
+$ following = F$ELEMENT(elem_ctr,",",next_par) .NES. ","
+$ GOTO Next_Element
+$!
+$! We've got everything required to execute the print command
+$!
+$Print_It:
+$ IF .NOT. had_name
+$ THEN
+$ SAY "%TEXPRINT-F-CREJOB, error creating job"
+$ SAY "-JBC-E-EMPTYJOB, no files specified in job request"
+$ EXIT %X10000004
+$ ENDIF
+$!
+$! The queue itself decides whether we print a flag page or not
+$!
+$ PRINT/QUEUE='P1'$LASER/FORM=PLOT$FORM/NOHEADER/NOFEED -
+ 'global_qual' 'file_list'
+$ print_stat = $STATUS
+$ IF .NOT. print_stat THEN $ EXIT print_stat
+$ IF had_warning THEN $ EXIT %X10000000
+$ EXIT %X10000001
+$!
+$!- END OF TEXPRINT.COM --------------------------------------------------------
diff --git a/dviware/ln03/rose/clink.opt b/dviware/ln03/rose/clink.opt
new file mode 100644
index 0000000000..a01884977f
--- /dev/null
+++ b/dviware/ln03/rose/clink.opt
@@ -0,0 +1 @@
+sys$share:vaxcrtl/share
diff --git a/dviware/ln03/rose/dvi2ln3.c b/dviware/ln03/rose/dvi2ln3.c
new file mode 100644
index 0000000000..56765ef36d
--- /dev/null
+++ b/dviware/ln03/rose/dvi2ln3.c
@@ -0,0 +1,1654 @@
+/* Dvi2ln3 translates a TeX DVI file to an LN03 format file.
+
+Dvi2ln3 is still being developed. Copyright (c) 1985, 1986 by Digital
+Equipment Corporation, Maynard, Massachusetts, USA. Author: Flavio Rose,
+...!decwrl!dec-rhea!dec-dvinci!rose.
+
+Dvi2ln3 is based on the publicly-available program DVItype, written by
+David R. Fuchs of Stanford University; and also on earlier DEC programs,
+Dvi2lng, Topp and LN03Topp, for the LN01 and LN03 laser printers. This
+program is not a DEC product and is not guaranteed to work.
+
+Dvi2ln3 is written in VAX C. Specific VAX and VMS dependencies have
+generally been avoided, however. The reader may find them by searching for
+the strings VAX and VMS in this file.
+
+During development, double square brackets [[ ]] in a comment indicate some
+places where the code needs to be improved.
+
+[[Among the useful things that still need to be done: differentiating
+between int and long variables so this can be ported more easily to 16-bit
+architectures; testing to see if malloc returns 0; a \special for ROM
+fonts.]]
+
+Development history:
+
+Feb. 85: Did some early work on Dvi2ln3, translating bits and pieces
+ of Dvi2lng. Concluded, however, that it was better to translate
+ LN03Topp and Dvi2lng into C first. The reason for this is that code
+ which mimics an existing program is easier to write and to test.
+
+5/15/85: At this date, the old LN03Topp program has been successfully
+ translated into C (except for the ability to read files over
+ DECnet). At this point, did some further cleanup of the Dvi2ln3
+ source.
+
+ 6/4/85: Coding of Dvi2ln3 begins in earnest. Merging bits and
+ pieces from various places. Chucking chunks and all that
+ junk from LN03Topp; pass2 is just straightforward translation.
+
+6/22/85: Cleanup after initial debugging. Ready to distribute.
+
+10/8/85: Adding \special's to imitate Textset's DVIAPS program.
+ Corrected bug in parsing of \specials. Version 1.
+
+10/15/85: More changes for specials. Version 2.
+
+11/8/85: Fixed bug in ln03:defpoint \special. Version 3.
+
+11/15/85: Changed way information about font size is passed back
+ by add_txf_to_lnf. Add PXL-reading capability. Version 4.
+
+11/21/85: Error handling has been reformed. Still version 4.
+
+12/12/85: Bug correction in handling of plotfile special. Version 5.
+
+1/7/86: Clear all fonts from memory at beginning of document. Version 6.
+
+1/16/86: Fixed bug in dvi2ln3nft.c, nftf was not being closed after use.
+ Version 7. (Bug found by Mark DeVries.)
+
+3/4/86: Support for landscape added -- very easy, if only I had
+ known. Fixed bug found by Mark DeVries, error returned
+ if \special selects device other than LN03. Version 8.
+
+3/28/86: Conditionalization for Ultrix. #ifndef vms ==
+ #ifdef ultrix. Still emits 8-bit characters. Should be
+ unchanged under VMS. getenv is used to replace
+ logicals. Version 9.
+
+4/4/86: Added support for 7-bit only environments,
+ conditionalized on the SEVENBIT symbol. Still version 9.
+
+4/16/86: Final changes to make compilation under Ultrix
+ clean. Still version 9.
+
+*/
+
+#ifdef vms
+#include stdio
+#include ctype
+#else
+#include <stdio.h>
+#include <ctype.h>
+#endif
+
+/* Ultrix seems to want this: */
+
+#ifndef vms
+char *strchr(), *malloc(), *getenv();
+#define SEVENBIT 1
+#endif
+
+/* In VMS, we declare all global variables to be globaldef.
+This is not really necessary, just an old habit from working
+with other VMS languages. It's done with #define's, so it
+may easily be undone when porting the program to other
+systems. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+
+/* Here begins a long list of global variables. */
+
+/* hoff is the horizontal offset in pixels to be added to all dimensions
+read in; voff is the corresponding vertical offset. */
+
+GLOBAL int hoff, voff;
+GLOBAL FILE *dvifile,*tfmfile,*outfile;
+
+/* Each page in a DVI file is identified by ten longwords, which appear
+immediately after each bop (beginning of page) command. Dvi2ln3, like
+DVItype, supports certain options that allow one to print only selected
+pages. The following variables are used for this purpose.
+
+Num_pages is a count of how many pages have been passed to the output.
+Max_pages is the user-specified maximum number of pages to pass.
+How_many_counts denotes the number of identifying longwords to take into
+account when searching for the user-specified starting page. The user
+specifies the starting page as the first one whose identifying longwords
+match certain specified values, stored in start_page. However, identifying
+longword i is only required to match the value in start_page[i] if
+use_count[i] is nonzero. */
+
+GLOBAL long int num_pages,max_pages;
+GLOBAL int how_many_counts,use_count[10];
+GLOBAL long int start_page[10];
+
+/* When the output file can have no characters with code >
+127, the user should employ a dvi2ln3 which is recompiled
+with the symbol SEVENBIT defined. Such a dvi2ln3 will run slower
+than one which is allowed eight bits, and produce larger
+output files. */
+
+#ifdef SEVENBIT
+GLOBAL int right7;
+#endif
+
+/* FILESPECLEN is the maximum size of a file specification under VMS.
+[[Perhaps arrays of fixed size should not be used, but rather malloc should
+be employed...]] */
+
+#define FILESPECLEN 252
+
+/* landscape says whether we are printing in landscape or portrait. */
+
+GLOBAL char landscape;
+
+/* The main routine deals with the command line arguments, opens the dvi
+file, and then calls various other routines to handle the "passes". There
+are two passes, each of which involves reading the DVI file from start to
+finish; in between, the font load is constructed. */
+
+main(argc,argv)
+int argc;
+char *argv[];
+{
+ int status,i,jnam,jext;
+ char infnam[FILESPECLEN];
+
+ if (argc < 2) { printf("\n Usage: Dvi2ln3 <filename> <options>");
+ goto exit_label; }
+
+ printf("\n Dvi2ln3 9");
+
+/* [[The following could bomb if argv[1] is longer than FILESPECLEN
+characters. Sigh.]] */
+
+ strcpy(infnam,argv[1]);
+
+/* The extension of the input file defaults to .dvi. Locate the filename
+field within the filespec parameter, set jname to point to beginning, jext
+to point to one place after end. [[This code is of course dependent on the
+VMS filespec syntax.]] */
+
+ find_filename(infnam,&jnam,&jext);
+ if (infnam[jext] == '\0') strcat(infnam,".dvi");
+ dvifile = fopen(infnam,"r");
+ if (dvifile == NULL) { printf("\n Couldn't open dvi file");
+ goto exit_label; }
+
+/* Now decipher the options off the command line. */
+
+#ifdef SEVENBIT
+ right7 = 0;
+#endif
+ max_pages = 1000000000;
+ how_many_counts = 0;
+ hoff = 300;
+ voff = 300;
+ landscape = 0;
+ for (i=2; i<argc; i++) command_line_options(argv[i]);
+
+/* Now do the passes */
+
+ status = pass1();
+ if (status != 0) goto exit_label;
+#ifdef vms
+ if (rewind(dvifile) == -1) {
+ printf("\n Couldn't rewind dvi file.");
+ goto exit_label;
+ }
+#else
+ rewind(dvifile);
+#endif
+
+ status = open_output_file(infnam,jnam,jext,".ln3");
+ if (status != 0) { printf("\n Couldn't open output file");
+ goto exit_label; }
+
+ status = make_font_load();
+ if (status != 0) goto exit_label;
+
+ pass2();
+
+ fprintf(outfile,"\033c");
+ fclose(dvifile);
+ fclose(outfile);
+
+exit_label:
+#ifndef vms
+ printf("\n");
+#endif
+ ;
+}
+
+/* Find_filename finds the filename part of a filespec
+passed in s, returning the index of the first character in
+*ns, and the index of the character after the last in *ne.
+[[This works under VMS and Unix. MS-DOS still needs work.]]
+*/
+
+int find_filename(s,ns,ne)
+char s[];
+int *ns,*ne;
+{
+ int jnam,jext,j,slen;
+
+ slen = strlen(s);
+ jnam = 0;
+ for (j = slen-1; j >= 0; j--) {
+#ifdef vms
+ if (s[j] == ':' || s[j] == ']' ||
+ s[j] == '>') {
+#else
+ if (s[j] == '/') {
+#endif
+ jnam = j+1;
+ break;
+ }
+ }
+
+ jext = slen;
+ for (j = jnam; j < slen; j++) {
+#ifdef vms
+ if (s[j] == '.' || s[j] == ';') {
+#else
+ if (s[j] == '.') {
+#endif
+ jext = j;
+ break;
+ }
+ }
+
+ *ns = jnam;
+ *ne = jext;
+}
+
+/* ERROR HANDLING: Errors should be reported as close to the
+source as possible, so that the maximum amount of
+information is available to the user to identify the error.
+
+Errors in the format of DVI or TFM files are not reported
+specifically, since there exist programs, DVItype and
+TFtoPL, which diagnose errors in such files. This program
+accepts some incorrect DVI files, for example, those with a
+bad postamble or bad backpointers. [[However, someday we may
+rewrite the program to select pages by using these features
+of the DVI format, rather than by skipping unwanted pages.]]
+*/
+
+GLOBAL char *bad_DVI_message = "\nBad DVI file - check it with DVItype";
+
+/* Command_line_options reads and processes options off the
+string t. At this time, four options are supported.
+
+The N option sets the maximum number of pages to be printed.
+Its syntax is /N=<integer> .
+
+The H option modifies the default horizontal offset.
+
+The V option modifies the default vertical offset.
+
+The S option has syntax /S=<pagespec>{.<pagespec>}* where the {}* denotes
+repetition, and a <pagespec> is either an integer or * to indicate any
+value. An example would be "/S=*.8.3".
+
+The meaning of the S option is as follows: In a DVI file, pages are
+identified by ten longword values which follow each bop (beginning of page)
+command. The value of the S option indicates which page to start printing
+on. For example, "*.8.3" means start printing at the first page whose
+second identifying longword is 8 and third is 3.
+
+The L option says print in landscape.
+
+[[Is a European option needed?]] */
+
+int command_line_options(t)
+char *t;
+{
+ long int i,k;
+ char *u;
+
+ while ((t = strchr(t,'/')) != 0) {
+ t++;
+ if (toupper(t[0]) == 'N' && t[1] == '='
+ && (sscanf(&t[2],"%ld",&k) == 1))
+ max_pages = k;
+ if (toupper(t[0]) == 'H' && t[1] == '='
+ && (sscanf(&t[2],"%ld",&k) == 1))
+ hoff = k;
+ if (toupper(t[0]) == 'V' && t[1] == '='
+ && (sscanf(&t[2],"%ld",&k) == 1))
+ voff = k;
+ if (toupper(t[0]) == 'L') landscape = 1;
+ else if (toupper(t[0]) == 'S' && t[1] == '=') {
+ t += 2;
+ how_many_counts = 0;
+ for (;;) {
+ if (t[0] == '*') {
+ use_count[how_many_counts] = 0;
+ how_many_counts++;
+ }
+ else if (sscanf(t,"%ld",&k) != 0) {
+ use_count[how_many_counts] = 1;
+ start_page[how_many_counts] = k;
+ how_many_counts++;
+ } else break;
+ u = strchr(t,'.');
+ if (u == 0) break;
+ t = &u[1];
+ }
+ }
+ }
+}
+
+/* Open_output_file opens one of the output files, using the file pointer
+outfile. The name of the output file is obtained by appending the string
+ext to the substring of infnam beginning at jnam and ending at jext.
+
+[[This code contains a VMS dependency. We use creat followed by fdopen to
+open the file as a normal VMS file ("rat=cr","rfm=var") rather than a
+STREAM_LF file. Beginning with VAX C V2.0, this can be done by just calling
+fopen.]] */
+
+int open_output_file(infnam,jnam,jext,ext)
+char *infnam,*ext;
+int jnam,jext;
+{
+ char outfnam[FILESPECLEN];
+ int jj;
+
+ strcpy(outfnam,&infnam[jnam]);
+ strcpy(&outfnam[jext-jnam],ext);
+
+#ifdef vms
+ jj = creat(outfnam,0,"rat=cr","rfm=var");
+#else
+ jj = creat(outfnam,0700);
+#endif
+ if (jj == -1) return(1);
+ outfile = fdopen(jj,"w");
+ if (outfile == NULL) return(1);
+
+ return(0);
+}
+
+/* Bytes are read one by one from the DVI file using getc. We use an
+overlay, as suggested in the DVItype documentation, to combine these bytes
+into larger integers. [[Note that this technique relies on the fact that
+numbers on the VAX are stored with the least significant byte first. The
+macros below would have to be changed if the program were to be ported to a
+machine architecture for which this is not so.]]
+
+[[The use of getc is expensive, since getc is a function in VAX C V2.0.
+Eventually, one would want to rewrite these macros to work like the old
+getc macro.]] */
+
+GLOBAL union lc { long int l; unsigned long int ul; char c[4];
+ unsigned char uc[4]; } lcx;
+
+#define two_bytes_u lcx.uc[1] = getc(dvifile); \
+ lcx.uc[0] = getc(dvifile); lcx.uc[2] = 0; lcx.uc[3] = 0
+
+#define two_bytes_s lcx.c[1] = getc(dvifile); \
+ lcx.c[0] = getc(dvifile); \
+ if (lcx.c[1] >= 0) { lcx.uc[2] = 0; lcx.uc[3] = 0 ;} \
+ else { lcx.uc[2] = 255; lcx.uc[3] = 255; }
+
+#define three_bytes_u lcx.uc[3] = getc(dvifile); lcx.uc[1] = getc(dvifile); \
+ lcx.uc[0] = getc(dvifile); lcx.uc[2] = 0
+
+#define three_bytes_s lcx.c[2] = getc(dvifile); lcx.c[1] = getc(dvifile); \
+ lcx.c[0] = getc(dvifile); \
+ lcx.uc[3] = (lcx.c[2] >= 0) ? 0 : 255;
+
+#define four_bytes lcx.c[3] = getc(dvifile); \
+ lcx.c[2] = getc(dvifile); lcx.c[1] = getc(dvifile); \
+ lcx.c[0] = getc(dvifile);
+
+/* Knuth's programs like to hardcode fixed maximum sizes for various
+things, for example, the maximum number of fonts allowed in a DVI file. In
+general, it is preferable to use the C function malloc to allocate storage
+as needed. That is what we generally do in this Dvi2ln3, but there are some
+residues of the Knuthian approach, like MAXTEXFONTS below. By the way, we
+never attempt to return any storage to the system.
+
+[[Eventually, it would be better to get rid of MAXTEXFONTS and use a linked
+list of records instead. There would be no cpu time penalty to using a
+linked list, because the function set_curf below does a linear search
+through the font array anyway.]]
+
+Txf is a data structure describing a TeX font. */
+
+#define MAXTEXFONTS 100
+
+struct txf { unsigned char chu[256]; int bc, ec; long int space, design_size,
+ scaled_size; int nchs; };
+
+GLOBAL struct txf *txfa[MAXTEXFONTS+1];
+
+/* Font_name points to strings containing TeX font names. Those strings are
+created with malloc as needed. */
+
+GLOBAL char *font_name[MAXTEXFONTS+1];
+
+/* Font width information needs to be read from TFM files. TFM is a special
+format defined by TeX. Dvi2ln3 stores each width in a longword. DVItype
+tries to save space by a two-level width storage method. We just allocate
+an array of widths for each font with malloc.
+
+[[We don't check that font checksums match in Dvi2ln3, because there are a
+lot of slightly obsolete TFMs floating around which would result in a
+checksum error, but seem to give perfectly reasonable formatted output
+nonetheless.]] */
+
+GLOBAL long int *font_width[MAXTEXFONTS+1];
+
+/* TeX fonts are referred to by their internal numbers, which go from 0 to
+nf-1. The DVI file refers to them by external numbers, hence the array
+to_ext used to convert internal numbers to external numbers. Curf is the
+internal font number of the current font in the DVI file. */
+
+GLOBAL int to_ext[MAXTEXFONTS+1],
+ nf,
+ curf;
+
+/* In some switch statements, a lot of cases have to be enumerated. We
+employ the following Knuthian macro for that purpose: */
+
+#define four_cases(_x1) case _x1: case _x1+1: case _x1+2: case _x1+3:
+
+/* We define a lot of constants corresponding to the DVI operation codes.
+These are copied from DVItype. */
+
+#define id_byte 2 /* current version of the dvi format */
+#define set_char_0 0 /* typeset character 0 and move right */
+#define set1 128 /* typeset a character and move right */
+#define set_rule 132 /* typeset a rule and move right */
+#define put1 133 /* typeset a character */
+#define put_rule 137 /* typeset a rule */
+#define nop 138 /* no operation */
+#define bop 139 /* beginning of page */
+#define eop 140 /* ending of page */
+#define push 141 /* save the current positions */
+#define pop 142 /* restore previous positions */
+#define right1 143 /* move right */
+#define w0 147 /* move right by |w| */
+#define w1 148 /* move right and set |w| */
+#define x0 152 /* move right by |x| */
+#define x1 153 /* move right and set |x| */
+#define down1 157 /* move down */
+#define y0 161 /* move down by |y| */
+#define y1 162 /* move down and set |y| */
+#define z0 166 /* move down by |z| */
+#define z1 167 /* move down and set |z| */
+#define fnt_num_0 171 /* set current font to 0 */
+#define fnt1 235 /* set current font */
+#define xxx1 239 /* extension to dvi primitives (\special) */
+#define xxx4 242 /* potentially long extension to dvi primitives */
+#define fnt_def1 243 /* define the meaning of a font number */
+#define pre 247 /* preamble */
+#define post 248 /* postamble beginning */
+#define post_post 249 /* postamble ending */
+#define undefined_command 250
+
+GLOBAL long int mag, num, den;
+GLOBAL float conv, unmag_conv;
+
+/* Read_preamble reads the preamble of the dvi file. The comment is thrown
+away. The format version number is checked. The magnification, numerator,
+and denominator are remembered in the globals mag, num, den. The float
+values conv and unmag_conv serve to convert measurements from DVI units to
+pixels. */
+
+int read_preamble() {
+ unsigned int i;
+ int j;
+
+ i = getc(dvifile);
+ if (i != pre) return(1);
+ i = getc(dvifile);
+ if (i != id_byte) return(1);
+ four_bytes; num = lcx.l;
+ if (num <= 0) return(1);
+ four_bytes; den = lcx.l;
+ if (den <= 0) return(1);
+ four_bytes; mag = lcx.l;
+ if (mag <= 0) return(1);
+
+ unmag_conv = (num/254000.0) * (300.0/den);
+ conv = unmag_conv * (mag/1000.0);
+
+/* Skip over the comment field. */
+
+ i = getc(dvifile);
+ for (j=0; j<i; j++) getc(dvifile);
+ return(0);
+}
+
+/* The dvi file format requires us to keep track of various quantities,
+among them the horizontal and vertical positions h and v, and four values
+referred to simply as x, y, z and w. We also keep pixel-rounded versions
+of h and v, called hh and vv. */
+
+GLOBAL long h, v, x, y, z, w;
+GLOBAL int hh, vv;
+
+/* The following function, copied from DVItype, reads from the DVI file the
+first parameter of the current DVI command. In the case of functions whose
+first parameter is implicit, such as set_char_0 through set_char_127, the
+implicit parameter is returned. */
+
+long first_par(o)
+int o;
+{
+ unsigned int i;
+
+ if ((o >= set_char_0) && (o < set_char_0+128))
+ return(o-set_char_0);
+ if ((o >= fnt_num_0) && (o < fnt_num_0+64))
+ return(o-fnt_num_0);
+ switch (o) {
+ case set1:
+ case put1:
+ case fnt1:
+ case xxx1:
+ case fnt_def1:
+ i = getc(dvifile);
+ return(i);
+ case set1+1:
+ case put1+1:
+ case fnt1+1:
+ case xxx1+1:
+ case fnt_def1+1:
+ two_bytes_u;
+ return(lcx.ul);
+ case set1+2:
+ case put1+2:
+ case fnt1+2:
+ case xxx1+2:
+ case fnt_def1+2:
+ three_bytes_u;
+ return(lcx.ul);
+ case right1:
+ case w1:
+ case x1:
+ case down1:
+ case y1:
+ case z1:
+ return(getc(dvifile));
+ case right1+1:
+ case w1+1:
+ case x1+1:
+ case down1+1:
+ case y1+1:
+ case z1+1:
+ two_bytes_s;
+ return(lcx.l);
+ case right1+2:
+ case w1+2:
+ case x1+2:
+ case down1+2:
+ case y1+2:
+ case z1+2:
+ three_bytes_s;
+ return(lcx.l);
+ case set_rule:
+ case put_rule:
+ case right1+3:
+ case w1+3:
+ case x1+3:
+ case down1+3:
+ case y1+3:
+ case z1+3:
+ case set1+3:
+ case put1+3:
+ case fnt1+3:
+ case xxx1+3:
+ case fnt_def1+3:
+ four_bytes;
+ return(lcx.l);
+ case w0:
+ return(w);
+ case x0:
+ return(x);
+ case y0:
+ return(y);
+ case z0:
+ return(z);
+ default:
+ return(0);
+ }
+}
+
+/* Pass1 reads from the DVI file until the last page that has to be
+processed, as determined by the page selection data structures. Font
+definitions are processed, as are font selections; after the starting page
+begins, pass1 records which characters are used from which fonts. Other
+commands are ignored in pass1. Return 1 if something goes wrong, e.g. if
+the DVI file comes to a premature end. This resembles skip_pages below. */
+
+int pass1() {
+
+ unsigned int k;
+ long int p;
+ int i;
+ char startp;
+
+ if (read_preamble() != 0) {
+ printf(bad_DVI_message);
+ return(1);
+ }
+
+ for (;;) {
+ if (feof(dvifile)) {
+ printf(bad_DVI_message);
+ return(1);
+ }
+ k = getc(dvifile);
+ if (k == post) return(0);
+ p = first_par(k);
+ if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+
+ switch (k) {
+ case bop:
+ startp = 1;
+ for (i=0; i<10; i++) {
+ four_bytes;
+ if (i < how_many_counts && use_count[i] &&
+ lcx.l != start_page[i]) startp = 0;
+ }
+ four_bytes;
+ if (startp != 0) num_pages = 1;
+ else if (num_pages > 0) {
+ num_pages++;
+ if (num_pages > max_pages) return(0);
+ }
+ break;
+ case set_rule:
+ case put_rule:
+ four_bytes;
+ break;
+ four_cases(fnt_def1)
+ i = define_font(p);
+ if (i != 0) return(1);
+ break;
+ four_cases(fnt1)
+ if (num_pages > 0) set_curf(p);
+ break;
+ four_cases(set1)
+ four_cases(put1)
+ if (num_pages > 0)
+ txfa[curf] -> chu[p] = 1;
+ break;
+
+/* \special's are currently ignored in pass1, and handled only in pass2.
+[[This will change if the putchar special is implemented.]] */
+
+ four_cases(xxx1)
+ for (; p>0; p--) getc(dvifile);
+ break;
+ default:
+ break;
+ }
+ }
+/* return(0); /* Unreachable */
+}
+
+/* FONT LOAD BUILDING: The hardest thing Dvi2ln3 has to do is to build an
+LN03 font load that contains the glyphs required to print the DVI file. The
+following code pertains to that effort.
+
+LN03 fonts come in two flavors. Left fonts are invoked by character codes
+33 to 126. Right fonts are invoked by character codes 161 to 254. Hence: */
+
+#define leftfirst 33
+#define rightfirst 161
+#define leftlast 126
+#define rightlast 254
+
+/* It is believed that there is a maximum of 32 downline-loaded LN03 fonts.
+We always deal with these in pairs, using one as a left font, the other as
+a right font. Hence we have a maximum of 16 pairs. */
+
+#define maxnfonts 16
+
+/* We keep track of the true last character in each LN03 font pair; the
+width of each character; and the LN03 name assigned to that pair. */
+
+GLOBAL int lastch[maxnfonts];
+GLOBAL unsigned char chw[maxnfonts][256];
+GLOBAL char fname[maxnfonts][32];
+
+/* Txf is a record structure describing a TeX font. Txfa is an array of txf
+records. Txf2lnf describes the mapping between TeX fonts and pairs of LN03
+fonts. Because the constructed LN03 font load has just the glyphs that are
+needed, we can often cram more than one TeX font into a pair of LN03 fonts.
+*/
+
+GLOBAL int txf2lnf[MAXTEXFONTS];
+
+/* Maxfontnos reflects the fact that LN03 fonts must be denoted by a number
+from 10 to 19 in order to be selected as the LN03's current font. */
+
+#define maxfontnos 9
+
+/* The LN03 font-denoting numbers 10-19 have to be allocated among the
+fonts. The useno array keeps track of which number a font is using, -1 if
+the font currently doesn't have any number. The whouses array says which
+font is using a given number. */
+
+GLOBAL int useno[maxnfonts],whouses[maxfontnos];
+
+/* After the font load we declare the right and bottom margins we are going
+to use; these are always the maximum allowed values. */
+
+GLOBAL int maxrmar,maxbmar;
+
+/* The global ras_len_added is employed by the font-load-creating code to
+communicate how many bytes of raster information it adds to the font load
+each time it is called. [[Maybe there should be no EXTERNs in the main code
+file, just GLOBALs?]] */
+
+EXTERN long ras_len_added;
+
+#define max(x,y) (((x)>(y))?(x):(y))
+#define min(x,y) (((x)<(y))?(x):(y))
+
+/* Make_font_load calls on other procedures to generate the LN03 font load.
+It writes the opening lines of the output file, too. */
+
+int make_font_load() {
+
+ int i,j,jj,k,l,fno,maxfno,chsize;
+ long int totsize;
+ int lnfcnt,txfcnt,the_txf,txf_size,lnfleft;
+ int txford[MAXTEXFONTS];
+ char cnt[3];
+
+ totsize = 0;
+ chsize = 0;
+ curf = 0;
+ for (i=0; i<maxnfonts; i++)
+ for (j=0; j<256; j++) chw[i][j] = 0;
+
+ for (jj=0; jj<MAXTEXFONTS; jj++) txf2lnf[jj] = -1;
+
+/* Fill the fname strings with different valid LN03 font names. [[This
+initialization could be done statically, but then maxnfonts would be more
+hardcoded.]] */
+
+ for (i=0; i<maxnfonts; i++)
+ strcpy(fname[i],"U000000002SK00GG0001UZZZZ02F000");
+ for (jj=1; jj<maxnfonts; jj++) {
+ sprintf(cnt,"%02d",jj);
+ strncpy(&(fname[jj][5]),cnt,2);
+ }
+
+/* The margins are set to values that seem appropriate for American 8 1/2
+by 11" paper. It is not clear if this needs to be changed for European A4
+paper. Not changing it might deprive Europeans of access to the bottom
+1.5cm of their paper.
+
+It is not clear what the printable area is, or what happens when it is
+exceeded. */
+
+ if (landscape == 1) {
+ maxrmar = 3300;
+ maxbmar = 2475;
+ } else {
+ maxrmar = 2550;
+ maxbmar = 3300;
+ }
+
+/* In the following, esc[?21 J means print in landscape, esc[?27h means
+"advance the carriage by the character width when you set a character",
+esc[11h and esc[7 I together mean to interpret all dimensions in escape
+sequences as pixel units; esc[?52h means our origin of coordinates is the
+upper left edge of the paper; esc[%dt means the "maximum length" of the
+paper is maxbmar pixels. */
+
+ fprintf(outfile,"\033c");
+ if (landscape == 1) fprintf(outfile,"\033[?21 J");
+ fprintf(outfile,"\033[?27h\033[11h\033[7 I\033[?52h\033[%dt\n",
+ maxbmar);
+
+ for (i=0; i<maxnfonts; i++) useno[i] = -1;
+ for (i=0; i<maxfontnos; i++) whouses[i] = -1;
+ maxfno = -1;
+
+/* Write font loading escape sequence onto outf. The ;0y causes all
+previously downloaded fonts to be cleared from the LN03's font memory. */
+
+ fprintf(outfile,"\033P0;1;0y");
+
+/* Count how many glyphs each font requires. */
+
+ for (fno=0; fno<nf; fno++) {
+
+ txfa[fno] -> nchs = 0;
+ for(i=0; i<256; i++)
+ if (txfa[fno] -> chu[i] != 0) txfa[fno] -> nchs++;
+
+ if (txfa[fno] -> nchs > 188) goto need_empty_slots;
+ chsize += txfa[fno] -> nchs;
+ }
+ printf("\nFont load to contain %d glyphs.",chsize);
+
+
+/* Now we have to allocate TeX fonts to LN03 font pairs and perform the
+actual load. The goal is to use as few LN03 fonts as possible.
+
+I don't know any way to do the allocation optimally, so a first-fit
+heuristic is used.
+
+1. Find the largest unassigned TeX font. If none, exit, we're done.
+ Number of glyphs used is the measure of size.
+
+2. Allocate an LN03 font pair for that TeX font and put the TeX
+ font into it.
+
+3. Find the largest remaining TeX font that fits in what is left of
+ that LN03 font pair.
+
+ 3.1. if none exists, go to 1.
+ 3.2. if one exists, put it in the font pair and go back to 3.
+
+The txford array contains the TeX font numbers in the order that they are
+assigned. Txfcnt keeps track of how many TeX fonts have been assigned so
+far. */
+
+ lnfcnt = 0;
+ txfcnt = 0;
+ for (i=0; i<MAXTEXFONTS; i++) txford[i] = -1;
+
+ while (1) {
+
+/* Find largest unassigned TeX font */
+
+ lnfleft = rightlast-rightfirst+1+leftlast-leftfirst+1;
+ txf_size = -1;
+ for (j = 0; j < MAXTEXFONTS; j++) {
+ if (txfa[j] != 0 && txf2lnf[j] == -1
+ && txfa[j] -> nchs > txf_size) {
+ txf_size = txfa[j] -> nchs;
+ the_txf = j;
+ }
+ }
+ if (txf_size <= 0) goto assignment_done;
+ if (lnfcnt > maxnfonts) goto too_complex;
+ if (txf_size > lnfleft) goto need_empty_slots;
+
+/* Now allocate new LN03 font pair and put the current TeX font into it */
+
+ txf2lnf[the_txf] = lnfcnt;
+ txford[txfcnt] = the_txf;
+ txfcnt++;
+ k = leftfirst-1;
+ for (j = 0; j <= 255; j++) {
+ if (txfa[the_txf] -> chu[j] != 0) {
+ k++;
+ if (k == leftlast+1) k = rightfirst;
+ lnfleft--;
+ txfa[the_txf] -> chu[j] = k;
+ }
+ }
+ lastch[lnfcnt] = k;
+
+/* Now try to fill the remaining part of the LN03 font pair using other TeX
+fonts */
+
+ while (1) {
+
+ txf_size = -1;
+ for (j = 0; j < MAXTEXFONTS; j++) {
+ if (txfa[j] != 0 && txf2lnf[j] == -1
+ && txfa[j] -> nchs > txf_size
+ && txfa[j] -> nchs <= lnfleft) {
+ txf_size = txfa[j] -> nchs;
+ the_txf = j;
+ }
+ }
+ if (txf_size <= 0) break;
+
+ txf2lnf[the_txf] = lnfcnt;
+ txford[txfcnt] = the_txf;
+ txfcnt++;
+ k = lastch[lnfcnt];
+ for (j=0; j<=255; j++) {
+ if (txfa[the_txf] -> chu[j] != 0) {
+ k++;
+ lnfleft--;
+ if (k == leftlast+1) k = rightfirst;
+ txfa[the_txf] -> chu[j] = k;
+ }
+ }
+ lastch[lnfcnt] = k;
+ }
+
+ lnfcnt++;
+ }
+
+assignment_done:
+
+/* At this point, the TeX fonts have been assigned to LN03 font pairs. The
+assignment is reflected in the arrays txf2lnf, lastch and txford. It
+remains to actually generate the desired font load. This has to be done
+carefully, since the function add_txf_to_lnf only supports adding glyphs to
+an LN03 font pair in ascending order of character code. */
+
+ for (j=0; j<txfcnt; j++) {
+ k = txford[j];
+ if (j != 0 && txf2lnf[k] != txf2lnf[txford[j-1]])
+ fprintf(outfile,",\n");
+ add_txf_to_lnf(txf2lnf[k],k);
+ totsize += ras_len_added;
+ }
+
+/* [[At this point we ought to add code that writes a message saying how
+much font RAM the load will occupy. But there is no documentation for
+determining that! So, we make the following compromise:]] */
+
+ printf("\n Approximate size of font load: %ld bytes",totsize);
+
+/* Now output escape sequences to the LN03 that assign the available font
+numbers to the first ten font pairs in the load. [[We may want to insert a
+few \n's in the following to keep the line from getting too long.]] */
+
+ fprintf(outfile,"\n;Dvi2ln3 9 font load\033\\");
+ fprintf(outfile,"\033[1;%ds\033[%dt\033[1;%dr",maxrmar,maxbmar,maxbmar);
+ for (j=0; j <= min(maxfontnos,lnfcnt-1); j++) {
+ useno[j] = j;
+ whouses[j] = j;
+ k = fname[j][16];
+ fname[j][16] = '\0';
+ fprintf(outfile,"\033P1;1%d}%s\033\\",j,fname[j]);
+ fname[j][16] = k;
+ }
+ fprintf(outfile,"\033[10m");
+
+ return(0);
+
+too_complex:
+ printf("\n Can't construct a font load:");
+ printf("\n Dvi file uses too many glyphs from too many different fonts.");
+ return(1);
+
+/* [[We need to determine what the real limit is on the number of LN03
+fonts, and refine the test to detect if it is being exceeded. Fortunately,
+only a very complex DVI file could exceed the limit.]] */
+
+need_empty_slots:
+ printf("\nFont %s uses > 188 characters. Can't handle that.",
+ font_name[fno]);
+ return(1);
+
+/* [[The error message above should be fixed to specify the magnification
+of the font also.]] */
+
+}
+
+/* The lines in the LN3 file are limited to lengths of about 100 bytes. We
+keep track of how many bytes are written so far in the global lnhp. The
+accounting is conservative, so e.g. each integer representing a pixel
+position counts as 4 bytes even though it might be shorter. [[One could
+easily increase 100 to 200. It is not clear what problems are provoked by
+going over, say, 256.]]
+
+Vpset keeps track of whether the vertical position needs to be output to
+the LN03 file before setting any more characters. Hh_old keeps track of the
+horizontal position which LN03 thinks it's at. */
+
+GLOBAL int ln3p,vpset,hh_old;
+
+#define inc_ln3p(x) ln3p += x; if (ln3p > 100) \
+ { ln3p = 0; vpset = 0; hh_old = 30000; }
+
+/* [[In the above macro, hh_old is set to 30000 to mean "a very large
+number" (the maximum valid hh for an LN03 is 2550), so as to force the code
+below to re-output the true hh. What are the implications of this kludge?
+Would it not be more reasonable to have instead an hhset variable?]] */
+
+/* A stack of hvxyzw values is kept; the stack pointer is called s.
+[[Again, it would be better to make this stack a linked list.]] */
+
+#define STACKSIZE 100
+
+GLOBAL long hstack[STACKSIZE], vstack[STACKSIZE], xstack[STACKSIZE],
+ ystack[STACKSIZE], zstack[STACKSIZE], wstack[STACKSIZE];
+GLOBAL int hhstack[STACKSIZE], vvstack[STACKSIZE];
+GLOBAL int s;
+
+/* DVI files specify distances in units of 2^-16 points. When translating
+to a device-specific format, it is necessary to round the DVI distances to
+pixel units. This is done by means of the pixel_round macro.
+
+However, rather than using this macro in the straightforward way, rounding
+is often performed by more elaborate techniques, which we call "Stanford
+rules" (after John Le Carre's "Moscow rules"). These rules make use of a
+parameter MAX_DRIFT, which is roughly the maximum number of pixels that
+things are allowed to deviate from straightforward rounding. */
+
+#define pixel_round(x) ((int) ((x<0) ? \
+ (conv*(x)-0.5) : (conv*(x)+0.5)))
+
+#define MAX_DRIFT 2
+
+/* Pass2 reads the dvi file and interprets the commands in it, usually by
+calling other routines. The interpretation generally consists of writing
+something into the output file, updating the current fonts and positions,
+and possibly updating the stack. */
+
+int pass2()
+{
+ int i,j;
+ long int p;
+ unsigned int k;
+
+ if (read_preamble() != 0) {
+ printf(bad_DVI_message);
+ return(1);
+ }
+
+ curf = 0;
+ ln3p = 0;
+ s = 0;
+ vpset = 0;
+ hh_old = 30000;
+
+/* Skip pages until the desired starting page is reached. A nonzero value
+is returned if the starting page is never encountered. */
+
+ if (skip_pages() != 0) return(0);
+
+ for (;;) {
+ if feof(dvifile) {
+ printf(bad_DVI_message);
+ return(1); }
+ k = getc(dvifile);
+ if (k == post) return(0);
+ if (k >= undefined_command) {
+ printf(bad_DVI_message);
+ return(1); }
+
+ p = first_par(k);
+
+/* If the opcode is an "implicit parameter" opcode, either set_char_n and
+fnt_num_n, we change it to an explicit parameter opcode to make the case
+jumps more reasonable. */
+
+ if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+
+ j = do_command(k,p);
+ if (j == 2) return(0); /* done with the required number of pages */
+ else if (j == 1) return(1); /* error encountered, stop */
+
+ }
+}
+
+GLOBAL long first_counter;
+
+/* Read from the DVI file until the starting page condition is met. Return
+1 if something goes wrong, or if the DVI file comes to an end. This
+function is copied quite closely from DVItype. */
+
+int skip_pages() {
+
+ unsigned int k;
+ int i;
+ long p;
+ char startp;
+
+ for (;;) {
+ if (feof(dvifile)) return(1);
+ k = getc(dvifile);
+ if (k == post) return(1);
+ p = first_par(k);
+ if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+
+ switch (k) {
+ case bop:
+ startp = 1;
+ for (i=0; i<10; i++) {
+ four_bytes;
+ if (i == 0) first_counter = lcx.l;
+ if (i < how_many_counts && use_count[i] &&
+ lcx.l != start_page[i]) startp = 0;
+ }
+ four_bytes;
+ if (startp != 0) {
+ v = 0; vv = 0; h = 0; hh = 0;
+ printf("\n [%ld]",first_counter);
+ num_pages = 1; return(0); }
+ break;
+ case set_rule:
+ case put_rule:
+ four_bytes;
+ break;
+ four_cases(fnt_def1)
+
+/* [[Why are we defining fonts again here? Once, in pass1, ought to have
+been enough...]] */
+
+ i = define_font(p);
+ if (i != 0) return(1);
+ break;
+ four_cases(xxx1)
+ for (; p>0; p--) getc(dvifile);
+ break;
+ default:
+ break;
+ }
+ }
+/* return(0); /* Unreachable */
+}
+
+/* Do_command performs the DVI command of code k, assuming the "first
+parameter" is p. It is assumed that k is not one of set_char0 through
+set_char127. */
+
+int do_command(k,p)
+int k;
+long p;
+{
+ int i,j,l,lnf;
+
+ switch (k) {
+ four_cases(fnt_def1)
+ define_font_pass2();
+ break;
+
+/* It is possible that the dvi file sets some glyphs off the page. No error
+message is given, since the user will generally see what is happening in
+the output (plus, if Dvi2ln3 gives an error message, users will complain
+about Dvi2ln3 even though the error is in their TeX file).
+
+In most cases, dvi2ln3 takes no special action at all, since the LN03 will
+clip the glyphs for us. Unfortunately, the LN03 doesn't let us specify
+negative horizontal or vertical positions, so we have to clip glyphs at
+such positions away ourselves. Also, if one sets at a position below the
+bottom margin, the LN03 will eject a page, so glyphs that are set below
+that margin also have to be clipped by hand.
+
+The following code accomplishes that: */
+
+ four_cases(put1)
+ four_cases(set1)
+
+ if (vv+voff > 0 && vv+voff <= maxbmar && hh+hoff > 0) {
+ if (!vpset) {
+ fprintf(outfile,"\n\033[%dd",vv+voff);
+ fprintf(outfile,"\033[%d`",hh+hoff);
+ ln3p = 16;
+ vpset = 1;
+ hh_old = hh;
+ }
+ if (hh_old != hh) {
+ if (hh > hh_old) fprintf(outfile,"\033[%da",hh-hh_old);
+ else fprintf(outfile,"\033[%d`",hh+hoff);
+ ln3p += 7;
+ }
+
+#ifndef SEVENBIT
+ putc(txfa[curf] -> chu[p],outfile);
+#else
+ if (txfa[curf] -> chu[p] > 127) {
+ if (right7 == 0) {
+ fputs("\033n",outfile);
+ inc_ln3p(2);
+ right7 = 1;
+ }
+ putc(txfa[curf] -> chu[p]-128,outfile);
+ } else {
+ if (right7 == 1) {
+ putc(15,outfile);
+ inc_ln3p(1);
+ right7 = 0;
+ }
+ putc(txfa[curf] -> chu[p],outfile);
+ }
+#endif
+ inc_ln3p(1);
+ }
+ if (k >= put1) {
+ hh_old = hh+chw[txf2lnf[curf]][txfa[curf] -> chu[p]];
+ break;
+ }
+ h += font_width[curf][p];
+
+/* In rounding h to generate the pixel-position hh, Stanford rules (see
+above) come into play. We set the new hh (horizontal position in pixels) to
+the value obtained by adding the pixel width of the character being set to
+the current position. We then correct this value so that it does not exceed
+the rounded version of the true position by more than MAX_DRIFT pixels.
+
+Note that if we did not apply Stanford rules here, or equivalently if we
+set MAX_DRIFT to zero, many more set-X-position commands would appear in
+the output. */
+
+ hh += chw[txf2lnf[curf]][txfa[curf] -> chu[p]];
+ hh_old = hh;
+ l = pixel_round(h);
+ if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ else if (l-hh > MAX_DRIFT) hh = l-MAX_DRIFT;
+ break;
+
+ four_cases(fnt1)
+ set_curf(p);
+ lnf = txf2lnf[curf];
+ if (useno[lnf] == -1) {
+ useno[whouses[maxfontnos]] = -1;
+ useno[lnf] = maxfontnos;
+ whouses[maxfontnos] = lnf;
+ fprintf(outfile,"\033P1;1%d}%16s\033\\",maxfontnos,
+ fname[lnf]);
+ inc_ln3p(26);
+ }
+ fprintf(outfile,"\033[1%dm",useno[lnf]);
+ inc_ln3p(5);
+ break;
+
+ case set_rule:
+ case put_rule:
+
+/* When converting rule dimensions to pixel dimensions, we do not follow
+Stanford rules. Rather, we just round the true positions to obtain the
+pixel positions. This avoids unsightly gaps between rules. [[It should not
+cause much of a problem with typical rule applications (ruled tables,
+fraction bars)...but perhaps with large delimiters there might be some
+difficulty. This needs more thought...]] */
+
+ four_bytes;
+ if (p >= 0 && lcx.l >= 0)
+ do_rule(pixel_round(h),
+ pixel_round(v-p),pixel_round(h+lcx.l),
+ pixel_round(v));
+ if (k == set_rule) {
+ h += lcx.l;
+ hh = pixel_round(h);
+ }
+ break;
+
+ case push:
+ s++;
+ if (s == STACKSIZE) {
+ printf("\n Stack too deep for Dvi2ln3");
+ return(1);
+ }
+ xstack[s] = x;
+ ystack[s] = y;
+ vstack[s] = v;
+ hstack[s] = h;
+ vvstack[s] = vv;
+ hhstack[s] = hh;
+ wstack[s] = w;
+ zstack[s] = z;
+ break;
+
+ case pop:
+ if (s == 0) {
+ printf(bad_DVI_message);
+ return(1);
+ }
+ if (vv != vvstack[s]) vpset = 0;
+ x = xstack[s];
+ y = ystack[s];
+ v = vstack[s];
+ h = hstack[s];
+ vv = vvstack[s];
+ hh = hhstack[s];
+ w = wstack[s];
+ z = zstack[s];
+ s--;
+ break;
+
+ four_cases(xxx1)
+ do_special_pass2(p);
+ break;
+
+ case bop:
+
+/* If we've done the required number of pages, we'll skip the rest of the
+DVI file. If not, type the first parameter of bop on the user's terminal
+the way TeX does, to give an indication of progress. */
+
+ if (num_pages == max_pages) return(2);
+ v = 0; vv = 0; h = 0; hh = 0;
+ vpset = 0; hh_old = 100000;
+ four_bytes;
+ if (num_pages%12 == 0) printf("\n");
+ first_counter = lcx.l;
+ printf(" [%ld]",lcx.l);
+ num_pages++;
+ for (i = 0; i<40; i++) getc(dvifile);
+ break;
+
+ case eop:
+ fprintf(outfile,"\n\f");
+ ln3p = 0;
+ break;
+
+/* Now we have to consider the cases for pure motion. */
+
+ four_cases(right1)
+ set_h(h+p);
+ break;
+ four_cases(x1)
+ x = p;
+ case x0:
+ set_h(h+x);
+ break;
+ four_cases(y1)
+ y = p;
+ case y0:
+ set_v(v+y);
+ break;
+ four_cases(w1)
+ w = p;
+ case w0:
+ set_h(h+w);
+ break;
+ four_cases(z1)
+ z = p;
+ case z0:
+ set_v(v+z);
+ break;
+ four_cases(down1)
+ set_v(v+p);
+ break;
+
+ }
+ return(0);
+}
+
+/* Set_curf sets the current font to external number p. Note that the
+current font is maintained as an internal font number. */
+
+int set_curf(p)
+int p;
+{
+ to_ext[nf] = p;
+ curf = 0;
+ while (to_ext[curf] != p) { curf++; }
+}
+
+/* Define_font processes a font definition from the DVI file. The TFM file
+for the font is read at this point from the directory TEX$FONTS. */
+
+int define_font(e)
+int e;
+{
+ int i;
+ unsigned char p,n;
+ if (e == MAXTEXFONTS) { printf("\n Too many fonts for Dvi2ln3");
+ return(1); }
+ txfa[nf] = (struct txf *)malloc(sizeof(struct txf));
+ to_ext[nf] = e;
+ four_bytes;
+ four_bytes;
+ txfa[nf] -> scaled_size = lcx.l;
+ four_bytes;
+ txfa[nf] -> design_size = lcx.l;
+ for (i=0; i<256; i++) txfa[nf] -> chu[i] = '\0';
+ p = getc(dvifile); n = getc(dvifile);
+ font_name[nf] = malloc(p+n+1);
+ for (i=0; i<p+n; i++) { font_name[nf][i] = getc(dvifile); }
+ font_name[nf][p+n] = '\0';
+
+ if (txfa[nf] -> scaled_size <= 0 || txfa[nf] -> scaled_size >=
+ 8*8*8*8*8*8*8*8*8) {
+ printf("\n Font %s has a bad scaled size",font_name[nf]);
+ return(1);
+ }
+ if (txfa[nf] -> design_size <= 0 || txfa[nf] -> design_size >=
+ 8*8*8*8*8*8*8*8*8) {
+ printf("\n Font %s has a bad design size",font_name[nf]);
+ return(1);
+ }
+
+/* We follow DVItype and compute for each font a "space" parameter which is
+one-sixth of the scaled design size. This parameter is used in rounding the
+horizontal position to pixels according to "Stanford rules." See the
+function set_h below. */
+
+ txfa[nf] -> space = txfa[nf] -> scaled_size/6;
+
+ i = read_tfm_file();
+ if (i != 0) return(i);
+ nf++;
+ return(0);
+
+}
+
+/* TFM files, like the DVI file, are read with getc, foolish as that may
+seem. We use the same overlays that are used for merging DVI bytes into
+longwords. However, since the TFM file consists of longwords, only
+tfm_longword is need. [[This is also VAX dependent. It would not be
+possible to use stdio's longword reading function getw here, because the
+bytes have to be reversed.]] */
+
+#define tfm_longword { lcx.uc[3] = getc(tfmfile); \
+ lcx.uc[2] = getc(tfmfile); lcx.uc[1] = getc(tfmfile); \
+ lcx.uc[0] = getc(tfmfile); }
+
+/* Read_tfm_file obtains the character widths from the TFM file
+corresponding to font nf. */
+
+int read_tfm_file() {
+
+ int i,lh,nw;
+ int info[256];
+ long z,alpha,beta;
+ long width[256];
+
+ open_tfm_file();
+ if (tfmfile == NULL) {
+ printf("\n Can't open TFM file for font %s",font_name[nf]);
+ return(1); }
+
+/* The TFM format is described in some issue of the TUGBoat (TeX users'
+group newsletter), and in the comments to the program TFtoPL. Here we
+summarize those aspects of TFM format that are relevant to the task of
+extracting the widths of the characters.
+
+The first 24 bytes of a TFM file contain twelve 16-bit integers that give
+the lengths of the various subsequent portions of the file. The ones
+relevant to our purposes are LH, length of the header data, BC, the
+smallest character code in the font, EC, the largest character code in the
+font, and NW, number of words in the width table. So, we read those right
+now, and then skip over the remainder, and then over a set of LH longwords
+called the "header." */
+
+ tfm_longword;
+ lh = 256*lcx.uc[1] + lcx.uc[0];
+ tfm_longword;
+ txfa[nf] -> bc = 256*lcx.uc[3] + lcx.uc[2];
+ txfa[nf] -> ec = 256*lcx.uc[1] + lcx.uc[0];
+ tfm_longword;
+ nw = 256*lcx.uc[3] + lcx.uc[2];
+ if (txfa[nf] -> bc > 255 || txfa[nf] -> ec > 255 ||
+ txfa[nf] -> bc > txfa[nf] -> ec || nw > 256) {
+ printf("\n Bad TFM file for font %s",font_name[nf]);
+ return(1);
+ }
+
+ for(i=0; i<lh+3; i++) tfm_longword;
+
+/* After the header, there are two arrays in the TFM file that interest us.
+The first, INFO, is EC-BC+1 longwords long and contains pointers to the
+second, WIDTH, which is NW longwords long. For each character i, the width
+of i is WIDTH[INFO[i-BC]]. We read these arrays into memory. */
+
+ for(i=0; i<txfa[nf] -> ec-txfa[nf] -> bc+1; i++) {
+ tfm_longword;
+ if (lcx.uc[3] >= nw) {
+ printf("\n Bad TFM file for font %s",font_name[nf]);
+ return(1);
+ }
+ info[i] = lcx.uc[3];
+ }
+
+/* The widths are stored in a rather strange format known as a "fix-word."
+A nonnegative width is expressed in "fix-word" format by expressing it in
+units of 2^-20 times the design size. A negative width is expressed in
+"fix-word" format by expressing its negative in those units, and then
+changing the most significant byte to 255.
+
+One needs to convert these widths into DVI units, multiplying by the scaled
+design size according to a certain arcane algorithm. The algorithm is
+copied from DVItype, to which we refer the reader for an explanation. */
+
+ z = txfa[nf] -> scaled_size;
+ alpha = 16*z; beta = 16;
+ while (z >= 4*(8*8*8*8*8*8*8)) { z = z/2; beta = beta/2; }
+ for(i=0; i<nw; i++) {
+ tfm_longword;
+ width[i] = ( ( (lcx.uc[0]*z)/256 + lcx.uc[1]*z )/256 +
+ lcx.uc[2]*z)/beta;
+ if (lcx.uc[3] == 255) width[i] -= alpha;
+ }
+
+ fclose(tfmfile);
+
+/* Using these two arrays, we now compute the widths of the characters in
+the fonts and place them into two malloc'ed arrays, one for the widths in
+DVI units, one for the width in pixel units. */
+
+ font_width[nf] = (long int *)malloc(4*(txfa[nf] -> ec+1));
+
+ for (i=0; i<txfa[nf] -> bc; i++) font_width[nf][i] = 0;
+ for (i=txfa[nf] -> bc; i <= txfa[nf] -> ec; i++)
+ font_width[nf][i] = width[info[i-txfa[nf] -> bc]];
+ return(0);
+}
+
+/* Open_tfm_file finds and opens the tfm file corresponding to a font nf.
+The global file variable tfmfile is used to hold the file pointer. [[This
+function will not work if the TFM file lies over the net on a VMS V3.x
+host, because C file opens do not work in such circumstances. The problem
+can be ignored, because eventually there should be very few VMS V3.x hosts
+left.]] */
+
+int open_tfm_file () {
+
+ int jext,jnam;
+ char filespec[FILESPECLEN];
+
+#ifndef vms
+ char *texfontdir;
+#endif
+
+
+ find_filename(font_name[nf],&jnam,&jext);
+ filespec[0] = '\0';
+
+/* If there is no directory part, fill in using the logical tex$fonts */
+
+#ifdef vms
+ if (jnam == 0) strcpy(filespec,"tex$fonts:");
+#else
+ if (jnam == 0) {
+ texfontdir = getenv("TEX_FONTS");
+ strcpy(filespec,texfontdir);
+ strcat(filespec,"/");
+ }
+#endif
+ strcat(filespec,font_name[nf]);
+
+/* if there is no extension, add the extension ".tfm" */
+
+ if (font_name[nf][jext] == '\0') strcat(filespec,".tfm");
+ tfmfile = fopen(filespec,"r");
+
+}
+
+/* Define_font_pass2 skips a font definition from the DVI file. */
+
+int define_font_pass2()
+{
+ unsigned char p,n;
+ int i;
+ four_bytes;
+ four_bytes;
+ four_bytes;
+ p = getc(dvifile); n = getc(dvifile);
+ for (i=0; i<p+n; i++) getc(dvifile);
+}
+
+/* Do_rule writes into the ln3 file the escape sequence corresponding to a
+rule. The rule is silently clipped to fit on the page. */
+
+int do_rule(xx0,yy0,xx1,yy1)
+int xx0,yy0,xx1,yy1;
+{
+ int j;
+
+ xx0 = min(xx0+hoff,maxrmar);
+ xx1 = min(xx1+hoff,maxrmar);
+ xx0 = max(xx0,0);
+ xx1 = max(xx1,0);
+ yy0 = min(yy0+voff,maxbmar);
+ yy1 = min(yy1+voff,maxbmar);
+ yy0 = max(yy0,0);
+ yy1 = max(yy1,0);
+ if (xx0 > xx1) { j = xx0; xx0 = xx1; xx1 = j; }
+ if (yy0 > yy1) { j = yy0; yy0 = yy1; yy1 = j; }
+
+ if ((yy1 != yy0 && xx1 != xx0)) {
+ fprintf(outfile,"\033[1;%d;%d;%d;%d!|",
+ xx0,yy0,yy1-yy0,xx1-xx0);
+ inc_ln3p(25);
+ }
+}
+
+/* Set_v is called to execute vertical-position-altering commands, other
+than pops. It modifies v and vv, and outputs the vertical position to the
+LN3 file. We don't follow Stanford rules here. They sometimes set the
+vertical position in pixels vv to something other than the rounded value of
+v. Not following Stanford rules implies, for example, that the relative
+vertical positions of an accent and its accentee may differ by one pixel
+according to how the baseline of the accentee gets rounded. [[This should
+perhaps be fixed.]] */
+
+int set_v(v1)
+int v1;
+{
+ int l;
+
+ l = pixel_round(v1);
+ v = v1;
+ vv = l;
+ vpset = 0;
+}
+
+/* Set_h is called whenever a DVI command is encountered that alters the
+horizonal position, other than a set_char, set_rule or pop. It sets h to
+the new value, and alters hh according to Stanford rules. */
+
+int set_h(new_h)
+int new_h;
+{
+ int l,old_hh;
+
+ old_hh = hh;
+ l = pixel_round(new_h);
+ if (txfa[curf] == 0 || new_h-h >= txfa[curf] -> space
+ || new_h-h <= -4*txfa[curf] -> space) hh = l;
+ else {
+ hh += pixel_round(new_h-h);
+ if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ else if (hh-l < -MAX_DRIFT) hh = l-MAX_DRIFT;
+ }
+ h = new_h;
+ return(0);
+}
diff --git a/dviware/ln03/rose/dvi2ln3.dif b/dviware/ln03/rose/dvi2ln3.dif
new file mode 100644
index 0000000000..56d9066f2e
--- /dev/null
+++ b/dviware/ln03/rose/dvi2ln3.dif
@@ -0,0 +1,109 @@
+-----------------------------------------------------------------------------------------------------------------------------------
+File USER$1:[ROSE.TG.C]DVI2LN3.C;48 | File USER$1:[ROSE.TG.UNIX]DVI2LN3.C;1
+-------------------------------- 3 --------------------------------------------------------------- 3 ------------------------------
+Dvi2ln3 is still being developed. Copyright (c) 1985, 1986 by D | Dvi2ln3 is still being developed. Copyright (c) 1985, 1986, 198
+-------------------------------- 62 -------------------------------------------------------------- 62 -----------------------------
+3/4/86: Support for landscape added -- very easy, if only I h |
+ known. Fixed bug found by Mark DeVries, error returne |
+ if \special selects device other than LN03. Version 8 |
+ |
+-------------------------------- 86 -------------------------------------------------------------- 82 -----------------------------
+#endif | char *strchr(), *malloc(), *getenv();
+ | #endif
+/* Here begins a long list of global variables. */ |
+-------------------------------- 120 ------------------------------------------------------------- 115 ----------------------------
+/* landscape says whether we are printing in landscape or portr |
+ |
+GLOBAL char landscape; |
+ |
+-------------------------------- 139 ------------------------------------------------------------- 130 ----------------------------
+ printf("\n Dvi2ln3 8"); | printf("\n Dvi2ln3 7");
+-------------------------------- 151 ------------------------------------------------------------- 142 ----------------------------
+ find_VMS_filename(infnam,&jnam,&jext); | find_ULTRIX_filename(infnam,&jnam,&jext);
+-------------------------------- 163 ------------------------------------------------------------- 154 ----------------------------
+ landscape = 0; |
+-------------------------------- 170 ------------------------------------------------------------- 160 ----------------------------
+ if (rewind(dvifile) == -1) { | rewind(dvifile);
+ printf("\n Couldn't rewind dvi file."); |
+ goto exit_label; |
+ } |
+-------------------------------- 189 ------------------------------------------------------------- 176 ----------------------------
+ ; | printf("\n");
+} | }
+ |
+/* Find_VMS_filename finds the filename part of a VMS filespec | /* find_ULTRIX_filename finds the filename part of a VMS filesp
+-------------------------------- 201 ------------------------------------------------------------- 188 ----------------------------
+int find_VMS_filename(s,ns,ne) | int find_ULTRIX_filename(s,ns,ne)
+-------------------------------- 210 ------------------------------------------------------------- 197 ----------------------------
+ if (s[j] == ':' || s[j] == ']' || | if (s[j] == '/') {
+ s[j] == '>') { |
+-------------------------------- 219 ------------------------------------------------------------- 205 ----------------------------
+ if (s[j] == '.' || s[j] == ';') { | if (s[j] == '.') {
+-------------------------------- 260 ------------------------------------------------------------- 246 ----------------------------
+second identifying longword is 8 and third is 3. | second identifying longword is 8 and third is 3. */
+ |
+The L option says print in landscape. | /* [[The toupper's below cause difficulty under Ultrix. Probabl
+ | can be fixed by #including <ctype.h>.]] */
+[[Is a European option needed?]] */ |
+-------------------------------- 283 ------------------------------------------------------------- 268 ----------------------------
+ if (toupper(t[0]) == 'L') landscape = 1; |
+-------------------------------- 327 ------------------------------------------------------------- 311 ----------------------------
+ jj = creat(outfnam,0); | jj = creat(outfnam, 0700);
+-------------------------------- 749 ------------------------------------------------------------- 733 ----------------------------
+/* The margins are set to values that seem appropriate for Amer | /* The margins are set to values appropriate for American 8 1/2
+by 11" paper. It is not clear if this needs to be changed for E | paper. It is not clear if this needs to be changed for European
+paper. Not changing it might deprive Europeans of access to the | Not changing it might deprive Europeans of access to the bottom
+1.5cm of their paper. | their paper. */
+ |
+It is not clear what the printable area is, or what happens whe | maxrmar = 2550;
+exceeded. */ | maxbmar = 3300;
+ |
+ if (landscape == 1) { | /* In the following, esc[?27h means "advance the carriage by th
+ maxrmar = 3300; | width when you set a character", esc[11h and esc[7 I together m
+ maxbmar = 2475; | interpret all dimensions in escape sequences as pixel units; es
+ } else { | our origin of coordinates is the upper left edge of the paper;
+ maxrmar = 2550; | means the "maximum length" of the paper is maxbmar pixels. */
+ maxbmar = 3300; |
+ } | fprintf(outfile,"\033c\033[?27h\033[11h\033[7 I\033[?52h\03
+ |
+/* In the following, esc[?21 J means print in landscape, esc[?2 |
+"advance the carriage by the character width when you set a cha |
+esc[11h and esc[7 I together mean to interpret all dimensions i |
+sequences as pixel units; esc[?52h means our origin of coordina |
+upper left edge of the paper; esc[%dt means the "maximum length |
+paper is maxbmar pixels. */ |
+ |
+ fprintf(outfile,"\033c"); |
+ if (landscape == 1) fprintf(outfile,"\033[?21 J"); |
+ fprintf(outfile,"\033[?27h\033[11h\033[7 I\033[?52h\033[%dt |
+-------------------------------- 919 ------------------------------------------------------------- 892 ----------------------------
+ fprintf(outfile,"\n;Dvi2ln3 8 font load\033\\"); | fprintf(outfile,"\n;Dvi2ln3 7 font load\033\\");
+-------------------------------- 1127 ------------------------------------------------------------ 1100 ---------------------------
+about Dvi2ln3 even though the error is in their TeX file). | about Dvi2ln3 even though the error is in their TeX file). In m
+ | dvi2ln3 takes no special action at all, since the LN03 will cli
+In most cases, dvi2ln3 takes no special action at all, since th | for us. Unfortunately, the LN03 doesn't let us specify negative
+clip the glyphs for us. Unfortunately, the LN03 doesn't let us | or vertical positions, so we have to clip glyphs at such positi
+negative horizontal or vertical positions, so we have to clip g | ourselves. The following code accomplishes that: */
+such positions away ourselves. Also, if one sets at a position |
+bottom margin, the LN03 will eject a page, so glyphs that are s |
+that margin also have to be clipped by hand. |
+ |
+The following code accomplishes that: */ |
+-------------------------------- 1141 ------------------------------------------------------------ 1109 ---------------------------
+ if (vv+voff > 0 && vv+voff <= maxbmar && hh+hoff > | if (vv+voff > 0 && hh+hoff > 0) {
+-------------------------------- 1481 ------------------------------------------------------------ 1449 ---------------------------
+ | char *texfontdir;
+ find_VMS_filename(font_name[nf],&jnam,&jext); |
+ | find_ULTRIX_filename(font_name[nf],&jnam,&jext);
+-------------------------------- 1487 ------------------------------------------------------------ 1456 ---------------------------
+ if (jnam == 0) strcpy(filespec,"tex$fonts:"); | if (jnam == 0) texfontdir = getenv("TEX_FONTS");
+ | strcpy(filespec,texfontdir);
+ | strcat(filespec,"/");
+-----------------------------------------------------------------------------------------------------------------------------------
+
+Number of difference sections found: 21
+Number of difference records found: 78
+
+DIFFERENCES /IGNORE=()/OUTPUT=USER$1:[ROSE.TG.C]DVI2LN3.DIF;1/PARALLEL-
+ USER$1:[ROSE.TG.C]DVI2LN3.C;48-
+ USER$1:[ROSE.TG.UNIX]DVI2LN3.C;1
diff --git a/dviware/ln03/rose/dvi2ln3.lis b/dviware/ln03/rose/dvi2ln3.lis
new file mode 100644
index 0000000000..b8c209889d
--- /dev/null
+++ b/dviware/ln03/rose/dvi2ln3.lis
@@ -0,0 +1,1602 @@
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 1
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+
+
+ 1 /* Dvi2ln3 translates a TeX DVI file to an LN03 format file.
+ 2
+ 3 Dvi2ln3 is still being developed. Copyright (c) 1985 by Digital Equipment
+ 4 Corporation, Maynard, Massachusetts, USA. Author: Flavio Rose,
+ 5 shasta!decwrl!dec-rhea!dec-dvinci!rose.
+ 6
+ 7 Dvi2ln3 is based on the publicly-available program DVItype, written by
+ 8 David R. Fuchs of Stanford University; and also on earlier DEC programs for
+ 9 the LN01 and LN03 laser printers, Dvi2lng, Topp and LN03Topp. This program
+ 10 is not a DEC product and is not guaranteed to work.
+ 11
+ 12 Dvi2ln3 is written in VAX C. Specific VAX and VMS dependencies have
+ 13 generally been avoided, however. The reader may find them by searching
+ 14 for the strings VAX and VMS in this file.
+ 15
+ 16 During development, double square brackets [[ ]] in a comment indicate some
+ 17 places where the code needs to be improved.
+ 18
+ 19 [[Among the useful things that still need to be done: differentiating
+ 20 between int and long variables so this can be ported more easily to 16-bit
+ 21 architectures; testing to see if malloc returns 0; a \special for ROM
+ 22 fonts; a \special for sixels.]]
+ 23
+ 24 Development history:
+ 25
+ 26 Feb. 85: Did some early work on Dvi2ln3, translating bits and pieces
+ 27 of Dvi2lng. Concluded, however, that it was better to translate
+ 28 LN03Topp and Dvi2lng into C first. The reason for this is that code
+ 29 which mimics an existing program is easier to write and to test.
+ 30
+ 31 5/15/85: At this date, the old LN03Topp program has been successfully
+ 32 translated into C (except for the ability to read files over
+ 33 DECnet). At this point, did some further cleanup of the Dvi2ln3
+ 34 source.
+ 35
+ 36 6/4/85: Coding of Dvi2ln3 begins in earnest. Merging bits and
+ 37 pieces from various places. Chucking chunks and all that
+ 38 junk from LN03Topp; pass2 is just straightforward translation.
+ 39
+ 40 6/22/85: Cleanup after initial debugging. Ready to distribute.
+ 41
+ 42 10/14/85: Bug in parsing of \special's. Version 1.
+ 43
+ 44 */
+ 45
+ 46 #include stdio
+ 104
+ 105 /* To please the VMS linker, we declare all global variables to be
+ 106 globaldef. This is done with #define's, so it may easily be undone when
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 2
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 107 porting the program to other systems. */
+ 108
+ 109 #ifdef vms
+ 110 #define GLOBAL globaldef
+ 111 #define EXTERN globalref
+ 112 #else
+ 113 X #define GLOBAL
+ 114 X #define EXTERN extern
+ 115 #endif
+ 116
+ 117 /* hoff is the horizontal offset in pixels to be added to all dimensions
+ 118 read in; voff is the corresponding vertical offset. */
+ 119
+ 120 GLOBAL int hoff, voff, startp;
+ 121 GLOBAL FILE *dvifile,*tfmfile,*outfile;
+ 122
+ 123 /* Each page in a DVI file is identified by ten longwords, which appear
+ 124 immediately after each bop (beginning of page) command. Dvi2ln3, like
+ 125 DVItype, supports certain options that allow one to print only selected
+ 126 pages. The following variables are used for this purpose.
+ 127
+ 128 Num_pages is a count of how many pages have been passed to the output.
+ 129 Max_pages is the user-specified maximum number of pages to pass.
+ 130 How_many_counts denotes the number of identifying longwords to take into
+ 131 account when searching for the user-specified starting page. The user
+ 132 specifies the starting page as the first one whose identifying longwords
+ 133 match certain specified values, stored in start_page. However, identifying
+ 134 longword i is only required to match the value in start_page[i] if
+ 135 use_count[i] is nonzero. */
+ 136
+ 137 GLOBAL long int num_pages,max_pages;
+ 138 GLOBAL int how_many_counts,use_count[10];
+ 139 GLOBAL long int start_page[10];
+ 140
+ 141 /* FILESPECLEN is the maximum size of a file specification under VMS.
+ 142 [[Perhaps arrays of fixed size should not be used, but rather malloc should
+ 143 be employed...]] */
+ 144
+ 145 #define FILESPECLEN 252
+ 146
+ 147 /* The main routine deals with the command line arguments, opens the dvi
+ 148 file, and then calls various other routines to handle the "passes". There
+ 149 are two passes which involve reading the DVI file; in between, the font
+ 150 load is constructed. */
+ 151
+ 152 main(argc,argv)
+ 153 int argc;
+ 154 char *argv[];
+ 155 {
+ 156 1 int status,i,jnam,jext;
+ 157 1 char infnam[FILESPECLEN];
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 3
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 158 1
+ 159 1 if (argc < 2) { printf("\n Usage: Dvi2ln3 <filename> <options>");
+ 160 2 goto exit_label; }
+ 161 1
+ 162 1 printf("\n Dvi2ln3 1");
+ 163 1
+ 164 1 strcpy(infnam,argv[1]);
+ 165 1
+ 166 1 /* The extension of the input file defaults to .dvi. Locate the filename
+ 167 1 field within the filespec parameter, set jname to point to beginning, jext
+ 168 1 to point to one place after end. [[This code is of course dependent on the
+ 169 1 VMS filespec syntax.]] */
+ 170 1
+ 171 1 find_VMS_filename(infnam,&jnam,&jext);
+ 172 1 if (infnam[jext] == '\0') strcat(infnam,".dvi");
+ 173 1 dvifile = fopen(infnam,"r");
+ 174 1 if (dvifile == NULL) { printf("\n Couldn't open dvi file");
+ 175 2 goto exit_label; }
+ 176 1
+ 177 1 /* Now decipher the options off the command line. */
+ 178 1
+ 179 1 max_pages = 1000000000;
+ 180 1 how_many_counts = 0;
+ 181 1 hoff = 300;
+ 182 1 voff = 300;
+ 183 1 for (i=2; i<argc; i++) command_line_options(argv[i]);
+ 184 1
+ 185 1 status = pass1();
+ 186 1 if (status != 0) goto exit_label;
+ 187 1 if (rewind(dvifile) == -1) {
+ 188 2 printf("\n Couldn't rewind dvi file.");
+ 189 2 goto exit_label;
+ 190 2 }
+ 191 1
+ 192 1 status = open_output_file(infnam,jnam,jext,".ln3");
+ 193 1 if (status != 0) { printf("\n Couldn't open output file");
+ 194 2 goto exit_label; }
+ 195 1
+ 196 1 status = make_font_load();
+ 197 1 if (status != 0) goto exit_label;
+ 198 1
+ 199 1 pass2();
+ 200 1
+ 201 1 fprintf(outfile,"\033c");
+ 202 1 fclose(dvifile);
+ 203 1 fclose(outfile);
+ 204 1
+ 205 1 exit_label:
+ 206 1 ;
+ 207 1 }
+ 208
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 4
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 209 /* Find_VMS_filename finds the filename part of a VMS filespec passed in s,
+ 210 returning the index of the first character in *ns, and the index of the
+ 211 character after the last in *ne.
+ 212
+ 213 [[When porting Dvi2ln3 to a non-VMS system, we need to find an alternative
+ 214 to this function. Under Unix, as a first approximation, we could look for
+ 215 the last "/" or "~" and then for the first succeeding "." in the filespec.
+ 216 Is this correct?]] */
+ 217
+ 218 int find_VMS_filename(s,ns,ne)
+ 219 char s[];
+ 220 int *ns,*ne;
+ 221 {
+ 222 1 int jnam,jext,j,slen;
+ 223 1
+ 224 1 slen = strlen(s);
+ 225 1 jnam = 0;
+ 226 1 for (j = slen-1; j >= 0; j--) {
+ 227 2 if (s[j] == ':' || s[j] == ']' ||
+ 228 2 s[j] == '>') {
+ 229 3 jnam = j+1;
+ 230 3 break;
+ 231 3 }
+ 232 2 }
+ 233 1
+ 234 1 jext = slen;
+ 235 1 for (j = jnam; j < slen; j++) {
+ 236 2 if (s[j] == '.' || s[j] == ';') {
+ 237 3 jext = j;
+ 238 3 break;
+ 239 3 }
+ 240 2 }
+ 241 1
+ 242 1 *ns = jnam;
+ 243 1 *ne = jext;
+ 244 1 }
+ 245
+ 246 /* ERROR HANDLING: Errors should be reported as close to the source as
+ 247 possible, so that the maximum amount of information is available to the
+ 248 user to identify the error.
+ 249
+ 250 Errors in the format of DVI or TFM files are not reported specifically,
+ 251 since there exist programs, DVItype and TFtoPL, which diagnose errors in
+ 252 such files. This program accepts some incorrect DVI files, for example,
+ 253 those with a bad postamble or bad backpointers. [[However, someday we may
+ 254 rewrite the program to select pages by using these features of the DVI
+ 255 format, rather than by skipping unwanted pages.]] */
+ 256
+ 257 GLOBAL char *bad_DVI_message = "\nBad DVI file - check it with DVItype";
+ 258
+ 259 /* Command_line_options reads and processes options off the string s. At
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 5
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 260 this time, four options are supported.
+ 261
+ 262 The N option sets the maximum number of pages to be printed. Its syntax is
+ 263 /N=<integer> .
+ 264
+ 265 The H option modifies the default horizontal offset.
+ 266
+ 267 The V option modifies the default vertical offset.
+ 268
+ 269 The S option has syntax /S=<pagespec>{.<pagespec>}* where the {}* denotes
+ 270 repetition, and a <pagespec> is either an integer or * to indicate any
+ 271 value. An example would be "/S=*.8.3".
+ 272
+ 273 The meaning of the S option is as follows: In a DVI file, pages are
+ 274 identified by ten longword values which follow each bop (beginning of page)
+ 275 command. The value of the S option indicates which page to start printing
+ 276 on. For example, "*.8.3" means start printing at the first page whose
+ 277 second identifying longword is 8 and third is 3. */
+ 278
+ 279 int command_line_options(t)
+ 280 char *t;
+ 281 {
+ 282 1 long int i,k;
+ 283 1 char *u;
+ 284 1
+ 285 1 while ((t = strchr(t,'/')) != 0) {
+ 286 2 t++;
+ 287 2 if (toupper(t[0]) == 'N' && t[1] == '='
+ 288 2 && (sscanf(&t[2],"%ld",&k) == 1))
+ 289 2 max_pages = k;
+ 290 2 if (toupper(t[0]) == 'H' && t[1] == '='
+ 291 2 && (sscanf(&t[2],"%ld",&k) == 1))
+ 292 2 hoff = k;
+ 293 2 if (toupper(t[0]) == 'V' && t[1] == '='
+ 294 2 && (sscanf(&t[2],"%ld",&k) == 1))
+ 295 2 voff = k;
+ 296 2 else if (toupper(t[0]) == 'S' && t[1] == '=') {
+ 297 3 t += 2;
+ 298 3 how_many_counts = 0;
+ 299 3 for (;;) {
+ 300 4 if (t[0] == '*') {
+ 301 5 use_count[how_many_counts] = 0;
+ 302 5 how_many_counts++;
+ 303 5 }
+ 304 4 else if (sscanf(t,"%ld",&k) != 0) {
+ 305 5 use_count[how_many_counts] = 1;
+ 306 5 start_page[how_many_counts] = k;
+ 307 5 how_many_counts++;
+ 308 5 } else break;
+ 309 4 u = strchr(t,'.');
+ 310 4 if (u == 0) break;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 6
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 311 4 t = &u[1];
+ 312 4 }
+ 313 3 }
+ 314 2 }
+ 315 1 }
+ 316
+ 317 /* Open_output_file opens one of the output files, using the file pointer
+ 318 outfile. The name of the output file is obtained by appending the string
+ 319 ext to the substring of infnam beginning at jnam and ending at jext.
+ 320
+ 321 [[This code contains a VMS depndency. We use creat followed by fdopen to
+ 322 open the file as a normal VMS file ("rat=cr","rfm=var") rather than a
+ 323 STREAM_LF file. Beginning with VAX C V2.0, this can be done by just calling
+ 324 fopen.]] */
+ 325
+ 326 int open_output_file(infnam,jnam,jext,ext)
+ 327 char *infnam,*ext;
+ 328 int jnam,jext;
+ 329 {
+ 330 1 char outfnam[FILESPECLEN];
+ 331 1 int jj;
+ 332 1
+ 333 1 strcpy(outfnam,&infnam[jnam]);
+ 334 1 strcpy(&outfnam[jext-jnam],ext);
+ 335 1
+ 336 1 jj = creat(outfnam,0,"rat=cr","rfm=var");
+ 337 1 if (jj == -1) return(1);
+ 338 1 outfile = fdopen(jj,"w");
+ 339 1 if (outfile == NULL) return(1);
+ 340 1
+ 341 1 return(0);
+ 342 1 }
+ 343
+ 344 /* Bytes are read one by one from the DVI file using getc. We use an
+ 345 overlay, as suggested in the DVItype documentation, to combine these bytes
+ 346 into larger integers. [[Note that this technique relies on the fact that
+ 347 numbers on the VAX are stored with the least significant byte first. The
+ 348 macros below would have to be changed if the program were to be ported to a
+ 349 machine architecture for which this is not so.]]
+ 350
+ 351 [[The use of getc is expensive, since getc is a function in VAX C V2.0.
+ 352 Eventually, one would want to rewrite these macros to work like the old
+ 353 getc macro.]] */
+ 354
+ 355 GLOBAL union lc { long int l; unsigned long int ul; char c[4];
+ 356 unsigned char uc[4]; } lcx;
+ 357
+ 358 #define two_bytes_u lcx.uc[1] = getc(dvifile); \
+ 359 lcx.uc[0] = getc(dvifile); lcx.uc[2] = 0; lcx.uc[3] = 0
+ 360
+ 361 #define two_bytes_s lcx.c[1] = getc(dvifile); \
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 7
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 362 lcx.c[0] = getc(dvifile); \
+ 363 if (lcx.c[1] >= 0) { lcx.uc[2] = 0; lcx.uc[3] = 0 ;} \
+ 364 else { lcx.uc[2] = 255; lcx.uc[3] = 255; }
+ 365
+ 366 #define three_bytes_u lcx.uc[3] = getc(dvifile); lcx.uc[1] = getc(dvifile); \
+ 367 lcx.uc[0] = getc(dvifile); lcx.uc[2] = 0
+ 368
+ 369 #define three_bytes_s lcx.c[2] = getc(dvifile); lcx.c[1] = getc(dvifile); \
+ 370 lcx.c[0] = getc(dvifile); \
+ 371 lcx.uc[3] = (lcx.c[2] >= 0) ? 0 : 255;
+ 372
+ 373 #define four_bytes lcx.c[3] = getc(dvifile); \
+ 374 lcx.c[2] = getc(dvifile); lcx.c[1] = getc(dvifile); \
+ 375 lcx.c[0] = getc(dvifile);
+ 376
+ 377 /* Knuth's programs like to hardcode fixed maximum sizes for various
+ 378 things, for example, the maximum number of fonts allowed in a DVI file. In
+ 379 general, it is preferable to use the C function malloc to allocate storage
+ 380 as needed. That is what we generally do in this Dvi2ln3, but there are some
+ 381 residues of the Knuthian approach, like MAXTEXFONTS below. By the way, we
+ 382 never attempt to return any storage to the system.
+ 383
+ 384 [[Eventually, it would be better to get rid of MAXTEXFONTS and use a linked
+ 385 list of records instead. There would be no cpu time penalty to using a
+ 386 linked list, because the function set_curf below does a linear search
+ 387 through the font array anyway.]] */
+ 388
+ 389 #define MAXTEXFONTS 100
+ 390
+ 391 struct txf { unsigned char chu[256]; int bc, ec; long int space, design_size,
+ 392 scaled_size; int nchs; };
+ 393
+ 394 GLOBAL struct txf *txfa[MAXTEXFONTS+1];
+ 395
+ 396 /* Font width information needs to be read from TFM files. TFM is a special
+ 397 format defined by TeX. Dvi2ln3 stores each width in a longword. DVItype
+ 398 tries to save space by a two-level width storage method. We just allocate
+ 399 an array of widths for each font with malloc.
+ 400
+ 401 [[We don't check that font checksums match in Dvi2ln3, because there are a
+ 402 lot of slightly obsolete TFMs floating around which would result in a
+ 403 checksum error, but seem to give perfectly reasonable formatted output
+ 404 nonetheless.]] */
+ 405
+ 406 GLOBAL long int *font_width[MAXTEXFONTS+1];
+ 407
+ 408 /* TeX fonts are referred to by their internal numbers, which go from 0 to
+ 409 nf-1. The DVI file refers to them by external numbers, hence the array
+ 410 to_ext used to convert internal numbers to external numbers. Curf is the
+ 411 internal font number of the current font in the DVI file. */
+ 412
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 8
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 413 GLOBAL int to_ext[MAXTEXFONTS+1],
+ 414 nf,
+ 415 curf;
+ 416
+ 417 /* In some switch statements, a lot of cases have to be enumerated. We
+ 418 employ this Knuthian macro for that purpose: */
+ 419
+ 420 #define four_cases(_x1) case _x1: case _x1+1: case _x1+2: case _x1+3:
+ 421
+ 422 /* We define a lot of constants corresponding to the DVI operation codes.
+ 423 These are copied from DVItype. */
+ 424
+ 425 #define id_byte 2 /* current version of the dvi format */
+ 426 #define set_char_0 0 /* typeset character 0 and move right */
+ 427 #define set1 128 /* typeset a character and move right */
+ 428 #define set_rule 132 /* typeset a rule and move right */
+ 429 #define put1 133 /* typeset a character */
+ 430 #define put_rule 137 /* typeset a rule */
+ 431 #define nop 138 /* no operation */
+ 432 #define bop 139 /* beginning of page */
+ 433 #define eop 140 /* ending of page */
+ 434 #define push 141 /* save the current positions */
+ 435 #define pop 142 /* restore previous positions */
+ 436 #define right1 143 /* move right */
+ 437 #define w0 147 /* move right by |w| */
+ 438 #define w1 148 /* move right and set |w| */
+ 439 #define x0 152 /* move right by |x| */
+ 440 #define x1 153 /* move right and set |x| */
+ 441 #define down1 157 /* move down */
+ 442 #define y0 161 /* move down by |y| */
+ 443 #define y1 162 /* move down and set |y| */
+ 444 #define z0 166 /* move down by |z| */
+ 445 #define z1 167 /* move down and set |z| */
+ 446 #define fnt_num_0 171 /* set current font to 0 */
+ 447 #define fnt1 235 /* set current font */
+ 448 #define xxx1 239 /* extension to dvi primitives (\special) */
+ 449 #define xxx4 242 /* potentially long extension to dvi primitives */
+ 450 #define fnt_def1 243 /* define the meaning of a font number */
+ 451 #define pre 247 /* preamble */
+ 452 #define post 248 /* postamble beginning */
+ 453 #define post_post 249 /* postamble ending */
+ 454 #define undefined_command 250
+ 455
+ 456 GLOBAL long int mag, num, den;
+ 457 GLOBAL float conv, unmag_conv;
+ 458
+ 459 /* Read_preamble reads the preamble of the dvi file. The comment is thrown
+ 460 away. The format version number is checked. The magnification, numerator,
+ 461 and denominator are remembered in the globals mag, num, den. The float
+ 462 values conv and unmag_conv serve to convert measurements from DVI units to
+ 463 pixels. */
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 9
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 464
+ 465 int read_preamble() {
+ 466 1 unsigned int i;
+ 467 1 int j;
+ 468 1
+ 469 1 i = getc(dvifile);
+ 470 1 if (i != pre) return(1);
+ 471 1 i = getc(dvifile);
+ 472 1 if (i != id_byte) return(1);
+ 473 1 four_bytes; num = lcx.l;
+ 474 1 if (num <= 0) return(1);
+ 475 1 four_bytes; den = lcx.l;
+ 476 1 if (den <= 0) return(1);
+ 477 1 four_bytes; mag = lcx.l;
+ 478 1 if (mag <= 0) return(1);
+ 479 1
+ 480 1 unmag_conv = (num/254000.0) * (300.0/den);
+ 481 1 conv = unmag_conv * (mag/1000.0);
+ 482 1
+ 483 1 /* Skip over the comment field. */
+ 484 1
+ 485 1 i = getc(dvifile);
+ 486 1 for (j=0; j<i; j++) getc(dvifile);
+ 487 1 return(0);
+ 488 1 }
+ 489
+ 490 /* The dvi file format requires us to keep track of various quantities,
+ 491 among them the horizontal and vertical positions h and v, and four values
+ 492 referred to simply as x, y, z and w. We also keep pixel-rounded versions
+ 493 of h and v, called hh and vv. */
+ 494
+ 495 GLOBAL long h, v, x, y, z, w;
+ 496 GLOBAL int hh, vv;
+ 497
+ 498 /* The following function, copied from DVItype, reads from the DVI file the
+ 499 first parameter of the current DVI command. In the case of functions whose
+ 500 first parameter is implicit, such as set_char_0 through set_char_127, the
+ 501 implicit parameter is returned. */
+ 502
+ 503 long first_par(o)
+ 504 int o;
+ 505 {
+ 506 1 unsigned int i;
+ 507 1
+ 508 1 if ((o >= set_char_0) && (o < set_char_0+128))
+ 509 1 return(o-set_char_0);
+ 510 1 if ((o >= fnt_num_0) && (o < fnt_num_0+64))
+ 511 1 return(o-fnt_num_0);
+ 512 1 switch (o) {
+ 513 2 case set1:
+ 514 2 case put1:
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 10
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 515 2 case fnt1:
+ 516 2 case xxx1:
+ 517 2 case fnt_def1:
+ 518 2 i = getc(dvifile);
+ 519 2 return(i);
+ 520 2 case set1+1:
+ 521 2 case put1+1:
+ 522 2 case fnt1+1:
+ 523 2 case xxx1+1:
+ 524 2 case fnt_def1+1:
+ 525 2 two_bytes_u;
+ 526 2 return(lcx.ul);
+ 527 2 case set1+2:
+ 528 2 case put1+2:
+ 529 2 case fnt1+2:
+ 530 2 case xxx1+2:
+ 531 2 case fnt_def1+2:
+ 532 2 three_bytes_u;
+ 533 2 return(lcx.ul);
+ 534 2 case right1:
+ 535 2 case w1:
+ 536 2 case x1:
+ 537 2 case down1:
+ 538 2 case y1:
+ 539 2 case z1:
+ 540 2 return(getc(dvifile));
+ 541 2 case right1+1:
+ 542 2 case w1+1:
+ 543 2 case x1+1:
+ 544 2 case down1+1:
+ 545 2 case y1+1:
+ 546 2 case z1+1:
+ 547 2 two_bytes_s;
+ 548 2 return(lcx.l);
+ 549 2 case right1+2:
+ 550 2 case w1+2:
+ 551 2 case x1+2:
+ 552 2 case down1+2:
+ 553 2 case y1+2:
+ 554 2 case z1+2:
+ 555 2 three_bytes_s;
+ 556 2 return(lcx.l);
+ 557 2 case set_rule:
+ 558 2 case put_rule:
+ 559 2 case right1+3:
+ 560 2 case w1+3:
+ 561 2 case x1+3:
+ 562 2 case down1+3:
+ 563 2 case y1+3:
+ 564 2 case z1+3:
+ 565 2 case set1+3:
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 11
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 566 2 case put1+3:
+ 567 2 case fnt1+3:
+ 568 2 case xxx1+3:
+ 569 2 case fnt_def1+3:
+ 570 2 four_bytes;
+ 571 2 return(lcx.l);
+ 572 2 case w0:
+ 573 2 return(w);
+ 574 2 case x0:
+ 575 2 return(x);
+ 576 2 case y0:
+ 577 2 return(y);
+ 578 2 case z0:
+ 579 2 return(z);
+ 580 2 default:
+ 581 2 return(0);
+ 582 2 }
+ 583 1 }
+ 584
+ 585 /* Pass1 reads from the DVI file until the starting page condition is met.
+ 586 Return 1 if something goes wrong, or if the DVI file comes to an end. This
+ 587 resembles skip_pages below. */
+ 588
+ 589 int pass1() {
+ 590 1
+ 591 1 unsigned int k;
+ 592 1 long int p;
+ 593 1 int i;
+ 594 1 char startp;
+ 595 1
+ 596 1 if (read_preamble() != 0) {
+ 597 2 printf(bad_DVI_message);
+ 598 2 return(1);
+ 599 2 }
+ 600 1
+ 601 1 for (;;) {
+ 602 2 if (feof(dvifile)) {
+ 603 3 printf(bad_DVI_message);
+ 604 3 return(1);
+ 605 3 }
+ 606 2 k = getc(dvifile);
+ 607 2 if (k == post) return(0);
+ 608 2 p = first_par(k);
+ 609 2 if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ 610 2 if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+ 611 2
+ 612 2 switch (k) {
+ 613 3 case bop:
+ 614 3 startp = 1;
+ 615 3 for (i=0; i<10; i++) {
+ 616 4 four_bytes;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 12
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 617 4 if (i < how_many_counts && use_count[i] &&
+ 618 4 lcx.l != start_page[i]) startp = 0;
+ 619 4 }
+ 620 3 four_bytes;
+ 621 3 if (startp != 0) num_pages = 1;
+ 622 3 else if (num_pages > 0) {
+ 623 4 num_pages++;
+ 624 4 if (num_pages > max_pages) return(0);
+ 625 4 }
+ 626 3 break;
+ 627 3 case set_rule:
+ 628 3 case put_rule:
+ 629 3 four_bytes;
+ 630 3 break;
+ 631 3 four_cases(fnt_def1)
+ 632 3 i = define_font(p);
+ 633 3 if (i != 0) return(1);
+ 634 3 break;
+ 635 3 four_cases(fnt1)
+ 636 3 if (num_pages > 0) set_curf(p);
+ 637 3 break;
+ 638 3 four_cases(set1)
+ 639 3 four_cases(put1)
+ 640 3 if (num_pages > 0)
+ 641 3 txfa[curf] -> chu[p] = 1;
+ 642 3 break;
+ 643 3 four_cases(xxx1)
+ 644 3 for (; p>0; p--) getc(dvifile);
+ 645 3 break;
+ 646 3 default:
+ 647 3 break;
+ 648 3 }
+ 649 2 }
+ 650 1 return(0);
+ 651 1 }
+ 652
+ 653 #define leftfirst 33
+ 654 #define rightfirst 161
+ 655 #define leftlast 126
+ 656 #define rightlast 254
+ 657
+ 658 /* The define of maxnfonts below is based on a belief, perhaps
+ 659 superstitious, that there is a limit of 31 downline-loaded fonts in the
+ 660 LN03. For us an nfont is two LN03 fonts, hence the following definition. */
+ 661
+ 662 #define maxnfonts 16
+ 663
+ 664 /* Txf is a record structure describing a TeX font. Txfa is an array of txf
+ 665 records. Txf2lnf describes the mapping between TeX fonts and pairs of LN03
+ 666 fonts. Because the constructed LN03 font load has just the glyphs that are
+ 667 needed, we can often cram more than one TeX font into a pair of LN03 fonts.
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 13
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 668
+ 669 Why a pair of fonts? Because LN03 fonts are allowed to hold 94 glyphs only.
+ 670 They come in two flavors, "left" which answer to character codes 33 to 126,
+ 671 and "right" which answer to codes 161 to 254. LN03Topp assigns each TeX
+ 672 font to one "lnfno", where each lnfno denotes a pair of LN03 fonts, one
+ 673 left, one right. */
+ 674
+ 675 GLOBAL int txf2lnf[MAXTEXFONTS];
+ 676
+ 677 /* Maxfontnos reflects the fact that all LN03 fonts must be denoted by
+ 678 a number from 10 to 19. */
+ 679
+ 680 #define maxfontnos 9
+ 681
+ 682 GLOBAL int lastch[maxnfonts];
+ 683 GLOBAL unsigned char chw[maxnfonts][256];
+ 684 GLOBAL char fname[maxnfonts][32];
+ 685
+ 686 /* The LN03 font-denoting numbers 10-19 have to be allocated among the
+ 687 fonts. The useno array keeps track of which number a font is allowed to
+ 688 use, -1 if none is currently allocated. The whouses array says which font
+ 689 is using a number. */
+ 690
+ 691 GLOBAL int useno[maxnfonts],whouses[maxfontnos];
+ 692
+ 693 /* Font_name points to strings containing font names, which are created
+ 694 with malloc as needed. */
+ 695
+ 696 GLOBAL char *font_name[MAXTEXFONTS+1];
+ 697
+ 698 GLOBAL int maxrmar,maxbmar;
+ 699
+ 700 #define max(x,y) (((x)>(y))?(x):(y))
+ 701 #define min(x,y) (((x)<(y))?(x):(y))
+ 702
+ 703 /* Make_font_load calls on other procedures to generate the LN03 font load.
+ 704 */
+ 705
+ 706 int make_font_load() {
+ 707 1
+ 708 1 int i,j,jj,k,l,fno,maxfno,chsize;
+ 709 1 long int totsize;
+ 710 1 int lnfcnt,txfcnt,the_txf,txf_size,lnfleft;
+ 711 1 int txford[MAXTEXFONTS];
+ 712 1 char cnt[3];
+ 713 1
+ 714 1 totsize = 0;
+ 715 1 chsize = 0;
+ 716 1 curf = 0;
+ 717 1 for (i=0; i<maxnfonts; i++)
+ 718 1 for (j=0; j<256; j++) chw[i][j] = 0;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 14
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 719 1
+ 720 1 for (jj=0; jj<MAXTEXFONTS; jj++) txf2lnf[jj] = -1;
+ 721 1
+ 722 1 /* Fill the fname strings with different valid LN03 font names. */
+ 723 1
+ 724 1 for (i=0; i<maxnfonts; i++)
+ 725 1 strcpy(fname[i],"U000000002SK00GG0001UZZZZ02F000");
+ 726 1 for (jj=1; jj<maxnfonts; jj++) {
+ 727 2 sprintf(cnt,"%02d",jj);
+ 728 2 strncpy(&(fname[jj][5]),cnt,2);
+ 729 2 }
+ 730 1
+ 731 1 /* The margins are set to values appropriate for American 8 1/2 by 11
+ 732 1 paper. It is not clear if this needs to be changed for European A4 paper.
+ 733 1 Not changing it might deprive Europeans of access to the bottom 1.5cm of
+ 734 1 their paper. */
+ 735 1
+ 736 1 maxrmar = 2550;
+ 737 1 maxbmar = 3300;
+ 738 1
+ 739 1 /* In the following, esc[?27h means "advance the carriage by the character
+ 740 1 width when you set a character", esc[11h and esc[7 I together mean to
+ 741 1 interpret all dimensions in escape sequences as pixel units; esc[?52h means
+ 742 1 our origin of coordinates is the upper left edge of the paper; esc[%dt
+ 743 1 means the "maximum length" of the paper is maxbmar pixels. */
+ 744 1
+ 745 1 fprintf(outfile,"\033c\033[?27h\033[11h\033[7 I\033[?52h\033[%dt\n",
+ 746 1 maxbmar);
+ 747 1
+ 748 1 for (i=0; i<maxnfonts; i++) useno[i] = -1;
+ 749 1 for (i=0; i<maxfontnos; i++) whouses[i] = -1;
+ 750 1 maxfno = -1;
+ 751 1
+ 752 1 /* Write font loading escape sequence onto outf. [[It may be desirable to
+ 753 1 make this escape sequence clear all dowloaded fonts from RAM.]] */
+ 754 1
+ 755 1 fprintf(outfile,"\033P0;1;1y");
+ 756 1
+ 757 1 /* Count how many glyphs each font requires. */
+ 758 1
+ 759 1 for (fno=0; fno<nf; fno++) {
+ 760 2
+ 761 2 txfa[fno] -> nchs = 0;
+ 762 2 for(i=0; i<256; i++)
+ 763 2 if (txfa[fno] -> chu[i] != 0) txfa[fno] -> nchs++;
+ 764 2
+ 765 2 if (txfa[fno] -> nchs > 188) goto need_empty_slots;
+ 766 2 chsize += txfa[fno] -> nchs;
+ 767 2 }
+ 768 1 printf("\nFont load to contain %d glyphs.",chsize);
+ 769 1
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 15
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 770 1
+ 771 1 /* Now we have to allocate TeX fonts to LN03 fonts pairs and perform the
+ 772 1 actual load. The goal is to use as few slots as possible, where an LN03
+ 773 1 font pair with <= 94 glyphs is one slot, and a font pair with > 94 but <=
+ 774 1 188 glyphs is two slots.
+ 775 1
+ 776 1 As in the LN01 case, the allocation problem seems to be some sort of hard
+ 777 1 bin packing problem. (Proof of NP-hardness, anyone?) So we use a best fit
+ 778 1 heuristic:
+ 779 1
+ 780 1 1. Find the unassigned largest TeX font. If none, exit, we're done.
+ 781 1
+ 782 1 2. Allocate an LN03 font pair for that TeX font and put the TeX
+ 783 1 font into it.
+ 784 1
+ 785 1 3. Find the largest remaining TeX font that fits in what is left of
+ 786 1 that LN03 font pair.
+ 787 1
+ 788 1 3.1. if none exists, go to 1.
+ 789 1 3.2. if one exists, put it in the font pair and go back to 3.
+ 790 1
+ 791 1 The txford array contains the TeX font numbers in the order that they are
+ 792 1 assigned. Txfcnt keeps track of how many TeX fonts have been assigned so
+ 793 1 far. */
+ 794 1
+ 795 1 lnfcnt = 0;
+ 796 1 txfcnt = 0;
+ 797 1 for (i=0; i<MAXTEXFONTS; i++) txford[i] = -1;
+ 798 1
+ 799 1 while (1) {
+ 800 2
+ 801 2 /* Find largest unassigned TeX font */
+ 802 2
+ 803 2 lnfleft = rightlast-rightfirst+1+leftlast-leftfirst+1;
+ 804 2 txf_size = -1;
+ 805 2 for (j = 0; j < MAXTEXFONTS; j++) {
+ 806 3 if (txfa[j] != 0 && txf2lnf[j] == -1
+ 807 3 && txfa[j] -> nchs > txf_size) {
+ 808 4 txf_size = txfa[j] -> nchs;
+ 809 4 the_txf = j;
+ 810 4 }
+ 811 3 }
+ 812 2 if (txf_size <= 0) goto assignment_done;
+ 813 2 if (lnfcnt > maxnfonts) goto too_complex;
+ 814 2 if (txf_size > lnfleft) goto need_empty_slots;
+ 815 2
+ 816 2 /* Now allocate new LN03 font pair and put the current TeX font into it */
+ 817 2
+ 818 2 txf2lnf[the_txf] = lnfcnt;
+ 819 2 txford[txfcnt] = the_txf;
+ 820 2 txfcnt++;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 16
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 821 2 k = leftfirst-1;
+ 822 2 for (j = 0; j <= 255; j++) {
+ 823 3 if (txfa[the_txf] -> chu[j] != 0) {
+ 824 4 k++;
+ 825 4 if (k == leftlast+1) k = rightfirst;
+ 826 4 lnfleft--;
+ 827 4 txfa[the_txf] -> chu[j] = k;
+ 828 4 }
+ 829 3 }
+ 830 2 lastch[lnfcnt] = k;
+ 831 2
+ 832 2 /* Now try to fill the remaining part of the LN03 font pair using other TeX
+ 833 2 fonts */
+ 834 2
+ 835 2 while (1) {
+ 836 3
+ 837 3 txf_size = -1;
+ 838 3 for (j = 0; j < MAXTEXFONTS; j++) {
+ 839 4 if (txfa[j] != 0 && txf2lnf[j] == -1
+ 840 4 && txfa[j] -> nchs > txf_size
+ 841 4 && txfa[j] -> nchs <= lnfleft) {
+ 842 5 txf_size = txfa[j] -> nchs;
+ 843 5 the_txf = j;
+ 844 5 }
+ 845 4 }
+ 846 3 if (txf_size <= 0) break;
+ 847 3
+ 848 3 txf2lnf[the_txf] = lnfcnt;
+ 849 3 txford[txfcnt] = the_txf;
+ 850 3 txfcnt++;
+ 851 3 k = lastch[lnfcnt];
+ 852 3 for (j=0; j<=255; j++) {
+ 853 4 if (txfa[the_txf] -> chu[j] != 0) {
+ 854 5 k++;
+ 855 5 lnfleft--;
+ 856 5 if (k == leftlast+1) k = rightfirst;
+ 857 5 txfa[the_txf] -> chu[j] = k;
+ 858 5 }
+ 859 4 }
+ 860 3 lastch[lnfcnt] = k;
+ 861 3 }
+ 862 2
+ 863 2 lnfcnt++;
+ 864 2 }
+ 865 1
+ 866 1 assignment_done:
+ 867 1
+ 868 1 /* At this point the array txf2lnf is properly initialized, as are lastch
+ 869 1 and txford. It remains to actually generate the desired font load. This has
+ 870 1 to be done carefully, since the function add_txf_to_lnf only supports
+ 871 1 adding glyphs to an LN03 font pair in ascending order of character code. */
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 17
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 872 1
+ 873 1 for (j=0; j<txfcnt; j++) {
+ 874 2 k = txford[j];
+ 875 2 if (j != 0 && txf2lnf[k] != txf2lnf[txford[j-1]])
+ 876 2 fprintf(outfile,",\n");
+ 877 2 totsize += add_txf_to_lnf(txf2lnf[k],k);
+ 878 2 }
+ 879 1
+ 880 1 /* [[At this point we ought to add code that writes a message saying how
+ 881 1 much font RAM the load will occupy. But there is no documentation for
+ 882 1 determining that! So, we make the following compromise:]] */
+ 883 1
+ 884 1 printf("\n Approximate size of font load: %ld bytes",totsize);
+ 885 1
+ 886 1 /* [[We may want to insert a few \n's in the following to keep the line
+ 887 1 from getting too long.]] */
+ 888 1
+ 889 1 fprintf(outfile,"\n;Dvi2ln3 1 font load\033\\");
+ 890 1 fprintf(outfile,"\033[1;%ds\033[%dt\033[1;%dr",maxrmar,maxbmar,maxbmar);
+ 891 1 for (j=0; j <= min(maxfontnos,lnfcnt-1); j++) {
+ 892 2 useno[j] = j;
+ 893 2 whouses[j] = j;
+ 894 2 k = fname[j][16];
+ 895 2 fname[j][16] = '\0';
+ 896 2 fprintf(outfile,"\033P1;1%d}%s\033\\",j,fname[j]);
+ 897 2 fname[j][16] = k;
+ 898 2 }
+ 899 1 fprintf(outfile,"\033[10m");
+ 900 1
+ 901 1 return(0);
+ 902 1
+ 903 1 too_complex:
+ 904 1 printf("\n Can't construct a font load:");
+ 905 1 printf("\n Dvi file uses too many glyphs from too many different fonts.");
+ 906 1 return(1);
+ 907 1
+ 908 1 /* [[We need to determine what the real limit is on the number of LN03
+ 909 1 fonts, and refine the test to detect if it is being exceeded. Fortunately,
+ 910 1 only a very complex DVI file could exceed the limit.]] */
+ 911 1
+ 912 1 need_empty_slots:
+ 913 1 printf("\nFont %s uses > 188 characters. Can't handle that.",
+ 914 1 font_name[fno]);
+ 915 1 return(1);
+ 916 1
+ 917 1 /* [[The error message above should be fixed to specify the magnification
+ 918 1 of the font also.]] */
+ 919 1
+ 920 1 }
+ 921
+ 922 /* The lines in the LN3 file are limited to lengths of about 100 bytes. We
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 18
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 923 keep track of how many bytes are written so far in the global lnhp. The
+ 924 accounting is conservative, so e.g. each pixel position counts as 4 bytes
+ 925 even though it might be shorter. [[One could easily increase 100 to 200. It
+ 926 is not clear what problems are provoked by going over, say, 256.]]
+ 927
+ 928 Vpset keeps track of whether the vertical position needs to be output to
+ 929 the LN03 file before setting any more characters. Hh_old keeps track of the
+ 930 horizontal position which LN03 thinks it's at. */
+ 931
+ 932 GLOBAL int ln3p,vpset,hh_old;
+ 933
+ 934 #define inc_ln3p(x) ln3p += x; if (ln3p > 100) \
+ 935 { ln3p = 0; vpset = 0; hh_old = 30000; }
+ 936
+ 937 /* [[In the above macro, hh_old is set to 30000 to mean "a very large
+ 938 number" (the maximum valid hh for an LN03 is 2550), so as to force the code
+ 939 below to re-output the true hh. What are the implications of this kludge?
+ 940 Would it not be more reasonable to have instead an hhset variable?]] */
+ 941
+ 942 /* A stack of hvxyzw values is kept; the stack pointer is called s.
+ 943 [[Again, it would be better to make this stack a linked list.]] */
+ 944
+ 945 #define STACKSIZE 100
+ 946
+ 947 GLOBAL long hstack[STACKSIZE], vstack[STACKSIZE], xstack[STACKSIZE],
+ 948 ystack[STACKSIZE], zstack[STACKSIZE], wstack[STACKSIZE];
+ 949 GLOBAL int hhstack[STACKSIZE], vvstack[STACKSIZE];
+ 950 GLOBAL int s;
+ 951
+ 952 /* DVI files specify distances in units of 2^-16 points. When translating
+ 953 to a device-specific format, it is necessary to round the DVI distances to
+ 954 pixel units. This is done by means of the pixel_round macro.
+ 955
+ 956 However, rather than using this macro in the straightforward way, rounding
+ 957 is often performed by more elaborate techniques, which we call "Stanford
+ 958 rules" (after John Le Carre's "Moscow rules"). These rules make use of a
+ 959 parameter MAX_DRIFT, which is roughly the maximum number of pixels that
+ 960 things are allowed to deviate from straightforward rounding. */
+ 961
+ 962 #define pixel_round(x) ((int) ((x<0) ? \
+ 963 (conv*(x)-0.5) : (conv*(x)+0.5)))
+ 964
+ 965 #define MAX_DRIFT 2
+ 966
+ 967 /* Pass2 reads the dvi file and interprets the commands in it, usually by
+ 968 calling other routines. The interpretation generally consists of writing
+ 969 something into the ln3 file, updating the current fonts and positions, and
+ 970 possibly updating the stack. */
+ 971
+ 972 int pass2()
+ 973 {
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 19
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 974 1 int i,j;
+ 975 1 long int p;
+ 976 1 unsigned int k;
+ 977 1
+ 978 1 if (read_preamble() != 0) {
+ 979 2 printf(bad_DVI_message);
+ 980 2 return(1);
+ 981 2 }
+ 982 1
+ 983 1 curf = 0;
+ 984 1 ln3p = 0;
+ 985 1 s = 0;
+ 986 1 vpset = 0;
+ 987 1 hh_old = 30000;
+ 988 1
+ 989 1 /* Skip pages until the desired starting page is reached. A nonzero value
+ 990 1 is returned if the starting page is never encountered. */
+ 991 1
+ 992 1 if (skip_pages() != 0) return(0);
+ 993 1
+ 994 1 for (;;) {
+ 995 2 if feof(dvifile) {
+ 996 3 printf(bad_DVI_message);
+ 997 3 return(1); }
+ 998 2 k = getc(dvifile);
+ 999 2 if (k == post) return(0);
+ 1000 2 if (k >= undefined_command) {
+ 1001 3 printf(bad_DVI_message);
+ 1002 3 return(1); }
+ 1003 2
+ 1004 2 p = first_par(k);
+ 1005 2
+ 1006 2 /* If the opcode is an "implicit parameter" opcode, either set_char_n and
+ 1007 2 fnt_num_n, we change it to an explicit parameter opcode to make the case
+ 1008 2 jumps more reasonable. */
+ 1009 2
+ 1010 2 if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ 1011 2 if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+ 1012 2
+ 1013 2 j = do_command(k,p);
+ 1014 2 if (j == 2) return(0); /* done with the required number of pages */
+ 1015 2 else if (j == 1) return(1); /* error encountered, stop */
+ 1016 2
+ 1017 2 }
+ 1018 1 }
+ 1019
+ 1020 /* Read from the DVI file until the starting page condition is met. Return
+ 1021 1 if something goes wrong, or if the DVI file comes to an end. This
+ 1022 function is copied quite closely from DVItype. */
+ 1023
+ 1024 int skip_pages() {
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 20
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1025 1
+ 1026 1 unsigned int k;
+ 1027 1 int i;
+ 1028 1 long p,first_page;
+ 1029 1 char startp;
+ 1030 1
+ 1031 1 for (;;) {
+ 1032 2 if (feof(dvifile)) return(1);
+ 1033 2 k = getc(dvifile);
+ 1034 2 if (k == post) return(1);
+ 1035 2 p = first_par(k);
+ 1036 2 if (k >= set_char_0 && k < set_char_0+128) k = set1;
+ 1037 2 if (k >= fnt_num_0 && k < fnt_num_0+64) k = fnt1;
+ 1038 2
+ 1039 2 switch (k) {
+ 1040 3 case bop:
+ 1041 3 startp = 1;
+ 1042 3 for (i=0; i<10; i++) {
+ 1043 4 four_bytes;
+ 1044 4 if (i == 0) first_page = lcx.l;
+ 1045 4 if (i < how_many_counts && use_count[i] &&
+ 1046 4 lcx.l != start_page[i]) startp = 0;
+ 1047 4 }
+ 1048 3 four_bytes;
+ 1049 3 if (startp != 0) {
+ 1050 4 v = 0; vv = 0; h = 0; hh = 0;
+ 1051 4 printf("\n [%ld]",first_page);
+ 1052 4 num_pages = 1; return(0); }
+ 1053 3 break;
+ 1054 3 case set_rule:
+ 1055 3 case put_rule:
+ 1056 3 four_bytes;
+ 1057 3 break;
+ 1058 3 four_cases(fnt_def1)
+ 1059 3 i = define_font(p);
+ 1060 3 if (i != 0) return(1);
+ 1061 3 break;
+ 1062 3 four_cases(xxx1)
+ 1063 3 for (; p>0; p--) getc(dvifile);
+ 1064 3 break;
+ 1065 3 default:
+ 1066 3 break;
+ 1067 3 }
+ 1068 2 }
+ 1069 1 return(0);
+ 1070 1 }
+ 1071
+ 1072 /* Do_command performs the DVI command of code k, assuming the "first
+ 1073 parameter" is p. It is assumed that k is not one of set_char0 through
+ 1074 set_char127. */
+ 1075
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 21
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1076 int do_command(k,p)
+ 1077 int k;
+ 1078 long p;
+ 1079 {
+ 1080 1 int i,j,l,lnf;
+ 1081 1
+ 1082 1 switch (k) {
+ 1083 2 four_cases(fnt_def1)
+ 1084 2 define_font_pass2();
+ 1085 2 break;
+ 1086 2
+ 1087 2 /* [[In processing the put and set DVI commands, no check is made that the
+ 1088 2 character being set actually exists in the font. This can lead to messy
+ 1089 2 errors, like access violations or garbage values when one tries to find
+ 1090 2 that character's width. Neither is any check made that the horizontal and
+ 1091 2 vertical positions fall within the page.]] */
+ 1092 2
+ 1093 2 four_cases(put1)
+ 1094 2 four_cases(set1)
+ 1095 2 if (!vpset) {
+ 1096 3 fprintf(outfile,"\n\033[%dd\033[%d`",vv+voff,hh+hoff);
+ 1097 3 ln3p = 16;
+ 1098 3 vpset = 1;
+ 1099 3 hh_old = hh;
+ 1100 3 }
+ 1101 2 if (hh_old != hh) {
+ 1102 3 if (hh > hh_old) fprintf(outfile,"\033[%da",hh-hh_old);
+ 1103 3 else fprintf(outfile,"\033[%d`",hh+hoff);
+ 1104 3 ln3p += 7;
+ 1105 3 }
+ 1106 2 putc(txfa[curf] -> chu[p],outfile);
+ 1107 2 inc_ln3p(1);
+ 1108 2 if (k >= put1) {
+ 1109 3 hh_old = hh;
+ 1110 3 break;
+ 1111 3 }
+ 1112 2 h += font_width[curf][p];
+ 1113 2
+ 1114 2 /* In rounding h to generate the pixel-position hh, Stanford rules (see
+ 1115 2 above) come into play. We set the new hh (horizontal position in pixels) to
+ 1116 2 the value obtained by adding the pixel width of the character being set to
+ 1117 2 the current position. We then correct this value so that it does not exceed
+ 1118 2 the rounded version of the true position by more than MAX_DRIFT pixels.
+ 1119 2
+ 1120 2 Note that if we did not apply Stanford rules here, or equivalently if we
+ 1121 2 set MAX_DRIFT to zero, many more set-X-position commands would appear in
+ 1122 2 the output. */
+ 1123 2
+ 1124 2 hh += chw[txf2lnf[curf]][txfa[curf] -> chu[p]];
+ 1125 2 hh_old = hh;
+ 1126 2 l = pixel_round(h);
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 22
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1127 2 if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ 1128 2 else if (l-hh > MAX_DRIFT) hh = l-MAX_DRIFT;
+ 1129 2 break;
+ 1130 2
+ 1131 2 four_cases(fnt1)
+ 1132 2 set_curf(p);
+ 1133 2 lnf = txf2lnf[curf];
+ 1134 2 if (useno[lnf] == -1) {
+ 1135 3 useno[whouses[maxfontnos]] = -1;
+ 1136 3 useno[lnf] = maxfontnos;
+ 1137 3 whouses[maxfontnos] = lnf;
+ 1138 3 fprintf(outfile,"\033P1;1%d}%16s\033\\",maxfontnos,
+ 1139 3 fname[lnf]);
+ 1140 3 inc_ln3p(26);
+ 1141 3 }
+ 1142 2 fprintf(outfile,"\033[1%dm",useno[lnf]);
+ 1143 2 inc_ln3p(5);
+ 1144 2 break;
+ 1145 2
+ 1146 2 case set_rule:
+ 1147 2 case put_rule:
+ 1148 2
+ 1149 2 /* When converting rule dimensions to pixel dimensions, we do not follow
+ 1150 2 Stanford rules. Rather, we just round the true positions to obtain the
+ 1151 2 pixel positions. This avoids unsightly gaps between rules. [[It should not
+ 1152 2 cause much of a problem with typical rule applications (ruled tables,
+ 1153 2 fraction bars)...but perhaps with large delimiters there might be some
+ 1154 2 difficulty. This needs more thought...]] */
+ 1155 2
+ 1156 2 four_bytes;
+ 1157 2 if (p >= 0 && lcx.l >= 0)
+ 1158 2 do_rule(pixel_round(h),
+ 1159 2 pixel_round(v-p),pixel_round(h+lcx.l),
+ 1160 2 pixel_round(v));
+ 1161 2 if (k == set_rule) {
+ 1162 3 h += lcx.l;
+ 1163 3 hh = pixel_round(h);
+ 1164 3 }
+ 1165 2 break;
+ 1166 2
+ 1167 2 case push:
+ 1168 2 s++;
+ 1169 2 if (s == STACKSIZE) {
+ 1170 3 printf("\n Stack too deep for Dvi2ln3");
+ 1171 3 return(1);
+ 1172 3 }
+ 1173 2 xstack[s] = x;
+ 1174 2 ystack[s] = y;
+ 1175 2 vstack[s] = v;
+ 1176 2 hstack[s] = h;
+ 1177 2 vvstack[s] = vv;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 23
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1178 2 hhstack[s] = hh;
+ 1179 2 wstack[s] = w;
+ 1180 2 zstack[s] = z;
+ 1181 2 break;
+ 1182 2
+ 1183 2 case pop:
+ 1184 2 if (s == 0) {
+ 1185 3 printf(bad_DVI_message);
+ 1186 3 return(1);
+ 1187 3 }
+ 1188 2 if (vv != vvstack[s]) vpset = 0;
+ 1189 2 x = xstack[s];
+ 1190 2 y = ystack[s];
+ 1191 2 v = vstack[s];
+ 1192 2 h = hstack[s];
+ 1193 2 vv = vvstack[s];
+ 1194 2 hh = hhstack[s];
+ 1195 2 w = wstack[s];
+ 1196 2 z = zstack[s];
+ 1197 2 s--;
+ 1198 2 break;
+ 1199 2
+ 1200 2 /* Right now there are no \special's defined, so when we get a \special, we
+ 1201 2 just skip over it. */
+ 1202 2
+ 1203 2 four_cases(xxx1)
+ 1204 2 for (; p != 0; p--) getc(dvifile);
+ 1205 2 break;
+ 1206 2
+ 1207 2 case bop:
+ 1208 2
+ 1209 2 /* If we've done the required number of pages, we'll skip the rest of the
+ 1210 2 DVI file. If not, type the first parameter of bop on the user's terminal
+ 1211 2 the way TeX does, to give an indication of progress. */
+ 1212 2
+ 1213 2 if (num_pages == max_pages) return(2);
+ 1214 2 v = 0; vv = 0; h = 0; hh = 0;
+ 1215 2 vpset = 0; hh_old = 100000;
+ 1216 2 four_bytes;
+ 1217 2 if (num_pages%12 == 0) printf("\n");
+ 1218 2 printf(" [%ld]",lcx.ul);
+ 1219 2 num_pages++;
+ 1220 2 for (i = 0; i<40; i++) getc(dvifile);
+ 1221 2 break;
+ 1222 2
+ 1223 2 case eop:
+ 1224 2 fprintf(outfile,"\n\f");
+ 1225 2 ln3p = 0;
+ 1226 2 break;
+ 1227 2
+ 1228 2 /* Now we have to consider the cases for pure motion. */
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 24
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1229 2
+ 1230 2 four_cases(right1)
+ 1231 2 set_h(h+p);
+ 1232 2 break;
+ 1233 2 four_cases(x1)
+ 1234 2 x = p;
+ 1235 2 case x0:
+ 1236 2 set_h(h+x);
+ 1237 2 break;
+ 1238 2 four_cases(y1)
+ 1239 2 y = p;
+ 1240 2 case y0:
+ 1241 2 set_v(v+y);
+ 1242 2 break;
+ 1243 2 four_cases(w1)
+ 1244 2 w = p;
+ 1245 2 case w0:
+ 1246 2 set_h(h+w);
+ 1247 2 break;
+ 1248 2 four_cases(z1)
+ 1249 2 z = p;
+ 1250 2 case z0:
+ 1251 2 set_v(v+z);
+ 1252 2 break;
+ 1253 2 four_cases(down1)
+ 1254 2 set_v(v+p);
+ 1255 2 break;
+ 1256 2
+ 1257 2 }
+ 1258 1 return(0);
+ 1259 1 }
+ 1260
+ 1261 /* Set_curf sets the current font to external number p. Note that the
+ 1262 current font is maintained as an internal font number. */
+ 1263
+ 1264 int set_curf(p)
+ 1265 int p;
+ 1266 {
+ 1267 1 to_ext[nf] = p;
+ 1268 1 curf = 0;
+ 1269 1 while (to_ext[curf] != p) { curf++; }
+ 1270 1 }
+ 1271
+ 1272 /* Define_font processes a font definition from the DVI file. The TFM file
+ 1273 for the font is read at this point from the directory TEX$FONTS. */
+ 1274
+ 1275 int define_font(e)
+ 1276 int e;
+ 1277 {
+ 1278 1 int i;
+ 1279 1 unsigned char p,n;
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 25
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1280 1 if (e == MAXTEXFONTS) { printf("\n Too many fonts for Dvi2ln3");
+ 1281 2 return(1); }
+ 1282 1 txfa[nf] = malloc(sizeof(struct txf));
+ 1283 1 to_ext[nf] = e;
+ 1284 1 four_bytes;
+ 1285 1 four_bytes;
+ 1286 1 txfa[nf] -> scaled_size = lcx.l;
+ 1287 1 four_bytes;
+ 1288 1 txfa[nf] -> design_size = lcx.l;
+ 1289 1 for (i=0; i<256; i++) txfa[nf] -> chu[i] = '\0';
+ 1290 1 p = getc(dvifile); n = getc(dvifile);
+ 1291 1 font_name[nf] = malloc(p+n+1);
+ 1292 1 for (i=0; i<p+n; i++) { font_name[nf][i] = getc(dvifile); }
+ 1293 1 font_name[nf][p+n] = '\0';
+ 1294 1
+ 1295 1 if (txfa[nf] -> scaled_size <= 0 || txfa[nf] -> scaled_size >=
+ 1296 1 8*8*8*8*8*8*8*8*8) {
+ 1297 2 printf("\n Font %s has a bad scaled size",font_name[nf]);
+ 1298 2 return(1);
+ 1299 2 }
+ 1300 1 if (txfa[nf] -> design_size <= 0 || txfa[nf] -> design_size >=
+ 1301 1 8*8*8*8*8*8*8*8*8) {
+ 1302 2 printf("\n Font %s has a bad design size",font_name[nf]);
+ 1303 2 return(1);
+ 1304 2 }
+ 1305 1
+ 1306 1 /* We follow DVItype and compute for each font a "space" parameter which is
+ 1307 1 one-sixth of the scaled design size. This parameter is used in rounding the
+ 1308 1 horizontal position to pixels according to "Stanford rules." See the
+ 1309 1 function set_h below. */
+ 1310 1
+ 1311 1 txfa[nf] -> space = txfa[nf] -> scaled_size/6;
+ 1312 1
+ 1313 1 i = read_tfm_file();
+ 1314 1 if (i != 0) return(i);
+ 1315 1 nf++;
+ 1316 1 return(0);
+ 1317 1
+ 1318 1 }
+ 1319
+ 1320 /* TFM files, like the DVI file, are read with getc, foolish as that may
+ 1321 seem. We use the same overlays that are used for merging DVI bytes into
+ 1322 longwords. However, since the TFM file consists of longwords, only
+ 1323 tfm_longword is need. [[This is also VAX dependent. It would not be
+ 1324 possible to use stdio's longword reading function getw here, because the
+ 1325 bytes have to be reversed.]] */
+ 1326
+ 1327 #define tfm_longword { lcx.uc[3] = getc(tfmfile); \
+ 1328 lcx.uc[2] = getc(tfmfile); lcx.uc[1] = getc(tfmfile); \
+ 1329 lcx.uc[0] = getc(tfmfile); }
+ 1330
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 26
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1331 /* Read_tfm_file obtains the character widths from the TFM file
+ 1332 corresponding to font nf. */
+ 1333
+ 1334 int read_tfm_file() {
+ 1335 1
+ 1336 1 int i,lh,nw;
+ 1337 1 int info[256];
+ 1338 1 long z,alpha,beta;
+ 1339 1 long width[256];
+ 1340 1
+ 1341 1 open_tfm_file();
+ 1342 1 if (tfmfile == NULL) {
+ 1343 2 printf("\n Can't open TFM file for font %s",font_name[nf]);
+ 1344 2 return(1); }
+ 1345 1
+ 1346 1 /* The TFM format is described in some issue of the TUGBoat (TeX users'
+ 1347 1 group newsletter), and in the comments to the program TFtoPL. Here we
+ 1348 1 summarize those aspects of TFM format that are relevant to the task of
+ 1349 1 extracting the widths of the characters.
+ 1350 1
+ 1351 1 The first 24 bytes of a TFM file contain twelve 16-bit integers that give
+ 1352 1 the lengths of the various subsequent portions of the file. The ones
+ 1353 1 relevant to our purposes are LH, length of the header data, BC, the
+ 1354 1 smallest character code in the font, EC, the largest character code in the
+ 1355 1 font, and NW, number of words in the width table. So, we read those right
+ 1356 1 now, and then skip over the remainder, and then over a set of LH longwords
+ 1357 1 called the "header." */
+ 1358 1
+ 1359 1 tfm_longword;
+ 1360 1 lh = 256*lcx.uc[1] + lcx.uc[0];
+ 1361 1 tfm_longword;
+ 1362 1 txfa[nf] -> bc = 256*lcx.uc[3] + lcx.uc[2];
+ 1363 1 txfa[nf] -> ec = 256*lcx.uc[1] + lcx.uc[0];
+ 1364 1 tfm_longword;
+ 1365 1 nw = 256*lcx.uc[3] + lcx.uc[2];
+ 1366 1 if (txfa[nf] -> bc > 255 || txfa[nf] -> ec > 255 ||
+ 1367 1 txfa[nf] -> bc > txfa[nf] -> ec || nw > 256) {
+ 1368 2 printf("\n Bad TFM file for font %s",font_name[nf]);
+ 1369 2 return(1);
+ 1370 2 }
+ 1371 1
+ 1372 1 for(i=0; i<lh+3; i++) tfm_longword;
+ 1373 1
+ 1374 1 /* After the header, there are two arrays in the TFM file that interest us.
+ 1375 1 The first, INFO, is EC-BC+1 longwords long and contains pointers to the
+ 1376 1 second, WIDTH, which is NW longwords long. For each character i, the width
+ 1377 1 of i is WIDTH[INFO[i-BC]]. We read these arrays into memory. */
+ 1378 1
+ 1379 1 for(i=0; i<txfa[nf] -> ec-txfa[nf] -> bc+1; i++) {
+ 1380 2 tfm_longword;
+ 1381 2 if (lcx.uc[3] >= nw) {
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 27
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1382 3 printf("\n Bad TFM file for font %s",font_name[nf]);
+ 1383 3 return(1);
+ 1384 3 }
+ 1385 2 info[i] = lcx.uc[3];
+ 1386 2 }
+ 1387 1
+ 1388 1 /* The widths are stored in a rather strange format known as a "fix-word."
+ 1389 1 A nonnegative width is expressed in "fix-word" format by expressing it in
+ 1390 1 units of 2^-20 times the design size. A negative width is expressed in
+ 1391 1 "fix-word" format by expressing its negative in those units, and then
+ 1392 1 changing the most significant byte to 255.
+ 1393 1
+ 1394 1 One needs to convert these widths into DVI units, multiplying by the scaled
+ 1395 1 design size according to a certain arcane algorithm. The algorithm is
+ 1396 1 copied from DVItype, to which we refer the reader for an explanation. */
+ 1397 1
+ 1398 1 z = txfa[nf] -> scaled_size;
+ 1399 1 alpha = 16*z; beta = 16;
+ 1400 1 while (z >= 4*(8*8*8*8*8*8*8)) { z = z/2; beta = beta/2; }
+ 1401 1 for(i=0; i<nw; i++) {
+ 1402 2 tfm_longword;
+ 1403 2 width[i] = ( ( (lcx.uc[0]*z)/256 + lcx.uc[1]*z )/256 +
+ 1404 2 lcx.uc[2]*z)/beta;
+ 1405 2 if (lcx.uc[3] == 255) width[i] -= alpha;
+ 1406 2 }
+ 1407 1
+ 1408 1 fclose(tfmfile);
+ 1409 1
+ 1410 1 /* Using these two arrays, we now compute the widths of the characters in
+ 1411 1 the fonts and place them into two malloc'ed arrays, one for the widths in
+ 1412 1 DVI units, one for the width in pixel units. */
+ 1413 1
+ 1414 1 font_width[nf] = malloc(4*(txfa[nf] -> ec+1));
+ 1415 1
+ 1416 1 for (i=0; i<txfa[nf] -> bc; i++) font_width[nf][i] = 0;
+ 1417 1 for (i=txfa[nf] -> bc; i <= txfa[nf] -> ec; i++)
+ 1418 1 font_width[nf][i] = width[info[i-txfa[nf] -> bc]];
+ 1419 1 return(0);
+ 1420 1 }
+ 1421
+ 1422 /* Open_tfm_file finds and opens the tfm file corresponding to a font nf.
+ 1423 The global file variable tfmfile is used to hold the file pointer. [[This
+ 1424 function will not work if the TFM file lies over the net on a VMS V3.x
+ 1425 host, because C file opens do not work in such circumstances. The problem
+ 1426 can be ignored, because eventually there should be no VMS V3.x hosts
+ 1427 left.]] */
+ 1428
+ 1429 int open_tfm_file () {
+ 1430 1
+ 1431 1 int jext,jnam;
+ 1432 1 char filespec[FILESPECLEN];
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 28
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1433 1
+ 1434 1 find_VMS_filename(font_name[nf],&jnam,&jext);
+ 1435 1 filespec[0] = '\0';
+ 1436 1
+ 1437 1 /* If there is no directory part, fill in using the logical tex$fonts */
+ 1438 1
+ 1439 1 if (jnam == 0) strcpy(filespec,"tex$fonts:");
+ 1440 1 strcat(filespec,font_name[nf]);
+ 1441 1
+ 1442 1 /* if there is no extension, add the extension ".tfm" */
+ 1443 1
+ 1444 1 if (font_name[nf][jext] == '\0') strcat(filespec,".tfm");
+ 1445 1 tfmfile = fopen(filespec,"r");
+ 1446 1
+ 1447 1 }
+ 1448
+ 1449 /* Define_font_pass2 skips a font definition from the DVI file. */
+ 1450
+ 1451 int define_font_pass2()
+ 1452 {
+ 1453 1 unsigned char p,n;
+ 1454 1 int i;
+ 1455 1 four_bytes;
+ 1456 1 four_bytes;
+ 1457 1 four_bytes;
+ 1458 1 p = getc(dvifile); n = getc(dvifile);
+ 1459 1 for (i=0; i<p+n; i++) getc(dvifile);
+ 1460 1 }
+ 1461
+ 1462 /* Do_rule writes into the ln3 file the escape sequence corresponding
+ 1463 to a rule. */
+ 1464
+ 1465 int do_rule(xx0,yy0,xx1,yy1)
+ 1466 int xx0,yy0,xx1,yy1;
+ 1467 {
+ 1468 1 int j;
+ 1469 1
+ 1470 1 xx0 = min(xx0+hoff,maxrmar);
+ 1471 1 xx1 = min(xx1+hoff,maxrmar);
+ 1472 1 xx0 = max(xx0,0);
+ 1473 1 xx1 = max(xx1,0);
+ 1474 1 yy0 = min(yy0+voff,maxbmar);
+ 1475 1 yy1 = min(yy1+voff,maxbmar);
+ 1476 1 yy0 = max(yy0,0);
+ 1477 1 yy1 = max(yy1,0);
+ 1478 1 if (xx0 > xx1) { j = xx0; xx0 = xx1; xx1 = j; }
+ 1479 1 if (yy0 > yy1) { j = yy0; yy0 = yy1; yy1 = j; }
+ 1480 1
+ 1481 1 if ((yy1 != yy0 && xx1 != xx0)) {
+ 1482 2 fprintf(outfile,"\033[1;%d;%d;%d;%d!|",
+ 1483 2 xx0,yy0,yy1-yy0,xx1-xx0);
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 29
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+ 1484 2 inc_ln3p(25);
+ 1485 2 }
+ 1486 1 }
+ 1487
+ 1488 /* Set_v is called to execute vertical-position-altering commands, other
+ 1489 than pops. It modifies v and vv, and outputs the vertical position to the
+ 1490 LN3 file. We don't follow Stanford rules here. They sometimes set the
+ 1491 vertical position in pixels vv to something other than the rounded value of
+ 1492 v. Not following Stanford rules implies, for example, that the relative
+ 1493 vertical positions of an accent and its accentee may differ by one pixel
+ 1494 according to how the baseline of the accentee gets rounded. [[This should
+ 1495 perhaps be fixed.]] */
+ 1496
+ 1497 int set_v(v1)
+ 1498 int v1;
+ 1499 {
+ 1500 1 int l;
+ 1501 1
+ 1502 1 l = pixel_round(v1);
+ 1503 1 v = v1;
+ 1504 1 vv = l;
+ 1505 1 vpset = 0;
+ 1506 1 }
+ 1507
+ 1508 /* Set_h is called whenever a DVI command is encountered that alters the
+ 1509 horizonal position, other than a set_char, set_rule or pop. It sets h to
+ 1510 the new value, and alters hh according to Stanford rules, printing the new
+ 1511 hh in the LN3 file. */
+ 1512
+ 1513 int set_h(new_h)
+ 1514 int new_h;
+ 1515 {
+ 1516 1 int l,old_hh;
+ 1517 1
+ 1518 1 old_hh = hh;
+ 1519 1 l = pixel_round(new_h);
+ 1520 1 if (txfa[curf] == 0 || new_h-h >= txfa[curf] -> space
+ 1521 1 || new_h-h <= -4*txfa[curf] -> space) hh = l;
+ 1522 1 else {
+ 1523 2 hh += pixel_round(new_h-h);
+ 1524 2 if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ 1525 2 else if (hh-l < -MAX_DRIFT) hh = l-MAX_DRIFT;
+ 1526 2 }
+ 1527 1 h = new_h;
+ 1528 1 return(0);
+ 1529 1 }
+
+
+
+Command Line
+------------
+
+DVI2LN3 14-OCT-1985 13:19:13 VAX C V2.0-003 Page 30
+V1.0 14-OCT-1985 13:19:01 USER$4:[TEX.LN03.SOURCES]DVI2LN3.C;40 (1)
+
+
+CC/DEB/LIS DVI2LN3
+
diff --git a/dviware/ln03/rose/dvi2ln3nft.c b/dviware/ln03/rose/dvi2ln3nft.c
new file mode 100644
index 0000000000..dd6e0983b1
--- /dev/null
+++ b/dviware/ln03/rose/dvi2ln3nft.c
@@ -0,0 +1,1145 @@
+/* This file contains those portions of Dvi2ln3 that create font loads. It
+is still being developed...
+
+Copyright (c) 1983, 1984, 1985, 1986 by Digital Equipment Corporation.
+Author: Flavio Rose, ...!decwrl!dec-rhea!dec-dvinci!rose.
+
+Development chronology:
+
+11/28/84: Initial version in PL/I. Finished 11/30/84.
+ 3/4/85: C translation, a prelude to writing DVI2LN3.
+ 5/7/85: Finally got around to debugging the C translation!
+ 6/5/85: Convert to work with Dvi2ln3 -- minor changes.
+ 6/18/85: Try not to use big input array.
+ 6/22/85: Cleanup, try to identify longs.
+11/12/85: Changed to read PXLs rather than LN03 format files. Old file
+ called dvi2ln3nft, now renamed to dvi2ln3pxl.
+11/15/85: More optimized PXL reading -- use lnf instead of the pxlbuf
+ when reading rasters. Return just status value from add_txf_...,
+ use ras_len_added to communicate size. Facilitate error
+ recovery with copy_ersatz_char. LN03 file reading functionality
+ woven back in.
+ 1/16/86: Embarrassing bug, forgot to close the nftf after done with it.
+ 3/28/86: Conditionalization for Ultrix.
+ 4/7/86: After moving this to 4.3bsd at MIT, a couple more
+ fixes to the portability.
+
+*/
+
+/* INTRODUCTION: When writing an LN03 driver for TeX, it must be kept in
+mind that the LN03 has limited font storage capability. The standard LN03
+has just 27k bytes, and two 128k byte RAM cartridges may be added.
+
+For this reason, when we convert a DVI file to LN03 form, we build a
+special font load that has just the glyphs that the DVI file needs. This
+allows very complex files, e.g. the first nine chapters of the
+Metafontbook, to be printed on LN03s that have just one extra RAM
+cartridge. This approach does, however, consume considerable resources in
+the VAX to build those font loads. */
+
+/* The following is customary boilerplate. */
+
+#ifdef vms
+#include stdio
+#else
+#include <stdio.h>
+#endif
+
+/* In VMS we declare external variables to be globalref.
+This is not really necessary, just an old habit. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+/* The following symbols are declared compatibly with those in the file
+Dvi2ln3.c. */
+
+#define maxnfonts 31
+#define MAXTEXFONTS 100
+#define FILESPECLEN 252
+#define leftfirst 33
+#define leftlast 126
+#define rightfirst 161
+#define rightlast 254
+
+EXTERN FILE *outfile;
+EXTERN int lastch[maxnfonts];
+EXTERN unsigned char chw[maxnfonts][256];
+
+struct txf { unsigned char chu[256]; int bc, ec; long space, design_size,
+ scaled_size; int nchs; };
+EXTERN struct txf *txfa[MAXTEXFONTS+1];
+EXTERN long int *font_width[MAXTEXFONTS+1];
+
+EXTERN char *font_name[MAXTEXFONTS+1];
+EXTERN float conv, unmag_conv;
+
+#ifndef vms
+char *getenv();
+#endif
+
+/* The LN03 font load we build is buffered in a fixed-size area, slightly
+smaller than the maximum amount of font memory available on an LN03. [[The
+code should be changed to chain fixed-size buffers, so font loads of
+unlimited size can be handled, subject only to memory availability. On
+systems with limited memory, it may be desirable to use a disk file instead
+of this buffer.]] */
+
+#define OBUFLEN 2*256*256
+GLOBAL unsigned char lnf[OBUFLEN];
+
+/* While constructing the font load, we keep track of the length of the
+"character definitions area" in ras_len. We also have to keep track of the
+raster size measured in three different ways, as psize (portrait), lsize
+(landscape), and msize (mixed). This is required to fill certain fields in
+the font load. */
+
+GLOBAL long int ras_len,psize,lsize,msize;
+
+/* The font load that we construct consists of a number of LN03 fonts. Each
+of these contains up to 94 glyphs. They may be "left fonts", so their
+glyphs are invoked with codes 33 through 126; or they may be "right fonts"
+that respond to codes 161 through 254.
+
+The font load that we construct is made up of alternating left and right
+fonts (sometimes called "font pairs"). A TeX font (represented by a txf
+record) is added to a font pair. It may be split between the left and right
+halves of the pair.
+
+The variable using_r keeps track of whether we are using a right font. */
+
+GLOBAL char using_r;
+
+GLOBAL unsigned int nft_first_ch,nft_last_ch,chardir_offset;
+GLOBAL int lnf_chardir,ras_beg;
+GLOBAL long ras_len_added;
+
+GLOBAL int pxlf,nftf;
+
+/* The purpose of add_txf_to_lnf is to read the PXL or LN03 font file
+corresponding to TeX font txfno and add its rasters to the font pair
+referred to by lnfno. The function returns 0 if all went well, and various
+negative numbers to indicate problems. The number of bytes added to the
+font load is returned in the global ras_len_added. */
+
+int add_txf_to_lnf(lnfno,txfno)
+int lnfno,txfno;
+{
+ int i,j,k,l,width;
+ int first_txfc,last_txfc;
+ char first_txf,last_txf;
+
+ ras_len_added = 0;
+
+ if (txfno < 0 || txfno > MAXTEXFONTS || txfa[txfno] == 0 ||
+ lnfno < 0 || lnfno > maxnfonts) {
+ printf("\nDvi2ln3 internal error, bad txfno or lnfno");
+ goto error_return;
+ }
+
+/* Now, compute first_txfc and last_txfc, the first and last characters
+codes to be copied from the TeX font. */
+
+ first_txfc = -1; last_txfc = -1;
+ for (i=0; i<256; i++) {
+ if (txfa[txfno] -> chu[i] != 0) {
+ if (first_txfc == -1) first_txfc = i;
+ last_txfc = i;
+ }
+ }
+ if (first_txfc == -1 || last_txfc == -1) return(0);
+
+/* Tell user what font is being loaded */
+
+ printf("\nLoading font %s",font_name[txfno]);
+ k = (1500.0*conv*txfa[txfno] -> scaled_size)/
+ (unmag_conv*txfa[txfno] -> design_size) + 0.5;
+ l = ((float)k)/15.0 + 0.5;
+ if (l != 100) printf(" (magnified %d%%)",l);
+
+/* Now open the file from which we are getting rasters. We look first for a
+PXL file, then for an LN03 format font file (NFT file). */
+
+ pxlf = -1;
+ nftf = -1;
+ open_nft_file(txfno);
+ if (nftf == -1) open_pxl_file(txfno);
+
+/* If neither a PXL file nor an LN03 format file could be opened, warn the
+user. The font load will be filled in with blanks nonetheless. */
+
+ if (pxlf == -1 && nftf == -1)
+ printf("\n Couldn't find good font file: using blanks");
+
+/* Now replace first_txfc and last_txfc by the character codes into which
+they are going to be copied. */
+
+ first_txfc = txfa[txfno] -> chu[first_txfc];
+ last_txfc = txfa[txfno] -> chu[last_txfc];
+
+/* Determine if this is the first or last TeX font that is being copied
+into the current LN03 font pair. */
+
+ first_txf = (first_txfc == leftfirst);
+ last_txf = (last_txfc == lastch[lnfno]);
+
+/* If this is the first TeX font for the current LN03 font pair, then we
+have to initialize the LN03 font load buffer. The initialization routine
+computes where the rasters begin in the output buffer, puts in the blanks,
+etc. */
+
+ if (first_txf) {
+ using_r = 0;
+ initialize_lnf(lnfno);
+ }
+
+/* Now go through all the characters in the TeX font and copy their rasters
+into the appropriate positions in the LN03 font pair. When we copy the the
+last rasters into the left font, we write the font out and then a comma to
+separate it from the next font. [[Fencepost error?]] */
+
+ for (i=0; i<256; i++) {
+ if (txfa[txfno] -> chu[i] != 0) {
+ j = txfa[txfno] -> chu[i];
+ if (!using_r && j >= rightfirst) {
+ write_lnf();
+ fprintf(outfile,"\n,");
+ using_r = 1;
+ initialize_lnf(lnfno);
+ }
+ if (pxlf != -1) {
+ k = copy_pxl_char(i,j,lnfno);
+ if (k != 0) {
+ close(pxlf);
+ pxlf = -1;
+ }
+ } else if (nftf != -1) {
+ k = copy_nft_char(i,j,lnfno);
+ if (k != 0) {
+ close(nftf);
+ nftf = -1;
+ }
+ }
+ if (pxlf == -1 && nftf == -1) {
+ width = font_width[txfno][i]*conv+0.5;
+ k = copy_ersatz_char(j,lnfno,width);
+ }
+ }
+ }
+
+ if (nftf != -1) close(nftf);
+ if (pxlf != -1) close(pxlf);
+
+/* If this is the last TeX font being added to this LN03 font pair, write
+out the current font (right or left) from the pair. */
+
+ if (last_txf) write_lnf();
+
+/* Type and return the incremental amount of space that the TeX font being
+added takes up in the output font load. */
+
+ ras_len_added += 4*(txfa[txfno] -> nchs);
+ printf(", %d bytes",ras_len_added);
+
+ return(0);
+
+error_return:
+ return(-1);
+
+}
+
+/* A buffer is used to hold the directory part of the PXL file. */
+
+#define PXLBUFSIZE 4*517
+
+GLOBAL unsigned char pxlbuf[PXLBUFSIZE];
+GLOBAL long pxllen;
+
+/* The value pxlconv is computed to be the correct conversion factor from the
+widths in the PXL file, which are expressed in units of 2^-20 times the
+design size, to pixels. */
+
+GLOBAL float pxlconv;
+
+/* As usual when dealing with TeX files, we have to rearrange bytes in
+an overlay to combine them into longwords. The reason for this is that
+bytes in TeX files are combined into longwords the opposite way from how
+the VAX combines them.
+
+Hence, the following overlay and macro: */
+
+GLOBAL union lc { unsigned long int ul;
+ long int l;
+ unsigned char c[4]; } lcy;
+
+#define copy_from_lnf(i) lcy.c[0] = lnf[i]; lcy.c[1] = lnf[i+1]; \
+ lcy.c[2] = lnf[i+2]; lcy.c[3] = lnf[i+3]
+#define copy_to_lnf(i) lnf[i] = lcy.c[0]; lnf[i+1] = lcy.c[1]; \
+ lnf[i+2] = lcy.c[2] ; lnf[i+3] = lcy.c[3]
+#define copy_from_pxl(_x) { lcy.c[3] = pxlbuf[_x]; \
+ lcy.c[2] = pxlbuf[(_x)+1]; lcy.c[1] = pxlbuf[(_x)+2]; \
+ lcy.c[0] = pxlbuf[(_x)+3]; }
+
+/* open_pxl_file reads the last 517 longwords of the PXL file into the
+pxlbuf. */
+
+int open_pxl_file(txfno)
+int txfno;
+{
+
+ long i,j;
+ float two_to_the_20th = 0x100000;
+ int k,l,jnam,jext,target;
+ char fullspec[FILESPECLEN];
+#ifndef vms
+ char *pxldir;
+#endif
+
+ find_filename(font_name[txfno],&jnam,&jext);
+
+ fullspec[0] = '\0';
+#ifdef vms
+ if (jnam == 0) strcpy(fullspec,"TEX$PXLDIR:");
+#else
+ if (jnam == 0) {
+ pxldir = getenv("TEX_PXLDIR");
+ strcpy(fullspec,pxldir);
+ strcat(fullspec,"/");
+ }
+#endif
+ strcat(fullspec,font_name[txfno]);
+ k = (1500.0*conv*txfa[txfno] -> scaled_size)/
+ (unmag_conv*txfa[txfno] -> design_size) + 0.5;
+ l = strlen(fullspec);
+ sprintf(&fullspec[l],".%dpxl\0",k);
+
+ pxllen = 0;
+ pxlf = open(fullspec,0);
+ if (pxlf == -1) return(1);
+
+ lseek(pxlf,-517*4,2);
+ i = read(pxlf,pxlbuf,517*4);
+ if (i != 517*4) {
+ printf("\n Error while reading PXL file");
+ close(pxlf);
+ pxlf = -1;
+ return(1);
+ }
+ pxllen = 4*517;
+
+/* Now that we have read the PXL file, check that it is in correct format
+by looking for a trailing ID byte of 1001. */
+
+ copy_from_pxl(pxllen-4);
+ if (lcy.ul != 1001) {
+ printf("\n Error while reading PXL file");
+ close(pxlf);
+ pxlf = -1;
+ return(1);
+ }
+
+/* If the format is correct, derive a scale factor for the widths. */
+
+ copy_from_pxl(pxllen-12);
+ pxlconv = lcy.ul;
+ copy_from_pxl(pxllen-16);
+ pxlconv = (pxlconv/two_to_the_20th)*(lcy.ul/5.0)
+ *(1.0/(72.27*two_to_the_20th));
+ return(0);
+
+}
+
+GLOBAL unsigned char rev_byte[256] = {
+ 0,128,64,192,32,160,96,224,
+ 16,144,80,208,48,176,112,240,
+ 8,136,72,200,40,168,104,232,
+ 24,152,88,216,56,184,120,248,
+ 4,132,68,196,36,164,100,228,
+ 20,148,84,212,52,180,116,244,
+ 12,140,76,204,44,172,108,236,
+ 28,156,92,220,60,188,124,252,
+ 2,130,66,194,34,162,98,226,
+ 18,146,82,210,50,178,114,242,
+ 10,138,74,202,42,170,106,234,
+ 26,154,90,218,58,186,122,250,
+ 6,134,70,198,38,166,102,230,
+ 22,150,86,214,54,182,118,246,
+ 14,142,78,206,46,174,110,238,
+ 30,158,94,222,62,190,126,254,
+ 1,129,65,193,33,161,97,225,
+ 17,145,81,209,49,177,113,241,
+ 9,137,73,201,41,169,105,233,
+ 25,153,89,217,57,185,121,249,
+ 5,133,69,197,37,165,101,229,
+ 21,149,85,213,53,181,117,245,
+ 13,141,77,205,45,173,109,237,
+ 29,157,93,221,61,189,125,253,
+ 3,131,67,195,35,163,99,227,
+ 19,147,83,211,51,179,115,243,
+ 11,139,75,203,43,171,107,235,
+ 27,155,91,219,59,187,123,251,
+ 7,135,71,199,39,167,103,231,
+ 23,151,87,215,55,183,119,247,
+ 15,143,79,207,47,175,111,239,
+ 31,159,95,223,63,191,127,255
+ };
+
+#define pxl_word(_x) (pxlbuf[_x]*256+pxlbuf[(_x)+1])
+#define signed_pxl_word(_x) ((pxl_word(_x)>0x8000) ? \
+ (pxl_word(_x)-0x10000) : pxl_word(_x))
+
+/* Copy_pxl_char copies the rasters and character directory information
+corresponding to code from in the PXL file, into the to position of the
+LN03 font load buffer. */
+
+int copy_pxl_char(from,to,lnfno)
+unsigned char from,to;
+int lnfno;
+{
+
+ unsigned long ds,rs,i,j,def_start;
+ unsigned int rows,cols,k,l,m,n;
+ int xoffset, yoffset;
+ int width;
+ char all_blank;
+
+/* Check if the character code from is in the right range for the PXL file.
+*/
+
+ if (from > 127) return(1);
+
+/* Locate the definition and the rasters for from in the PXL file. */
+
+ ds = 16*from;
+ copy_from_pxl(ds+8);
+ rs = 4*lcy.ul;
+ cols = pxl_word(ds); rows = pxl_word(ds+2);
+
+/* If a glyph has no rasters, an "undocumented feature" of the LN03 seems
+to cause the glyph to be printed incorrectly. Because of this, we set the
+number of rows and columns to 1, and put in a blank byte (below). */
+
+ all_blank = ((rows == 0) & (cols == 0)) | rs == 0;
+ if (all_blank) {
+ cols = 1;
+ rows = 1;
+ }
+
+/* Compute the width of the glyph in pixels, the xoffset, and the yoffset.
+*/
+
+ copy_from_pxl(ds+12);
+ width = pxlconv*lcy.ul+0.5;
+ xoffset = signed_pxl_word(ds+4);
+ yoffset = signed_pxl_word(ds+6);
+ chw[lnfno][to] = width;
+
+/* Check that we have enough room left in the LN03 font load buffer. Fudge
+factor of 3 added because the read below may read too much. */
+
+ def_start = ras_beg+ras_len;
+ if (def_start+rows*((cols+7)/32)+24+3 > OBUFLEN) {
+ printf("\nNo more room in LN03 font load buffer (%ld bytes long)",
+ OBUFLEN);
+ return(1);
+ }
+
+/* Clear the character definition area in the LN03 font load buffer. */
+
+ for(i=0; i<24+rows*((cols+7)/8); i++)
+ lnf[def_start+i] = 0;
+
+/* Set the fields in the first six longwords of the LN03 font load
+character definition. The first assignment sets the so-called "flag flag",
+which must be always be set according to the Common Font File Format. A
+conversion factor of 24 is used in converting pixel values, because the
+values are supposed to be in centipoints in the LN03 font load, and if we
+assume there are 300 pixels in an inch, then there are 7200 centipoints in
+an inch. */
+
+ lnf[def_start+3] = 0x80;
+ lcy.ul = 24*width;
+ copy_to_lnf(def_start+4);
+ lcy.l = -24*xoffset;
+ copy_to_lnf(def_start+8);
+ lcy.l = -24*yoffset;
+ copy_to_lnf(def_start+12);
+
+/* The rasters are always placed in portrait into the LN03 font load, with
+no use of run-length encoding. Thus, the orient field in the raster format
+will be 0, and the Type 1 field is set to 0x81. */
+
+ lnf[def_start+17] = 0x81;
+ lnf[def_start+20] = rows%256;
+ lnf[def_start+21] = rows/256;
+ lnf[def_start+22] = cols%256;
+ lnf[def_start+23] = cols/256;
+
+/* Now we copy the rasters themselves. As we do so, we have to reverse
+the bits within each byte. */
+
+ k = (cols+31)/32;
+ n = (cols+7)/8;
+ lseek(pxlf,rs,0);
+ if (!all_blank) {
+ for (l=0; l<rows; l++) {
+ read(pxlf,&lnf[def_start+24+n*l],4*k);
+ }
+ for (m=0; m<n*rows; m++)
+ lnf[def_start+24+m] = rev_byte[lnf[def_start+24+m]];
+ }
+
+/* Set the character locator, increment the LN03 font load buffer length,
+and recompute the three sizes. */
+
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += 24+rows*n;
+ ras_len_added += 24+rows*n;
+ if (ras_len%2 == 1) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+
+ i = rows*((cols+7)/8);
+ psize += i;
+ j = ((rows+7)/8)*cols;
+ lsize += j;
+ msize += (i > j) ? i : j;
+
+ return(0);
+}
+
+/* Write a blank character of specified width (in pixels) into LN03 font
+load buffer. Also, set the chw array. [[This function is a bit excessive.
+If we couldn't find a character's rasters, it would suffice just to leave
+the character locator blank.]] */
+
+int copy_ersatz_char(to,lnfno,width)
+unsigned char to;
+int lnfno,width;
+{
+
+ unsigned long ds,rs,i,j,def_start;
+ unsigned int rows,cols,k,l,m,n;
+
+ cols = 1;
+ rows = 1;
+ chw[lnfno][to] = width;
+
+/* Check that we have enough room left in the LN03 font load buffer. Return
+silently if not. */
+
+ def_start = ras_beg+ras_len;
+ if (def_start+rows*((cols+7)/32)+24 > OBUFLEN) return(1);
+
+/* Clear the character definition area in the LN03 font load buffer. */
+
+ for(i=0; i<24+rows*((cols+7)/8); i++)
+ lnf[def_start+i] = 0;
+ lnf[def_start+3] = 0x80;
+ lcy.ul = 24*width;
+ copy_to_lnf(def_start+4);
+
+/* The rasters are always placed in portrait into the LN03 font load, with
+[no use of run-length encoding. Thus, the orient field in the raster format
+will be 0, and the Type 1 field is set to 0x81. */
+
+ lnf[def_start+17] = 0x81;
+ lnf[def_start+20] = rows%256;
+ lnf[def_start+21] = rows/256;
+ lnf[def_start+22] = cols%256;
+ lnf[def_start+23] = cols/256;
+
+/* Set the character locator, increment the LN03 font load buffer length,
+and recompute the three sizes. */
+
+ n = (cols+7)/8;
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += 24+rows*n;
+ ras_len_added += 24+rows*n;
+ if (ras_len%2 == 1) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+
+ i = rows*((cols+7)/8);
+ psize += i;
+ j = ((rows+7)/8)*cols;
+ lsize += j;
+ msize += (i > j) ? i : j;
+
+ return(0);
+}
+
+/* The opening part of each NFT file is copied into the array nfta.
+Nftlen keeps track of how much of the NFT file we have read. Nftf
+is the file descriptor used to do the reading. */
+
+GLOBAL unsigned char nfta[480+1024];
+GLOBAL long nftlen;
+
+#define copy_from_nft(i) lcy.c[0] = nfta[i]; lcy.c[1] = nfta[i+1]; \
+ lcy.c[2] = nfta[i+2]; lcy.c[3] = nfta[i+3]
+
+/* Open_nft_file opens the NFT file and reads the opening part into the NFT
+array. */
+
+int open_nft_file(txfno)
+int txfno;
+{
+ int k,l,jnam,jext,target;
+ char fullspec[FILESPECLEN];
+#ifndef vms
+ char *ln3dir;
+#endif
+
+ find_filename(font_name[txfno],&jnam,&jext);
+
+ fullspec[0] = '\0';
+#ifdef vms
+ if (jnam == 0) strcpy(fullspec,"TEX$LN03DIR:");
+#else
+ if (jnam == 0) {
+ ln3dir = getenv("TEX_LN03DIR");
+ strcpy(fullspec,ln3dir);
+ strcat(fullspec,"/");
+ }
+#endif
+ strcat(fullspec,font_name[txfno]);
+ k = (100.0*conv*txfa[txfno] -> scaled_size)/
+ (unmag_conv*txfa[txfno] -> design_size) + 0.5;
+ if (k == 100) strcat(fullspec,".nft");
+ else {
+ l = strlen(fullspec);
+ if (k < 1000) sprintf(&fullspec[l],".%03d\0",k);
+ else sprintf(&fullspec[l],".%d\0",k);
+ }
+
+ nftlen = 0;
+ nftf = open(fullspec,0);
+ if (nftf == -1) return(1);
+
+ if (read_nft_with_retry(nfta,480) != 0) {
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* The NFT file might be random, or it might be a Common Font File Format
+file that isn't loadable into an LN03. So, we make a few checks.
+
+The second longword must be 'FONT'. */
+
+ if (nfta[4] != 'F' || nfta[5] != 'O' || nfta[6] != 'N'
+ || nfta[7] != 'T') {
+ printf(" -- Bad NFT file, lacks FONT.");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* We also check that there are a full 16 bytes of character parameters. If
+there are fewer, we give up: LN03s need all sixteen, and it's too hard to
+figure out how to give the missing ones reasonable values.
+
+Throughout this program, we define some constants beginning with fnt__
+which define byte offsets into the nft file. [[The long prefixes of these
+may cause some trouble if one's C compiler does not recognize too many
+significant characters in identifiers.]] */
+
+#define fnt__l_parameters_size 200
+
+ copy_from_nft(fnt__l_parameters_size);
+ if (lcy.l != 16) {
+ printf(" -- bad NFT file, not enough character parameters");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* Set the variable that tells us the starting location of the
+character directory. */
+
+ chardir_offset = 480;
+
+/* Figure out what the first and last character codes in the NFT file are.
+*/
+
+#define fnt__l_first_character 164
+
+ copy_from_nft(fnt__l_first_character);
+ nft_first_ch = lcy.l;
+ copy_from_nft(fnt__l_first_character+4);
+ nft_last_ch = lcy.l;
+
+/* We must have 0 <= nft_first_ch <= nft_last_ch <= 255, otherwise we
+give up on the NFT file. */
+
+ if (!((0 <= nft_first_ch) && (nft_first_ch <= nft_last_ch) &&
+ (nft_last_ch <= 255))) {
+ printf(" -- bad NFT file, bad character range.");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* Now read the character directory into the nfta. */
+
+ target = chardir_offset+4*(nft_last_ch+1-nft_first_ch);
+ if (read_nft_with_retry(&nfta[480],target) != 0) {
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+ return(0);
+}
+
+/* Copy_nft_char copies the character parameters and rasters corresponding
+to the from argument out of the NFT file and into the LN03 font buffer. It
+also updates the chw (character width) array. */
+
+int copy_nft_char(from,to,lnfno)
+unsigned char from,to;
+int lnfno;
+{
+
+ int rows,columns,quo;
+ long i,j,len,def_start,target;
+
+/* Replace from by the first character code if the NFT file has no rasters
+for code from. If this is done, the output will of course be mangled. The
+user has already been warned above, so no further message is needed. */
+
+ if (from < nft_first_ch) from = nft_first_ch;
+ if (from > nft_last_ch) from = nft_last_ch;
+
+/* First we need to determine def_start, the byte offset of the character
+definition for code from in the NFT file */
+
+ copy_from_nft(chardir_offset+(from-nft_first_ch)*4);
+ def_start = lcy.l;
+
+/* If the locator is earlier in the file, just give up. Otherwise, assume
+it's good, continue and give a vague error message is something goes wrong.
+*/
+
+ if (def_start < nftlen || read_nft_until(def_start) != 0) {
+ printf("\n LN03 font file bad, using blanks");
+ return(1);
+ }
+
+/* Read the first 24 bytes of character data. */
+
+ def_start = ras_beg+ras_len;
+ if (read_nft_with_retry(&lnf[def_start],nftlen+24) != 0) return(1);
+
+/* Now we need to check that the rasters are uncompressed. LN03s can't
+accept compressed rasters, and this program isn't clever enough to
+decompress them. */
+
+ if (lnf[def_start+17] != 129) {
+ printf("\n LN03 font file bad, using blanks");
+ return(1);
+ }
+
+/* Fill in the chw array (which holds character widths). Centipoint to
+pixel conversion is necessary (there are 24 centipoints in a pixel), with
+rounding (hence the 12). */
+
+ copy_from_lnf(def_start+4);
+ chw[lnfno][to] = (lcy.l+12)/24;
+
+/* NFT files may contain character widths which are not integral numbers of
+pixels. It is necessary to round such values to pixels when copying into
+the final font load -- if sent unrounded to the LN03, the widths will be
+truncated and positions will be off in the printed output. */
+
+ lcy.l = 24*chw[lnfno][to];
+ copy_to_lnf(def_start+4);
+
+/* Now we need to compute the size of the rasters, and copy that number of
+bytes into the LN03 font buffer. */
+
+ rows = lnf[def_start+20]+256*lnf[def_start+21];
+ columns = lnf[def_start+22]+256*lnf[def_start+23];
+
+/* We have to update psize, lsize and msize to fill slots in the format. */
+
+ quo = rows/8;
+ if (rows != quo*8) quo++;
+ i = quo*columns;
+ lsize += quo*columns;
+ quo = columns/8;
+ if (columns != quo*8) quo++;
+ psize += quo*rows;
+ if (i > quo*rows) msize += i; else msize += quo*rows;
+
+/* Now do the actual copy. We have to ensure that the rasters are
+word-aligned in the font load (where one word = 2 bytes, of course). */
+
+ if (lnf[def_start+16] % 2 == 0) len = quo*rows; else len = i;
+ if (read_nft_with_retry(&lnf[def_start+24],nftlen+len) != 0)
+ return(1);
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += len+24;
+ ras_len_added += len+24;
+ if (ras_len % 2 != 0) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+ return(0);
+
+}
+
+int read_nft_with_retry(where,upto)
+long upto;
+char *where;
+{
+ long i,target;
+ int l;
+
+ i = 0;
+ while (nftlen < upto) {
+ target = upto-nftlen;
+ l = read(nftf,&where[i],target);
+ if (l <= 0) {
+ printf("\n LN03 font file bad, using blanks");
+ return(1);
+ }
+ nftlen += l;
+ i += l;
+ }
+ return(0);
+}
+
+int read_nft_until(pos)
+long pos;
+{
+ char bit_bucket[512];
+ int l;
+ long target;
+
+ while (nftlen < pos) {
+ target = pos-nftlen;
+ if (target > 512) target = 512;
+ l = read(nftf,bit_bucket,target);
+ if (l <= 0) {
+ printf("\n LN03 font file bad, using blanks");
+ return(1);
+ }
+ nftlen += l;
+ }
+ return(0);
+}
+
+GLOBAL unsigned char preline[96];
+
+/* write_lnf performs the last fixups to the LN03 font buffer and dumps it,
+sixelized, into the output file. */
+
+int write_lnf (){
+
+ long i,j,k,rem,quo,ma;
+
+/* We now have to fix a number of slots: size of file, length of rasters,
+final 'FONT', psize, lsize, msize. */
+
+ lcy.l = ras_beg+ras_len+8;
+ copy_to_lnf(0);
+ copy_to_lnf(lcy.l-8);
+ lnf[lcy.l-4] = 'F';
+ lnf[lcy.l-3] = 'O';
+ lnf[lcy.l-2] = 'N';
+ lnf[lcy.l-1] = 'T';
+
+/* Clear out remaining bytes up to 96 more. */
+
+ j = 96*((lcy.l+95)/96);
+ for (i=lcy.l; i<j; i++) lnf[i] = 0;
+
+/* Length of rasters */
+
+#define fnt__l_char_definitions_length 156
+
+ lcy.l = ras_len;
+ copy_to_lnf(fnt__l_char_definitions_length);
+
+#define fnt__l_portrait_byte_count 228
+#define fnt__l_landscape_byte_count 232
+#define fnt__l_mixed_byte_count 236
+
+ lcy.l = psize;
+ copy_to_lnf(fnt__l_portrait_byte_count);
+
+ lcy.l = lsize;
+ copy_to_lnf(fnt__l_landscape_byte_count);
+
+ lcy.l = msize;
+ copy_to_lnf(fnt__l_mixed_byte_count);
+
+/* Now sixelize and write the contents of LNF. */
+
+ sixelize_and_write(ras_beg+ras_len+8);
+ return(0);
+}
+
+int sixelize_and_write(howmuch)
+int howmuch;
+{
+ int quo,i,j;
+
+ quo = howmuch/96;
+ if (howmuch > quo*96) quo++;
+
+ for (i=0; i<quo; i++) {
+ for (j=0; j<96; j++)
+ preline[j] = lnf[96*i+j];
+ write_preline();
+ }
+
+}
+
+int write_preline() {
+
+ char sixel_line[129];
+ int i,j,ix,pllen;
+ unsigned v,w;
+
+ pllen = 96;
+ ix = 0;
+ sixel_line[128] = '\0';
+ for (i=0; i<128; i++) sixel_line[i] = '?';
+ for (i=0; i<pllen; i += 3) {
+ v = preline[i];
+ w = v>>2;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = (v&3)<<4;
+ v = preline[i+1];
+ w |= v>>4;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = (v&15)<<2;
+ v = preline[i+2];
+ w |= v>>6;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = v&63;
+ sixel_line[ix] = 63+w;
+ ix++;
+ }
+ fprintf(outfile,"\n%s",sixel_line);
+}
+
+/* Initializes the LN03 font buffer. */
+
+int initialize_lnf(lnfno)
+int lnfno;
+{
+ int i,j;
+
+/* The following array holds reasonable values for bytes 0-479 of an LN03
+format font. These bytes were copied from a font load which the LN03 was
+known to accept. The font loads generated by this program are initialized
+using these values. Some of them are overwritten later, however. */
+
+ static char good_opening[512] = {
+ 104,38,0,0,70,79,78,84,
+ 1,0,0,0,31,0,0,0,
+ 20,0,0,0,85,48,48,48,
+ 48,48,48,48,48,50,83,75,
+ 48,48,71,71,48,48,48,49,
+ 85,90,90,90,90,48,50,70,
+ 48,48,48,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 181,7,9,0,11,0,14,0,
+ 0,0,0,0,104,0,0,0,
+ 252,0,0,0,124,0,0,0,
+ 100,1,0,0,120,1,0,0,
+ 224,1,0,0,4,0,0,0,
+ 88,3,0,0,0,0,0,0,
+ 92,3,0,0,48,0,0,0,
+ 92,3,0,0,0,0,0,0,
+ 140,3,0,0,212,34,0,0,
+ 140,3,0,0,33,0,0,0,
+ 126,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 32,0,0,0,168,0,0,0,
+ 16,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,236,25,0,0,
+ 54,25,0,0,14,27,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,0,0,0,
+ 7,0,0,0,92,3,0,0,
+ 7,0,0,0,99,3,0,0,
+ 16,0,0,0,106,3,0,0,
+ 16,0,0,0,122,3,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 10,0,0,0,244,1,0,0,
+ 0,0,24,0,16,0,0,0,
+ 16,0,0,0,1,0,1,0,
+ 1,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 30,0,0,0,20,0,0,0,
+ 196,255,255,255,20,0,0,0,
+ 106,255,255,255,20,0,0,0,
+ 0,0,1,0,0,0,30,0,
+ 166,255,255,255,0,0,0,0,
+ 40,0,0,0,0,0,0,0,
+ 60,0,0,0,240,0,0,0,
+ 60,0,0,0,100,0,0,0,
+ 240,0,0,0,120,0,0,0,
+ 40,0,0,0,120,0,0,0,
+ 96,255,255,255,136,255,255,255,
+ 186,255,255,255,240,0,0,0,
+ 76,255,255,255,60,0,0,0,
+ 160,0,0,0,120,0,0,0,
+ 20,0,0,0,20,0,0,0,
+ 140,3,0,0,194,3,0,0,
+ 244,3,0,0,160,4,0,0,
+ 254,4,0,0,162,5,0,0,
+ 46,6,0,0,84,6,0,0};
+ int pool_beg;
+
+/* The character directory always begins at position 480 in the Common
+Font File Format. */
+
+ lnf_chardir = 480;
+ ras_len = 0;
+ psize = 0;
+ lsize = 0;
+ msize = 0;
+
+/* Copy the good values into the lnf array */
+
+ for (i=0; i<480; i++)
+ lnf[i] = good_opening[i];
+
+/* Set the last character if necessary */
+
+#define fnt__l_first_character 164
+
+ if (lastch[lnfno] < leftlast && !using_r)
+ lnf[fnt__l_first_character+4] = lastch[lnfno];
+ if (using_r)
+ lnf[fnt__l_first_character+4] = lastch[lnfno]-rightfirst+
+ leftfirst;
+
+/* Set the character counts */
+
+#define fnt__l_infile_locators 204
+#define fnt__l_character_definitions 212
+#define fnt__l_raster_count 220
+
+ i = lnf[fnt__l_first_character+4]-
+ lnf[fnt__l_first_character]+1;
+ ras_beg = lnf_chardir + 4*i + 4 + 48;
+ lnf[fnt__l_infile_locators] = i;
+ lnf[fnt__l_character_definitions] = i;
+ lnf[fnt__l_raster_count] = i;
+ lnf[ras_beg-52] = lnf[ras_beg-51] = lnf[ras_beg-50] =
+ lnf[ras_beg-49] = 0;
+
+/* Set the font file id. This id is a 31-byte string. We make it depend on
+the lnfno number, and on whether this is a left or right font.
+Specifically, the first seven bytes are U0000nn where nn is lnfno possibly
+with a leading zero. The character set part of the ID is 1O if using_r,
+otherwise the default from good_opening. */
+
+#define fnt__t_font_file_id 20
+
+ lnf[fnt__t_font_file_id+5] = lnfno/10+'0';
+ lnf[fnt__t_font_file_id+6] = lnfno % 10 + '0';
+ if (using_r) lnf[fnt__t_font_file_id+20] = 'O';
+
+/* We now have to set some fields in the font format that are pointers to
+where other fields begin. These pointers depend on the number of glyphs we
+are placing in the font file. */
+
+#define fnt__a_subset_tables 128
+
+ lcy.l = lnf_chardir+4*i;
+ copy_to_lnf(fnt__a_subset_tables);
+
+ lcy.l = lcy.l+4;
+ copy_to_lnf(fnt__a_subset_tables+8);
+ copy_to_lnf(fnt__a_subset_tables+16);
+
+ lcy.l = lcy.l+48;
+ copy_to_lnf(fnt__a_subset_tables+24);
+
+#define fnt__a_char_definitions 160
+
+ copy_to_lnf(fnt__a_char_definitions);
+
+/* Set up the string pool region of the font load (48 bytes). The only
+tricky part here is the character set designator at the very beginning of
+the pool. Left fonts use one designator, right fonts another. [[More
+explanation is needed.]] */
+
+ pool_beg = ras_beg-48;
+
+ lnf[pool_beg] = '0';
+ lnf[pool_beg+1] = using_r ? '<':'B';
+ lnf[pool_beg+2] = '\011'; /* ascii tab */
+ lnf[pool_beg+3] = 'Z';
+ lnf[pool_beg+4] = 'Z';
+ lnf[pool_beg+5] = 'Z';
+ lnf[pool_beg+6] = 'Z';
+
+/* For reasons that are beyond my comprehension, the Common Font File
+Format requires us to copy the first seven characters of the font file id
+into one piece of the string pool, and the first sixteen into another
+place. */
+
+ for (i=1; i<8; i++)
+ lnf[pool_beg+7+i-1] = lnf[fnt__t_font_file_id+i-1];
+ for (i=1; i<17; i++)
+ lnf[pool_beg+7+7+i-1] = ' ';
+ for (i=1; i<17; i++)
+ lnf[pool_beg+7+7+16+i-1] = lnf[fnt__t_font_file_id+i-1];
+ lnf[pool_beg+46] = lnf[pool_beg+47] = 0;
+
+/* Now make string descriptors point into the string pool. */
+
+#define fnt__a_char_set 260
+#define fnt__a_family_id 268
+#define fnt__a_family_name 276
+#define fnt__a_font_id 284
+
+ lcy.l = pool_beg;
+ copy_to_lnf(fnt__a_char_set);
+ lcy.l = pool_beg+7;
+ copy_to_lnf(fnt__a_family_id);
+ lcy.l = pool_beg+7+7;
+ copy_to_lnf(fnt__a_family_name);
+ lcy.l = pool_beg+7+7+16;
+ copy_to_lnf(fnt__a_font_id);
+
+/* Mercifully, all remaining font file slots that we can fill now are
+already good as received from good_opening. */
+
+}
diff --git a/dviware/ln03/rose/ffc.pas b/dviware/ln03/rose/ffc.pas
new file mode 100644
index 0000000000..e33f4bd03d
--- /dev/null
+++ b/dviware/ln03/rose/ffc.pas
@@ -0,0 +1,277 @@
+{4:}PROGRAM FFC(INPUT,OUTPUT,LN03FILE,PXLFILE,OUTFILE);LABEL{5:}
+9998,9999;{:5}TYPE{6:}EIGHTBITS=0..255;
+BYTEBLOCK=PACKED ARRAY[0..511]OF EIGHTBITS;
+BYTEFILE=PACKED FILE OF BYTEBLOCK;{:6}VAR{7:}INLINE:VARYING[513]OF CHAR;
+ILP,ISTART,ILLEN:INTEGER;VERB:INTEGER;{:7}{11:}LN03FILE:BYTEFILE;
+LN03COUNT,LN03LEN,I:INTEGER;
+LBUF:PACKED RECORD CASE BOOLEAN OF FALSE:(C:PACKED ARRAY[0..((512*512)-1
+)]OF CHAR);TRUE:(B:PACKED ARRAY[0..511]OF BYTEBLOCK);END;{:11}{15:}
+PXLFILE:BYTEFILE;PXLCOUNT,PXLLEN:INTEGER;
+PBUF:PACKED RECORD CASE BOOLEAN OF FALSE:(C:PACKED ARRAY[0..((512*512)-1
+)]OF CHAR);TRUE:(B:PACKED ARRAY[0..511]OF BYTEBLOCK);END;{:15}{22:}
+DEFSTART,RASSTART:INTEGER;J,K,L,M,N:INTEGER;
+VISIBLEBYTE:PACKED ARRAY[1..8]OF CHAR;{:22}{31:}
+CHARXDEFOFFS,STRINGPOOLSI,STRINGXPOOLO:INTEGER;
+PSIZE,LSIZE,MSIZE:INTEGER;FIRSTCHAR,LASTCHAR,NUMCHARS:INTEGER;
+ALLBLANK:BOOLEAN;ZCHAR,TFMWIDTH,XOFFSET,YOFFSET:INTEGER;DSIZE,MAG:REAL;
+{:31}{39:}FONTIDSTRING:PACKED ARRAY[1..31]OF CHAR;{:39}{44:}
+POINTS:INTEGER;{:44}{47:}OUTFILE:BYTEFILE;{:47}{8:}
+FUNCTION COMMANDVERB:INTEGER;VAR I:INTEGER;BEGIN{9:}
+WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=ILP+1;ISTART:=ILP;
+WHILE(ILP<=ILLEN)AND(INLINE[ILP]<>' ')DO ILP:=ILP+1;
+FOR I:=ISTART TO ILP-1 DO BEGIN IF(INLINE[I]>='A')AND(INLINE[I]<='Z')
+THEN INLINE[I]:=CHR(ORD(INLINE[I])+ORD('a')-ORD('A'))END;{:9}
+IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),'rln03')=1 THEN COMMANDVERB:=1
+ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),'tln03long')=1 THEN
+COMMANDVERB:=3 ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),
+'tln03word')=1 THEN COMMANDVERB:=4 ELSE IF INDEX(SUBSTR(INLINE,ISTART,
+ILP-ISTART),'tln03')=1 THEN COMMANDVERB:=2 ELSE IF INDEX(SUBSTR(INLINE,
+ISTART,ILP-ISTART),'rpxl')=1 THEN COMMANDVERB:=5 ELSE IF INDEX(SUBSTR(
+INLINE,ISTART,ILP-ISTART),'tpxllong')=1 THEN COMMANDVERB:=7 ELSE IF
+INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),'tpxlword')=1 THEN COMMANDVERB:=8
+ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),'tpxl')=1 THEN
+COMMANDVERB:=6 ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),'toln03x')
+=1 THEN COMMANDVERB:=11 ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-ISTART),
+'toln03')=1 THEN COMMANDVERB:=9 ELSE IF INDEX(SUBSTR(INLINE,ISTART,ILP-
+ISTART),'wln03')=1 THEN COMMANDVERB:=10 ELSE IF INDEX(SUBSTR(INLINE,
+ISTART,ILP-ISTART),'exit')=1 THEN COMMANDVERB:=99 ELSE COMMANDVERB:=0
+END;{:8}{19:}FUNCTION GETFIXNUM:INTEGER;LABEL 1;VAR X,X1:INTEGER;
+NEGATIVE:BOOLEAN;BEGIN X1:=0;NEGATIVE:=FALSE;
+WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=ILP+1;
+IF ILP>ILLEN THEN GOTO 1;IF INLINE[ILP]='-'THEN BEGIN NEGATIVE:=TRUE;
+ILP:=ILP+1 END;
+IF(ILP>ILLEN)OR(INLINE[ILP]<'0')OR(INLINE[ILP]>'9')THEN GOTO 1;X1:=0;
+WHILE(INLINE[ILP]>='0')AND(INLINE[ILP]<='9')DO BEGIN X1:=10*X1+ORD(
+INLINE[ILP])-ORD('0');ILP:=ILP+1;IF ILP>ILLEN THEN GOTO 1;END;1:X:=X1;
+IF NEGATIVE THEN X:=-X;GETFIXNUM:=X END;{:19}{25:}
+PROCEDURE BINREP(V:INTEGER);VAR CNT,REM,QUO:INTEGER;
+BEGIN VISIBLEBYTE:='........';QUO:=V;
+FOR CNT:=1 TO 8 DO BEGIN REM:=QUO MOD 2;QUO:=QUO DIV 2;
+IF REM<>0 THEN VISIBLEBYTE[CNT]:='B'END;END;{:25}{27:}
+PROCEDURE REVBINREP(V:INTEGER);VAR CNT,REM,QUO:INTEGER;
+BEGIN VISIBLEBYTE:='........';QUO:=V;
+FOR CNT:=1 TO 8 DO BEGIN REM:=QUO MOD 2;QUO:=QUO DIV 2;
+IF REM<>0 THEN VISIBLEBYTE[9-CNT]:='B'END;END;{:27}{34:}
+FUNCTION SIGNEDPXLWOR(INDEX:INTEGER):INTEGER;
+BEGIN IF ORD(PBUF.C[INDEX])>=128 THEN SIGNEDPXLWOR:=(ORD(PBUF.C[(INDEX)
++1])+256*ORD(PBUF.C[INDEX]))-65536 ELSE SIGNEDPXLWOR:=(ORD(PBUF.C[(INDEX
+)+1])+256*ORD(PBUF.C[INDEX]))END;
+PROCEDURE SETLN03LONG(INDEX,VALUE:INTEGER);VAR NEGATIVE:BOOLEAN;
+A,B,C,D,CARRY:INTEGER;
+BEGIN IF VALUE<0 THEN NEGATIVE:=TRUE ELSE NEGATIVE:=FALSE;
+IF NEGATIVE THEN VALUE:=-VALUE;A:=VALUE MOD 256;
+B:=(VALUE DIV 256)MOD 256;C:=(VALUE DIV(256*256))MOD 256;
+D:=VALUE DIV(256*256*256);IF NEGATIVE THEN BEGIN CARRY:=0;A:=256-A;
+IF A=256 THEN BEGIN A:=0;CARRY:=1 END;B:=255+CARRY-B;
+IF B=256 THEN B:=0 ELSE CARRY:=0;C:=255+CARRY-C;
+IF C=256 THEN C:=0 ELSE CARRY:=0;D:=255+CARRY-D;IF D=256 THEN D:=0 END;
+LBUF.C[INDEX]:=CHR(A);LBUF.C[INDEX+1]:=CHR(B);LBUF.C[INDEX+2]:=CHR(C);
+LBUF.C[INDEX+3]:=CHR(D)END;{:34}{36:}FUNCTION REVERSEBYTE(U:CHAR):CHAR;
+VAR CNT,RV:INTEGER;BEGIN BINREP(ORD(U));RV:=0;
+FOR CNT:=1 TO 8 DO IF VISIBLEBYTE[CNT]='B'THEN RV:=1+2*RV ELSE RV:=2*RV;
+REVERSEBYTE:=CHR(RV)END;{:36}
+BEGIN WRITELN('Font File Converter, Version 3');WRITELN;{10:}
+9998:WRITELN;WRITE('FFC>');READLN(INLINE);
+IF LENGTH(INLINE)=513 THEN BEGIN WRITELN('Command line too long');
+GOTO 9998 END;INLINE:=INLINE+' ';ILP:=1;ILLEN:=LENGTH(INLINE);
+VERB:=COMMANDVERB;IF VERB=0 THEN BEGIN WRITELN('No such command');
+GOTO 9998 END ELSE{12:}
+IF VERB=1 THEN BEGIN WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=ILP+1;
+ISTART:=ILP;WHILE(ILP<=ILLEN)AND(INLINE[ILP]<>' ')DO ILP:=ILP+1;
+OPEN(LN03FILE,SUBSTR(INLINE,ISTART,ILP-ISTART),readonly,error:=continue)
+;IF STATUS(LN03FILE)>0 THEN BEGIN WRITELN('Couldn''t open file');
+GOTO 9998 END;RESET(LN03FILE);{13:}LN03COUNT:=0;
+WHILE(NOT EOF(LN03FILE))AND(LN03COUNT<512)DO BEGIN READ(LN03FILE,LBUF.B[
+LN03COUNT]);LN03COUNT:=LN03COUNT+1;END;LN03LEN:=LN03COUNT*512;
+CLOSE(LN03FILE);{14:}IF LN03LEN<16 THEN WRITELN('LN03 file too short');
+IF(LBUF.C[4]<>'F')OR(LBUF.C[5]<>'O')OR(LBUF.C[6]<>'N')OR(LBUF.C[7]<>'T')
+THEN WRITELN('Second longword not FONT'){:14}{:13}END{:12}{16:}
+ELSE IF VERB=5 THEN BEGIN WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=
+ILP+1;ISTART:=ILP;WHILE(ILP<=ILLEN)AND(INLINE[ILP]<>' ')DO ILP:=ILP+1;
+OPEN(PXLFILE,SUBSTR(INLINE,ISTART,ILP-ISTART),readonly,error:=continue);
+IF STATUS(PXLFILE)>0 THEN BEGIN WRITELN('Couldn''t open file');
+GOTO 9998 END;RESET(PXLFILE);{17:}PXLCOUNT:=0;
+WHILE(NOT EOF(PXLFILE))AND(PXLCOUNT<512)DO BEGIN READ(PXLFILE,PBUF.B[
+PXLCOUNT]);PXLCOUNT:=PXLCOUNT+1;END;PXLLEN:=PXLCOUNT*512;CLOSE(PXLFILE);
+{18:}
+IF NOT(PXLLEN MOD 4=0)THEN WRITELN('PXL file length not multiple of 4');
+IF(ORD(PBUF.C[(0)+3])+(256*(ORD(PBUF.C[(0)+2])+256*(ORD(PBUF.C[(0)+1])
++256*ORD(PBUF.C[0])))))<>1001 THEN WRITELN('Initial PXL format id wrong'
+);I:=PXLLEN-4;
+WHILE(I>=PXLLEN-512)DO BEGIN IF(ORD(PBUF.C[(I)+3])+(256*(ORD(PBUF.C[(I)
++2])+256*(ORD(PBUF.C[(I)+1])+256*ORD(PBUF.C[I])))))=1001 THEN BEGIN
+PXLLEN:=I+4;I:=-1 END ELSE I:=I-4 END;
+IF PXLLEN<16 THEN WRITELN('PXL file too short');
+IF(ORD(PBUF.C[(PXLLEN-4)+3])+(256*(ORD(PBUF.C[(PXLLEN-4)+2])+256*(ORD(
+PBUF.C[(PXLLEN-4)+1])+256*ORD(PBUF.C[PXLLEN-4])))))<>1001 THEN WRITELN(
+'Final PXL format id wrong');{:18}{:17}END{:16}{21:}
+ELSE IF VERB=2 THEN BEGIN WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=
+ILP+1;
+IF ILP>ILLEN THEN BEGIN WRITELN('You have to say what character to type'
+);GOTO 9998 END;
+IF(INLINE[ILP]='''')AND(ILP<ILLEN)THEN I:=ORD(INLINE[ILP+1])ELSE I:=
+GETFIXNUM;
+IF(I<(ORD(LBUF.C[164])+(256*(ORD(LBUF.C[(164)+1])+256*(ORD(LBUF.C[(164)
++2])+256*ORD(LBUF.C[(164)+3]))))))OR(I>(ORD(LBUF.C[168])+(256*(ORD(LBUF.
+C[(168)+1])+256*(ORD(LBUF.C[(168)+2])+256*ORD(LBUF.C[(168)+3]))))))THEN
+BEGIN WRITELN('No such character');GOTO 9998 END;
+I:=4*(I-(ORD(LBUF.C[164])+(256*(ORD(LBUF.C[(164)+1])+256*(ORD(LBUF.C[(
+164)+2])+256*ORD(LBUF.C[(164)+3]))))))+(ORD(LBUF.C[120])+(256*(ORD(LBUF.
+C[(120)+1])+256*(ORD(LBUF.C[(120)+2])+256*ORD(LBUF.C[(120)+3])))));{23:}
+IF LBUF.C[I+3]>=CHR(128)THEN BEGIN WRITELN(
+'Indirect locators not supported');GOTO 9998 END;
+DEFSTART:=ORD(LBUF.C[I])+256*(ORD(LBUF.C[I+1])+256*ORD(LBUF.C[(I+1)+1]))
+;IF DEFSTART=0 THEN BEGIN WRITELN('Locator is zero');GOTO 9998 END;
+RASSTART:=DEFSTART+(ORD(LBUF.C[200])+(256*(ORD(LBUF.C[(200)+1])+256*(ORD
+(LBUF.C[(200)+2])+256*ORD(LBUF.C[(200)+3])))));
+WRITELN(' ma = ',RASSTART:1);
+IF RASSTART>((512*512)-1)THEN BEGIN WRITELN(
+'Character outside piece of file read');GOTO 9998 END{:23};{24:}
+WRITELN('width ',(((ORD(LBUF.C[DEFSTART+4])+(256*(ORD(LBUF.C[(DEFSTART+4
+)+1])+256*(ORD(LBUF.C[(DEFSTART+4)+2])+256*ORD(LBUF.C[(DEFSTART+4)+3])))
+)))/24.0):5:1,' pixels');
+IF ORD(LBUF.C[RASSTART+1])<>129 THEN BEGIN WRITELN(
+'Run length encoding not supported');GOTO 9998 END;
+IF ODD(ORD(LBUF.C[RASSTART]))THEN BEGIN WRITELN('landscape');
+I:=(ORD(LBUF.C[RASSTART+4])+256*ORD(LBUF.C[(RASSTART+4)+1]));
+J:=(ORD(LBUF.C[RASSTART+6])+256*ORD(LBUF.C[(RASSTART+6)+1]))END ELSE
+BEGIN WRITELN('portrait');
+I:=(ORD(LBUF.C[RASSTART+6])+256*ORD(LBUF.C[(RASSTART+6)+1]));
+J:=(ORD(LBUF.C[RASSTART+4])+256*ORD(LBUF.C[(RASSTART+4)+1]))END;
+WRITELN(I:1,' rows ',J:1,' columns');K:=I DIV 8;IF I<>8*K THEN K:=K+1;
+FOR L:=0 TO J-1 DO BEGIN FOR M:=0 TO K-1 DO BEGIN BINREP(ORD(LBUF.C[
+RASSTART+8+K*L+M]));WRITE(VISIBLEBYTE)END;WRITELN END{:24}END{:21}{26:}
+ELSE IF VERB=6 THEN BEGIN WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=
+ILP+1;
+IF ILP>ILLEN THEN BEGIN WRITELN('You have to say what character to type'
+);GOTO 9998 END;
+IF(INLINE[ILP]='''')AND(ILP<ILLEN)THEN I:=ORD(INLINE[ILP+1])ELSE I:=
+GETFIXNUM;IF(I<0)OR(I>127)THEN BEGIN WRITELN('No such character');
+GOTO 9998 END;DEFSTART:=PXLLEN-4*517+16*I;
+RASSTART:=4*(ORD(PBUF.C[(DEFSTART+8)+3])+(256*(ORD(PBUF.C[(DEFSTART+8)+2
+])+256*(ORD(PBUF.C[(DEFSTART+8)+1])+256*ORD(PBUF.C[DEFSTART+8])))));
+WRITELN(' rasters at ',RASSTART:1);
+IF RASSTART>PXLLEN THEN BEGIN WRITELN('Rasters outside file');
+GOTO 9998 END;I:=(ORD(PBUF.C[(DEFSTART)+1])+256*ORD(PBUF.C[DEFSTART]));
+J:=(ORD(PBUF.C[(DEFSTART+2)+1])+256*ORD(PBUF.C[DEFSTART+2]));
+WRITELN(I:1,' columns ',J:1,' rows');K:=I DIV 32;IF I<>32*K THEN K:=K+1;
+FOR L:=0 TO J-1 DO BEGIN FOR M:=0 TO K-1 DO BEGIN REVBINREP(ORD(PBUF.C[
+RASSTART+4*K*L+4*M]));WRITE(VISIBLEBYTE);
+REVBINREP(ORD(PBUF.C[RASSTART+4*K*L+4*M+1]));WRITE(VISIBLEBYTE);
+REVBINREP(ORD(PBUF.C[RASSTART+4*K*L+4*M+2]));WRITE(VISIBLEBYTE);
+REVBINREP(ORD(PBUF.C[RASSTART+4*K*L+4*M+3]));WRITE(VISIBLEBYTE)END;
+WRITELN END END{:26}{28:}ELSE IF VERB=3 THEN BEGIN I:=GETFIXNUM;
+IF(I>=0)AND(I<LN03LEN)THEN WRITELN((ORD(LBUF.C[I])+(256*(ORD(LBUF.C[(I)
++1])+256*(ORD(LBUF.C[(I)+2])+256*ORD(LBUF.C[(I)+3]))))):1)ELSE WRITELN(
+'Location not in file')END ELSE IF VERB=4 THEN BEGIN I:=GETFIXNUM;
+IF(I>=0)AND(I<LN03LEN)THEN WRITELN((ORD(LBUF.C[I])+256*ORD(LBUF.C[(I)+1]
+)))ELSE WRITELN('Location not in file')END ELSE IF VERB=7 THEN BEGIN I:=
+GETFIXNUM;
+IF(I>=0)AND(I<PXLLEN)THEN WRITELN((ORD(PBUF.C[(I)+3])+(256*(ORD(PBUF.C[(
+I)+2])+256*(ORD(PBUF.C[(I)+1])+256*ORD(PBUF.C[I]))))):1)ELSE WRITELN(
+'Location not in file')END ELSE IF VERB=8 THEN BEGIN I:=GETFIXNUM;
+IF(I>=0)AND(I<PXLLEN)THEN WRITELN((ORD(PBUF.C[(I)+1])+256*ORD(PBUF.C[I])
+))ELSE WRITELN('Location not in file')END{:28}{30:}
+ELSE IF(VERB=9)OR(VERB=11)THEN BEGIN FOR I:=0 TO((512*512)-1)DO LBUF.C[I
+]:=CHR(0);IF VERB=9 THEN BEGIN FIRSTCHAR:=33;
+LASTCHAR:=126 END ELSE BEGIN FIRSTCHAR:=0;LASTCHAR:=127 END;
+NUMCHARS:=LASTCHAR-FIRSTCHAR+1;{32:}STRINGPOOLSI:=48;
+STRINGXPOOLO:=480+4*NUMCHARS+4;CHARXDEFOFFS:=STRINGXPOOLO+STRINGPOOLSI;
+LN03LEN:=CHARXDEFOFFS;PSIZE:=0;LSIZE:=0;MSIZE:=0;
+FOR ZCHAR:=FIRSTCHAR TO LASTCHAR DO BEGIN{33:}
+LBUF.C[LN03LEN+3]:=CHR(128);DEFSTART:=PXLLEN-4*517+16*ZCHAR;
+RASSTART:=4*(ORD(PBUF.C[(DEFSTART+8)+3])+(256*(ORD(PBUF.C[(DEFSTART+8)+2
+])+256*(ORD(PBUF.C[(DEFSTART+8)+1])+256*ORD(PBUF.C[DEFSTART+8])))));
+IF RASSTART>PXLLEN THEN BEGIN WRITELN('Rasters outside file for ',ZCHAR:
+1);GOTO 9998 END;
+TFMWIDTH:=(ORD(PBUF.C[(DEFSTART+12)+3])+(256*(ORD(PBUF.C[(DEFSTART+12)+2
+])+256*(ORD(PBUF.C[(DEFSTART+12)+1])+256*ORD(PBUF.C[DEFSTART+12])))));
+DSIZE:=(ORD(PBUF.C[(PXLLEN-12)+3])+(256*(ORD(PBUF.C[(PXLLEN-12)+2])+256*
+(ORD(PBUF.C[(PXLLEN-12)+1])+256*ORD(PBUF.C[PXLLEN-12])))));
+MAG:=(ORD(PBUF.C[(PXLLEN-16)+3])+(256*(ORD(PBUF.C[(PXLLEN-16)+2])+256*(
+ORD(PBUF.C[(PXLLEN-16)+1])+256*ORD(PBUF.C[PXLLEN-16])))));
+DSIZE:=(DSIZE/(1048576))*(MAG/1500.0);XOFFSET:=SIGNEDPXLWOR(DEFSTART+4);
+YOFFSET:=SIGNEDPXLWOR(DEFSTART+6);
+SETLN03LONG(LN03LEN+4,ROUND((DSIZE*7200.0*TFMWIDTH)/((1048576)*72.27)));
+SETLN03LONG(LN03LEN+8,-24*XOFFSET);SETLN03LONG(LN03LEN+12,-24*YOFFSET);
+{:33}{35:}LBUF.C[LN03LEN+17]:=CHR(129);
+I:=(ORD(PBUF.C[(DEFSTART)+1])+256*ORD(PBUF.C[DEFSTART]));
+J:=(ORD(PBUF.C[(DEFSTART+2)+1])+256*ORD(PBUF.C[DEFSTART+2]));
+ALLBLANK:=(I=0)AND(J=0);IF ALLBLANK THEN BEGIN I:=1;J:=1 END;
+LBUF.C[LN03LEN+20]:=CHR(J MOD 256);LBUF.C[LN03LEN+21]:=CHR(J DIV 256);
+LBUF.C[LN03LEN+22]:=CHR(I MOD 256);LBUF.C[LN03LEN+23]:=CHR(I DIV 256);
+K:=I DIV 32;IF I<>32*K THEN K:=K+1;N:=I DIV 8;IF I<>8*N THEN N:=N+1;
+IF NOT ALLBLANK THEN FOR L:=0 TO J-1 DO FOR M:=0 TO N-1 DO LBUF.C[
+LN03LEN+24+N*L+M]:=REVERSEBYTE(PBUF.C[RASSTART+4*K*L+M]);
+SETLN03LONG(480+4*(ZCHAR-FIRSTCHAR),LN03LEN);LN03LEN:=LN03LEN+24+J*N;
+IF ODD(LN03LEN)THEN LN03LEN:=LN03LEN+1;PSIZE:=PSIZE+J*N;K:=J DIV 8;
+IF J<>8*K THEN K:=K+1;LSIZE:=LSIZE+I*K;
+IF I*K>J*N THEN MSIZE:=MSIZE+I*K ELSE MSIZE:=MSIZE+J*N;{:35}END;{:32};
+{37:}IF LN03LEN MOD 4<>0 THEN LN03LEN:=LN03LEN+(4-(LN03LEN MOD 4));
+LN03LEN:=LN03LEN+8;SETLN03LONG(0,LN03LEN);
+SETLN03LONG(LN03LEN-8,LN03LEN);LBUF.C[4]:='F';LBUF.C[LN03LEN-4]:='F';
+LBUF.C[5]:='O';LBUF.C[LN03LEN-3]:='O';LBUF.C[6]:='N';
+LBUF.C[LN03LEN-2]:='N';LBUF.C[7]:='T';LBUF.C[LN03LEN-1]:='T';{:37}{38:}
+LBUF.C[8]:=CHR(1);LBUF.C[12]:=CHR(31);LBUF.C[16]:=CHR(20);
+FONTIDSTRING:='U000000002SK00GG0001UZZZZ02F000';
+FOR I:=1 TO 31 DO LBUF.C[20+I-1]:=FONTIDSTRING[I];
+LBUF.C[88]:=CHR(1973 MOD 256);LBUF.C[89]:=CHR(1973 DIV 256);
+LBUF.C[90]:=CHR(9);LBUF.C[92]:=CHR(11);LBUF.C[94]:=CHR(14);{:38}{40:}
+SETLN03LONG(100,104);SETLN03LONG(104,252);SETLN03LONG(108,124);
+SETLN03LONG(112,356);SETLN03LONG(116,4*NUMCHARS);SETLN03LONG(120,480);
+SETLN03LONG(124,4);SETLN03LONG(128,480+4*NUMCHARS);
+SETLN03LONG(136,480+4*NUMCHARS+4);SETLN03LONG(140,STRINGPOOLSI);
+SETLN03LONG(144,480+4*NUMCHARS+4);
+SETLN03LONG(152,480+4*NUMCHARS+4+STRINGPOOLSI);
+SETLN03LONG(156,LN03LEN-8-CHARXDEFOFFS);SETLN03LONG(160,CHARXDEFOFFS);
+{:40}{41:}SETLN03LONG(164,FIRSTCHAR);SETLN03LONG(168,LASTCHAR);
+SETLN03LONG(192,32);SETLN03LONG(196,168);SETLN03LONG(200,16);
+SETLN03LONG(204,NUMCHARS);SETLN03LONG(212,NUMCHARS);
+SETLN03LONG(220,NUMCHARS);SETLN03LONG(228,PSIZE);SETLN03LONG(232,LSIZE);
+SETLN03LONG(236,MSIZE);{:41}{42:}SETLN03LONG(252,2);SETLN03LONG(256,7);
+SETLN03LONG(260,STRINGXPOOLO);LBUF.C[STRINGXPOOLO]:='0';
+LBUF.C[STRINGXPOOLO+1]:='B';LBUF.C[STRINGXPOOLO+2]:=CHR(9);
+LBUF.C[STRINGXPOOLO+3]:='Z';LBUF.C[STRINGXPOOLO+4]:='Z';
+LBUF.C[STRINGXPOOLO+5]:='Z';LBUF.C[STRINGXPOOLO+6]:='Z';
+SETLN03LONG(264,7);SETLN03LONG(268,STRINGXPOOLO+7);
+FOR I:=1 TO 7 DO LBUF.C[STRINGXPOOLO+7+I-1]:=FONTIDSTRING[I];
+SETLN03LONG(272,16);SETLN03LONG(276,STRINGXPOOLO+14);
+FOR I:=1 TO 16 DO LBUF.C[STRINGXPOOLO+14+I-1]:=' ';SETLN03LONG(280,16);
+SETLN03LONG(284,STRINGXPOOLO+30);
+FOR I:=1 TO 16 DO LBUF.C[STRINGXPOOLO+30+I-1]:=FONTIDSTRING[I];{:42}
+{43:}
+I:=(ORD(PBUF.C[(PXLLEN-12)+3])+(256*(ORD(PBUF.C[(PXLLEN-12)+2])+256*(ORD
+(PBUF.C[(PXLLEN-12)+1])+256*ORD(PBUF.C[PXLLEN-12])))));
+POINTS:=I DIV(1048576);K:=(10000*I MOD(1048576))DIV(1048576);
+LBUF.C[304]:=CHR(POINTS MOD 256);LBUF.C[305]:=CHR(POINTS DIV 256);
+LBUF.C[306]:=CHR(K MOD 256);LBUF.C[307]:=CHR(K DIV 256);
+IF K>4999 THEN POINTS:=POINTS+1;SETLN03LONG(308,50*POINTS);{:43}{45:}
+LBUF.C[314]:=CHR(24);LBUF.C[316]:=CHR(16);LBUF.C[320]:=CHR(16);
+LBUF.C[324]:=CHR(1);LBUF.C[326]:=CHR(1);LBUF.C[328]:=CHR(1);
+LBUF.C[330]:=CHR(1);LBUF.C[334]:=CHR(1);{:45}{46:}
+SETLN03LONG(360,12*POINTS);SETLN03LONG(364,8*POINTS);
+SETLN03LONG(368,-25*POINTS);SETLN03LONG(372,8*POINTS);
+SETLN03LONG(376,-60*POINTS);SETLN03LONG(380,8*POINTS);
+LBUF.C[386]:=CHR(1);LBUF.C[390]:=CHR(POINTS*12 MOD 256);
+LBUF.C[391]:=CHR(POINTS*12 DIV 256);SETLN03LONG(392,-36*POINTS);
+SETLN03LONG(400,16*POINTS);SETLN03LONG(408,24*POINTS);
+SETLN03LONG(412,20*POINTS);SETLN03LONG(416,80*POINTS);
+SETLN03LONG(420,25*POINTS);SETLN03LONG(424,100*POINTS);
+SETLN03LONG(428,50*POINTS);SETLN03LONG(432,10*POINTS);
+SETLN03LONG(436,35*POINTS);SETLN03LONG(440,-64*POINTS);
+SETLN03LONG(444,-50*POINTS);SETLN03LONG(448,-35*POINTS);
+SETLN03LONG(452,100*POINTS);SETLN03LONG(456,-65*POINTS);
+SETLN03LONG(460,35*POINTS);SETLN03LONG(464,65*POINTS);
+SETLN03LONG(468,35*POINTS);SETLN03LONG(472,10*POINTS);
+SETLN03LONG(476,10*POINTS);{:46}END{:30}{48:}
+ELSE IF VERB=10 THEN BEGIN WHILE(ILP<=ILLEN)AND(INLINE[ILP]=' ')DO ILP:=
+ILP+1;
+IF ILP>ILLEN THEN BEGIN WRITELN('You must specify a file to write into')
+;GOTO 9998 END;ISTART:=ILP;
+WHILE(ILP<=ILLEN)AND(INLINE[ILP]<>' ')DO ILP:=ILP+1;
+OPEN(OUTFILE,SUBSTR(INLINE,ISTART,ILP-ISTART),error:=continue);
+IF STATUS(OUTFILE)<>0 THEN BEGIN WRITELN('couldn''t open',SUBSTR(INLINE,
+ISTART,ILP-ISTART));GOTO 9998 END;REWRITE(OUTFILE);I:=LN03LEN DIV 512;
+IF LN03LEN<>I*512 THEN I:=I+1;
+FOR J:=0 TO I-1 DO WRITE(OUTFILE,LBUF.B[J]);CLOSE(OUTFILE)END{:48}{49:}
+ELSE IF VERB=99 THEN GOTO 9999{:49};GOTO 9998;9999:{:10}END.{:4}
diff --git a/dviware/ln03/rose/ffc.web b/dviware/ln03/rose/ffc.web
new file mode 100644
index 0000000000..eaa79d69a9
--- /dev/null
+++ b/dviware/ln03/rose/ffc.web
@@ -0,0 +1,991 @@
+% This program interconverts files between TeX and LN03 font file formats.
+
+% Copyright (c) 1984, 1985 by Digital Equipment Corporation.
+% UNDER DEVELOPMENT
+% Version 0.0, early December 1984, initial functionality
+% Version 0.0a, fixes by Scott Robinson to make input more efficient
+% Version 0.1, late December, fixed bug: magnification field is no
+% longer ignored in PXL to LN03 conversion.
+% Version 2, April-June 1985, a lot of random fixes.
+% Version 3, January 1986, tln03 prints width.
+
+% Here is TeX material that gets inserted after \input webmac
+\def\hang{\hangindent 3em\indent\ignorespaces}
+\font\ninerm=amr9
+
+\def\title{Font File Converter}
+\def\contentspagenumber{1}
+\def\topofcontents{\null
+ \def\titlepage{F} % include headline on the contents page
+ \def\rheader{\mainfont\hfil \contentspagenumber}
+ \vfill
+ \centerline{\titlefont The Font File Converter}
+ \vskip 15pt
+ \centerline{(Version 3, January 1986)}
+ \vfill}
+\def\botofcontents{\vfill
+ \centerline{\hsize 5in\baselineskip9pt
+ \vbox{\ninerm\noindent
+ Copyright 1984, 1985, 1986 by Digital Equipment Corporation.}}}
+\pageno=\contentspagenumber \advance\pageno by 1
+
+@* Introduction. The purpose of the Font File Converter (FFC) program is to
+convert font files from the \TeX\ \.{PXL} format to the DEC Common Font
+File Format. The program takes interactive commands from the terminal.
+Right now, its conversion capability is quite limited, and the files FFC
+produces are essentially usable only with the accompanying LN03 driver for
+\TeX.
+
+A |banner| string is defined to identify the version:
+
+@d banner=='Font File Converter, Version 3'
+
+@ FFC is written in the Web language, but the underlying Pascal is
+\hbox{VAX--11} Pascal, and no effort has been made to make anything
+portable@^portability@>. In particular, it is assumed that Pascal strings
+are ASCII strings.
+
+We do, however, use the ``standard'' Web name for the default in a
+|case| statement:
+
+@f othercases == else
+@d othercases == otherwise
+
+@ Detailed instructions for using FFC are given in a separate document. The
+LN03 and \.{PXL} file formats are also described separately.
+
+The LN03 accepts font files in the DEC Common Font File Format. However, it
+only reads certain fields of that format. FFC fills enough of these fields
+to make the font files it generates acceptable to the LN03, when these
+files are first massaged by the accompanying \TeX\ driver software. It
+cannot be assumed that FFC fills all fields in the Common Font File Format
+correctly. Neither can it be assumed that the files it generates are
+acceptable to other software or devices that use the DEC Common Font File
+Format.
+
+@ The overall structure of FFC is given below.
+
+@p
+program FFC (input, output, ln03_file, pxl_file, outfile);
+ label @<Labels in the outer block@>@/
+ type @<Types in the outer block@>@/
+ var @<Globals in the outer block@>@/
+ @<Major procedures@>@/
+begin
+ writeln(banner); writeln;@/
+ @<The main program@>@/
+end.
+
+@ There are two global labels, |final_end| for use when the program finishes,
+and |cmd_prompt| for use when a command comes to an end:
+
+@d final_end = 9999
+@d cmd_prompt = 9998
+
+@<Labels ...@>=
+ cmd_prompt, final_end;
+
+@ We define a file type |byte_file| for files consisting of 512-byte
+blocks. This definition was introduced by Scott Robinson for efficiency
+reasons. It is unclear at this point how this Pascal definition restricts
+our ability to work with font files of the various types that can exist
+in a Vax/VMS file system.
+
+@<Types...@>=
+@!eight_bits=0..255;
+@!byte_block=packed array [0..511] of eight_bits;
+@!byte_file=packed file of byte_block; {files that contain binary data}
+
+@* Command input. The user's command lines are read into a buffer called
+|inline|. The variables |ilp| and |istart| are used to point into it,
+while |illen| keeps track of its length. The variable |verb| holds an
+integer code representing the command verb.
+
+@d the_char == inline[ilp]
+@d the_substr == substr(inline,istart,ilp-istart)
+
+@<Globals...@>=
+@!inline: varying[513] of char;
+@!ilp,istart,illen :integer;
+@!verb :integer;
+
+@ Each command consists of a verb, a space, and arguments. The command
+handling procedure itself parses the arguments from |inline|. The verbs are
+converted into integer values by the function |command_verb|. That
+function is now coded inefficiently; it should eventually be implemented
+using a hash table.
+
+@d nonesuch = 0 { there is no such command }
+@d rln03 = 1 { read LN03 format file }
+@d tln03 = 2 { type LN03 character rasters }
+@d tln03long = 3 { type a longword from the LN03 file }
+@d tln03word = 4 { type a word from the LN03 file }
+@d rpxl = 5 { read \.{PXL} format file }
+@d tpxl = 6 { type \.{PXL} character rasters }
+@d tpxllong = 7 { type a longword from the \.{PXL} file }
+@d tpxlword = 8 { type a word from the \.{PXL} file }
+@d toln03 = 9 { convert the \.{PXL} file to an LN03 file }
+@d wln03 = 10 { write the LN03 buffer out onto a file }
+@d toln03x = 11 { convert the \.{PXL} file to an ``extended'' LN03 file }
+@d exit = 99 { leave FFC }
+
+@<Major procedures@>=
+function command_verb :integer;
+ var i :integer;
+ begin
+
+ @<Pick the verb out in |inline| and lowercase it@>@/
+ if index(the_substr,'rln03') = 1 then command_verb := rln03
+ else if index(the_substr,'tln03long') = 1 then command_verb := tln03long
+ else if index(the_substr,'tln03word') = 1 then command_verb := tln03word
+ else if index(the_substr,'tln03') = 1 then command_verb := tln03
+ else if index(the_substr,'rpxl') = 1 then command_verb := rpxl
+ else if index(the_substr,'tpxllong') = 1 then command_verb := tpxllong
+ else if index(the_substr,'tpxlword') = 1 then command_verb := tpxlword
+ else if index(the_substr,'tpxl') = 1 then command_verb := tpxl
+ else if index(the_substr,'toln03x') = 1 then command_verb := toln03x
+ else if index(the_substr,'toln03') = 1 then command_verb := toln03
+ else if index(the_substr,'wln03') = 1 then command_verb := wln03
+ else if index(the_substr,'exit') = 1 then command_verb := exit
+ else command_verb := nonesuch
+ end;
+
+@ To pick out the command verb, we frequently use two parsing macros,
+|skipb| and |skipnb|, which skip over blanks and non-blanks respectively in
+the |inline| string, advancing the index variable |ilp| as they go.
+
+@d skipb == while (ilp <= illen) and (the_char = ' ') do ilp := ilp+1
+@d skipnb == while (ilp <= illen) and (the_char <> ' ') do ilp := ilp+1
+
+@<Pick the verb...@>=
+skipb; istart := ilp; skipnb;@/
+for i := istart to ilp-1 do begin
+ if (inline[i] >= 'A') and (inline[i] <= 'Z') then
+ inline[i] := chr(ord(inline[i])+ord('a')-ord('A'))
+end;
+
+@ The main loop of the program is a loop of reading and executing commands:
+
+@d cmd_error(#) == begin writeln(#); goto cmd_prompt end
+
+@<The main program@>=
+cmd_prompt:
+ writeln;
+ write('FFC>');
+ readln(inline);@/
+ if length(inline) = 513 then cmd_error('Command line too long');@/
+ inline := inline+' ';
+ ilp := 1;
+ illen := length(inline);@/
+ verb := command_verb;@/
+ if verb = nonesuch then cmd_error('No such command')@/
+ else @<Execute the command@>;@/
+ goto cmd_prompt;
+final_end:
+
+@* Reading LN03 format files. We read the entire LN03 file into a single
+large buffer:
+
+@d ln03_blocks = 512
+@d ln03_buf_size == ((ln03_blocks*512)-1)
+@d ln03_buf == l_buf.c
+
+@<Globals...@>=
+@!ln03_file: byte_file;
+@!ln03_count,ln03_len,i: integer;
+@!l_buf: packed record
+ case boolean of
+ false: (c: packed array[0..ln03_buf_size] of char);
+ true: (b: packed array [0..ln03_blocks-1] of byte_block);
+ end;
+
+@ The file name is obtained from |inline|:
+
+@<Execute...@>=
+if verb = rln03 then begin
+ skipb;
+ istart := ilp;
+ skipnb;@/
+ open(ln03_file,the_substr,@=readonly@>,@=error:=continue@>);
+ if status(ln03_file) > 0 then cmd_error('Couldn''t open file');
+ reset(ln03_file);
+ @<Read the LN03 file@>
+end
+
+@ The LN03 file is read into |inline|, line by line, and copied into the
+|ln03_buf|:
+
+@<Read the LN03 file@>=
+ln03_count:=0;
+while (not eof(ln03_file)) and (ln03_count < ln03_blocks) do
+ begin
+ read(ln03_file,l_buf.b[ln03_count]);
+ ln03_count:=ln03_count+1;
+ end;
+ln03_len:=ln03_count*512;
+close(ln03_file);
+@<Check LN03 file@>
+
+@ It would be desirable to check@^checking@> the LN03 file just read in, to
+warn the user about anomalies. For the moment, though, we just look at the
+opening two longwords. There are lots of other things we would like to do,
+for example: check that all character locators and string descriptors point
+into the right ranges, check that character definitions and strings in the
+pool are in order, check that every character definition has the ``flag
+flag'' set, check that character definitions are aligned and do not
+overlap.
+
+@d ln03_long(#) == (ord(ln03_buf[#]) + (256*(ord(ln03_buf[(#)+1])
+ + 256*(ord(ln03_buf[(#)+2])
+ + 256*ord(ln03_buf[(#)+3])))))
+
+@d ln03_word(#) == (ord(ln03_buf[#]) + 256*ord(ln03_buf[(#)+1]))
+
+@<Check LN03 file@>=
+if ln03_len < 16 then writeln('LN03 file too short');
+if (ln03_buf[4] <> 'F') or (ln03_buf[5] <> 'O') or (ln03_buf[6] <> 'N') or
+ (ln03_buf[7] <> 'T') then writeln('Second longword not FONT')
+
+@* Reading PXL format files. The \.{PXL} format is simple. Again we read
+the entire file into a single large buffer:
+
+@d pxl_blocks = 512
+@d pxl_buf_size == ((pxl_blocks*512)-1)
+@d pxl_buf == p_buf.c
+
+@<Globals...@>=
+@!pxl_file: byte_file;
+@!pxl_count,pxl_len: integer;
+@!p_buf: packed record
+ case boolean of
+ false: (c: packed array[0..pxl_buf_size] of char);
+ true: (b: packed array [0..pxl_blocks-1] of byte_block);
+ end;
+
+@ The file name is obtained from |inline|:
+
+@<Execute...@>=
+else if verb = rpxl then begin
+ skipb;
+ istart := ilp;
+ skipnb;@/
+ open(pxl_file,the_substr,@=readonly@>,@=error:=continue@>);
+ if status(pxl_file) > 0 then cmd_error('Couldn''t open file');
+ reset(pxl_file);
+ @<Read the \.{PXL} file@>
+end
+
+@ The \.{PXL} file is read into |inline|, line by line, and copied into the
+|pxl_buf|:
+
+@<Read the \.{PXL} file@>=
+pxl_count:=0;
+while (not eof(pxl_file)) and (pxl_count < pxl_blocks) do
+ begin
+ read(pxl_file,p_buf.b[pxl_count]);
+ pxl_count:=pxl_count+1;
+ end;
+pxl_len:=pxl_count*512;
+close(pxl_file);
+@<Check \.{PXL} file@>
+
+@ As was the case for the LN03 format file, we would also like to
+check@^checks@> the \.{PXL} file just read in, to warn the user about
+anomalies.
+
+On VMS systems, \.{PXL} files are usually padded with extra longwords at
+the end so their length is a multiple of 512. Thus, we search backwards
+from the end of the file, looking for the ID longword (value 1001), which
+marks the real end of the file. We only search through the last 512 bytes,
+however.
+
+The definitions of |pxl_long| and |pxl_word| take into account the fact
+that the bytes in \.{PXL} file longwords are reversed with respect to the
+normal VAX ordering.
+
+@d pxl_long(#) == (ord(pxl_buf[(#)+3]) + (256*(ord(pxl_buf[(#)+2])
+ + 256*(ord(pxl_buf[(#)+1])
+ + 256*ord(pxl_buf[#])))))
+
+@d pxl_word(#) == (ord(pxl_buf[(#)+1]) + 256*ord(pxl_buf[#]))
+
+@<Check \.{PXL} file@>=
+if not (pxl_len mod 4 = 0) then writeln('PXL file length not multiple of 4');
+if pxl_long(0) <> 1001 then writeln('Initial PXL format id wrong');
+i := pxl_len-4;
+while (i >= pxl_len-512) do begin
+ if pxl_long(i) = 1001 then begin
+ pxl_len := i+4;
+ i := -1
+ end else i := i-4
+end;
+if pxl_len < 16 then writeln('PXL file too short');
+if pxl_long(pxl_len-4) <> 1001 then writeln('Final PXL format id wrong');
+
+@* Typing the character rasters. When FFC gets a raster typing command, it
+may read a character number from |inline| using the function |getfixnum|.
+
+@<Major...@>=
+ function getfixnum :integer;
+ label 1;
+ var x,x1 :integer;
+ negative :boolean;
+
+ begin
+ x1 := 0;
+ negative := false;
+ skipb;
+ if ilp > illen then goto 1;
+ if the_char = '-' then begin
+ negative := true;
+ ilp := ilp+1
+ end;
+
+ if (ilp > illen) or (the_char < '0') or (the_char > '9')
+ then goto 1;
+
+ x1 := 0;
+ while (the_char >= '0') and (the_char <= '9') do begin
+ x1 := 10*x1 + ord(the_char) - ord('0');
+ ilp := ilp+1;
+ if ilp > illen then goto 1;
+ end;
+
+ 1:
+ x := x1;
+ if negative then x := -x;
+ getfixnum := x
+
+ end;
+
+@ The rasters corresponding to a character are stored in the area of the
+LN03 file called the character definitions area. This area is pointed to by
+entries in the character directory. The location of the character directory
+is specified in the font file header. We define symbolic names for all the
+offsets in the font file header:
+
+@d nob_offset = 0
+@d font_offset = nob_offset+4
+@d version_offset = font_offset+4
+@d id_offset = version_offset+4
+@d id_string_offset = id_offset + 8
+@d revision_offset = id_string_offset + 64
+@d date_offset = revision_offset + 4
+@d attributes_offset = date_offset + 12
+@d parameters_offset = attributes_offset + 8
+@d chardir_offset = parameters_offset + 8
+@d segment_list_offset = chardir_offset + 8
+@d future_info_offset = segment_list_offset + 8
+@d string_pool_offset = future_info_offset + 8
+@d kern_info_offset = string_pool_offset + 8
+@d chardefs_offset = kern_info_offset + 8
+@d charcount_offset = chardefs_offset + 8
+@d organization_flags_offset = charcount_offset + 32
+@d size_of_char_params_offset = organization_flags_offset + 4
+@d raster_expansion_info_offset = size_of_char_params_offset + 4
+
+@ With these definitions, we figure out which character the user wants us
+to display, determine where its locator is in the character directory, and
+display the rasters.
+
+@<Execute...@>=
+else if verb = tln03 then begin
+ skipb;
+ if ilp > illen then cmd_error('You have to say what character to type');
+ if (the_char = '''') and (ilp < illen) then i := ord(inline[ilp+1])
+ else i := getfixnum;
+ if (i < ln03_long(charcount_offset)) or
+ (i > ln03_long(charcount_offset+4))
+ then cmd_error('No such character');
+ i := 4*(i-ln03_long(charcount_offset))+ln03_long(chardir_offset+4);
+ @<Find start of rasters for character@>;
+ @<Actually type the rasters@>
+end
+
+@ The variable |def_start| is the location in the file where the character
+definition begins. The rasters themselves begin a few bytes down from
+there, at |ras_start|. The array |visible_byte| is used to hold the visible
+form of a byte from the raster.
+
+@<Global...@>=
+@!def_start, ras_start: integer;
+@!j,k,l,m,n: integer; { scratch variables }
+@!visible_byte: packed array[1..8] of char;
+
+@ The character definition we are seeking is pointed to by a character
+locator@^character locators@> in the character directory portion of the
+LN03 file.
+
+In this version of FFC, we only support locators that point directly into
+the file. The LN03 format also allows ``indirect'' locators that point to
+other files, or to another locator. These are distinguished by a high bit 1
+in the locator longword, whence the test |ln03_buf[i+3] >= chr(@"80)|
+below.
+
+@<Find start...@>=
+ if ln03_buf[i+3] >= chr(@"80)
+ then cmd_error('Indirect locators not supported');
+ def_start := ord(ln03_buf[i])+256*ln03_word(i+1);
+ if def_start = 0 then cmd_error('Locator is zero');
+ ras_start := def_start+ln03_long(size_of_char_params_offset);
+ writeln(' ma = ',ras_start:1);
+ if ras_start > ln03_buf_size
+ then cmd_error('Character outside piece of file read')
+
+@ The LN03 format allows the raster to be stored in a number of ways. The
+rasters may be placed in one of eight different ``orientations,''
+corresponding to repeated $90$ degree orthogonal rotation and mirroring.
+When we type out the rasters, we just show things the way they are in the
+file. All we need to know is if the orientation is landscape or portrait,
+which can be tested by determining of the orientation value is odd or even.
+
+In addition to the different orientations, the format supports run length
+encoding@^run length encoding@>. The current version of FFC does not,
+however. We therefore require that the ``Type1'' field in the rasters equal
+|@"81|, which indicates no run length encoding:
+
+@<Actually type...@>=
+ writeln('width ',((ln03_long(def_start+4))/24.0):5:1,' pixels');
+ if ord(ln03_buf[ras_start+1]) <> @"81
+ then cmd_error('Run length encoding not supported');
+ if odd(ord(ln03_buf[ras_start])) then begin { landscape }
+ writeln('landscape');
+ i := ln03_word(ras_start+4);
+ j := ln03_word(ras_start+6)
+ end else begin { portrait }
+ writeln('portrait');
+ i := ln03_word(ras_start+6);
+ j := ln03_word(ras_start+4)
+ end;
+ writeln(i:1,' rows ',j:1,' columns');
+
+ k := i div 8;
+ if i <> 8*k then k := k+1;
+ for l := 0 to j-1 do begin
+ for m := 0 to k-1 do begin
+ binrep(ord(ln03_buf[ras_start+8+k*l+m]));
+ write(visible_byte)
+ end;
+ writeln
+ end
+
+@ The |binrep| procedure used in the preceding section writes the visible
+representation of a bitmap byte into the array |visible_byte|. The visible
+representation is binary, padded out to a width of 8, using a `\.{B}' to
+represent 1 and a period `\.{.}' to represent 0.
+
+@<Major...@>=
+procedure binrep (v: integer);
+ var cnt, rem, quo: integer;
+begin
+ visible_byte := '........';
+ quo := v;
+ for cnt := 1 to 8 do begin
+ rem := quo mod 2;
+ quo := quo div 2;
+ if rem <> 0 then visible_byte[cnt] := 'B'
+ end;
+end;
+
+@ The code up to now has been concerned with typing rasters from LN03
+files. \.{PXL} files are similar but simpler. The orientation is always
+portrait. The directory information is always located at a fixed position
+with respect to the end of the file.
+
+@<Execute...@>=
+else if verb = tpxl then begin
+ skipb;
+ if ilp > illen then cmd_error('You have to say what character to type');
+ if (the_char = '''') and (ilp < illen) then i := ord(inline[ilp+1])
+ else i := getfixnum;
+ if (i < 0) or (i > 127) then cmd_error('No such character');
+ def_start := pxl_len - 4*517 + 16*i;
+ ras_start := 4*pxl_long(def_start+8);
+ writeln(' rasters at ',ras_start:1);
+ if ras_start > pxl_len then cmd_error('Rasters outside file');
+ i := pxl_word(def_start);
+ j := pxl_word(def_start+2);
+ writeln(i:1,' columns ',j:1,' rows');
+ k := i div 32;
+ if i <> 32*k then k := k+1;
+ for l := 0 to j-1 do begin
+ for m := 0 to k-1 do begin
+ rev_binrep(ord(pxl_buf[ras_start+4*k*l+4*m]));
+ write(visible_byte);
+ rev_binrep(ord(pxl_buf[ras_start+4*k*l+4*m+1]));
+ write(visible_byte);
+ rev_binrep(ord(pxl_buf[ras_start+4*k*l+4*m+2]));
+ write(visible_byte);
+ rev_binrep(ord(pxl_buf[ras_start+4*k*l+4*m+3]));
+ write(visible_byte)
+ end;
+ writeln
+ end
+end
+
+@ A different |binrep| procedure is wanted here, one that puts the
+bits into |visible_byte| in opposite order:
+
+@<Major...@>=
+procedure rev_binrep (v: integer);
+ var cnt, rem, quo: integer;
+begin
+ visible_byte := '........';
+ quo := v;
+ for cnt := 1 to 8 do begin
+ rem := quo mod 2;
+ quo := quo div 2;
+ if rem <> 0 then visible_byte[9-cnt] := 'B'
+ end;
+end;
+
+
+@* Typing raw data from the file. For preliminary debugging purposes, it is
+useful to have the ability to type raw data from a font file. This is the
+purpose of the following simple code:
+
+@<Execute...@>=
+else if verb = tln03long then begin
+ i := getfixnum;
+ if (i >= 0) and (i < ln03_len) then writeln(ln03_long(i):1)
+ else writeln('Location not in file')
+end
+else if verb = tln03word then begin
+ i := getfixnum;
+ if (i >= 0) and (i < ln03_len) then writeln(ln03_word(i))
+ else writeln('Location not in file')
+end
+else if verb = tpxllong then begin
+ i := getfixnum;
+ if (i >= 0) and (i < pxl_len) then writeln(pxl_long(i):1)
+ else writeln('Location not in file')
+end
+else if verb = tpxlword then begin
+ i := getfixnum;
+ if (i >= 0) and (i < pxl_len) then writeln(pxl_word(i))
+ else writeln('Location not in file')
+end
+
+@* Conversion to LN03 form. When converting a font from \.{PXL} to LN03
+form, in addition to converting the character rasters, we have to fill
+in a number of font parameter slots. These slots are located in the
+first three areas of the font file. We already defined offset constants
+into the first area, the font file header. Here are some offsets into the
+other two areas, the ``font attributes'' and the ``font parameters.''
+
+@d flags_offset = raster_expansion_info_offset + 48
+@d strings_offset = flags_offset + 4
+@d type_size_offset = strings_offset + 48
+@d foundry_offset = type_size_offset + 36
+@d param_flags_offset = foundry_offset + 16
+@d lining_offset = param_flags_offset + 4
+@d subsup_offset = lining_offset + 32
+@d hspace_offset = subsup_offset + 16
+@d vspace_offset = hspace_offset + 32
+@d charxdir_offset = vspace_offset + 40
+
+@ When we are asked to convert to LN03 form, we first clear the |ln03_buf|,
+then we convert the rasters, and finally we fill the parameters. For the
+moment, to comply with the LN03 format's restriction to 94 characters, we
+only convert characters 33 through 126 of the \.{PXL} file. The rest are
+discarded. If the command is \.{toln03x}, however, the entire 128
+characters are copied, violating the LN03 format standard.
+
+@<Execute...@>=
+else if (verb = toln03) or (verb = toln03x) then begin
+ for i := 0 to ln03_buf_size do ln03_buf[i] := chr(0);
+ if verb = toln03 then begin first_char := 33; last_char := 126 end
+ else begin first_char := 0; last_char := 127 end;
+ num_chars := last_char-first_char+1;
+ @<Convert \.{PXL} rasters to LN03 form@>;
+ @<Fill LN03 parameters@>
+end
+
+@ We have to know where to put the rasters as we convert them, which means
+we have to know where the ``character definitions'' area begins in the LN03
+file. That area comes after the character directory (4 bytes per
+character), the table of font segments (4 bytes, to indicate there are
+no font segments), the future info section (empty), the string pool,
+and the kerning info (empty).
+
+The string pool has to contain the character set designator (7 bytes), type
+family ID (7 bytes), type family name, Font ID (16 bytes), type category,
+foundry, font designer, and segment names. For the moment, converted files
+have a 16-byte type family name and empty type category, foundry, font
+designer and segment names. The total length is 46 bytes, rounded up to 48
+bytes.
+
+To fill some slots in the LN03 format, we have to add up the sizes of the
+rasters in three different ways---portrait, landscape and
+``mixed''---whence the variables |psize|, |lsize| and |msize|.
+
+@<Globals...@>=
+@!charxdef_offset,string_pool_size,stringx_pool_offset: integer;
+@!psize,lsize,msize: integer;
+@!first_char,last_char,num_chars: integer;
+@!all_blank: boolean;
+@!zchar,tfm_width,x_offset,y_offset: integer;
+@!dsize,mag: real;
+
+@ The |charxdef_offset| can be computed from the information above. (We
+could have defined this offset as a constant, but want to leave ourselves a
+little more flexibility.)
+
+@<Convert \.{PXL} rasters...@>=
+ string_pool_size := 48;
+ stringx_pool_offset := charxdir_offset+4*num_chars+4;
+ charxdef_offset := stringx_pool_offset+string_pool_size;
+ ln03_len := charxdef_offset;
+ psize := 0; lsize := 0; msize := 0;
+ for zchar := first_char to last_char do
+ begin @<Convert \.{PXL} for |zchar|@> end;
+
+@ When converting for a single character, we first fill in the ``flag
+flag'' of the character, which the format requires us to set. Then we copy
+the nominal width, left bearing and raster baseline.
+
+The LN03 format demands that these dimensions be converted to
+``centipoints,'' where a ``centipoint@^centipoint (unit of measure)@>'' is
+defined to be one 7200$^{\rm th}$ of an inch. The nominal width is stored
+in the \.{PXL} file as a fraction of the magnification times design size.
+The magnification, multiplied by five times the dots per inch (in our case
+1500), is stored in the fourth-from-last longword of the \.{PXL} file. The
+design size is stored in the third-from-last longword in units of $2^{-20}$
+``points,'' a ``point'' being defined as one 72.27$^{\rm th}$ of an inch.
+
+The left bearing and raster baseline are stored in pixel units in the
+\.{PXL} file and in centipoints in the LN03 file, so the conversion
+factor is $7200/300 = 24$.
+
+@d two_to_the_20th == (@"100000)
+
+@<Convert \.{PXL} for ...@>=
+ ln03_buf[ln03_len+3] := chr(@"80);
+ def_start := pxl_len - 4*517 + 16*zchar;
+ ras_start := 4*pxl_long(def_start+8);
+ if ras_start > pxl_len then cmd_error('Rasters outside file for ',
+ zchar:1);
+ tfm_width := pxl_long(def_start+12);
+ dsize := pxl_long(pxl_len-12);
+ mag := pxl_long(pxl_len-16);
+ dsize := (dsize/two_to_the_20th)*(mag/1500.0);
+ x_offset := signed_pxl_word(def_start+4);
+ y_offset := signed_pxl_word(def_start+6);
+ set_ln03_long(ln03_len+4,round((dsize*7200.0*tfm_width)/
+ (two_to_the_20th*72.27)));
+ set_ln03_long(ln03_len+8,-24*x_offset);
+ set_ln03_long(ln03_len+12,-24*y_offset);
+
+@ Even though we're not trying to make this program portable, we do
+the word and longword computations by hand, instead of using overlays.
+
+@<Major...@>=
+ function signed_pxl_word (index: integer) :integer;
+ begin
+ if ord(pxl_buf[index]) >= @"80 then
+ signed_pxl_word := pxl_word(index) - @"10000
+ else signed_pxl_word := pxl_word(index)
+ end;
+
+ procedure set_ln03_long (index, value: integer);
+ var negative: boolean;
+ a,b,c,d,carry: integer;
+ begin
+ if value < 0 then negative := true else negative := false;
+ if negative then value := -value;
+ a := value mod 256;
+ b := (value div 256) mod 256;
+ c := (value div (256*256)) mod 256;
+ d := value div (256*256*256);
+ if negative then begin
+ carry := 0;
+ a := 256-a;
+ if a = 256 then begin a := 0; carry := 1 end;
+ b := 255+carry-b;
+ if b = 256 then b := 0 else carry := 0;
+ c := 255+carry-c;
+ if c = 256 then c := 0 else carry := 0;
+ d := 255+carry-d;
+ if d = 256 then d := 0
+ end;
+ ln03_buf[index] := chr(a);
+ ln03_buf[index+1] := chr(b);
+ ln03_buf[index+2] := chr(c);
+ ln03_buf[index+3] := chr(d)
+ end;
+
+@ The rasters are always placed in portrait into the LN03 file, with no use
+of run-length encoding, so the ``orient'' field of the raster format is 0,
+and the ``Type1'' field is @"81. We copy the rasters byte by byte from the
+\.{PXL} buffer, reversing each byte. At the end we store the raster address
+in the character directory and increment the |pxl_len| variable, making
+sure that all character definitions fall on even-byte boundaries. We also
+increment the size variables.
+
+If the rasters for a character are completely blank, an ``undocumented
+feature'' of the LN03 seems to cause things to go wrong. Thus, in that
+case, we set height and width to 1, and put in a blank byte.
+
+@<Convert \.{PXL} for...@>=
+ ln03_buf[ln03_len+17] := chr(@"81);
+ i := pxl_word(def_start);
+ j := pxl_word(def_start+2);
+ all_blank := (i = 0) and (j = 0);
+ if all_blank then begin i := 1; j := 1 end;
+ ln03_buf[ln03_len+20] := chr(j mod 256);
+ ln03_buf[ln03_len+21] := chr(j div 256);
+ ln03_buf[ln03_len+22] := chr(i mod 256);
+ ln03_buf[ln03_len+23] := chr(i div 256);
+ k := i div 32;
+ if i <> 32*k then k := k+1;
+ n := i div 8;
+ if i <> 8*n then n := n+1;
+ if not all_blank then
+ for l := 0 to j-1 do
+ for m := 0 to n-1 do
+ ln03_buf[ln03_len+24+n*l+m] :=
+ reverse_byte(pxl_buf[ras_start+4*k*l+m]);
+ set_ln03_long(charxdir_offset+4*(zchar-first_char),ln03_len);
+ ln03_len := ln03_len+24+j*n;
+ if odd(ln03_len) then ln03_len := ln03_len+1;@/
+ { now update the size counts }
+ psize := psize+j*n;
+ k := j div 8;
+ if j <> 8*k then k := k+1;
+ lsize := lsize+i*k;
+ if i*k > j*n then msize := msize+i*k else msize := msize+j*n;
+
+@ It is necessary to use a function |reverse_byte| to reverse the bits in
+going from the \.{PXL} to the LN03 raster format. It would be faster to do
+this with a 256-byte string.
+
+@<Major...@>=
+ function reverse_byte (u: char) : char;
+ var cnt,rv :integer;
+ begin
+ binrep(ord(u));
+ rv := 0;
+ for cnt := 1 to 8 do
+ if visible_byte[cnt] = 'B' then rv := 1 + 2*rv
+ else rv := 2*rv;
+ reverse_byte := chr(rv)
+ end;
+
+@* Filling in the LN03 parameters. Once the rasters are transferred from
+\.{PXL} to LN03 format, we have to fill in the endless LN03 parameters,
+using the offsets defined above. We will only fill parameters that are not
+left at zero, since we already initialized the |ln03_buf| to zero above. We
+start off with the header and trailer, placing |'FONT'| and the |ln03_len|
+in the opening and closing longwords.
+
+@<Fill LN03 parameters@>=
+ if ln03_len mod 4 <> 0 then ln03_len := ln03_len + (4 - (ln03_len mod 4));
+ ln03_len := ln03_len+8; { for trailer }
+ set_ln03_long(0,ln03_len);
+ set_ln03_long(ln03_len-8,ln03_len);
+ ln03_buf[4] := 'F';
+ ln03_buf[ln03_len-4] := 'F';
+ ln03_buf[5] := 'O';
+ ln03_buf[ln03_len-3] := 'O';
+ ln03_buf[6] := 'N';
+ ln03_buf[ln03_len-2] := 'N';
+ ln03_buf[7] := 'T';
+ ln03_buf[ln03_len-1] := 'T';
+
+@ There follow the version number of the format (always 1), the font file
+ID (always the value indicated below), the revision number of the font
+(always 0), and the date and time record (always 2:00 {\eightrm P.M.},
+September 11, 1973). Eventually the user will be able to set the font file
+ID with a command, and the time will come from the timestamp on the \.{PXL}
+file.
+
+@<Fill LN03 parameters@>=
+ ln03_buf[version_offset] := chr(1);
+ ln03_buf[id_offset] := chr(31);
+ ln03_buf[id_offset+4] := chr(id_offset+8);
+ font_id_string := 'U000000002SK00GG0001UZZZZ02F000';
+ for i := 1 to 31 do ln03_buf[id_string_offset+i-1] :=
+ font_id_string[i];
+ ln03_buf[date_offset] := chr(1973 mod 256);
+ ln03_buf[date_offset+1] := chr(1973 div 256);
+ ln03_buf[date_offset+2] := chr(9);
+ ln03_buf[date_offset+4] := chr(11);
+ ln03_buf[date_offset+6] := chr(14);
+
+@ Oops, we forgot to declare the |font_id_string|:
+
+@<Globals...@>=
+@!font_id_string: packed array [1..31] of char;
+
+@ After the date and time come the various pointers into the file.
+
+@<Fill LN03 parameters@>=
+ set_ln03_long(attributes_offset,param_flags_offset-flags_offset);
+ set_ln03_long(attributes_offset+4,flags_offset);
+ set_ln03_long(parameters_offset,charxdir_offset-param_flags_offset);
+ set_ln03_long(parameters_offset+4,param_flags_offset);
+ set_ln03_long(chardir_offset,4*num_chars);
+ set_ln03_long(chardir_offset+4,charxdir_offset);
+ set_ln03_long(segment_list_offset,4);
+ set_ln03_long(segment_list_offset+4,charxdir_offset+4*num_chars);
+ set_ln03_long(future_info_offset+4,charxdir_offset+4*num_chars+4);
+ set_ln03_long(string_pool_offset,string_pool_size);
+ set_ln03_long(string_pool_offset+4,charxdir_offset+4*num_chars+4);
+ set_ln03_long(kern_info_offset+4,charxdir_offset+4*num_chars+4+
+ string_pool_size);
+ set_ln03_long(chardefs_offset,ln03_len-8-charxdef_offset);
+ set_ln03_long(chardefs_offset+4,charxdef_offset);
+
+@ Next come the eight longwords of character count information, the
+``organization'' flags, the size of character parameters, and the raster
+expansion information.
+
+@<Fill LN03 parameters@>=
+ set_ln03_long(charcount_offset,first_char); { first character }
+ set_ln03_long(charcount_offset+4,last_char); { last character }
+ set_ln03_long(charcount_offset+28,32); { space encoding }
+ set_ln03_long(charcount_offset+32,@"A8); { ``organization'' flags }
+ set_ln03_long(charcount_offset+36,16); { size of character params. }
+ set_ln03_long(raster_expansion_info_offset,num_chars); { in file locator count }
+ set_ln03_long(raster_expansion_info_offset+8,num_chars); { number of character defs. }
+ set_ln03_long(raster_expansion_info_offset+16,num_chars); { number of rasters }
+ set_ln03_long(raster_expansion_info_offset+24,psize);
+ set_ln03_long(raster_expansion_info_offset+28,lsize);
+ set_ln03_long(raster_expansion_info_offset+32,msize);
+
+@ Next come the font attributes. These include a number of strings that
+have to be placed in the string pool. Of the flags, we set the Roman one
+only. The character set designator is always set to |'0B'|, tab, |'ZZZZ'|.
+Again, eventually the user will have commands to set these.
+
+@<Fill LN03 parameters@>=
+ set_ln03_long(flags_offset,2); { flags }
+ set_ln03_long(flags_offset+4,7); { length of character set designator }
+ set_ln03_long(flags_offset+8,stringx_pool_offset);
+ ln03_buf[stringx_pool_offset] := '0';
+ ln03_buf[stringx_pool_offset+1] := 'B';
+ ln03_buf[stringx_pool_offset+2] := chr(9);
+ ln03_buf[stringx_pool_offset+3] := 'Z';
+ ln03_buf[stringx_pool_offset+4] := 'Z';
+ ln03_buf[stringx_pool_offset+5] := 'Z';
+ ln03_buf[stringx_pool_offset+6] := 'Z';
+ set_ln03_long(flags_offset+12,7); { length of type family ID }
+ set_ln03_long(flags_offset+16,stringx_pool_offset+7);
+ for i := 1 to 7 do
+ ln03_buf[stringx_pool_offset+7+i-1] := font_id_string[i];
+ set_ln03_long(flags_offset+20,16); { length of type family name }
+ set_ln03_long(flags_offset+24,stringx_pool_offset+7+7);
+ for i := 1 to 16 do
+ ln03_buf[stringx_pool_offset+7+7+i-1] := ' ';
+ set_ln03_long(flags_offset+28,16); { length of font id }
+ set_ln03_long(flags_offset+32,stringx_pool_offset+7+7+16);
+ for i := 1 to 16 do
+ ln03_buf[stringx_pool_offset+7+7+16+i-1] := font_id_string[i];
+
+@ The type size is given in the \.{PXL} file in units of $2^{-20}$ points;
+we have to translate it to points. The average character width is
+arbitrarily set to half the point size (which means we multiply it by 50 to
+convert it to centipoints).
+
+@<Fill LN03 parameters@>=
+ i := pxl_long(pxl_len-12);
+ points := i div two_to_the_20th;
+ k := (10000*i mod two_to_the_20th) div two_to_the_20th;
+ ln03_buf[type_size_offset] := chr(points mod 256);
+ ln03_buf[type_size_offset+1] := chr(points div 256);
+ ln03_buf[type_size_offset+2] := chr(k mod 256);
+ ln03_buf[type_size_offset+3] := chr(k div 256);
+ if k > 4999 then points := points+1;
+ set_ln03_long(type_size_offset+4,50*points);
+
+@ We need to declare |points|, by the way, which stores the pointsize of
+the font as an integer.
+
+@<Globals...@>=
+@!points: integer;
+
+@ Next come the resolution, weight, horizontal proportion, horizontal
+proportion fraction, aspect ratio and character up vector.
+
+@<Fill LN03 parameters@>=
+ ln03_buf[type_size_offset+10] := chr(24); { hocus-pocus means 300 dpi }
+ ln03_buf[type_size_offset+12] := chr(16); { weight is ``regular'' }
+ ln03_buf[type_size_offset+16] := chr(16); { horizontal proportion is regular}
+ ln03_buf[type_size_offset+20] := chr(1);
+ ln03_buf[type_size_offset+22] := chr(1);@/
+ ln03_buf[type_size_offset+24] := chr(1); { aspect ratio is 1/1}
+ ln03_buf[type_size_offset+26] := chr(1);
+ ln03_buf[type_size_offset+30] := chr(1); { character up vector }
+
+@ The third and last step of the filling process handles the font
+parameters, which are mostly supposed to be in ``centipoints.'' Eventually
+some of these will be obtained from the \.{TFM} file, but for the moment we
+wing it, guessing them all from the point size |points|.
+
+The flag longword that begins the font parameter section can conveniently
+be left empty. The slant is not guessed, but always set to zero. As you can
+see, the values of the horizontal and vertical spacing parameters are
+fairly random, but should not lead to impossibly poor output.
+
+@<Fill LN03 parameters@>=
+ set_ln03_long(lining_offset,12*points); { underline offset }
+ set_ln03_long(lining_offset+4,8*points); { underline thickness }
+ set_ln03_long(lining_offset+8,-25*points); { strike through offset }
+ set_ln03_long(lining_offset+12,8*points); { strike through thickness }
+ set_ln03_long(lining_offset+16,-60*points); { overline offset }
+ set_ln03_long(lining_offset+20,8*points); { overline thickness }
+ ln03_buf[lining_offset+26] := chr(1); { slant (always 0) }
+ ln03_buf[lining_offset+30] := chr(points*12 mod 256); { shadow vector }
+ ln03_buf[lining_offset+31] := chr(points*12 div 256);
+ set_ln03_long(subsup_offset,-36*points);
+ set_ln03_long(subsup_offset+8,16*points);
+ set_ln03_long(hspace_offset,24*points); { center line }
+ set_ln03_long(hspace_offset+4,20*points); { minimum space width }
+ set_ln03_long(hspace_offset+8,80*points); { maximum space width }
+ set_ln03_long(hspace_offset+12,25*points); { width of space }
+ set_ln03_long(hspace_offset+16,100*points); { width of em }
+ set_ln03_long(hspace_offset+20,50*points); { width of en }
+ set_ln03_long(hspace_offset+24,10*points); { width of thinspace }
+ set_ln03_long(hspace_offset+28,35*points); { width of digit }
+ set_ln03_long(vspace_offset,-64*points); { top line }
+ set_ln03_long(vspace_offset+4,-50*points); { floating accent line }
+ set_ln03_long(vspace_offset+8,-35*points); { half line }
+ set_ln03_long(vspace_offset+12,100*points); { total vertical size }
+ set_ln03_long(vspace_offset+16,-65*points); { above baseline }
+ set_ln03_long(vspace_offset+20,35*points); { below baseline }
+ set_ln03_long(vspace_offset+24,65*points); { cap H height }
+ set_ln03_long(vspace_offset+28,35*points); { small x height }
+ set_ln03_long(vspace_offset+32,10*points); { white space above tallest }
+ set_ln03_long(vspace_offset+36,10*points); { white space below deepest }
+
+@* Writing the LN03 file. It seems to be conventional to store LN03 format
+font files as 512-byte fixed length record VAX files. For this reason, we
+declare |outfile| to be this type of file:
+
+@<Globals...@>=
+@!outfile: byte_file;
+
+@ The writing simply consists of putting chunks of the |ln03_buf| out
+into |outfile|.
+
+@<Execute...@>=
+else if verb = wln03 then begin
+ skipb;
+ if ilp > illen then cmd_error('You must specify a file to write into');
+ istart := ilp; skipnb;
+ open(outfile,the_substr,@=error:=continue@>);
+ if status(outfile) <> 0 then cmd_error('couldn''t open',the_substr);
+ rewrite(outfile);
+ i := ln03_len div 512;
+ if ln03_len <> i*512 then i := i+1;
+ for j := 0 to i-1 do
+ write(outfile,l_buf.b[j]);
+ close(outfile)
+end
+
+@* Leaving the program. If the user types an |exit| command, we leave:
+
+@<Execute...@>=
+else if verb = exit then goto final_end
+
+@* Index. This is the standard Web index to all identifiers.
diff --git a/dviware/ln03/rose/forpxl.fdl b/dviware/ln03/rose/forpxl.fdl
new file mode 100644
index 0000000000..121208c1c5
--- /dev/null
+++ b/dviware/ln03/rose/forpxl.fdl
@@ -0,0 +1,4 @@
+IDENT "14-NOV-1985 11:21:24 VAX-11 FDL Editor"
+
+RECORD
+ CARRIAGE_CONTROL none
diff --git a/dviware/ln03/rose/ln03bis.mem b/dviware/ln03/rose/ln03bis.mem
new file mode 100644
index 0000000000..813bc399e9
--- /dev/null
+++ b/dviware/ln03/rose/ln03bis.mem
@@ -0,0 +1,632 @@
+The purpose of this file is to explain how to print TeX
+files on your LN03 laser printer. To do this, you must have
+at least one optional RAM cartridge in your LN03.
+
+The TeX to LN03 driver has been changed substantially
+compared to the ones in previous distributions. Error
+reporting has been revamped, and the driver now reads PXL
+format font files as well as LN03 format font files.
+
+The TeX-to-LN03 driver described here requires VAX/VMS V4.2.
+(It has also been tested on Ultrix-32 V1.2 and on 4.3bsd
+Unix; see section 12, "Unix", below.)
+
+Most of the things described below probably also work on
+VAX/VMS V4.0 or V4.1, if you do your linking on a system
+which has VAX C installed.
+
+
+0. BILL OF MATERIALS
+
+The present file is:
+
+ ln03.mem
+
+These are the files that comprise the TeX to LN03 driver:
+
+ dvi2ln3.c
+ dvi2ln3nft.c
+ specials.c
+ clink.opt
+
+These other files comprise an auxiliary program that can be
+helpful:
+
+ newffc.c
+
+Depending on circumstances, you may have received .obj files
+corresponding to the different .c's, or you may need to
+regenerate them using a C compiler.
+
+
+
+1. INSTALLATION
+
+The basic steps to install the DVI to LN03 driver are as follows:
+
+ A. Link the driver program.
+
+ B. Set up your font raster directories.
+
+ C. Have users set up certain definitions in their login.com, or put
+ them in the system login file.
+
+No VMS privileges are needed to install the driver.
+
+
+STEP A, LINKING DVI2LN3. Type:
+
+ $ link dvi2ln3,dvi2ln3nft,specials,clink/opt
+
+
+STEP B, PXL FILES. If you don't already have a collection of font
+files in PXL format, you need to assemble one. The usual way to
+get PXL files is either off a TeX tape, or by running the GFtoPXL
+program which is supplied with Metafont.
+
+Your PXL fonts must have extensions .yyyyPXL, where yyyy is the
+magnification times 1500. For example, the fonts that are at 100%
+magnification have extension .1500PXL, and those that are at 120%
+magnification have extension .1800PXL. Be sure, of course, that
+the fonts are suitable for 300 dot per inch printers, because
+that's what the LN03 is.
+
+VMS allows two files to have the same data bytes, which are
+interpreted in different ways depending on the "record format",
+"record attributes", and "record size". There are many
+possibilities for these parameters. Dvi2ln3 has been tested with
+PXL files of the following two types:
+
+ record format: stream_LF
+
+or
+
+ record format: fixed, record size: 4
+
+You determine these characteristics of a given file by doing a
+VMS DIRECTORY /FULL on the file.
+
+I believe the files come off the TeX tape in the second format.
+If for some reason, your PXL files are not in one of these
+formats, you should test dvi2ln3 to see if it works. If it
+doesn't, you will have to convert your files somehow. Please
+consult section 9 below for some hints on how to do this.
+
+
+STEP C, DEFINITIONS. Everyone who uses the DVI to LN03 converter
+must have the following definitions:
+
+ $ dvi2ln3 == "$tex$:dvi2ln3"
+ $ define tex$pxldir <wherever your PXL files are>
+
+The logical names tex$ and tex$fonts are also needed; these
+should be defined as for running TeX itself.
+
+
+
+2. USING THE DVI TO LN03 DRIVER
+
+To convert foo.dvi to an LN03 format file (extension .ln3), type
+
+ $ dvi2ln3 foo
+
+Print the file foo.ln3 on your LN03 by saying
+
+ $ print/nofeed/queue=<queuename> foo.ln3
+
+This assumes your system manager has set up the LN03 as a spooled
+device with queuename <queuename>. The /nofeed is very important,
+for if you omit it, you may get unwanted page breaks in your
+output file.
+
+
+
+3. COMMAND LINE OPTIONS FOR DVI2LN3
+
+The DVI2LN3 program has some options. These are typed on the
+command line, after the file name FOO, and separated from it by
+at least one space.
+
+ /S=page number - the output file will only contain the pages in
+ the DVI file that start at the given page number. The
+ page number is the value of counter 0.
+
+ /N=number of pages - the output file will only contain that many
+ pages from the DVI file.
+
+For example, to cause only pages 20 through 22 of FOO to be
+converted to LN03 form, say
+
+ $ DVI2LN3 FOO /S=20 /N=3
+
+ /H=<number> - print the file at a horizontal offset of <number>
+ pixels, i.e., moved right that many pixels. (There are 300 pixels to
+ the inch.)
+
+ /V=<number> - print the file at a vertical offset of <number>
+ pixels, i.e., moved down that many pixels.
+
+The values given with /V and /H are ADDED to the TeX parameters
+\hoffset and \voffset; they do not replace these parameters.
+
+ /L - print the entire file in landscape mode (with text running
+ along the long direction of the paper). The size of the text
+ is not changed. Thus you have only about 8 inches from top to
+ bottom - make sure your .tex file does not produce pages which
+ are longer than that.
+
+
+
+4. WARNINGS ABOUT THE LN03 DRIVER
+
+Now, some caveats and warnings about the LN03 driver for TeX.
+
+The driver is copyrighted data of Digital Equipment Corporation.
+Because Digital makes this software available for free, it does
+not promise that the software works or does anything.
+
+A different, supported TeX to LN03 driver may be available from
+Kellerman and Smith in Portland, Oregon.
+
+The most common problem people encounter when first using the
+LN03 support is forgetting to print the .ln3 files with the
+/nofeed qualifier. This can cause a page of output to be split
+into two or more pages.
+
+There are some limitations to the LN03 support:
+
+ - Your LN03 should have at least one RAM cartridge plugged in.
+ Otherwise, it is unlikely that any but the smallest documents
+ will print successfully.
+
+ - The landscape support is very recent.
+
+ - The code that reads PXL files is relatively recent. (Formerly,
+ the driver read LN03 format files only.)
+
+ - One cannot access the preloaded or ROM fonts in an LN03.
+
+ - DVI2LN3 has limitations on the size of a font load, which
+ may be exceeded by TeX files. This rarely occurs.
+
+ - The LN03 also has limitations on the complexity of a page, which
+ may be exceeded by TeX files. This is very rare.
+
+ - Very large fonts such as AMINCH cannot be handled. (The LN03 can't
+ handle them anyway.)
+
+ - For TeX's \magstephalf, the PXL files should have
+ extension .1642PXL. I believe this to be the
+ correct extension, but some distributions give
+ the \magstephalf fonts extension .1643PXL.
+
+ - The VMS spooler for the LN03 has to be set up properly with
+ $ SET TERMINAL and $ SET QUEUE commands. Here are some settings
+ that have been found to work:
+
+Terminal queue LN03$B12, on BOSTON$TTE6:
+ /BASE_PRIORITY=4 /DEFAULT=(FEED) /NOENABLE_GENERIC
+ /FORM=DEFAULT Lowercase /OWNER=[SYSTEM] /PROTECTION=(S:E,O:D,G:R,W:RW)
+ /SCHEDULE=(NOSIZE) /SEPARATE=(FLAG,RESET=(PORTRAIT))
+
+Terminal: _TTE6: Device_Type: Unknown Owner: SYMBIONT_0001
+ Username: SYSTEM
+Terminal Characteristics:
+ Interactive Echo Type_ahead No Escape
+ No Hostsync TTsync Lowercase No Tab
+ No Wrap Scope No Remote Eightbit
+ No Broadcast No Readsync Form Fulldup
+ No Modem No Local_echo No Autobaud No Hangup
+ No Brdcstmbx No DMA No Altypeahd Set_speed
+ No Line Editing Overstrike editing No Fallback No Dialup
+ No Secure server Disconnect No Pasthru No Syspassword
+ No SIXEL Graphics No Soft Characters No Printer Port Numeric Keypad
+ No ANSI_CRT No Regis No Block_mode No Advanced_video
+ No Edit_mode No DEC_CRT No DEC_CRT2
+Device spooled to _CECIL$DUA7:
+
+
+6. MORE ABOUT FONTS
+
+If you should acquire LN03-format fonts by some means other than
+PXL file manipulation, you can use them with dvi2ln3. Just put
+them in a directory and define a logical tex$ln03dir to point to
+them.
+
+You will need to get TFM files for those fonts by some means. The
+NEWFFC program can help you (a little). If you have a font
+foo.ln03, and you want to know what the character with code xx
+looks like in that font, you can type:
+
+ $ run newffc
+
+ FFC>rnft foo.ln03
+ FFC>tnftr xx
+ [Types rasters and tells you the width of the character]
+ FFC>exit
+ $
+
+Using the raster width information, you can then compose a PL
+format file, which can then be converted to TFM format by running
+the PLtoTF program on it. PLtoTF is distributed with TeX.
+
+If you have a VT125, VT240 or VT241 terminal, you can type pnftr
+instead of tnftr; that plots the rasters on the screen using the
+terminal's graphics capabilities.
+
+To link newffc, type
+
+ $ link newffc,clink/opt
+
+or else
+
+ $ link newffc,sys$library:vaxcrtl/lib
+
+
+7. \special COMMANDS
+
+DVI2LN3 interprets certain \special commands.
+
+Right now, the following \special's are implemented:
+
+ ln03:defpoint integer ( [dimension] , [dimension] )
+ ln03:connect integer [/ integer] integer [/ integer] [dimension]
+ ln03:plotfile filename
+ ln03:resetpoints integer integer
+
+A dimension is a number with optional decimal point, followed by
+one of pt, in, pc, cm, mm, bp, dd, cc, and mi.
+
+The peculiar syntax of these commands is due to a request to
+emulate certain commands invented by Textset, Inc. (Ann Arbor,
+Michigan).
+
+Ln03:plotfile includes the named file literally in the .LN3
+output file. No parsing whatsoever of the file is done, nor are
+any defaults applied to the filename.
+
+The remaining specials work with an array of 255 points, numbered
+1 to 255. Each point is a location on the paper. Initially, the
+array is uninitialized; and any contiguous segment of the array
+may be returned to the uninitialized state using ln03:resetpoints
+a b, which uninitializes points a through b inclusive.
+
+A point value may be assigned to a particular position in the
+array using ln03:defpoint. In using ln03:defpoint, one may
+specify the coordinates of the point, or one may omit either the
+x- or the y-coordinate or both, in which case they are taken to
+be the current values at the time the \special call occurs.
+
+The ln03:connect special is used to draw a rule connecting two
+points. The two points must have either the same x-coordinate or
+the same y- coordinate. The optional dimension is the thickness
+of the rule; if none is specified, the rule is 2 pixels thick.
+
+
+8. DVI2LN3 ERROR MESSAGES
+
+Dvi2ln3 internal error, bad txfno or lnfno
+
+ Indicates a bug in dvi2ln3.
+
+Couldn't find good font file: using blanks
+
+ There was neither an LN03 format font file nor a PXL format font
+ file for the specified font and magnification. Dvi2ln3 is making
+ a font load which replaces all the glyphs in that font with blanks
+ of the appropriate width. Check that the font file directories
+ TEX$LN03DIR or TEX$PXLDIR exist and are readable to you.
+
+Error while reading PXL file
+
+ There was some problem reading the PXL file for the specified
+ font and magnification. Perhaps the file is not in correct
+ format.
+
+No more room in LN03 font load buffer (xxx bytes long)
+
+ Dvi2ln3 is trying to build a font load, and the font load has
+ become so large that it has exceeded the size of a buffer in
+ the program. The probable cause of this is that your document
+ uses one or more very large fonts. Dvi2ln3 is not designed
+ to work with fonts larger than 36pt.
+
+-- Bad NFT file, lacks FONT.
+-- bad NFT file, not enough character parameters
+-- bad NFT file, bad character range.
+LN03 font file bad, using blanks
+
+ The LN03 font file found for the specified font has some
+ problem (probably it is not in the right format). Dvi2ln3
+ will build a font load in which the glyphs for that font
+ are replaced by appropriately sized blanks. Use NEWFFC to
+ examine the LN03 font file and track down what might be
+ wrong with it.
+
+Usage: Dvi2ln3 <filename> <options>
+
+ You have called dvi2ln3 without giving it a parameter
+ (the name of the file it has to process).
+
+Couldn't open dvi file
+Couldn't rewind dvi file.
+
+ Dvi2ln3 is having trouble accessing the dvi file you
+ have asked it to read. Check that the file exists and
+ that you have read access to it.
+
+ You could also get this message if you forgot the
+ space between the dvi file and the options on the
+ command line. E.g. if you typed dvi2ln3 foo/h=10
+ then dvi2ln3 would try to open a file named "foo/h=10"
+ and would obviously fail in the attempt.
+
+Bad DVI file - check it with DVItype
+
+ There is something wrong with the dvi file which Dvi2ln3
+ is trying to read. Run DVItype on that file to find out
+ what is wrong. Since TeX writes correct DVI files, it is
+ unlikely you will get this message...
+
+Couldn't open output file
+
+ Dvi2ln3 couldn't open the .ln3 file it is trying to
+ create. Perhaps you don't have write access in the
+ current directory; perhaps your disk quota is exceeded.
+
+Can't construct a font load:
+Dvi file uses too many glyphs from too many different fonts.
+
+ The LN03 has limits on how many glyphs and fonts it can
+ handle. Dvi2ln3 tries to make best use of the LN03 within
+ those limits. However, if you get the above message, it
+ means Dvi2ln3 has been unable to figure out how to print
+ your file within those limits. Solution: print your file
+ a few pages at a time using the /s and /n command line
+ options. If this problem occurs even when you try to print
+ just a single page, then you will have to simplify that page.
+
+Font xxx uses > 188 characters. Can't handle that.
+
+ Fonts could have as many as 256 characters. However, dvi2ln3
+ assumes you will only use 188 of them in any one document.
+ If you get tris message, try to print your file a few pages
+ at a time.
+
+Stack too deep for Dvi2ln3
+
+ The dvi file has a stack, and Dvi2ln3 is designed only
+ to allow that stack to go 100 entries deep. This is essentially a
+ design error in the program. Solution: recompile dvi2ln3 with
+ a larger STACKSIZE parameter.
+
+Too many fonts for Dvi2ln3
+
+ Dvi2ln3 is designed to handle only 100 fonts in your document.
+ Again this is essentially a desing error in the program.
+ Solution: recompile dvi2ln3 with a larger MAXTEXFONTS
+ parameter.
+
+Font xxx has a bad scaled size
+Font xxx has a bad design size
+
+ This indicates a bad DVI file format.
+
+Can't open TFM file for font xxx
+
+ If you use a font named foo, there has to exist a file
+ foo.tfm in tex$fonts. If you get the above message,
+ make sure that file exists and is readable to you.
+
+Bad TFM file for font xxx
+
+ The TFM file is in a bad format. Check it with
+ the TFtoPL program, which will tell you what is
+ wrong with it.
+
+\special too long (over xxx bytes).
+
+ \special's are limited to a certain length (2048 bytes
+ or something like that). There is no need for a \special
+ to be anything like that long, so if you get this
+ message, obviously you have coded the \special in
+ some weird way.
+
+Unrecognized option 'xxx' ignored in \special command
+
+ This means you have a \special with a command ln03:xxx
+ and xxx means nothing to dvi2ln3.
+
+Invalid point number (xxx)
+
+ The \special's that deal with points are only designed
+ to handle 255 of them, numbered 1 to 255. If you get
+ the above message, it means you have probably tried
+ to use a point number outside the range 1 to 255.
+
+Unable to open plotfile xxx
+
+ You used the ln03:plotfile \special, but dvi2ln3 was
+ incapable of reading the plotfile you told it to read.
+
+No such unit of measure: xxx
+
+ You have used xxx in a context in which \special syntax
+ is expecting a unit of measure (such as "in", "cm", "pt").
+
+Can't connect along a diagonal.
+
+ The ln03:connect \special can only connect two points which
+ are either at the same horizontal coordinate or at the
+ same vertical coordinate.
+
+
+ERRORS THAT DVI2LN3 DOES NOT CATCH. There are a number of
+possible errors in processing your document that Dvi2ln3
+does not catch. You have to detect them by looking at the
+printed output.
+
+These include:
+
+ errors in the use of TeX commands to achieve the formatting effects
+ you desire (of course);
+
+ misuse of the /h= and /v= command line options in such a way that
+ margins are too small or text material is set off the page;
+
+ errors in font files that cause rasters to be wrong (e.g. if
+ a font file has rasters for a "2" in the position where there ought
+ to be a "1");
+
+ gross discrepancies between the raster font files and the .tfm
+ files;
+
+ certain font file format errors in which a font file contains bad
+ pointers.
+
+In general, if any part of your document seems to look wrong,
+check that you are using TeX correctly, then check carefully
+which fonts are involved in the part that comes out wrong.
+
+
+9. PXL FILE CONVERSION
+
+If your PXL files are not in one of the acceptable record formats
+described in section 1, you will need to perform some conversion.
+There are many possibilities, so we can only suggest one approach
+that may be helpful. This approach seems to work if your PXL
+files were written by GFtoPXL.
+
+(a) Link the newffc program by saying:
+
+ $ link newffc,clink/opt
+
+or else
+
+ $ link newffc,sys$library:vaxcrtl/lib
+
+(b) Convert the resulting file to stream_LF as follows:
+
+ $ run newffc
+
+ FFC> rpxl foo.pxl
+ FFC> wstr foo.pxl
+ FFC> exit
+ $
+
+(c) You can also check out your PXL file using newffc.
+
+ $ run newffc
+
+ FFC> rpxl foo.pxl
+ FFC> txplr nn
+ [types rasters corresponding to character code nn on terminal]
+
+
+10. NEWFFC COMMANDS
+
+ EXIT
+ The obvious (control-Z also works)
+
+ RPXL
+ Read a PXL file into memory. The code tries to
+ accomodate a wide range of VMS file formats.
+
+ TPXLR <code>
+ Type the rasters for character code <code> from
+ the PXL file currently in memory
+
+ PPXLR <code>
+ Plot the rasters for PXL character <code>
+ using the "sixel" protocol accepted by
+ VT125, VT240 and VT241 terminals
+
+ TPXLL <offset>
+ Type the longword at offset <offset> in the
+ PXL file currently in memory
+
+ SPXLL <offset> <value>
+ Set the longword at offset <offset> to value
+ <value> in the PXL file currently in memory.
+ <value> is read in HEXADECIMAL (this being
+ considered the most convenient...).
+
+ WSTR <filename>
+ Write the PXL file currently in memory onto
+ the file <filename>, in stream_LF format as
+ desired by the LN03 and LaserWriter support.
+
+ INITNFT <code1> <code2>
+ Initialize the in-memory buffer for LN03 font files
+ with information appropriate to an LN03 file
+ accomodating characters from <code1> to <code2>.
+ Note: the only truly legal values are 33 and 126.
+
+ CPTONFT <code1> <count1>
+ Copy characters from the PXL file in memory to
+ the LN03 file in memory, beginning at <code1>
+ in the PXL file and going up to <code2>. Characters
+ are put at the lowest available codes in the
+ LN03 file.
+
+ RNFT <file>
+ Read unsixelized LN03 format font file into buffer
+
+ WNFT <filename>
+ Write the LN03 font file in memory to a file
+ <filename>. The file written out is not sixelized.
+
+ TNFTR <code>
+ Type the rasters for LN03 character, specified
+ as a decimal ascii code
+
+ PNFTR <code>
+ Plot the rasters for LN03 character <code>
+ using the "sixel" protocol accepted by
+ VT125, VT240 and VT241 terminals
+
+ TNFTL <offset>
+ Type longword of LN03 file buffer at given
+ byte <offset>
+
+ SNFTL <offset> <value>
+ Set longword of LN03 file buffer at given
+ byte <offset> to stated <value> in hex.
+
+
+
+11. BUG REPORTS
+
+Please report any bugs you may find. You may phone (617)
+467-7545, send Arpanet mail to Rose%dvinci.dec@decwrl.arpa, or
+Usenet mail to ...!decwrl!dec-rhea!dec-dvinci!rose. The best way
+to report a bug is to mail the TeX file that evokes it together
+with a description of what is wrong with the printed output.
+
+If you should wish to port this software to operating systems
+other than VAX/VMS, please do not hesitate to contact me.
+
+
+12. UNIX
+
+The sources for dvi2ln3 and newffc may be recompiled under
+Unix on a VAX, and will probably run there. This has been
+tried and tested (to a limited extent) under Ultrix-32 and
+4.3bsd.
+
+When running under Unix, Dvi2ln3 expects three "environment
+variables" to be defined:
+
+ TEX_FONTS wherever the tfms are
+ TEX_LN03DIR wherever the LN03 format font files are
+ TEX_PXLDIR wherever the PXL format files are
+
+Define these with setenv.
+
+You may need to modify dvi2ln3 and newffc to run on your
+Unix system. In particular, if your Unix runs on a 68000 or
+PC RT or something like that, you may have to make serious
+modifications. Look in particular at all C "union"
+constructs in the source; the code that manipulates them may
+need to be redefined because of the machine architecture
+(this is necessary, e.g., on a 68000).
diff --git a/dviware/ln03/rose/ln03topp.pli b/dviware/ln03/rose/ln03topp.pli
new file mode 100644
index 0000000000..30ff2bf13d
--- /dev/null
+++ b/dviware/ln03/rose/ln03topp.pli
@@ -0,0 +1,1255 @@
+/*
+
+This program is LN03Topp, which converts the output of DVI2LNG to LN03
+format files. Copyright (c) 1984 by Digital Equipment Corporation. Author:
+Flavio Rose, UHCLEM::ROSE.
+
+This program is UNDER DEVELOPMENT...
+
+Development chronology:
+
+11/26/84: Started coding. Changed filenames.
+11/28/84: New algorithm for allocation of TeX fonts to LN03 font slots
+11/29/84: Extensive changes in TOPPNFT. NBLANKS reduced to 0, perhaps
+ temporarily, to simplify font stuff.
+11/30/84: Fixed opening escape sequences.
+5/6/85: Corrected bug in placement of comma "," inside font load
+5/18/85: Corrected longstanding bugs, which also existed in Topp:
+ xpos and ypos are initialized to 0 rather than to dxof,
+ dyof; and their are not reset on a NEWPAGE.
+
+
+*/
+
+%REPLACE false BY '0'B;
+%REPLACE true BY '1'B;
+
+ln03topp: PROCEDURE OPTIONS(MAIN);
+
+ DCL (strip,frontstrip) EXTERNAL ENTRY (CHAR (*))
+ RETURNS (CHAR (*)),
+ cvis EXTERNAL ENTRY (FIXED) RETURNS (CHAR (*));
+ DCL upcase EXTERNAL ENTRY (CHAR (*)) RETURNS (CHAR (*));
+ DCL add_txf_to_lnf EXTERNAL ENTRY(FIXED,FIXED,CHAR(*),FILE)
+ RETURNS(FIXED);
+
+/* Debugging info */
+
+ DCL debug FILE;
+ DCL debugwid FIXED;
+ DCL debugflag BIT;
+ debugflag = false;
+ debugwid = 0;
+
+/* input file, output file, include file */
+
+ DCL (outf,inf,incfile) FILE;
+ DCL (infnam,outfnam) CHAR(150) VARYING;
+ DCL reading_from_incfile BIT;
+ reading_from_incfile = false;
+
+ ON UNDEFINEDFILE (inf) BEGIN;
+ PUT SKIP LIST('No such file: ' || infnam);
+ GOTO terminal_eof;
+ END;
+
+ ON UNDEFINEDFILE (outf) BEGIN;
+ PUT SKIP LIST('Couldn''t open: ' || outfnam);
+ GOTO terminal_eof;
+ END;
+
+ ON ENDFILE (inf) BEGIN;
+ CLOSE FILE(inf);
+ GOTO end_of_input;
+ END;
+
+/* Define <esc> <tab> as constants. In general this source file should not
+contain any ascii control characters; instead we use byte(). */
+
+ DCL (esc,tab) CHAR(1);
+ esc = byte(27);
+ tab = byte(9);
+
+/* Banner string */
+
+ PUT SKIP LIST ('LN03Topp 2');
+
+/* Get input and output files from command line. */
+
+ %INCLUDE $stsdef;
+ DCL lib$get_foreign ENTRY (CHAR(*) VARYING, CHAR(*) VARYING,
+ FIXED(15),FIXED) OPTIONS(VARIABLE) RETURNS(FIXED);
+ DCL indir CHAR(150) VARYING;
+ DCL (jj,jnam,jext,dxof,dyof) FIXED;
+
+/* Unlike Topp, this driver conforms to the TeX requirement that drivers
+imaging onto 8 1/2 x 11 inch paper place the (0,0) point of the DVI file
+one inch horizontally and vertically offset from the upper left corner of
+the paper. Hence we initialize the following offset variables, which may be
+reset by command line options. */
+
+ dxof = 300;
+ dyof = 300;
+
+/* ilp = input line ptr, illen = input line length, incsave = place to save
+rest of line when {INCLUDE} is encountered. */
+
+ %REPLACE inbufsize BY 2048;
+ DCL inline CHAR(inbufsize) VARYING;
+ DCL incsave CHAR(inbufsize) VARYING;
+ DCL tch CHAR(1);
+ DCL (illen,ilp,i,istart,istart2,zch) FIXED;
+
+ sts$value = lib$get_foreign(inline,,,0);
+
+ IF ^sts$success THEN DO;
+ PUT SKIP EDIT ('Usage: ln03topp <filename> <options>') (A);
+ GOTO terminal_eof;
+ END;
+
+ inline = inline || ' ';
+ illen = length(inline);
+ ilp = 1;
+ CALL skipb;
+ IF ilp > illen THEN DO;
+ PUT SKIP EDIT ('Usage: ln03topp <filename> <options>') (A);
+ GOTO terminal_eof;
+ END;
+ istart = ilp;
+ CALL skipnb;
+ infnam = substr(inline,istart,ilp-istart);
+ OPEN FILE(inf) TITLE(infnam)
+ ENVIRONMENT(Default_file_name('FOO.LNG'));
+
+ jnam = istart;
+ DO jj = ilp-1 TO istart BY -1;
+ IF substr(inline,jj,1) = ':' |
+ substr(inline,jj,1) = ']' |
+ substr(inline,jj,1) = '>'
+ THEN DO;
+ jnam = jj+1;
+ GOTO found_jnam;
+ END;
+ END;
+
+found_jnam:
+
+/* We need to remember the directory of the input filespec, so that we can
+open {INCLUDE} files in the same directory. Thus, we stash that directory
+in INDIR. */
+
+ indir = substr(inline,istart,jnam-istart);
+ jext = ilp;
+ DO jj = jnam TO ilp-1;
+ IF substr(inline,jj,1) = '.' |
+ substr(inline,jj,1) = ';'
+ THEN DO;
+ jext = jj;
+ GOTO found_jext;
+ END;
+ END;
+
+found_jext:
+
+/* The output file is placed in the current default directory; i.e., we get
+rid of the directory part and just use the name part of the input filespec.
+*/
+
+ outfnam = substr(inline,jnam,jext-jnam) || '.LN3';
+
+ OPEN FILE(outf) OUTPUT TITLE(outfnam)
+ ENVIRONMENT(Default_file_name('FOO.LN3'));
+
+/* Read any options from the command line. There are two possible options,
+/H= and /V=, which serve to locate the (0,0) point of the DVI file on the
+paper. */
+
+ CALL skipb;
+ DO WHILE (ilp <= illen-2);
+ IF substr(inline,ilp,3) = '/H=' THEN DO;
+ ilp = ilp+3;
+ jj = -1;
+ CALL getfixnum(jj);
+ dxof = jj;
+ END; ELSE IF substr(inline,ilp,3) = '/V=' THEN DO;
+ jj = -1;
+ ilp = ilp+3;
+ CALL getfixnum(jj);
+ dyof = jj;
+ END; ELSE CALL skipnb;
+ CALL skipb;
+ END;
+
+/* Globals: there are many of these
+
+ font information */
+
+ %REPLACE maxnfonts BY 21; /* so I am told */
+ %REPLACE maxtexfonts BY 100;
+ %REPLACE maxfontnos BY 9;
+ %REPLACE nblanks BY 0;
+ DCL (curf,fsize,totsize,chunkcnt) FIXED;
+ DCL curtxf PTR;
+ DCL lastch(0:maxnfonts) FIXED GLOBALDEF;
+ DCL chw(0:maxnfonts,0:255) FIXED GLOBALDEF;
+ DCL ftime(0:maxnfonts) FIXED;
+
+ fsize = 0;
+ totsize = 0;
+ curf = 0;
+ curtxf = Null();
+ chw = 0;
+ ftime = 0;
+ chunkcnt = 0;
+
+/* An LN03 "font" actually consists of two LN03 font loads, one to be
+placed in character positions 33 to 126, the other in positions 161 to 254.
+There are no raster size limitations on LN03 fonts, other than those
+imposed by this program (those should eventually be removed). */
+
+ %REPLACE leftfirst BY 33;
+ %REPLACE rightfirst BY 161;
+ %REPLACE leftlast BY 126;
+ %REPLACE rightlast BY 254;
+
+/* TXF is a record structure describing a TeX font. TXFA is an array of TXF
+records. TXF2LNF describes the mapping between TeX fonts and LN03 "fonts".
+*/
+
+ DCL 1 txf BASED,
+ 2 nchs FIXED,
+ 2 chu(0:255) CHAR(1);
+ DCL txfa(0:maxtexfonts) PTR GLOBALDEF;
+ DCL txf2lnf(0:maxtexfonts) FIXED;
+
+ txfa = Null();
+ txf2lnf = -1;
+
+/* WHBLANKS identifies the locations of the fixed width blanks in the LN03
+fonts. FNAME is the font file ID of each LN03 font. For the moment,
+however, we do not use WHBLANKS. */
+
+/* DCL whblanks(0:maxnfonts,1:nblanks) FIXED GLOBALDEF; */
+ DCL fname(0:maxnfonts) CHAR(31) GLOBALDEF;
+
+/* whblanks = -1;*/
+ fname = 'U000000002SK00GG0001UZZZZ02F000';
+ DO i = 0 TO MIN(maxnfonts,9);
+ substr(fname(i),7,1) = cvis(i);
+ END;
+ DO i = 10 TO maxnfonts;
+ substr(fname(i),6,2) = cvis(i);
+ END;
+
+/* The LN03 select-graphic-rendition numbers 0-9 have to be allocated among
+the fonts. The USENO array keeps track of which number a font is allowed to
+use, -1 if none is currently allocated. The WHOUSES array says which font
+is using a number. */
+
+ DCL (useno(0:maxnfonts),whouses(0:maxfontnos)) FIXED;
+
+ useno = -1;
+ whouses = -1;
+
+/* The landscape bit is for future reference; currently LN03Topp does not
+support landscape printing */
+
+ DCL landscape BIT;
+
+ landscape = false;
+
+ DCL (maxrmar,maxbmar) FIXED;
+ maxrmar = 2550;
+ maxbmar = 3300;
+
+/* In the following, esc[?27h means "advance the carriage by the character
+width when you set a character", esc[11h and esc[7 I together mean to
+interpret all dimensions in escape sequences as pixel units; esc[?52h means
+our origin of coordinates is the upper left edge of the paper; esc[3300t
+means the "maximum length" of the paper is 3300 pixels. */
+
+ PUT EDIT (esc || 'c') (A) FILE(outf);
+ PUT EDIT (esc || '[?27h' || esc || '[11h' || esc || '[7 I'
+ || esc || '[?52h' || esc || '[3300t')
+ (A) FILE(outf);
+
+/* A count of pages is plotted out on the terminal to give users an
+indication of progress. */
+
+ DCL pageno FIXED;
+ pageno = 1;
+
+/* Current x and y positions: always in pixels. */
+
+ DCL (xpos,ypos) FIXED;
+ xpos = dxof;
+ ypos = dyof;
+
+/* User definable command area: This is left over from the LNF program
+whence Topp and then LN03Topp are derived. This stuff should be taken out.
+*/
+
+ %REPLACE udcsize BY 4096;
+ DCL 1 udcr BASED,
+ 2 (udcname,udcnamelen,udcvalue,udcvaluelen) FIXED,
+ 2 next PTR;
+ DCL udclist PTR;
+ DCL udcarea CHAR(udcsize);
+ DCL udcarray(udcsize) CHAR(1) BASED (addr(udcarea));
+ DCL udcaptr FIXED;
+
+ udclist = Null();
+ udcaptr = 1;
+ /* Predefine some commands */
+ IF define_command('LB','{CHAR123}') THEN;
+ IF define_command('RB','{CHAR125}') THEN;
+
+/* Page storage: we save up a page before outputting it to minimize the
+complexity of the page for the LN03. Since the capacity limitations of the
+LN03, unlike those of the LN01, are nowhere defined, it is unclear whether
+the transformations we perform are actually useful. */
+
+/* The page is stored as a set of characters in the PBUF, plus a collection
+of lists of "chunks". The lists are indexed by Y-position, using the array
+CHLS. Each chunk is a sequence of characters that can be written without
+backspacing or changing vertical position. */
+
+ %REPLACE pbufsize BY 65536;
+ DCL pbuf(0:pbufsize) CHAR(1);
+ DCL chls(0:3300) PTR; /* 3300 is maximum value of maxbmar */
+
+/* The CHUNK record keeps track of a chunk, giving the X position at which
+it starts and ends (XS, XE), the index of where its characters start and
+end in PBUF (IS, IE), plus the TeX font in which it is set (FS). */
+
+ DCL 1 chunk BASED,
+ 2 (xs,xe,is,ie,fs) FIXED,
+ 2 next PTR;
+
+/* Chunk records are allocated from a free list. PBUFI keeps track of how
+much of PBUF is being used. CHUNKMAX is a count of how many chunks are
+allocated (not used for anything). */
+
+ DCL (free_chunk_list,curchunk) PTR;
+ DCL (pbufi,chunkmax) FIXED;
+ DCL top_of_page BIT;
+
+ pbufi = 0;
+ chunkmax = 0;
+ free_chunk_list = Null();
+ chls = Null();
+ curchunk = Null();
+ top_of_page = false;
+
+/* This is the main loop: */
+
+ DO WHILE (true);
+ CALL read_inline;
+
+ illen = length(inline);
+ ilp = 1;
+ istart2 = 1;
+
+ DO WHILE (ilp <= illen);
+ tch = substr(inline,ilp,1);
+ IF tch = '{' THEN DO;
+ IF istart2 < ilp THEN CALL ord_text(substr(inline,
+ istart2,ilp-istart2));
+ CALL handle_command;
+ istart2 = ilp;
+ END; ELSE ilp = ilp+1;
+ END;
+ IF istart2 < ilp THEN CALL ord_text(substr(inline,istart2,ilp-
+ istart2));
+ END;
+
+end_of_input:
+ ;
+
+abort_job:
+ PUT EDIT (esc || 'c') (A) FILE(outf);
+ CLOSE FILE(outf);
+
+terminal_eof:
+ RETURN;
+
+/* Decipher command from inline and then execute it */
+
+ handle_command: PROCEDURE;
+ DCL (j,k,fno) FIXED;
+ DCL (command,name) CHAR(16) VARYING;
+
+ ON UNDEFINEDFILE (incfile) BEGIN;
+ PUT SKIP LIST('No such file:' || substr(inline,istart,
+ ilp-istart));
+ GOTO windup_command;
+ END;
+
+ istart = ilp+1;
+ ilp = istart;
+ DO WHILE ('A' <= substr(inline,ilp,1) &
+ substr(inline,ilp,1) <= 'Z');
+ ilp = ilp+1;
+ END;
+ command = substr(inline,istart,ilp-istart);
+ IF command = 'HPA' | command = 'X' THEN DO;
+ k = -1;
+ CALL getfixnum(k);
+ k = k+dxof;
+ xpos = k;
+ END; ELSE IF command = 'VPA' THEN DO;
+ j = 0;
+ CALL getfixnum(j);
+ j = j+dyof;
+ CALL finish_chunk;
+ ypos = j;
+ END; ELSE IF command = 'NOFILL' THEN;
+ /* ignore, always in nofill mode */
+ ELSE IF command = 'DEBUG' THEN debugflag = true;
+ ELSE IF command = 'WLN' THEN CALL process_wln;
+ ELSE IF command = 'NODEBUG' THEN debugflag = false;
+ ELSE IF command = '' THEN DO;
+ CALL findcb2;
+ ilp = ilp+1;
+ END; ELSE IF command = 'NEWPAGE' THEN DO;
+ CALL finish_chunk;
+ CALL finish_page;
+ xpos = dxof;
+ ypos = dyof;
+ END; ELSE IF command = 'FO' THEN DO;
+ CALL getfixnum(fno);
+ IF fno < 0 | fno > maxtexfonts THEN CALL error1
+ ('Bad font number ' || cvis(fno) || ' in FO command.');
+ IF txfa(fno) = Null() THEN CALL error1
+ ('Font number ' || cvis(fno) || ' not present.');
+ CALL finish_chunk;
+ curf = fno;
+ curtxf = txfa(fno);
+ END; ELSE IF command = 'INCLUDE' THEN DO;
+ IF reading_from_incfile THEN CALL
+ error1('{INCLUDE}s can''t be nested.');
+ CALL skipb;
+ istart = ilp;
+ CALL skipnb2;
+ OPEN FILE (incfile) TITLE (substr(inline,istart,ilp-istart))
+ ENVIRONMENT(Default_file_name(indir || 'FOO.LNG'));
+ reading_from_incfile = true;
+ CALL findcb;
+ ilp = ilp+1;
+ IF rest_of_inline_blank() THEN incsave = '';
+ ELSE incsave = substr(inline,ilp,illen-ilp);
+ ilp = illen+1;
+ END; ELSE IF command = 'LMAR' | command = 'RMAR' |
+ command = 'TMAR' | command = 'BMAR' THEN;
+ ELSE IF command = 'RULEA' THEN DO;
+ DCL (x0,y0,x1,y1,temp) FIXED;
+
+ CALL getfixnum(x0);
+ CALL getfixnum(y0);
+ CALL getfixnum(x1);
+ CALL getfixnum(y1);
+ x0 = min(x0+dxof,maxrmar);
+ x1 = min(x1+dxof,maxrmar);
+ x0 = max(x0,0);
+ x1 = max(x1,0);
+ y0 = min(y0+dyof,maxbmar);
+ y1 = min(y1+dyof,maxbmar);
+ y0 = max(y0,0);
+ y1 = max(y1,0);
+ IF x0 > x1 THEN DO; temp = x0; x0 = x1; x1 = temp; END;
+ IF y0 > y1 THEN DO; temp = y0; y0 = y1; y1 = temp; END;
+
+ IF top_of_page THEN DO;
+ top_of_page = false;
+ PUT EDIT (byte(12)) (A) FILE(outf);
+ END;
+
+/* All rules are put at the beginning of the page, a separate line for each
+one. A vertical positioning command is necessary because otherwise the LN03
+would keep on advancing the vertical position as more rules are set, in
+response to the end of line carriage returns. */
+
+ IF y1 ^= y0 & x1 ^= x0 THEN DO;
+ IF landscape
+ THEN PUT SKIP EDIT (esc || '[100d' ||
+ esc || '[0;' || cvis(y0) || ';' ||
+ cvis(x0) || ';' || cvis(y1-y0) || ';' ||
+ cvis(x1-x0) || '!|') (A) FILE(outf);
+ ELSE PUT SKIP EDIT (esc || '[100d' ||
+ esc || '[1;' || cvis(x0) || ';' ||
+ cvis(y0) || ';' || cvis(y1-y0) || ';' ||
+ cvis(x1-x0) || '!|') (A) FILE(outf);
+ END;
+
+ END; ELSE IF command = 'CHAR' THEN DO;
+ j = 0;
+ CALL getfixnum(j);
+ CALL ord_text(byte(j));
+ END; ELSE IF command = 'CU' THEN DO;
+ CALL getfixnum(fno);
+ IF fno < 0 | fno > maxtexfonts THEN CALL error1
+ ('Bad font number ' || cvis(fno) || ' in CU command.');
+ CALL skipb;
+ IF txfa(fno) = Null() THEN
+ ALLOCATE txf SET (txfa(fno));
+ txfa(fno) -> chu = byte(0);
+ j = 0;
+ k = 0;
+ DO WHILE (substr(inline,ilp,1) ^= '}' & substr(inline,ilp,1)
+ ^= ' ');
+ IF substr(inline,ilp,1) = '1' THEN DO;
+ txfa(fno) -> chu(j) = byte(1);
+ k = k+1;
+ END;
+ j = j+1;
+ ilp = ilp+1;
+ END;
+ txfa(fno) -> txf.nchs = k;
+
+ END; ELSE IF command = 'DEF' THEN DO;
+ /* Definition of a user defined command : very delicate */
+
+ CALL skipb;
+ IF ilp > illen THEN CALL error1('DEF has no parameters.');
+ IF substr(inline,ilp,1) ^= '{' THEN DO;
+ CALL findcb2;
+ CALL error1('DEF syntax is {DEF{command}value}.');
+ END;
+ ilp = ilp+1;
+ istart = ilp;
+ DO WHILE ('A' <= substr(inline,ilp,1) & substr(inline,ilp,1)
+ <= 'Z');
+ ilp = ilp+1;
+ END;
+ IF substr(inline,ilp,1) ^= '}' THEN DO;
+ CALL findcb;
+ ilp = ilp+1;
+ CALL findcb2;
+ CALL error1('DEF syntax is {DEF{command}value}.');
+ END;
+ IF ilp = istart | ilp-istart > 16 THEN CALL error1
+ ('DEF ignored, new command name blank or too long.');
+ k = ilp;
+ ilp = ilp+1;
+ CALL findcb2;
+ IF ^define_command(substr(inline,istart,k-istart),
+ substr(inline,k+1,ilp-k-1))
+ THEN CALL bad_error('User command area exhausted.');
+ END; ELSE IF command ^= '' THEN DO;
+ DCL p PTR;
+
+ DO p = udclist REPEAT p -> udcr.next WHILE (p ^= Null());
+ IF command = substr(udcarea,p -> udcname,p -> udcnamelen)
+ THEN DO;
+ CALL findcb;
+ ilp = ilp+1;
+ IF p -> udcvaluelen + illen-ilp+1 > inbufsize THEN
+ CALL error1 ('Input buffer size exceeded, ' ||
+ 'user command ' || command || ' ignored.');
+ /* Put Udc in stream to be executed */
+ inline = substr(udcarea,p -> udcvalue,
+ p -> udcvaluelen) || substr(inline,ilp,
+ illen-ilp+1);
+ illen = length(inline);
+ ilp = 1;
+ RETURN;
+ END;
+ END;
+ CALL error1 ('No such command: ' || command);
+ END;
+
+ windup_command:
+ CALL findcb;
+ ilp = ilp+1;
+ RETURN;
+
+ findcb2: PROCEDURE;
+ DCL cbc FIXED;
+
+ cbc = 0;
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) = '{' THEN cbc = cbc+1;
+ ELSE IF substr(inline,ilp,1) = '}' THEN cbc = cbc-1;
+ IF cbc < 0 THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END findcb2;
+
+ error1: PROCEDURE(str);
+ DCL str CHAR(*);
+
+ PUT SKIP EDIT (str) (A);
+ GOTO windup_command;
+
+ END error1;
+
+ bad_error: PROCEDURE(str);
+ DCL str CHAR(*);
+
+ PUT SKIP EDIT (str) (A);
+ GOTO abort_job;
+
+ END bad_error;
+
+ END handle_command;
+
+
+ finish_chunk: PROCEDURE;
+
+ curchunk = Null();
+
+ END finish_chunk;
+
+/* skip over blanks in inline */
+
+ skipb: PROCEDURE;
+
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) ^= ' ' THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END skipb;
+
+/* skip over characters other than ' ' and '}'. */
+
+ skipnb2: PROCEDURE;
+
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) = ' '
+ | substr(inline,ilp,1) = '}' THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END skipnb2;
+
+ skipnb: PROCEDURE;
+
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) = ' ' THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END skipnb;
+
+/* Read a fixnum from inline and put it in x. If can't find one then x is
+left unchanged. */
+
+ getfixnum: PROCEDURE (x);
+ DCL (x,x1) FIXED;
+ DCL negative BIT;
+
+ negative = false;
+ IF ilp > illen THEN RETURN;
+ CALL skipb;
+ IF substr(inline,ilp,1) = '-' THEN DO;
+ negative = true;
+ ilp = ilp+1;
+ END;
+
+ IF ilp > illen | substr(inline,ilp,1) < '0'
+ | substr(inline,ilp,1) > '9'
+ THEN RETURN;
+
+ x1 = 0;
+ DO WHILE(substr(inline,ilp,1) >= '0' &
+ substr(inline,ilp,1) <= '9'); /* cheat */
+ x1 = 10*x1 + RANK(substr(inline,ilp,1)) - RANK('0');
+ ilp = ilp+1;
+ IF ilp > illen THEN GOTO gotnum;
+ END;
+
+ gotnum:
+ x = x1;
+ IF negative THEN x = -x;
+ RETURN;
+
+ END getfixnum;
+
+/* find close bracket } */
+
+ findcb: PROCEDURE;
+
+ IF ilp >= illen THEN RETURN;
+ DO WHILE (ilp < illen & substr(inline,ilp,1) ^= '}');
+ ilp = ilp+1;
+ END;
+
+ END findcb;
+
+/* determine if rest of inline is blank */
+
+ rest_of_inline_blank: PROCEDURE RETURNS (BIT);
+ DCL j FIXED;
+
+ IF ilp > illen THEN RETURN (true);
+ j = ilp;
+ DO WHILE (j <= illen);
+ IF (substr(inline,j,1) ^= ' '
+ & substr(inline,j,1) ^= tab) THEN RETURN(false);
+ j = j+1;
+ END;
+ RETURN(true);
+
+ END rest_of_inline_blank;
+
+/* The following procedure is still called 'process_wln', even though the
+file extensions now default to '.nft' rather than '.tln'. Magnified font
+extensions still have to be numeric... */
+
+ process_wln: PROCEDURE;
+ DCL (j,k,l,fno,maxfno,chsize) FIXED;
+ DCL font_selected BIT;
+ DCL (txfns(0:maxtexfonts),txfne(0:maxtexfonts)) FIXED;
+
+/* Destroy all traces of preceding fonts */
+
+ totsize = 0;
+ chsize = 0;
+/* whblanks = -1;*/
+ useno = -1;
+ whouses = -1;
+ txfns = -1;
+ txfne = -1;
+ maxfno = 0;
+ PUT SKIP EDIT(esc || 'P0;1;1y') (A) FILE(outf);
+
+/* Read the font names and numbers from inline. Because LN03 fontnames can
+be very long, this will probably have to be changed to read from more than
+one line. For 100 fonts, 2048 characters in the line is not enough. */
+
+ CALL skipb;
+
+ DO WHILE (substr(inline,ilp,1) ^= '}' & ilp < illen);
+ istart = ilp;
+ CALL skipnb2;
+ j = ilp;
+ fno = 0;
+ CALL getfixnum(fno);
+ IF fno < 0 | fno > maxtexfonts THEN DO;
+ PUT SKIP EDIT ('Bad font no.: ' || cvis(fno)) (A);
+ GOTO abort_job;
+ END;
+ txfns(fno) = istart;
+ txfne(fno) = j;
+ IF fno > maxfno THEN maxfno = fno;
+ IF txfa(fno) = Null() THEN DO;
+ ALLOCATE txf SET(txfa(fno));
+ DO k = 0 TO 127;
+ txfa(fno) -> chu(k) = byte(1);
+ END;
+ DO k = 128 TO 255;
+ txfa(fno) -> chu(k) = byte(0);
+ END;
+
+/* The default assumption, if the input contains no CU command for a given
+font, is that only characters 0-127 are used. For efficiency's sake this is
+not actually checked as the characters are read in and translated. */
+
+ txfa(fno) -> nchs = 128;
+ END;
+ IF txfa(fno) -> nchs > 182 THEN GOTO need_empty_slots;
+ chsize = chsize + txfa(fno) -> nchs;
+ CALL skipb;
+ END;
+
+/* Now we have to allocate TeX fonts (TXFs) to LN03 fonts (LNFs) and
+perform the actual load. The goal is to use as few slots as possible, where
+an LNF with <= 94 characters is one slot, and an LNF with > 94 but <= 188
+characters is two slots.
+
+As in the LN01 case, the allocation problem seems to be some sort of hard
+bin packing problem. (Proof of NP-hardness, anyone?) So we use a best fit
+heuristic:
+
+1. Find the unassigned largest TXF. If none, exit.
+
+2. Allocate an LNF for it.
+
+3. Find the largest TXF that fits in what is left of that LNF.
+
+ 3.1. If none exists, go to 1.
+ 3.2. If one exists, put it in the LNF and go back to 3.
+
+The TXFORD array will contain the TXF numbers in the order that they are
+assigned. TXFCNT keeps track of how many TXFs have been assigned so far. */
+
+ DCL (lnfcnt,txfcnt,the_txf,txf_size,lnfleft) FIXED;
+ DCL txford(0:maxtexfonts) FIXED;
+
+ lnfcnt = 0;
+ txfcnt = 0;
+ txford = -1;
+
+
+
+ DO WHILE (true);
+
+/* Find largest unassigned TXF */
+
+ lnfleft = rightlast-rightfirst+1+leftlast-leftfirst+1-nblanks;
+ txf_size = -1;
+ DO j = 0 TO maxtexfonts;
+ IF txfa(j) ^= Null() & txf2lnf(j) = -1
+ & txfa(j) -> nchs > txf_size THEN DO;
+ txf_size = txfa(j) -> nchs;
+ the_txf = j;
+ END;
+ END;
+ IF txf_size <= 0 THEN GOTO assignment_done;
+ IF lnfcnt > maxnfonts THEN GOTO too_complex;
+ IF txf_size > lnfleft THEN GOTO need_empty_slots;
+
+/* Now allocate new LNF and put TXF in it */
+
+ txf2lnf(the_txf) = lnfcnt;
+ txford(txfcnt) = the_txf;
+ txfcnt = txfcnt+1;
+ k = leftfirst-1;
+ DO j = 0 TO 255;
+ IF txfa(the_txf) -> chu(j) ^= byte(0) THEN DO;
+ k = k+1;
+ IF k = leftlast+1 THEN k = rightfirst;
+ lnfleft = lnfleft-1;
+ txfa(the_txf) -> chu(j) = byte(k);
+ END;
+ END;
+ lastch(lnfcnt) = k;
+
+/* Now try to fill the remaining part of the LNF using other TeX fonts */
+
+ DO WHILE (true);
+
+ txf_size = -1;
+ DO j = 0 TO maxtexfonts;
+ IF txfa(j) ^= Null() & txf2lnf(j) = -1
+ & txfa(j) -> nchs > txf_size
+ & txfa(j) -> nchs <= lnfleft THEN DO;
+ txf_size = txfa(j) -> nchs;
+ the_txf = j;
+ END;
+ END;
+ IF txf_size <= 0 THEN GOTO current_lnf_exhausted;
+
+ txf2lnf(the_txf) = lnfcnt;
+ txford(txfcnt) = the_txf;
+ txfcnt = txfcnt+1;
+ k = lastch(lnfcnt);
+ DO j = 0 TO 255;
+ IF txfa(the_txf) -> chu(j) ^= byte(0) THEN DO;
+ k = k+1;
+ lnfleft = lnfleft-1;
+ IF k = leftlast+1 THEN k = rightfirst;
+ txfa(the_txf) -> chu(j) = byte(k);
+ END;
+ END;
+ lastch(lnfcnt) = k;
+ END;
+
+ current_lnf_exhausted:
+ lnfcnt = lnfcnt+1;
+ END;
+
+assignment_done:
+
+/* At this point the array TXF2LNF is properly initialized, as are LASTCH
+and TXFORD. It remains to actually generate the desired font load. This has
+to be done carefully, since characters may only be added to an LNF in
+ascending order. */
+
+ DO j = 0 TO txfcnt-1;
+ k = txford(j);
+ IF j ^= 0 & txf2lnf(k) ^= txf2lnf(txford(j-1)) THEN PUT SKIP
+ EDIT (',') (A) FILE(outf);
+ totsize = totsize+add_txf_to_lnf(txf2lnf(k),k,
+ substr(inline,txfns(k),
+ txfne(k)-txfns(k)),outf);
+ END;
+
+/* At this point we need to write a message saying how long the font load
+is overall. That comes from TOTSIZE plus an overhead factor that depends on
+how many LNFs there are and whether any of them don't use the right half of
+the code chart. */
+
+ PUT SKIP EDIT (';LN03Topp 2 font load' || esc || '\') (A) FILE(outf);
+ IF landscape THEN DO;
+ maxrmar = 3300;
+ maxbmar = 2550;
+/* PUT EDIT(esc || 'c') (A) FILE(outf);*/
+ PUT EDIT (esc || '[1;3300s' || esc || '[2550t' ||
+ esc || '[1;2550r')
+ (A) FILE(outf);
+ END; ELSE DO;
+ maxbmar = 3300;
+ maxrmar = 2550;
+/* PUT EDIT(esc || 'c') (A) FILE(outf);*/
+ PUT EDIT(esc || '[1;2550s' || esc || '[3300t' ||
+ esc || '[1;3300r')
+ (A) FILE(outf);
+ END;
+ font_selected = false;
+ DO j = 0 TO MIN(maxfontnos,lnfcnt-1);
+ useno(j) = j;
+ whouses(j) = j;
+ PUT EDIT
+ (esc || 'P1;1' || cvis(j) || '}' ||
+ substr(fname(j),1,16) || esc || '\') (A)
+ FILE(outf);
+ IF ^font_selected THEN DO;
+ PUT EDIT (esc || '[1' || cvis(j) || 'm') (A)
+ FILE(outf);
+ font_selected = true;
+ END;
+ END;
+
+ RETURN;
+
+ too_complex:
+ PUT SKIP EDIT ('Can''t construct usable font load: input ' ||
+ 'too complex') (A);
+ GOTO abort_job;
+
+ need_empty_slots:
+ PUT SKIP EDIT ('Font ' || cvis(fno) || ' uses >182 characters.'
+ || ' LN03Topp can''t handle that.') (A);
+ GOTO abort_job;
+
+ rasters_too_large:
+ PUT SKIP EDIT ('The required rasters from font ' || cvis(fno) ||
+ ' are too large for this preliminary LN03Topp to handle.') (A);
+ GOTO abort_job;
+
+ END process_wln;
+
+ /* insert ordinary text into page */
+ ord_text: PROCEDURE (c);
+ DCL c CHAR(*);
+ DCL (c1,c2) CHAR(1);
+ DCL (t,j,zch) FIXED;
+
+ t = length(c);
+ IF t = 0 THEN RETURN;
+ IF xpos < 0 | xpos > maxrmar | ypos < 0 | ypos > 3300 THEN DO;
+ PUT SKIP EDIT ('"') (A);
+ DO j = 1 TO t;
+ IF substr(c,j,1) >= ' ' THEN PUT EDIT
+ (substr(c,j,1)) (A);
+ ELSE PUT EDIT ('.') (A);
+ END;
+ PUT EDIT ('" set off paper ') (A);
+ IF xpos < 0 | xpos > maxrmar THEN PUT EDIT ('(X = ' || cvis(xpos)
+ || ') ') (A);
+ IF ypos < 0 | ypos > 3300 THEN PUT EDIT ('(Y = ' || cvis(ypos)
+ || ') ') (A);
+ IF xpos < 0 THEN xpos = 0; ELSE xpos = maxrmar;
+ IF ypos < 0 THEN ypos = 0; ELSE ypos = 3300;
+ END;
+ IF curchunk = Null() THEN DO;
+ CALL new_chunk;
+ curchunk -> chunk.xs = xpos;
+ curchunk -> chunk.xe = xpos;
+ curchunk -> chunk.is = pbufi;
+ END;
+ IF xpos < curchunk -> chunk.xe THEN DO;
+ CALL finish_chunk;
+ CALL new_chunk;
+ curchunk -> chunk.xs = xpos;
+ curchunk -> chunk.is = pbufi;
+ END; ELSE IF xpos > curchunk -> chunk.xe
+ THEN CALL move_forward(xpos-curchunk -> chunk.xe);
+ IF pbufi+t >= pbufsize THEN DO;
+ PUT SKIP EDIT('Topp capacity exceeded: ' ||
+ 'too much stuff on one page.') (A);
+ GOTO abort_job;
+ END;
+ DO j = 1 TO t;
+ c2 = substr(c,j,1);
+ zch = rank(c2);
+ c1 = curtxf -> chu(zch);
+ zch = rank(c1);
+ pbuf(pbufi+j-1) = c1;
+ xpos = xpos+chw(txf2lnf(curf),zch);
+ END;
+ pbufi = pbufi+t;
+ curchunk -> chunk.xe = xpos;
+ curchunk -> chunk.ie = pbufi;
+
+ END ord_text;
+
+ finish_page: PROCEDURE;
+ %REPLACE maxprch BY 175;
+ %REPLACE maxtotch BY 200;
+ DCL (i,j,xmax,xleft,nprch,ntotch) FIXED;
+ DCL (pt,pt2,pt3,pt4,obufp,lis) PTR;
+ DCL obuf CHAR(400) BASED (obufp);
+ DCL found BIT;
+
+ PUT EDIT ('[' || cvis(pageno) || '] ') (A);
+ IF top_of_page THEN DO;
+ top_of_page = false;
+ PUT EDIT(byte(12)) (A) FILE(outf);
+ END;
+
+ /* Now we have to write out all the chunks */
+ /* For now we will write them in a simple fashion */
+ DO i = 0 TO 3300;
+ IF chls(i) ^= Null() THEN DO;
+ /* MXO stuff has been omitted here */
+ lis = Null();
+ DO WHILE (chls(i) ^= Null());
+ xleft = 1000000000; /* a very high value */
+ /* Make LIS be a list of nonoverlapping chunks */
+ DO WHILE (true);
+ pt2 = Null();
+ pt3 = Null();
+ xmax = -1;
+ DO pt = chls(i) REPEAT pt -> chunk.next
+ WHILE (pt ^= Null());
+ IF pt -> chunk.xe > xmax
+ & pt -> chunk.xe <= xleft THEN DO;
+ xmax = pt -> chunk.xe;
+ pt3 = pt;
+ pt4 = pt2;
+ END;
+ pt2 = pt;
+ END;
+ IF pt3 = Null() THEN GOTO print_lis;
+ IF pt4 = Null() THEN chls(i) = chls(i) -> chunk.next;
+ ELSE pt4 -> chunk.next = pt4 -> chunk.next
+ -> chunk.next;
+ pt3 -> chunk.next = lis;
+ lis = pt3;
+ xleft = pt3 -> chunk.xs;
+ END;
+ print_lis:
+ IF lis = Null() THEN GOTO next_i;
+ DO WHILE (lis ^= Null());
+ /* Print as many chunks from LIS as will fit
+ on one line; split last chunk if necessary */
+ nprch = 0;
+ ntotch = 0;
+ PUT SKIP FILE(outf);
+ CALL escape_seq_outf(esc || '[' || cvis(i) || 'd');
+ pt = lis;
+ pt2 = Null();
+ DO WHILE (pt ^= Null());
+ pt3 = pt;
+ CALL print_pt;
+ IF pt ^= Null() THEN GOTO finished_lis;
+ pt = pt3 -> chunk.next;
+ pt2 = pt3;
+ END;
+ finished_lis:
+ IF pt2 ^= Null() THEN DO;
+ pt2 -> chunk.next = free_chunk_list;
+ free_chunk_list = lis;
+ lis = pt;
+ END;
+ END;
+ END;
+ END;
+ next_i:
+ END;
+ pbufi = 0;
+ PUT EDIT (byte(10)) (A) FILE(outf);
+ top_of_page = true;
+ pageno = pageno+1;
+
+ move_forward_outf: PROCEDURE (dist,font);
+ DCL (dist,font) FIXED;
+ DCL sdist CHAR(12) VARYING;
+
+ sdist = cvis(dist);
+ CALL escape_seq_outf(esc || '[' || sdist || 'a');
+ ntotch = ntotch+3+length(sdist);
+
+ END move_forward_outf;
+
+ escape_seq_outf: PROCEDURE (c);
+ DCL c CHAR(*);
+ DCL t FIXED;
+
+ t = length(c);
+ ntotch = ntotch+t;
+ PUT EDIT (c) (A) FILE(outf);
+
+ END escape_seq_outf;
+
+ print_pt: PROCEDURE;
+
+ DCL (chunklen,escix,uselen,base,i,j,k,font) FIXED;
+
+ /* This procedure prints as much of pt as there
+ is room left on the line for and deletes that
+ piece of pt */
+
+ base = pt -> chunk.is;
+ chunklen = pt -> chunk.ie - pt -> chunk.is;
+ uselen = min(chunklen,maxtotch-ntotch);
+ uselen = min(uselen,maxprch-nprch);
+
+ IF uselen < 1 THEN RETURN; /* shouldn't be, but... */
+
+
+/* We must ensure that PT is not split in the middle of an escape
+sequence */
+
+ IF uselen ^= chunklen THEN DO;
+ escix = -1;
+ DO i = 0 TO uselen-1;
+ IF pbuf(pt -> chunk.is+i) = esc THEN
+ escix = i;
+ END;
+ IF escix ^= -1 & uselen-escix <= 8 THEN DO;
+ DO i = escix TO uselen-1;
+ IF pbuf(pt -> chunk.is+i) = 'a' THEN
+ GOTO no_problem;
+ END;
+ uselen = escix;
+ END;
+ END;
+ no_problem:
+
+ font = txf2lnf(pt -> chunk.fs);
+ IF useno(font) = -1 THEN DO;
+ useno(whouses(maxfontnos)) = -1;
+ useno(font) = maxfontnos;
+ whouses(maxfontnos) = font;
+ CALL escape_seq_outf(esc ||
+ 'P1;1' || cvis(maxfontnos) || '}' ||
+ substr(fname(font),1,16) || esc || '\');
+ END;
+
+ CALL escape_seq_outf(esc || '[1' ||
+ cvis(useno(font)) || 'm');
+ IF pt = lis THEN CALL escape_seq_outf(esc || '['
+ || cvis(pt -> chunk.xs) || '`');
+ ELSE DO;
+ j = pt -> chunk.xs - pt2 -> chunk.xe;
+ IF j ^= 0 THEN CALL move_forward_outf(j,
+ font);
+ END;
+ obufp = addr(pbuf(pt -> chunk.is));
+ PUT EDIT (substr(obuf,1,uselen)) (A) FILE(outf);
+ nprch = nprch+uselen;
+ ntotch = ntotch+uselen;
+ IF uselen = chunklen THEN pt = Null();
+ ELSE DO;
+ k = base;
+ DO WHILE (k <= base+uselen-1);
+ IF pbuf(k) ^= esc THEN pt -> chunk.xs = pt ->
+ chunk.xs+chw(font,rank(pbuf(k)));
+ ELSE DO;
+ i = 0;
+ k = k+2;
+ DO WHILE (pbuf(k) ^= 'a');
+ i = i*10 + rank(pbuf(k))-rank('0');
+ k = k+1;
+ IF k > base+uselen-1 THEN PUT SKIP
+ EDIT ('Topp internal error.') (A);
+ END;
+ pt -> chunk.xs = pt -> chunk.xs+i;
+ END;
+ k = k+1;
+ END;
+ pt -> chunk.is = pt -> chunk.is+uselen;
+ END;
+
+ END print_pt;
+
+ END finish_page;
+
+ define_command: PROCEDURE(name,value) RETURNS(BIT);
+ DCL (name,value) CHAR(*);
+ DCL p PTR;
+ DCL (nl,vl) FIXED;
+
+ nl = length(name);
+ vl = length(value);
+ IF udcaptr+nl+vl > udcsize THEN RETURN(false);
+ DO p = udclist REPEAT p -> udcr.next WHILE (p ^= Null());
+ IF name = substr(udcarea,p -> udcname,p -> udcnamelen)
+ THEN GOTO found;
+ END;
+ ALLOCATE udcr SET (p);
+ p -> udcr.next = udclist;
+ udclist = p;
+ p -> udcname = udcaptr;
+ udcaptr = udcaptr+nl;
+ p -> udcnamelen = nl;
+ substr(udcarea,p -> udcname,p -> udcnamelen) = name;
+ p -> udcvaluelen = 0;
+ p -> udcvalue = udcaptr;
+ found:
+ IF vl = 0 THEN RETURN(true);
+ /* IF possible fit command in existing area */
+ IF vl >= p -> udcvaluelen
+ THEN DO;
+ p -> udcvalue = udcaptr;
+ udcaptr = udcaptr+vl;
+ END;
+ p -> udcvaluelen = vl;
+ substr(udcarea,p -> udcvalue,p -> udcvaluelen) = value;
+ RETURN(true);
+
+ END define_command;
+
+ read_inline: PROCEDURE;
+
+ ON ENDFILE (incfile) BEGIN;
+ CLOSE FILE (incfile);
+ reading_from_incfile = false;
+ IF incsave = '' THEN GOTO once_again;
+ ELSE DO;
+ inline = incsave;
+ GOTO return_label;
+ END;
+ END;
+
+ once_again:
+ IF reading_from_incfile THEN GET EDIT (inline) (A(511))
+ FILE(incfile);
+ ELSE GET EDIT (inline) (A(511)) FILE(inf);
+
+ return_label:
+ RETURN;
+
+ END read_inline;
+
+ move_forward: PROCEDURE (dist);
+ DCL (dist,i) FIXED;
+ DCL sdist CHAR(12) VARYING;
+
+ sdist = esc || '[' || cvis(dist) || 'a';
+
+ IF pbufi+length(sdist) >= pbufsize THEN DO;
+ PUT SKIP EDIT('LN03Topp capacity exceeded: ' ||
+ 'too much stuff on one page.') (A);
+ GOTO abort_job;
+ END;
+ DO i = 1 TO length(sdist);
+ pbuf(pbufi+i-1) = substr(sdist,i,1);
+ END;
+ pbufi = pbufi+length(sdist);
+
+ END move_forward;
+
+ new_chunk: PROCEDURE;
+
+ IF free_chunk_list = Null() THEN DO;
+ ALLOCATE chunk SET (curchunk);
+ chunkmax = chunkmax+1;
+ END; ELSE DO;
+ curchunk = free_chunk_list;
+ free_chunk_list = free_chunk_list -> chunk.next;
+ END;
+ curchunk -> chunk.fs = curf;
+ curchunk -> chunk.next = chls(ypos);
+ chls(ypos) = curchunk;
+ chunkcnt = chunkcnt+1;
+ ftime(txf2lnf(curf)) = chunkcnt;
+
+ END new_chunk;
+
+END ln03topp;
diff --git a/dviware/ln03/rose/lnfinc.pli b/dviware/ln03/rose/lnfinc.pli
new file mode 100644
index 0000000000..c8cafe8ff6
--- /dev/null
+++ b/dviware/ln03/rose/lnfinc.pli
@@ -0,0 +1,35 @@
+cvis: PROCEDURE (i) RETURNS (CHAR (*));
+ DCL i FIXED;
+
+ RETURN (frontstrip(CHAR (i)));
+END cvis;
+
+strip: PROCEDURE (t) RETURNS (CHAR (*));
+ DCL i FIXED,
+ t CHAR (*);
+
+ DO i = Length (t) TO 1 BY -1;
+ IF substr (t,i,1) ^= ' '
+ THEN RETURN (substr (t,1,i));
+ END;
+ RETURN ('');
+END strip;
+
+frontstrip: PROCEDURE (t) RETURNS (CHAR (*));
+ DCL i FIXED,
+ t CHAR (*);
+
+ DO i = 1 TO Length (t);
+ IF substr (t,i,1) ^= ' '
+ THEN RETURN (substr (t,i));
+ END;
+ RETURN ('');
+END frontstrip;
+
+upcase: PROCEDURE (text) RETURNS (CHAR (*));
+ DCL text CHAR (*);
+
+ RETURN (translate (text,
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'abcdefghijklmnopqrstuvwxyz'));
+END upcase;
diff --git a/dviware/ln03/rose/newffc.c b/dviware/ln03/rose/newffc.c
new file mode 100644
index 0000000000..3e748ebec3
--- /dev/null
+++ b/dviware/ln03/rose/newffc.c
@@ -0,0 +1,1293 @@
+/* This program is the second version of FFC, a font file converter. It
+performs certain auxiliary file management functions related to the DVI to
+LN03 translator.
+
+Copyright (c) 1984, 1985, 1986 by Digital Equipment Corporation, Maynard,
+Massachusetts. Author: Flavio Rose, ...!decwrl!dec-rhea!dec-dvinci!rose.
+
+This program is being developed. It is quite incomplete.
+
+3/7/86 Add hack in handle_rpxl to read rms files.
+ Version 5.
+
+3/14/86 Additional fixes: tnftl, snftl, tnftr, rnft. Version 6.
+
+3/19/86 ppxlr, pnftr. Version 7.
+
+4/1/86 Fixed bug in snftl -- was writing the bytes
+ in reverse into the nft buffer. Version 8.
+
+*/
+
+#ifdef vms
+#include stdio
+#include ctype
+#include fab
+#include rmsdef
+#else
+#include <stdio.h>
+#include <ctype.h>
+#endif
+
+/* In VMS we declare external variables to be globalref.
+This is not really necessary, just an old habit. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+/* User typein is read into an array called inline. The pointers istart and
+ilp are used to keep track of a position in inline. */
+
+GLOBAL char inline[513];
+GLOBAL int ilp,istart;
+GLOBAL char *help_string =
+"\n Available commands:\
+\n exit\
+\n rpxl tpxlr tpxll spxll wstr ppxlr\
+\n rnft tnftr tnftl snftl wnft pnftr\
+\n initnft cptonft";
+
+#define skipb for(; inline[ilp]==' '; ilp++);
+#define skipnb for(; inline[ilp]!='\0' && inline[ilp]!=' '; ilp++);
+
+/* The main program of FFC is an interactive loop that receives commands
+from the user's terminal and writes replies. */
+
+main() {
+
+ printf("\n Font File Converter 8\n");
+
+ for(;;) {
+ printf("\nFFC> ");
+ gets(inline);
+ if (feof(stdin)) goto exit_label;
+
+ ilp = 0; skipb; istart = ilp;
+ for (; inline[ilp]!='\0' && inline[ilp]!=' '; ilp++)
+#ifdef vms
+ inline[ilp] = tolower(inline[ilp]);
+#else
+ ;
+#endif
+
+ if (strncmp(&inline[istart],"rpxl",4) == 0) handle_rpxl();
+ else if (strncmp(&inline[istart],"rnft",4) == 0) handle_rnft();
+ else if (strncmp(&inline[istart],"tpxlr",5) == 0)
+ handle_tpxlr(0);
+ else if (strncmp(&inline[istart],"ppxlr",5) == 0)
+ handle_tpxlr(1);
+ else if (strncmp(&inline[istart],"tnftr",5) == 0)
+ handle_tnftr(0);
+ else if (strncmp(&inline[istart],"pnftr",5) == 0)
+ handle_tnftr(1);
+ else if (strncmp(&inline[istart],"tpxll",5) == 0)
+ handle_tpxll();
+ else if (strncmp(&inline[istart],"tnftl",5) == 0)
+ handle_tnftl();
+ else if (strncmp(&inline[istart],"spxll",5) == 0)
+ handle_spxll();
+ else if (strncmp(&inline[istart],"snftl",5) == 0)
+ handle_snftl();
+ else if (strncmp(&inline[istart],"initnft",7) == 0)
+ handle_initnft();
+ else if (strncmp(&inline[istart],"cptonft",7) == 0)
+ handle_cptonft();
+ else if (strncmp(&inline[istart],"wnft",4) == 0)
+ handle_wnft();
+ else if (strncmp(&inline[istart],"wstr",4) == 0)
+ handle_wstr();
+ else if (strncmp(&inline[istart],"exit",4) == 0)
+ goto exit_label;
+ else if (inline[istart] == '?') printf(help_string);
+ else {
+ inline[ilp] = '\0';
+ printf("\nNo such command: '%s'",&inline[istart]);
+ }
+
+ }
+
+exit_label:
+ ;
+}
+
+/* In VMS file specifications have a maximum length, which is convenient in
+sizing character arrays that are to hold them. Thus, the following
+definition. [[In Unix, there is no such convenience, so the scheme needs to
+be changed. Sigh.]] */
+
+#define FILESPECLEN 252
+
+/* PXL and LN03 format (NFT) files are simply read into memory and edited
+there. [[This is probably not reasonable on a personal computer, because of
+the 8088 segment size limit and the overall 640k memory cap.]] */
+
+#define PXLBUFSIZE 512*256
+#define NFTBUFSIZE 512*256
+
+GLOBAL unsigned char pxlbuf[PXLBUFSIZE];
+GLOBAL unsigned char nftbuf[NFTBUFSIZE];
+GLOBAL long pxllen, nftlen;
+
+/* The value conv is computed to be the correct conversion factor from the
+widths in the PXL file, which are expressed in units of 2^-20 times the
+design size, to pixels. */
+
+GLOBAL float conv;
+
+/* As usual when dealing with TeX files, we have to rearrange bytes in
+an overlay to combine them into longwords. The reason for this is that
+bytes in TeX files are combined into longwords the opposite way from how
+the VAX combines them.
+
+Hence, the following overlay and macro: [[It ought to work on 8088s too,
+but not on 68000s.]] */
+
+GLOBAL union lc { unsigned long int ul;
+ long int l;
+ unsigned char c[4]; } lcx;
+
+#define copy_from_pxl(_x) { lcx.c[3] = pxlbuf[_x]; \
+ lcx.c[2] = pxlbuf[(_x)+1]; lcx.c[1] = pxlbuf[(_x)+2]; \
+ lcx.c[0] = pxlbuf[(_x)+3]; }
+
+/* Handle_rpxl handles an rpxl command, which orders FFC to read a PXL file
+into the pxlbuf.
+
+To speed up the operation of this program, the reading is done with Unix
+I/O. In VMS only, we open the file twice, once to find out its record
+attributes, and again to actually read it. The record attributes are
+relevant because in some cases we have to explicitly discard carriage
+returns depending on them.
+
+[[The VAX C RTL fstat function should allow us to avoid this double open,
+but doesn't seem to work properly.]] */
+
+int handle_rpxl() {
+
+ long i,j;
+ int pxlf;
+ float two_to_the_20th;
+#ifdef vms
+ char discard;
+#endif
+
+ skipb; istart = ilp; skipnb;
+ inline[ilp] = '\0';
+#ifdef vms
+ discard = VMS_file_check(&inline[istart],".pxl");
+#endif
+ pxlf = open_input_file(&inline[istart],".pxl");
+ if (pxlf == -1) {
+ printf("\nUnable to open file %s",&inline[istart]);
+ return(1);
+ }
+ pxllen = 0;
+ while (1) {
+ j = PXLBUFSIZE-pxllen;
+ if (j > 65535) j = 65535;
+ i = read(pxlf,&pxlbuf[pxllen],j);
+ if (i < 0) {
+ printf("\nError while reading PXL file.");
+ close(pxlf);
+ return(1);
+ }
+ if (i == 0) break;
+ pxllen += i;
+#ifdef vms
+ if (discard != 0) pxllen--;
+#endif
+ }
+ if (i != 0) {
+ printf("\nPXL file too large for FFC's buffer (%d bytes long)",
+ PXLBUFSIZE-1);
+ close(pxlf);
+ return(1);
+ }
+ close(pxlf);
+
+/* Now that we have read the PXL file, check that it is in correct format
+by looking for a trailing ID byte of 1001. */
+
+ if (locate_pxldir() != 0) return(1);
+
+/* If the format is correct, derive the design size and magnification from
+the final longwords of the PXL file and print them. */
+
+ copy_from_pxl(pxllen-12);
+ conv = lcx.ul;
+ two_to_the_20th = 0x100000;
+ printf("\nDesign size %.2f points",conv/two_to_the_20th);
+ copy_from_pxl(pxllen-16);
+ conv = (conv/two_to_the_20th)*(lcx.ul/5.0)*(1.0/(72.27*two_to_the_20th));
+ printf("\nPixels per em = %.1f",conv*two_to_the_20th);
+ printf("\nMagnification = %.3f (at 300 dpi)",lcx.ul/1500.0);
+
+}
+
+#define copy_to_nft(_x) { nftbuf[_x] = lcx.c[0]; \
+ nftbuf[(_x)+1] = lcx.c[1]; nftbuf[(_x)+2] = lcx.c[2]; \
+ nftbuf[(_x)+3] = lcx.c[3]; }
+#define copy_from_nft(_x) { lcx.c[0] = nftbuf[_x]; \
+ lcx.c[1] = nftbuf[(_x)+1]; lcx.c[2] = nftbuf[(_x)+2]; \
+ lcx.c[3] = nftbuf[(_x)+3]; }
+
+GLOBAL int nft_first,nft_last,nft_next_code;
+
+int handle_rnft() {
+
+ long i,j;
+ int nftf;
+ float two_to_the_20th;
+#ifdef vms
+ char discard;
+#endif
+
+ skipb; istart = ilp; skipnb;
+ inline[ilp] = '\0';
+#ifdef vms
+ discard = VMS_file_check(&inline[istart],".nft");
+#endif
+ nftf = open_input_file(&inline[istart],".nft");
+ if (nftf == -1) {
+ printf("\nUnable to open file %s",&inline[istart]);
+ return(1);
+ }
+ nftlen = 0;
+ while (1) {
+ j = NFTBUFSIZE-nftlen;
+ if (j > 65535) j = 65535;
+ i = read(nftf,&nftbuf[nftlen],j);
+ if (i < 0) {
+ printf("\nError while reading NFT file.");
+ close(nftf);
+ return(1);
+ }
+ if (i == 0) break;
+ nftlen += i;
+#ifdef vms
+ if (discard != 0) nftlen--;
+#endif
+ }
+ if (i != 0) {
+ printf("\nNFT file too large for FFC's buffer (%d bytes long)",
+ NFTBUFSIZE-1);
+ close(nftf);
+ return(1);
+ }
+ close(nftf);
+ printf("\n %d bytes read",nftlen);
+
+#define fnt__l_first_character 164
+
+ copy_from_nft(fnt__l_first_character);
+ nft_first = lcx.ul;
+ copy_from_nft(fnt__l_first_character+4);
+ nft_last = lcx.ul;
+ printf("\n First character %d, last character %d",nft_first,nft_last);
+ return(0);
+
+}
+
+int open_input_file (s,ext)
+char s[], ext[];
+{
+ char fs[FILESPECLEN];
+ int jnam,jext;
+
+ strcpy(fs,s);
+ find_filename(fs,&jnam,&jext);
+ if (fs[jext] == '\0') strcat(fs,ext);
+ return(open(fs,0,0));
+
+}
+
+#ifdef vms
+int VMS_file_check (s,ext)
+char s[], ext[];
+{
+ char fs[FILESPECLEN];
+ int jnam,jext,rv,i;
+ struct FAB the_fab;
+
+ strcpy(fs,s);
+ find_filename(fs,&jnam,&jext);
+ if (fs[jext] == '\0') strcat(fs,ext);
+ the_fab = cc$rms_fab;
+ (the_fab).fab$l_fna = fs;
+ (the_fab).fab$b_fns = strlen(fs);
+ (the_fab).fab$b_fac = FAB$M_BIO;
+ i = sys$open(&(the_fab));
+ if (i % 2 == 0) return(0);
+ rv = 0;
+ if (the_fab.fab$b_rat == FAB$M_CR && the_fab.fab$b_rfm == FAB$C_VAR)
+ rv = 1;
+ sys$close(the_fab);
+ return(rv);
+
+}
+#endif
+
+/* Find_filename finds the filename part of a VMS filespec passed in s,
+returning the index of the first character in *ns, and the index of the
+character after the last in *ne. [[This has now been fixed to handle Ultrix
+as well.]] */
+
+int find_filename(s,ns,ne)
+char s[];
+int *ns,*ne;
+{
+ int jnam,jext,j,slen;
+
+ slen = strlen(s);
+ jnam = 0;
+ for (j = slen-1; j >= 0; j--) {
+#ifdef vms
+ if (s[j] == ':' || s[j] == ']' ||
+ s[j] == '>') {
+#else
+ if (s[j] == '/') {
+#endif
+ jnam = j+1;
+ break;
+ }
+ }
+
+ jext = slen;
+ for (j = jnam; j < slen; j++) {
+#ifdef vms
+ if (s[j] == '.' || s[j] == ';') {
+#else
+ if (s[j] == '.') {
+#endif
+ jext = j;
+ break;
+ }
+ }
+
+ *ns = jnam;
+ *ne = jext;
+}
+
+/* PXL files have a "directory" at the end. Locate_pxldir searches for the
+PXL id 1001, starting at the end of the PXL file. The directory is 517
+longwords back of there. If locate_pxldir can't find the PXL id, it outputs
+an error message. */
+
+GLOBAL long pxldir;
+
+int locate_pxldir () {
+
+ long i;
+
+ pxldir = 0;
+ if (pxllen < 517*4) {
+ printf("\nPXL file too short, must be at least 517 longwords.");
+ return(1);
+ }
+ if (pxllen%4 != 0) {
+ printf("\nPXL file length should be multiple of 4.");
+ pxllen -= pxllen%4;
+ }
+
+ for (i=pxllen-4; i>0; i-=4) {
+ copy_from_pxl(i);
+ if (lcx.ul == 1001) {
+ pxllen = i+4;
+ if (pxllen < 517*4) {
+ printf("\nPXL file too short, must be at least 517 longwords");
+ return(1);
+ }
+ pxldir = pxllen-517*4;
+ printf("\n%d bytes read.",pxllen);
+ return(0);
+ }
+ }
+ printf("\nUnable to find directory in PXL file.");
+ return(1);
+}
+
+/* The tpxll command instructs FFC to type a longword from the PXL file. */
+
+int handle_tpxll() {
+
+ long i;
+
+ i = atoi(&inline[ilp]);
+ if (i < 0 || i > pxllen-4) {
+ printf("\nRequested location %ld lies outside PXL file.",i);
+ return(1);
+ } else {
+ copy_from_pxl(i);
+ printf("\n%ld: %10lu = %%x\"%08lx\"",i,lcx.ul,lcx.ul);
+ return(0);
+ }
+}
+
+/* The tnftl command instructs FFC to type a longword from the nft file. */
+
+int handle_tnftl() {
+
+ long i;
+
+ i = atoi(&inline[ilp]);
+ if (i < 0 || i > nftlen-4) {
+ printf("\nRequested location %ld lies outside NFT file.",i);
+ return(1);
+ } else {
+ copy_from_nft(i);
+ printf("\n%ld: %10lu = %%x\"%08lx\"",i,lcx.ul,lcx.ul);
+ return(0);
+ }
+}
+
+/* The spxll command sets a longword in the pxl file to a value, expressed
+in HEXADECIMAL. */
+
+int handle_spxll()
+{
+ long i;
+
+ skipb;
+ i = atoi(&inline[ilp]);
+ if (i < 0 || i > pxllen-4) {
+ printf("\nRequested location %d lies outside PXL file.",i);
+ return(1);
+ }
+ skipnb;
+ copy_from_pxl(i);
+ sscanf(&inline[ilp],"%X",&lcx.ul);
+ pxlbuf[i] = lcx.c[3]; pxlbuf[i+1] = lcx.c[2];
+ pxlbuf[i+2] = lcx.c[1]; pxlbuf[i+3] = lcx.c[0];
+ printf("\n%ld: %10lu = %%x\"%08lx\"",i,lcx.ul,lcx.ul);
+ return(0);
+}
+
+/* The snftl command sets a longword in the nft file to a value, expressed
+in HEXADECIMAL. */
+
+int handle_snftl()
+{
+ long i;
+
+ skipb;
+ i = atoi(&inline[ilp]);
+ if (i < 0 || i > nftlen-4) {
+ printf("\nRequested location %d lies outside NFT file.",i);
+ return(1);
+ }
+ skipnb;
+ copy_from_nft(i);
+ sscanf(&inline[ilp],"%X",&lcx.ul);
+ nftbuf[i+3] = lcx.c[3]; nftbuf[i+2] = lcx.c[2];
+ nftbuf[i+1] = lcx.c[1]; nftbuf[i] = lcx.c[0];
+ printf("\n%ld: %10lu = %%x\"%08lx\"",i,lcx.ul,lcx.ul);
+ return(0);
+}
+
+#define pxl_word(_x) (pxlbuf[_x]*256+pxlbuf[(_x)+1])
+#define signed_pxl_word(_x) ((pxl_word(_x)>0x8000) ? \
+ (pxl_word(_x)-0x10000) : pxl_word(_x))
+
+GLOBAL char visible_byte[9],sixel_line[401];
+
+/* Handle_tpxlr handles the tpxlr and ppxlr commands, which direct FFC to
+type or plot the rasters corresponding to a character code in the PXL file.
+The parameter how determines what to do: type if how = 0, plot if how = 1.
+
+Plotting is done using the VT125/VT240 sixel protocol. VT100 ANSI escape
+sequences are used to clear the screen and set the current screen position,
+in order to keep the sixels from overwriting text. If the user's terminal
+can't handle these protocols, a hopefully small amount of gobbledygook will
+be displayed. [[On the VT125, text will eventually begin to scroll over the
+last sixels drawn; the user must clear the screen manually.]]
+
+We display not just the rasters themselves, but also the directory
+information for the character. This information comprises the byte offset
+of the rasters within the PXL file; the number of rows and columns in the
+rasters; the location of the reference point of the glyph with respect to
+the upper left corner of the rasters; and the width of the glyph. */
+
+int handle_tpxlr (how)
+int how;
+{
+
+ int code;
+ unsigned int rows,cols,i,j,k,l,m,col_longs;
+ long ds,rs;
+ unsigned long wid;
+
+ if (pxldir == 0) {
+ printf("\nCan't display rasters because there isn't a good PXL");
+ printf(" file in the PXL buffer.");
+ return(1);
+ }
+
+ code = atoi(&inline[ilp]);
+ if (code < 0 || code > 127) {
+ printf("\nCharacter code must be between 0 and 127");
+ return(1);
+ }
+
+/* Determine the location of the rasters within the PXL file. */
+
+ ds = pxldir+16*code;
+ copy_from_pxl(ds+8);
+ rs = 4*lcx.ul;
+ if (rs == 0) {
+ printf("\nNo rasters for code %d",code);
+ return(0);
+ }
+ if (how == 0 || rs > pxllen) printf("\n Rasters begin at %d",rs);
+ if (rs > pxllen) {
+ printf("\n ... outside the PXL file");
+ return(1);
+ }
+
+/* Compute the remaining directory information for the glyph. */
+
+ cols = pxl_word(ds); rows = pxl_word(ds+2);
+ copy_from_pxl(ds+12);
+ wid = lcx.ul;
+ col_longs = (cols+31)/32;
+
+/* Plot as sixels if that is required. */
+
+ if (how == 1) {
+ printf("\033[2J"); /* erase entire screen */
+ printf("\033Pq"); /* go into sixel mode */
+ for (i=0; i<rows; i+=6) {
+ for (j=0; j<cols; j++) sixel_line[j] = 0;
+ for (j=i; j<rows && j<i+6; j++) {
+ m = (1<<(j-i));
+ for (k=0; 8*k<cols; k++) {
+ rev_binrep(pxlbuf[rs+4*col_longs*j+k]);
+ for (l=0; l<8; l++)
+ if (visible_byte[l] == '8')
+ sixel_line[8*k+l] |= m;
+ }
+ }
+ output_sixel_line(cols);
+ }
+ printf("\033\\"); /* leave sixel mode */
+ printf("\033[%d;1H",(rows/10)+1); /* position cursor after sixels */
+ printf("\n Rasters begin at %d",rs);
+ }
+
+ printf("\n %d rows, %d columns",rows,cols);
+ printf("\n width %.2f pixels",conv*wid);
+ printf("\n xoffset %d, yoffset %d",signed_pxl_word(ds+4),
+ signed_pxl_word(ds+6));
+
+/* Now print out the rasters themselves. Compute k as the number of
+longwords required to hold each row of rasters. */
+
+ if (how == 0) {
+ for (l=0; l<rows; l++) {
+ putc('\n',stdout);
+ for (m=0; 8*m<cols; m++) {
+ rev_binrep(pxlbuf[rs+4*col_longs*l+m]);
+ printf(visible_byte);
+ }
+ }
+ }
+}
+
+/* Optimization of this to run-length encode the output isn't really
+necessary at this stage. But it's fun to do anyway. */
+
+output_sixel_line(length)
+int length;
+{
+ int i,howmany,sbp;
+ char last,sixel_buf[802];
+
+ last = 0;
+ howmany = 0;
+ sbp = 0;
+ sixel_line[length] = 0;
+ for (i=0; i<=length; i++) {
+ if (sixel_line[i] == last) howmany++;
+ else {
+ if (howmany == 1) {
+ sixel_buf[sbp] = 63+last;
+ sixel_buf[sbp+1] = 63+last;
+ sbp += 2;
+ } else if (howmany > 1) {
+ sixel_buf[sbp] = '!';
+ if (howmany < 5) {
+ sixel_buf[sbp+1] = 2*howmany+'0';
+ sbp += 2;
+ } else if (howmany < 50) {
+ sixel_buf[sbp+1] = (2*howmany)/10+'0';
+ sixel_buf[sbp+2] = (2*howmany)%10+'0';
+ sbp += 3;
+ } else {
+ sixel_buf[sbp+1] = (2*howmany)/100+'0';
+ sixel_buf[sbp+2] = ((2*howmany)%100)/10+'0';
+ sixel_buf[sbp+3] = (2*howmany)%10+'0';
+ sbp += 4;
+ }
+ sixel_buf[sbp++] = last+63;
+ }
+ last = sixel_line[i];
+ howmany = 1;
+ }
+ }
+ sixel_buf[sbp] = 0;
+ printf("\n%s-",sixel_buf);
+
+}
+
+
+/* Place the reversed binary representation of v in the visible_byte
+array, using dots . for 0s and 8s for 1s. */
+
+int rev_binrep (v)
+int v;
+{
+ int cnt,rem,quo;
+
+ strcpy(visible_byte,"........");
+ quo = v;
+ for (cnt=0; cnt<8; cnt++) {
+ rem = quo%2; quo = quo/2;
+ if (rem != 0) visible_byte[7-cnt] = '8';
+ }
+}
+
+int handle_tnftr (how)
+int how;
+{
+
+ int code;
+ int rows,columns,quo;
+ long i,j,k,l,m,def_start,xoff,yoff,col_bytes;
+
+ code = atoi(&inline[ilp]);
+
+ if (code < nft_first || code > nft_last) {
+ printf("\n No such character.");
+ return(1);
+ }
+
+/* First we need to determine def_start, the byte offset of the character
+definition for code from in the NFT file */
+
+ copy_from_nft(480+(code-nft_first)*4);
+ def_start = lcx.l;
+
+ if (def_start == 0) {
+ printf("\n No such character -- zero locator.");
+ return(1);
+ }
+
+/* Now we need to check that the rasters are uncompressed. LN03s can't
+accept compressed rasters, and this program isn't clever enough to
+understand them either. */
+
+ if (nftbuf[def_start+17] != 129) {
+ printf("\n Can't handle compressed rasters.");
+ return(1);
+ }
+
+ copy_from_nft(def_start+4);
+
+ if (nftbuf[def_start+16] % 2 == 0) {
+ rows = nftbuf[def_start+20]+256*nftbuf[def_start+21];
+ columns = nftbuf[def_start+22]+256*nftbuf[def_start+23];
+ } else {
+ columns = nftbuf[def_start+20]+256*nftbuf[def_start+21];
+ rows = nftbuf[def_start+22]+256*nftbuf[def_start+23];
+ }
+ col_bytes = columns/8;
+ if (columns != 8*col_bytes) col_bytes++;
+
+ if (how == 1) {
+ printf("\033[2J"); /* erase entire screen */
+ printf("\033Pq"); /* go into sixel mode */
+ for (i=0; i<rows; i+=6) {
+ for (j=0; j<columns; j++) sixel_line[j] = 0;
+ for (j=i; j<rows && j<i+6; j++) {
+ m = (1<<(j-i));
+ for (k=0; 8*k<columns; k++) {
+ binrep(nftbuf[def_start+24+col_bytes*j+k]);
+ for (l=0; l<8; l++)
+ if (visible_byte[l] == '8')
+ sixel_line[8*k+l] |= m;
+ }
+ }
+ output_sixel_line(columns);
+ }
+ printf("\033\\"); /* leave sixel mode */
+ printf("\033[%d;1H",(rows/10)+1); /* position cursor after sixels */
+ }
+
+ printf("\n Rasters begin at %d",def_start+24);
+ if (nftbuf[def_start+16] % 2 == 0) printf("\n stored portrait");
+ else printf("\n stored landscape");
+ printf("\n %d rows, %d columns",rows,columns);
+ printf("\n width %.2f pixels",((double)lcx.l)/24.0);
+ copy_from_nft(def_start+8);
+ xoff = lcx.l;
+ copy_from_nft(def_start+12);
+ yoff = lcx.l;
+ printf("\n xoffset %.2f, yoffset %.2f",-((double)xoff)/24.0,
+ -((double)yoff)/24.0);
+
+/* Now do the actual typing. */
+
+/* writeln(i:1,' rows ',j:1,' columns'); */
+
+ if (how == 1) return(0);
+ for (l = 0; l < rows; l++) {
+ printf("\n");
+ for (m = 0; m < col_bytes; m++) {
+ binrep(nftbuf[def_start+24+col_bytes*l+m]);
+ printf("%s",visible_byte);
+ }
+ }
+
+ return(0);
+
+}
+
+/* Place the reversed binary representation of v in the visible_byte
+array, using dots . for 0s and 8s for 1s. */
+
+int binrep (v)
+int v;
+{
+ int cnt,rem,quo;
+
+ strcpy(visible_byte,"........");
+ quo = v;
+ for (cnt=0; cnt<8; cnt++) {
+ rem = quo%2; quo = quo/2;
+ if (rem != 0) visible_byte[cnt] = '8';
+ }
+}
+
+GLOBAL char buffer_fixedp;
+
+/* The initnft command reads two character codes from the command line. If
+both are acceptable, it initializes the nft buffer to hold reasonable
+values for an nft file containing glyphs for codes between the two read
+from the command line. */
+
+int handle_initnft() {
+
+ int c1,c2;
+
+ skipb;
+ c1 = atoi(&inline[ilp]);
+ skipnb; skipb;
+ c2 = atoi(&inline[ilp]);
+
+ if (c1 < 0 || c1 > 255 || c2 < 0 || c2 > 255 || c1 > c2) {
+ printf("\n Bad character code range: [%d, %d]",c1,c2);
+ return(1);
+ }
+ nft_first = c1; nft_last = c2;
+ init_nft();
+ buffer_fixedp = 0;
+ return(0);
+}
+
+int init_nft()
+{
+ int i;
+
+/* The following array holds reasonable values for bytes 0-479 of an NFT
+file. These bytes were copied from a font load which the LN03 was known to
+accept. The NFT files generated by this program are initialized using these
+values. Some of these get overwritten later, however. */
+
+ static char good_opening[512] = {
+ 104,38,0,0,70,79,78,84,
+ 1,0,0,0,31,0,0,0,
+ 20,0,0,0,85,48,48,48,
+ 48,48,48,48,48,50,83,75,
+ 48,48,71,71,48,48,48,49,
+ 85,90,90,90,90,48,50,70,
+ 48,48,48,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 181,7,9,0,11,0,14,0,
+ 0,0,0,0,104,0,0,0,
+ 252,0,0,0,124,0,0,0,
+ 100,1,0,0,120,1,0,0,
+ 224,1,0,0,4,0,0,0,
+ 88,3,0,0,0,0,0,0,
+ 92,3,0,0,48,0,0,0,
+ 92,3,0,0,0,0,0,0,
+ 140,3,0,0,212,34,0,0,
+ 140,3,0,0,33,0,0,0,
+ 126,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 32,0,0,0,168,0,0,0,
+ 16,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,236,25,0,0,
+ 54,25,0,0,14,27,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,0,0,0,
+ 7,0,0,0,92,3,0,0,
+ 7,0,0,0,99,3,0,0,
+ 16,0,0,0,106,3,0,0,
+ 16,0,0,0,122,3,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 10,0,0,0,244,1,0,0,
+ 0,0,24,0,16,0,0,0,
+ 16,0,0,0,1,0,1,0,
+ 1,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 30,0,0,0,20,0,0,0,
+ 196,255,255,255,20,0,0,0,
+ 106,255,255,255,20,0,0,0,
+ 0,0,1,0,0,0,30,0,
+ 166,255,255,255,0,0,0,0,
+ 40,0,0,0,0,0,0,0,
+ 60,0,0,0,240,0,0,0,
+ 60,0,0,0,100,0,0,0,
+ 240,0,0,0,120,0,0,0,
+ 40,0,0,0,120,0,0,0,
+ 96,255,255,255,136,255,255,255,
+ 186,255,255,255,240,0,0,0,
+ 76,255,255,255,60,0,0,0,
+ 160,0,0,0,120,0,0,0,
+ 20,0,0,0,20,0,0,0,
+ 140,3,0,0,194,3,0,0,
+ 244,3,0,0,160,4,0,0,
+ 254,4,0,0,162,5,0,0,
+ 46,6,0,0,84,6,0,0};
+ int pool_beg,nft_chardir;
+
+/* The character directory always begins at position 480 in the Common
+Font File Format. */
+
+ nft_chardir = 480;
+
+/* Copy the good values into nftbuf */
+
+ for (i=0; i<480; i++)
+ nftbuf[i] = good_opening[i];
+ for (i=480; i<480+(nft_last-nft_first+1)*4; i++)
+ nftbuf[i] = 0;
+
+/* Set the first and last character codes */
+
+ nftbuf[fnt__l_first_character] = nft_first;
+ nftbuf[fnt__l_first_character+4] = nft_last;
+
+#define fnt__l_char_directory 116
+
+ lcx.ul = 4*(nft_last-nft_first+1);
+ copy_to_nft(fnt__l_char_directory);
+
+/* Set the character counts */
+
+#define fnt__l_infile_locators 204
+#define fnt__l_character_definitions 212
+#define fnt__l_raster_count 220
+
+ i = nft_last-nft_first+1;
+ nftlen = nft_chardir+4*i+4+48;
+ nftbuf[fnt__l_infile_locators] = i;
+ nftbuf[fnt__l_character_definitions] = i;
+ nftbuf[fnt__l_raster_count] = i;
+
+/* We now have to set some fields in the font format that are pointers to
+where other fields begin. These pointers depend on the number of glyphs we
+are placing in the font file. */
+
+#define fnt__a_subset_tables 128
+
+ lcx.ul = nft_chardir+4*i;
+ copy_to_nft(fnt__a_subset_tables);
+
+ lcx.ul = lcx.ul+4;
+ copy_to_nft(fnt__a_subset_tables+8);
+ copy_to_nft(fnt__a_subset_tables+16);
+
+ lcx.ul = lcx.ul+48;
+ copy_to_nft(fnt__a_subset_tables+24);
+
+#define fnt__a_char_definitions 160
+
+ copy_to_nft(fnt__a_char_definitions);
+
+/* Set up the string pool (48 bytes). */
+
+ pool_beg = nftlen-48;
+ strncpy(&nftbuf[pool_beg],"0B\tZZZZ",7);
+
+/* For reasons that are beyond my comprehension, the Format requires us to
+copy the first seven characters of the font file id into one piece of the
+string pool, and the first sixteen into another place. */
+
+#define fnt__t_font_file_id 20
+
+ for (i=1; i<8; i++)
+ nftbuf[pool_beg+7+i-1] = nftbuf[fnt__t_font_file_id+i-1];
+ for (i=1; i<17; i++)
+ nftbuf[pool_beg+7+7+i-1] = ' ';
+ for (i=1; i<17; i++)
+ nftbuf[pool_beg+7+7+16+i-1] = nftbuf[fnt__t_font_file_id+i-1];
+
+/* Now make string descriptors point into the string pool. */
+
+#define fnt__a_char_set 260
+#define fnt__a_family_id 268
+#define fnt__a_family_name 276
+#define fnt__a_font_id 284
+
+ lcx.ul = pool_beg;
+ copy_to_nft(fnt__a_char_set);
+ lcx.ul = pool_beg+7;
+ copy_to_nft(fnt__a_family_id);
+ lcx.ul = pool_beg+7+7;
+ copy_to_nft(fnt__a_family_name);
+ lcx.ul = pool_beg+7+7+16;
+ copy_to_nft(fnt__a_font_id);
+
+ nft_next_code = nft_first;
+
+#define fnt__l_portrait_byte_count 228
+#define fnt__l_landscape_byte_count 232
+#define fnt__l_mixed_byte_count 236
+
+ lcx.ul = 0;
+ copy_to_nft(fnt__l_portrait_byte_count);
+ copy_to_nft(fnt__l_landscape_byte_count);
+ copy_to_nft(fnt__l_mixed_byte_count);
+
+}
+
+/* Cptonft copies one or more glyphs from the PXL file to the NFT file
+buffer. It reads from the command line two codes. Beginning at the first
+code and proceeding sequentially, it copies glyphs. As cptonft copies, it
+updates nftlen and nft_next_code to reflect what is going on, as well as
+the portrait, landscape and mixed sizes. */
+
+int handle_cptonft () {
+
+ int i,c1,c2;
+
+ skipb;
+ c1 = atoi(&inline[ilp]);
+ skipnb; skipb;
+ c2 = atoi(&inline[ilp]);
+
+ if (c1 < 0 || c1 > 127 || c2 < 0 || c2 > 127 || c1 > c2) {
+ printf("\nBad range of codes: [%d, %d]",c1,c2);
+ return(1);
+ }
+ if (nft_next_code > nft_last) {
+ printf("\nCan't copy more glyphs -- no slots left in NFT file.");
+ return(1);
+ }
+ if (pxldir == 0) {
+ printf("\nCan't copy because there isn't a good PXL file in memory.");
+ return(1);
+ }
+ if (c2-c1+1 > nft_last+1-nft_next_code) {
+ c2 = c1+nft_last-nft_next_code;
+ printf("\nCopying only up to code %d",c2);
+ printf("\n -- no slots left for more glyphs in the NFT file.");
+ }
+
+ if (buffer_fixedp) {
+ nftlen -= 8;
+ buffer_fixedp = 0;
+ }
+
+ for(i=c1; i<=c2; i++)
+ if (copy_glyph(i) != 0) return(1);
+ return(0);
+}
+
+GLOBAL unsigned char rev_byte[256] = {
+ 0,128,64,192,32,160,96,224,
+ 16,144,80,208,48,176,112,240,
+ 8,136,72,200,40,168,104,232,
+ 24,152,88,216,56,184,120,248,
+ 4,132,68,196,36,164,100,228,
+ 20,148,84,212,52,180,116,244,
+ 12,140,76,204,44,172,108,236,
+ 28,156,92,220,60,188,124,252,
+ 2,130,66,194,34,162,98,226,
+ 18,146,82,210,50,178,114,242,
+ 10,138,74,202,42,170,106,234,
+ 26,154,90,218,58,186,122,250,
+ 6,134,70,198,38,166,102,230,
+ 22,150,86,214,54,182,118,246,
+ 14,142,78,206,46,174,110,238,
+ 30,158,94,222,62,190,126,254,
+ 1,129,65,193,33,161,97,225,
+ 17,145,81,209,49,177,113,241,
+ 9,137,73,201,41,169,105,233,
+ 25,153,89,217,57,185,121,249,
+ 5,133,69,197,37,165,101,229,
+ 21,149,85,213,53,181,117,245,
+ 13,141,77,205,45,173,109,237,
+ 29,157,93,221,61,189,125,253,
+ 3,131,67,195,35,163,99,227,
+ 19,147,83,211,51,179,115,243,
+ 11,139,75,203,43,171,107,235,
+ 27,155,91,219,59,187,123,251,
+ 7,135,71,199,39,167,103,231,
+ 23,151,87,215,55,183,119,247,
+ 15,143,79,207,47,175,111,239,
+ 31,159,95,223,63,191,127,255
+ };
+
+/* Copy_glyph copies the rasters and character directory information
+corresponding to code i in the PXL file, into the nft_next_code position of
+the NFT file buffer. */
+
+int copy_glyph(code)
+int code;
+{
+
+ unsigned long ds,rs,i,j;
+ unsigned int rows,cols,k,l,m,n;
+ int xoffset, yoffset;
+ float width;
+ char all_blank;
+
+/* Locate the definition and the rasters for code in the PXL file. Check
+that the rasters are indeed within the pxl file. [[This check may need to
+be modified if we implement commands to add rasters to the pxl file.]] */
+
+ ds = pxldir+16*code;
+ copy_from_pxl(ds+8);
+ rs = 4*lcx.ul;
+ cols = pxl_word(ds); rows = pxl_word(ds+2);
+ if (rs+rows*4*((cols+31)/32) > pxllen) {
+ printf("\nPXL file entry for code %d points outside file",code);
+ printf("\nCopy to NFT file terminated before code %d",nft_next_code);
+ return(1);
+ }
+
+/* If a glyph has no rasters, an "undocumented feature" of the LN03 seems
+to cause the glyph to be printed incorrectly. Because of this, we set the
+number of rows and columns to 1, and put in a blank byte (below). */
+
+ all_blank = (rows == 0) & (cols == 0);
+ if (all_blank) {
+ cols = 1;
+ rows = 1;
+ }
+
+/* Check that we have enough room left in the NFT buffer. */
+
+ if (nftlen+rows*((cols+7)/32)+24 > NFTBUFSIZE) {
+ printf("\nNo more room in NFT file buffer (%ld bytes long)",
+ NFTBUFSIZE);
+ printf("\nCopy to NFT file terminated before code %d",nft_next_code);
+ return(1);
+ }
+
+/* Compute the width of the glyph in pixels, the xoffset, and the yoffset.
+*/
+
+ copy_from_pxl(ds+12);
+ width = conv*lcx.ul;
+ xoffset = signed_pxl_word(ds+4);
+ yoffset = signed_pxl_word(ds+6);
+
+/* Clear the character definition area in the NFT file buffer. */
+
+ for(i=0; i<24+rows*((cols+7)/8); i++)
+ nftbuf[nftlen+i] = 0;
+
+/* Set the fields in the first six longwords of the NFT character
+definition. The first assignment sets the so-called "flag flag", which must
+be always be set according to the DEC Common Font File Format. A conversion
+factor of 24 is used in converting pixel values, because the values are
+supposed to be in centipoints in the NFT file, and if we assume there are
+300 pixels in an inch, then there are 7200 centipoints in an inch.
+[[Eventually, the resolution of the printer will have to be settable!]] */
+
+ nftbuf[nftlen+3] = 0x80;
+ lcx.ul = 24*width+0.5;
+ copy_to_nft(nftlen+4);
+ lcx.l = -24*xoffset;
+ copy_to_nft(nftlen+8);
+ lcx.l = -24*yoffset;
+ copy_to_nft(nftlen+12);
+
+/* The rasters are always placed in portrait into the NFT file, with no
+use of run-length encoding. Thus, the orient field in the raster format
+will be 0, and the Type 1 field is set to 0x81. */
+
+ nftbuf[nftlen+17] = 0x81;
+ nftbuf[nftlen+20] = rows%256;
+ nftbuf[nftlen+21] = rows/256;
+ nftbuf[nftlen+22] = cols%256;
+ nftbuf[nftlen+23] = cols/256;
+
+/* Now we copy the rasters themselves. As we do so, we have to reverse
+the bits within each byte. */
+
+ k = (cols+31)/32;
+ n = (cols+7)/8;
+ if (!all_blank)
+ for (l=0; l<rows; l++)
+ for (m=0; m<n; m++)
+ nftbuf[nftlen+24+n*l+m] = rev_byte[pxlbuf[rs+4*k*l+m]];
+
+/* Set the character locator, increment the nft length, and recompute
+the three sizes. */
+
+ lcx.ul = nftlen;
+ copy_to_nft(480+4*(nft_next_code-nft_first));
+ nftlen += 24+rows*n;
+ if (nftlen%2 == 1) nftlen++;
+
+ i = rows*((cols+7)/8);
+ copy_from_nft(fnt__l_portrait_byte_count);
+ lcx.ul += i;
+ copy_to_nft(fnt__l_portrait_byte_count);
+ j = ((rows+7)/8)*cols;
+ copy_from_nft(fnt__l_landscape_byte_count);
+ lcx.ul += j;
+ copy_to_nft(fnt__l_landscape_byte_count);
+ copy_from_nft(fnt__l_mixed_byte_count);
+ lcx.ul += (i > j) ? i : j;
+ copy_to_nft(fnt__l_mixed_byte_count);
+
+ nft_next_code++;
+
+ return(0);
+}
+
+/* The wnft command writes the contents of an NFT buffer into a file.
+It is necessary to do some fixup on the buffer the first time this
+is done. */
+
+int handle_wnft() {
+
+ int nftf;
+ unsigned long i;
+
+ skipb; istart = ilp; skipnb;
+ inline[ilp] = '\0';
+
+ nftf = open_output_file(&inline[istart],".nft");
+ if (nftf == -1) {
+ printf("\nUnable to open NFT file %s",&inline[istart]);
+ return(1);
+ }
+
+/* At this point we have to clean up a few fields before writing
+the file. */
+
+#define fnt__l_char_definitions_length 156
+
+ if (!buffer_fixedp) {
+ lcx.ul = nftlen-(480+(nft_last-nft_first+1)*4+48+4);
+ copy_to_nft(fnt__l_char_definitions_length);
+
+ nftlen += 8;
+ lcx.ul = nftlen;
+ copy_to_nft(0);
+ copy_to_nft(nftlen-8);
+ nftbuf[nftlen-4] = 'F';
+ nftbuf[nftlen-3] = 'O';
+ nftbuf[nftlen-2] = 'N';
+ nftbuf[nftlen-1] = 'T';
+ buffer_fixedp = 0;
+ }
+
+/* Pad the file out to a multiple of 512 bytes */
+
+ if (nftlen%512 != 0)
+ for (i=0; i<512-nftlen%512; i++)
+ nftbuf[nftlen+i] = 0;
+
+/* Now for the actual writing */
+
+ for (i=0; i<nftlen; i+=512)
+ if (write(nftf,&nftbuf[i],512) == -1) {
+ printf("\nError writing NFT file.");
+ close(nftf);
+ return(1);
+ }
+
+ close(nftf);
+ return(1);
+
+}
+
+/* The wstr command writes the PXL buffer into a file. Under VMS, the file
+has stream record format. This is the best format for storing TeX-style
+"binary" files under VMS. */
+
+int handle_wstr()
+{
+
+ int strf;
+ char fs[FILESPECLEN];
+ int jnam,jext;
+ unsigned long i,target;
+
+ if (pxllen == 0) {
+ printf("\n There is no PXL file in memory.");
+ return(1);
+ }
+
+ skipb; istart = ilp; skipnb;
+ inline[ilp] = '\0';
+
+ strcpy(fs,&inline[istart]);
+ find_filename(fs,&jnam,&jext);
+ if (fs[jext] == '\0') strcat(fs,".pxl");
+ strf = creat(fs,0700);
+ if (strf == -1) {
+ printf("\nUnable to open PXL file %s",&inline[istart]);
+ return(1);
+ }
+ for (i=0; i<pxllen; i+=512) {
+ target = pxllen-i;
+ if (target > 512) target = 512;
+ if (write(strf,&pxlbuf[i],target) == -1) {
+ printf("\nError writing PXL file.");
+ close(strf);
+ return(1);
+ }
+ }
+
+ close(strf);
+ return(0);
+}
+
+int open_output_file (s,ext)
+char s[], ext[];
+{
+ char fs[FILESPECLEN];
+ int jnam,jext;
+
+ strcpy(fs,s);
+ find_filename(fs,&jnam,&jext);
+ if (fs[jext] == '\0') strcat(fs,ext);
+#ifdef vms
+ return(creat(fs,0,"rfm=fix","mrs=512"));
+#else
+ return(creat(fs,0700));
+#endif
+
+}
+
diff --git a/dviware/ln03/rose/older_driver.mem b/dviware/ln03/rose/older_driver.mem
new file mode 100644
index 0000000000..c1350ea850
--- /dev/null
+++ b/dviware/ln03/rose/older_driver.mem
@@ -0,0 +1,84 @@
+AN OLDER DRIVER (NOW OBSOLETE)
+
+If you are running under an old version of VMS (before 4.2),
+you may not be able to get dvi2ln3 to work because you don't
+have the C run time library. In that case, as a backup, we
+supply an older driver, which is considerably slower than
+dvi2ln3.
+
+The older driver is supplied as
+
+ dvi2lng.web, dvi2lng.ch, dvi2lng.obj
+ ln03topp.pli, ln03topp.obj, toppnft.pli, toppnft.obj,
+ lnfinc.pli, lnfinc.obj
+ ffc.web, ffc.ch, ffc.obj
+
+To get executables, relink:
+
+ $ link dvi2lng
+ $ link ln03topp,toppnft,lnfinc
+ $ link ffc
+
+The old driver doesn't read PXL files, so all PXL files have
+to be converted to the TEX$LN03DIR format files by the
+following recipe:
+
+ $ run ffc
+
+ Font File Converter
+
+ FFC> rpxl foo.yyyyPXL
+ FFC> toln03x
+ FFC> wln03 foo.xxx
+ FFC> exit
+ $
+
+Here yyyy/15 = xxx, and xxx% is the magnification of the
+font. If the font is not magnified, so that yyyy = 1500,
+then xxx must be NFT.
+
+The way to invoke the driver is different, also. You define
+two VMS symbols
+
+ $ dvi2lng == "$disk:[directory]dvi2lng"
+ $ ln03topp == "$disk:[directory]ln03topp"
+
+To convert foo.dvi to foo.ln3, you say
+
+ $ dvi2lng foo
+ $ ln03topp foo
+
+In addition to foo.ln3, this creates the useless files
+foo.typ, foo.lnh and foo.lng which you should delete.
+
+The Dvi2lng program takes the options /N and /S of the
+Dvi2ln3 program. The Ln03Topp program takes the options /H
+and /V of the Dvi2ln3 program. There is no option for
+printing in landscape.
+
+If you need to relink, the commands are as follows:
+
+ $ link dvi2lng
+ $ link ln03topp,toppnft,lnfinc
+
+The FFC commands are:
+
+ rpxl <file> Read pxl file
+ rln03 <file> Read ln03 font file
+ tln03 <character> Type the rasters for LN03 character, specified
+ as a decimal ascii code, or as the character
+ itself preceded by a single quote '
+ tpxl <character> Type the rasters for PXL character
+ toln03 Convert PXL file to LN03 format, converting
+ only the 94 characters with codes 33-126. The
+ converted file is held in memory, and must be
+ written out with a separate wln03 command.
+ toln03x Convert PXL file to LN03 font file, converting
+ all 128 characters
+ wln03 <filename> Write an LN03 file
+ tln03long <offset> These commands type longwords or words from the PXL
+ tln03word <offset> and LN03 files last read in, or the versions
+ tpxllong <offset> generated via the conversion command. The <offset>
+ tpxlword <offset> is a decimal number of bytes from the beginning of
+ the file.
+ exit Leave the FFC program
diff --git a/dviware/ln03/rose/picmode.pli b/dviware/ln03/rose/picmode.pli
new file mode 100644
index 0000000000..4169256a7c
--- /dev/null
+++ b/dviware/ln03/rose/picmode.pli
@@ -0,0 +1,529 @@
+%REPLACE false BY '0'B;
+%REPLACE true BY '1'B;
+
+/*
+
+The purpose of this program is to provide a standalone version of LNF's
+PICmode, outputting a TeX file which can be \input into a TeX document.
+Copyright (c) 1984 by Digital Equipment Corporation. Author: Flavio
+Rose. UNDER DEVELOPMENT.
+
+*/
+
+picmode: PROCEDURE OPTIONS(MAIN);
+
+ DCL (strip,frontstrip) EXTERNAL ENTRY (CHAR (*))
+ RETURNS (CHAR (*)),
+ cvis EXTERNAL ENTRY (FIXED) RETURNS (CHAR (*));
+ DCL upcase EXTERNAL ENTRY (CHAR (*)) RETURNS (CHAR (*));
+ DCL read_wln_file EXTERNAL ENTRY(FIXED,CHAR(*),FILE) RETURNS(BIT);
+
+ /* Debugging info */
+ DCL debug FILE;
+ DCL debugwid FIXED;
+ DCL debugflag BIT;
+ debugflag = false;
+ debugwid = 0;
+
+ /* input file, output file, wln file, include file */
+ DCL (outf,inf) FILE;
+ DCL (infnam,outfnam) CHAR(150) VARYING;
+
+ ON UNDEFINEDFILE (inf) BEGIN;
+ PUT SKIP LIST('No such file: ' || infnam);
+ GOTO terminal_eof;
+ END;
+
+ ON UNDEFINEDFILE (outf) BEGIN;
+ PUT SKIP LIST('Couldn''t open: ' || outfnam);
+ GOTO terminal_eof;
+ END;
+
+ /* Define <esc> <tab> as constants. In general this source file should
+ not contain any ascii control characters; instead we use byte(). */
+ DCL (esc,tab) CHAR(1);
+ esc = byte(27);
+ tab = byte(9);
+
+ /* Heading */
+ PUT SKIP LIST ('PICmode 1.0');
+ /* Hack command line */
+ %REPLACE obufsize BY 512;
+ %REPLACE inbufsize BY 512;
+ DCL ob CHAR(obufsize);
+ DCL inline CHAR(inbufsize) VARYING;
+ DCL tch CHAR(1);
+ DCL (illen,obp,ilp,i,istart,zch) FIXED;
+
+ %INCLUDE $stsdef;
+ DCL lib$get_foreign ENTRY (CHAR(*) VARYING, CHAR(*) VARYING,
+ FIXED(15),FIXED) OPTIONS(VARIABLE) RETURNS(FIXED);
+ DCL rms$_eof FIXED GLOBALREF VALUE;
+ DCL defdir CHAR(150) VARYING;
+ DCL (jj,jdir,jext) FIXED;
+
+ sts$value = lib$get_foreign(inline,,,0);
+
+ IF ^sts$success THEN DO;
+ PUT SKIP EDIT ('Usage: picmode <filename>') (A);
+ GOTO terminal_eof;
+ END;
+
+ inline = inline || ' ';
+ illen = length(inline);
+ ilp = 1;
+ CALL skipb;
+ IF ilp > illen THEN DO;
+ PUT SKIP EDIT ('Usage: picmode <filename>') (A);
+ GOTO terminal_eof;
+ END;
+ istart = ilp;
+ CALL skipnb2;
+ infnam = substr(inline,istart,ilp-istart);
+ OPEN FILE(inf) TITLE(infnam)
+ ENVIRONMENT(Default_file_name('FOO.PMD'));
+
+ jdir = istart;
+ DO jj = ilp-1 TO istart BY -1;
+ IF substr(inline,jj,1) = ':' |
+ substr(inline,jj,1) = ']' |
+ substr(inline,jj,1) = '>'
+ THEN DO;
+ jdir = jj+1;
+ GOTO found_jdir;
+ END;
+ END;
+
+found_jdir:
+ defdir = substr(inline,istart,jdir-istart);
+ jext = ilp;
+ DO jj = jdir TO ilp-1;
+ IF substr(inline,jj,1) = '.' |
+ substr(inline,jj,1) = ';'
+ THEN DO;
+ jext = jj;
+ GOTO found_jext;
+ END;
+ END;
+
+found_jext:
+ outfnam = substr(inline,jdir,jext-jdir) || '.TEX';
+
+ OPEN FILE(outf) OUTPUT TITLE(outfnam)
+ ENVIRONMENT(Default_file_name('FOO.TEX'));
+
+/* Globals:
+
+ font information
+ picmode uses just one font
+ but we use these for compatibility with LNFWLN */
+
+ DCL curf FIXED;
+ DCL (firstch(0:9),lastch(0:9),fht(0:9)) FIXED GLOBALDEF;
+ DCL chw(0:9,0:255) FIXED GLOBALDEF;
+ DCL fname(0:9) CHAR(20) GLOBALDEF;
+ DCL font_present(0:9) BIT GLOBALDEF;
+
+ curf = 0;
+ chw = 0;
+ font_present = false;
+
+ /* character classification for PIC mode */
+ DCL ztyp(0:255) FIXED(7);
+ ztyp = 0;
+ ztyp(rank('+')) = 1;
+ ztyp(rank('-')) = 2;
+ ztyp(rank('|')) = 3;
+ ztyp(rank('v')) = 4;
+ ztyp(rank('<')) = 5;
+ ztyp(rank('>')) = 6;
+ ztyp(rank('^')) = 7;
+ ztyp(rank('/')) = 8;
+ ztyp(rank('\')) = 9;
+ ztyp(rank('#')) = 10;
+ ztyp(rank('X')) = 11;
+
+ DCL horp(0:11) BIT ALIGNED INIT(false,true,true,false,
+ true,false,false,true,true,true,true,false);
+ DCL verp(0:11) BIT ALIGNED INIT(false,true,false,true,
+ false,true,true,false,true,true,true,false);
+ DCL arrowp(0:11) BIT ALIGNED INIT(false,false,false,false,
+ true,true,true,true,false,false,false,false);
+ DCL slant(0:11) BIT ALIGNED INIT(false,false,false,false,
+ false,true,true,false,true,true,false,true);
+ PUT EDIT ('\vbox{\font\amgr=AMGR at 10truept\baselineskip0.1466667truein' ||
+ '\lineskiplimit-\maxdimen') (A) FILE(outf);
+ PUT SKIP EDIT ('\catcode`\-=\active\catcode`\~=\active' ||
+ '\def~{{\char32}}\def-{{\char1}}%') (A) FILE(outf);
+ CALL process_pic;
+ PUT EDIT ('}') (A) FILE(outf);
+
+abort_job:
+ CLOSE FILE(inf);
+
+
+terminal_eof:
+ RETURN;
+
+ process_pic: PROCEDURE;
+ DCL ils(3) CHAR(inbufsize) VARYING;
+ DCL (temp,prev,curr,next,quo,rem) FIXED;
+ DCL last_line BIT;
+
+ ils(1) = '';
+ last_line = false;
+ prev = 1;
+ curr = 2;
+ next = 3;
+ IF ^read_line_for_pic(2) THEN RETURN; /* pic is empty */
+ IF ^read_line_for_pic(3) THEN last_line = true;
+ DO WHILE (true);
+ CALL output_pic_line;
+ IF last_line THEN DO;
+ obp = 0;
+ RETURN;
+ END;
+ temp = prev;
+ prev = curr;
+ curr = next;
+ next = temp;
+ IF ^read_line_for_pic(next) THEN last_line = true;
+ END;
+
+ read_line_for_pic: PROCEDURE (which) RETURNS (BIT);
+ DCL (which,true_ilp) FIXED;
+
+ ON ENDFILE (inf) GOTO end_of_inf;
+
+ ils(which) = '';
+ GET EDIT (inline) (A(511)) FILE(inf);
+
+ inline = inline || ' ';
+ illen = length(inline);
+ /* For PICs, we attempt to untabify input lines */
+ true_ilp = 1;
+ DO ilp = 1 TO illen-1;
+ IF substr(inline,ilp,1) ^= tab
+ THEN DO;
+ ils(which) = ils(which) || substr(inline,ilp,1);
+ true_ilp = true_ilp+1;
+ END;
+ ELSE DO;
+ quo = DIVIDE(true_ilp-1,8,31);
+ rem = true_ilp-1-quo*8;
+ ils(which) = ils(which) || copy(' ',8-rem);
+ true_ilp = true_ilp+8-rem;
+ END;
+ END;
+ RETURN(true);
+
+ end_of_inf:
+ CLOSE FILE(inf);
+ RETURN(false);
+
+ END read_line_for_pic;
+
+ output_pic_line: PROCEDURE;
+ DCL (iz,prevl,currl,nextl,icnt,nbors(8)) FIXED;
+ DCL (zch,tch) CHAR;
+ DCL cnt_to_char_plus(0:15) FIXED STATIC INIT(
+ 43,161,160,164,161,161,165,177,
+ 160,163,161,176,162,178,175,174);
+ DCL cnt_to_char_sharp(0:15) FIXED STATIC INIT(
+ 35,161,160,186,161,161,187,177,
+ 160,185,161,176,184,178,175,174);
+ DCL (xtra1,xtra2) CHAR(inbufsize) VARYING;
+ DCL (xtra1used,xtra2used,present(8)) BIT ALIGNED;
+
+ xtra1used = false;
+ xtra2used = false;
+ xtra1 = '';
+ xtra2 = '';
+ obp = 0;
+ prevl = length(ils(prev));
+ currl = length(ils(curr));
+ nextl = length(ils(next));
+ DO iz = 1 TO currl;
+ zch = substr(ils(curr),iz);
+ IF ztyp(rank(zch)) ^= 0 THEN CALL det_nbors;
+ IF ztyp(rank(zch)) = 0 THEN tch = zch;
+ ELSE IF zch = '-' THEN DO;
+ IF ztyp(nbors(1)) ^= 0 | ztyp(nbors(3)) ^= 0
+ THEN tch = byte(161);
+ ELSE tch = '-';
+ END; ELSE IF zch = '|' THEN DO;
+ IF ztyp(nbors(2)) ^= 0 | ztyp(nbors(4)) ^= 0
+ THEN tch = byte(160);
+ ELSE tch = '|';
+ END; ELSE IF zch = '+' THEN DO;
+ icnt = 0;
+ IF horp(ztyp(nbors(1))) THEN icnt = icnt+1;
+ IF verp(ztyp(nbors(2))) THEN icnt = icnt+2;
+ IF horp(ztyp(nbors(3))) THEN icnt = icnt+4;
+ IF verp(ztyp(nbors(4))) THEN icnt = icnt+8;
+ IF nbors(1) = rank('<') THEN DO;
+ IF verp(ztyp(nbors(5))) | verp(ztyp(nbors(8)))
+ THEN icnt = icnt+1;
+ END;
+ IF nbors(2) = rank('^') THEN DO;
+ IF horp(ztyp(nbors(5))) | horp(ztyp(nbors(6)))
+ THEN icnt = icnt+2;
+ END;
+ IF nbors(3) = rank('>') THEN DO;
+ IF verp(ztyp(nbors(6))) | verp(ztyp(nbors(7)))
+ THEN icnt = icnt+4;
+ END;
+ IF nbors(4) = rank('v') THEN DO;
+ IF horp(ztyp(nbors(7))) | horp(ztyp(nbors(8)))
+ THEN icnt = icnt+8;
+ END;
+ tch = byte(cnt_to_char_plus(icnt));
+ END; ELSE IF zch = 'v' | zch = '^' THEN DO;
+ IF (horp(ztyp(nbors(1))) &
+ ^arrowp(ztyp(nbors(1))))
+ | (horp(ztyp(nbors(3))) &
+ ^arrowp(ztyp(nbors(3))))
+ THEN DO;
+ IF zch = 'v' THEN tch = byte(181);
+ ELSE tch = byte(182);
+ END; ELSE tch = zch;
+ END; ELSE IF zch = '<' THEN DO;
+ IF (verp(ztyp(nbors(2))) &
+ ^arrowp(ztyp(nbors(2))))
+ | (verp(ztyp(nbors(4))) &
+ ^arrowp(ztyp(nbors(4))))
+ THEN tch = byte(179);
+ ELSE IF (nbors(6) = rank('/')
+ | nbors(6) = rank('>') | nbors(7) = rank('\')
+ | nbors(7) = rank('>'))
+ THEN DO;
+ tch = byte(173);
+ CALL superpose(byte(172));
+ IF horp(ztyp(nbors(1))) THEN
+ CALL superpose(byte(167));
+ END; ELSE tch = zch;
+ END; ELSE IF zch = '>' THEN DO;
+ IF (verp(ztyp(nbors(2))) &
+ ^arrowp(ztyp(nbors(2))))
+ | (verp(ztyp(nbors(4))) &
+ ^arrowp(ztyp(nbors(4))))
+ THEN tch = byte(180);
+ ELSE IF (nbors(8) = rank('/')
+ | nbors(5) = rank('<') | nbors(5) = rank('\')
+ | nbors(8) = rank('<'))
+ THEN DO;
+ tch = byte(170);
+ CALL superpose(byte(171));
+ IF horp(ztyp(nbors(3))) THEN
+ CALL superpose(byte(169));
+ END; ELSE tch = zch;
+ END; ELSE IF zch = '/' THEN DO;
+ present = false;
+ IF nbors(6) = rank('/') | nbors(6) = rank('>')
+ | nbors(6) = rank('X') | nbors(3) = rank('\')
+ THEN present(6) = true;
+ IF nbors(8) = rank('/') | nbors(8) = rank('<')
+ | nbors(8) = rank('X') | nbors(1) = rank('\')
+ THEN present(8) = true;
+ IF ^(present(6) | present(8)) THEN DO;
+ tch = zch;
+ GOTO break;
+ END;
+ IF present(6) & present(8) THEN tch = byte(188);
+ ELSE IF present(6) THEN tch = byte(172);
+ ELSE IF present(8) THEN tch = byte(170);
+ IF horp(ztyp(nbors(1))) & ^slant(ztyp(nbors(1)))
+ THEN present(1) = true;
+ IF horp(ztyp(nbors(3))) & ^slant(ztyp(nbors(3)))
+ THEN present(3) = true;
+ IF present(1) & present(3) THEN CALL superpose(
+ byte(161));
+ ELSE IF present(1) THEN CALL superpose(byte(167));
+ ELSE IF present(3) THEN CALL superpose(byte(169));
+ END; ELSE IF zch = '\' THEN DO;
+ present = false;
+ IF nbors(5) = rank('\') | nbors(5) = rank('<')
+ | nbors(5) = rank('X') | nbors(3) = rank('/')
+ THEN present(5) = true;
+ IF nbors(7) = rank('\') | nbors(7) = rank('>')
+ | nbors(7) = rank('X') | nbors(1) = rank('/')
+ THEN present(7) = true;
+ IF ^(present(5) | present(7)) THEN DO;
+ tch = zch;
+ GOTO break;
+ END;
+ IF horp(ztyp(nbors(1))) & ^slant(ztyp(nbors(1)))
+ THEN present(1) = true;
+ IF horp(ztyp(nbors(3))) & ^slant(ztyp(nbors(3)))
+ THEN present(3) = true;
+ IF present(5) & present(7) THEN tch = byte(189);
+ ELSE IF present(5) THEN tch = byte(171);
+ ELSE IF present(7) THEN tch = byte(173);
+ IF present(1) & present(3) THEN CALL superpose(
+ byte(161));
+ ELSE IF present(1) THEN CALL superpose(byte(167));
+ ELSE IF present(3) THEN CALL superpose(byte(169));
+ END; ELSE IF zch = '#' THEN DO;
+ icnt = 0;
+ IF horp(ztyp(nbors(1))) THEN icnt = icnt+1;
+ IF verp(ztyp(nbors(2))) THEN icnt = icnt+2;
+ IF horp(ztyp(nbors(3))) THEN icnt = icnt+4;
+ IF verp(ztyp(nbors(4))) THEN icnt = icnt+8;
+ IF nbors(1) = rank('<') THEN DO;
+ IF verp(ztyp(nbors(5))) | verp(ztyp(nbors(8)))
+ THEN icnt = icnt+1;
+ END;
+ IF nbors(2) = rank('^') THEN DO;
+ IF horp(ztyp(nbors(5))) | horp(ztyp(nbors(6)))
+ THEN icnt = icnt+2;
+ END;
+ IF nbors(3) = rank('>') THEN DO;
+ IF verp(ztyp(nbors(6))) | verp(ztyp(nbors(7)))
+ THEN icnt = icnt+4;
+ END;
+ IF nbors(4) = rank('v') THEN DO;
+ IF horp(ztyp(nbors(7))) | horp(ztyp(nbors(8)))
+ THEN icnt = icnt+8;
+ END;
+ tch = byte(cnt_to_char_sharp(icnt));
+ END; ELSE IF zch = 'X' THEN DO;
+ IF nbors(5) = rank('\') & nbors(6) = rank('/') &
+ nbors(7) = rank('\') & nbors(8) = rank('/')
+ THEN DO;
+ tch = byte(188);
+ CALL superpose(byte(189));
+ END; ELSE tch = zch;
+ END; ELSE tch = zch;
+ break:
+ obp = obp+1;
+ substr(ob,obp,1) = tch;
+ END;
+
+ IF xtra1used THEN PUT SKIP EDIT ('\hbox{\rlap{%') (A) FILE(outf);
+ CALL really_output(substr(ob,1,obp));
+ IF xtra1used THEN DO;
+ PUT EDIT ('}%') (A) FILE(outf);
+ IF xtra2used THEN PUT SKIP EDIT ('\rlap{%') (A) FILE(outf);
+ CALL really_output(xtra1);
+ IF xtra2used THEN DO;
+ PUT EDIT ('}%') (A) FILE(outf);
+ CALL really_output(xtra2);
+ END;
+ PUT EDIT ('}') (A) FILE(outf);
+ END;
+
+ det_nbors: PROCEDURE;
+ DCL space_rank FIXED;
+
+ space_rank = rank(' ');
+ IF iz = 1 THEN nbors(1) = space_rank;
+ ELSE nbors(1) = rank(substr(ils(curr),iz-1,1));
+ IF iz = 1 | iz-1 > prevl THEN nbors(5) = space_rank;
+ ELSE nbors(5) = rank(substr(ils(prev),iz-1,1));
+ IF iz > prevl THEN nbors(2) = space_rank;
+ ELSE nbors(2) = rank(substr(ils(prev),iz,1));
+ IF iz+1 > prevl THEN nbors(6) = space_rank;
+ ELSE nbors(6) = rank(substr(ils(prev),iz+1,1));
+ IF iz = currl THEN nbors(3) = space_rank;
+ ELSE nbors(3) = rank(substr(ils(curr),iz+1,1));
+ IF iz = 1 | iz-1 > nextl THEN nbors(8) = space_rank;
+ ELSE nbors(8) = rank(substr(ils(next),iz-1,1));
+ IF iz > nextl THEN nbors(4) = space_rank;
+ ELSE nbors(4) = rank(substr(ils(next),iz,1));
+ IF iz+1 > nextl THEN nbors(7) = space_rank;
+ ELSE nbors(7) = rank(substr(ils(next),iz+1,1));
+
+ END det_nbors;
+
+ superpose: PROCEDURE (x);
+ DCL x CHAR;
+
+ IF ^xtra1used THEN DO;
+ xtra1 = copy(' ',obp+1);
+ substr(xtra1,obp+1,1) = x;
+ xtra1used = true;
+ END; ELSE IF length(xtra1) < obp+1
+ THEN xtra1 = xtra1 || copy(' ',obp-length(xtra1)) || x;
+ ELSE IF substr(xtra1,obp+1,1) = ' '
+ THEN substr(xtra1,obp+1,1) = x;
+ ELSE IF ^xtra2used THEN DO;
+ xtra2 = copy(' ',obp+1);
+ substr(xtra2,obp+1,1) = x;
+ xtra2used = true;
+ END; ELSE IF length(xtra2) < obp+1
+ THEN xtra2 = xtra2 || copy(' ',obp-length(xtra2)) || x;
+ ELSE substr(xtra2,obp+1,1) = x;
+
+ END superpose;
+
+ really_output: PROCEDURE (who);
+
+ DCL who CHAR(*) VARYING;
+ DCL (i,j,k) FIXED;
+ DCL (tch,tcat) CHAR(1);
+ DCL cats(32:126) CHAR(1) STATIC INIT
+ ('e',(2)('o'),(4)('e'),(6)('o'),'e',(46)('o'),
+ 'e','o',(2)('e'),(27)('o'),'e','o',(2)('e'));
+
+ j = length(who);
+
+ PUT SKIP EDIT ('\hbox{\amgr ') (A) FILE(outf);
+ k = 0;
+ DO i = 1 to j;
+ tch = substr(who,i,1);
+ IF rank(tch) < 32 | (rank(tch) > 126 &
+ rank(tch) < 160)
+ THEN tch = ' ';
+ k = k+1;
+ IF tch = ' ' THEN PUT EDIT ('~') (A) FILE(outf);
+ ELSE IF tch = byte(161) THEN PUT EDIT ('-') (A) FILE(outf);
+ ELSE IF rank(tch) >= 160 THEN DO;
+ PUT EDIT ('{\char' || cvis(rank(tch)-160) || '}')
+ (A) FILE(outf);
+ k = k+7;
+ END; ELSE DO;
+ tcat = cats(rank(tch));
+ IF tcat = 'o' THEN PUT EDIT (tch) (A) FILE(outf);
+ ELSE DO;
+ PUT EDIT ('{\char' || cvis(rank(tch)) || '}')
+ (A) FILE(outf);
+ k = k+7;
+ END;
+ END;
+ IF k > 100 THEN DO;
+ PUT EDIT ('%') (A) FILE(outf);
+ PUT SKIP FILE(outf);
+ k = 0;
+ END;
+
+ END;
+ PUT EDIT ('}') (A) FILE(outf);
+
+ END really_output;
+
+ END output_pic_line;
+
+ END process_pic;
+
+ /* skip over blanks in infile */
+ skipb: PROCEDURE;
+
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) ^= ' ' THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END skipb;
+
+ /* skip over characters other than ' ' and '}'. */
+ skipnb2: PROCEDURE;
+
+ DO WHILE (ilp <= illen);
+ IF substr(inline,ilp,1) = ' '
+ | substr(inline,ilp,1) = '}' THEN RETURN;
+ ilp = ilp+1;
+ END;
+
+ END skipnb2;
+
+END picmode;
diff --git a/dviware/ln03/rose/specials.c b/dviware/ln03/rose/specials.c
new file mode 100644
index 0000000000..1cfb0bb471
--- /dev/null
+++ b/dviware/ln03/rose/specials.c
@@ -0,0 +1,480 @@
+/* This file contains the code that implements the handling of \special's
+in Dvi2ln3.
+
+Copyright (c) 1985 by Digital Equipment Corporation. Author: Flavio Rose,
+(617) 467-7545, ...ucbvax!decwrl!dec-rhea!dec-dvinci!rose.
+
+Right now, the following \special's are implemented:
+
+ln03:defpoint fixnum ( [dimension] , [dimension] )
+ln03:connect fixnum [/ fixnum] fixnum [/ fixnum]
+ln03:plotfile filename
+ln03:resetpoints fixnum fixnum
+
+A dimension is a number with optional decimal point, followed by one of pt,
+in, pc, cm, mm, bp, dd, cc, and mi.
+
+We try to mimic the functionality of DVIAPS, a program that drives the
+Autologic Micro-5 typesetter, written by Textset Inc. of Ann Arbor,
+Michigan. This has been done on the basis of user-level documentation
+supplied by Textset. This code does not contain any Textset-proprietary
+information.
+
+\special's are parsed case-insensitively.
+
+Revision history:
+
+10/8/85 Created file, wrote, tested code for ln03:plotfile
+
+10/16/85 ln03:resetpoints, ln03:defpoint, ln03:connect
+
+12/12/85 Corrected bug: ln03:plotfile does not update LN03's
+ position to the latest from the DVI file.
+
+*/
+
+#ifdef vms
+#include stdio
+#include ctype
+#include math
+#include file
+#else
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#endif
+
+/* In VMS we declare external variables to be globalref.
+This is not really necessary, just an old habit. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+#define NUMSPECIALS 4
+
+GLOBAL char *specialnames[NUMSPECIALS] = { "defpoint",
+ "connect", "plotfile", "resetpoints" } ;
+
+EXTERN FILE *dvifile,*outfile;
+
+/* There are two top-level routines for handling specials, one to be
+invoked during pass1, the other to be invoked during pass2. The parameter
+that is passed is the size of the \special string. */
+
+int do_special_pass1 (p)
+int p;
+{
+ for (; p != 0; p--) getc(dvifile);
+ return(0);
+}
+
+/* Specials get put in a buffer for easier parsing. The buffer is a little
+longer than needed to make some things simpler. [[This ought to be
+cleaner.]] */
+
+#define MAXSPECIAL 1000
+
+GLOBAL char sb[MAXSPECIAL+7];
+GLOBAL int sbp,cstart;
+
+/* Do_special_pass2 gets called from the main program to perform special
+processing in pass2, the pass in which stuff actually gets written out to
+the LN3 output file. The parameter p is the length of the special. */
+
+int do_special_pass2 (p)
+int p;
+{
+ char c;
+ int i,j;
+
+/* Skip whitespace in input */
+
+ sbp = 0;
+ while (p != 0) {
+ c = getc(dvifile);
+ p--;
+ if (!isspace(c)) {
+ sb[sbp] = c;
+ sbp = 1;
+ break;
+ }
+ }
+ if (sbp == 0) return(1);
+
+/* Now we have non-whitespace, read the rest of the special, or as much as
+will fit in the buffer. Lowercase the stuff as it is read in. */
+
+ for (; p != 0; p--) {
+ sb[sbp] = tolower(getc(dvifile));
+ sbp++;
+ if (sbp > MAXSPECIAL) break;
+ }
+
+/* Put a null as sentinel at the end of the special. */
+
+ sb[sbp] = 0;
+
+/* Determine whether the special pertains to the ln03, in which case sbpf
+will contain "ln03" followed by whitespace or a colon. */
+
+ if (strncmp(sb,"ln03",sizeof("ln03")-1) != 0) return(1);
+ sbp = sizeof("ln03")-1;
+
+/* Skip whitespace and one colon */
+
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] != ':') return(1);
+ sbp++;
+
+/* Now, it might be that the special was too long for the special buffer,
+so check that out and issue an error message. */
+
+ if (p != 0) {
+ printf("\n \special too long (over %d bytes).",MAXSPECIAL);
+ for (; p != 0; p--) getc(dvifile);
+ return(1);
+ }
+
+/* Now determine if the special command is one of those which the driver is
+supposed to recognize. As in the DVIAPS program, only the first six bytes
+of the command are significant, so plotfile could be written plotfi and
+defpoint could be written defpoi. */
+
+ while (isspace(sb[sbp])) sbp++;
+ cstart = sbp;
+ while (!isspace(sb[sbp]) && sb[sbp] != '\0') sbp++;
+ sb[sbp] = 0;
+ sbp++;
+
+ for (i = 0; i<NUMSPECIALS; i++)
+ if (strncmp(&sb[cstart],specialnames[i],6) == 0) break;
+
+ if (i == NUMSPECIALS) {
+ printf("\n Unrecognized option '%s' ignored in \special command",
+ &sb[cstart]);
+ return(1);
+ } else {
+ switch (i) {
+ case 0:
+ j = do_defpoint_pass2();
+ break;
+ case 1:
+ j = do_connect_pass2();
+ break;
+ case 2:
+ j = do_plotfile_pass2();
+ case 3:
+ j = do_resetpoints();
+ }
+ }
+}
+
+/* In certain \specials, dimensions may be specified in any of nine
+different units of measure. */
+
+#define MAXUNITS 9
+
+GLOBAL char *unit_array[MAXUNITS] = { "pt", "in", "pc", "cm", "mm", "bp",
+ "dd", "cc", "mi" };
+
+/* Unit_convert gives a floating point conversion factor from units to
+pixels. [[The factor for micas is doubtful.]] */
+
+#define PIXELS_PER_INCH (300.0)
+
+GLOBAL float unit_convert[MAXUNITS] = { PIXELS_PER_INCH/72.27,
+ PIXELS_PER_INCH, 12.0*PIXELS_PER_INCH/72.27,
+ PIXELS_PER_INCH/2.54, PIXELS_PER_INCH/25.4,
+ PIXELS_PER_INCH/72.0, (1238.0/1157.0)*PIXELS_PER_INCH/72.27,
+ 12.0*(1238.0/1157.0)*PIXELS_PER_INCH/72.27, PIXELS_PER_INCH/2540.0 };
+
+/* There are 255 point variables, numbered 1 through 255. */
+
+#define MAXPOINTS 255
+
+GLOBAL int point_hh[MAXPOINTS], point_vv[MAXPOINTS];
+GLOBAL int point_present[MAXPOINTS];
+
+GLOBAL char *special_mess = "\n Error in \special{ln03:%s...} parameters";
+
+/* For the purposes of defpoint, we need to know the current horizontal and
+vertical positions in pixels. */
+
+EXTERN int hh,vv,hoff,voff;
+
+/* ln03:defpoint fixnum ( [dimension] , [dimension] ) */
+
+int do_defpoint_pass2()
+{
+ int i,which,hh_val,vv_val;
+ float xx_p,yy_p;
+
+ which = 0;
+ if (scan_fixnum(&which) != 0 || which < 1 || which > MAXPOINTS) {
+ printf(special_mess,"defpoint");
+ printf("\n Invalid point number (%d)",which);
+ return(1);
+ }
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ hh_val = hh;
+ vv_val = vv;
+ if (sb[sbp] != '(') goto record_point;
+ sbp++;
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '\0') goto record_point;
+ if (sb[sbp] == ',') sbp++;
+ else {
+ scan_dimension(&hh_val);
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == ',') sbp++;
+ else goto record_point;
+ }
+ while(isspace(sb[sbp])) sbp++;
+ if (sb[sbp] != ')' && sb[sbp] != '\0') scan_dimension(&vv_val);
+record_point:
+ point_hh[which-1] = hh_val;
+ point_vv[which-1] = vv_val;
+ point_present[which-1] = 1;
+ return(0);
+}
+
+EXTERN long first_counter;
+
+int do_connect_pass2()
+{
+ int a1,b1,a2,b2,w;
+
+ scan_xpoint(&a1,&b1);
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ scan_xpoint(&a2,&b2);
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ w = 2; /* default width is two pixels ~ 0.4 points */
+ if (sb[sbp] != '\0') scan_dimension(&w);
+
+ if (first_counter%2 == 0) connect_points(b1,b2,w);
+ else connect_points(a1,a2,w);
+
+ return(0);
+}
+
+EXTERN int ln3p,vpset,hh_old;
+
+int do_plotfile_pass2()
+{
+ char buf[512];
+ int i,j;
+ char c;
+
+/* Read filename into array. */
+
+ while (isspace(sb[sbp])) sbp++;
+ i = sbp;
+ while (!isspace(sb[sbp]) && sb[sbp] != '\0') sbp++;
+ sb[sbp] = 0;
+
+/* Try to open the file. [[What is the status of O_RDONLY under Unix? Is
+that a 4.2bsd hack that it would be best to leave out?]] */
+
+#ifdef vms
+ j = open(&sb[i],O_RDONLY,0);
+#else
+ j = open(&sb[i],0,0);
+#endif
+ if (j == -1) {
+ printf("\n Unable to open plotfile %s",&sb[i]);
+ return(1);
+ }
+
+/* In executing the plotfile special, always emit escape sequences to place
+the LN03 at the current position of the DVI file, even if it would seem
+that the LN03 is already there. We do this in order to be able to emit a
+newline at this point. Emitting a newline at this point keeps the line
+length of the .ln3 file to <= 16 characters more than the line length of
+the plotfile. */
+
+ fprintf(outfile,"\n\033[%dd\033[%d`",vv+voff,hh+hoff);
+
+/* Read stuff from the plotfile, write it to the output file. [[Could this
+cause problem with one record being split into two?]] */
+
+ while((i = read(j,buf,512)) > 0)
+ fwrite(buf,i,1,outfile);
+ close(j);
+
+/* Now, set the variables ln3p, vpset and hh_old to indicate to the caller
+that its recorded value of the current position of the LN03 is no longer
+correct. This will make the caller issue absolute positioning commands
+before doing any further output to the dvifile. */
+
+ ln3p = 0;
+ vpset = 0;
+ hh_old = 30000;
+ return(0);
+}
+
+
+/* Scan_fixnum reads an integer off sb[], starting at sbp and advancing sbp
+to the first character past a valid integer. The integer is returned in i.
+*/
+
+int scan_fixnum(i)
+long *i;
+{
+ int sbp_save;
+
+ sbp_save = sbp;
+ *i = atol(&sb[sbp]);
+ while(isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '+' || sb[sbp] == '-') sbp++;
+ while (isdigit(sb[sbp])) sbp++;
+ return(sbp == sbp_save);
+}
+
+
+/* Scan_flonum reads a flonum (without exponential notation) off sb[],
+starting at sbp and advancing sbp to the first character past a valid
+flonum. The flonum is returned in x. [[Unfortunately, it is impossible to
+use atof or sscanf to implement this function, because they don't allow
+flonums like ".3" which don't have any digits before the decimal point.]]
+*/
+
+int scan_flonum(x)
+float *x;
+{
+ float j,frac;
+ char negative;
+ int sbp_save;
+
+ sbp_save = sbp;
+ negative = 0;
+ j = 0.0;
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '-') { negative = 1; sbp++; }
+ else if (sb[sbp] == '+') sbp++;
+ while (isdigit(sb[sbp])) {
+ j = 10.0*j + ((float)(sb[sbp] - '0'));
+ sbp++;
+ }
+ if (sb[sbp] == '.') {
+ sbp++;
+ frac = 0.1;
+ while (isdigit(sb[sbp])) {
+ j += frac*((float)(sb[sbp] - '0'));
+ frac *= 0.1;
+ sbp++;
+ }
+ }
+ if (sbp != sbp_save) {
+ *x = negative ? (-j) : j;
+ return(0);
+ } else return(1);
+
+}
+
+
+/* Scan_dimension tries to parse a dimension off sb[], advancing sbp over
+what it can parse. The dimension is converted to pixels and returned in
+val. If the unit isn't recognizable, scan_dimension prints an error
+message, returns 1 and leaves val unchanged. */
+
+int scan_dimension(val)
+int *val;
+{
+ float x;
+ int i;
+
+ x = 0.0;
+ scan_flonum(&x);
+ while (isspace(sb[sbp])) sbp++;
+ for (i = 0; i<MAXUNITS; i++)
+ if (strncmp(&sb[sbp],unit_array[i],2) == 0) break;
+ if (i == MAXUNITS) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n No such unit of measure: %.2s",&sb[sbp]);
+ return(1);
+ }
+ sbp += 2;
+ x *= unit_convert[i];
+#ifdef vms
+ *val = (x < 0) ? floor(x-0.5) : floor(x+0.5);
+#else
+ *val = (x < 0) ? (x-0.5) : (x+0.5);
+#endif
+ return(0);
+}
+
+/* Scan_xpoint picks an xpoint off sb[], advancing sbp as usual. If both
+parts are present they are returned in a,b; if only one is, it's returned
+in both a and b. */
+
+int scan_xpoint(a,b)
+int *a,*b;
+{
+
+ *a = 0; *b = 0;
+ scan_fixnum(a);
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '/') {
+ sbp++;
+ scan_fixnum(b);
+ } else *b = *a;
+ return(0);
+}
+
+/* int do_rule(xx0,yy0,xx1,yy1) */
+
+int connect_points(b1,b2,w)
+int b1,b2;
+int w;
+{
+ int halfw;
+
+
+ if (b1 < 1 || b1 > MAXPOINTS || !point_present[b1-1]) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Invalid point number (%d)",b1);
+ return(1);
+ }
+ if (b2 < 1 || b2 > MAXPOINTS || !point_present[b2-1]) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Invalid point number (%d)",b2);
+ return(1);
+ }
+
+ halfw = w/2;
+ if (point_hh[b1-1] == point_hh[b2-1])
+ do_rule(point_hh[b1-1]-halfw,
+ point_vv[b1-1],point_hh[b1-1]+w-1-halfw,
+ point_vv[b2-1]);
+ else if (point_vv[b1-1] == point_vv[b2-1])
+ do_rule(point_hh[b1-1],
+ point_vv[b1-1]-halfw,point_hh[b2-1],
+ point_vv[b1-1]+w-1-halfw);
+ else {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Can't connect along a diagonal.");
+ return(1);
+ }
+ return(0);
+}
+
+int do_resetpoints ()
+{
+ int a,b;
+
+ a = 0;
+ scan_fixnum(&a);
+ b = 0;
+ scan_fixnum(&b);
+
+ if (0 < a && a <= b && b <= MAXPOINTS)
+ for (; a <= b; a++) point_present[a] = 0;
+ else if (0 < a && a <= MAXPOINTS)
+ point_present[a] = 0;
+ return(0);
+}
diff --git a/dviware/ln03/rose/toppnft.pli b/dviware/ln03/rose/toppnft.pli
new file mode 100644
index 0000000000..0ea9b4dd53
--- /dev/null
+++ b/dviware/ln03/rose/toppnft.pli
@@ -0,0 +1,654 @@
+%REPLACE true BY '1'B;
+%REPLACE false BY '0'B;
+%REPLACE maxnfonts BY 21;
+%REPLACE maxtexfonts BY 100;
+%REPLACE nblanks BY 0;
+%REPLACE leftfirst BY 33;
+%REPLACE leftlast BY 126;
+%REPLACE rightfirst BY 161;
+%REPLACE rightlast BY 254;
+
+/* This file contains those portions of LN03Topp that deal directly with
+the font file format (.NFT files). It is under development...
+
+Development chronology:
+
+11/28/84: Initial version. Wrote COPY_CHAR.
+
+11/29/84: GOOD_OPENING. Second thoughts about whole interface.
+ Merge the three functions into one.
+
+Copyright (c) 1983, 1984 by Digital Equipment Corporation. */
+
+/* The purpose of ADD_TXF_TO_LNF is to read an NFT file corresponding to
+TeX font TXFNO and place its rasters into the output font buffer. It
+returns the number of bytes by which the NFT file incremented the size of
+the output file, or a negative value to indicate lossage. */
+
+add_txf_to_lnf: PROCEDURE(lnfno,txfno,nftfname,outf) RETURNS(FIXED);
+
+ DCL nftfname CHAR(*);
+ DCL (txfno,lnfno) FIXED;
+ DCL outf FILE;
+
+ DCL (strip,frontstrip) EXTERNAL ENTRY (CHAR (*))
+ RETURNS (CHAR (*)),
+ cvis EXTERNAL ENTRY (FIXED) RETURNS (CHAR (*));
+
+ DCL lastch(0:maxnfonts) FIXED GLOBALREF;
+ DCL chw(0:maxnfonts,0:255) FIXED GLOBALREF;
+
+ DCL 1 txf BASED,
+ 2 nchs FIXED,
+ 2 chu(0:255) CHAR(1);
+ DCL txfa(0:maxtexfonts) PTR GLOBALREF;
+
+/* The buffer for the output fonts is currently of fixed size. Eventually
+it should be possible to chain a lot of these together so output fonts of
+unlimited size can be handled, subject only to virtual memory availability.
+*/
+
+ %REPLACE obuflen BY 131120;
+ DCL lnf(0:obuflen) CHAR(1) STATIC;
+ DCL (ras_len,psize,lsize,msize) FIXED STATIC;
+ DCL using_r BIT STATIC;
+
+/* Out of laziness, we read the entire input NFT file into a big array and
+then copy it. Obviously this is foolish; we should read it block by block
+only, and even use "random reading" if the RMS file type is suitable. */
+
+ DCL nfta(0:obuflen) CHAR(1);
+ DCL (i,j,k,nftlen) FIXED;
+
+ IF txfno < 0 | txfno > maxtexfonts | txfa(txfno) = Null() THEN
+ GOTO error_return;
+ IF lnfno < 0 | lnfno > maxnfonts THEN GOTO error_return;
+
+ PUT SKIP EDIT ('Loading font ' || nftfname) (A);
+
+ nftlen = 0;
+ CALL read_into_nfta;
+
+/* The NFT file comes to us in bytes. We need ways to understand it as
+words or longwords. When we need to parse some bytes as something, we copy
+them into the following overlaid variables. Note that unsigned quantities
+still require fixing. */
+
+ DCL longword FIXED;
+ DCL chars CHAR(4) BASED (Addr(longword));
+
+/* We make exactly one gratuitous test of NFT validity: the second longword
+must be 'FONT'. */
+
+ IF nfta(4) ^= 'F' | nfta(5) ^= 'O' | nfta(6) ^= 'N' | nfta(7) ^= 'T'
+ THEN GOTO bad_format;
+
+/* We also have to check that there are a full 16 bytes of character
+parameters. If there are fewer, we give up: it's too hard to figure out how
+to give the missing ones reasonable values. Maybe in the next version... */
+
+ %REPLACE fnt$l_parameters_size BY 200;
+ CALL nft_copy(fnt$l_parameters_size);
+ IF longword ^= 16 THEN GOTO bad_format;
+
+/* Figure out where the character directory in the NFT file begins */
+
+ %REPLACE fnt$a_char_directory BY 120;
+ DCL chardir_offset FIXED;
+
+/* CHARDIR_OFFSET should always equal 480. But we read it off the file
+anyway. */
+
+ CALL nft_copy(fnt$a_char_directory);
+ chardir_offset = longword;
+ IF chardir_offset <= 0 | chardir_offset > nftlen
+ THEN GOTO bad_format;
+
+/* Figure out what the lowest character in the NFT file is */
+
+ %REPLACE fnt$l_first_character BY 164;
+ DCL nft_first_ch FIXED;
+
+ nft_first_ch = rank(nfta(fnt$l_first_character));
+
+/* Now, determine if this is the first or last TXF which is being copied
+into this file. */
+
+ DCL (first_txfc,last_txfc) FIXED;
+ DCL (first_txf,last_txf) BIT;
+
+ first_txfc = -1; last_txfc = -1;
+ DO i = 0 TO 255;
+ IF txfa(txfno) -> chu(i) ^= byte(0) THEN DO;
+ IF first_txfc = -1 THEN first_txfc = rank(txfa(txfno) -> chu(i));
+ last_txfc = rank(txfa(txfno) -> chu(i));
+ END;
+ END;
+
+ IF first_txfc = -1 | last_txfc = -1 THEN DO;
+ PUT SKIP EDIT ('LN03Topp internal error - empty TXF passed to ' ||
+ 'ADD_TXF_TO_LNF') (A);
+ GOTO error_return;
+ END;
+
+ first_txf = (first_txfc = leftfirst+nblanks);
+ last_txf = (last_txfc = lastch(lnfno));
+
+/* If this is the first TXF, then we have to initialize the font buffer */
+
+ IF first_txf THEN DO;
+ using_r = false;
+ CALL initialize_lnf;
+ END;
+
+/* The initialization routine computes where the rasters begin in the
+output buffer, puts in the blanks, etc. */
+
+ DCL (lnf_chardir,ras_beg) FIXED STATIC;
+ DCL ras_len_added FIXED;
+
+ ras_len_added = 0;
+
+/* Now go through all the characters in the TeX font and copy them into the
+right position */
+
+ DO i = 0 TO 255;
+ IF txfa(txfno) -> chu(i) ^= byte(0)
+ THEN DO;
+ j = rank(txfa(txfno) -> chu(i));
+ IF ^using_r & j >= rightfirst THEN DO;
+ CALL write_lnf;
+ PUT SKIP EDIT (',') (A) FILE(outf);
+ using_r = true;
+ CALL initialize_lnf;
+ END;
+ CALL copy_char(i,j);
+ END;
+ END;
+
+/* If this is the last TXF for this LNF, write out the LNF. */
+
+ IF last_txf THEN CALL write_lnf;
+
+
+/* What we have to return is the incremental amount of space that the TXF
+takes up in the output font */
+
+ PUT EDIT (' with ' || cvis(ras_len_added+4*(txfa(txfno) -> nchs+nblanks))
+ || ' bytes of rasters ') (A);
+
+ RETURN(ras_len_added+4*(txfa(txfno) -> nchs+nblanks));
+
+error_return:
+ RETURN(-1);
+
+rasters_too_big:
+ RETURN(-2);
+
+bad_format:
+ RETURN(-3);
+
+ read_into_nfta: PROCEDURE;
+
+ DCL nftf FILE;
+ DCL nftline CHAR(512) VARYING;
+
+ ON ENDFILE (nftf) GOTO end_of_nftfile;
+ ON UNDEFINEDFILE (nftf) BEGIN;
+ PUT SKIP LIST('No such file:' || nftfname);
+ GOTO error_return;
+ END;
+
+ nftlen = 0;
+ OPEN FILE (nftf) TITLE (nftfname)
+ ENVIRONMENT(Default_file_name('TEX$LN03DIR:AMR10.NFT'))
+ RECORD;
+
+ DO WHILE (true);
+
+ READ FILE(nftf) INTO (nftline);
+ IF nftlen+length(nftline) > obuflen THEN DO;
+ PUT SKIP EDIT ('NFT file ' || nftfname || ' too large')
+ (A);
+ GOTO error_return;
+ END;
+ DO i = 1 TO length(nftline);
+ nfta(nftlen+i-1) = substr(nftline,i,1);
+ END;
+ nftlen = nftlen+length(nftline);
+
+ END;
+
+ end_of_nftfile:
+ CLOSE FILE (nftf);
+
+ END read_into_nfta;
+
+/* Copy the character corresponding to FROM out of NFTA and into the LNFR;
+update the CHW array. */
+
+ copy_char: PROCEDURE (from,to);
+ DCL (from,to,i,j) FIXED;
+ DCL (def_start,rows,columns,quo,len) FIXED;
+
+/* First we need to determine where the character definition for FROM
+begins in the NFTA array */
+
+ CALL nft_copy(chardir_offset+(from-nft_first_ch)*4);
+ def_start = longword;
+
+/* For the moment, if there is "no such character", we just stop.
+Eventually we should substitute some blank character or something. */
+
+ IF def_start < chardir_offset | def_start > nftlen THEN
+ GOTO bad_format;
+
+/* Now we need to check that the rasters are uncompressed. */
+
+ IF nfta(def_start+17) ^= byte(129) THEN DO;
+ PUT SKIP EDIT ('Can''t handle compressed rasters') (A);
+ GOTO bad_format;
+ END;
+
+/* Fill in the CHW array. Gutenberg to pixel conversion is necessary (there
+are 24 gutenbergs in a pixel), with rounding (hence the 12). */
+
+ CALL nft_copy(def_start+4);
+ chw(lnfno,to) = DIVIDE(longword+12,24,31);
+
+/* Because of the LN03's rounding algorithm, it is necessary also to
+change the value being copied to the rounded value */
+
+ longword = 24*chw(lnfno,to);
+ nfta(def_start+4) = substr(chars,1,1);
+ nfta(def_start+5) = substr(chars,2,1);
+ nfta(def_start+6) = substr(chars,3,1);
+ nfta(def_start+7) = substr(chars,4,1);
+
+/* Now we need to compute the size of the rasters, and copy that number of
+bytes into LNF as the case may be. */
+
+ rows = rank(nfta(def_start+20))+256*rank(nfta(def_start+21));
+ columns = rank(nfta(def_start+22))+256*rank(nfta(def_start+23));
+
+/* We have to update PSIZE, LSIZE and MSIZE to fill slots in the format. */
+
+ quo = DIVIDE(rows,8,31);
+ IF rows ^= quo*8 THEN quo = quo+1;
+ i = quo*columns;
+ lsize = lsize+quo*columns;
+ quo = DIVIDE(columns,8,31);
+ IF columns ^= quo*8 THEN quo = quo+1;
+ psize = psize+quo*rows;
+ IF i > quo*rows THEN msize = msize+i; ELSE msize = msize+quo*rows;
+
+/* Now do the actual copy */
+
+ IF MOD(rank(nfta(def_start+16)),2) = 0 THEN len = quo*rows;
+ ELSE len = i;
+ len = len+24;
+ DO i = 0 TO len-1;
+ lnf(ras_beg+ras_len+i) = nfta(def_start+i);
+ END;
+ longword = ras_len+ras_beg;
+ IF to <= leftlast THEN i = to-leftfirst; ELSE i = to-rightfirst;
+ lnf(lnf_chardir+4*i) = substr(chars,1,1);
+ lnf(lnf_chardir+4*i+1) = substr(chars,2,1);
+ lnf(lnf_chardir+4*i+2) = substr(chars,3,1);
+ lnf(lnf_chardir+4*i+3) = substr(chars,4,1);
+ ras_len = ras_len+len;
+ ras_len_added = ras_len_added+len;
+ IF MOD(ras_len,2) ^= 0 THEN DO;
+ ras_len = ras_len+1;
+ ras_len_added = ras_len_added+1;
+ END;
+
+ END copy_char;
+
+/* It would be much more efficient if the following were a macro. Later on
+maybe we'll do the macro expansion "by hand" in the code. */
+
+ nft_copy: PROCEDURE (index);
+ DCL index FIXED;
+
+ substr(chars,1,1) = nfta(index);
+ substr(chars,2,1) = nfta(index+1);
+ substr(chars,3,1) = nfta(index+2);
+ substr(chars,4,1) = nfta(index+3);
+
+ END nft_copy;
+
+/* write_lnf performs the last fixups to the lnf buffer and dumps it,
+sixelized, into the OUTF. */
+
+ write_lnf: PROCEDURE;
+
+ DCL preline CHAR(96);
+ DCL (i,j,k,rem,quo,ma) FIXED;
+
+/* We now have to fix a number of slots: size of file, length of rasters,
+final 'FONT', psize, lsize, msize. */
+
+ longword = ras_beg+ras_len+8;
+ lnf(0) = substr(chars,1,1);
+ lnf(1) = substr(chars,2,1);
+ lnf(2) = substr(chars,3,1);
+ lnf(3) = substr(chars,4,1);
+ lnf(longword-8) = substr(chars,1,1);
+ lnf(longword-7) = substr(chars,2,1);
+ lnf(longword-6) = substr(chars,3,1);
+ lnf(longword-5) = substr(chars,4,1);
+ lnf(longword-4) = 'F';
+ lnf(longword-3) = 'O';
+ lnf(longword-2) = 'N';
+ lnf(longword-1) = 'T';
+
+/* Length of rasters */
+
+ %REPLACE fnt$l_char_definitions_length BY 156;
+ longword = ras_len;
+ lnf(fnt$l_char_definitions_length) = substr(chars,1,1);
+ lnf(fnt$l_char_definitions_length+1) = substr(chars,2,1);
+ lnf(fnt$l_char_definitions_length+2) = substr(chars,3,1);
+ lnf(fnt$l_char_definitions_length+3) = substr(chars,4,1);
+
+ %REPLACE fnt$l_portrait_byte_count BY 228;
+ %REPLACE fnt$l_landscape_byte_count BY 232;
+ %REPLACE fnt$l_mixed_byte_count BY 236;
+
+ longword = psize;
+ lnf(fnt$l_portrait_byte_count) = substr(chars,1,1);
+ lnf(fnt$l_portrait_byte_count+1) = substr(chars,2,1);
+ lnf(fnt$l_portrait_byte_count+2) = substr(chars,3,1);
+ lnf(fnt$l_portrait_byte_count+3) = substr(chars,4,1);
+
+ longword = lsize;
+ lnf(fnt$l_landscape_byte_count) = substr(chars,1,1);
+ lnf(fnt$l_landscape_byte_count+1) = substr(chars,2,1);
+ lnf(fnt$l_landscape_byte_count+2) = substr(chars,3,1);
+ lnf(fnt$l_landscape_byte_count+3) = substr(chars,4,1);
+
+ longword = msize;
+ lnf(fnt$l_mixed_byte_count) = substr(chars,1,1);
+ lnf(fnt$l_mixed_byte_count+1) = substr(chars,2,1);
+ lnf(fnt$l_mixed_byte_count+2) = substr(chars,3,1);
+ lnf(fnt$l_mixed_byte_count+3) = substr(chars,4,1);
+
+/* Now sixelize and write the contents of LNF. */
+
+ CALL sixelize_and_write(ras_beg+ras_len+8);
+
+ sixelize_and_write: PROCEDURE (howmuch);
+ DCL (howmuch,quo,i,j) FIXED;
+
+ quo = DIVIDE(howmuch,96,31);
+ IF howmuch > quo*96 THEN quo = quo+1;
+
+ DO i = 1 TO quo;
+ DO j = 1 TO 96;
+ substr(preline,j,1) = lnf(96*(i-1)+j-1);
+ END;
+ CALL write_preline;
+ END;
+
+ END sixelize_and_write;
+
+ write_preline: PROCEDURE;
+ DCL sixel_line CHAR(128) VARYING;
+ DCL (ix,pllen) FIXED;
+
+ pllen = 96;
+
+ ix = 1;
+ sixel_line = copy('?',128);
+ DO i = 1 TO pllen BY 3;
+ DCL cha CHAR(1);
+ DCL chb BIT(8) BASED (addr(cha));
+ DCL chc FIXED(7) BASED (addr(cha));
+ DCL ocha CHAR(1);
+ DCL ochb BIT(8) BASED(addr(ocha));
+
+ chc = 0;
+ ocha = substr(preline,i,1);
+ substr(chb,1,6) = substr(ochb,3,6);
+ chc = chc + 63;
+ substr(sixel_line,ix,1) = cha;
+ ix = ix+1;
+ chc = 0;
+ substr(chb,5,2) = substr(ochb,1,2);
+ ocha = substr(preline,i+1,1);
+ substr(chb,1,4) = substr(ochb,5,4);
+ chc = chc + 63;
+ substr(sixel_line,ix,1) = cha;
+ ix = ix+1;
+ chc = 0;
+ substr(chb,3,4) = substr(ochb,1,4);
+ ocha = substr(preline,i+2,1);
+ substr(chb,1,2) = substr(ochb,7,2);
+ chc = chc + 63;
+ substr(sixel_line,ix,1) = cha;
+ ix = ix+1;
+ chc = 0;
+ substr(chb,1,6) = substr(ochb,1,6);
+ chc = chc + 63;
+ substr(sixel_line,ix,1) = cha;
+ ix = ix+1;
+ END;
+ PUT SKIP EDIT (sixel_line) (A) FILE(outf);
+
+ END write_preline;
+
+ END write_lnf;
+
+/* Initializes the LNF buffer. */
+
+ initialize_lnf: PROCEDURE;
+
+ DCL (i,j) FIXED;
+
+/* The following array holds good values for bytes 0-479 of an LN03 format
+font. */
+
+ DCL good_opening(0:511) FIXED STATIC INIT(
+ 104,38,0,0,70,79,78,84,
+ 1,0,0,0,31,0,0,0,
+ 20,0,0,0,85,48,48,48,
+ 48,48,48,48,48,50,83,75,
+ 48,48,71,71,48,48,48,49,
+ 85,90,90,90,90,48,50,70,
+ 48,48,48,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 181,7,9,0,11,0,14,0,
+ 0,0,0,0,104,0,0,0,
+ 252,0,0,0,124,0,0,0,
+ 100,1,0,0,120,1,0,0,
+ 224,1,0,0,4,0,0,0,
+ 88,3,0,0,0,0,0,0,
+ 92,3,0,0,48,0,0,0,
+ 92,3,0,0,0,0,0,0,
+ 140,3,0,0,212,34,0,0,
+ 140,3,0,0,33,0,0,0,
+ 126,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 32,0,0,0,168,0,0,0,
+ 16,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,236,25,0,0,
+ 54,25,0,0,14,27,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,0,0,0,
+ 7,0,0,0,92,3,0,0,
+ 7,0,0,0,99,3,0,0,
+ 16,0,0,0,106,3,0,0,
+ 16,0,0,0,122,3,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 10,0,0,0,244,1,0,0,
+ 0,0,24,0,16,0,0,0,
+ 16,0,0,0,1,0,1,0,
+ 1,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 30,0,0,0,20,0,0,0,
+ 196,255,255,255,20,0,0,0,
+ 106,255,255,255,20,0,0,0,
+ 0,0,1,0,0,0,30,0,
+ 166,255,255,255,0,0,0,0,
+ 40,0,0,0,0,0,0,0,
+ 60,0,0,0,240,0,0,0,
+ 60,0,0,0,100,0,0,0,
+ 240,0,0,0,120,0,0,0,
+ 40,0,0,0,120,0,0,0,
+ 96,255,255,255,136,255,255,255,
+ 186,255,255,255,240,0,0,0,
+ 76,255,255,255,60,0,0,0,
+ 160,0,0,0,120,0,0,0,
+ 20,0,0,0,20,0,0,0,
+ 140,3,0,0,194,3,0,0,
+ 244,3,0,0,160,4,0,0,
+ 254,4,0,0,162,5,0,0,
+ 46,6,0,0,84,6,0,0);
+
+ lnf_chardir = 480; /* Fixed */
+
+ /* Clear out LNF */
+
+ lnf = byte(0);
+ ras_len = 0;
+ psize = 0;
+ lsize = 0;
+ msize = 0;
+
+ /* Copy the good values into LNF */
+
+ DO i = 0 TO 479;
+ lnf(i) = byte(good_opening(i));
+ END;
+
+ /* Set the last character if necessary */
+
+ IF lastch(lnfno) < leftlast & ^using_r
+ THEN lnf(fnt$l_first_character+4) = byte(lastch(lnfno));
+ IF using_r
+ THEN lnf(fnt$l_first_character+4) = byte(lastch(lnfno)-rightfirst+
+ leftfirst);
+
+ /* Set the character counts */
+
+ %REPLACE fnt$l_infile_locators BY 204;
+ %REPLACE fnt$l_character_definitions BY 212;
+ %REPLACE fnt$l_raster_count BY 220;
+
+ i = rank(lnf(fnt$l_first_character+4))-
+ rank(lnf(fnt$l_first_character))+1;
+ ras_beg = lnf_chardir + 4*i + 4 + 48;
+ lnf(fnt$l_infile_locators) = byte(i);
+ lnf(fnt$l_character_definitions) = byte(i);
+ lnf(fnt$l_raster_count) = byte(i);
+
+/* Set the font file id. The font family is dependent on the value of
+LNFNO, U0000nn where nn is LNFNO possibly with a leading zero. The
+character set is 1O if USING_R, otherwise the default from GOOD_OPENING. */
+
+ %REPLACE fnt$t_font_file_id BY 20;
+
+ lnf(fnt$t_font_file_id+5) = byte(DIVIDE(lnfno,10,31)+rank('0'));
+ lnf(fnt$t_font_file_id+6) = byte(MOD(lnfno,10)+rank('0'));
+ IF using_r
+ THEN lnf(fnt$t_font_file_id+20) = 'O';
+
+/* Set various offsets which are dependent on the number of characters in
+the font file. */
+
+ %REPLACE fnt$a_subset_tables BY 128;
+ longword = lnf_chardir+4*i;
+ lnf(fnt$a_subset_tables) = substr(chars,1,1);
+ lnf(fnt$a_subset_tables+1) = substr(chars,2,1);
+ lnf(fnt$a_subset_tables+2) = substr(chars,3,1);
+ lnf(fnt$a_subset_tables+3) = substr(chars,4,1);
+
+ longword = longword+4;
+ lnf(fnt$a_subset_tables+8) = substr(chars,1,1);
+ lnf(fnt$a_subset_tables+9) = substr(chars,2,1);
+ lnf(fnt$a_subset_tables+10) = substr(chars,3,1);
+ lnf(fnt$a_subset_tables+11) = substr(chars,4,1);
+ lnf(fnt$a_subset_tables+16) = substr(chars,1,1);
+ lnf(fnt$a_subset_tables+17) = substr(chars,2,1);
+ lnf(fnt$a_subset_tables+18) = substr(chars,3,1);
+ lnf(fnt$a_subset_tables+19) = substr(chars,4,1);
+
+ longword = longword+48;
+ lnf(fnt$a_subset_tables+24) = substr(chars,1,1);
+ lnf(fnt$a_subset_tables+25) = substr(chars,2,1);
+ lnf(fnt$a_subset_tables+26) = substr(chars,3,1);
+ lnf(fnt$a_subset_tables+27) = substr(chars,4,1);
+
+ %REPLACE fnt$a_char_definitions BY 160;
+ lnf(fnt$a_char_definitions) = substr(chars,1,1);
+ lnf(fnt$a_char_definitions+1) = substr(chars,2,1);
+ lnf(fnt$a_char_definitions+2) = substr(chars,3,1);
+ lnf(fnt$a_char_definitions+3) = substr(chars,4,1);
+
+/* Set up the string pool (48 bytes). */
+
+ DCL pool_beg FIXED;
+
+ pool_beg = ras_beg-48;
+
+ lnf(pool_beg) = '0';
+ IF using_r THEN lnf(pool_beg+1) = '<'; ELSE lnf(pool_beg+1) = 'B';
+ lnf(pool_beg+2) = byte(9);
+ lnf(pool_beg+3) = 'Z';
+ lnf(pool_beg+4) = 'Z';
+ lnf(pool_beg+5) = 'Z';
+ lnf(pool_beg+6) = 'Z';
+
+ DO i = 1 TO 7;
+ lnf(pool_beg+7+i-1) = lnf(fnt$t_font_file_id+i-1);
+ END;
+ DO i = 1 TO 16;
+ lnf(pool_beg+7+7+i-1) = ' ';
+ END;
+ DO i = 1 TO 16;
+ lnf(pool_beg+7+7+16+i-1) = lnf(fnt$t_font_file_id+i-1);
+ END;
+
+/* Now make string descriptors point into the string pool. */
+ %REPLACE fnt$a_char_set BY 260;
+ %REPLACE fnt$a_family_id BY 268;
+ %REPLACE fnt$a_family_name BY 276;
+ %REPLACE fnt$a_font_id BY 284;
+
+ longword = pool_beg;
+ lnf(fnt$a_char_set) = substr(chars,1,1);
+ lnf(fnt$a_char_set+1) = substr(chars,2,1);
+ lnf(fnt$a_char_set+2) = substr(chars,3,1);
+ lnf(fnt$a_char_set+3) = substr(chars,4,1);
+ longword = pool_beg+7;
+ lnf(fnt$a_family_id) = substr(chars,1,1);
+ lnf(fnt$a_family_id+1) = substr(chars,2,1);
+ lnf(fnt$a_family_id+2) = substr(chars,3,1);
+ lnf(fnt$a_family_id+3) = substr(chars,4,1);
+ longword = pool_beg+7+7;
+ lnf(fnt$a_family_name) = substr(chars,1,1);
+ lnf(fnt$a_family_name+1) = substr(chars,2,1);
+ lnf(fnt$a_family_name+2) = substr(chars,3,1);
+ lnf(fnt$a_family_name+3) = substr(chars,4,1);
+ longword = pool_beg+7+7+16;
+ lnf(fnt$a_font_id) = substr(chars,1,1);
+ lnf(fnt$a_font_id+1) = substr(chars,2,1);
+ lnf(fnt$a_font_id+2) = substr(chars,3,1);
+ lnf(fnt$a_font_id+3) = substr(chars,4,1);
+
+/* Mercifully, all remaining font file slots that we can fill now are
+already good as received from GOOD_OPENING. */
+
+ END initialize_lnf;
+
+END add_txf_to_lnf;
diff --git a/dviware/ln03/thomas/clink.opt b/dviware/ln03/thomas/clink.opt
new file mode 100644
index 0000000000..38bdd8508a
--- /dev/null
+++ b/dviware/ln03/thomas/clink.opt
@@ -0,0 +1,3 @@
+ln03dvi.obj,ln03specials.obj,ln03fonts.obj,ln03version.obj,-
+pk.obj,pkgbl.obj
+sys$share:vaxcrtl/share
diff --git a/dviware/ln03/thomas/descrip.mms b/dviware/ln03/thomas/descrip.mms
new file mode 100644
index 0000000000..7716e607c9
--- /dev/null
+++ b/dviware/ln03/thomas/descrip.mms
@@ -0,0 +1,26 @@
+CFLAGS = $(CFLAGS)/DEBUG
+LINKFLAGS = $(LINKFLAGS)
+
+PKOBJECTS = PK.OBJ, PKGBL.OBJ
+LN3OBJECTS = LN03DVI.OBJ, LN03FONTS.OBJ, LN03SPECIALS.OBJ, LN03VERSION.OBJ
+PKSOURCES = PK.C, PKGBL.C
+LN3SOURCES = LN03DVI.C, LN03FONTS.C, LN03SPECIALS.C, LN03VERSION.C
+
+LN03DVI.EXE : CLINK.OPT DESCRIP.MMS $(LN3OBJECTS), $(PKOBJECTS)
+ $(LINK) $(LINKFLAGS) CLINK/OPTIONS
+
+LN03DVI-PCA.EXE : CLINK.OPT DESCRIP.MMS $(LN3OBJECTS), $(PKOBJECTS)
+ $(LINK) $(LINKFLAGS) CLINK/OPTIONS/DEBUG=SYS$LIBRARY:PCA$OBJ
+
+LN03DVI-DEBUG.EXE : CLINK.OPT DESCRIP.MMS $(LN3OBJECTS), $(PKOBJECTS)
+ $(LINK) $(LINKFLAGS) CLINK/OPTIONS/DEBUG
+
+$(LN3OBJECTS) :
+LN03FONTS.OBJ : PK.H
+$(PKOBJECTS) : PK.H
+$(LN3SOURCES) :
+$(PKSOURCES) :
+
+.LAST :
+ @ IF F$SEARCH("*.ANA") .NES. "" THEN DELETE *.ANA;*/LOG/NOCONF
+ @ IF F$SEARCH("*.DIA") .NES. "" THEN DELETE *.DIA;*/LOG/NOCONF
diff --git a/dviware/ln03/thomas/ln03dvi.c b/dviware/ln03/thomas/ln03dvi.c
new file mode 100644
index 0000000000..26dd796b6d
--- /dev/null
+++ b/dviware/ln03/thomas/ln03dvi.c
@@ -0,0 +1,1932 @@
+/* Ln03DVI translates a TeX DVI file to an LN03 format file.
+
+Ln03DVI is still being developed. Copyright (c) 1985, 1986, 1987
+by Digital Equipment Corporation, Maynard, Massachusetts,
+USA. Originial Author: Flavio Rose (...!decwrl!dvinci.dec.com!rose)
+
+This version of Ln03DVI is maintained by Matt Thomas.
+Please send all bug reports to either:
+ ...!decwrl!thebay.dec.com!mthomas (UUCP)
+ mthomas@thebay.dec.com (Internet) */
+
+/* Dvi2ln3 is based on the publicly-available program DVItype,
+written by David R. Fuchs of Stanford University; and also
+on earlier DEC programs, Dvi2lng, Topp and LN03Topp, for the
+LN01 and LN03 laser printers. This program is not a DEC
+product and is not guaranteed to work.
+
+Dvi2ln3 is written in VAX C. Specific VAX and VMS
+dependencies have generally been avoided, however. The
+reader may find them by searching for the strings VAX and
+VMS in this file.
+
+During development, double square brackets [[ ]] in a
+comment indicate some places where the code needs to be
+improved.
+
+[[Among the useful things that still need to be done:
+differentiating between int and long variables so this can
+be ported more easily to 16-bit architectures; testing to
+see if malloc returns 0; a \special for ROM fonts.]]
+
+Development history:
+
+Feb. 85: Did some early work on Dvi2ln3, translating bits
+ and pieces of Dvi2lng. Concluded, however, that it
+ was better to translate LN03Topp and Dvi2lng into
+ C first. The reason for this is that code which
+ mimics an existing program is easier to write and
+ to test.
+
+5/15/85: At this date, the old LN03Topp program has been
+ successfully translated into C (except for the
+ ability to read files over DECnet). At this point,
+ did some further cleanup of the Dvi2ln3 source.
+
+6/4/85: Coding of Dvi2ln3 begins in earnest. Merging bits
+ and pieces from various places. Chucking chunks
+ and all that junk from LN03Topp; pass2 is just
+ straightforward translation.
+
+6/22/85: Cleanup after initial debugging. Ready to
+ distribute.
+
+10/8/85: Adding \special's to imitate Textset's DVIAPS program.
+ Corrected bug in parsing of \specials. Version 1.
+
+10/15/85: More changes for specials. Version 2.
+
+11/8/85: Fixed bug in ln03:defpoint \special. Version 3.
+
+11/15/85: Changed way information about font size is passed
+ back by add_txf_to_lnf. Add PXL-reading
+ capability. Version 4.
+
+11/21/85: Error handling has been reformed. Still version 4.
+
+12/12/85: Bug correction in handling of plotfile special.
+ Version 5.
+
+1/7/86: Clear all fonts from memory at beginning of
+ document. Version 6.
+
+1/16/86: Fixed bug in dvi2ln3nft.c, nftf was not being
+ closed after use. Version 7. (Bug found by Mark
+ DeVries.)
+
+3/4/86: Support for landscape added -- very easy, if only
+ I had known. Fixed bug found by Mark DeVries,
+ error returned if \special selects device other
+ than LN03. Version 8.
+
+3/28/86: Conditionalization for Ultrix. #ifndef vms ==
+ #ifdef ultrix. Still emits 8-bit characters.
+ Should be unchanged under VMS. getenv is used to
+ replace logicals. Version 9.
+
+4/4/86: Added support for 7-bit only environments,
+ conditionalized on the SEVENBIT symbol. Still
+ version 9.
+
+4/16/86: Final changes to make compilation under Ultrix
+ clean. Still version 9.
+
+6/27/86: Finally added option for A4-sized paper. Version
+ 10.
+
+11/6/86: Bug when /n= is specified and /s= is not. Fixed
+ rule computation. Version 11.
+
+02/20/87: Clean up messages. Add PK file support to DVI2LN3NFT.C.
+ Genericize the PK file support. Rename from Dvi2ln3 to
+ Ln03DVI to keep this version indepedent of the original.
+ Prepare/cleanup for realease on the Unix-Tex distribution.
+
+5/18/87: Move version info to a seperate file, ln03version.c.
+*/
+
+#ifdef vms
+#include stdio
+#include ctype
+#else
+#include <stdio.h>
+#include <ctype.h>
+#endif
+
+/* Ultrix seems to want this: */
+
+#ifdef bsd4_2
+# define strchr index
+extern int errno;
+#endif
+
+#ifndef vms
+char *strchr(), *malloc(), *getenv();
+# define SEVENBIT 1
+#endif
+
+/* The version information */
+
+extern char ln03dvi_version[];
+
+
+/* In VMS, we declare all global variables to be globaldef.
+This is not really necessary, just an old habit from working
+with other VMS languages. It's done with #define's, so it
+may easily be undone when porting the program to other
+systems. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+
+/* Here begins a long list of global variables. */
+
+/* hoff is the horizontal offset in pixels to be added to
+all dimensions read in; voff is the corresponding vertical
+offset. */
+
+GLOBAL int hoff, voff;
+GLOBAL FILE *tfmfile,*outfile;
+GLOBAL int dvifile;
+
+/* [[We are finally implementing the speed optimization of
+eliminating getc's on dvifile. Hence the following:]] */
+
+GLOBAL unsigned char dvibuf[513];
+GLOBAL int dvifp,dvieof;
+#define mygetcdvi ((dvifp < 512) ? dvibuf[dvifp++] : \
+ moredvi())
+
+/* Each page in a DVI file is identified by ten longwords,
+which appear immediately after each bop (beginning of page)
+command. Ln03DVI, like DVItype, supports certain options
+that allow one to print only selected pages. The following
+variables are used for this purpose.
+
+Num_pages is a count of how many pages have been passed to
+the output. Max_pages is the user-specified maximum number
+of pages to pass. How_many_counts denotes the number of
+identifying longwords to take into account when searching
+for the user-specified starting page. The user specifies the
+starting page as the first one whose identifying longwords
+match certain specified values, stored in start_page.
+However, identifying longword i is only required to match
+the value in start_page[i] if use_count[i] is nonzero. */
+
+GLOBAL long int num_pages,max_pages;
+GLOBAL int how_many_counts,use_count[10];
+GLOBAL long int start_page[10];
+
+/* When the output file can have no characters with code >
+127, the user should employ a LN03DVI which is recompiled
+with the symbol SEVENBIT defined. Such a Ln03DVI will run slower
+than one which is allowed eight bits, and produce larger
+output files. */
+
+#ifdef SEVENBIT
+GLOBAL int right7;
+#endif
+
+/* FILESPECLEN is the maximum size of a file specification
+under VMS. [[Perhaps arrays of fixed size should not be
+used, but rather malloc should be employed...]] */
+
+#define FILESPECLEN 252
+
+/* landscape says whether we are printing in landscape or
+portrait. */
+
+GLOBAL char landscape;
+
+/* a4_paper says whether we are printing on a4 paper. */
+
+GLOBAL char a4_paper;
+
+/* The main routine deals with the command line arguments,
+opens the dvi file, and then calls various other routines to
+handle the "passes". There are two passes, each of which
+involves reading the DVI file from start to finish; in
+between, the font load is constructed. */
+
+main(argc,argv)
+int argc;
+char *argv[];
+{
+ int status,i,jnam,jext;
+ char infnam[FILESPECLEN];
+
+ if (argc < 2) {
+ printf("Usage:\tln03dvi [options] dvifile\n");
+ printf(" -h hoffset\t\t(horizontal offset in pixels)\n");
+ printf(" -v voffset\t\t(vertical offset in pixels)\n");
+ printf(" -s XYX\t\t(starting page number)\n");
+ printf(" -n pages\t\t(number of pages)\n");
+ printf(" -l\t\t\t(landscape mode)\n");
+ printf(" -e\t\t\t(european A4 paper)\n");
+ goto exit_label;
+ }
+
+ printf("\n\tLn03DVI %s\n\n",ln03dvi_version);
+
+/* Now decipher the options off the command line. */
+
+#ifdef SEVENBIT
+ right7 = 0;
+#endif
+ max_pages = 1000000000;
+ how_many_counts = 0;
+ hoff = 300;
+ voff = 300;
+ landscape = 0;
+ a4_paper = 0;
+ for (i=1; i<argc; i++) {
+
+ /* The extension of the input file defaults to .dvi. Locate
+ the filename field within the filespec parameter, set jname
+ to point to beginning, jext to point to one place after end.
+ [[This code is of course dependent on the VMS filespec
+ syntax.]] */
+
+ if (argv[i][0] == '-') {
+ i += command_line_option( &argv[i], argc-i );
+ } else {
+ strcpy(infnam,argv[i]);
+
+ /* The extension of the input file defaults to .dvi. Locate
+ the filename field within the filespec parameter, set jname
+ to point to beginning, jext to point to one place after end.
+ [[This code is of course dependent on the VMS filespec
+ syntax.]] */
+
+ find_filename(infnam,&jnam,&jext);
+ if (infnam[jext] == '\0') strcat(infnam,".dvi");
+ dvifile = open(infnam,0);
+ if (dvifile < 0) {
+ fprintf(stderr,"Couldn't open dvi file ");
+ perror(infnam);
+ goto exit_label;
+ }
+ dvieof = 0;
+ dvifp = 512;
+ }
+ }
+
+/* Now do the passes */
+
+ status = pass1();
+ if (status != 0) goto exit_label;
+#ifdef vms || bsd4_2
+ if (lseek(dvifile,0,0) == -1) {
+ printf("\n Couldn't rewind dvi file.");
+ goto exit_label;
+ }
+#else
+ lseek(dvifile,0,0);
+#endif
+ dvieof = 0;
+ dvifp = 512;
+
+ status = open_output_file(infnam,jnam,jext,".ln3");
+ if (status != 0) { perror("Couldn't open output file");
+ goto exit_label; }
+
+ status = make_font_load();
+ if (status != 0) goto exit_label;
+
+ pass2();
+ printf("\n");
+
+ fprintf(outfile,"\033[!p");
+ close(dvifile);
+ fclose(outfile);
+
+exit_label:
+/*
+#ifndef vms
+ printf("\n");
+#endif
+*/
+ ;
+}
+
+/* Find_filename finds the filename part of a filespec
+passed in s, returning the index of the first character in
+*ns, and the index of the character after the last in *ne.
+[[This works under VMS and Unix. MS-DOS still needs work.]]
+*/
+
+int find_filename(s,ns,ne)
+char s[];
+int *ns,*ne;
+{
+ int jnam,jext,j,slen;
+
+ slen = strlen(s);
+ jnam = 0;
+ for (j = slen-1; j >= 0; j--) {
+#ifdef vms
+ if (s[j] == ':' || s[j] == ']' ||
+ s[j] == '>') {
+#else
+ if (s[j] == '/') {
+#endif
+ jnam = j+1;
+ break;
+ }
+ }
+
+ jext = slen;
+ for (j = jnam; j < slen; j++) {
+#ifdef vms
+ if (s[j] == '.' || s[j] == ';') {
+#else
+ if (s[j] == '.') {
+#endif
+ jext = j;
+ break;
+ }
+ }
+
+ *ns = jnam;
+ *ne = jext;
+}
+
+/* Moredvi reads up to 512 bytes from the dvi file and puts
+them in the dvibuf. It also returns the first byte. Any
+missing bytes are filled in with 248, the dvi command code
+for the postamble.
+
+[[The read is not retried. Thus, the dvifile must be either
+stream or fixed-length 512 byte records for this to work.
+TeX-generated dvi files have fixed-length 512 byte
+records.]] */
+
+unsigned char moredvi() {
+ int i,j;
+
+ i = read(dvifile,dvibuf,512);
+ dvifp = 1;
+ if (i <= 0) {
+ dvieof = 1;
+ for (j=0; j<512; j++) dvibuf[j] = 248;
+ return(248);
+ } else if (i < 512)
+ for (j=i; j<512; j++) dvibuf[j] = 248;
+ return(dvibuf[0]);
+}
+
+
+/* ERROR HANDLING: Errors should be reported as close to the
+source as possible, so that the maximum amount of
+information is available to the user to identify the error.
+
+Errors in the format of DVI or TFM files are not reported
+specifically, since there exist programs, DVItype and
+TFtoPL, which diagnose errors in such files. This program
+accepts some incorrect DVI files, for example, those with a
+bad postamble or bad backpointers. [[However, someday we may
+rewrite the program to select pages by using these features
+of the DVI format, rather than by skipping unwanted pages.]]
+*/
+
+GLOBAL char *bad_DVI_message = "Bad DVI file - check it with DVItype\n";
+
+/* Command_line_option reads and processes options off the
+argument list. At this time, six options are supported.
+
+The N option sets the maximum number of pages to be printed.
+Its syntax is /N=<integer> .
+
+The H option modifies the default horizontal offset.
+
+The V option modifies the default vertical offset.
+
+The S option has syntax /S=<pagespec>{.<pagespec>}* where
+the {}* denotes repetition, and a <pagespec> is either an
+integer or * to indicate any value. An example would be
+"/S=*.8.3".
+
+The meaning of the S option is as follows: In a DVI file,
+pages are identified by ten longword values which follow
+each bop (beginning of page) command. The value of the S
+option indicates which page to start printing on. For
+example, "*.8.3" means start printing at the first page
+whose second identifying longword is 8 and third is 3.
+
+The L option says print in landscape.
+
+The E (for European) option says print on A4 paper. */
+
+int command_line_option( argv, argc )
+char **argv;
+int argc;
+{
+ long int i = 0, k;
+ char *u;
+ char *t = &argv[0][1];
+
+ if (toupper(t[0]) == 'N') {
+ if (isdigit(t[1]))
+ sscanf(&t[2], "%ld", &k);
+ else {
+ sscanf(argv[1], "%ld", &k );
+ i += 1;
+ }
+ max_pages = k;
+ } else if (toupper(t[0]) == 'H') {
+ if (isdigit(t[1]))
+ sscanf(&t[2], "%ld", &k);
+ else {
+ sscanf(argv[1], "%ld", &k );
+ i += 1;
+ }
+ hoff = k;
+ } else if (toupper(t[0]) == 'V') {
+ if (isdigit(t[1]))
+ sscanf(&t[2], "%ld", &k);
+ else {
+ sscanf(argv[1], "%ld", &k );
+ i += 1;
+ }
+ voff = k;
+ } else if (toupper(t[0]) == 'L') {
+ landscape = 1;
+ } else if (toupper(t[0]) == 'E') {
+ a4_paper = 1;
+ } else if (toupper(t[0]) == 'S') {
+ if (t[1] == 0) {
+ t = argv[1];
+ i++;
+ }
+ how_many_counts = 0;
+ for (;;) {
+ if (t[0] == '*') {
+ use_count[how_many_counts] = 0;
+ how_many_counts++;
+ } else if (sscanf(t,"%ld",&k) != 0) {
+ use_count[how_many_counts] = 1;
+ start_page[how_many_counts] = k;
+ how_many_counts++;
+ } else break;
+ u = strchr(t,'.');
+ if (u == 0) break;
+ t = &u[1];
+ }
+ }
+ return(i);
+}
+
+/* Open_output_file opens one of the output files, using the
+file pointer outfile. The name of the output file is
+obtained by appending the string ext to the substring of
+infnam beginning at jnam and ending at jext.
+
+[[This code contains a VMS dependency. We use creat followed
+by fdopen to open the file as a normal VMS file
+("rat=cr","rfm=var") rather than a STREAM_LF file. Beginning
+with VAX C V2.0, this can be done by just calling fopen.]]
+*/
+
+int open_output_file(infnam,jnam,jext,ext)
+char *infnam,*ext;
+int jnam,jext;
+{
+ char outfnam[FILESPECLEN];
+ int jj;
+
+ strcpy(outfnam,&infnam[jnam]);
+ strcpy(&outfnam[jext-jnam],ext);
+
+#ifdef vms
+ jj = creat(outfnam,0,"rat=cr","rfm=var");
+#else
+ jj = creat(outfnam,0644);
+#endif
+ if (jj == -1) return(1);
+ outfile = fdopen(jj,"w");
+ if (outfile == NULL) return(1);
+
+ return(0);
+}
+
+/* We use an overlay, as suggested in the DVItype
+documentation, to combine these bytes into larger integers.
+[[Note that this technique relies on the fact that numbers
+on the VAX are stored with the least significant byte first.
+The macros below would have to be changed if the program
+were to be ported to a machine architecture for which this
+is not so.]]
+
+[[The use of getc is expensive, since getc is a function in
+VAX C V2.0. Eventually, one would want to rewrite these
+macros to work like the old getc macro.]] */
+
+#ifdef BIG_ENDIAN
+/* For Sun's */
+#define two_bytes_u lcx.uc[2] = mygetcdvi; \
+ lcx.uc[3] = mygetcdvi; lcx.uc[1] = 0; lcx.uc[0] = 0
+
+#define two_bytes_s lcx.c[2] = mygetcdvi; \
+ lcx.c[3] = mygetcdvi; \
+ if (lcx.c[2] >= 0) { lcx.uc[1] = 0; lcx.uc[0] = 0 ;} \
+ else { lcx.uc[1] = 255; lcx.uc[0] = 255; }
+
+#define three_bytes_u lcx.uc[1] = mygetcdvi; lcx.uc[2] = mygetcdvi; \
+ lcx.uc[3] = mygetcdvi; lcx.uc[0] = 0
+
+#define three_bytes_s lcx.c[1] = mygetcdvi; lcx.c[2] = mygetcdvi; \
+ lcx.c[3] = mygetcdvi; \
+ lcx.uc[0] = (lcx.c[1] >= 0) ? 0 : 255;
+
+#define four_bytes lcx.c[0] = mygetcdvi; \
+ lcx.c[1] = mygetcdvi; lcx.c[2] = mygetcdvi; \
+ lcx.c[3] = mygetcdvi;
+
+#else /* Not big endian */
+
+GLOBAL union lc { long int l; unsigned long int ul; char c[4];
+ unsigned char uc[4]; } lcx;
+
+#define two_bytes_u lcx.uc[1] = mygetcdvi; \
+ lcx.uc[0] = mygetcdvi; lcx.uc[2] = 0; lcx.uc[3] = 0
+#define two_bytes_u lcx.uc[1] = mygetcdvi; \
+ lcx.uc[0] = mygetcdvi; lcx.uc[2] = 0; lcx.uc[3] = 0
+
+#define two_bytes_s lcx.c[1] = mygetcdvi; \
+ lcx.c[0] = mygetcdvi; \
+ if (lcx.c[1] >= 0) { lcx.uc[2] = 0; lcx.uc[3] = 0 ;} \
+ else { lcx.uc[2] = 255; lcx.uc[3] = 255; }
+
+#define three_bytes_u lcx.uc[3] = mygetcdvi; lcx.uc[1] = mygetcdvi; \
+ lcx.uc[0] = mygetcdvi; lcx.uc[2] = 0
+
+#define three_bytes_s lcx.c[2] = mygetcdvi; lcx.c[1] = mygetcdvi; \
+ lcx.c[0] = mygetcdvi; \
+ lcx.uc[3] = (lcx.c[2] >= 0) ? 0 : 255;
+
+#define four_bytes lcx.c[3] = mygetcdvi; \
+ lcx.c[2] = mygetcdvi; lcx.c[1] = mygetcdvi; \
+ lcx.c[0] = mygetcdvi;
+
+#endif
+
+/* Knuth's programs like to hardcode fixed maximum sizes for
+various things, for example, the maximum number of fonts
+allowed in a DVI file. In general, it is preferable to use
+the C function malloc to allocate storage as needed. That is
+what we generally do in this Ln03DVI, but there are some
+residues of the Knuthian approach, like MAXTEXFONTS below.
+By the way, we never attempt to return any storage to the
+system.
+
+[[Eventually, it would be better to get rid of MAXTEXFONTS
+and use a linked list of records instead. There would be no
+cpu time penalty to using a linked list, because the
+function set_curf below does a linear search through the
+font array anyway.]]
+
+Txf is a data structure describing a TeX font. */
+
+#define MAXTEXFONTS 100
+
+struct txf { unsigned char chu[256]; int bc, ec; long int space, design_size,
+ scaled_size; int nchs; };
+
+GLOBAL struct txf *txfa[MAXTEXFONTS+1];
+
+/* Font_name points to strings containing TeX font names.
+Those strings are created with malloc as needed. */
+
+GLOBAL char *font_name[MAXTEXFONTS+1];
+
+/* Font width information needs to be read from TFM files.
+TFM is a special format defined by TeX. "Ln03DVI" stores each
+width in a longword. DVItype tries to save space by a
+two-level width storage method. We just allocate an array of
+widths for each font with malloc.
+
+[[We don't check that font checksums match in Ln03DVI,
+because there are a lot of slightly obsolete TFMs floating
+around which would result in a checksum error, but seem to
+give perfectly reasonable formatted output nonetheless.]] */
+
+GLOBAL long int *font_width[MAXTEXFONTS+1];
+
+/* TeX fonts are referred to by their internal numbers,
+which go from 0 to nf-1. The DVI file refers to them by
+external numbers, hence the array to_ext used to convert
+internal numbers to external numbers. Curf is the internal
+font number of the current font in the DVI file. Curchu
+points to the 'chu' (character used) array of the current
+font. */
+
+GLOBAL int to_ext[MAXTEXFONTS+1],
+ nf,
+ curf;
+GLOBAL unsigned char *curchu;
+
+/* In some switch statements, a lot of cases have to be
+enumerated. We employ the following Knuthian macro for that
+purpose: */
+
+#define four_cases(_x1) case _x1: case _x1+1: case _x1+2: case _x1+3:
+
+/* We define a lot of constants corresponding to the DVI
+operation codes. These are copied from DVItype. */
+
+#define id_byte 2 /* current version of the dvi format */
+#define set_char_0 0 /* typeset character 0 and move right */
+#define set1 128 /* typeset a character and move right */
+#define set_rule 132 /* typeset a rule and move right */
+#define put1 133 /* typeset a character */
+#define put_rule 137 /* typeset a rule */
+#define nop 138 /* no operation */
+#define bop 139 /* beginning of page */
+#define eop 140 /* ending of page */
+#define push 141 /* save the current positions */
+#define pop 142 /* restore previous positions */
+#define right1 143 /* move right */
+#define w0 147 /* move right by |w| */
+#define w1 148 /* move right and set |w| */
+#define x0 152 /* move right by |x| */
+#define x1 153 /* move right and set |x| */
+#define down1 157 /* move down */
+#define y0 161 /* move down by |y| */
+#define y1 162 /* move down and set |y| */
+#define z0 166 /* move down by |z| */
+#define z1 167 /* move down and set |z| */
+#define fnt_num_0 171 /* set current font to 0 */
+#define fnt1 235 /* set current font */
+#define xxx1 239 /* extension to dvi primitives (\special) */
+#define xxx4 242 /* potentially long extension to dvi primitives */
+#define fnt_def1 243 /* define the meaning of a font number */
+#define pre 247 /* preamble */
+#define post 248 /* postamble beginning */
+#define post_post 249 /* postamble ending */
+#define undefined_command 250
+
+GLOBAL long int mag, num, den;
+GLOBAL double conv, unmag_conv;
+
+/* Read_preamble reads the preamble of the dvi file. The
+comment is thrown away. The format version number is
+checked. The magnification, numerator, and denominator are
+remembered in the globals mag, num, den. The float values
+conv and unmag_conv serve to convert measurements from DVI
+units to pixels. */
+
+int read_preamble() {
+ unsigned int i;
+ int j;
+
+ i = mygetcdvi;
+ if (i != pre) return(1);
+ i = mygetcdvi;
+ if (i != id_byte) return(1);
+ four_bytes; num = lcx.l;
+ if (num <= 0) return(1);
+ four_bytes; den = lcx.l;
+ if (den <= 0) return(1);
+ four_bytes; mag = lcx.l;
+ if (mag <= 0) return(1);
+
+ unmag_conv = (num/254000.0) * (300.0/den);
+ conv = unmag_conv * (mag/1000.0);
+
+/* Skip over the comment field. */
+
+ i = mygetcdvi;
+ for (j=0; j<i; j++) mygetcdvi;
+ return(0);
+}
+
+/* The dvi file format requires us to keep track of various
+quantities, among them the horizontal and vertical positions
+h and v, and four values referred to simply as x, y, z and
+w. We also keep pixel-rounded versions of h and v, called hh
+and vv. */
+
+GLOBAL long h, v, x, y, z, w;
+GLOBAL int hh, vv;
+
+/* The following function, copied from DVItype, reads from
+the DVI file the first parameter of the current DVI command.
+In the case of functions whose first parameter is implicit,
+such as set_char_0 through set_char_127, the implicit
+parameter is returned. */
+
+long first_par(o)
+int o;
+{
+ unsigned int i;
+
+ if ((o >= set_char_0) && (o < set_char_0+128))
+ return(o-set_char_0);
+ if ((o >= fnt_num_0) && (o < fnt_num_0+64))
+ return(o-fnt_num_0);
+ switch (o) {
+ case set1:
+ case put1:
+ case fnt1:
+ case xxx1:
+ case fnt_def1:
+ i = mygetcdvi;
+ return(i);
+ case set1+1:
+ case put1+1:
+ case fnt1+1:
+ case xxx1+1:
+ case fnt_def1+1:
+ two_bytes_u;
+ return(lcx.ul);
+ case set1+2:
+ case put1+2:
+ case fnt1+2:
+ case xxx1+2:
+ case fnt_def1+2:
+ three_bytes_u;
+ return(lcx.ul);
+ case right1:
+ case w1:
+ case x1:
+ case down1:
+ case y1:
+ case z1:
+ return(mygetcdvi);
+ case right1+1:
+ case w1+1:
+ case x1+1:
+ case down1+1:
+ case y1+1:
+ case z1+1:
+ two_bytes_s;
+ return(lcx.l);
+ case right1+2:
+ case w1+2:
+ case x1+2:
+ case down1+2:
+ case y1+2:
+ case z1+2:
+ three_bytes_s;
+ return(lcx.l);
+ case set_rule:
+ case put_rule:
+ case right1+3:
+ case w1+3:
+ case x1+3:
+ case down1+3:
+ case y1+3:
+ case z1+3:
+ case set1+3:
+ case put1+3:
+ case fnt1+3:
+ case xxx1+3:
+ case fnt_def1+3:
+ four_bytes;
+ return(lcx.l);
+ case w0:
+ return(w);
+ case x0:
+ return(x);
+ case y0:
+ return(y);
+ case z0:
+ return(z);
+ default:
+ return(0);
+ }
+}
+
+/* Pass1 reads from the DVI file until the last page that
+has to be processed, as determined by the page selection
+data structures. Font definitions are processed, as are font
+selections; after the starting page begins, pass1 records
+which characters are used from which fonts. Other commands
+are ignored in pass1. Return 1 if something goes wrong, e.g.
+if the DVI file comes to a premature end. This resembles
+skip_pages below. */
+
+int pass1() {
+
+ unsigned int k;
+ long int p;
+ int i;
+ char startp;
+
+ if (read_preamble() != 0) {
+ fprintf(stderr,bad_DVI_message);
+ return(1);
+ }
+
+ num_pages = 0;
+
+ for (;;) {
+ if (dvieof) {
+ fprintf(stderr,bad_DVI_message);
+ return(1);
+ }
+ k = mygetcdvi;
+ if (k == post) return(0);
+ if (k >= set_char_0 && k < set_char_0+128) {
+ p = k;
+ k = set1;
+ } else if (k >= fnt_num_0 && k < fnt_num_0+64) {
+ p = k-fnt_num_0;
+ k = fnt1;
+ } else p = first_par(k);
+
+ switch (k) {
+ case bop:
+ startp = 1;
+ for (i=0; i<10; i++) {
+ four_bytes;
+ if (i < how_many_counts && use_count[i] &&
+ lcx.l != start_page[i]) startp = 0;
+ }
+ four_bytes;
+ if (startp != 0 || num_pages > 0) {
+ num_pages++;
+ if (num_pages > max_pages) return(0);
+ }
+ break;
+ case set_rule:
+ case put_rule:
+ four_bytes;
+ break;
+ four_cases(fnt_def1)
+ i = define_font(p);
+ if (i != 0) return(1);
+ break;
+ four_cases(fnt1)
+ if (num_pages > 0) set_curf(p);
+ break;
+ four_cases(set1)
+ four_cases(put1)
+ if (num_pages > 0)
+ txfa[curf] -> chu[p] = 1;
+ break;
+
+/* \special's are currently ignored in pass1, and handled
+only in pass2. [[This will change if the putchar special is
+implemented.]] */
+
+ four_cases(xxx1)
+ for (; p>0; p--) mygetcdvi;
+ break;
+ default:
+ break;
+ }
+ }
+/* return(0); /* Unreachable */
+}
+
+/* FONT LOAD BUILDING: The hardest thing Ln03DVI has to do
+is to build an LN03 font load that contains the glyphs
+required to print the DVI file. The following code pertains
+to that effort.
+
+LN03 fonts come in two flavors. Left fonts are invoked by
+character codes 33 to 126. Right fonts are invoked by
+character codes 161 to 254. Hence: */
+
+#define leftfirst 33
+#define rightfirst 161
+#define leftlast 126
+#define rightlast 254
+
+/* It is believed that there is a maximum of 32
+downline-loaded LN03 fonts. We always deal with these in
+pairs, using one as a left font, the other as a right font.
+Hence we have a maximum of 16 pairs. */
+
+#define maxnfonts 16
+
+/* We keep track of the true last character in each LN03
+font pair; the width of each character; and the LN03 name
+assigned to that pair. [[Yikes. Chw is an unsigned char
+here; it should be at least an unsigned short.]] */
+
+GLOBAL int lastch[maxnfonts];
+GLOBAL unsigned char chw[maxnfonts][256];
+GLOBAL char fname[maxnfonts][32];
+
+/* Txf is a record structure describing a TeX font. Txfa is
+an array of txf records. Txf2lnf describes the mapping
+between TeX fonts and pairs of LN03 fonts. Because the
+constructed LN03 font load has just the glyphs that are
+needed, we can often cram more than one TeX font into a pair
+of LN03 fonts. */
+
+GLOBAL int txf2lnf[MAXTEXFONTS];
+
+/* Maxfontnos reflects the fact that LN03 fonts must be
+denoted by a number from 10 to 19 in order to be selected as
+the LN03's current font. */
+
+#define maxfontnos 9
+
+/* The LN03 font-denoting numbers 10-19 have to be allocated
+among the fonts. The useno array keeps track of which number
+a font is using, -1 if the font currently doesn't have any
+number. The whouses array says which font is using a given
+number. */
+
+GLOBAL int useno[maxnfonts],whouses[maxfontnos];
+
+/* After the font load we declare the right and bottom
+margins we are going to use; these are always the maximum
+allowed values. */
+
+GLOBAL int maxrmar,maxbmar;
+
+/* The global ras_len_added is employed by the
+font-load-creating code to communicate how many bytes of
+raster information it adds to the font load each time it is
+called. [[Maybe there should be no EXTERNs in the main code
+file, just GLOBALs?]] The right thing would be to put all
+these declarations in .h's.]] */
+
+EXTERN long ras_len_added;
+
+#define max(x,y) (((x)>(y))?(x):(y))
+#define min(x,y) (((x)<(y))?(x):(y))
+
+/* Make_font_load calls on other procedures to generate the
+LN03 font load. It writes the opening lines of the output
+file, too. */
+
+int make_font_load() {
+
+ int i,j,jj,k,l,fno,maxfno,chsize;
+ long int totsize;
+ int lnfcnt,txfcnt,the_txf,txf_size,lnfleft;
+ int txford[MAXTEXFONTS];
+ char cnt[3];
+
+ totsize = 0;
+ chsize = 0;
+ curf = 0;
+ for (i=0; i<maxnfonts; i++)
+ for (j=0; j<256; j++) chw[i][j] = 0;
+
+ for (jj=0; jj<MAXTEXFONTS; jj++) txf2lnf[jj] = -1;
+
+/* Fill the fname strings with different valid LN03 font
+names. [[This initialization could be done statically, but
+then maxnfonts would be more hardcoded.]] */
+
+ for (i=0; i<maxnfonts; i++)
+ strcpy(fname[i],"U000000002SK00GG0001UZZZZ02F000");
+ for (jj=1; jj<maxnfonts; jj++) {
+ sprintf(cnt,"%02d",jj);
+ strncpy(&(fname[jj][5]),cnt,2);
+ }
+
+/* The margins are set to values that seem appropriate for
+American 8 1/2 by 11" paper. It is not clear if this needs
+to be changed for European A4 paper. Not changing it might
+deprive Europeans of access to the bottom 1.5cm of their
+paper.
+
+I have tried to set the margins appropriately according
+to the paper type (a4 or 8 1/2 x 11"), and to throw away
+text which is set outside. [[However, text too close to the
+bottom margin still results in an apparently undocumented
+LN03 page eject.]] */
+
+ if (landscape == 1) {
+ if (a4_paper == 0) {
+ maxrmar = 3300;
+ maxbmar = 2475;
+ } else {
+ maxrmar = 3475;
+ maxbmar = 2475;
+ }
+ } else {
+ if (a4_paper == 0) {
+ maxrmar = 2550;
+ maxbmar = 3300;
+ } else {
+ maxrmar = 2550;
+ maxbmar = 3475;
+ }
+ }
+
+/* In the following, esc[?21 J means print in landscape on 8
+1/2 x 11 inch paper, esc[?22 J means print in portrait on A4
+paper, esc[?23 J means landscape on A4 paper, esc[?27h means
+"advance the carriage by the character width when you set a
+character", esc[11h and esc[7 I together mean to interpret
+all dimensions in escape sequences as pixel units; esc[?52h
+means our origin of coordinates is the upper left edge of
+the paper; esc[%dt means the "maximum length" of the paper
+is maxbmar pixels. */
+
+ fprintf(outfile,"\033[!p");
+ if (landscape == 1 && a4_paper == 0) fprintf(outfile,"\033[?21 J");
+ if (landscape == 0 && a4_paper == 1) fprintf(outfile,"\033[?22 J");
+ if (landscape == 1 && a4_paper == 1) fprintf(outfile,"\033[?23 J");
+ fprintf(outfile,"\033[?7l\033[?27h\033[11h\033[7 I\033[?52h\033[%dt\n",
+ maxbmar);
+
+ for (i=0; i<maxnfonts; i++) useno[i] = -1;
+ for (i=0; i<maxfontnos; i++) whouses[i] = -1;
+ maxfno = -1;
+
+/* Write font loading escape sequence onto outf. The ;0y
+causes all previously downloaded fonts to be cleared from
+the LN03's font memory. */
+
+ fprintf(outfile,"\033P0;1;0y");
+
+/* Count how many glyphs each font requires. */
+
+ for (fno=0; fno<nf; fno++) {
+
+ txfa[fno] -> nchs = 0;
+ for(i=0; i<256; i++)
+ if (txfa[fno] -> chu[i] != 0) txfa[fno] -> nchs++;
+
+ if (txfa[fno] -> nchs > 188) goto need_empty_slots;
+ chsize += txfa[fno] -> nchs;
+ }
+ printf("Font load to contain %d glyphs.\n",chsize);
+
+
+/* Now we have to allocate TeX fonts to LN03 font pairs and
+perform the actual load. The goal is to use as few LN03
+fonts as possible.
+
+I don't know any way to do the allocation optimally, so a
+first-fit heuristic is used.
+
+1. Find the largest unassigned TeX font. If none, exit,
+ we're done. Number of glyphs used is the measure of size.
+
+2. Allocate an LN03 font pair for that TeX font and put
+ the TeX font into it.
+
+3. Find the largest remaining TeX font that fits in
+ what is left of that LN03 font pair.
+
+ 3.1. if none exists, go to 1.
+ 3.2. if one exists, put it in the font pair and go back
+ to 3.
+
+The txford array contains the TeX font numbers in the order
+that they are assigned. Txfcnt keeps track of how many TeX
+fonts have been assigned so far. */
+
+ lnfcnt = 0;
+ txfcnt = 0;
+ for (i=0; i<MAXTEXFONTS; i++) txford[i] = -1;
+
+ while (1) {
+
+/* Find largest unassigned TeX font */
+
+ lnfleft = rightlast-rightfirst+1+leftlast-leftfirst+1;
+ txf_size = -1;
+ for (j = 0; j < MAXTEXFONTS; j++) {
+ if (txfa[j] != 0 && txf2lnf[j] == -1
+ && txfa[j] -> nchs > txf_size) {
+ txf_size = txfa[j] -> nchs;
+ the_txf = j;
+ }
+ }
+ if (txf_size <= 0) goto assignment_done;
+ if (lnfcnt > maxnfonts) goto too_complex;
+ if (txf_size > lnfleft) goto need_empty_slots;
+
+/* Now allocate new LN03 font pair and put the current TeX
+font into it */
+
+ txf2lnf[the_txf] = lnfcnt;
+ txford[txfcnt] = the_txf;
+ txfcnt++;
+ k = leftfirst-1;
+ for (j = 0; j <= 255; j++) {
+ if (txfa[the_txf] -> chu[j] != 0) {
+ k++;
+ if (k == leftlast+1) k = rightfirst;
+ lnfleft--;
+ txfa[the_txf] -> chu[j] = k;
+ }
+ }
+ lastch[lnfcnt] = k;
+
+/* Now try to fill the remaining part of the LN03 font pair
+using other TeX fonts */
+
+ while (1) {
+
+ txf_size = -1;
+ for (j = 0; j < MAXTEXFONTS; j++) {
+ if (txfa[j] != 0 && txf2lnf[j] == -1
+ && txfa[j] -> nchs > txf_size
+ && txfa[j] -> nchs <= lnfleft) {
+ txf_size = txfa[j] -> nchs;
+ the_txf = j;
+ }
+ }
+ if (txf_size <= 0) break;
+
+ txf2lnf[the_txf] = lnfcnt;
+ txford[txfcnt] = the_txf;
+ txfcnt++;
+ k = lastch[lnfcnt];
+ for (j=0; j<=255; j++) {
+ if (txfa[the_txf] -> chu[j] != 0) {
+ k++;
+ lnfleft--;
+ if (k == leftlast+1) k = rightfirst;
+ txfa[the_txf] -> chu[j] = k;
+ }
+ }
+ lastch[lnfcnt] = k;
+ }
+
+ lnfcnt++;
+ }
+
+assignment_done:
+
+/* At this point, the TeX fonts have been assigned to LN03
+font pairs. The assignment is reflected in the arrays
+txf2lnf, lastch and txford. It remains to actually generate
+the desired font load. This has to be done carefully, since
+the function add_txf_to_lnf only supports adding glyphs to
+an LN03 font pair in ascending order of character code. */
+
+ for (j=0; j<txfcnt; j++) {
+ k = txford[j];
+ if (j != 0 && txf2lnf[k] != txf2lnf[txford[j-1]])
+ fprintf(outfile,",\n");
+ add_txf_to_lnf(txf2lnf[k],k);
+ totsize += ras_len_added;
+ }
+
+/* [[At this point we ought to add code that writes a
+message saying how much font RAM the load will occupy. But
+there is no documentation for determining that! So, we make
+the following compromise:]] */
+
+ printf("Approximate size of font load: %ld bytes\n",totsize);
+
+/* Now output escape sequences to the LN03 that assign the
+available font numbers to the first ten font pairs in the
+load. [[We may want to insert a few \n's in the following to
+keep the line from getting too long.]] */
+
+ fprintf(outfile,"\n;Ln03DVI 12 font load\033\\");
+ fprintf(outfile,"\033[1;%ds\033[%dt\033[1;%dr",maxrmar,maxbmar,maxbmar);
+ for (j=0; j <= min(maxfontnos,lnfcnt-1); j++) {
+ useno[j] = j;
+ whouses[j] = j;
+ k = fname[j][16];
+ fname[j][16] = '\0';
+ fprintf(outfile,"\033P1;1%d}%s\033\\",j,fname[j]);
+ fname[j][16] = k;
+ }
+ fprintf(outfile,"\033[10m");
+
+ return(0);
+
+too_complex:
+ fprintf(stderr,"Can't construct a font load:\n");
+ fprintf(stderr,"Dvi file uses too many glyphs from too many different fonts.\n");
+ return(1);
+
+/* [[We need to determine what the real limit is on the
+number of LN03 fonts, and refine the test to detect if it is
+being exceeded. Fortunately, only a very complex DVI file
+could exceed the limit.]] */
+
+need_empty_slots:
+ {
+ int msg = (100.0*conv*txfa[fno] -> scaled_size)/
+ (unmag_conv*txfa[fno] -> design_size) + 0.5;
+
+ fprintf(stderr,"Font %s",font_name[fno]);
+ if (msg != 100) printf(" (@ %d%%)",mag);
+ fprintf(stderr," uses > 188 characters. Can't handle that.\n");
+ return(1);
+ }
+
+/* [[The error message above should be fixed to specify the
+magnification of the font also. -- done, matt]] */
+
+}
+
+/* The lines in the LN3 file are limited to lengths of about
+100 bytes. We keep track of how many bytes are written so
+far in the global lnhp. The accounting is conservative, so
+e.g. each integer representing a pixel position counts as 4
+bytes even though it might be shorter. [[One could easily
+increase 100 to 200. It is not clear what problems are
+provoked by going over, say, 256.]]
+
+Vpset keeps track of whether the vertical position needs to
+be output to the LN03 file before setting any more
+characters. Hh_old keeps track of the horizontal position
+which LN03 thinks it's at. */
+
+GLOBAL int ln3p,vpset,hh_old;
+
+#define inc_ln3p(x) ln3p += x; if (ln3p > 100) \
+ { ln3p = 0; vpset = 0; hh_old = 30000; }
+
+/* [[In the above macro, hh_old is set to 30000 to mean "a
+very large number" (the maximum valid hh for an LN03 is
+2550), so as to force the code below to re-output the true
+hh. What are the implications of this kludge? Would it not
+be more reasonable to have instead an hhset variable?]] */
+
+/* A stack of hvxyzw values is kept; the stack pointer is
+called s. [[Again, it would be better to make this stack a
+linked list.]] */
+
+#define STACKSIZE 100
+
+GLOBAL long hstack[STACKSIZE], vstack[STACKSIZE], xstack[STACKSIZE],
+ ystack[STACKSIZE], zstack[STACKSIZE], wstack[STACKSIZE];
+GLOBAL int hhstack[STACKSIZE], vvstack[STACKSIZE];
+GLOBAL int s;
+
+/* DVI files specify distances in units of 2^-16 points.
+When translating to a device-specific format, it is
+necessary to round the DVI distances to pixel units. This is
+done by means of the pixel_round macro.
+
+However, rather than using this macro in the straightforward
+way, rounding is often performed by more elaborate
+techniques, which we call "Stanford rules" (after John Le
+Carre's "Moscow rules"). These rules make use of a parameter
+MAX_DRIFT, which is roughly the maximum number of pixels
+that things are allowed to deviate from straightforward
+rounding. */
+
+#define pixel_round(x) ((int) ((x<0) ? \
+ (conv*(x)-0.5) : (conv*(x)+0.5)))
+
+#define MAX_DRIFT 2
+
+/* Pass2 reads the dvi file and interprets the commands in
+it, usually by calling other routines. The interpretation
+generally consists of writing something into the output
+file, updating the current fonts and positions, and possibly
+updating the stack. */
+
+int pass2()
+{
+ int i,j;
+ long int p;
+ unsigned int k;
+
+ if (read_preamble() != 0) {
+ fprintf(stderr,bad_DVI_message);
+ return(1);
+ }
+
+ curf = 0;
+ ln3p = 0;
+ s = 0;
+ vpset = 0;
+ hh_old = 30000;
+
+/* Skip pages until the desired starting page is reached. A
+nonzero value is returned if the starting page is never
+encountered. */
+
+ if (skip_pages() != 0) return(0);
+
+ for (;;) {
+ if (dvieof) {
+ fprintf(stderr,bad_DVI_message);
+ return(1); }
+ k = mygetcdvi;
+ if (k == post) return(0);
+ if (k >= undefined_command) {
+ fprintf(stderr,bad_DVI_message);
+ return(1); }
+
+ if (k >= set_char_0 && k < set_char_0+128) {
+ p = k;
+ k = set1;
+ } else if (k >= fnt_num_0 && k < fnt_num_0+64) {
+ p = k-fnt_num_0;
+ k = fnt1;
+ } else p = first_par(k);
+
+ j = do_command(k,p);
+ if (j == 2) return(0); /* done with the required number of pages */
+ else if (j == 1) return(1); /* error encountered, stop */
+
+ }
+}
+
+GLOBAL long first_counter;
+
+/* Read from the DVI file until the starting page condition
+is met. Return 1 if something goes wrong, or if the DVI file
+comes to an end. This function is copied quite closely from
+DVItype. */
+
+int skip_pages() {
+
+ unsigned int k;
+ int i;
+ long p;
+ char startp;
+
+ for (;;) {
+ if (dvieof) return(1);
+ k = mygetcdvi;
+ if (k == post) return(1);
+ if (k >= set_char_0 && k < set_char_0+128) {
+ p = k;
+ k = set1;
+ } else if (k >= fnt_num_0 && k < fnt_num_0+64) {
+ p = k-fnt_num_0;
+ k = fnt1;
+ } else p = first_par(k);
+
+ switch (k) {
+ case bop:
+ startp = 1;
+ for (i=0; i<10; i++) {
+ four_bytes;
+ if (i == 0) first_counter = lcx.l;
+ if (i < how_many_counts && use_count[i] &&
+ lcx.l != start_page[i]) startp = 0;
+ }
+ four_bytes;
+ if (startp != 0) {
+ v = 0; vv = 0; h = 0; hh = 0;
+ printf("\n [%ld]",first_counter);
+ num_pages = 1; return(0); }
+ break;
+ case set_rule:
+ case put_rule:
+ four_bytes;
+ break;
+ four_cases(fnt_def1)
+ define_font_pass2(p);
+ break;
+ four_cases(xxx1)
+ for (; p>0; p--) mygetcdvi;
+ break;
+ default:
+ break;
+ }
+ }
+/* return(0); /* Unreachable */
+}
+
+/* Do_command performs the DVI command of code k, assuming
+the "first parameter" is p. It is assumed that k is not one
+of set_char0 through set_char127. */
+
+int do_command(k,p)
+int k;
+long p;
+{
+ int i,j,l,lnf;
+
+ switch (k) {
+ four_cases(fnt_def1)
+ define_font_pass2();
+ break;
+
+/* It is possible that the dvi file sets some glyphs off the
+page. No error message is given, since the user will
+generally see what is happening in the output (plus, if
+Ln03DVI gives an error message, users will complain about
+Ln03DVI even though the error is in their TeX file).
+
+In most cases, Ln03DVI takes no special action at all, since
+the LN03 will clip the glyphs for us. Unfortunately, the
+LN03 doesn't let us specify negative horizontal or vertical
+positions, so we have to clip glyphs at such positions away
+ourselves. Also, if one sets at a position below the bottom
+margin, the LN03 will eject a page, so glyphs that are set
+below that margin also have to be clipped by hand.
+
+The following code accomplishes that: */
+
+ four_cases(put1)
+ four_cases(set1)
+
+ if (vv+voff > 0 && vv+voff <= maxbmar && hh+hoff > 0) {
+ if (!vpset) {
+ fprintf(outfile,"\n\033[%dd",vv+voff);
+ fprintf(outfile,"\033[%d`",hh+hoff);
+ ln3p = 16;
+ vpset = 1;
+ hh_old = hh;
+ }
+ if (hh_old != hh) {
+ if (hh > hh_old) fprintf(outfile,"\033[%da",hh-hh_old);
+ else fprintf(outfile,"\033[%d`",hh+hoff);
+ ln3p += 7;
+ }
+
+#ifndef SEVENBIT
+ putc(curchu[p],outfile);
+#else
+ if (curchu[p] > 127) {
+ if (right7 == 0) {
+ fputs("\033n",outfile);
+ inc_ln3p(2);
+ right7 = 1;
+ }
+ putc(curchu[p]-128,outfile);
+ } else {
+ if (right7 == 1) {
+ putc(15,outfile);
+ inc_ln3p(1);
+ right7 = 0;
+ }
+ putc(curchu[p],outfile);
+ }
+#endif
+ inc_ln3p(1);
+ }
+ if (k >= put1) {
+ hh_old = hh+chw[txf2lnf[curf]][curchu[p]];
+ break;
+ }
+ h += font_width[curf][p];
+
+/* In rounding h to generate the pixel-position hh, Stanford
+rules (see above) come into play. We set the new hh
+(horizontal position in pixels) to the value obtained by
+adding the pixel width of the character being set to the
+current position. We then correct this value so that it does
+not exceed the rounded version of the true position by more
+than MAX_DRIFT pixels.
+
+Note that if we did not apply Stanford rules here, or
+equivalently if we set MAX_DRIFT to zero, many more
+set-X-position commands would appear in the output. */
+
+ hh += chw[txf2lnf[curf]][curchu[p]];
+ hh_old = hh;
+ l = pixel_round(h);
+ if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ else if (l-hh > MAX_DRIFT) hh = l-MAX_DRIFT;
+ break;
+
+ four_cases(fnt1)
+ set_curf(p);
+ curchu = &(txfa[curf] -> chu[0]);
+ lnf = txf2lnf[curf];
+ if (useno[lnf] == -1) {
+ useno[whouses[maxfontnos]] = -1;
+ useno[lnf] = maxfontnos;
+ whouses[maxfontnos] = lnf;
+ fprintf(outfile,"\033P1;1%d}%16s\033\\",maxfontnos,
+ fname[lnf]);
+ inc_ln3p(26);
+ }
+ fprintf(outfile,"\033[1%dm",useno[lnf]);
+ inc_ln3p(5);
+ break;
+
+ case set_rule:
+ case put_rule:
+
+/* When converting rule dimensions to pixel dimensions, we
+do not follow Stanford rules. Rather, we just round the true
+positions to obtain the pixel positions. This avoids
+unsightly gaps between rules. [[It should not cause much of
+a problem with typical rule applications (ruled tables,
+fraction bars)...but perhaps with large delimiters there
+might be some difficulty. This needs more thought...]] */
+
+ four_bytes;
+ if (p >= 0 && lcx.l >= 0) {
+ i = pixel_round(p);
+ j = pixel_round(lcx.l);
+ if (p > 0 && i == 0) i = 1;
+ if (lcx.l > 0 && j == 0) j = 1;
+ do_rule(pixel_round(h),
+ pixel_round(v)-i,pixel_round(h)+j,
+ pixel_round(v));
+ }
+ if (k == set_rule) {
+ h += lcx.l;
+ hh = pixel_round(h);
+ }
+ break;
+
+ case push:
+ s++;
+ if (s == STACKSIZE) {
+ fprintf(stderr,"\nStack too deep for Ln03DVI\n");
+ return(1);
+ }
+ xstack[s] = x;
+ ystack[s] = y;
+ vstack[s] = v;
+ hstack[s] = h;
+ vvstack[s] = vv;
+ hhstack[s] = hh;
+ wstack[s] = w;
+ zstack[s] = z;
+ break;
+
+ case pop:
+ if (s == 0) {
+ fprintf(stderr,bad_DVI_message);
+ return(1);
+ }
+ if (vv != vvstack[s]) vpset = 0;
+ x = xstack[s];
+ y = ystack[s];
+ v = vstack[s];
+ h = hstack[s];
+ vv = vvstack[s];
+ hh = hhstack[s];
+ w = wstack[s];
+ z = zstack[s];
+ s--;
+ break;
+
+ four_cases(xxx1)
+ do_special_pass2(p);
+ break;
+
+ case bop:
+
+/* If we've done the required number of pages, we'll skip
+the rest of the DVI file. If not, type the first parameter
+of bop on the user's terminal the way TeX does, to give an
+indication of progress. */
+
+ if (num_pages == max_pages) return(2);
+ v = 0; vv = 0; h = 0; hh = 0;
+ vpset = 0; hh_old = 100000;
+ four_bytes;
+ if (num_pages%12 == 0) printf("\n");
+ first_counter = lcx.l;
+ printf(" [%ld]",lcx.l);
+ fflush(stdout);
+ num_pages++;
+ for (i = 0; i<40; i++) mygetcdvi;
+ break;
+
+ case eop:
+ fprintf(outfile,"\n\f");
+ ln3p = 0;
+ break;
+
+/* Now we have to consider the cases for pure motion. */
+
+ four_cases(right1)
+ set_h(h+p);
+ break;
+ four_cases(x1)
+ x = p;
+ case x0:
+ set_h(h+x);
+ break;
+ four_cases(y1)
+ y = p;
+ case y0:
+ set_v(v+y);
+ break;
+ four_cases(w1)
+ w = p;
+ case w0:
+ set_h(h+w);
+ break;
+ four_cases(z1)
+ z = p;
+ case z0:
+ set_v(v+z);
+ break;
+ four_cases(down1)
+ set_v(v+p);
+ break;
+
+ }
+ return(0);
+}
+
+/* Set_curf sets the current font to external number p. Note
+that the current font is maintained as an internal font
+number. */
+
+int set_curf(p)
+int p;
+{
+ to_ext[nf] = p;
+ curf = 0;
+ while (to_ext[curf] != p) { curf++; }
+}
+
+/* Define_font processes a font definition from the DVI
+file. The TFM file for the font is read at this point from
+the directory TEX$FONTS.
+
+[[Originally it made sense to read the DVI files here,
+because we were supporting the LN03 font file format only,
+and that has no place for the tfm widths. The PXL and PK
+formats, on the other hand, contain the widths, so that if
+those files are being used there is no need to open the TFM
+file at all. Hence, this code should all be moved to after
+we've figured out what kind of raster file is being used.]]
+*/
+
+int define_font(e)
+int e;
+{
+ int i;
+ unsigned char p,n;
+ if (e == MAXTEXFONTS) { fprintf(stderr,"\nToo many fonts for Ln03DVI\n");
+ return(1); }
+ txfa[nf] = (struct txf *)malloc(sizeof(struct txf));
+ to_ext[nf] = e;
+ four_bytes;
+ four_bytes;
+ txfa[nf] -> scaled_size = lcx.l;
+ four_bytes;
+ txfa[nf] -> design_size = lcx.l;
+ for (i=0; i<256; i++) txfa[nf] -> chu[i] = '\0';
+ p = mygetcdvi; n = mygetcdvi;
+ font_name[nf] = malloc(p+n+1);
+ for (i=0; i<p+n; i++) { font_name[nf][i] = mygetcdvi; }
+ font_name[nf][p+n] = '\0';
+
+ if (txfa[nf] -> scaled_size <= 0 || txfa[nf] -> scaled_size >=
+ 8*8*8*8*8*8*8*8*8) {
+ fprintf(stderr,"\n Font %s has a bad scaled size\n",font_name[nf]);
+ return(1);
+ }
+ if (txfa[nf] -> design_size <= 0 || txfa[nf] -> design_size >=
+ 8*8*8*8*8*8*8*8*8) {
+ fprintf(stderr,"\n Font %s has a bad design size\n",font_name[nf]);
+ return(1);
+ }
+
+/* We follow DVItype and compute for each font a "space"
+parameter which is one-sixth of the scaled design size. This
+parameter is used in rounding the horizontal position to
+pixels according to "Stanford rules." See the function set_h
+below. */
+
+ txfa[nf] -> space = txfa[nf] -> scaled_size/6;
+
+ i = read_tfm_file();
+ if (i != 0) return(i);
+ nf++;
+ return(0);
+
+}
+
+/* TFM files, like the DVI file, are read with getc, foolish
+as that may seem. We use the same overlays that are used for
+merging DVI bytes into longwords. However, since the TFM
+file consists of longwords, only tfm_longword is need. */
+
+#define tfm_longword { lcx.uc[3] = getc(tfmfile); \
+ lcx.uc[2] = getc(tfmfile); lcx.uc[1] = getc(tfmfile); \
+ lcx.uc[0] = getc(tfmfile); }
+
+/* Read_tfm_file obtains the character widths from the TFM file
+corresponding to font nf. */
+
+int read_tfm_file() {
+
+ int i,lh,nw;
+ int info[256];
+ long z,alpha,beta;
+ long width[256];
+
+ open_tfm_file();
+ if (tfmfile == NULL) {
+ fprintf(stderr,"\n Can't open TFM file for font ");
+ perror(font_name[nf]);
+ return(1); }
+
+/* The TFM format is described in some issue of the TUGBoat
+(TeX users' group newsletter), and in the comments to the
+programs TeX and TFtoPL. Here we summarize those aspects of
+TFM format that are relevant to the task of extracting the
+widths of the characters.
+
+The first 24 bytes of a TFM file contain twelve 16-bit
+integers that give the lengths of the various subsequent
+portions of the file. The ones relevant to our purposes are
+LH, length of the header data, BC, the smallest character
+code in the font, EC, the largest character code in the
+font, and NW, number of words in the width table. So, we
+read those right now, and then skip over the remainder, and
+then over a set of LH longwords called the "header." */
+
+ tfm_longword;
+ lh = 256*lcx.uc[1] + lcx.uc[0];
+ tfm_longword;
+ txfa[nf] -> bc = 256*lcx.uc[3] + lcx.uc[2];
+ txfa[nf] -> ec = 256*lcx.uc[1] + lcx.uc[0];
+ tfm_longword;
+ nw = 256*lcx.uc[3] + lcx.uc[2];
+ if (txfa[nf] -> bc > 255 || txfa[nf] -> ec > 255 ||
+ txfa[nf] -> bc > txfa[nf] -> ec || nw > 256) {
+ fprintf(stderr,"\n Bad TFM file for font %s\n",font_name[nf]);
+ return(1);
+ }
+
+ for(i=0; i<lh+3; i++) tfm_longword;
+
+/* After the header, there are two arrays in the TFM file
+that interest us. The first, INFO, is EC-BC+1 longwords long
+and contains pointers to the second, WIDTH, which is NW
+longwords long. For each character i, the width of i is
+WIDTH[INFO[i-BC]]. We read these arrays into memory. */
+
+ for(i=0; i<txfa[nf] -> ec-txfa[nf] -> bc+1; i++) {
+ tfm_longword;
+ if (lcx.uc[3] >= nw) {
+ printf("\n Bad TFM file for font %s",font_name[nf]);
+ return(1);
+ }
+ info[i] = lcx.uc[3];
+ }
+
+/* The widths are stored in a rather strange format known as
+a "fix-word." A nonnegative width is expressed in "fix-word"
+format by expressing it in units of 2^-20 times the design
+size. A negative width is expressed in "fix-word" format by
+expressing its negative in those units, and then changing
+the most significant byte to 255.
+
+One needs to convert these widths into DVI units,
+multiplying by the scaled design size according to a certain
+arcane algorithm. The algorithm is copied from DVItype, to
+which we refer the reader for an explanation. [[Copout. I
+don't really understand what's going on here. Why not just
+use floating point? That's what it's for.]] */
+
+ z = txfa[nf] -> scaled_size;
+ alpha = 16*z; beta = 16;
+ while (z >= 4*(8*8*8*8*8*8*8)) { z = z/2; beta = beta/2; }
+ for(i=0; i<nw; i++) {
+ tfm_longword;
+ width[i] = ( ( (lcx.uc[0]*z)/256 + lcx.uc[1]*z )/256 +
+ lcx.uc[2]*z)/beta;
+ if (lcx.uc[3] == 255) width[i] -= alpha;
+ }
+
+ fclose(tfmfile);
+
+/* Using these two arrays, we now compute the widths of the
+characters in the fonts and place them into two malloc'ed
+arrays, one for the widths in DVI units, one for the width
+in pixel units. */
+
+ font_width[nf] = (long int *)malloc(4*(txfa[nf] -> ec+1));
+
+ for (i=0; i<txfa[nf] -> bc; i++) font_width[nf][i] = 0;
+ for (i=txfa[nf] -> bc; i <= txfa[nf] -> ec; i++)
+ font_width[nf][i] = width[info[i-txfa[nf] -> bc]];
+ return(0);
+}
+
+/* Open_tfm_file finds and opens the tfm file corresponding
+to a font nf. The global file variable tfmfile is used to
+hold the file pointer. [[This function will not work if the
+TFM file lies over the net on a VMS V3.x host, because C
+file opens do not work in such circumstances. The problem
+can be ignored, because eventually there should be very few
+VMS V3.x hosts left.]] */
+
+int open_tfm_file () {
+
+ int jext,jnam;
+ char filespec[FILESPECLEN];
+
+#ifndef vms
+ char *texfontdir;
+#endif
+
+
+ find_filename(font_name[nf],&jnam,&jext);
+ filespec[0] = '\0';
+
+/* If there is no directory part, fill in using the logical
+tex$fonts */
+
+#ifdef vms
+ if (jnam == 0) strcpy(filespec,"tex$fonts:");
+#else
+ if (jnam == 0) {
+ texfontdir = getenv("TEXFONTS");
+ if (texfontdir == NULL)
+ texfontdir = "/usr/lib/tex/fonts";
+ strcpy(filespec,texfontdir);
+ if (filespec[strlen(filespec)-1] != '/')
+ strcat(filespec,"/");
+ }
+#endif
+ strcat(filespec,font_name[nf]);
+
+/* if there is no extension, add the extension ".tfm" */
+
+ if (font_name[nf][jext] == '\0') strcat(filespec,".tfm");
+ tfmfile = fopen(filespec,"r");
+
+}
+
+/* Define_font_pass2 skips a font definition from the DVI
+file. */
+
+int define_font_pass2()
+{
+ unsigned char p,n;
+ int i;
+ four_bytes;
+ four_bytes;
+ four_bytes;
+ p = mygetcdvi; n = mygetcdvi;
+ for (i=0; i<p+n; i++) mygetcdvi;
+}
+
+/* Do_rule writes into the ln3 file the escape sequence
+corresponding to a rule. The rule is silently clipped to fit
+on the page. */
+
+int do_rule(xx0,yy0,xx1,yy1)
+int xx0,yy0,xx1,yy1;
+{
+ int j;
+
+ xx0 = min(xx0+hoff,maxrmar);
+ xx1 = min(xx1+hoff,maxrmar);
+ xx0 = max(xx0,0);
+ xx1 = max(xx1,0);
+ yy0 = min(yy0+voff,maxbmar);
+ yy1 = min(yy1+voff,maxbmar);
+ yy0 = max(yy0,0);
+ yy1 = max(yy1,0);
+ if (xx0 > xx1) { j = xx0; xx0 = xx1; xx1 = j; }
+ if (yy0 > yy1) { j = yy0; yy0 = yy1; yy1 = j; }
+
+ if ((yy1 != yy0 && xx1 != xx0)) {
+ fprintf(outfile,"\033[1;%d;%d;%d;%d!|",
+ xx0,yy0,yy1-yy0,xx1-xx0);
+ inc_ln3p(25);
+ }
+}
+
+/* Set_v is called to execute vertical-position-altering
+commands, other than pops. It modifies v and vv, and outputs
+the vertical position to the LN3 file. We don't follow
+Stanford rules here. They sometimes set the vertical
+position in pixels vv to something other than the rounded
+value of v. Not following Stanford rules implies, for
+example, that the relative vertical positions of an accent
+and its accentee may differ by one pixel according to how
+the baseline of the accentee gets rounded. [[This should
+perhaps be fixed.]] */
+
+int set_v(v1)
+int v1;
+{
+ int l;
+
+ l = pixel_round(v1);
+ v = v1;
+ vv = l;
+ vpset = 0;
+}
+
+/* Set_h is called whenever a DVI command is encountered
+that alters the horizonal position, other than a set_char,
+set_rule or pop. It sets h to the new value, and alters hh
+according to Stanford rules. */
+
+int set_h(new_h)
+int new_h;
+{
+ int l,old_hh;
+
+ old_hh = hh;
+ l = pixel_round(new_h);
+ if (txfa[curf] == 0 || new_h-h >= txfa[curf] -> space
+ || new_h-h <= -4*txfa[curf] -> space) hh = l;
+ else {
+ hh += pixel_round(new_h-h);
+ if (hh-l > MAX_DRIFT) hh = l+MAX_DRIFT;
+ else if (hh-l < -MAX_DRIFT) hh = l-MAX_DRIFT;
+ }
+ h = new_h;
+ return(0);
+}
diff --git a/dviware/ln03/thomas/ln03dvi.man b/dviware/ln03/thomas/ln03dvi.man
new file mode 100644
index 0000000000..b792ddab08
--- /dev/null
+++ b/dviware/ln03/thomas/ln03dvi.man
@@ -0,0 +1,124 @@
+.de Sh
+.br
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp
+.if t .sp .5v
+.if n .sp
+..
+'''
+''' Set up \*(-- to give an unbreakable dash;
+''' string Tr holds user defined translation string.
+''' Bell System Logo is used as a dummy character.
+'''
+.ie n \{\
+.tr \(bs-\*(Tr
+.ds -- \(bs-
+.if (\n(.H=4u)&(1m=24u) .ds -- \(bs\h'-12u'\(bs\h'-12u'-\" diablo 10 pitch
+.if (\n(.H=4u)&(1m=20u) .ds -- \(bs\h'-12u'\(bs\h'-8u'-\" diablo 12 pitch
+.ds L" ""
+.ds R" ""
+.ds L' '
+.ds R' '
+'br\}
+.el\{\
+.ds -- \(em\|
+.tr \*(Tr
+.ds L" ``
+.ds R" ''
+.ds L' `
+.ds R' '
+'br\}
+.TH LN03DVI 1 LOCAL
+.SH NAME
+ln03dvi - TeX DVI to DEC LN03 processor
+.SH SYNOPSIS
+.I ln03dvi
+[
+.I -h
+hoffset] [
+.I -v
+voffset] [
+.I -n
+pages] [
+.I -s
+n.n.n] [
+.I -l
+] [
+.I -e
+]
+.I dvifile
+.SH DESCRIPTION
+LN03DVI generates a DEC LN03 or LN03+ printable file from a
+.I TeX
+DVI file.
+.I LN03DVI
+uses either 300dpi PXL or PK format font files for input. It can also
+accept LN03 NFT format font files but the use of NFT files is discouraged.
+.PP
+When loading a font,
+.I LN03DVI
+will search first for a PK format file, and if that fails, it will then look
+for a PXL format file. It will only look for a NFT format file it can't
+find either a PK or PXL format file. If
+.I LN03DVI
+can't find any font file for a font, it will substitute blanks for the font.
+.PP
+LN03DVI allows the generation of your document in landscape mode by using the
+.I -l
+option. Portrait mode is the default. You can instruct
+.I LN03DVI
+to use A4 size paper which is commonly used in Europe by using the
+.I -e
+option but the defualt paper size is 8.5x11.
+.PP
+The placement of document on the page is controlled by the
+.I -h
+and
+.I -v options.
+The units for
+.I -h
+and
+.I -v
+are pixels (300 pixels to the inch). These options correspond to the
+.I hoffset
+and
+.I voffset
+control sequences.
+.SH ENVIRONMENT
+.IP TEXFONTS 8
+A path to the directory with contains the
+.I TeX
+TFM files.
+.Sp
+Default: /usr/lib/tex
+.IP TEXPXLDIR 8
+A path to the directory which contains the
+.I PXL
+font files.
+.Sp
+Default: /usr/lib/tex/pxldir
+.IP TEXPKDIR 8
+A path to the directory containing the
+.I PK
+font files.
+.Sp
+Default: /usr/lib/tex/pkdir
+.SH HISTORY
+.I LN03DVI
+is an enhanced version of Flavio Rose's
+.IR Dvi2ln3 .
+Most of the Flavio's code remains unchanged. Only the font loading/building
+code and most of the status messages have been modified.
+.SH DIAGNOSTICS
+Some internal variables have compile-time limits. A complex document could
+exceed these limits. Notable among these compile-time constants is
+.I MAXTEXFONTS
+which sets the maximum number of TeX fonts
+.I LN03DVI
+can deal with in a document.
+.SH BUGS
+Please send all bug reports to ...!ptsfa!ista!thomas.
diff --git a/dviware/ln03/thomas/ln03fonts.c b/dviware/ln03/thomas/ln03fonts.c
new file mode 100644
index 0000000000..830b4f35d6
--- /dev/null
+++ b/dviware/ln03/thomas/ln03fonts.c
@@ -0,0 +1,1388 @@
+/* This file contains those portions of Ln03DVI that create
+font loads. It is still being developed...
+
+Copyright (c) 1983, 1984, 1985, 1986, 1987 by Digital Equipment
+Corporation. Author: Flavio Rose,
+...!decwrl!dec-rhea!dec-dvinci!rose.
+
+This version of Ln03DVI is maintained by Matt Thomas.
+Please send all bug reports to either:
+ ...!decwrl!thebay.dec.com!mthomas (UUCP)
+ mthomas@thebay.dec.com (Internet)
+
+Development chronology:
+
+11/28/84: Initial version in PL/I. Finished 11/30/84.
+ 3/4/85: C translation, a prelude to writing DVI2LN3.
+ 5/7/85: Finally got around to debugging the C translation!
+ 6/5/85: Convert to work with Dvi2ln3 -- minor changes.
+ 6/18/85: Try not to use big input array.
+ 6/22/85: Cleanup, try to identify longs.
+11/12/85: Changed to read PXLs rather than LN03 format files. Old file
+ called dvi2ln3nft, now renamed to dvi2ln3pxl.
+11/15/85: More optimized PXL reading -- use lnf instead of the pxlbuf
+ when reading rasters. Return just status value from add_txf_...,
+ use ras_len_added to communicate size. Facilitate error
+ recovery with copy_ersatz_char. LN03 file reading functionality
+ woven back in.
+ 1/16/86: Embarrassing bug, forgot to close the nftf after done with it.
+ 3/28/86: Conditionalization for Ultrix.
+ 4/7/86: After moving this to 4.3bsd at MIT, a couple more
+ fixes to the portability.
+ 8/6/86: Try to make changes for Apollo. No way to test
+ them. #ifdef Apollo ... #endif
+ 11/5/86: Add error message giving PXL extension if no PXL
+ file can be found.
+ 2/20/87: Add support for reading of PK files. Reorganize output to be
+ simpler. Change name to Ln03DVI.
+ 5/5/87: Misc fixups relating to the CM fonts. COnditionalize some code, etc.
+ 5/15/87: Fix NFT filename problem (accvio under VMS). cleaup some error
+ messages.
+*/
+
+/* INTRODUCTION: When writing an LN03 driver for TeX, it
+must be kept in mind that the LN03 has limited font storage
+capability. The standard LN03 has just 27k bytes, and two
+128k byte RAM cartridges may be added.
+
+For this reason, when we convert a DVI file to LN03 form, we
+build a special font load that has just the glyphs that the
+DVI file needs. This allows very complex files, e.g. the
+first nine chapters of the Metafontbook, to be printed on
+LN03s that have just one extra RAM cartridge. This approach
+does, however, consume considerable resources in the VAX to
+build those font loads. */
+
+/* The following is customary boilerplate. */
+
+#ifdef vms
+#include stdio
+#include errno
+#else
+#include <stdio.h>
+#include <errno.h>
+#endif
+#include "pk.h"
+
+/* In VMS we declare external variables to be globalref.
+This is not really necessary, just an old habit. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+/* errno is declared in errno.h under VMS and System V but
+not under BSD 4.2. Also we use strchr instead of index so
+we conditionalize that too. */
+
+#ifdef bsd4_2
+
+# define index strchr
+extern int errno;
+
+#endif
+
+
+/* The following symbols are declared compatibly with those
+in the file Ln03DVI.c. */
+
+#define maxnfonts 31
+#define MAXTEXFONTS 100
+#define FILESPECLEN 252
+#define leftfirst 33
+#define leftlast 126
+#define rightfirst 161
+#define rightlast 254
+
+EXTERN FILE *outfile;
+EXTERN int lastch[maxnfonts];
+EXTERN unsigned char chw[maxnfonts][256];
+
+struct txf { unsigned char chu[256]; int bc, ec; long space, design_size,
+ scaled_size; int nchs; };
+EXTERN struct txf *txfa[MAXTEXFONTS+1];
+EXTERN long int *font_width[MAXTEXFONTS+1];
+
+EXTERN char *font_name[MAXTEXFONTS+1];
+EXTERN double conv, unmag_conv;
+
+#ifndef vms
+char *getenv();
+#endif
+
+/* The LN03 font load we build is buffered in a fixed-size
+area, slightly smaller than the maximum amount of font
+memory available on an LN03. [[The code should be changed to
+chain fixed-size buffers, so font loads of unlimited size
+can be handled, subject only to memory availability. On
+systems with limited memory, it may be desirable to use a
+disk file instead of this buffer.]] */
+
+#define OBUFLEN 2*256*256
+GLOBAL unsigned char lnf[OBUFLEN];
+
+/* While constructing the font load, we keep track of the
+length of the "character definitions area" in ras_len. We
+also have to keep track of the raster size measured in three
+different ways, as psize (portrait), lsize (landscape), and
+msize (mixed). This is required to fill certain fields in
+the font load. */
+
+GLOBAL long int ras_len,psize,lsize,msize;
+
+/* The font load that we construct consists of a number of
+LN03 fonts. Each of these contains up to 94 glyphs. They may
+be "left fonts", so their glyphs are invoked with codes 33
+through 126; or they may be "right fonts" that respond to
+codes 161 through 254.
+
+The font load that we construct is made up of alternating
+left and right fonts (sometimes called "font pairs"). A TeX
+font (represented by a txf record) is added to a font pair.
+It may be split between the left and right halves of the
+pair.
+
+The variable using_r keeps track of whether we are using a
+right font. */
+
+GLOBAL char using_r;
+
+GLOBAL unsigned int nft_first_ch,nft_last_ch,chardir_offset;
+GLOBAL int lnf_chardir,ras_beg;
+GLOBAL long ras_len_added;
+
+GLOBAL int pxlf,nftf;
+GLOBAL PKFont *pkfont;
+
+/* The purpose of add_txf_to_lnf is to read the PXL, PK, or LN03
+font file corresponding to TeX font txfno and add its
+rasters to the font pair referred to by lnfno. The function
+returns 0 if all went well, and various negative numbers to
+indicate problems. The number of bytes added to the font
+load is returned in the global ras_len_added. */
+
+int add_txf_to_lnf(lnfno,txfno)
+int lnfno,txfno;
+{
+ int i,j,k,l,width;
+ int first_txfc,last_txfc;
+ char first_txf,last_txf;
+
+ ras_len_added = 0;
+
+ if (txfno < 0 || txfno > MAXTEXFONTS || txfa[txfno] == 0 ||
+ lnfno < 0 || lnfno > maxnfonts) {
+ fprintf(stderr,"\nLn03DVI internal error, bad txfno or lnfno\n");
+ goto error_return;
+ }
+
+/* Now, compute first_txfc and last_txfc, the first and last
+characters codes to be copied from the TeX font. */
+
+ first_txfc = -1; last_txfc = -1;
+ for (i=0; i<256; i++) {
+ if (txfa[txfno] -> chu[i] != 0) {
+ if (first_txfc == -1) first_txfc = i;
+ last_txfc = i;
+ }
+ }
+ if (first_txfc == -1 || last_txfc == -1) return(0);
+
+/* Tell user what font is being loaded */
+
+ printf("Font %s:\t",font_name[txfno]);
+ k = (1500.0*conv*txfa[txfno] -> scaled_size)/
+ (unmag_conv*txfa[txfno] -> design_size) + 0.5;
+ l = ((float)k)/15.0 + 0.5;
+ if (l != 100) printf("magnified %d%%, ",l);
+ fflush(stdout);
+
+/* Now open the file from which we are getting rasters. We
+look first for a PK file, the for a PXL file, and finally for a
+LN03 format font file (NFT file). */
+
+ pkfont = NULL;
+ pxlf = -1;
+ nftf = -1;
+ open_pk_file(txfno);
+ if (pkfont == NULL) open_pxl_file(txfno);
+ if (pkfont == NULL && pxlf == -1) open_nft_file(txfno);
+
+/* If neither a PXL file nor a PK file nor an LN03 format
+file could be opened, warn the user. The font load will be
+filled in with blanks nonetheless. */
+
+ if (pxlf == -1 && pkfont == NULL && nftf == -1) {
+ printf("not available, loading blanks, ");
+ fflush(stdout);
+ }
+
+/* Now replace first_txfc and last_txfc by the character
+codes into which they are going to be copied. */
+
+ first_txfc = txfa[txfno] -> chu[first_txfc];
+ last_txfc = txfa[txfno] -> chu[last_txfc];
+
+/* Determine if this is the first or last TeX font that is
+being copied into the current LN03 font pair. */
+
+ first_txf = (first_txfc == leftfirst);
+ last_txf = (last_txfc == lastch[lnfno]);
+
+/* If this is the first TeX font for the current LN03 font
+pair, then we have to initialize the LN03 font load buffer.
+The initialization routine computes where the rasters begin
+in the output buffer, puts in the blanks, etc. */
+
+ if (first_txf) {
+ using_r = 0;
+ initialize_lnf(lnfno);
+ }
+
+/* Now go through all the characters in the TeX font and
+copy their rasters into the appropriate positions in the
+LN03 font pair. When we copy the the last rasters into the
+left font, we write the font out and then a comma to
+separate it from the next font. [[Fencepost error?]] */
+
+ for (i=0; i<256; i++) {
+ if (txfa[txfno] -> chu[i] != 0) {
+ j = txfa[txfno] -> chu[i];
+ if (!using_r && j >= rightfirst) {
+ write_lnf();
+ fprintf(outfile,"\n,");
+ using_r = 1;
+ initialize_lnf(lnfno);
+ }
+ if (pxlf != -1) {
+ k = copy_pxl_char(i,j,lnfno);
+ if (k != 0) {
+ close(pxlf);
+ pxlf = -1;
+ }
+ } else if (nftf != -1) {
+ k = copy_nft_char(i,j,lnfno);
+ if (k != 0) {
+ close(nftf);
+ nftf = -1;
+ }
+ } else if (pkfont != NULL) {
+ k = copy_pk_char(pkfont,i,txfno,j,lnfno);
+ if (k != 0) {
+ PKUnloadFont(pkfont);
+ pkfont = NULL;
+ }
+ }
+ if (pxlf == -1 && pkfont == NULL && nftf == -1) {
+ width = font_width[txfno][i]*conv+0.5;
+ k = copy_ersatz_char(j,lnfno,width);
+ }
+ }
+ }
+
+ if (nftf != -1) close(nftf);
+ if (pxlf != -1) close(pxlf);
+ if (pkfont != NULL) PKUnloadFont(pkfont);
+
+/* Type and return the incremental amount of space that the
+TeX font being added takes up in the output font load. */
+
+ ras_len_added += 4*(txfa[txfno] -> nchs);
+ printf("%d bytes\n",ras_len_added);
+
+/* If this is the last TeX font being added to this LN03
+font pair, write out the current font (right or left) from
+the pair. */
+
+ if (last_txf) write_lnf();
+
+ return(0);
+
+error_return:
+ return(-1);
+
+}
+
+/* A buffer is used to hold the directory part of the PXL file. */
+
+#define PXLBUFSIZE 4*517
+
+GLOBAL unsigned char pxlbuf[PXLBUFSIZE];
+GLOBAL long pxllen;
+
+/* The value pxlconv is computed to be the correct
+conversion factor from the widths in the PXL file, which are
+expressed in units of 2^-20 times the design size, to
+pixels. */
+
+GLOBAL float pxlconv;
+
+/* As usual when dealing with TeX files, we have to
+rearrange bytes in an overlay to combine them into
+longwords. The reason for this is that bytes in TeX files
+are combined into longwords the opposite way from how the
+VAX combines them.
+
+Hence, the following overlay and macro: */
+
+GLOBAL union lc { unsigned long int ul;
+ long int l;
+ unsigned char c[4]; } lcy;
+
+#ifdef BIG_ENDIAN
+#define copy_from_lnf(i) lcy.c[3] = lnf[i]; lcy.c[2] = lnf[i+1]; \
+ lcy.c[1] = lnf[i+2]; lcy.c[0] = lnf[i+3]
+#define copy_to_lnf(i) lnf[i] = lcy.c[3]; lnf[i+1] = lcy.c[2]; \
+ lnf[i+2] = lcy.c[1] ; lnf[i+3] = lcy.c[0]
+#define copy_from_pxl(_x) { lcy.c[0] = pxlbuf[_x]; \
+ lcy.c[1] = pxlbuf[(_x)+1]; lcy.c[2] = pxlbuf[(_x)+2]; \
+ lcy.c[3] = pxlbuf[(_x)+3]; }
+#else /* not big endian */
+#define copy_from_lnf(i) lcy.c[0] = lnf[i]; lcy.c[1] = lnf[i+1]; \
+ lcy.c[2] = lnf[i+2]; lcy.c[3] = lnf[i+3]
+#define copy_to_lnf(i) lnf[i] = lcy.c[0]; lnf[i+1] = lcy.c[1]; \
+ lnf[i+2] = lcy.c[2] ; lnf[i+3] = lcy.c[3]
+#define copy_from_pxl(_x) { lcy.c[3] = pxlbuf[_x]; \
+ lcy.c[2] = pxlbuf[(_x)+1]; lcy.c[1] = pxlbuf[(_x)+2]; \
+ lcy.c[0] = pxlbuf[(_x)+3]; }
+#endif
+
+
+/* open_pxl_file reads the last 517 longwords of the PXL
+file into the pxlbuf. */
+
+int open_pxl_file(txfno)
+int txfno;
+{
+
+ long i,j;
+ float two_to_the_20th = 0x100000;
+ int k,l,jnam,jext,target;
+ char fullspec[FILESPECLEN];
+#ifndef vms
+ char *pxldir;
+#endif
+
+ find_filename(font_name[txfno],&jnam,&jext);
+
+ fullspec[0] = '\0';
+#ifdef vms
+ if (jnam == 0) strcpy(fullspec,"TEX$PXLDIR:");
+#else
+ if (jnam == 0) {
+#ifndef Apollo
+ pxldir = getenv("TEXPXLDIR");
+ if (pxldir == NULL)
+ pxldir = "/usr/lib/tex/pxldir";
+#else
+ pxldir = "/usr/lib/tex/pxl";
+#endif
+ strcpy(fullspec,pxldir);
+ if (fullspec[strlen(fullspec)-1] != '/')
+ strcat(fullspec,"/");
+ }
+#endif
+ strcat(fullspec,font_name[txfno]);
+
+ l = 1000.0 * ( (float) txfa[txfno]->scaled_size /
+ (float) txfa[txfno]->design_size ) + 0.5;
+ k = 0.5 + 1.5 * (conv / unmag_conv ) * (float) l ;
+
+ l = strlen(fullspec);
+ sprintf(&fullspec[l],".%dpxl\0",k);
+
+ pxllen = 0;
+ pxlf = open(fullspec,0);
+ if (pxlf == -1) return(1);
+ printf("loading PXL file %s%s, ",font_name[txfno],&fullspec[l]);
+ fflush(stdout);
+
+ lseek(pxlf,-517*4,2);
+ i = read(pxlf,pxlbuf,517*4);
+ if (i != 517*4) {
+ if (i < 0) {
+ fflush(stdout);
+ perror("error");
+ printf("\t\t");
+ } else
+ printf("error: premature EOF (%d)\n\t\t",i);
+ close(pxlf);
+ pxlf = -1;
+ return(1);
+ }
+ pxllen = 4*517;
+
+/* Now that we have read the PXL file, check that it is in
+correct format by looking for a trailing ID byte of 1001. */
+
+ copy_from_pxl(pxllen-4);
+ if (lcy.ul != 1001) {
+ printf("error: invalid .PXL id %d\n\t\t",lcy.ul);
+ close(pxlf);
+ pxlf = -1;
+ return(1);
+ }
+
+/* If the format is correct, derive a scale factor for the
+widths. */
+
+ copy_from_pxl(pxllen-12);
+ pxlconv = lcy.ul;
+ copy_from_pxl(pxllen-16);
+ pxlconv = (pxlconv/two_to_the_20th)*(lcy.ul/5.0)
+ *(1.0/(72.27*two_to_the_20th));
+/* printf( "pxlconv=%g, ",pxlconv ); fflush(stdout); /**/
+
+ return(0);
+
+}
+
+GLOBAL unsigned char rev_byte[256] = {
+ 0,128,64,192,32,160,96,224,
+ 16,144,80,208,48,176,112,240,
+ 8,136,72,200,40,168,104,232,
+ 24,152,88,216,56,184,120,248,
+ 4,132,68,196,36,164,100,228,
+ 20,148,84,212,52,180,116,244,
+ 12,140,76,204,44,172,108,236,
+ 28,156,92,220,60,188,124,252,
+ 2,130,66,194,34,162,98,226,
+ 18,146,82,210,50,178,114,242,
+ 10,138,74,202,42,170,106,234,
+ 26,154,90,218,58,186,122,250,
+ 6,134,70,198,38,166,102,230,
+ 22,150,86,214,54,182,118,246,
+ 14,142,78,206,46,174,110,238,
+ 30,158,94,222,62,190,126,254,
+ 1,129,65,193,33,161,97,225,
+ 17,145,81,209,49,177,113,241,
+ 9,137,73,201,41,169,105,233,
+ 25,153,89,217,57,185,121,249,
+ 5,133,69,197,37,165,101,229,
+ 21,149,85,213,53,181,117,245,
+ 13,141,77,205,45,173,109,237,
+ 29,157,93,221,61,189,125,253,
+ 3,131,67,195,35,163,99,227,
+ 19,147,83,211,51,179,115,243,
+ 11,139,75,203,43,171,107,235,
+ 27,155,91,219,59,187,123,251,
+ 7,135,71,199,39,167,103,231,
+ 23,151,87,215,55,183,119,247,
+ 15,143,79,207,47,175,111,239,
+ 31,159,95,223,63,191,127,255
+ };
+
+#define pxl_word(_x) (pxlbuf[_x]*256+pxlbuf[(_x)+1])
+#define signed_pxl_word(_x) ((pxl_word(_x)>0x8000) ? \
+ (pxl_word(_x)-0x10000) : pxl_word(_x))
+
+/* Copy_pxl_char copies the rasters and character directory
+information corresponding to code from in the PXL file, into
+the to position of the LN03 font load buffer. */
+
+int copy_pxl_char(from,to,lnfno)
+unsigned char from,to;
+int lnfno;
+{
+
+ unsigned long ds,rs,i,j,def_start;
+ unsigned int rows,cols,k,l,m,n;
+ int xoffset, yoffset;
+ int width;
+ char all_blank;
+
+/* Check if the character code from is in the right range
+for the PXL file. */
+
+ if (from > 127) return(1);
+
+/* Locate the definition and the rasters for from in the PXL
+file. */
+
+ ds = 16*from;
+ copy_from_pxl(ds+8);
+ rs = 4*lcy.ul;
+ cols = pxl_word(ds); rows = pxl_word(ds+2);
+
+/* If a glyph has no rasters, an "undocumented feature" of
+the LN03 seems to cause the glyph to be printed incorrectly.
+Because of this, we set the number of rows and columns to 1,
+and put in a blank byte (below). */
+
+ all_blank = ((rows == 0) & (cols == 0)) | rs == 0;
+ if (all_blank) {
+ cols = 1;
+ rows = 1;
+ }
+
+/* Compute the width of the glyph in pixels, the xoffset,
+and the yoffset. */
+
+ copy_from_pxl(ds+12);
+ width = pxlconv*lcy.ul+0.5;
+ xoffset = signed_pxl_word(ds+4);
+ yoffset = signed_pxl_word(ds+6);
+ chw[lnfno][to] = width;
+
+/* Check that we have enough room left in the LN03 font load
+buffer. Fudge factor of 3 added because the read below may
+read too much. */
+
+ def_start = ras_beg+ras_len;
+ if (def_start+rows*((cols+7)/32)+24+3 > OBUFLEN) {
+ fprintf(stderr,"no more room in LN03 font load buffer (%ld bytes long)\n",
+ OBUFLEN);
+ return(1);
+ }
+
+/* Clear the character definition area in the LN03 font load
+buffer. */
+
+ for(i=0; i<24+rows*((cols+7)/8); i++)
+ lnf[def_start+i] = 0;
+
+/* Set the fields in the first six longwords of the LN03
+font load character definition. The first assignment sets
+the so-called "flag flag", which must be always be set
+according to the Common Font File Format. A conversion
+factor of 24 is used in converting pixel values, because the
+values are supposed to be in centipoints in the LN03 font
+load, and if we assume there are 300 pixels in an inch, then
+there are 7200 centipoints in an inch. */
+
+ lnf[def_start+3] = 0x80;
+ lcy.ul = 24*width;
+ copy_to_lnf(def_start+4);
+ lcy.l = -24*xoffset;
+ copy_to_lnf(def_start+8);
+ lcy.l = -24*yoffset;
+ copy_to_lnf(def_start+12);
+
+/* The rasters are always placed in portrait into the LN03
+font load, with no use of run-length encoding. Thus, the
+orient field in the raster format will be 0, and the Type 1
+field is set to 0x81. */
+
+ lnf[def_start+17] = 0x81;
+ lnf[def_start+20] = rows%256;
+ lnf[def_start+21] = rows/256;
+ lnf[def_start+22] = cols%256;
+ lnf[def_start+23] = cols/256;
+
+/* Now we copy the rasters themselves. As we do so, we have
+to reverse the bits within each byte. */
+
+ k = (cols+31)/32;
+ n = (cols+7)/8;
+ lseek(pxlf,rs,0);
+ if (!all_blank) {
+ for (l=0; l<rows; l++) {
+ read(pxlf,&lnf[def_start+24+n*l],4*k);
+ }
+ for (m=0; m<n*rows; m++)
+ lnf[def_start+24+m] = rev_byte[lnf[def_start+24+m]];
+ }
+
+/* Set the character locator, increment the LN03 font load
+buffer length, and recompute the three sizes. */
+
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += 24+rows*n;
+ ras_len_added += 24+rows*n;
+ if (ras_len%2 == 1) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+
+ i = rows*((cols+7)/8);
+ psize += i;
+ j = ((rows+7)/8)*cols;
+ lsize += j;
+ msize += (i > j) ? i : j;
+
+ return(0);
+}
+
+/* Write a blank character of specified width (in pixels)
+into LN03 font load buffer. Also, set the chw array. [[This
+function is a bit excessive. If we couldn't find a
+character's rasters, it would suffice just to leave the
+character locator blank.]] */
+
+int copy_ersatz_char(to,lnfno,width)
+unsigned char to;
+int lnfno,width;
+{
+
+ unsigned long ds,rs,i,j,def_start;
+ unsigned int rows,cols,k,l,m,n;
+
+ cols = 1;
+ rows = 1;
+ chw[lnfno][to] = width;
+
+/* Check that we have enough room left in the LN03 font load
+buffer. Return silently if not. */
+
+ def_start = ras_beg+ras_len;
+ if (def_start+rows*((cols+7)/32)+24 > OBUFLEN) return(1);
+
+/* Clear the character definition area in the LN03 font load
+buffer. */
+
+ for(i=0; i<24+rows*((cols+7)/8); i++)
+ lnf[def_start+i] = 0;
+ lnf[def_start+3] = 0x80;
+ lcy.ul = 24*width;
+ copy_to_lnf(def_start+4);
+
+/* The rasters are always placed in portrait into the LN03
+font load, with [no use of run-length encoding. Thus, the
+orient field in the raster format will be 0, and the Type 1
+field is set to 0x81. */
+
+ lnf[def_start+17] = 0x81;
+ lnf[def_start+20] = rows%256;
+ lnf[def_start+21] = rows/256;
+ lnf[def_start+22] = cols%256;
+ lnf[def_start+23] = cols/256;
+
+/* Set the character locator, increment the LN03 font load
+buffer length, and recompute the three sizes. */
+
+ n = (cols+7)/8;
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += 24+rows*n;
+ ras_len_added += 24+rows*n;
+ if (ras_len%2 == 1) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+
+ i = rows*((cols+7)/8);
+ psize += i;
+ j = ((rows+7)/8)*cols;
+ lsize += j;
+ msize += (i > j) ? i : j;
+
+ return(0);
+}
+
+/* The opening part of each NFT file is copied into the
+array nfta. Nftlen keeps track of how much of the NFT file
+we have read. Nftf is the file descriptor used to do the
+reading. */
+
+GLOBAL unsigned char nfta[480+1024];
+GLOBAL long nftlen;
+
+#define copy_from_nft(i) lcy.c[0] = nfta[i]; lcy.c[1] = nfta[i+1]; \
+ lcy.c[2] = nfta[i+2]; lcy.c[3] = nfta[i+3]
+
+/* Open_nft_file opens the NFT file and reads the opening
+part into the NFT array. */
+
+int open_nft_file(txfno)
+int txfno;
+{
+ int k,l,jnam,jext,target;
+ char fullspec[FILESPECLEN];
+#ifndef vms
+ char *ln3dir;
+#endif
+
+ find_filename(font_name[txfno],&jnam,&jext);
+
+ fullspec[0] = '\0';
+#ifdef vms
+ if (jnam == 0) strcpy(fullspec,"TEX$LN03DIR:");
+#else
+ if (jnam == 0) {
+#ifndef Apollo
+ ln3dir = getenv("TEXLN03DIR");
+#else
+ ln3dir = "/usr/lib/tex/ln03";
+#endif
+ strcpy(fullspec,ln3dir);
+ strcat(fullspec,"/");
+ }
+#endif
+ strcat(fullspec,font_name[txfno]);
+ k = (100.0*conv*txfa[txfno] -> scaled_size)/
+ (unmag_conv*txfa[txfno] -> design_size) + 0.5;
+ l = strlen(fullspec);
+ if (k == 100) strcat(fullspec,".nft");
+ else {
+ if (k < 1000) sprintf(&fullspec[l],".%03d\0",k);
+ else sprintf(&fullspec[l],".%d\0",k);
+ }
+
+ nftlen = 0;
+ nftf = open(fullspec,0);
+ if (nftf == -1) return(1);
+ printf("loading NFT file %s%s, ", font_name[txfno],&fullspec[l]);
+ fflush(stdout);
+
+ if (read_nft_with_retry(nfta,480) != 0) {
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* The NFT file might be random, or it might be a Common
+Font File Format file that isn't loadable into an LN03. So,
+we make a few checks.
+
+The second longword must be 'FONT'. */
+
+ if (nfta[4] != 'F' || nfta[5] != 'O' || nfta[6] != 'N'
+ || nfta[7] != 'T') {
+ printf("error: Bad NFT file, lacks FONT.\n\t\t");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* We also check that there are a full 16 bytes of character
+parameters. If there are fewer, we give up: LN03s need all
+sixteen, and it's too hard to figure out how to give the
+missing ones reasonable values.
+
+Throughout this program, we define some constants beginning
+with fnt__ which define byte offsets into the nft file.
+[[The long prefixes of these may cause some trouble if one's
+C compiler does not recognize too many significant
+characters in identifiers.]] */
+
+#define fnt__l_parameters_size 200
+
+ copy_from_nft(fnt__l_parameters_size);
+ if (lcy.l != 16) {
+ printf(" error: bad NFT file, not enough character parameters\n\t\t");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* Set the variable that tells us the starting location of
+the character directory. */
+
+ chardir_offset = 480;
+
+/* Figure out what the first and last character codes in the
+NFT file are. */
+
+#define fnt__l_first_character 164
+
+ copy_from_nft(fnt__l_first_character);
+ nft_first_ch = lcy.l;
+ copy_from_nft(fnt__l_first_character+4);
+ nft_last_ch = lcy.l;
+
+/* We must have 0 <= nft_first_ch <= nft_last_ch <= 255,
+otherwise we give up on the NFT file. */
+
+ if (!((0 <= nft_first_ch) && (nft_first_ch <= nft_last_ch) &&
+ (nft_last_ch <= 255))) {
+ printf(" error: bad NFT file, bad character range.\n\t\t");
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+
+/* Now read the character directory into the nfta. */
+
+ target = chardir_offset+4*(nft_last_ch+1-nft_first_ch);
+ if (read_nft_with_retry(&nfta[480],target) != 0) {
+ close(nftf);
+ nftf = -1;
+ return(1);
+ }
+ return(0);
+}
+
+/* Copy_nft_char copies the character parameters and rasters
+corresponding to the from argument out of the NFT file and
+into the LN03 font buffer. It also updates the chw
+(character width) array. */
+
+int copy_nft_char(from,to,lnfno)
+unsigned char from,to;
+int lnfno;
+{
+
+ int rows,columns,quo;
+ long i,j,len,def_start,target;
+
+/* Replace from by the first character code if the NFT file
+has no rasters for code from. If this is done, the output
+will of course be mangled. The user has already been warned
+above, so no further message is needed. */
+
+ if (from < nft_first_ch) from = nft_first_ch;
+ if (from > nft_last_ch) from = nft_last_ch;
+
+/* First we need to determine def_start, the byte offset of
+the character definition for code from in the NFT file */
+
+ copy_from_nft(chardir_offset+(from-nft_first_ch)*4);
+ def_start = lcy.l;
+
+/* If the locator is earlier in the file, just give up. Otherwise, assume
+it's good, continue and give a vague error message is something goes wrong.
+*/
+
+ if (def_start < nftlen || read_nft_until(def_start) != 0) {
+ printf(" -- LN03 font file bad, using blanks\n");
+ return(1);
+ }
+
+/* Read the first 24 bytes of character data. */
+
+ def_start = ras_beg+ras_len;
+ if (read_nft_with_retry(&lnf[def_start],nftlen+24) != 0) return(1);
+
+/* Now we need to check that the rasters are uncompressed.
+LN03s can't accept compressed rasters, and this program
+isn't clever enough to decompress them. */
+
+ if (lnf[def_start+17] != 129) {
+ printf(" -- LN03 font file bad, using blanks\n");
+ return(1);
+ }
+
+/* Fill in the chw array (which holds character widths).
+Centipoint to pixel conversion is necessary (there are 24
+centipoints in a pixel), with rounding (hence the 12). */
+
+ copy_from_lnf(def_start+4);
+ chw[lnfno][to] = (lcy.l+12)/24;
+
+/* NFT files may contain character widths which are not
+integral numbers of pixels. It is necessary to round such
+values to pixels when copying into the final font load -- if
+sent unrounded to the LN03, the widths will be truncated and
+positions will be off in the printed output. */
+
+ lcy.l = 24*chw[lnfno][to];
+ copy_to_lnf(def_start+4);
+
+/* Now we need to compute the size of the rasters, and copy
+that number of bytes into the LN03 font buffer. */
+
+ rows = lnf[def_start+20]+256*lnf[def_start+21];
+ columns = lnf[def_start+22]+256*lnf[def_start+23];
+
+/* We have to update psize, lsize and msize to fill slots in
+the format. */
+
+ quo = rows/8;
+ if (rows != quo*8) quo++;
+ i = quo*columns;
+ lsize += quo*columns;
+ quo = columns/8;
+ if (columns != quo*8) quo++;
+ psize += quo*rows;
+ if (i > quo*rows) msize += i; else msize += quo*rows;
+
+/* Now do the actual copy. We have to ensure that the rasters are
+word-aligned in the font load (where one word = 2 bytes, of course). */
+
+ if (lnf[def_start+16] % 2 == 0) len = quo*rows; else len = i;
+ if (read_nft_with_retry(&lnf[def_start+24],nftlen+len) != 0)
+ return(1);
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += len+24;
+ ras_len_added += len+24;
+ if (ras_len % 2 != 0) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+ return(0);
+
+}
+
+int read_nft_with_retry(where,upto)
+long upto;
+char *where;
+{
+ long i,target;
+ int l;
+
+ i = 0;
+ while (nftlen < upto) {
+ target = upto-nftlen;
+ l = read(nftf,&where[i],target);
+ if (l <= 0) {
+ printf(" -- LN03 font file bad, using blanks\n");
+ return(1);
+ }
+ nftlen += l;
+ i += l;
+ }
+ return(0);
+}
+
+int read_nft_until(pos)
+long pos;
+{
+ char bit_bucket[512];
+ int l;
+ long target;
+
+ while (nftlen < pos) {
+ target = pos-nftlen;
+ if (target > 512) target = 512;
+ l = read(nftf,bit_bucket,target);
+ if (l <= 0) {
+ printf(" -- LN03 font file bad, using blanks\n");
+ return(1);
+ }
+ nftlen += l;
+ }
+ return(0);
+}
+
+GLOBAL unsigned char preline[96];
+
+/* write_lnf performs the last fixups to the LN03 fnnt buffer and dumps it,
+sixelized, into the output file. */
+
+int write_lnf (){
+
+ long i,j,k,rem,quo,ma;
+
+/* We now have to fix a number of slots: size of file, length of rasters,
+final 'FONT', psize, lsize, msize. */
+
+ lcy.l = ras_beg+ras_len+8;
+ copy_to_lnf(0);
+ copy_to_lnf(lcy.l-8);
+ lnf[lcy.l-4] = 'F';
+ lnf[lcy.l-3] = 'O';
+ lnf[lcy.l-2] = 'N';
+ lnf[lcy.l-1] = 'T';
+
+/* Clear out remaining bytes up to 96 more. */
+
+ j = 96*((lcy.l+95)/96);
+ for (i=lcy.l; i<j; i++) lnf[i] = 0;
+
+/* Length of rasters */
+
+#define fnt__l_char_definitions_length 156
+
+ lcy.l = ras_len;
+ copy_to_lnf(fnt__l_char_definitions_length);
+
+#define fnt__l_portrait_byte_count 228
+#define fnt__l_landscape_byte_count 232
+#define fnt__l_mixed_byte_count 236
+
+ lcy.l = psize;
+ copy_to_lnf(fnt__l_portrait_byte_count);
+
+ lcy.l = lsize;
+ copy_to_lnf(fnt__l_landscape_byte_count);
+
+ lcy.l = msize;
+ copy_to_lnf(fnt__l_mixed_byte_count);
+
+/* Now sixelize and write the contents of LNF. */
+
+ sixelize_and_write(ras_beg+ras_len+8);
+ return(0);
+}
+
+int sixelize_and_write(howmuch)
+int howmuch;
+{
+ int quo,i,j;
+
+ quo = howmuch/96;
+ if (howmuch > quo*96) quo++;
+
+ for (i=0; i<quo; i++) {
+ for (j=0; j<96; j++)
+ preline[j] = lnf[96*i+j];
+ write_preline();
+ }
+
+}
+
+int write_preline() {
+
+ char sixel_line[129];
+ int i,j,ix,pllen;
+ unsigned v,w;
+
+ pllen = 96;
+ ix = 0;
+ sixel_line[128] = '\0';
+ for (i=0; i<128; i++) sixel_line[i] = '?';
+ for (i=0; i<pllen; i += 3) {
+ v = preline[i];
+ w = v>>2;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = (v&3)<<4;
+ v = preline[i+1];
+ w |= v>>4;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = (v&15)<<2;
+ v = preline[i+2];
+ w |= v>>6;
+ sixel_line[ix] = 63+w;
+ ix++;
+ w = v&63;
+ sixel_line[ix] = 63+w;
+ ix++;
+ }
+ fprintf(outfile,"\n%s",sixel_line);
+}
+
+/* Initializes the LN03 font buffer. */
+
+int initialize_lnf(lnfno)
+int lnfno;
+{
+ int i,j;
+
+/* The following array holds reasonable values for bytes 0-479 of an LN03
+format font. These bytes were copied from a font load which the LN03 was
+known to accept. The font loads generated by this program are initialized
+using these values. Some of them are overwritten later, however. */
+
+ static char good_opening[512] = {
+ 104,38,0,0,70,79,78,84,
+ 1,0,0,0,31,0,0,0,
+ 20,0,0,0,85,48,48,48,
+ 48,48,48,48,48,50,83,75,
+ 48,48,71,71,48,48,48,49,
+ 85,90,90,90,90,48,50,70,
+ 48,48,48,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 181,7,9,0,11,0,14,0,
+ 0,0,0,0,104,0,0,0,
+ 252,0,0,0,124,0,0,0,
+ 100,1,0,0,120,1,0,0,
+ 224,1,0,0,4,0,0,0,
+ 88,3,0,0,0,0,0,0,
+ 92,3,0,0,48,0,0,0,
+ 92,3,0,0,0,0,0,0,
+ 140,3,0,0,212,34,0,0,
+ 140,3,0,0,33,0,0,0,
+ 126,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 32,0,0,0,168,0,0,0,
+ 16,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,94,0,0,0,
+ 0,0,0,0,236,25,0,0,
+ 54,25,0,0,14,27,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,0,0,0,
+ 7,0,0,0,92,3,0,0,
+ 7,0,0,0,99,3,0,0,
+ 16,0,0,0,106,3,0,0,
+ 16,0,0,0,122,3,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 10,0,0,0,244,1,0,0,
+ 0,0,24,0,16,0,0,0,
+ 16,0,0,0,1,0,1,0,
+ 1,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,
+ 30,0,0,0,20,0,0,0,
+ 196,255,255,255,20,0,0,0,
+ 106,255,255,255,20,0,0,0,
+ 0,0,1,0,0,0,30,0,
+ 166,255,255,255,0,0,0,0,
+ 40,0,0,0,0,0,0,0,
+ 60,0,0,0,240,0,0,0,
+ 60,0,0,0,100,0,0,0,
+ 240,0,0,0,120,0,0,0,
+ 40,0,0,0,120,0,0,0,
+ 96,255,255,255,136,255,255,255,
+ 186,255,255,255,240,0,0,0,
+ 76,255,255,255,60,0,0,0,
+ 160,0,0,0,120,0,0,0,
+ 20,0,0,0,20,0,0,0,
+ 140,3,0,0,194,3,0,0,
+ 244,3,0,0,160,4,0,0,
+ 254,4,0,0,162,5,0,0,
+ 46,6,0,0,84,6,0,0};
+ int pool_beg;
+
+/* The character directory always begins at position 480 in the Common
+Font File Format. */
+
+ lnf_chardir = 480;
+ ras_len = 0;
+ psize = 0;
+ lsize = 0;
+ msize = 0;
+
+/* Copy the good values into the lnf array */
+
+ for (i=0; i<480; i++)
+ lnf[i] = good_opening[i];
+
+/* Set the last character if necessary */
+
+#define fnt__l_first_character 164
+
+ if (lastch[lnfno] < leftlast && !using_r)
+ lnf[fnt__l_first_character+4] = lastch[lnfno];
+ if (using_r)
+ lnf[fnt__l_first_character+4] = lastch[lnfno]-rightfirst+
+ leftfirst;
+
+/* Set the character counts */
+
+#define fnt__l_infile_locators 204
+#define fnt__l_character_definitions 212
+#define fnt__l_raster_count 220
+
+ i = lnf[fnt__l_first_character+4]-
+ lnf[fnt__l_first_character]+1;
+ ras_beg = lnf_chardir + 4*i + 4 + 48;
+ lnf[fnt__l_infile_locators] = i;
+ lnf[fnt__l_character_definitions] = i;
+ lnf[fnt__l_raster_count] = i;
+ lnf[ras_beg-52] = lnf[ras_beg-51] = lnf[ras_beg-50] =
+ lnf[ras_beg-49] = 0;
+
+/* Set the font file id. This id is a 31-byte string. We make it depend on
+the lnfno number, and on whether this is a left or right font.
+Specifically, the first seven bytes are U0000nn where nn is lnfno possibly
+with a leading zero. The character set part of the ID is 1O if using_r,
+otherwise the default from good_opening. */
+
+#define fnt__t_font_file_id 20
+
+ lnf[fnt__t_font_file_id+5] = lnfno/10+'0';
+ lnf[fnt__t_font_file_id+6] = lnfno % 10 + '0';
+ if (using_r) lnf[fnt__t_font_file_id+20] = 'O';
+
+/* We now have to set some fields in the font format that are pointers to
+where other fields begin. These pointers depend on the number of glyphs we
+are placing in the font file. */
+
+#define fnt__a_subset_tables 128
+
+ lcy.l = lnf_chardir+4*i;
+ copy_to_lnf(fnt__a_subset_tables);
+
+ lcy.l = lcy.l+4;
+ copy_to_lnf(fnt__a_subset_tables+8);
+ copy_to_lnf(fnt__a_subset_tables+16);
+
+ lcy.l = lcy.l+48;
+ copy_to_lnf(fnt__a_subset_tables+24);
+
+#define fnt__a_char_definitions 160
+
+ copy_to_lnf(fnt__a_char_definitions);
+
+/* Set up the string pool region of the font load (48 bytes). The only
+tricky part here is the character set designator at the very beginning of
+the pool. Left fonts use one designator, right fonts another. [[More
+explanation is needed.]] */
+
+ pool_beg = ras_beg-48;
+
+ lnf[pool_beg] = '0';
+ lnf[pool_beg+1] = using_r ? '<':'B';
+ lnf[pool_beg+2] = '\011'; /* ascii tab */
+ lnf[pool_beg+3] = 'Z';
+ lnf[pool_beg+4] = 'Z';
+ lnf[pool_beg+5] = 'Z';
+ lnf[pool_beg+6] = 'Z';
+
+/* For reasons that are beyond my comprehension, the Common Font File
+Format requires us to copy the first seven characters of the font file id
+into one piece of the string pool, and the first sixteen into another
+place. */
+
+ for (i=1; i<8; i++)
+ lnf[pool_beg+7+i-1] = lnf[fnt__t_font_file_id+i-1];
+ for (i=1; i<17; i++)
+ lnf[pool_beg+7+7+i-1] = ' ';
+ for (i=1; i<17; i++)
+ lnf[pool_beg+7+7+16+i-1] = lnf[fnt__t_font_file_id+i-1];
+ lnf[pool_beg+46] = lnf[pool_beg+47] = 0;
+
+/* Now make string descriptors point into the string pool. */
+
+#define fnt__a_char_set 260
+#define fnt__a_family_id 268
+#define fnt__a_family_name 276
+#define fnt__a_font_id 284
+
+ lcy.l = pool_beg;
+ copy_to_lnf(fnt__a_char_set);
+ lcy.l = pool_beg+7;
+ copy_to_lnf(fnt__a_family_id);
+ lcy.l = pool_beg+7+7;
+ copy_to_lnf(fnt__a_family_name);
+ lcy.l = pool_beg+7+7+16;
+ copy_to_lnf(fnt__a_font_id);
+
+/* Mercifully, all remaining font file slots that we can fill now are
+already good as received from good_opening. */
+
+}
+
+
+/* There are only two global entry points to this code. here they are: */
+
+extern int open_pk_file();
+extern int copy_pk_char();
+
+/* We use the following global variables (that were previously defined). */
+
+EXTERN PKFont *pkfont; /* in open_pk_file */
+static float pkconv; /* conversion factor */
+
+/* This routine opens the PK file. It really is just a jacket for the
+routine PKLoadFont We also calculate the conversion factor (pkconv).
+
+Much of this routine is taken or adapted from open_pxl_file. */
+
+
+int open_pk_file(txfno)
+int txfno;
+{
+ float two_to_the_20th = 0x100000;
+ int magnification;
+
+ magnification = 1000.0 * ( (float) txfa[txfno]->scaled_size /
+ (float) txfa[txfno]->design_size ) + 0.5;
+
+ pkfont = PKLoadFont( font_name[txfno], magnification, 300 );
+ if (pkfont == NULL) {
+ if (errno != ENOENT && errno != ENXIO)
+ fprintf( stderr, "%s\n\t\t", PKerror );
+ return(-1);
+ }
+ printf("loading PK file %s, ", PKerror); fflush(stdout);
+
+ pkconv = ( (float) pkfont->design_size * (float) pkfont->magnification ) /
+ ( 5.0 * 72.27 * two_to_the_20th * two_to_the_20th );
+#ifdef PKDEBUG
+ printf( "pkconv=%g, ", pkconv ); fflush(stdout);
+#endif
+ return(0);
+}
+
+
+/* This routine obtains a glyph from a PK font then copies it to the LN03
+buffer. If the glyph isn't in the font, then we call copy_ersatz_char
+to insert a blank character. This routine has greatly adapted and/or
+stolen code from copy_pxl_char. */
+
+copy_pk_char(fontptr,from,txfno,to,lnfno)
+PKFont *fontptr;
+unsigned char from,to;
+int txfno,lnfno;
+{
+ PKGlyph *glyphptr;
+ int i,j, bytes_per_row, def_start = ras_beg + ras_len;
+ int tfm_width, width;
+
+ glyphptr = PKGetGlyph( fontptr, (int) from ); /* get the glyph */
+
+ if (glyphptr == NULL) { /* not there? */
+ width = font_width[txfno][from]*conv + 0.5; /* insert a */
+ return copy_ersatz_char(to,lnfno,width); /* blank */
+ } else if (strlen(PKerror) != 0) { /* error? */
+ printf("%s\n\t\t",PKerror); /* print it out */
+ }
+
+ if (glyphptr->height == 0 || glyphptr->width == 0) { /* kludge for LN03 */
+ width = font_width[txfno][from]*conv + 0.5; /* insert a blank */
+ return copy_ersatz_char(to,lnfno,width);
+ }
+
+/* Copy the rasters to the LN03 buffer. First zero the LN03 glyph header
+and the copy the rasters. */
+
+ bytes_per_row = (glyphptr->width + 7) / 8;
+
+ for (i = 0; i < 24; i++ )
+ lnf[def_start+i] = 0;
+
+ for (i = 0; i < glyphptr->height*bytes_per_row; i++ )
+ lnf[def_start+i+24] = glyphptr->rasters[i];
+
+/* Fill in the header for the LN03 glyph */
+
+ tfm_width = glyphptr->tfm_width*pkconv + 0.5;
+ chw[lnfno][to] = glyphptr->h_escapement / 65536;
+#ifdef PKDEBUG
+ if (tfm_width != chw[lnfno][to]) {
+#ifdef vms
+ globalvalue SS$_DEBUG;
+ LIB$SIGNAL(SS$_DEBUG);
+#else
+ abort();
+#endif
+ }
+#endif
+
+
+ lnf[def_start+3] = 0x80;
+ lcy.ul = 24*chw[lnfno][to]; copy_to_lnf(def_start+4);
+ lcy.l = -24*glyphptr->h_offset; copy_to_lnf(def_start+8);
+ lcy.l = -24*glyphptr->v_offset; copy_to_lnf(def_start+12);
+
+ lnf[def_start+17] = 0x81;
+ lnf[def_start+20] = glyphptr->height%256;
+ lnf[def_start+21] = glyphptr->height*256;
+ lnf[def_start+22] = glyphptr->width%256;
+ lnf[def_start+23] = glyphptr->width*256;
+
+/* The following is copy directly from copy_pxl_char. I have no idea what
+it is really for... */
+
+ { int i, j;
+ lcy.l = def_start;
+ if (to <= leftlast) i = to-leftfirst; else i = to-rightfirst;
+ copy_to_lnf(lnf_chardir+4*i);
+ ras_len += 24 + glyphptr->height*bytes_per_row;
+ ras_len_added += 24 + glyphptr->height*bytes_per_row;
+ if (ras_len%2 == 1) {
+ lnf[ras_beg+ras_len] = 0;
+ ras_len++;
+ ras_len_added++;
+ }
+
+ i = glyphptr->height*((glyphptr->width+7)/8);
+ psize += i;
+ j = ((glyphptr->height+7)/8)*glyphptr->width;
+ lsize += j;
+ msize += (i > j) ? i : j;
+ }
+ return(0);
+}
diff --git a/dviware/ln03/thomas/ln03specials.c b/dviware/ln03/thomas/ln03specials.c
new file mode 100644
index 0000000000..8e050dbdca
--- /dev/null
+++ b/dviware/ln03/thomas/ln03specials.c
@@ -0,0 +1,486 @@
+/* This file contains the code that implements the handling of \special's
+in Ln03DVI.
+
+Copyright (c) 1985, 1987 by Digital Equipment Corporation.
+Originial Author: Flavio Rose, (...!decwrl!dvinci.dec.com!rose)
+
+This version of Ln03DVI is maintained by Matt Thomas.
+Please send all bug reports to either:
+ ...!decwrl!thebay.dec.com!mthomas (UUCP)
+ mthomas@thebay.dec.com (Internet)
+
+Right now, the following \special's are implemented:
+
+ln03:defpoint fixnum ( [dimension] , [dimension] )
+ln03:connect fixnum [/ fixnum] fixnum [/ fixnum]
+ln03:plotfile filename
+ln03:resetpoints fixnum fixnum
+
+A dimension is a number with optional decimal point, followed by one of pt,
+in, pc, cm, mm, bp, dd, cc, and mi.
+
+We try to mimic the functionality of DVIAPS, a program that drives the
+Autologic Micro-5 typesetter, written by Textset Inc. of Ann Arbor,
+Michigan. This has been done on the basis of user-level documentation
+supplied by Textset. This code does not contain any Textset-proprietary
+information.
+
+\special's are parsed case-insensitively.
+
+Revision history:
+
+10/8/85 Created file, wrote, tested code for ln03:plotfile
+
+10/16/85 ln03:resetpoints, ln03:defpoint, ln03:connect
+
+12/12/85 Corrected bug: ln03:plotfile does not update LN03's
+ position to the latest from the DVI file.
+
+*/
+
+#ifdef vms
+#include stdio
+#include ctype
+#include math
+#include file
+#else
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#endif
+
+/* In VMS we declare external variables to be globalref.
+This is not really necessary, just an old habit. */
+
+#ifdef vms
+#define GLOBAL globaldef
+#define EXTERN globalref
+#else
+#define GLOBAL
+#define EXTERN extern
+#endif
+
+#define NUMSPECIALS 4
+
+GLOBAL char *specialnames[NUMSPECIALS] = { "defpoint",
+ "connect", "plotfile", "resetpoints" } ;
+
+EXTERN FILE *dvifile,*outfile;
+
+/* There are two top-level routines for handling specials, one to be
+invoked during pass1, the other to be invoked during pass2. The parameter
+that is passed is the size of the \special string. */
+
+int do_special_pass1 (p)
+int p;
+{
+ for (; p != 0; p--) getc(dvifile);
+ return(0);
+}
+
+/* Specials get put in a buffer for easier parsing. The buffer is a little
+longer than needed to make some things simpler. [[This ought to be
+cleaner.]] */
+
+#define MAXSPECIAL 1000
+
+GLOBAL char sb[MAXSPECIAL+7];
+GLOBAL int sbp,cstart;
+
+/* Do_special_pass2 gets called from the main program to perform special
+processing in pass2, the pass in which stuff actually gets written out to
+the LN3 output file. The parameter p is the length of the special. */
+
+int do_special_pass2 (p)
+int p;
+{
+ char c;
+ int i,j;
+
+/* Skip whitespace in input */
+
+ sbp = 0;
+ while (p != 0) {
+ c = getc(dvifile);
+ p--;
+ if (!isspace(c)) {
+ sb[sbp] = c;
+ sbp = 1;
+ break;
+ }
+ }
+ if (sbp == 0) return(1);
+
+/* Now we have non-whitespace, read the rest of the special, or as much as
+will fit in the buffer. Lowercase the stuff as it is read in. */
+
+ for (; p != 0; p--) {
+ sb[sbp] = tolower(getc(dvifile));
+ sbp++;
+ if (sbp > MAXSPECIAL) break;
+ }
+
+/* Put a null as sentinel at the end of the special. */
+
+ sb[sbp] = 0;
+
+/* Determine whether the special pertains to the ln03, in which case sbpf
+will contain "ln03" followed by whitespace or a colon. */
+
+ if (strncmp(sb,"ln03",sizeof("ln03")-1) != 0) return(1);
+ sbp = sizeof("ln03")-1;
+
+/* Skip whitespace and one colon */
+
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] != ':') return(1);
+ sbp++;
+
+/* Now, it might be that the special was too long for the special buffer,
+so check that out and issue an error message. */
+
+ if (p != 0) {
+ printf("\n \special too long (over %d bytes).",MAXSPECIAL);
+ for (; p != 0; p--) getc(dvifile);
+ return(1);
+ }
+
+/* Now determine if the special command is one of those which the driver is
+supposed to recognize. As in the DVIAPS program, only the first six bytes
+of the command are significant, so plotfile could be written plotfi and
+defpoint could be written defpoi. */
+
+ while (isspace(sb[sbp])) sbp++;
+ cstart = sbp;
+ while (!isspace(sb[sbp]) && sb[sbp] != '\0') sbp++;
+ sb[sbp] = 0;
+ sbp++;
+
+ for (i = 0; i<NUMSPECIALS; i++)
+ if (strncmp(&sb[cstart],specialnames[i],6) == 0) break;
+
+ if (i == NUMSPECIALS) {
+ printf("\n Unrecognized option '%s' ignored in \special command",
+ &sb[cstart]);
+ return(1);
+ } else {
+ switch (i) {
+ case 0:
+ j = do_defpoint_pass2();
+ break;
+ case 1:
+ j = do_connect_pass2();
+ break;
+ case 2:
+ j = do_plotfile_pass2();
+ case 3:
+ j = do_resetpoints();
+ }
+ }
+}
+
+/* In certain \specials, dimensions may be specified in any of nine
+different units of measure. */
+
+#define MAXUNITS 9
+
+GLOBAL char *unit_array[MAXUNITS] = { "pt", "in", "pc", "cm", "mm", "bp",
+ "dd", "cc", "mi" };
+
+/* Unit_convert gives a floating point conversion factor from units to
+pixels. [[The factor for micas is doubtful.]] */
+
+#define PIXELS_PER_INCH (300.0)
+
+GLOBAL float unit_convert[MAXUNITS] = { PIXELS_PER_INCH/72.27,
+ PIXELS_PER_INCH, 12.0*PIXELS_PER_INCH/72.27,
+ PIXELS_PER_INCH/2.54, PIXELS_PER_INCH/25.4,
+ PIXELS_PER_INCH/72.0, (1238.0/1157.0)*PIXELS_PER_INCH/72.27,
+ 12.0*(1238.0/1157.0)*PIXELS_PER_INCH/72.27, PIXELS_PER_INCH/2540.0 };
+
+/* There are 255 point variables, numbered 1 through 255. */
+
+#define MAXPOINTS 255
+
+GLOBAL int point_hh[MAXPOINTS], point_vv[MAXPOINTS];
+GLOBAL int point_present[MAXPOINTS];
+
+GLOBAL char *special_mess = "\n Error in \special{ln03:%s...} parameters";
+
+/* For the purposes of defpoint, we need to know the current horizontal and
+vertical positions in pixels. */
+
+EXTERN int hh,vv,hoff,voff;
+
+/* ln03:defpoint fixnum ( [dimension] , [dimension] ) */
+
+int do_defpoint_pass2()
+{
+ int i,which,hh_val,vv_val;
+ float xx_p,yy_p;
+
+ which = 0;
+ if (scan_fixnum(&which) != 0 || which < 1 || which > MAXPOINTS) {
+ printf(special_mess,"defpoint");
+ printf("\n Invalid point number (%d)",which);
+ return(1);
+ }
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ hh_val = hh;
+ vv_val = vv;
+ if (sb[sbp] != '(') goto record_point;
+ sbp++;
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '\0') goto record_point;
+ if (sb[sbp] == ',') sbp++;
+ else {
+ scan_dimension(&hh_val);
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == ',') sbp++;
+ else goto record_point;
+ }
+ while(isspace(sb[sbp])) sbp++;
+ if (sb[sbp] != ')' && sb[sbp] != '\0') scan_dimension(&vv_val);
+record_point:
+ point_hh[which-1] = hh_val;
+ point_vv[which-1] = vv_val;
+ point_present[which-1] = 1;
+ return(0);
+}
+
+EXTERN long first_counter;
+
+int do_connect_pass2()
+{
+ int a1,b1,a2,b2,w;
+
+ scan_xpoint(&a1,&b1);
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ scan_xpoint(&a2,&b2);
+ while (isspace(sb[sbp]) || sb[sbp] == ',') sbp++;
+ w = 2; /* default width is two pixels ~ 0.4 points */
+ if (sb[sbp] != '\0') scan_dimension(&w);
+
+ if (first_counter%2 == 0) connect_points(b1,b2,w);
+ else connect_points(a1,a2,w);
+
+ return(0);
+}
+
+EXTERN int ln3p,vpset,hh_old;
+
+int do_plotfile_pass2()
+{
+ char buf[512];
+ int i,j;
+ char c;
+
+/* Read filename into array. */
+
+ while (isspace(sb[sbp])) sbp++;
+ i = sbp;
+ while (!isspace(sb[sbp]) && sb[sbp] != '\0') sbp++;
+ sb[sbp] = 0;
+
+/* Try to open the file. [[What is the status of O_RDONLY under Unix? Is
+that a 4.2bsd hack that it would be best to leave out?]] */
+
+#ifdef vms
+ j = open(&sb[i],O_RDONLY,0);
+#else
+ j = open(&sb[i],0,0);
+#endif
+ if (j == -1) {
+ printf("\n Unable to open plotfile %s",&sb[i]);
+ return(1);
+ }
+
+/* In executing the plotfile special, always emit escape sequences to place
+the LN03 at the current position of the DVI file, even if it would seem
+that the LN03 is already there. We do this in order to be able to emit a
+newline at this point. Emitting a newline at this point keeps the line
+length of the .ln3 file to <= 16 characters more than the line length of
+the plotfile. */
+
+ fprintf(outfile,"\n\033[%dd\033[%d`",vv+voff,hh+hoff);
+
+/* Read stuff from the plotfile, write it to the output file. [[Could this
+cause problem with one record being split into two?]] */
+
+ while((i = read(j,buf,512)) > 0)
+ fwrite(buf,i,1,outfile);
+ close(j);
+
+/* Now, set the variables ln3p, vpset and hh_old to indicate to the caller
+that its recorded value of the current position of the LN03 is no longer
+correct. This will make the caller issue absolute positioning commands
+before doing any further output to the dvifile. */
+
+ ln3p = 0;
+ vpset = 0;
+ hh_old = 30000;
+ return(0);
+}
+
+
+/* Scan_fixnum reads an integer off sb[], starting at sbp and advancing sbp
+to the first character past a valid integer. The integer is returned in i.
+*/
+
+int scan_fixnum(i)
+long *i;
+{
+ int sbp_save;
+
+ sbp_save = sbp;
+ *i = atol(&sb[sbp]);
+ while(isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '+' || sb[sbp] == '-') sbp++;
+ while (isdigit(sb[sbp])) sbp++;
+ return(sbp == sbp_save);
+}
+
+
+/* Scan_flonum reads a flonum (without exponential notation) off sb[],
+starting at sbp and advancing sbp to the first character past a valid
+flonum. The flonum is returned in x. [[Unfortunately, it is impossible to
+use atof or sscanf to implement this function, because they don't allow
+flonums like ".3" which don't have any digits before the decimal point.]]
+*/
+
+int scan_flonum(x)
+float *x;
+{
+ float j,frac;
+ char negative;
+ int sbp_save;
+
+ sbp_save = sbp;
+ negative = 0;
+ j = 0.0;
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '-') { negative = 1; sbp++; }
+ else if (sb[sbp] == '+') sbp++;
+ while (isdigit(sb[sbp])) {
+ j = 10.0*j + ((float)(sb[sbp] - '0'));
+ sbp++;
+ }
+ if (sb[sbp] == '.') {
+ sbp++;
+ frac = 0.1;
+ while (isdigit(sb[sbp])) {
+ j += frac*((float)(sb[sbp] - '0'));
+ frac *= 0.1;
+ sbp++;
+ }
+ }
+ if (sbp != sbp_save) {
+ *x = negative ? (-j) : j;
+ return(0);
+ } else return(1);
+
+}
+
+
+/* Scan_dimension tries to parse a dimension off sb[], advancing sbp over
+what it can parse. The dimension is converted to pixels and returned in
+val. If the unit isn't recognizable, scan_dimension prints an error
+message, returns 1 and leaves val unchanged. */
+
+int scan_dimension(val)
+int *val;
+{
+ float x;
+ int i;
+
+ x = 0.0;
+ scan_flonum(&x);
+ while (isspace(sb[sbp])) sbp++;
+ for (i = 0; i<MAXUNITS; i++)
+ if (strncmp(&sb[sbp],unit_array[i],2) == 0) break;
+ if (i == MAXUNITS) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n No such unit of measure: %.2s",&sb[sbp]);
+ return(1);
+ }
+ sbp += 2;
+ x *= unit_convert[i];
+#ifdef vms
+ *val = (x < 0) ? floor(x-0.5) : floor(x+0.5);
+#else
+ *val = (x < 0) ? (x-0.5) : (x+0.5);
+#endif
+ return(0);
+}
+
+/* Scan_xpoint picks an xpoint off sb[], advancing sbp as usual. If both
+parts are present they are returned in a,b; if only one is, it's returned
+in both a and b. */
+
+int scan_xpoint(a,b)
+int *a,*b;
+{
+
+ *a = 0; *b = 0;
+ scan_fixnum(a);
+ while (isspace(sb[sbp])) sbp++;
+ if (sb[sbp] == '/') {
+ sbp++;
+ scan_fixnum(b);
+ } else *b = *a;
+ return(0);
+}
+
+/* int do_rule(xx0,yy0,xx1,yy1) */
+
+int connect_points(b1,b2,w)
+int b1,b2;
+int w;
+{
+ int halfw;
+
+
+ if (b1 < 1 || b1 > MAXPOINTS || !point_present[b1-1]) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Invalid point number (%d)",b1);
+ return(1);
+ }
+ if (b2 < 1 || b2 > MAXPOINTS || !point_present[b2-1]) {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Invalid point number (%d)",b2);
+ return(1);
+ }
+
+ halfw = w/2;
+ if (point_hh[b1-1] == point_hh[b2-1])
+ do_rule(point_hh[b1-1]-halfw,
+ point_vv[b1-1],point_hh[b1-1]+w-1-halfw,
+ point_vv[b2-1]);
+ else if (point_vv[b1-1] == point_vv[b2-1])
+ do_rule(point_hh[b1-1],
+ point_vv[b1-1]-halfw,point_hh[b2-1],
+ point_vv[b1-1]+w-1-halfw);
+ else {
+ printf(special_mess,&sb[cstart]);
+ printf("\n Can't connect along a diagonal.");
+ return(1);
+ }
+ return(0);
+}
+
+int do_resetpoints ()
+{
+ int a,b;
+
+ a = 0;
+ scan_fixnum(&a);
+ b = 0;
+ scan_fixnum(&b);
+
+ if (0 < a && a <= b && b <= MAXPOINTS)
+ for (; a <= b; a++) point_present[a] = 0;
+ else if (0 < a && a <= MAXPOINTS)
+ point_present[a] = 0;
+ return(0);
+}
+
diff --git a/dviware/ln03/thomas/ln03version.c b/dviware/ln03/thomas/ln03version.c
new file mode 100644
index 0000000000..f876f966df
--- /dev/null
+++ b/dviware/ln03/thomas/ln03version.c
@@ -0,0 +1,5 @@
+/* This file contains the current version number of LN03DVI. This file only
+exists because it is much faster to compile this than LN03DVI.C */
+
+char ln03dvi_version[] = "V1.2-013";
+
diff --git a/dviware/ln03/thomas/makefile b/dviware/ln03/thomas/makefile
new file mode 100644
index 0000000000..0baacbba21
--- /dev/null
+++ b/dviware/ln03/thomas/makefile
@@ -0,0 +1,22 @@
+#
+# Makefile for Ln03DVI with PK file support
+#
+# Matt Thomas, Digital Equipment Corp. (mthomas@thebay.dec.com)
+# 23-Mar-87
+#
+# This code is distributed as-is. Thse programs are not a DEC product
+# and are not guaranteed to work.
+#
+LN03OBJS = ln03dvi.o ln03fonts.o ln03specials.o ln03version.o
+PKOBJS = pk.o pkgbl.o
+
+CC = cc
+CFLAGS = -O
+ln03dvi: $(LN03OBJS) $(PKOBJS)
+ $(CC) $(CFLAGS) $(LN03OBJS) $(PKOBJS) -o ln03dvi
+
+$(PKOBJS) : pk.h
+ln03fonts.o : pk.h
+
+clean:
+ rm *.o
diff --git a/dviware/ln03/thomas/pk.c b/dviware/ln03/thomas/pk.c
new file mode 100644
index 0000000000..b3115fd61d
--- /dev/null
+++ b/dviware/ln03/thomas/pk.c
@@ -0,0 +1,1096 @@
+/* Copyright (C) 1987, Matt Thomas
+
+Here starts the code for processing PK files. It was designed to be able
+to run on any byte addressable CPU, but primarily the VAX. If you wonder
+why I did something the way I did, think of the machine code it would produce.
+For instance, I AND instead MOD if I would be MODing by a power of two. In
+other words, I make life for compiler optimizer. I make one assumption. This
+code will always be run on a machine with a large address space and an infinite
+heap (PDP-11s are out of luck).
+
+PK files are big-endian but the VAX [and the LN03] are little endian. So
+everything is backwards! So we have reverse things as we go. Keep this in
+mind as you study the code below. Also a copy of PKtoPX.WEB is very useful
+to have nearby while studying this code.
+
+This code is divided into three parts, the first is the generic part. This
+is where I define by module global variables, macro, includes files, etc.
+The second part is font hadnling code. And the the third id the glyph
+handling code. Each part can be easily found in a listing by looking for
+either GENERIC, FONTS, or GLYPHS in large block letters.
+
+If you find any bugs in following code, please send me a mail message
+telling me where I screwed up. On the Easynet, use THEBAY::MTHOMAS.
+On USENET, try ...!ptsfa!ista!thomas. On the Internet, use
+ptsfa!ista!thomas@{sun.com,lll-crg.arpa,lll-lcc.arpa,ames.nasa.gov}
+
+Thanks,
+Matt Thomas
+PO BOX 121
+Rheem Valley, CA 94570.
+*/
+
+ /***************************************************************************
+****************************************************************************
+
+
+ GGGGGGGG EEEEEEEEE NN NN EEEEEEEE RRRRRRRR IIIIIIII CCCCCCC
+GG EE NNN NN EE RR RR II CC CC
+GG EE NNNN NN EE RR RR II CC
+GG GG EEEEE NN NN NN EEEEE RRRRRRRR II CC
+GG GG EE NN NNNN EE RR RR II CC
+GG GG EE NN NNN EE RR RR II CC CC
+ GGGGGG EEEEEEEEE NN NN EEEEEEEE RR RR IIIIIIII CCCCCC
+
+
+***************************************************************************
+**************************************************************************/
+/* I N C L U D E S */
+
+#ifdef vms
+#include stdio.h
+#include errno.h
+#include stat.h
+#else
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#endif
+#include "pk.h"
+
+/*
+/* Errno gets defined in different ways on different machines.
+/* Under VMS and System V, it gets defined in errno.h but under
+/* BSD 4.x you have declare it yourself. Also we use strchr
+/* instead of index (BSD version) so we conditionalize that here
+/* too.
+*/
+#ifdef bsd4_2
+# define strchr index
+extern int errno;
+#endif
+
+
+/****************************************************
+*****************************************************
+
+
+FFFFFFFFF OOOOOO NN NN TTTTTTTT SSSSSS
+FF OO OO NNN NN TT SS SS
+FF OO OO NNNN NN TT SS
+FFFFFF OO OO NN NN NN TT SSSSSS
+FF OO OO NN NNNN TT SS
+FF OO OO NN NNN TT SS SS
+FF OOOOOO NN NN TT SSSSSS
+
+
+*****************************************************
+****************************************************/
+
+
+#ifdef ANSIC
+extern PKFont * PKLoadFont( char fontname, int magnification, int pixelsize );
+extern void PKTrimFont( PKFont *fontptr );
+extern void PKUnloadFont( PKFont *fontptr );
+static float PKAcutalFactor( int magnification );
+static char * PKGetFontFileName( char *fontname, int magnification, int pixelsize );
+static PKFont * PKReadFontPreamble( PKFont *fontptr );
+#else
+extern PKFont * PKLoadFont();
+extern void PKTrimFont();
+extern void PKUnloadFont();
+static float PKAcutalFactor();
+static char * PKGetFontFileName();
+static PKFont * PKReadFontPreamble();
+#endif
+
+/* This routine opens the PK file. In addition for reasons of speed and
+efficency, it is easier and faster to malloc enough memory to store the
+entire PK file in memory than to read and seek as needed from the file.
+So in this routine, not only do we open the PK file but we also completely
+read it into the malloc'ed buffer. We also read the preamble to verify
+the magnification and to get the font characterstics. */
+
+PKFont *
+PKLoadFont( fontname, magnification, pixelsize )
+char *fontname;
+int magnification;
+int pixelsize;
+{
+ PKFont *fontptr;
+ int i,j, pkf;
+ char *filespec;
+ struct stat stat_buf;
+
+ PKerror[0] = '\0';
+
+ filespec = PKGetFontFileName( fontname, magnification, pixelsize );
+ pkf = open(filespec,0);
+ if (pkf == -1) {
+ (void) strcpy( PKerror, filespec );
+ return(NULL);
+ }
+
+ j = sizeof(PKFont) + strlen(fontname) + 1;
+ fontptr = (PKFont *) malloc( j );
+ if (fontptr == NULL) {
+ sprintf( PKerror, "can't malloc %ld bytes for font structure", j );
+ close(pkf);
+ return(NULL);
+ }
+
+ fontptr->fontname = ((char *) fontptr) + sizeof(PKFont);
+ strcpy( fontptr->fontname, fontname );
+
+ fontptr->filespec = filespec;
+
+ for ( i = 0; i <= PKMAXGLYPH; i++ ) {
+ fontptr->packed_glyphs[i] = NULL;
+ fontptr->unpacked_glyphs[i] = NULL;
+ }
+
+/* Seek to the end of the file to determine the size of the
+file, free the previously malloc'ed buffer, and then malloc
+enough heap to save it in memory. After that is done, seek
+back to the beginning of the file, and read the contents
+into the just malloc'ed buffer. KLUDGE ALERT!!! Since fstat
+under VMS doesn't work across DECnet, we kludge around by just
+allocating a buffer of 100KB and hope it's enough. */
+
+ i = fstat( pkf, &stat_buf );
+ if (i < 0) {
+#ifdef vms
+ if (errno == ENXIO || errno == 0) {
+ register char *str = getenv("PKMAXFONTSIZE");
+ j = PKMAXFONTSIZE;
+ if (str != NULL) {
+ j = atol(str);
+ if (j < PKMAXFONTSIZE)
+ j = PKMAXFONTSIZE;
+ }
+ stat_buf.st_size = -1;
+ fontptr->fontsize = j;
+ } else {
+#endif
+ sprintf( PKerror, "fstat failed: errno = %d", errno );
+ close(pkf);
+ PKUnloadFont( fontptr );
+ return(NULL);
+#ifdef vms
+ }
+#endif
+ } else {
+ fontptr -> fontsize = stat_buf.st_size;
+ }
+ fontptr -> fontstream = (unsigned char *) malloc( fontptr->fontsize );
+ if (i < 0) {
+ sprintf( PKerror, "fstat failed: errno = %d", errno );
+ close(pkf);
+ PKUnloadFont( fontptr );
+ return(NULL);
+ }
+ fontptr -> fontsize = stat_buf.st_size;
+ fontptr -> fontstream = (unsigned char *) malloc( fontptr->fontsize );
+ if (fontptr->fontstream == NULL) {
+ sprintf( PKerror, "can't malloc %ld bytes for file buffer", fontptr->fontsize );
+ close(pkf);
+ PKUnloadFont( fontptr );
+ return(NULL);
+ }
+
+/* read the file into the just allocated memory buffer */
+
+ i = 0;
+ do {
+ j = read(pkf, fontptr->fontstream+i, fontptr->fontsize-i);
+ i += j;
+ } while ( j > 0 && i < fontptr->fontsize );
+
+ if (j < 0) {
+ strcpy(PKerror,"read error: errno = %d", errno);
+ close(pkf);
+ PKUnloadFont( fontptr );
+ return(NULL);
+ } else if (i < fontptr->fontsize && stat_buf.st_size != -1) {
+ sprintf( PKerror,
+ "error: premature EOF (%d of %d)",
+ i, fontptr->fontsize);
+ close(pkf);
+ PKUnloadFont( fontptr );
+ return(NULL);
+ }
+ close(pkf);
+
+ fontptr = PKReadFontPreamble( fontptr );
+ return (fontptr);
+}
+
+
+extern void
+PKTrimFont( fontptr )
+PKFont *fontptr;
+{
+ PKerror[0] = '\0';
+
+ if (fontptr->fontstream != NULL)
+ free( fontptr->fontstream );
+ fontptr->fontstream = NULL;
+
+ return;
+}
+
+/* This routines frees all storage associated with a font. */
+
+extern void
+PKUnloadFont( fontptr )
+PKFont *fontptr;
+{
+ int idx;
+
+ PKerror[0] = '\0';
+
+ for( idx = 0; idx <= PKMAXGLYPH; idx ++ )
+ PKFreeGlyph( fontptr->unpacked_glyphs[idx] );
+
+ if (fontptr->filespec != NULL)
+ free( fontptr->filespec );
+
+ if (fontptr->fontstream != NULL)
+ free( fontptr->fontstream );
+
+ return;
+}
+
+
+/* This routine is taken from dvi2ps and is used to get around rounding
+errors in the integer form of the magnification. */
+
+static float
+PKActualFactor(unmodsize)
+int unmodsize; /* actually factor * 1000 */
+{
+ float realsize; /* the actual magnification factor */
+
+ realsize = (float)unmodsize / 1000.0;
+ /* a real hack to correct for rounding in some cases--rkf */
+ if(unmodsize==1095) realsize = 1.095445; /*stephalf*/
+ else if(unmodsize==1315) realsize=1.314534; /*stepihalf*/
+ else if(unmodsize==2074) realsize=2.0736; /*stepiv*/
+ else if(unmodsize==2488) realsize=2.48832; /*stepv*/
+ else if(unmodsize==2986) realsize=2.985984; /*stepiv*/
+ /* the remaining magnification steps are represented with sufficient
+ accuracy already */
+ return(realsize);
+}
+
+/* This routine constructs the file name from supplied fontname and
+magnification. If the magnification is non-positive, then the font name
+is considered to be the filename. When not running under VMS, if colons
+are present in the TEXPKDIR variable, then each directory is searched for
+the PK file until eith no more directories or a file is found. */
+
+static char *
+PKGetFontFileName( fontname, magnification, pixelsize )
+char *fontname;
+int magnification;
+int pixelsize;
+{
+ char *pathlist, *pp, *pkdir;
+ char *filespec = (char *) malloc( strlen(fontname) + 8 );
+ char *fullspec = (char *) malloc( PKFILESPECLENGTH + 1 );
+
+ strcpy(filespec, fontname);
+ if (magnification > 0) {
+ int fext = (float) pixelsize *
+ (float) PKActualFactor(magnification) + 0.5;
+ sprintf( &filespec[strlen(filespec)], ".%dpk\0", fext);
+ }
+
+#ifdef vms
+ strcpy( PKerror, filespec );
+ pathlist = "tex$pkdir:";
+ sprintf( fullspec, "%s%s", pathlist, filespec );
+#else
+ pkdir = (char *) getenv("TEXPKDIR");
+ if (pkdir == NULL)
+ pkdir = "/usr/lib/tex/pkdir";
+ pathlist = (char *) malloc( strlen(pkdir) + 1 );
+ strcpy( pathlist, pkdir );
+ pkdir = pathlist;
+ while (1) {
+ pp = (char *) strchr(pathlist, ':');
+ if (pp != NULL)
+ *pp = '\0';
+ sprintf( fullspec, "%s/%s", pathlist, filespec );
+ if (0 <= access(fullspec, 4)) {
+ strcpy( PKerror, filespec );
+ break;
+ }
+ if (pp != NULL)
+ pathlist = pp + 1;
+ strcpy( PKerror, fullspec );
+ if (pp == NULL)
+ break;
+ }
+ free( pkdir );
+#endif
+ free( filespec );
+ return(fullspec);
+}
+
+
+/* This routine reads the preamble of the PK file and verifies it's
+consistency and reads the font's characteristics into the PKFont
+structure pointed by fontptr. If an error is found Pkerror will contain
+an error message, the font is unloaded, and a NULL will be returned. */
+
+static PKFont *
+PKReadFontPreamble( fontptr )
+register PKFont *fontptr;
+{
+
+ fontptr->fontidx = fontptr->fontstream;
+ if (Get_8Bit_Unsigned(fontptr->fontidx) != PK_PRE) {
+ sprintf(PKerror, "error: bad PK file (no preamble)");
+ PKUnloadFont( fontptr );
+ return(NULL);
+ }
+ if (Get_8Bit_Unsigned(fontptr->fontidx) != PK_ID) {
+ sprintf(PKerror, "bad PK file (invalid id %d)",
+ fontptr->fontstream[1] );
+ PKUnloadFont( fontptr );
+ return( NULL );
+ }
+
+/* Calculate the true magnification. */
+
+ /* skip the comment */
+ fontptr->fontidx += Get_8Bit_Unsigned(fontptr->fontidx);
+
+ fontptr->design_size = Get_32Bit_Unsigned(fontptr->fontidx);
+ fontptr->checksum = Get_32Bit_Unsigned(fontptr->fontidx);
+ fontptr->v_pixels_per_point = Get_32Bit_Unsigned(fontptr->fontidx);
+ fontptr->h_pixels_per_point = Get_32Bit_Unsigned(fontptr->fontidx);
+
+ fontptr->magnification = 5.0 * (float) fontptr->h_pixels_per_point
+ * 72.27 / 65536.0 + 0.5;
+
+ return(fontptr);
+}
+
+/*********************************************************************
+**********************************************************************
+
+
+
+ GGGGGGGG LL YY YY PPPPPPPP HH HH SSSSSSS
+GG LL YY YY PP PP HH HH SS SS
+GG LL YYYY PP PP HH HH SS
+GG GGG LL YY PPPPPPPP HHHHHHHHHH SSSSSS
+GG GG LL YY PP HH HH SS
+GG GG LL YY PP HH HH SS SS
+ GGGGGG LLLLLLLLLL YY PP HH HH SSSSSS
+
+
+*********************************************************************
+********************************************************************/
+
+/*
+/* Get a specific glyph from the PK file
+*/
+extern PKGlyph * PKGetGlyph();
+
+/*
+/* Get a specific glyph from the PK file, analyze it's preamble,
+/* but DON'T unpack it.
+*/
+extern PKGlyph * PKGetGlyphInfo();
+
+/*
+/* get the next glyph from the PK file
+*/
+extern PKGlyph * PKGetNextGlyph();
+
+/*
+/* Free storage associated with a glyph.
+*/
+extern void PKFreeGlyph();
+
+/*
+/* Find the glyph in the PK file and return a pointer to it
+*/
+static unsigned char * PKScanForGlyph();
+
+/*
+/* Skip commands in the PK file stream.
+*/
+static unsigned char * PKSkipSpecials();
+
+/*
+/* decodes a glyph requested by 1 or 2
+*/
+static PKGlyph * PKDecodeGlyph();
+
+/*
+/* Read the character preamble and returna a pointer
+/* to a PKGlyph structure with the requested information.
+*/
+static PKGlyph * PKReadPreamble();
+
+/*
+/* Unpack run-length encoded rasters
+*/
+static void PKUnpackRasters();
+
+/*
+/* Copy the unencoded raster format
+*/
+static void PKCopyRasters();
+
+
+/* This routine retrives a specific glyph from the supplied font. */
+
+PKGlyph *
+PKGetGlyph( fontptr, glyph_id )
+PKFont *fontptr;
+int glyph_id;
+{
+ PKGlyph *glyphptr;
+
+ PKerror[0] = '\0';
+
+ if (glyph_id > PKMAXGLYPH || glyph_id < 0) {
+ sprintf( PKerror,
+ "invalid glyph (%d): must be in the range from 0 to %ld",
+ glyph_id, PKMAXGLYPH );
+ return(NULL);
+ }
+
+ if (fontptr->unpacked_glyphs[glyph_id] == NULL)
+ glyphptr = PKReadPreamble( PKScanForGlyph( fontptr, glyph_id ) );
+ else
+ glyphptr = fontptr->unpacked_glyphs[glyph_id];
+
+ if (glyphptr != NULL) {
+ glyphptr->fontptr = fontptr;
+ glyphptr = PKDecodeGlyph( glyphptr );
+ (fontptr->unpacked_glyphs)[glyph_id] = glyphptr;
+ }
+
+ if (glyphptr == NULL) {
+ sprintf( PKerror, "glyph %d not in file", glyph_id );
+ }
+
+ return(glyphptr);
+}
+
+
+/* This routine retrives a specific glyph from the supplied font. */
+
+PKGlyph *
+PKGetGlyphInfo( fontptr, glyph_id )
+PKFont *fontptr;
+int glyph_id;
+{
+ PKGlyph *glyphptr;
+
+ PKerror[0] = '\0';
+
+ if (glyph_id > PKMAXGLYPH || glyph_id < 0) {
+ sprintf( PKerror,
+ "invalid glyph (%d): must be in the range from 0 to %ld",
+ glyph_id, PKMAXGLYPH );
+ return(NULL);
+ }
+
+ if (fontptr->unpacked_glyphs[glyph_id] == NULL)
+ glyphptr = PKReadPreamble( PKScanForGlyph( fontptr, glyph_id ) );
+ else
+ glyphptr = fontptr->unpacked_glyphs[glyph_id];
+
+ if (glyphptr != NULL) {
+ glyphptr->fontptr = fontptr;
+ (fontptr->unpacked_glyphs)[glyph_id] = glyphptr;
+ }
+
+ if (glyphptr == NULL) {
+ sprintf( PKerror, "glyph %d not in file", glyph_id );
+ }
+
+ return(glyphptr);
+}
+
+
+PKGlyph *
+PKGetNextGlyph( fontptr )
+PKFont *fontptr;
+{
+ PKGlyph *glyphptr;
+
+ PKerror[0] = '\0';
+
+ if (fontptr == NULL) {
+ sprintf( PKerror, "font not defined" );
+ return(NULL);
+ }
+
+ glyphptr = PKReadPreamble( PKScanForGlyph( fontptr, -1 ) );
+
+ if (glyphptr != NULL) {
+ glyphptr->fontptr = fontptr;
+ glyphptr = PKDecodeGlyph( glyphptr );
+ fontptr->unpacked_glyphs[glyphptr->glyph_id] = glyphptr;
+ }
+
+ return(glyphptr);
+}
+
+
+void
+PKFreeGlyph( glyphptr )
+PKGlyph *glyphptr;
+{
+ if (glyphptr == NULL)
+ return;
+ glyphptr->fontptr->unpacked_glyphs[glyphptr->glyph_id] = NULL;
+
+ if (glyphptr->rasters != NULL)
+ free(glyphptr->rasters);
+
+ free(glyphptr);
+}
+
+/* Since a PK file does not a directory as does a PXL file we must scan
+the PK file to find a glyph. Also since a PK file may not be sorted in
+ascending order, we may have to scan the entire file. To save time on
+scanning for later glyphs, we remeber the locations of the glyphs we
+enounter.
+
+We scan the PK file without unpacking because each character preamble
+contains the length of packed glyph. Hence we need only read enough
+to obtain the packet_length and the glyph_id.
+
+[[This would be a good time to get PXtoPK.WEB.]]
+
+There are three types of character preambles in a PK file: short, extended
+short, and long. The first byte of every preamble in called the flag_byte.
+It contains three fields, only one of which is used in this routine. It is
+contained in bits 0-2 (the lower three bits) and indicates the type of the
+preamble. Values 0-3 indicate a short preamble, 4-6 a extended short, and 7
+a long.
+
+All the preambles (at least the part we char about here) have three parts:
+the flag_byte [[flag]], the packet_length [[pl]], and the glyph_id [[cc]].
+
+In a short preamble, both the packet_length and the glyph_id are unsigned
+bytes. Also the bottom two bits of the flag_byte are multipled by 256 and
+the result is added to get the true packet length.
+
+In an extended short preamble, the packet_length is a two byte unsigned word
+while the glyph_id is an unsigned char. The bottom two bits of the flag_byte
+should be multiplied by 65536 and added to packet_length.
+
+In a long preamble, both the packet_length and the glyph_id are four byte
+integers.
+
+That's all for now.
+*/
+
+static unsigned char *
+PKScanForGlyph( fontptr, target )
+register PKFont *fontptr;
+int target;
+{
+ unsigned char flag_byte, *glyphptr = NULL;
+ register unsigned char *streamptr;
+ int packet_length, glyph_id;
+
+ /*
+ /* If we have done a PKTrimFont, don't scan.
+ */
+ if (fontptr->fontstream == NULL)
+ return(NULL);
+
+ /*
+ /* See if we have previously scanned it. If so,
+ /* return a pointer to it. Othwise, search for it.
+ */
+ if (target != -1) {
+ glyphptr = fontptr->packed_glyphs[ target ];
+ if (glyphptr != NULL) {
+ return(glyphptr);
+ }
+ }
+
+ streamptr = fontptr->fontidx;
+ do {
+ flag_byte = *streamptr;
+ if (flag_byte >= 240) {
+ if (flag_byte == PK_POST) {
+ sprintf( PKerror, "no more glyphs" );
+ return(NULL);
+ }
+ streamptr = PKSkipSpecials( flag_byte, ++streamptr );
+ continue;
+ }
+
+/* Decode the character preambles to obtain packet lengths and the id of the
+character. */
+
+ glyphptr = streamptr++;
+ flag_byte &= 0x07;
+ if (flag_byte < 4) {
+ packet_length = Get_8Bit_Unsigned( streamptr );
+ if (flag_byte > 0)
+ packet_length += flag_byte * 256;
+ glyph_id = Get_8Bit_Unsigned( streamptr );
+ } else if (flag_byte < 7) {
+ packet_length = Get_16Bit_Unsigned(streamptr);
+ if ((flag_byte -= 4) > 0)
+ packet_length += flag_byte * 65536;
+ glyph_id = Get_8Bit_Unsigned( streamptr );
+ } else {
+ packet_length = Get_32Bit_Unsigned(streamptr);
+ glyph_id = Get_32Bit_Unsigned(streamptr);
+ }
+
+/* Save the glyph's location for later retrieval. Hopefully this will save
+some CPU cycles. Also note that glyphs don't have to be in ascending order
+in a PK file. If a PK file happened to ordered such the most common
+characters are at the beginning, this could save a lot of time. */
+
+ if (fontptr->packed_glyphs[glyph_id] == NULL) {
+ fontptr->packed_glyphs[glyph_id] = glyphptr ;
+ } else {
+ sprintf( PKerror,
+ "warning: duplicate glyph (%d) detected, ",
+ glyph_id);
+ }
+
+/* [[Since we don't expand/decipher a packed glyph immediately, a corrupt PK
+file would give us major confusion. (The packet lengths would be the
+killers) So we just assume the PK files are error-free.]] */
+
+ streamptr += packet_length;
+
+/* We have found what we are looking for, so exit the loop and decipjer it.
+Otherwise keep on looking. */
+
+ } while ((glyph_id != target) && (target != -1));
+
+ fontptr->fontidx = streamptr;
+ if (target == -1 || target == glyph_id) {
+ return(glyphptr);
+ } else {
+ return(NULL);
+ }
+}
+
+
+/* This routine skip commands that may be present in a PK file. And in
+reality we treat them all as NOPs. See the PKtoPX.WEB for what they are
+really used for. */
+
+static unsigned char *
+PKSkipSpecials( flag_byte, streamptr )
+unsigned char flag_byte, *streamptr;
+{
+ int i;
+ switch (flag_byte) {
+ case PK_XXX4: i += *streamptr++; i <<= 8;
+ case PK_XXX3: i += *streamptr++; i <<= 8;
+ case PK_XXX2: i += *streamptr++; i <<= 8;
+ case PK_XXX1: i += *streamptr++;
+ streamptr += i;
+ break;
+ case PK_YYY: streamptr += 4;
+ break;
+ case PK_NO_OP:
+ break;
+ default:
+ sprintf( PKerror,
+ "warning: detected illegal command %d",
+ flag_byte );
+ }
+ return(streamptr);
+}
+
+
+/* This routine decodes a PK glyph and then return a pointer to a
+PKglyph structure (which all the information about the glyph). Normally
+this routine is called by either PKGetGlyph or PKGetNextGlyph. */
+
+static PKGlyph *
+PKDecodeGlyph( glyphptr )
+PKGlyph *glyphptr;
+{
+ int bytes_per_row, raster_size, idx;
+
+ if (glyphptr == NULL)
+ return(NULL);
+
+ if (glyphptr->rasters != NULL)
+ return(glyphptr);
+
+
+/* Decode the character preample, in either short, extended short, or long
+format. Now that the preamble is decoded, we can expand the packed rasters
+(only if they would take up at least one byte). */
+
+ bytes_per_row = (glyphptr->width + 7) / 8;
+ raster_size = bytes_per_row * glyphptr->height + 1;
+ glyphptr->rasters = (unsigned char *) malloc( raster_size );
+
+ for (idx = 0; idx < raster_size; idx++)
+ glyphptr->rasters[idx] = 0;
+
+ if (glyphptr->height != 0 && glyphptr->width != 0) {
+ if (glyphptr->dyn_f < 14) {
+ PKUnpackRasters( glyphptr );
+ } else {
+ PKCopyRasters( glyphptr );
+ }
+ }
+
+ return( glyphptr );
+}
+
+
+/* This routine reads the preamble for a character glyph in a PK file.
+Doing it by brute force in by faar the easiet way to do it, so that's how we
+do it. The LET macro does away with a lot of drugde work.
+
+[[Get your copy of PKtoPX.WEB again.]]
+
+Back to preambles. (see scan_for_glyph) preambles have more fields than
+just the packet_length and the glyph_id. In addition, there are:
+
+ dyn_f: See unpack_rasters
+ black: indicates initial run is black or white
+ tfm_width: width of character in .FIXes (I think)
+ width: width in pixels of minimum bound box for glyph
+ height: height ....
+ hoffset: horizontial offset to reference point (LLHC)
+ voffset: vertical ...
+ hescapement: horizonal escapement in 2^16 pixels
+ vescapement: vertical ...
+
+There are others but we don't use them. dyn_f is from bits 4-7 of the
+flag_byte. black is bit 3 of the flag_byte (useful only if dyn_f < 14).
+
+All values are bytes in the short preamble except for tfm_width which is a 3
+byte integer. In the extended short from, all values are 2 byte words
+except for tfm_width which, again, a 3 byte inetger. In the long preamble,
+all fields are 4 byte integers. All fields are unsigned except for hoffset
+and voffset which are always signed.
+
+*/
+
+static PKGlyph *
+PKReadPreamble( streamptr )
+register unsigned char *streamptr;
+{
+ unsigned flag_byte, dyn_f, color, packet_length, glyph_id;
+ unsigned tfm_width, height, width, hescapement, vescapement;
+ int hoffset, voffset;
+
+ flag_byte = Get_8Bit_Unsigned(streamptr);
+ dyn_f = (flag_byte >> 4);
+ color = ((flag_byte & 0x08) != 0);
+ flag_byte &= 0x07;
+
+ if (flag_byte < 4) {
+ packet_length = Get_8Bit_Unsigned(streamptr);
+ glyph_id = Get_8Bit_Unsigned(streamptr);
+ tfm_width = Get_24Bit_Unsigned(streamptr);
+ hescapement = Get_8Bit_Unsigned(streamptr) * 65536;
+ vescapement = 0;
+ width = Get_8Bit_Unsigned(streamptr);
+ height = Get_8Bit_Unsigned(streamptr);
+ hoffset = Get_8Bit_Signed(streamptr);
+ voffset = Get_8Bit_Signed(streamptr);
+ } else if (flag_byte < 7) {
+ packet_length = Get_16Bit_Unsigned(streamptr);
+ glyph_id = Get_8Bit_Unsigned(streamptr);
+ tfm_width = Get_24Bit_Unsigned(streamptr);
+ hescapement = Get_16Bit_Unsigned(streamptr) * 65536;
+ vescapement = 0;
+ width = Get_16Bit_Unsigned(streamptr);
+ height = Get_16Bit_Unsigned(streamptr);
+ hoffset = Get_16Bit_Signed(streamptr);
+ voffset = Get_16Bit_Signed(streamptr);
+ } else {
+ packet_length = Get_32Bit_Unsigned(streamptr);
+ glyph_id = Get_32Bit_Unsigned(streamptr);
+ tfm_width = Get_32Bit_Unsigned(streamptr);
+ hescapement = Get_32Bit_Unsigned(streamptr);
+ vescapement = Get_32Bit_Unsigned(streamptr);
+ width = Get_32Bit_Unsigned(streamptr);
+ height = Get_32Bit_Unsigned(streamptr);
+ hoffset = Get_32Bit_Signed(streamptr);
+ voffset = Get_32Bit_Signed(streamptr);
+ }
+
+ { register PKGlyph *glyphptr;
+
+ glyphptr = (PKGlyph *) malloc( sizeof(PKGlyph) );
+ if (glyphptr == NULL) {
+ sprintf( PKerror, "can't malloc %ld bytes for a PKGlyph",
+ sizeof(PKGlyph) );
+ return(NULL);
+ }
+ glyphptr->glyph_id = glyph_id;
+ glyphptr->rasters = NULL;
+ glyphptr->prasters = streamptr;
+ glyphptr->tfm_width = tfm_width;
+ glyphptr->width = width;
+ glyphptr->height = height;
+ glyphptr->h_offset = hoffset;
+ glyphptr->v_offset = voffset;
+ glyphptr->h_escapement = hescapement;
+ glyphptr->v_escapement = vescapement;
+ glyphptr->dyn_f = dyn_f;
+ glyphptr->color = color;
+
+ return(glyphptr);
+ }
+}
+
+
+/* This routine decodes the packed rasters pointed to by glyphptr->prasters
+and places the unpacked rasters in the buffer pointed to by
+glyphptr->rasters. Now if it were only that simple...
+
+[[Got PKtoPX.WEB in hand?]]
+
+This routine uses a companion functon, PKGetRunCount, to obtain the run
+counts.
+
+This routine is really just two nested loops. The inner loop generates a
+raster. The outer loop copies it to the LN03 buffer. The outer loop is the
+simpler of the two, so I'll describe it first.
+
+The outer loop has three parts. The first is to clear the array pointed to
+by row_ptr. This is used to hold generated raster. Second is to actually
+generate the raster. Lastly, it copies the generated raster to the LN03
+buffer once, and then N more times (as indicated by the repeat_count).
+The loop terminates when all rows have been processed.
+
+The inner loop generates the raster and places it into the byte array
+pointed to by row_ptr. In each through the loop (until it terminates), we
+can process a certain number of bits (c2). The number is constrained by the
+remaining length of the run count (count), the number of bits left to add to
+finish the raster (width-col), and if the color is "black" the number of
+bits remaining in the byte.
+
+Since the raster was initially cleared, we can skip over all "white" bits in
+row as long as we account for them. Hence, we can process multiple bytes at
+a time with no problem.
+
+If the current color is black, then we are limited to what we can do to a
+byte. But since we do bit operations, we may be pointing to somewhere in
+the middle of byte. So we can, at most, process eight bits at time and
+usually much less. The current bit posiition in the current byte is
+contained in bottom three bits of the column/raster counter, col. This is
+know as the bit wieght, bw. A bit weight of 0 indicates that we are
+currently byte-aligned. So if the color is black, we can process up to
+8-bw bits at time, at the resulting number of bits would be set starting at
+bit bw. To generate the bitmask, we simply OR BItMask[c2][bw] with the
+current byte.
+
+It may be complicated, but it's fast!
+
+This routine contains a section of code that is equivalent to pk_packed_num in
+PKtoPX.WEB. The only real change from that function is that getnyb is now a C
+macro. One other change is that we don't get/store our results from/in global
+variables, intead they are arguments to the function.
+
+To describe what this functions does is easy. It returns the length of the
+next stream of bits. To describe how it does is not. For that, i refer you
+to PKtoPX.WEB and allow you to compare the code.
+
+*/
+
+#ifdef vax
+struct nybble_struct {
+ unsigned low_nyb : 4;
+ unsigned high_nyb : 4;
+ };
+
+#define getnyb(ptr) ((glyphptr->nybflag) ? \
+ (glyphptr->nybflag=0, \
+ (int) (((struct nybble_struct *) (ptr)++)->low_nyb)) : \
+ (glyphptr->nybflag=1, \
+ (int) (((struct nybble_struct *) (ptr))->high_nyb)) \
+ )
+#else
+#define getnyb(ptr) ((glyphptr->nybflag) ? \
+ (glyphptr->nybflag=0, (ptr)++, (ptr)[-1] & 0x0f) : \
+ (glyphptr->nybflag=1, *(ptr) >> 4) )
+#endif
+static void
+PKUnpackRasters( glyphptr )
+register PKGlyph *glyphptr;
+{
+ int height = glyphptr->height, width=glyphptr->width;
+ int color = glyphptr->color;
+ unsigned char *outptr = glyphptr->rasters;
+ unsigned char *inptr = glyphptr->prasters;
+
+ int bytes_per_row, row, repeat_count, count, dyn_f;
+ unsigned char *row_ptr, tmp_row[128];
+#ifdef PKDEBUG
+ printf("unpacking "); fflush(stdout);
+#endif
+ bytes_per_row = (width + 7) / 8;
+ if (bytes_per_row > sizeof(tmp_row)) {
+ row_ptr = (unsigned char *) malloc( bytes_per_row );
+ if (row_ptr == NULL) {
+ sprintf( PKerror, "can't malloc %ld byte for raster buffer",
+ bytes_per_row );
+ return;
+ }
+ } else {
+ row_ptr = tmp_row;
+ }
+ color ^= 1; /* corrected on first run count */
+ glyphptr->nybflag = 0; /* start off right */
+ dyn_f = glyphptr->dyn_f; /* store it locally */
+
+ for ( row=0, count=0; row < height; row += 1 + repeat_count) {
+ register int col, idx;
+
+ repeat_count = 0;
+ for ( col = 0; col < bytes_per_row; col++ )
+ row_ptr[col] = 0;
+
+ for ( col=0; col < width; ) {
+ register int c2;
+ if (count == 0) {
+ register int nyb = getnyb(inptr);
+ if (nyb == 0) {
+ register int j;
+ do {
+ j = getnyb(inptr);
+ nyb++;
+ } while (j == 0);
+ for ( ; nyb > 0; nyb-- )
+ j = j*16 + getnyb(inptr);
+ count = j - 15 + (13 - dyn_f)*16 + dyn_f;
+ } else if (nyb <= dyn_f) {
+ count = nyb;
+ } else if (nyb < 14) {
+ count = (nyb - dyn_f - 1)*16 + getnyb(inptr) + dyn_f + 1;
+ } else {
+ if (nyb == 14)
+ repeat_count = -1; /* note that we need a repeat */
+ else
+ repeat_count = 1; /* repeat count is 1 */
+ continue; /* cycle thru and the get the count */
+ }
+ if (repeat_count == -1) { /* need a repeat count? */
+ repeat_count = count; /* yes, save it */
+ count = 0; /* zero the run count */
+ continue; /* and get the run count */
+ }
+ color ^= 1; /* toggle color */
+ }
+ c2 = width - col;
+ if (count < c2) c2 = count;
+ if (color) {
+ register unsigned bw = col & 7;
+ if (8-bw < c2) c2 = 8-bw;
+ row_ptr[ col/8 ] |= BitMask( c2, bw ); /* mask in the btis */
+ }
+ col += c2; /* increment column count */
+ count -= c2; /* decrement run count */
+ }
+
+ /*
+ /* Copy the completed raster to the output area. (N times)
+ */
+ for (idx = repeat_count; idx >= 0; idx--) {
+ for ( col=0; col < bytes_per_row; col++ )
+ *outptr++ = CopyByte(row_ptr[col]);
+ }
+ }
+
+ if (count) { /* consistency check */
+ sprintf( PKerror, "%d extra bits after unpacking", count );
+ }
+ if (bytes_per_row > sizeof(tmp_row))
+ free(row_ptr); /* free malloc'ed storage */
+}
+
+
+
+/* This function reads an unpacked PK raster and stores it into the LN03
+font while byte/bit-reversing along the way. It is almost identical to
+copy_raster_by_bits in PKtoPX.WEB except some optimizarions have been added.
+
+First, if the width happens to be a multiple of a 8 then we copy the row by
+bytes instead by bit. We use an array to unsigned char (rev_byte) to
+reverse bits in the byte. Second, we integrated the routine get_bt into
+copy_pk_rasters. This saves one function call for every bit. On a VAX,
+that is important.
+
+Note that the inner loop is degenerative case of the inner loop of
+unpack_raster which the count as always 1. Also, instead of generating our
+bitmasks by shifting, we use the BitMask array instead.
+
+Lastly we do everything on a byte operand, not a four-byte integer. This
+maskes this code be extremely more transportable to other machines. */
+
+static void
+PKCopyRasters( glyphptr )
+PKGlyph *glyphptr;
+{
+ register int row, ibw, idx = 0;
+ int height = glyphptr->height, width = glyphptr->width;
+ int bytes_per_row = (width + 7) / 8;
+ register unsigned char *outptr = glyphptr->rasters;
+ register unsigned char *inptr = glyphptr->prasters;
+
+#ifdef PKDEBUG
+ printf("copying "); fflush(stdout);
+#endif
+ if ((width & 7) == 0) { /* optimize */
+#ifdef PKDEBUG
+ printf( "by byte, " ); fflush(stdout);
+#endif
+ for ( row=bytes_per_row*height ; row > 0; row-- )
+ outptr[idx++] = ReverseByte(*inptr++);
+ } else {
+#ifdef PKDEBUG
+ printf( "by bit, " ); fflush(stdout);
+#endif
+ for ( row=height, ibw=7; row > 0; row-- ) {
+ register int col, obw;
+ register unsigned char outbyte = 0;
+ for ( col=width,obw=0; col > 0; col-- ) {
+
+ if ((BitMask( 1, ibw ) & *inptr) != 0)
+ outbyte |= BitMask( 1, obw );
+
+ if ((obw += 1) > 7) {
+ obw = 0;
+ outptr[idx++] = CopyByte(outbyte);
+ outbyte = 0;
+ }
+ if ((ibw -= 1) < 0) {
+ ibw = 7;
+ ++inptr;
+ }
+ }
+ if (obw > 0) {
+ obw = 0;
+ outptr[idx++] = CopyByte(outbyte);
+ }
+ }
+ }
+ if (idx != (row = height * bytes_per_row))
+ sprintf( "copied wrong number [%ld] of bytes, should be %ld",idx,row);
+ return;
+}
+
diff --git a/dviware/ln03/thomas/pk.h b/dviware/ln03/thomas/pk.h
new file mode 100644
index 0000000000..a34f92d3ae
--- /dev/null
+++ b/dviware/ln03/thomas/pk.h
@@ -0,0 +1,194 @@
+/* This is an include file which describes the interface to
+the TeX PK font file access routines. */
+
+/* Maximum number of glyphs (and maximum glyph_id) in a PK file is 127 */
+
+#define PKFILESPECLENGTH 255
+#define PKMAXGLYPH 127
+#define PKMAXFONTSIZE 100000
+
+/* Various constants for items in the PK file. See PKtoPX.WEB. */
+
+#define PK_XXX1 240
+#define PK_XXX2 241
+#define PK_XXX3 242
+#define PK_XXX4 243
+#define PK_YYY 244
+#define PK_POST 245
+#define PK_NO_OP 246
+#define PK_PRE 247
+#define PK_ID 89
+
+typedef struct pk_font {
+ char *fontname; /* a pointer to the fontname */
+ char *filespec; /* a pointer to the filespec */
+ int magnification; /* in (1.2^n) * 1000 units */
+ int design_size; /* in 2^-16 points */
+ int checksum; /* should match TFM file */
+ int h_pixels_per_point; /* * 2^16 */
+ int v_pixels_per_point; /* * 2^16 */
+ unsigned char *fontstream; /* ptr to memory image of PK font */
+ unsigned char *fontidx; /* first unread char in stream */
+ int fontsize; /* size of memory image */
+ unsigned char *packed_glyphs[PKMAXGLYPH+1]; /* unexpanded glyphs */
+ struct pk_glyph *unpacked_glyphs[PKMAXGLYPH+1];/* expanded glyphs */
+} PKFont;
+
+typedef struct pk_glyph {
+ int glyph_id; /* The character id */
+ PKFont *fontptr; /* pointer to the PKfont structure */
+ unsigned char *rasters; /* pointer to the expanded rasters */
+ unsigned char *prasters; /* ptr to the packed rasters */
+ unsigned tfm_width; /* in FIXes (2^-20 * design_size) */
+ unsigned width; /* of minimum bound box in pixels */
+ unsigned height; /* of minimum bound box in pixels */
+ int h_offset; /* in pixels */
+ int v_offset; /* in pixels */
+ unsigned h_escapement; /* in pixels * 2^16 */
+ unsigned v_escapement; /* in pixels * 2^16 */
+ unsigned dyn_f : 4; /* see PKtoPX.WEB :-) */
+ unsigned color : 1; /* initial run: black(1) | white(0) */
+ unsigned nybflag : 1; /* nybble bit: upper or lower */
+} PKGlyph;
+
+#ifdef ANSIC
+extern PKFont *PKLoadFont( char *fontname, int magnification );
+extern PKGlyph *PKGetNextGlyph( char *fontname );
+extern PKGlyph *PKGetGlyph( PKFont *fontptr, int glyphid );
+extern PKGlyph *PKGetGlyphInfo( PKFont *fontptr, int glyphid );
+extern void PKFreeGlyph( int glyphid );
+extern void PKUnloadFont( PKFont *fontptr );
+#else
+extern PKFont *PKLoadFont();
+extern PKGlyph *PKGetNextGlyph();
+extern PKGlyph *PKGetGlyph();
+extern PKGlyph *PKGetGlyphInfo();
+extern void PKFreeGlyph();
+extern void PKUnloadFont();
+#endif
+
+/* global variables */
+
+extern char PKerror[]; /* stores last err message */
+extern unsigned char PKbitmask[9][8]; /* see pkgbl.c */
+extern unsigned char PKbytereversal[256]; /* see pkgbl.c */
+
+/* Macros */
+
+/* Here are my macros convert various sized Big-Endian integers into integers
+will always be correct under C. Yes,I know that an overlay (union) is faster
+but these act like a function. And that to me, makes them more useful.
+[[The comma (",") operator is most (and only?) useful in macros.]] */
+
+#ifndef BIG_ENDIAN
+#define Get_8Bit_Signed(ptr) \
+ (ptr += 1, \
+ ( (char *) ptr)[-1] \
+ )
+#define Get_8Bit_Unsigned(ptr) \
+ (ptr += 1, \
+ ((unsigned char *) ptr)[-1] \
+ )
+
+
+#define Get_16Bit_Signed(ptr) \
+ (ptr += 2, \
+ ( (char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+#define Get_16Bit_Unsigned(ptr) \
+ (ptr += 2, \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+
+
+#define Get_24Bit_Singed(ptr) \
+ (ptr += 3, \
+ ( (char *) ptr)[-3] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+#define Get_24Bit_Unsigned(ptr) \
+ (ptr += 3, \
+ ((unsigned char *) ptr)[-3] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+
+
+#define Get_32Bit_Signed(ptr) \
+ (ptr += 4, \
+ ( (char *) ptr)[-4] * 0x1000000 + \
+ ((unsigned char *) ptr)[-3] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+#define Get_32Bit_Unsigned(ptr) \
+ (ptr += 4, \
+ ((unsigned char *) ptr)[-4] * 0x1000000 + \
+ ((unsigned char *) ptr)[-3] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-1] \
+ )
+#else
+#define Get_8Bit_Signed(ptr) \
+ (ptr += 1, \
+ ( (char *) ptr)[-1] \
+ )
+#define Get_8Bit_Unsigned(ptr) \
+ (ptr += 1, \
+ ((unsigned char *) ptr)[-1] \
+ )
+
+
+#define Get_16Bit_Signed(ptr) \
+ (ptr += 2, \
+ ( (char *) ptr)[-1] * 0x100 + \
+ ((unsigned char *) ptr)[-2] \
+ )
+#define Get_16Bit_Unsigned(ptr) \
+ (ptr += 2, \
+ ((unsigned char *) ptr)[-1] * 0x100 + \
+ ((unsigned char *) ptr)[-2] \
+ )
+
+
+#define Get_24Bit_Singed(ptr) \
+ (ptr += 3, \
+ ( (char *) ptr)[-1] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-3] \
+ )
+#define Get_24Bit_Unsigned(ptr) \
+ (ptr += 3, \
+ ((unsigned char *) ptr)[-1] * 0x10000 + \
+ ((unsigned char *) ptr)[-2] * 0x100 + \
+ ((unsigned char *) ptr)[-3] \
+ )
+
+
+#define Get_32Bit_Signed(ptr) \
+ (ptr += 4, \
+ ( (char *) ptr)[-1] * 0x1000000 + \
+ ((unsigned char *) ptr)[-2] * 0x10000 + \
+ ((unsigned char *) ptr)[-3] * 0x100 + \
+ ((unsigned char *) ptr)[-4] \
+ )
+#define Get_32Bit_Unsigned(ptr) \
+ (ptr += 4, \
+ ((unsigned char *) ptr)[-1] * 0x1000000 + \
+ ((unsigned char *) ptr)[-2] * 0x10000 + \
+ ((unsigned char *) ptr)[-3] * 0x100 + \
+ ((unsigned char *) ptr)[-4] \
+ )
+#endif
+
+#define BitMask(count,bitpos) (PKbitmask[count][bitpos])
+#ifdef PKLTOR
+# define CopyByte( byte ) ((unsigned char) PKbytereversal[byte])
+# define ReverseByte( byte ) ((unsigned char) byte)
+#else
+# define CopyByte( byte ) ((unsigned char) byte)
+# define ReverseByte( byte ) ((unsigned char) PKbytereversal[byte])
+#endif
diff --git a/dviware/ln03/thomas/pkgbl.c b/dviware/ln03/thomas/pkgbl.c
new file mode 100644
index 0000000000..e71555d3ce
--- /dev/null
+++ b/dviware/ln03/thomas/pkgbl.c
@@ -0,0 +1,79 @@
+/* These are the external variables used by the PK code. I try to keep them
+at a minimum by attempting passing everything I need.
+
+The following array (BitMask) is probably the best reason why the unpacking
+is as fast as it is. To show you how it is used, say you want a bit mask S
+bits long starting at bit V. Normally, in C, you would do something like
+(((1 << S) - 1) << V) to get the bit mask. This is ugly and pretty slow.
+Instead, we just do a BitMask[S][V].
+
+As you can plainly see, that is MUCH MUCH faster. Minor note: the reason
+the bit position is second index is simple. Many times you know you'll want
+a bitmask of constant size (like 1 as in copy_pk_rasters). By having the
+bit position second, the compiler doesn't have to recompute a starting
+address on each reference. */
+
+#include "pk.h"
+
+char PKerror[512];
+
+unsigned char PKbitmask[9][8] = {
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 },
+ { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80 },
+ { 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0, 0x80 },
+ { 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xE0, 0xC0, 0x80 },
+ { 0x1F, 0x3E, 0x7C, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 },
+ { 0x3F, 0x7E, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 },
+ { 0x7F, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 },
+ { 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80 }
+};
+
+
+
+/* This array serves to reverse the bit order of byte. For instance,
+
+PKbytereversal[0x57] == 0xEA;
+PKbytereversal[PKbytereversal[ n ]] == n;
+
+It serves a quick way of reversing the bits in a byte. */
+
+unsigned char PKbytereversal[256] = {
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
+ 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
+ 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
+ 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
+ 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
+ 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
+ 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
+ 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
+ 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
+ 0x11, 0x91, 0x51, 0x11, 0x31, 0xB1, 0x71, 0xF1,
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
+ 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
+ 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
+ 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
+ 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
+ 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
+ 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
+ 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+};
+
+
diff --git a/dviware/ln03/thomas/setup.bsd4_2 b/dviware/ln03/thomas/setup.bsd4_2
new file mode 100644
index 0000000000..7ad518db28
--- /dev/null
+++ b/dviware/ln03/thomas/setup.bsd4_2
@@ -0,0 +1,4 @@
+chmod 644 Makefile
+sed < Makefile > makefile.tmp -e 's/CFLAGS = -O/CFLAGS = -O -Dbsd4_2/'
+mv makefile.tmp Makefile
+