[comp.sources.unix] v11i064: Update kit for lmeming editor, Patch2

rsalz@uunet.UU.NET (Rich Salz) (09/22/87)

Submitted-by: "Alan W. Paeth" <awpaeth%watcgl.waterloo.edu@RELAY.CS.NET>
Posting-number: Volume 11, Issue 64
Archive-name: lemming/Patch2

This is the second half of the lemming updates. It includes a new installation
guide, updates to the tutorial, sample lemming files, and a fixed pitch font
(Gacha10) which was inadvertently omitted from the original posting.

# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Contents:  Gacha10.uu README changenotes editops.lem install textchanges
#	transforms.lem
 
echo x - Gacha10.uu
sed 's/^@//' > "Gacha10.uu" <<'@//E*O*F Gacha10.uu//'
begin 444 Gacha10.bf
M * 8 'X !P!F @D  P   "H        "  " $                       
M                                 ( #  X                     
M           ,80    !!01E'$ A ( "   !P!,-!'X-\'.!P 0 @ ' X@T,?
MCS@^X(A(Y"(1\#C#XY&/1"(3B03B  (!    !T!  "(0@ ,             
M   "@0    !!0:I*$!1"( "@  "(!"3"$$4$(A") @ 0 (A$1**02$0@0(B(
M)#(;B40D$A%"1"(0B00B  (!    "$!   ( @        @         "@0  
M  !'0;+J$!0A0 #!  "9""!"$$4((!")!($( +A$1**02$0@0(@()3(;B40D
M$A%"5"*@4 )"" )Q$,-A'D=8&N)PC4 <EFE8QV&1B$0B\(D"@3P    "0 2&
M  @B0 "A  "H"$- 'HD(/!!Q"($$'Z@(Q*.>"$ \0/@()RH5B43#$Q$"5!2@
M( *"' ()("22B,AD)B(0BH BF9ED(I*1""@B((@"@;P,   "0 2# !4@0,"'
M !^H$(! $4D0(O"("  $ *D0)!*0"%P@0(B()"H5\42 $A&"5!1 ( &"*@)Y
M? 02B$]$(B,0B@ BD8E$@@&*"! J0X@! 3R3   / (G* *(@0  !  #($ !!
M@4\0(A"(!  ('[D )/*02$0@0HB()"85@41$$A%"*!1!4 $"" *)( 02"$A$
M(B(0BH BD8E$0@"*"! J0% "@3P    %0(H* *(@0 8!" "(( 1"$4$@(A")
M H,0 ($0)!*02$0@0HA()"85@40D$A%"* A"B  ""(*)$"22B,A$)B(0BD B
MD9ED(@*$22@4@% "@3P    %0!,' !U ( ( " !Q(./S#H$@'.!P 8$@ 'D0
MPQ,?CS@@X8A/Q"*1@#@CX@Z"* A#B #B"()Y ,-A"$=$&B(0BB <D6E8P0&$
MAD04\"$"@3P        "  ! ( (                   $             
M            0          "  (          B !      A          " "
M@3P           " $ 0                   (                     
M    ,        ( #  X         ',        A          , ,83P  /X 
M                                                            
M                                             #P    '  < !P '
M  < !P '  < #@ 5 !P (P J #$ .  _ $8 30!4 %L 8@!I '  =P!^ (4 
MC "3 )H H0"H *\ M@"] ,0 RP#2 -D X #G .X ]0#\  ,!"@$1 1@!'P$F
M 2T!- $[ 4(!20%0 5<!7@%E 6P!<P%Z 8$!B &/ 98!G0&D :L!L@&Y < !
MQP'' <X!U0'< >,!Z@'Q ?@!_P$& @T"% (; B("*0(P C<"/@)% DP"4P):
5 F$": )O G8"?0*$ HL"D@*9 J "
 
end
@//E*O*F Gacha10.uu//
chmod u=rw,g=r,o=r Gacha10.uu
 
echo x - README
sed 's/^@//' > "README" <<'@//E*O*F README//'
These files update "Lemming - Little Editor for Mice and other Rodents",
which appeared on the net in late July, early August, 1987. The next release
of lemming will include a complete redistribution of the sources and fonts.
Lemming is copyright by Alan Paeth, who allows free distribution to the public
for non-commercial use. More information may be obtained c/o the author.

   /Alan Paeth (awpaeth@watcgl)

------------------
Contents:

README		-- this document
changenotes	-- summary of work done (alerts users to minor changes)
lemir.c		-- new driver for Silicon Graphics Inc. IRIS workstation
lempost.c	-- PostScript driver skeleton (PS macros must be worked on)
Gacha10.uu	-- Gacha10.bf (uuencoded fixed pitch font file, was omitted)
dif-*           -- diff style files recording changes to Makefile, *.h, *.c
runpatches      -- runs "patch" on the above diff files to fix sources
textchanges     -- run "patch tutorial textchanges" to update tutorial
install		-- an installation and customization guide (new)
editops.lem	-- (sample) basic lemming editing operations
transforms.lem  -- (sample) lemming transformations (^S command)
@//E*O*F README//
chmod u=rw,g=r,o=r README
 
echo x - changenotes
sed 's/^@//' > "changenotes" <<'@//E*O*F changenotes//'
The updated version of lemming provides the following changes:

[1] menu support for the X-windows implementation

[2] a driver for the Silicon Graphics Inc. IRIS workstation

[3] a PostScript output module, which may replace the PIC module (see Makefile)
    (note: the actual PostScript macros need debugging -- this is a skeleton)

[4] minor interation changes:

    [a] The "^K" is now the "copy" command -- it is not often used
	(The ^C is reserved for "curvify" -- arcs are a non-released feature)
    [b] Transformations (^S) will now leave behind copies of the transformed
	data when invoked with upper case keystrokes, e.g. "^SM" (mirror&copy)
    [c] Line selection snaps to endpoints, 1/3, 1/2, 2/3 points only (not n/12).

[5] code changes:

    Aside from changes to implement 1-4 the above, a more robust filename
    interface has been added to minimize the chance of overwriting files and
    to simplify typical edit sessions.
    
    The file "lemx.c" has had to #ifdef instructions included which
      [a] control machine byte ordering when sending font bitmaps to X-windows
      [b] allow the windows to be titled (currently turned off)
    See the source code in "lemx.c" for more complete notes
@//E*O*F changenotes//
chmod u=rw,g=r,o=r changenotes
 
echo x - editops.lem
sed 's/^@//' > "editops.lem" <<'@//E*O*F editops.lem//'
LEMMING 1
T 96 448 177 18 6 L B \Interaction Primitives
T 128 384 57 12 4 L N \* Delete
T 128 320 49 12 4 L N \* Copy
T 128 256 50 12 4 L N \* Move
T 128 192 40 12 4 L N \* Tug
T 128 128 140 12 4 L N \* Change Attributes
T 128 64 85 12 4 L N \* Cut (lines)
B 288 400 320 368 1 C N
B 384 400 416 368 1 C I
B 288 336 320 304 1 C N
B 384 336 416 304 1 C N
B 384 272 416 240 1 C N
B 288 208 320 176 1 C N
B 384 208 448 176 1 C N
B 288 144 320 112 1 C N
B 384 144 416 112 3 C B
B 288 80 320 48 1 C N
L 384 80 416 80 1 C N
L 416 80 416 48 1 C N
L 416 48 384 48 1 C N
L 384 48 384 80 1 C N
L 336 384 352 384 1 R N
L 336 320 352 320 1 R N
L 336 256 352 256 1 R N
L 336 192 352 192 1 R N
L 336 128 352 128 1 R N
L 336 64 352 64 1 R N
L 272 48 320 96 1 C N
L 320 96 304 32 1 C N
L 368 48 384 64 1 C N
L 416 96 413 81 1 C N
L 400 80 416 96 1 C N
L 405 49 400 32 1 C N
@//E*O*F editops.lem//
chmod u=rw,g=r,o=r editops.lem
 
echo x - install
sed 's/^@//' > "install" <<'@//E*O*F install//'
              L E M M I N G   I N S T A L L A T I O N    N O T E S


SYSTEM OVERVIEW

Lemming is largely self-contained program, designed to be highly portable.
To achieve this, the following assumptions about the system is assumed:
[note: "system" throughout refers to the user host OS and hardware environment].

[a] a bitmap display is present (only one bit per pixel necessary)
[b] long (>=32 bit) integers are present (used only as needed; fp is optional)
[c] a one-button mouse, tablet or puck is present

Stipulation [a] allows for most any bitmap hardware, [b] allows for virtually
any C compiler while allowing rapid geometric calculations, [c] allows the
largest class of simple interaction devices. On systems with additional
capability:

[a'] color is provided if more than one bit per pixel is present
[b'] floating point may be used for affine transformations (rot, mirror, etc.)
[c'] multiple buttons may be used to drive menus.


INSTALLATION

A successful installation of the code requires:

[1] Placement of the font files referenced by .lemrc. The root directory for
    these files is defined in lemrc.c on the line beginning "#define FONTPATH"
    The actual path should point to the directory containing the fonts copied
    from "lem/fonts" on the distribution tape.
    
    Note: on machines (e.g. IRIS) on which file name lengths are restricted,
    some font names may be too long. In this case, font file extension may be
    changed from ".bf" to ".b" by changing the next consecutive "#define"
    within the file lemrc.c, and by renaming all font files appropriately.
    Renaming of the font name (and not extension) is NOT advised, because of
    incompatibilities when moving .lemrc files between different systems.

[2] Recompiling the sources on the target machine, using the Makefile command.
    The targets "lemik" "lemx" and "lemir" run on the Adage/Ikonas frame-
    buffer, X-windows, and the Silicon Graphics Corp. IRIS. Of these, the
    first is a "minimal" main-frame based system, which uses UNIX OS commands
    to poll two input streams (the stdin keyboard and a tablet datastream)
    in parallel. The last is a nice example of a system in which most user-
    defined procedures are already present in the IRIS system, and the
    integration is particularly straightforward. The X-windows implementation
    is burdened by differences between the SUN and DEC implementations of
    X-windows.

PORTING

Lemming is quite modular, with all ports requiring the creation of one
application module (such as "lemx.c" or "lemik.c"). Porting is most
easily by customizing the module lemik.c (minimal systems -- eg PC's) or
the module lemir (integrated workstation systems providing graphics entry
points).  Porting requires that this module provide the following entries:

[0] int screenw, screenh;

    These global variables define the size of the active viewport/window
    (all graphics items are maintained and depicted in screen coordinates).
    By default, they are typically both 512x512, or the size of the physical
    display. Note: these variables are defined elsewhere in lemming -- they
    need only be referenced by assigning initial or new values to them.

[1] start(); stop()

    The first is called initially by the lemming application. It sets up
    values for "screenw" and "screenh", and may additionally initialize the
    mouse data stream, allocate display color map entries, etc. The companion
    stop() is closed prior to exiting lemming.
    
[2] *int GetEvent(xdn, ydn, xup, yup, ch) 
             *int xdy, *ydn, *xup, *yup; char *ch;
	     
    The procedure returns "NOEVT" "CNTRL" "ALPHA" or "KEYBD". Return codes
    depend on whether a spurious, control, keyboard or mouse event occurred,
    respectively. NOEVT is useful when the event handler must return useless
    events, such as key-up transitions. CNTRL and ALPHA each return an ascii
    character into *ch. MOUSE returns mouse coordinates within the current
    user window/viewport on the display, are are thus on the range 0<=v<screenw
    (or screenh). Both button down and button up locations are recorded, as
    lemming doesn't deal with events of finer granularity. Thus, control may
    remain within GetEvent while a mouse button is down (or it may just set
    some internal state, and return "NOEVT", as in the X-windows version).

[3] setpixelrunh(x0, y0, len, color, dotflag) and setpixelrunv(...)
    int x0, y0, len, color, dotflag;
    
    Which set the pixels (x0,y0)...(x0+len-1,y0) and similarly for
    setpixelrunv to the value "color", which is typically 0, 1, 2 or 3 for
    black, white, red or green.

[4] drawvec(x0, y0, x1, y1, col, width, emph)
    
    Draw a vector from (x0,y0) to (x1,y1) of color and width, using the
    specified emphasis (SOLID, DASHED, DOTTED). If the application does not
    provide such facilities (as on the IRIS, but not the SUN), the user may
    simply call drawline(x0-wid/2,y0+wid/2,x1-wid/2,y1+wid/2,wid,col,emph).
    In this case, the scan conversion is done within "lemvec.c", which will
    made subsequent calls to "setpixelrunh" and "setpixelrunh", as above.

[5] erase()

    Erases the entire drawing area.

[6] charshow(str) and charunshow(n)
    char *str; int n;

    The first writes "str" onto the tty or display to serve as a prompt, error
    or help message. The latter removes "n" characters from the prompt area so
    as to erase it. In the application module "lemik", the prompt strings are
    maintained on the user tty, and charshow is simply a called to
    "fprintf(stderr, str)...", and charunshow similarly generates backspace and
    space characters on stderr. In "lemx" and "lemir" calls to the system font
    routines are called to overlay (in green) the user display area with
    message and help text. This is the preferred strategy, and the code is
    found in lemx.c and lemir.c.

Non-FP Hardware

Lemming uses extended fixed-point math were necessary, but FP is essential
for performing operations such as rotation. The "special" (^S) functions must
be removed in this case, be omitting the "lemspec.c" module and commenting
out the dispatch entry in "lemmain.c". The "undo" facility also makes calls
to this routine. In general, the operation of translation survives, others
vanish, unless the ambitious implementor wishes to special case the operations
of 90-degree rotation and mirroring.

Porting Hardcopy Modules

Lemming does most operations is fixed-point math, with 32-bit longs used to
provide guard digits when divisions take place. The internal representation
of all data therefore is in integers at screen resolution. A typical lemming
window (512x512) printed as a 5" square on a 300 dpi printer thus resolves to
@.01", or 3 laser spots, so output rarely appears coarse. The code attempts
to provide correct rounding and matching of endpoints so that vectors joining
at a common vertex will join correctly on the hardcopy.

The present version generates troff output using the module "lempic.c".
Facilities for output on other devices are provided through available font
names in the .lemrc file. Because of the simplicity of the internal data
structure (a sequential array of page elements, and an end of array counter),
customized hardcopy is particularly simple.

Additional Lemming Primities

Lemming is written in a vaguely Smalltalk fashion. Rather than grouping
modules by action (drawobj, fileobj, selectobj), they are grouped by object
(lemline, lemrect, lemelli...) with the global dispatch done by lemobj.c.
This last file mimics the "message dictionary lookup" operation implicit
in class-based systems. Thus, a new object requires both a new module plus
a new set of case statment entries in lemobj.c. The second module lemobjsup.c
provides default (superclass) actions which may be explicitly called by
each individual class method for generic actions. For instance, generalized
selection (which occurs when within the bounding box of the object).

At present, objects all provide roughly the same fields -- two geometric
points, an emphasis code, a font number code and an optionally filled in
string (for font text), so additions such as generalized splines are not
straightforward (by design -- lemming is a Little Editor, and to achieve
generality does not attempt to harmonize the myriad ways that curves are
handled by troff, tex, postscript and an arbitrary class of display devices).

Obvious changes are to impart glyph or object orientation with the addition of
a "theta" field (say, in units of .1 degrees, or in minutes), or to allow
emphasis on boxes to take on the meaning of opaque, bordered or transparent,
thus allowing for 2-1/2 D hardcopy, given the sequential nature of object
hierarchy. This would additionally require workarea organization primitives
such as "promote", "demote" or "cycle".

At present, non-release versions of lemming which allow a line to be "arced"
into a circular arc of constant radius of curvature exists, as do additional
"Force" attributes for double-ended arrow-heads. Transparent/opaque objects
are also forthcoming. Additional work (e.g. 90 degree rotated fonts) would
probably both overburden the lemming user interface, and make for difficulty
in hardcopy creation, so this probably represents the boundary at which a
graphics editor is no longer "little" -- and our only recourse is for our
little lemming to run off and leap into the sea.
@//E*O*F install//
chmod u=rw,g=r,o=r install
 
echo x - textchanges
sed 's/^@//' > "textchanges" <<'@//E*O*F textchanges//'
12,14c12,15
< graphics images. It presently runs under the Vax (Ikonas), VaxII (X-windows)
< and SUN (X-windows) environments. It is designed to be highly portable: it
< requires a one button mouse and binary (one bitplane) display to operate.
---
> graphics images. It presently runs under the Vax (Ikonas), IRIS, DEC Vax
> (X-windows) and SUN (X-windows) environments. It is designed to be highly
> portable: it requires a one button mouse and binary (one bitplane) display
> to operate.
18c19,20
< PIC output can be produced.
---
> PIC output can be produced, provision in the code for PostScript output
> also exists.
22c24
< Important user files include:
---
> Experimental files are located on:
24,27c26,31
< lemik           # tty based Ikonas Frame Buffer executable
< lemx            # X-windows (GPXII,Sun) executable
< lemdoc          # this document
< .lemrc          # standard defaults (not essential)
---
> lem/src/.lemrc              		# standard defaults (not essential)
> lem/src/lem*.h				# include files
> lem/src/lem*.c				# source code
> lem/bin/lemx				# X-windows, PIC output
> lem/bin/lemik				# Adage/Ikonas framebuffer, PIC output
> lem/bin/lemxps				# X-windows, PostScript (experimental)
29,30c33,35
< In addition, binary font files must be in place on the directory
< /usr/local/lib/BFont/*. The path for this file is in "lemrc.c"
---
> In addition, binary font files must be in place on a user or system directory
> as created by the installer. The installer must make a source level change to
> the #define constant "FONTPATH" in the file "lemrc.c" to reflect this location.
63c68
<    ^C   Copy selections (in place)
---
>    ^C   Curve (arc) a line [unimplemented]
67a73
>    ^K   Copy selections (with offset)
267c273
< It causes pic output to be written, based on the name of the first command
---
> It causes pic output to be written, based on the name of the primary command
328c334
< Selections:
---
> Mark Placement:
330,333c336,343
< Selecting a line near an endpoint moves to the exact endpoint. Selecting
< on a line snaps to some portion of the line that is n/12ths of the way
< along the line. This makes it easy to subdivide lines by 1/2ths, 1/4ths and
< 1/6ths.
---
> When the mark is placed in close proximity to a line, it is constrained to
> fall exactly along some portion of the line segment. Marking a line near an
> endpoint moves to the exact endpoint. Otherwise, if the mark point happens to
> lie in near proximity to a "cardinal" point on the line, the mark will be
> snapped to that location. Cardinal points are those which divide the line
> into segments with small integer ratios in length. Precisely, marking a
> line will snap to the points 1/4 1/3 1/2 2/3 3/4 or the endpoints if
> sufficiently close.
335,336c345,346
< Selecting a rectangle moves to one of nine compass points along the boxes
< edges, or in its center. These points are analogous to PIC's "nw", "ne", "w",
---
> Marking a box snaps the mark to one of nine compass points along the box's
> edge, or to its center. These points are analogous to PIC's "nw", "ne", "w",
339c349
< Selecting an ellipse moves to one of five points: "n", "s", "e", "w" or "c".
---
> Marking an ellipse moves to one of five points: "n", "s", "e", "w" or "c".
412,416c422,426
< command. These operations include mirroring, ninety-degree rotation,
< (non-)differential scaling, arbitrary rotation and alignment. All require the
< presence of the mark to define a local origin, and operate only on selected
< objects. The "Flip" command will mirror objects about the vertical axis passing through the mark. The "CCW" command rotates objects ninety degrees counter-
< clockwise about the mark.
---
> command. These operations include mirroring, ninety-degree rotation, (non-)
> differential scaling, arbitrary rotation and alignment. The operation is
> specified as an additional keystroke following the <^S>. If typed in upper
> case, a copy is left behind following the transformation to the selected
> objects, and the screen is refreshed automatically.
418c428,433
< For remaining commands, the mark must be coincident with exactly two line
---
> All transformations require the presence of the mark to define a local origin,
> and operate only on selected objects. The "Flip" command will mirror objects
> about the vertical axis passing through the mark. The "CCW" command rotates
> objects ninety degrees counter-clockwise about the mark.
> 
> For the remaining commands, the mark must be coincident with exactly two line
439,443c454,457
< also be specified by running the program "lemming {filename}", which invokes
< the read command on the command line specified file. Any number of files may
< be specified on the command line. If "filename" is not found, the command is
< fails. If found, the dataset is checked to see if it is a valid lemming file,
< and the read is aborted if it fails this test.
---
> also be specified by running the program "lemming {filename}", which implicitly
> invokes the "read" command on the command line specified file(s). If any file
> cannot be found (or is not a valid lemming file), the command fails, though the
> editor still enters its interactive state.
444a459,463
> When files are read from the command line, the first (or only) file appearing
> becomes the primary lemming file, when expanded to its full form (possibly
> adding a .lem extension). This primary file name has importance for the write
> command (see below), and when using the "-p" command line option.
> 
452,453c471,476
< hierarchical structure, users may edit it at will. At present, no provision
< for overwrite testing is done.
---
> hierarchical structure, users may edit it at will. When no output file name
> is given, the output overwrites the primary input file, as taken from the
> command line. In all other cases, lemming will refuse to overwrite a file
> which already exists. Thus, if lemming is run without a primary input file,
> a new file will necessarily be created to store the user's drawing at the
> conclusion of the session.
460c483,484
< <^V><^O> to trigger this command.
---
> <^V><^O> to trigger this command. The command will overwrite an existing
> file, so be careful.
488c512
< If followed by a "space" character, help for all commands is given.
---
> If followed by a "?" character, help for all commands is given.
495d518
< Machine Considerations:
496a520,523
> [5] Machine Considerations
> 
> Monochromatic Displays:
> 
499a527,581
> 
> Multiple Mouse Buttons:
> 
> Both the X-windows and IRIS implementations allow for more than one mouse
> button. In this scenario, the leftmost mouse button is used for object
> specification, as with a one-button system. The rightmost button will select
> one of two menus, each containing seven items. The menu selection is merely a
> shorthand convention for typing keystrokes. For instance, selecting "all" has
> an identical effect to typing a <^A> character -- the menu acts as a hard-wired
> function key. The menus are listed below:
> 
> 	|-----------|		|-----------|
> 	|Selections |		|No Select  |
> 	|-----------|		|-----------|
> 	|none	    |		|all	    |
> 	|delete	    |		|read	    |
> 	|box	    |		|write	    |
> 	|ellipse    |		|output	    |
> 	|vector	    |		|quit	    |
> 	|undo	    |		|undo	    |
> 	|refresh    |		|refresh    |
> 	-------------		-------------
> 
> On systems with three-button mice, the middle button functions identically to
> the leftmost button stroke, followed by a <TAB> keystroke. Thus, it most often
> acts as a select key, by virtue of placing the mark and then performing a mark
> selection. In some circumstances (such as area selection) the additional
> <TAB> function is not desirable and selection is better performed with the
> leftmost mouse key.
> 
> Window Software
> 
> On window systems (X-windows, IRIS under the MEX window manager) a title bar
> shows the program name and version, plus the current active .lem file.
> Windows may be resized to change the active work area for any drawing. When
> sized downward, objects might not appear on the display which will nontheless
> appear in the screen output.
> 
> [6] Hints
> 
> Lemming does not (attemp to) guarentee exact glyph placement, character by
> character. Instead, the use of center/left/right text commands guarentee
> that there is exact coorespondence between the select text point on both
> the display and hardcopy. Thus, (for example) left- or right-flush text
> remains so. The fonts appearing in the default .lemrc nontheless have similar
> to widths to the hardcopy fonts, thus giving reasonable coorespondence.
> 
> A second "feature" of lemming is in treatment of special character glyphs.
> Rather than (attempting to) define a equivalence between glyphs and PostScript
> of troff escape sequences, the user is encouraged to simply enter the relevent
> fragments directly. For instance, a troff user using the equation facilities
> of "eqn", which delineates formulae by using the "$" seperator characters,
> might place a centered title such as "Plot of $x sup 2 + y sub 2$" which will
> eventually perform the proper typesetting while maintaining the centered
> attribute. PostScript output works similarly (though is unimplemented).
@//E*O*F textchanges//
chmod u=rw,g=r,o=r textchanges
 
echo x - transforms.lem
sed 's/^@//' > "transforms.lem" <<'@//E*O*F transforms.lem//'
LEMMING 1
E 32 320 64 288 1 C N
L 64 304 128 304 1 C N
L 128 304 160 336 1 C N
L 128 304 160 272 1 C N
L 96 272 96 336 1 C N
L 96 336 80 336 1 C N
E 32 208 64 176 1 C N
L 64 192 128 192 1 C N
L 128 192 160 224 1 C N
L 128 192 160 160 1 C N
L 96 160 96 224 1 C N
L 96 224 80 224 1 C N
E 32 96 64 64 1 C N
L 64 80 128 80 1 C N
L 128 80 160 112 1 C N
L 128 80 160 48 1 C N
L 96 48 96 112 1 C N
L 96 112 80 112 1 C N
T 192 480 138 18 6 L B \Transformations
E 430 432 462 400 1 C N
L 432 416 368 416 1 C N
L 368 416 336 448 1 C N
L 368 416 336 385 1 C N
L 400 385 400 448 1 C N
L 400 448 416 448 1 C N
L 208 336 192 288 1 L N
L 192 288 224 288 1 C N
E 348 308 368 288 1 C N
L 368 298 409 298 1 C N
L 409 298 429 318 1 C N
L 409 298 429 279 1 C N
L 388 279 388 318 1 C N
L 388 318 378 318 1 C N
L 458 318 448 288 1 L N
L 448 288 468 288 1 C N
L 192 192 224 192 1 C N
E 304 272 336 240 1 C N
L 335 249 392 221 1 C N
L 392 221 435 235 1 C N
L 392 221 406 179 1 C N
L 349 206 377 264 1 C N
L 377 264 363 271 1 C N
L 208 112 192 64 1 L N
L 192 64 240 64 1 C N
L 192 192 224 208 1 R N
L 448 192 477 179 1 C N
L 448 192 484 192 1 R N
E 262 96 305 64 1 C N
L 300 80 364 80 1 C N
L 364 80 385 112 1 C N
L 364 80 406 49 1 C N
L 342 49 321 112 1 C N
L 321 112 305 112 1 C N
L 432 112 432 64 1 L N
L 432 64 480 64 1 C N
L 200 424 200 408 1 C N
L 192 416 208 416 1 C N
E 32 432 64 400 1 C N
L 64 416 128 416 1 C N
L 128 416 160 448 1 C N
L 128 416 160 384 1 C N
L 96 384 96 448 1 C N
L 96 448 80 448 1 C N
T 232 416 22 12 4 L N \flip
T 232 320 55 12 4 L N \magnify
T 232 192 41 12 4 L N \rotate
T 232 128 34 12 4 L N \align
@//E*O*F transforms.lem//
chmod u=rw,g=r,o=r transforms.lem
 
exit 0