diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/ln03 |
Initial commit
Diffstat (limited to 'dviware/ln03')
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\qxu}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\qxuxs›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`®›18adxzzyzy›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 @@ +[11h[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 + |