1
0
mirror of synced 2026-01-13 15:37:38 +00:00
Interlisp.medley/library/UNICODE.TEDIT
rmkaplan 44e42940a9
Tedit 4th round (#1352)
* INSPECT:  Sort datatype fields alphabetically, fixed a small bug

* INSPECT:  Sort only DATATYPE records

* VIRTUALKEYBOARD:  fix loadup

* Reorganizing VIRTUALKEYBOARDS as described in #1267

* KEYBOARDEDITOR:  fixed one bug, still is out of step

* MEDLEYDIR: Pack DSK as the default HOST on the value of (UNIX-GETENV "MEDLEYDIR")

* Move KEYBOARDCONFIGS KEYBOARDEDIT to library/virtualkeyboards

This collects all files relevant to VIRTUALKEYBOARDS into the same subdirectory

* NEARESTCORNER must be onscreen  (addresses #1294

Mouse jumps to the nearest onscreen corner of the ghost region

* EQUALALL tests equivalence of bitmaps and big bitmaps

* Oops, off by one

* INSPECT:  had wrong test in deciding whether to sort or not

* Improve check for closed stream in \UFSCloseFile.

Check if the (STREAM ACCESS) bits are NIL, indicating a closed stream, and
if so do not attempt to close the file again

* COMPAREDIRECTORIES, COMPARESOURCES, COMPARETEXT, EXAMINEDEFS

Relatively minor cleanups, little or no functionality improvements

* Remove calls to OPENFILE

OPENFILE is a residual Interlisp function that returns a litatom instead of a stream.  In almost all cases, this immediate causes an error that litatom files are no longer supported.  I have found (FINDCALLERS) all the examples in lispusers/sources/library/ and replaced OPENFILE with OPENSTREAM (except for the calls from \PEEKPUP and \PEEKNS, that I didn't track down).  There was a trivai call in COMPILE.FILECHECK in COMPILE, but that function is not called anywhere.  So I removed it.

* ADIR:  remove OPENFILE calls, also another stab at \COPYSYS

With respect to \COPYSYS, this replaces the draft PR #1263.  This applies TRUEFILENAME at the start, but remembers whether it was in fact a pseudohost and restores that for the return value.  So if you start in a pseudo world you end up there.

* Next version of TEDIT core files

* Update

* Update

* UPDATE

* UPDATE

* UPDATE:  FORCE-END fix

* FILEIO:  OPENSTREAM parameters default to STREAMPROP

also add LINELENGTH

* Expose useful subfunctions

* TEDITDORADOKEYS - compatibility with new declarations

* Update tedit-exports.all

* * removed from title when all changes are undone

* Delete old tedit fiels

* Add TEDIT.FILEDATE

* REGISTER-TYPED-REGION creates a new TYPED-REGIONS entry

If a window is closed whose region is of an as-yet-unknown type, a new entry will be added implicitly to TYPED-REGIONS to that that region and future regions of that type can be recycled.

* COMPAREDIRECTORIES:  Get AUTHOR only if selected

This may provide a little speed up.  But of more importance, almost all the array crashes I am seeing are underneath (GETFILEINFO xxx 'AUTHOR).  The UFS implementation may be smashing array space, or maybe it is just detecting the corruption.  For now, I'm eliminating this potential source of bad behavior.

* Hilighting and caret flashing in split windows

* A little more on window splitting caret/hilights

* Rename caret functions

* REGIONMANAGER:  Compatibility with REGIONMANAGER PR

* EXAMINEDEFS: Better interpretation of TYPE NIL = (FNS FUNCTIONS) with better formatting

* Refining caret behavior, importing separate changes also in other PRs for compatibility

* Mostly dealing with highlighting and caret flashing in split windows

* FONTPROFILE: specvars declaration for cleanliness

* Prep for UTF8, a little performance tuning

* Meta EOL = non-paragraph linebreak

* Back-scrolling based on linebreak characters, not paragraph breaks, also eliminate obsolete code

* FIddling around with window titles (getting *'s when changed), dealing with titles  not computed by Tedit

* Recompile DOC-OBJECTS because \DIRTY bit has changed

* COMPARETEXT: fixed to avoid EOF error if EOL gets confused

* CLIPBOARD (bug fix also a separate PR)

* \TEXTBOUT of EOL doesn't create a paragraph, though typing does

Otherwise, every line in a plaintext or lisp sourcefile is a separate paragraph, which adds unnecessary overhead.

* TEDIT-PCTREE:  Move some straggling piece and btree functions to their proper home

* Change \TEDIT2 to \TEDIT1 as a way of recognizing a Tedit process

* Prepping for more speed up in SEEing of large source files

* Miscellaneous stability/maintenance/performance changes

Fixes the TEDIT.TITLEMENUFN problem, adds TEDIT.COLLECT.OBJECTS

* TEDIT-FILE :  fix readers for obsolete Tedit file formats

* Cleanout misplaced pane/ files

* Fix for most of the lispusers/ hardcopy failures

They all had to do with the diacritic overbar in Env-os.

* Another diacritic glitch

* MODERNIZE:  Fixed off by one bug in NEARESTCORNER

* Update tedit-exports.all

* The "HELP PURGE" problem, plus a little cleanup

* hide initial caret in menus

* TEDIT-LOOKS, TEDIT-PCTREE:  prep for reducing FIXP's

* LLSYMBOL's FILEMAP was also incomplete

This update hopefully won't reveal any other problems

* Introduce NOTSPLITTABLE TEXTPROPERTY

If T, window-splitting cannot happen for this text stream.  Hopefully removes need for Notecards advice on \TEDIT.SPLITW.

* PSEUDHOSTS and .TEDIT: Apply TRUEFILENAME on PREFIX, update documentation

Documentation addresses #1303 .  Using TRUEFILENAME makes sure it always goes to a ground instance in e.g.  (PSEUDOHOST 'MEDLEY '{MEDLEY}).

* Don't allow Put of readonly file

* Inverted selection (black) hilights in readonly texts

More visible than a little underline when there is no blinking cursor

* Remove redundant type-tests

The I.S.OPRs test the I.V. type for lines and pieces, so that field accesses can safely be fast inside the loops

* MULTIPLE-HARDCOPY: at least fix obvious issues with new Tedit

Also avoided FILELST as a bound variable.  This needs work and maybe a little support from Tedit--it shouldn't be advising and unadvising a Tedit function.

* TEDIT-SELECTION:  Fix hilighting glitch with READONLY texts

(Shift select should have its usual highlighting)

* TEDIT menus are not splittable

* TEDIT-FILE fixes imageobj bug in old Tedit formats

Revealed by running HCFILES

* Improve conversion of unformatted to formatted

Also cache HINTPC inside \CHTOPC

* Fix to pageregion problem in old versions

Also adds TEDIT.NCHARS

* Code cleanup after testing faster scrolling

* EXTERNALFORMAT: \CHECKECOLC macro confusedf ANY vs CR EOL convention

* Recompile callers of \CHECKEOLC macro

* EXTERNALFORMAT: \CHECKECOLC macro confusedf ANY vs CR EOL convention

* Recompile callers of \CHECKEOLC macro

* Mostly work on scrolling and  HCFILE issues

* Trying to fix PSEUDHOSTS conficts

* PDFSTREAM

Backing up to fix merge problems

* update EXTERNALFORMAT to avoid conflicdt

* Mostly diacritic display and hardcopy

* Change DIRTY field to LDIRTY

* Added new user function TEDIT.FINDLOOKS

* WINDOWOBJ:  READIMAGEOBJ doesn't ask for permission

If the image object is on a hyphenated file and it can find a nonhyphenated sister, it loads that.  If that doesn't provide the getfn, it tries the original file.

* If ANY and no CR after LF, return EOL instead of CR

* Move charset management to externalformat (addresses #1454)

Removed IMCHARSET from IMAGEOPS declaration, added FORMATCHARSETFN to EXTERNALFORMAT, put XCCS charset handling in the XCCS externalformat.

* XCCS, fixed a glitch

* Fix EXTERNALFORMAT clash

* Mostly CHARENCODING

* TEDIT-PF-SEE:  Use TEDIT.ATOMBOUND.READTABLE

Tedit word-selection → atom selection in source files

* For merging with new charset arrangement

* Mostly work on hardcopy-display

Also asks before it saves a plaintext file as a formatted file

* Changing to hardcopy display doesn't mark "dirty"

* Mostly Put and Get, reorganizing for UTF8, plus odds and ends

* Straggler: TMAX-XREF.LCOM

* Meta-EOL

* Fix and extend page-format updates

Original TEDIT.PAGEFORMAT was unsafe and less useful.  Also did not update history for undoing.

* Use window's screen's height/width to test offscreen

* Write and read unbreakable character property

* Don't suggest put-name if TEMPLATE

* 2 point hilight if readonly

* Mostly proper treatment of invisible pieces and forward char-delete

* Forward word delete, better paragraph selection, cleanup, lisp source atom selection

* fix conflicts for merge

* fix incompatible merge

* Updates including UTF-8 plaintext files

Other continuing cleanups

* Continue edit after writing out UTF-8 plaintext

* TEDIT-FILE   EOL stays EOL after putting to a different EOL convention

for continued editing.

* Update EXTERNALFORMAT from master

* Get rid of needless file change

* EOL processing

* Fix Lafite glitches

Including relaxing constraints on the order of pieces in Tedit files.

* Unsplit any existing panes before main window is reused

* TEDIT-FILE glitch

* Better TEDIT.FORMATTEDFILEP, more TEDIT.CONCAT

* Headings with concatenated Tedit files

* Adjust page headers and numbers

* Reshaping reestablishes the YBOT of PLINES

* Tighten up on binable, better error when binning on empty textstream

* TEDIT.PUT.STREAM, left click gives point selection

* TEDIT.PUT.STREAM

* Unhighlighting of menu buttons

related to point vs. single-character selection

* Better behavior when moving to foreign target

also some cleanup of the file-putting code

* More improvements to cursor tracking

* Single-char shift-selection (lost an edit)

* Try it again

* Suppress EOF error

* BIN instead of GETBASEBYTE, more cleanup of buttonevent and TEDIT.PUT

* Mostly work on process and menu configuration

* A little more careful in choosing the current selection (as opposed to prior search target) for find and substitutes

Use the selection if it is greater than a single character, otherwise the prior target.  meta,G is available for clearly just repeating the prior target.

* Make the names of the Tedit menu process more distinctive

E.g. TEDIT-Charlooks instead of TEDIT#2.  TEDIT and TEDIT#n stand out as the document processes.

* Logically correct undo of Move between different documents

The destination document keeps the delete event in the source, if it is still the most recent source event when the move is undone, the deletion is undone in the source.  Otherwise, the deletion is ignored.

* Line spacing reflects offsets

* TEXTPROP returns length

* TEDIT-HISTORY:  Redo of a move just does a new-location insert

* remove unwanted cpv from PR

* Removed the unecessary SPTEXTOBJ field in SELPIECES, move work on move-undo

* Fix hardcopy bug

* More work on the hardcopy interface

* TEDIT-FILE addresses put of empty stream (issue #1577)

---------

Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
Co-authored-by: Larry Masinter <lmm@acm.org>
2024-03-11 23:12:46 -07:00

112 lines
17 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Medley UNICODE
2
4
1
UNICODE
1
4
By Ron Kaplan
This document was last edited in February 2024.
The UNICODE library package defines external file formats that enable Medley to read and write files where 16 bit character codes are represented as UTF-8 byte sequences or big-endian UTF16 byte-pairs. It also provides for character codes to be converted (on reading) from Unicode codes to equivalent codes in the Medley-internal Xerox Character Code Standard (XCCS) and (on writing) from XCCS codes to equivalent Unicode codes.
UTF-8 External formats
Four external formats are defined when the package is loaded:
:UTF-8 codes are represented as UTF-8 byte sequences and XCCS/Unicode character conversion takes place.
:UTF-16BE codes are represented as 2-byte pairs, with the high order byte appearing first in the file, and characters are converted.
The two other external formats translate byte sequences into codes, but do not translate the codes. These allow Medley to see and process characters in their native encoding.
:UTF-8-RAW codes are represented as UTF-8 byte sequences, but character conversion does not take place.
:UTF-16BE-RAW codes are represented as big-ending 2-byte pairs but there is no conversion.
These formats all define the end-of-line convention (mostly for writing) for the external files according to the variable EXTERNALEOL (LF, CR, CRLF), initially set to LF.
The external format can be specified as a parameter when a stream is opened:
(OPENSTREAM 'foo.txt 'INPUT 'OLD '((EXTERNALFORMAT :UTF-8)))
(CL:OPEN 'foo.txt :DIRECTION :INPUT :EXTERNAL-FORMAT :UTF-8)
The function STREAMPROP obtains or changes the external format of an open stream:
(STREAMPROP stream 'EXTERNALFORMAT) -> :XCCS
(STREAMPROP stream 'EXTERNALFORMAT :UTF-8) -> :XCCS
In the latter case, the stream's format is changed to :UTF-8 and the previous value is returned, in this example it is Medley's historical default format :XCCS.
Entries can be placed on the variable *DEFAULT-EXTERNALFORMATS* to change the external format that is set by default when a file is opened on a particular device. Loading UNICODE executes
(PUSH *DEFAULT-EXTERNALFORMATS* '(UNIX :UTF-8))
so that all files opened (by OPENSTREAM, CL:OPEN, etc.) on the UNIX file device will be initialized with :UTF-8. Note that the UNIX and DSK file devices reference the same files (although some caution is needed because {UNIX} does not simulate Medley versioning), but the device name in a file name ({UNIX}/Users/... vs. {DSK}/Users/...) selects the particular device. The default setting above applies only to files specified with {UNIX}; a separate default entry for DSK must be established to change its default from :XCCS.
The user can also specify the external format on a per-stream basis by putting a function on the list STREAM-AFTER-OPEN-FNS. After OPENSTREAM opens a stream and just before it is returned to the calling function, the functions on that list are applied in order to arguments STREAM, ACCESS, PARAMETERS. They can examine and/or change the properties of the stream, in particular, by calling STREAMPROP to change the external format from its device default.
Translating between Unicode and XCCS character codes
The external formats use the primitive macro UNICODE.TRANSLATE to map between XCCS and Unicode codes.
(UNICODE.TRANSLATE CODE TRANSLATION-TABLE) [Macro]
TRANSLATION-TABLE is a XCCS/Unicode mapping table as defined by the code-mapping files for a particular collection of XCCS character sets. These are located in a subdirectory of the top-level MEDLEYDIR directory, as determined by the value of UNICODEDIRECTORIES.
UNICODEDIRECTORIES [Variable]
This is initialized to (>Unicode>Xerox> >Unicode>Xerox>JIS>).
The functions described below construct the translation tables that UNICODE.TRANSLATE makes use of. The tables for an initial default collection of character sets are created during the system-building process. The translation tables for other character sets can be installed in anticipation of work on files that contain those characters. However, UNICODE.TRANSLATE will also install new character sets on demand, the first time an unmapped character is encountered.
The mapping files have conventional names of the form XCCS-[charsetnum]=[charsetname].TXT, for example, XCCS-0=LATIN.TXT, XCCS-357=SYMBOLS4.TXT. The translations used by the external formats are read from these files by the function
(READ-UNICODE-MAPPING FILESPEC NOPRINT NOERROR) [Function]
where FILESPEC can be a list of files, charset octal strings ("0" "357"), or XCCS charset names (LATIN EXTENDED-LATIN GREEK), or XCCS character codes. A character code is taken to indicate the XCCS character set that it belongs to. Reading will be silent if NOPRINT, and the process will not abort if an error occurs and NOERROR. The value is a flat list of the mappings for all the indicated character sets, with elements of the form (XCCC-code Unicode-code).
READ-UNICODE-MAPPING uses READ-UNICODE-MAPPING-FILENAMES to interpret the FILESPEC.
(READ-UNICODE-MAPPING-FILENAMES FILESPEC) [Function]
converts the list of mapping-file specifications into a list of corresponding files in any of the directories in UNICODEDIRECTORIES. If a file specification is the name of a subdirectory it will expand to the names of all of the mapping files in that subdirectory. Thus JIS will result in a list of all of the JIS>XCCS-*=JIS.TXT files.
The mapping from character-set names to octal character-set numbers is provided by the entries on XCCS-CHARSETS.
XCCS-CHARSETS [Variable]
This is an alist whose entries are of the form (NAME OCTAL-CHARSET), for example (GREEK "46"). An entry can also denote a collection of character-sets to be installed all together. Thus the set of character sets that are installed when UNICODE is loaded is specified by the entry
<EFBFBD><EFBFBD><00>!<21>(DEFAULT LATIN ACCENTED-LATIN1 EXTENDED-LATIN SYMBOLS1 SYMBOLS2 FORMS JAPANESE-SYMBOLS1 JAPANESE-SYMBOLS2).
Similarly, the collection of character sets needed to represent the Unicode mapping for Japanese are specified by the entry
<EFBFBD><EFBFBD><00>!<21>(JAPANESE HIRAGANA KATAKANA JIS).
JIS in this entry denotes all of the mapping tables in the JIS subdirectory.
The internal translation tables used by the external formats are constructed from a list of correspondence pairs by the function
(MAKE-UNICODE-TRANSLATION-TABLES MAPPING REINSTALL) [Function]
MAPPING is a list of correspondence pairs as provided by READ-UNICODE-MAPPING or a FILESPEC that can be given to that function. This creates and returns a list of two arrays (XCCS-to-Unicode Unicode-to-XCCS) containing the relevant translation information organized for rapid access. It may also install the mapping arrays in two global variables:
*XCCSTOUNICODE* [Global variable]<5D><>
<EFBFBD>*UNICODETOXCCS* [Global variable]
If *XCCSTOUNICODE* is NIL (initially) or if REINSTALL, the variables *XCCSTOUNICODE* and *UNICODETOXCCS* are set to the respective arrays. The top-level values of these variables are used by the external-format functions to perform translations in either direction.
The function MERGE-UNICODE-TRANSLATION-TABLES can be used to merge additional character-set translations into existing target tables.
(MERGE-UNICODE-TRANSLATION-TABLES ADDITION TARGET) [Function]
ADDITION is either a mapping-array pair or a FILESPEC for a mapping to be constructed. TARGET is either NIL or an existing mapping; if NIL, then the current *XCCSTOUNICODE* and *UNICODETOXCCS* mappings are targeted.
The character-set mapping files are organized so that translations for given XCCS characters and character sets are easily retrieved. But it is more difficult to find the XCCS character set that holds the mapping for a given Unicode code. The Unicode directory also contains a file INVERTED-UNICODE-MAPPINGS.TXT with a simple list structure that maps in the other direction, from Unicodes to corresponding XCCS codes.
(INVERT-ALL-UNICODE-MAPPINGS MAKEFILE) [Function]
This produces the inverted list structure, either returning it or, if MAKEFILE, writing it on the file. The inverted index is used by UNICODE.TRANSLATE's to create mapping tables for character sets that have not yet been installed.
The UNICODE file also contains a function for writing a mapping file given a list of mapping pairs. The function
(WRITE-UNICODE-MAPPING MAPPING INCLUDEDCHARSETS FILE) [Function]
produces one or more mapping files for the mapping-pairs in mapping. If the optional FILE argument is provided, then a single file with that name will be produced and contain all the mappings for all the character sets in MAPPING. If FILE and INCLUDEDCHARSETS are not provided, then all of the mappings will again go to a single file with a composite name XCCS-csn1,csn2,csn3.TXT. Each cs may be a single charset number, or a range of adjacent charset numbers. For example, if the mappings contain entries for characters in charset LATIN, SYMBOLS1, SYMBOLS2, and EXTENDED-LATIN, the file name will be XCCS-0,41-43.TXT.
If INCLUDEDCHARSETS is provided, it specifies possibly a subset of the mappings in MAPPING for which files should be produced. This provides an implicit subsetting capability.
Finally, if FILE is not provided and INCLUDEDCHARSETS is T, then a separate file will be produced for each of the character sets, essentially a way of splitting a collection of character-set mappings into separate canonically named files (e.g. XCCS-357=SYMBOLS1.TXT).
Additional UTF-8 and Unicode functions
The following utilities are provided for lower-level manipulation of codes and strings.
(UTF8.BINCODE STREAM RAW) [Function]
Reads bytes of a UTF-8 code starting at the current postion of STREAM, returning the code represented by those bytes. The code is translated to its XCCS equivalent unless RAW. Unlike the INCCODEFN of the external format, this does not do any special EOL interpretation. STREAM is positioned after the last byte read.
(UTF8.VALIDATE STREAM BYTE) [Function]
Reads bytes starting at the current postion of STREAM until reaching the end of a valid UTF-8 encoding. If BYTE is provided, it is interpreted as the first (already-read) byte of the sequence. Otherwise the first byte is read. If the byte sequence is valid, returns the length of the encoding, otherwise NIL. Either way, STREAM is position after the last byte read.
(NUTF8-BYTE1-BYTES BYTE1) [Function]
Returns the number of bytes in a UTF-8 code representation whose first byte is BYTE1.
(NUTF8-CODE-BYTES CODE) [Function]
Returns the number of bytes in the UTF-8 representation of CODE.
(NUTF8-STRING-BYTES STRING RAW) [Function]
Returns the number of bytes in the UTF-8 representation of STRING, translating XCCS to Unicode unless RAW.
(XTOUCODE XCCSCODE) [Function]
Returns the Unicode code corresponding to XCCSCODE.
(UTOXCODE UNICODE) [Function]
Returns the XCCS code corresponding UNICODE.
(XTOUSTRING XCCSSTRING RAW) [Function]
Returns the string of bytes in the UTF-8 representation of the characters in XCCSSTRING (= the bytes in its UTF-8 file encoding).
(HEXSTRING N WIDTH) [Function]
Returns the hex string for N, padded to WIDTH.(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 STYLE NIL USERINFO NIL INVERTED OFF WEIGHT MEDIUM SLOPE REGULAR EXPANSION REGULAR UNDERLINE OFF STRIKEOUT OFF OVERLINE OFF UNBREAKABLE OFF FAMILY MODERN SIZE 10 PROTECTED OFF SELECTPOINT OFF INVISIBLE OFF) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# NIL) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 STYLE NIL USERINFO NIL INVERTED OFF WEIGHT MEDIUM SLOPE REGULAR EXPANSION REGULAR UNDERLINE OFF STRIKEOUT OFF OVERLINE OFF UNBREAKABLE OFF FAMILY MODERN SIZE 10 PROTECTED OFF SELECTPOINT OFF INVISIBLE OFF) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (72 96 468 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# NIL) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 STYLE NIL USERINFO NIL INVERTED OFF WEIGHT MEDIUM SLOPE REGULAR EXPANSION REGULAR UNDERLINE OFF STRIKEOUT OFF OVERLINE OFF UNBREAKABLE OFF FAMILY MODERN SIZE 10 PROTECTED OFF SELECTPOINT OFF INVISIBLE OFF) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (72 96 468 600) NIL)))))
1$4<01>$<01>4<01> $<01>4<01>$<01>4 <01>$<01>7 f<01>$f<01>1<01>$1<00><00>8$1<00><00>8$J<01>$<01> PAGEHEADING RUNNINGHEADTERMINAL
rd(DEFAULTFONT 1 (TERMINAL 12) (TERMINAL 8) (TERMINAL 8) (PDF (TERMINAL 8)) (POSTSCRIPT (TERMINAL 8))) MODERN
TERMINAL
TERMINAL
MODERN 
TIMESROMAN$
 
 HRULE.GETFN HRULE.GETFN HRULE.GETFN   HRULE.GETFN HRULE.GETFN0_@>b <00><00>
^
Nz M==

;#*6^&~/
'PK
 _0f
<00>
Y
84-(* <00> D f6#[/ <00>8k) q<00>b

 /<00>!=|"M<00>3 2 <00>
 Y2 %# MZkl& F8Qf5 V<00>@W <00> &Y%)P
 K('/6<00>&
V
<
;%
*
$
<00>
(DATE:g<><67><EFBFBD>+s<01>z<EFBFBD>