%!PS-Adobe-3.0 %%BoundingBox: (atend) %%Pages: (atend) %%PageOrder: (atend) %%DocumentFonts: (atend) %%Creator: Frame 4.0 %%DocumentData: Clean7Bit %%EndComments %%BeginProlog % % Frame ps_prolog 4.0, for use with Frame 4.0 products % This ps_prolog file is Copyright (c) 1986-1993 Frame Technology % Corporation. All rights reserved. This ps_prolog file may be % freely copied and distributed in conjunction with documents created % using FrameMaker, FrameBuilder and FrameViewer as long as this % copyright notice is preserved. % % Frame products normally print colors as their true color on a color printer % or as shades of gray, based on luminance, on a black-and white printer. The % following flag, if set to True, forces all non-white colors to print as pure % black. This has no effect on bitmap images. /FMPrintAllColorsAsBlack false def % % Frame products can either set their own line screens or use a printer's % default settings. Three flags below control this separately for no % separations, spot separations and process separations. If a flag % is true, then the default printer settings will not be changed. If it is % false, Frame products will use their own settings from a table based on % the printer's resolution. /FMUseDefaultNoSeparationScreen true def /FMUseDefaultSpotSeparationScreen true def /FMUseDefaultProcessSeparationScreen false def % % For any given PostScript printer resolution, Frame products have two sets of % screen angles and frequencies for printing process separations, which are % recomended by Adobe. The following variable chooses the higher frequencies % when set to true or the lower frequencies when set to false. This is only % effective if the appropriate FMUseDefault...SeparationScreen flag is false. /FMUseHighFrequencyScreens true def % % PostScript Level 2 printers contain an "Accurate Screens" feature which can % improve process separation rendering at the expense of compute time. This % flag is ignored by PostScript Level 1 printers. /FMUseAcccurateScreens true def % % The following PostScript procedure defines the spot function that Frame % products will use for process separations. You may un-comment-out one of % the alternative functions below, or use your own. % % Dot function /FMSpotFunction {abs exch abs 2 copy add 1 gt {1 sub dup mul exch 1 sub dup mul add 1 sub } {dup mul exch dup mul add 1 exch sub }ifelse } def % % Line function % /FMSpotFunction { pop } def % % Elipse function % /FMSpotFunction { dup 5 mul 8 div mul exch dup mul exch add % sqrt 1 exch sub } def % % /FMversion (4.0) def /FMLevel1 /languagelevel where {pop languagelevel} {1} ifelse 2 lt def /FMPColor FMLevel1 { false /colorimage where {pop pop true} if } { true } ifelse def /FrameDict 400 dict def systemdict /errordict known not {/errordict 10 dict def errordict /rangecheck {stop} put} if % The readline in PS 23.0 doesn't recognize cr's as nl's on AppleTalk FrameDict /tmprangecheck errordict /rangecheck get put errordict /rangecheck {FrameDict /bug true put} put FrameDict /bug false put mark % Some PS machines read past the CR, so keep the following 3 lines together! currentfile 5 string readline 00 0000000000 cleartomark errordict /rangecheck FrameDict /tmprangecheck get put FrameDict /bug get { /readline { /gstring exch def /gfile exch def /gindex 0 def { gfile read pop dup 10 eq {exit} if dup 13 eq {exit} if gstring exch gindex exch put /gindex gindex 1 add def } loop pop gstring 0 gindex getinterval true } bind def } if /FMshowpage /showpage load def /FMquit /quit load def /FMFAILURE { dup = flush FMshowpage /Helvetica findfont 12 scalefont setfont 72 200 moveto show FMshowpage FMquit } def /FMVERSION { FMversion ne { (Frame product version does not match ps_prolog!) FMFAILURE } if } def /FMBADEPSF { (PostScript Lang. Ref. Man., 2nd Ed., H.2.4 says EPS must not call X ) dup dup (X) search pop exch pop exch pop length 4 -1 roll putinterval FMFAILURE } def /FMLOCAL { FrameDict begin 0 def end } def /concatprocs { /proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx }def FrameDict begin /FMnone 0 def /FMcyan 1 def /FMmagenta 2 def /FMyellow 3 def /FMblack 4 def /FMcustom 5 def /FrameNegative false def /FrameSepIs FMnone def /FrameSepBlack 0 def /FrameSepYellow 0 def /FrameSepMagenta 0 def /FrameSepCyan 0 def /FrameSepRed 1 def /FrameSepGreen 1 def /FrameSepBlue 1 def /FrameCurGray 1 def /FrameCurPat null def /FrameCurColors [ 0 0 0 1 0 0 0 ] def /FrameColorEpsilon .001 def /eqepsilon { sub dup 0 lt {neg} if FrameColorEpsilon le } bind def /FrameCmpColorsCMYK { 2 copy 0 get exch 0 get eqepsilon { 2 copy 1 get exch 1 get eqepsilon { 2 copy 2 get exch 2 get eqepsilon { 3 get exch 3 get eqepsilon } {pop pop false} ifelse }{pop pop false} ifelse } {pop pop false} ifelse } bind def /FrameCmpColorsRGB { 2 copy 4 get exch 0 get eqepsilon { 2 copy 5 get exch 1 get eqepsilon { 6 get exch 2 get eqepsilon }{pop pop false} ifelse } {pop pop false} ifelse } bind def /RGBtoCMYK { 1 exch sub 3 1 roll 1 exch sub 3 1 roll 1 exch sub 3 1 roll 3 copy 2 copy le { pop } { exch pop } ifelse 2 copy le { pop } { exch pop } ifelse dup dup dup 6 1 roll 4 1 roll 7 1 roll sub 6 1 roll sub 5 1 roll sub 4 1 roll } bind def /CMYKtoRGB { dup dup 4 -1 roll add 5 1 roll 3 -1 roll add 4 1 roll add 1 exch sub dup 0 lt {pop 0} if 3 1 roll 1 exch sub dup 0 lt {pop 0} if exch 1 exch sub dup 0 lt {pop 0} if exch } bind def /FrameSepInit { 1.0 RealSetgray } bind def /FrameSetSepColor { /FrameSepBlue exch def /FrameSepGreen exch def /FrameSepRed exch def /FrameSepBlack exch def /FrameSepYellow exch def /FrameSepMagenta exch def /FrameSepCyan exch def /FrameSepIs FMcustom def setCurrentScreen } bind def /FrameSetCyan { /FrameSepBlue 1.0 def /FrameSepGreen 1.0 def /FrameSepRed 0.0 def /FrameSepBlack 0.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 1.0 def /FrameSepIs FMcyan def setCurrentScreen } bind def /FrameSetMagenta { /FrameSepBlue 1.0 def /FrameSepGreen 0.0 def /FrameSepRed 1.0 def /FrameSepBlack 0.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 1.0 def /FrameSepCyan 0.0 def /FrameSepIs FMmagenta def setCurrentScreen } bind def /FrameSetYellow { /FrameSepBlue 0.0 def /FrameSepGreen 1.0 def /FrameSepRed 1.0 def /FrameSepBlack 0.0 def /FrameSepYellow 1.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 0.0 def /FrameSepIs FMyellow def setCurrentScreen } bind def /FrameSetBlack { /FrameSepBlue 0.0 def /FrameSepGreen 0.0 def /FrameSepRed 0.0 def /FrameSepBlack 1.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 0.0 def /FrameSepIs FMblack def setCurrentScreen } bind def /FrameNoSep { /FrameSepIs FMnone def setCurrentScreen } bind def /FrameSetSepColors { FrameDict begin [ exch 1 add 1 roll ] /FrameSepColors exch def end } bind def /FrameColorInSepListCMYK { FrameSepColors { exch dup 3 -1 roll FrameCmpColorsCMYK { pop true exit } if } forall dup true ne {pop false} if } bind def /FrameColorInSepListRGB { FrameSepColors { exch dup 3 -1 roll FrameCmpColorsRGB { pop true exit } if } forall dup true ne {pop false} if } bind def /RealSetgray /setgray load def /RealSetrgbcolor /setrgbcolor load def /RealSethsbcolor /sethsbcolor load def end /setgray { FrameDict begin FrameSepIs FMnone eq { RealSetgray } { FrameSepIs FMblack eq { RealSetgray } { FrameSepIs FMcustom eq FrameSepRed 0 eq and FrameSepGreen 0 eq and FrameSepBlue 0 eq and { RealSetgray } { 1 RealSetgray pop } ifelse } ifelse } ifelse end } bind def /setrgbcolor { FrameDict begin FrameSepIs FMnone eq { RealSetrgbcolor } { 3 copy [ 4 1 roll ] FrameColorInSepListRGB { FrameSepBlue eq exch FrameSepGreen eq and exch FrameSepRed eq and { 0 } { 1 } ifelse } { FMPColor { RealSetrgbcolor currentcmykcolor } { RGBtoCMYK } ifelse FrameSepIs FMblack eq {1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse RealSetgray } ifelse end } bind def /sethsbcolor { FrameDict begin FrameSepIs FMnone eq { RealSethsbcolor } { RealSethsbcolor currentrgbcolor setrgbcolor } ifelse end } bind def FrameDict begin /setcmykcolor where { pop /RealSetcmykcolor /setcmykcolor load def } { /RealSetcmykcolor { 4 1 roll 3 { 3 index add 0 max 1 min 1 exch sub 3 1 roll} repeat setrgbcolor pop } bind def } ifelse userdict /setcmykcolor { FrameDict begin FrameSepIs FMnone eq { RealSetcmykcolor } { 4 copy [ 5 1 roll ] FrameColorInSepListCMYK { FrameSepBlack eq exch FrameSepYellow eq and exch FrameSepMagenta eq and exch FrameSepCyan eq and { 0 } { 1 } ifelse } { FrameSepIs FMblack eq {1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse RealSetgray } ifelse end } bind put FMLevel1 not { /patProcDict 5 dict dup begin <0f1e3c78f0e1c387> { 3 setlinewidth -1 -1 moveto 9 9 lineto stroke 4 -4 moveto 12 4 lineto stroke -4 4 moveto 4 12 lineto stroke} bind def <0f87c3e1f0783c1e> { 3 setlinewidth -1 9 moveto 9 -1 lineto stroke -4 4 moveto 4 -4 lineto stroke 4 12 moveto 12 4 lineto stroke} bind def <8142241818244281> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke -1 -1 moveto 9 9 lineto stroke } bind def <03060c183060c081> { 1 setlinewidth -1 -1 moveto 9 9 lineto stroke 4 -4 moveto 12 4 lineto stroke -4 4 moveto 4 12 lineto stroke} bind def <8040201008040201> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke -4 4 moveto 4 -4 lineto stroke 4 12 moveto 12 4 lineto stroke} bind def end def /patDict 15 dict dup begin /PatternType 1 def /PaintType 2 def /TilingType 3 def /BBox [ 0 0 8 8 ] def /XStep 8 def /YStep 8 def /PaintProc { begin patProcDict bstring known { patProcDict bstring get exec } { 8 8 true [1 0 0 -1 0 8] bstring imagemask } ifelse end } bind def end def } if /combineColor { FrameSepIs FMnone eq { graymode FMLevel1 or not { [/Pattern [/DeviceCMYK]] setcolorspace FrameCurColors 0 4 getinterval aload pop FrameCurPat setcolor } { FrameCurColors 3 get 1.0 ge { FrameCurGray RealSetgray } { FMPColor graymode and { 0 1 3 { FrameCurColors exch get 1 FrameCurGray sub mul } for RealSetcmykcolor } { 4 1 6 { FrameCurColors exch get graymode { 1 exch sub 1 FrameCurGray sub mul 1 exch sub } { 1.0 lt {FrameCurGray} {1} ifelse } ifelse } for RealSetrgbcolor } ifelse } ifelse } ifelse } { FrameCurColors 0 4 getinterval aload FrameColorInSepListCMYK { FrameSepBlack eq exch FrameSepYellow eq and exch FrameSepMagenta eq and exch FrameSepCyan eq and FrameSepIs FMcustom eq and { FrameCurGray } { 1 } ifelse } { FrameSepIs FMblack eq {FrameCurGray 1.0 exch sub mul 1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop FrameCurGray 1.0 exch sub mul 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse graymode FMLevel1 or not { [/Pattern [/DeviceGray]] setcolorspace FrameCurPat setcolor } { graymode not FMLevel1 and { dup 1 lt {pop FrameCurGray} if } if RealSetgray } ifelse } ifelse } bind def /savematrix { orgmatrix currentmatrix pop } bind def /restorematrix { orgmatrix setmatrix } bind def /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /freq dpi dup 72 div round dup 0 eq {pop 1} if 8 mul div def /sangle 1 0 dmatrix defaultmatrix dtransform exch atan def /dpiranges [ 2540 2400 1693 1270 1200 635 600 0 ] def /CMLowFreqs [ 100.402 94.8683 89.2289 100.402 94.8683 66.9349 63.2456 47.4342 ] def /YLowFreqs [ 95.25 90.0 84.65 95.25 90.0 70.5556 66.6667 50.0 ] def /KLowFreqs [ 89.8026 84.8528 79.8088 89.8026 84.8528 74.8355 70.7107 53.033 ] def /CLowAngles [ 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 ] def /MLowAngles [ 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 ] def /YLowTDot [ true true false true true false false false ] def /CMHighFreqs [ 133.87 126.491 133.843 108.503 102.523 100.402 94.8683 63.2456 ] def /YHighFreqs [ 127.0 120.0 126.975 115.455 109.091 95.25 90.0 60.0 ] def /KHighFreqs [ 119.737 113.137 119.713 128.289 121.218 89.8026 84.8528 63.6395 ] def /CHighAngles [ 71.5651 71.5651 71.5651 70.0169 70.0169 71.5651 71.5651 71.5651 ] def /MHighAngles [ 18.4349 18.4349 18.4349 19.9831 19.9831 18.4349 18.4349 18.4349 ] def /YHighTDot [ false false true false false true true false ] def /PatFreq [ 10.5833 10.0 9.4055 10.5833 10.0 10.5833 10.0 9.375 ] def /screenIndex { 0 1 dpiranges length 1 sub { dup dpiranges exch get 1 sub dpi le {exit} {pop} ifelse } for } bind def /getCyanScreen { FMUseHighFrequencyScreens { CHighAngles CMHighFreqs} {CLowAngles CMLowFreqs} ifelse screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load } bind def /getMagentaScreen { FMUseHighFrequencyScreens { MHighAngles CMHighFreqs } {MLowAngles CMLowFreqs} ifelse screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load } bind def /getYellowScreen { FMUseHighFrequencyScreens { YHighTDot YHighFreqs} { YLowTDot YLowFreqs } ifelse screenIndex dup 3 1 roll get 3 1 roll get { 3 div {2 { 1 add 2 div 3 mul dup floor sub 2 mul 1 sub exch} repeat FMSpotFunction } } {/FMSpotFunction load } ifelse 0.0 exch } bind def /getBlackScreen { FMUseHighFrequencyScreens { KHighFreqs } { KLowFreqs } ifelse screenIndex get 45.0 /FMSpotFunction load } bind def /getSpotScreen { getBlackScreen } bind def /getCompositeScreen { getBlackScreen } bind def /FMSetScreen FMLevel1 { /setscreen load }{ { 8 dict begin /HalftoneType 1 def /SpotFunction exch def /Angle exch def /Frequency exch def /AccurateScreens FMUseAcccurateScreens def currentdict end sethalftone } bind } ifelse def /setDefaultScreen { FMPColor { orgrxfer cvx orggxfer cvx orgbxfer cvx orgxfer cvx setcolortransfer } { orgxfer cvx settransfer } ifelse orgfreq organgle orgproc cvx setscreen } bind def /setCurrentScreen { FrameSepIs FMnone eq { FMUseDefaultNoSeparationScreen { setDefaultScreen } { getCompositeScreen FMSetScreen } ifelse } { FrameSepIs FMcustom eq { FMUseDefaultSpotSeparationScreen { setDefaultScreen } { getSpotScreen FMSetScreen } ifelse } { FMUseDefaultProcessSeparationScreen { setDefaultScreen } { FrameSepIs FMcyan eq { getCyanScreen FMSetScreen } { FrameSepIs FMmagenta eq { getMagentaScreen FMSetScreen } { FrameSepIs FMyellow eq { getYellowScreen FMSetScreen } { getBlackScreen FMSetScreen } ifelse } ifelse } ifelse } ifelse } ifelse } ifelse } bind def end /gstring FMLOCAL /gfile FMLOCAL /gindex FMLOCAL /orgrxfer FMLOCAL /orggxfer FMLOCAL /orgbxfer FMLOCAL /orgxfer FMLOCAL /orgproc FMLOCAL /orgrproc FMLOCAL /orggproc FMLOCAL /orgbproc FMLOCAL /organgle FMLOCAL /orgrangle FMLOCAL /orggangle FMLOCAL /orgbangle FMLOCAL /orgfreq FMLOCAL /orgrfreq FMLOCAL /orggfreq FMLOCAL /orgbfreq FMLOCAL /yscale FMLOCAL /xscale FMLOCAL /edown FMLOCAL /manualfeed FMLOCAL /paperheight FMLOCAL /paperwidth FMLOCAL /FMDOCUMENT { array /FMfonts exch def /#copies exch def FrameDict begin 0 ne /manualfeed exch def /paperheight exch def /paperwidth exch def 0 ne /FrameNegative exch def 0 ne /edown exch def /yscale exch def /xscale exch def FMLevel1 { manualfeed {setmanualfeed} if /FMdicttop countdictstack 1 add def /FMoptop count def setpapername manualfeed {true} {papersize} ifelse {manualpapersize} {false} ifelse {desperatepapersize} {false} ifelse { (Can't select requested paper size for Frame print job!) FMFAILURE } if count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for } {{1 dict dup /PageSize [paperwidth paperheight]put pop}stopped { (Can't select requested paper size for Frame print job!) FMFAILURE } if {1 dict dup /ManualFeed manualfeed put setpagedevice } stopped pop } ifelse FMPColor { currentcolorscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def cvlit /orgbproc exch def /orgbangle exch def /orgbfreq exch def cvlit /orggproc exch def /orggangle exch def /orggfreq exch def cvlit /orgrproc exch def /orgrangle exch def /orgrfreq exch def currentcolortransfer FrameNegative { 1 1 4 { pop { 1 exch sub } concatprocs 4 1 roll } for 4 copy setcolortransfer } if cvlit /orgxfer exch def cvlit /orgbxfer exch def cvlit /orggxfer exch def cvlit /orgrxfer exch def } { currentscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def currenttransfer FrameNegative { { 1 exch sub } concatprocs dup settransfer } if cvlit /orgxfer exch def } ifelse end } def /pagesave FMLOCAL /orgmatrix FMLOCAL /landscape FMLOCAL /pwid FMLOCAL /FMBEGINPAGE { FrameDict begin /pagesave save def 3.86 setmiterlimit /landscape exch 0 ne def landscape { 90 rotate 0 exch dup /pwid exch def neg translate pop }{ pop /pwid exch def } ifelse edown { [-1 0 0 1 pwid 0] concat } if 0 0 moveto paperwidth 0 lineto paperwidth paperheight lineto 0 paperheight lineto 0 0 lineto 1 setgray fill xscale yscale scale /orgmatrix matrix def gsave } def /FMENDPAGE { grestore pagesave restore end showpage } def /FMFONTDEFINE { FrameDict begin findfont ReEncode 1 index exch definefont FMfonts 3 1 roll put end } def /FMFILLS { FrameDict begin dup array /fillvals exch def dict /patCache exch def end } def /FMFILL { FrameDict begin fillvals 3 1 roll put end } def /FMNORMALIZEGRAPHICS { newpath 0.0 0.0 moveto 1 setlinewidth 0 setlinecap 0 0 0 sethsbcolor 0 setgray } bind def /fx FMLOCAL /fy FMLOCAL /fh FMLOCAL /fw FMLOCAL /llx FMLOCAL /lly FMLOCAL /urx FMLOCAL /ury FMLOCAL /FMBEGINEPSF { end /FMEPSF save def /showpage {} def % See Adobe's "PostScript Language Reference Manual, 2nd Edition", page 714. % "...the following operators MUST NOT be used in an EPS file:" (emphasis ours) /banddevice {(banddevice) FMBADEPSF} def /clear {(clear) FMBADEPSF} def /cleardictstack {(cleardictstack) FMBADEPSF} def /copypage {(copypage) FMBADEPSF} def /erasepage {(erasepage) FMBADEPSF} def /exitserver {(exitserver) FMBADEPSF} def /framedevice {(framedevice) FMBADEPSF} def /grestoreall {(grestoreall) FMBADEPSF} def /initclip {(initclip) FMBADEPSF} def /initgraphics {(initgraphics) FMBADEPSF} def /initmatrix {(initmatrix) FMBADEPSF} def /quit {(quit) FMBADEPSF} def /renderbands {(renderbands) FMBADEPSF} def /setglobal {(setglobal) FMBADEPSF} def /setpagedevice {(setpagedevice) FMBADEPSF} def /setshared {(setshared) FMBADEPSF} def /startjob {(startjob) FMBADEPSF} def /lettertray {(lettertray) FMBADEPSF} def /letter {(letter) FMBADEPSF} def /lettersmall {(lettersmall) FMBADEPSF} def /11x17tray {(11x17tray) FMBADEPSF} def /11x17 {(11x17) FMBADEPSF} def /ledgertray {(ledgertray) FMBADEPSF} def /ledger {(ledger) FMBADEPSF} def /legaltray {(legaltray) FMBADEPSF} def /legal {(legal) FMBADEPSF} def /statementtray {(statementtray) FMBADEPSF} def /statement {(statement) FMBADEPSF} def /executivetray {(executivetray) FMBADEPSF} def /executive {(executive) FMBADEPSF} def /a3tray {(a3tray) FMBADEPSF} def /a3 {(a3) FMBADEPSF} def /a4tray {(a4tray) FMBADEPSF} def /a4 {(a4) FMBADEPSF} def /a4small {(a4small) FMBADEPSF} def /b4tray {(b4tray) FMBADEPSF} def /b4 {(b4) FMBADEPSF} def /b5tray {(b5tray) FMBADEPSF} def /b5 {(b5) FMBADEPSF} def FMNORMALIZEGRAPHICS [/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall fx fw 2 div add fy fh 2 div add translate rotate fw 2 div neg fh 2 div neg translate fw urx llx sub div fh ury lly sub div scale llx neg lly neg translate /FMdicttop countdictstack 1 add def /FMoptop count def } bind def /FMENDEPSF { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for FMEPSF restore FrameDict begin } bind def FrameDict begin /setmanualfeed { %%BeginFeature *ManualFeed True statusdict /manualfeed true put %%EndFeature } bind def /max {2 copy lt {exch} if pop} bind def /min {2 copy gt {exch} if pop} bind def /inch {72 mul} def /pagedimen { paperheight sub abs 16 lt exch paperwidth sub abs 16 lt and {/papername exch def} {pop} ifelse } bind def /papersizedict FMLOCAL /setpapername { /papersizedict 14 dict def papersizedict begin /papername /unknown def /Letter 8.5 inch 11.0 inch pagedimen /LetterSmall 7.68 inch 10.16 inch pagedimen /Tabloid 11.0 inch 17.0 inch pagedimen /Ledger 17.0 inch 11.0 inch pagedimen /Legal 8.5 inch 14.0 inch pagedimen /Statement 5.5 inch 8.5 inch pagedimen /Executive 7.5 inch 10.0 inch pagedimen /A3 11.69 inch 16.5 inch pagedimen /A4 8.26 inch 11.69 inch pagedimen /A4Small 7.47 inch 10.85 inch pagedimen /B4 10.125 inch 14.33 inch pagedimen /B5 7.16 inch 10.125 inch pagedimen end } bind def /papersize { papersizedict begin /Letter {lettertray letter} def /LetterSmall {lettertray lettersmall} def /Tabloid {11x17tray 11x17} def /Ledger {ledgertray ledger} def /Legal {legaltray legal} def /Statement {statementtray statement} def /Executive {executivetray executive} def /A3 {a3tray a3} def /A4 {a4tray a4} def /A4Small {a4tray a4small} def /B4 {b4tray b4} def /B5 {b5tray b5} def /unknown {unknown} def papersizedict dup papername known {papername} {/unknown} ifelse get end statusdict begin stopped end } bind def /manualpapersize { papersizedict begin /Letter {letter} def /LetterSmall {lettersmall} def /Tabloid {11x17} def /Ledger {ledger} def /Legal {legal} def /Statement {statement} def /Executive {executive} def /A3 {a3} def /A4 {a4} def /A4Small {a4small} def /B4 {b4} def /B5 {b5} def /unknown {unknown} def papersizedict dup papername known {papername} {/unknown} ifelse get end stopped } bind def /desperatepapersize { statusdict /setpageparams known { paperwidth paperheight 0 1 statusdict begin {setpageparams} stopped end } {true} ifelse } bind def /DiacriticEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve /ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex /udieresis /dagger /.notdef /cent /sterling /section /bullet /paragraph /germandbls /registered /copyright /trademark /acute /dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef /yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown /exclamdown /logicalnot /.notdef /florin /.notdef /.notdef /guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde /Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis /fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron ] def /ReEncode { dup length dict begin { 1 index /FID ne {def} {pop pop} ifelse } forall 0 eq {/Encoding DiacriticEncoding def} if currentdict end } bind def FMPColor { /BEGINBITMAPCOLOR { BITMAPCOLOR} def /BEGINBITMAPCOLORc { BITMAPCOLORc} def /BEGINBITMAPTRUECOLOR { BITMAPTRUECOLOR } def /BEGINBITMAPTRUECOLORc { BITMAPTRUECOLORc } def } { /BEGINBITMAPCOLOR { BITMAPGRAY} def /BEGINBITMAPCOLORc { BITMAPGRAYc} def /BEGINBITMAPTRUECOLOR { BITMAPTRUEGRAY } def /BEGINBITMAPTRUECOLORc { BITMAPTRUEGRAYc } def } ifelse /K { FMPrintAllColorsAsBlack { dup 1 eq 2 index 1 eq and 3 index 1 eq and not {7 {pop} repeat 0 0 0 1 0 0 0} if } if FrameCurColors astore pop combineColor } bind def /graymode true def /bwidth FMLOCAL /bpside FMLOCAL /bstring FMLOCAL /onbits FMLOCAL /offbits FMLOCAL /xindex FMLOCAL /yindex FMLOCAL /x FMLOCAL /y FMLOCAL /setPatternMode { FMLevel1 { /bwidth exch def /bpside exch def /bstring exch def /onbits 0 def /offbits 0 def freq sangle landscape {90 add} if {/y exch def /x exch def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get 1 7 xindex 8 mod sub bitshift and 0 ne FrameNegative {not} if {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen offbits offbits onbits add div FrameNegative {1.0 exch sub} if /FrameCurGray exch def } { pop pop dup patCache exch known { patCache exch get } { dup patDict /bstring 3 -1 roll put patDict 9 PatFreq screenIndex get div dup matrix scale makepattern dup patCache 4 -1 roll 3 -1 roll put } ifelse /FrameCurGray 0 def /FrameCurPat exch def } ifelse /graymode false def combineColor } bind def /setGrayScaleMode { graymode not { /graymode true def FMLevel1 { setCurrentScreen } if } if /FrameCurGray exch def combineColor } bind def /normalize { transform round exch round exch itransform } bind def /dnormalize { dtransform round exch round exch idtransform } bind def /lnormalize { 0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop } bind def /H { lnormalize setlinewidth } bind def /Z { setlinecap } bind def /PFill { graymode FMLevel1 or not { gsave 1 setgray eofill grestore } if } bind def /PStroke { graymode FMLevel1 or not { gsave 1 setgray stroke grestore } if stroke } bind def /fillvals FMLOCAL /X { fillvals exch get dup type /stringtype eq {8 1 setPatternMode} {setGrayScaleMode} ifelse } bind def /V { PFill gsave eofill grestore } bind def /Vclip { clip } bind def /Vstrk { currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /N { PStroke } bind def /Nclip { strokepath clip newpath } bind def /Nstrk { currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /M {newpath moveto} bind def /E {lineto} bind def /D {curveto} bind def /O {closepath} bind def /n FMLOCAL /L { /n exch def newpath normalize moveto 2 1 n {pop normalize lineto} for } bind def /Y { L closepath } bind def /x1 FMLOCAL /x2 FMLOCAL /y1 FMLOCAL /y2 FMLOCAL /R { /y2 exch def /x2 exch def /y1 exch def /x1 exch def x1 y1 x2 y1 x2 y2 x1 y2 4 Y } bind def /rad FMLOCAL /rarc {rad arcto } bind def /RR { /rad exch def normalize /y2 exch def /x2 exch def normalize /y1 exch def /x1 exch def mark newpath { x1 y1 rad add moveto x1 y2 x2 y2 rarc x2 y2 x2 y1 rarc x2 y1 x1 y1 rarc x1 y1 x1 y2 rarc closepath } stopped {x1 y1 x2 y2 R} if cleartomark } bind def /RRR { /rad exch def normalize /y4 exch def /x4 exch def normalize /y3 exch def /x3 exch def normalize /y2 exch def /x2 exch def normalize /y1 exch def /x1 exch def newpath normalize moveto mark { x2 y2 x3 y3 rarc x3 y3 x4 y4 rarc x4 y4 x1 y1 rarc x1 y1 x2 y2 rarc closepath } stopped {x1 y1 x2 y2 x3 y3 x4 y4 newpath moveto lineto lineto lineto closepath} if cleartomark } bind def /C { grestore gsave R clip setCurrentScreen } bind def /CP { grestore gsave Y clip setCurrentScreen } bind def /FMpointsize FMLOCAL /F { FMfonts exch get FMpointsize scalefont setfont } bind def /Q { /FMpointsize exch def F } bind def /T { moveto show } bind def /RF { rotate 0 ne {-1 1 scale} if } bind def /TF { gsave moveto RF show grestore } bind def /P { moveto 0 32 3 2 roll widthshow } bind def /PF { gsave moveto RF 0 32 3 2 roll widthshow grestore } bind def /S { moveto 0 exch ashow } bind def /SF { gsave moveto RF 0 exch ashow grestore } bind def /B { moveto 0 32 4 2 roll 0 exch awidthshow } bind def /BF { gsave moveto RF 0 32 4 2 roll 0 exch awidthshow grestore } bind def /G { gsave newpath normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath PFill fill grestore } bind def /Gstrk { savematrix newpath 2 index 2 div add exch 3 index 2 div sub exch normalize 2 index 2 div sub exch 3 index 2 div add exch translate scale 0.0 0.0 1.0 5 3 roll arc restorematrix currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /Gclip { newpath savematrix normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath clip newpath restorematrix } bind def /GG { gsave newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath PFill fill grestore } bind def /GGclip { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath clip newpath restorematrix } bind def /GGstrk { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath restorematrix currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /A { gsave savematrix newpath 2 index 2 div add exch 3 index 2 div sub exch normalize 2 index 2 div sub exch 3 index 2 div add exch translate scale 0.0 0.0 1.0 5 3 roll arc restorematrix PStroke grestore } bind def /Aclip { newpath savematrix normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath strokepath clip newpath restorematrix } bind def /Astrk { Gstrk } bind def /AA { gsave savematrix newpath 3 index 2 div add exch 4 index 2 div sub exch normalize 3 index 2 div sub exch 4 index 2 div add exch translate rotate scale 0.0 0.0 1.0 5 3 roll arc restorematrix PStroke grestore } bind def /AAclip { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath strokepath clip newpath restorematrix } bind def /AAstrk { GGstrk } bind def /x FMLOCAL /y FMLOCAL /w FMLOCAL /h FMLOCAL /xx FMLOCAL /yy FMLOCAL /ww FMLOCAL /hh FMLOCAL /FMsaveobject FMLOCAL /FMoptop FMLOCAL /FMdicttop FMLOCAL /BEGINPRINTCODE { /FMdicttop countdictstack 1 add def /FMoptop count 7 sub def /FMsaveobject save def userdict begin /showpage {} def FMNORMALIZEGRAPHICS 3 index neg 3 index neg translate } bind def /ENDPRINTCODE { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for FMsaveobject restore } bind def /gn { 0 { 46 mul cf read pop 32 sub dup 46 lt {exit} if 46 sub add } loop add } bind def /str FMLOCAL /cfs { /str sl string def 0 1 sl 1 sub {str exch val put} for str def } bind def /ic [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223 0 {0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx} {10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx} {19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh} {4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh} {13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl} {7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl} {0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl} {10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl} ] def /sl FMLOCAL /val FMLOCAL /ws FMLOCAL /im FMLOCAL /bs FMLOCAL /cs FMLOCAL /len FMLOCAL /pos FMLOCAL /ms { /sl exch def /val 255 def /ws cfs /im cfs /val 0 def /bs cfs /cs cfs } bind def 400 ms /ip { is 0 cf cs readline pop { ic exch get exec add } forall pop } bind def /rip { bis ris copy pop is 0 cf cs readline pop { ic exch get exec add } forall pop pop ris gis copy pop dup is exch cf cs readline pop { ic exch get exec add } forall pop pop gis bis copy pop dup add is exch cf cs readline pop { ic exch get exec add } forall pop } bind def /wh { /len exch def /pos exch def ws 0 len getinterval im pos len getinterval copy pop pos len } bind def /bl { /len exch def /pos exch def bs 0 len getinterval im pos len getinterval copy pop pos len } bind def /s1 1 string def /fl { /len exch def /pos exch def /val cf s1 readhexstring pop 0 get def pos 1 pos len add 1 sub {im exch val put} for pos len } bind def /hx { 3 copy getinterval cf exch readhexstring pop pop } bind def /h FMLOCAL /w FMLOCAL /d FMLOCAL /lb FMLOCAL /bitmapsave FMLOCAL /is FMLOCAL /cf FMLOCAL /wbytes { dup dup 24 eq { pop pop 3 mul } { 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse } ifelse } bind def /BEGINBITMAPBWc { 1 {} COMMONBITMAPc } bind def /BEGINBITMAPGRAYc { 8 {} COMMONBITMAPc } bind def /BEGINBITMAP2BITc { 2 {} COMMONBITMAPc } bind def /COMMONBITMAPc { /r exch def /d exch def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def r /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h d [w 0 0 h neg 0 h] {ip} image bitmapsave restore grestore } bind def /BEGINBITMAPBW { 1 {} COMMONBITMAP } bind def /BEGINBITMAPGRAY { 8 {} COMMONBITMAP } bind def /BEGINBITMAP2BIT { 2 {} COMMONBITMAP } bind def /COMMONBITMAP { /r exch def /d exch def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def r /is w d wbytes string def /cf currentfile def w h d [w 0 0 h neg 0 h] {cf is readhexstring pop} image bitmapsave restore grestore } bind def /ngrayt 256 array def /nredt 256 array def /nbluet 256 array def /ngreent 256 array def /gryt FMLOCAL /blut FMLOCAL /grnt FMLOCAL /redt FMLOCAL /indx FMLOCAL /cynu FMLOCAL /magu FMLOCAL /yelu FMLOCAL /k FMLOCAL /u FMLOCAL FMLevel1 { /colorsetup { currentcolortransfer /gryt exch def /blut exch def /grnt exch def /redt exch def 0 1 255 { /indx exch def /cynu 1 red indx get 255 div sub def /magu 1 green indx get 255 div sub def /yelu 1 blue indx get 255 div sub def /k cynu magu min yelu min def /u k currentundercolorremoval exec def % /u 0 def nredt indx 1 0 cynu u sub max sub redt exec put ngreent indx 1 0 magu u sub max sub grnt exec put nbluet indx 1 0 yelu u sub max sub blut exec put ngrayt indx 1 k currentblackgeneration exec sub gryt exec put } for {255 mul cvi nredt exch get} {255 mul cvi ngreent exch get} {255 mul cvi nbluet exch get} {255 mul cvi ngrayt exch get} setcolortransfer {pop 0} setundercolorremoval {} setblackgeneration } bind def } { /colorSetup2 { [ /Indexed /DeviceRGB 255 {dup red exch get 255 div exch dup green exch get 255 div exch blue exch get 255 div} ] setcolorspace } bind def } ifelse /tran FMLOCAL /fakecolorsetup { /tran 256 string def 0 1 255 {/indx exch def tran indx red indx get 77 mul green indx get 151 mul blue indx get 28 mul add add 256 idiv put} for currenttransfer {255 mul cvi tran exch get 255.0 div} exch concatprocs settransfer } bind def /BITMAPCOLOR { /d 8 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def FMLevel1 { colorsetup /is w d wbytes string def /cf currentfile def w h d [w 0 0 h neg 0 h] {cf is readhexstring pop} {is} {is} true 3 colorimage } { colorSetup2 /is w d wbytes string def /cf currentfile def 7 dict dup begin /ImageType 1 def /Width w def /Height h def /ImageMatrix [w 0 0 h neg 0 h] def /DataSource {cf is readhexstring pop} bind def /BitsPerComponent d def /Decode [0 255] def end image } ifelse bitmapsave restore grestore } bind def /BITMAPCOLORc { /d 8 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def FMLevel1 { colorsetup /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h d [w 0 0 h neg 0 h] {ip} {is} {is} true 3 colorimage } { colorSetup2 /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def 7 dict dup begin /ImageType 1 def /Width w def /Height h def /ImageMatrix [w 0 0 h neg 0 h] def /DataSource {ip} bind def /BitsPerComponent d def /Decode [0 255] def end image } ifelse bitmapsave restore grestore } bind def /BITMAPTRUECOLORc { /d 24 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def /is im 0 lb getinterval def /ris im 0 w getinterval def /gis im w w getinterval def /bis im w 2 mul w getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h 8 [w 0 0 h neg 0 h] {w rip pop ris} {gis} {bis} true 3 colorimage bitmapsave restore grestore } bind def /BITMAPTRUECOLOR { gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def /is w string def /gis w string def /bis w string def /cf currentfile def w h 8 [w 0 0 h neg 0 h] { cf is readhexstring pop } { cf gis readhexstring pop } { cf bis readhexstring pop } true 3 colorimage bitmapsave restore grestore } bind def /BITMAPTRUEGRAYc { /d 24 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def /is im 0 lb getinterval def /ris im 0 w getinterval def /gis im w w getinterval def /bis im w 2 mul w getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h 8 [w 0 0 h neg 0 h] {w rip pop ris gis bis w gray} image bitmapsave restore grestore } bind def /ww FMLOCAL /r FMLOCAL /g FMLOCAL /b FMLOCAL /i FMLOCAL /gray { /ww exch def /b exch def /g exch def /r exch def 0 1 ww 1 sub { /i exch def r i get .299 mul g i get .587 mul b i get .114 mul add add r i 3 -1 roll floor cvi put } for r } bind def /BITMAPTRUEGRAY { gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def /is w string def /gis w string def /bis w string def /cf currentfile def w h 8 [w 0 0 h neg 0 h] { cf is readhexstring pop cf gis readhexstring pop cf bis readhexstring pop w gray} image bitmapsave restore grestore } bind def /BITMAPGRAY { 8 {fakecolorsetup} COMMONBITMAP } bind def /BITMAPGRAYc { 8 {fakecolorsetup} COMMONBITMAPc } bind def /ENDBITMAP { } bind def end /ALDsave FMLOCAL /ALDmatrix matrix def ALDmatrix currentmatrix pop /StartALD { /ALDsave save def savematrix ALDmatrix setmatrix } bind def /InALD { restorematrix } bind def /DoneALD { ALDsave restore } bind def /I { setdash } bind def /J { [] 0 setdash } bind def %%EndProlog %%BeginSetup (4.0) FMVERSION 1 1 0 0 612 792 0 1 17 FMDOCUMENT 0 0 /Times-Roman FMFONTDEFINE 1 0 /AvantGarde-Demi FMFONTDEFINE 2 0 /Helvetica-Bold FMFONTDEFINE 3 0 /Helvetica FMFONTDEFINE 4 0 /Helvetica-Oblique FMFONTDEFINE 5 0 /AvantGarde-Book FMFONTDEFINE 6 0 /Times-Bold FMFONTDEFINE 7 0 /Courier FMFONTDEFINE 8 0 /AvantGarde-BookOblique FMFONTDEFINE 32 FMFILLS 0 0 FMFILL 1 0.1 FMFILL 2 0.3 FMFILL 3 0.5 FMFILL 4 0.7 FMFILL 5 0.9 FMFILL 6 0.97 FMFILL 7 1 FMFILL 8 <0f1e3c78f0e1c387> FMFILL 9 <0f87c3e1f0783c1e> FMFILL 10 FMFILL 11 FMFILL 12 <8142241818244281> FMFILL 13 <03060c183060c081> FMFILL 14 <8040201008040201> FMFILL 16 1 FMFILL 17 0.9 FMFILL 18 0.7 FMFILL 19 0.5 FMFILL 20 0.3 FMFILL 21 0.1 FMFILL 22 0.03 FMFILL 23 0 FMFILL 24 FMFILL 25 FMFILL 26 <3333333333333333> FMFILL 27 <0000ffff0000ffff> FMFILL 28 <7ebddbe7e7dbbd7e> FMFILL 29 FMFILL 30 <7fbfdfeff7fbfdfe> FMFILL %%EndSetup %%Page: "1" 1 %%BeginPaperSize: Letter %%EndPaperSize 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K J 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 1) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 690 540 702 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 701 540 701 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 72 698 540 698 2 L N 0 -208 1000 792 C 1 18 Q 0 X 0 0 0 1 0 0 0 K (fmweb) 95.08 708 T 2 F (: Literate Programming using FrameMaker) 154.84 708 T 3 10 Q (V) 280.98 672.33 T (ersion 1.0) 287.11 672.33 T (Sriram Srinivasan) 266.55 660.33 T (\050) 266.48 648.33 T 4 F (sriram@tcs.com) 269.82 648.33 T 3 F (\051) 342.18 648.33 T 72 605 540 615 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 614 540 614 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 -208 1000 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (Introduction) 72 619.67 T 3 10 Q 0.04 (This document explains a simple approach for doing literate programming using FrameMaker) 72 590.33 P 0.04 (, a word pro-) 483.74 590.33 P 0.44 (cessing system. It is almost identical to the approach taken by WinW) 72 577.71 P 0.44 (ordWEB [2], except that it can addi-) 380.08 577.71 P (tionally be used in batch mode.) 72 565.71 T 2.03 (All implementations of literate programming provide facilities to break a piece of code into digestible) 72 548.71 P -0.27 (chunks which can be documented individually) 72 536.71 P -0.27 (, and explained in any order) 272.2 536.71 P -0.27 (. The only dif) 393.69 536.71 P -0.27 (ference is in the way) 449.94 536.71 P 0.52 (the document should be written so that a tool can separate the code from the rest of the documentation.) 72 524.71 P 0.23 (WEB and such other tools provide a way of doing \322in-band signalling\323, to borrow a term from communica-) 72 512.71 P 1.61 (tions. The programmer annotates dif) 72 500.71 P 1.61 (ferent parts of a document by keywords, and a program such as) 239.42 500.71 P 0.08 (weave or tangle recognizes these keywords. In addition, these programs provide features such as section) 72 488.71 P (numbering, indexing etc. and language speci\336c features such as pretty-printing, macro expansion etc.) 72 476.71 T 0.76 (The other approach is to do \322out-of-band signalling\323, where the formatting information is essentially kept) 72 459.71 P (out of the documentation. This is the approach taken by fmweb and WinW) 72 447.71 T (ordWEB.) 399.2 447.71 T (There are a couple of reasons why I don\325t use WEB based tools.) 72 430.71 T (\245) 72 413.71 T (It is always nice to see the output of a literate programming ef) 90 413.71 T (fort, but the input is rather messy) 362.17 413.71 T (. I dis-) 507.05 413.71 T (like seeing a lot of meta characters \050like @, <<, \134, [[ \051 etc. The sections are not immediately visible -) 90 401.71 T (one goes around looking for \322\134section\323, for example. I do a fair amount of coding in) 90 389.71 T 5 F (perl) 455.74 389.71 T 3 F (, and the two) 474.07 389.71 T (notational structures put together make my head swim, esp. when I need to alter the code a few) 90 377.71 T (months later) 90 365.71 T (. Having access to a WYSIWIG word processor such as FrameMaker means that I don\325t) 144.47 365.71 T (use T) 90 353.71 T (eX, and it is too much of an ef) 113.9 353.71 T (fort to learn the intricacies of LaT) 246.02 353.71 T (ex or T) 390.53 353.71 T (eX to be able to use the) 420.54 353.71 T (WEB based tools.) 90 341.71 T (\245) 72 324.71 T (A number of these tools are language speci\336c.) 90 324.71 T 5 F (noweb) 298.44 324.71 T 3 F ( is one exception to this rule, and I rather like) 332.72 324.71 T (the simplicity of noweb. I don\325t use noweb because of the reason explained above.) 90 312.71 T -0.13 (FrameMaker) 72 295.71 P -0.13 (, like other good word processors, has excellent document formatting capabilities, cross refer-) 128.12 295.71 P 0.58 (encing and indexing, table of contents, graphics, tables etc. What I see on the screen is the \336nal output,) 72 283.71 P (uncluttered by meta-information.) 72 271.71 T 0.2 (One problem that I have with this approach is that I am used to a Unix like development environment and) 72 254.71 P 0.13 (extensively use text based tools such as emacs/vi, perl, dif) 72 242.71 P 0.13 (f, sccs etc. For this reason, I have not tried this) 331.97 242.71 P (approach on medium or larger sized implementations, though I hope to do that in the near future.) 72 230.71 T 0.28 (In general, I am somewhat unclear on how the literate programming paradigm helps a developer to think.) 72 213.71 P 0.74 (The prevailing wisdom is that this approach forces a lot more disciplined thinking on the part of the pro-) 72 201.71 P 0.09 (grammer) 72 189.71 P 0.09 (, since \050s\051he is in a teaching mode. I \336nd that this helps in structuring the program well, once one) 111.45 189.71 P -0.22 (knows what one should be doing, but if I don\325t have a top-down \050step-wise re\336nement\051 solution in my mind,) 72 177.71 P 0.02 (I am not entirely sure how to start from a blank page. I tend to do small sections of the code using my reg-) 72 165.71 P -0.03 (ular development environment, and once I have a reasonable top-down solution in mind, copy it all over to) 72 153.71 P (a FrameMaker \336le and start re\336ning it.) 72 141.71 T 72 98.38 540 108.38 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 107.38 540 107.38 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 -208 1000 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (The fmweb approach) 72 113.04 T 3 10 Q (T) 72 83.71 T (o separate the code from the rest of the stuf) 77 83.71 T (f, the developer uses three paragraph formats.) 270.82 83.71 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "1" 1 %%Page: "2" 2 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 2) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 3 F 0 X (\245) 72 713.33 T (\322File\323: The \336le name is mentioned in this paragraph, and all subsequent lines will eventually be) 90 713.33 T (dumped into this \336le.) 90 701.33 T (\245) 72 684.33 T (\322chunk\323: A chunk \050or section\051 is a heading followed by a set of \322code\323 paragraphs. The \322chunk\323 para-) 90 684.33 T (graph tag identi\336es the heading for that section. It is possible to have more than one chunk with the) 90 672.33 T (same name.) 90 660.33 T (\245) 72 643.33 T -0.36 (\322code\323: The developer writes code \050in any language\051 using this paragraph tag. The Frame Maker cross) 90 643.33 P (reference facility has to be used to refer to chunks.) 90 631.33 T 5 F -0.16 (fmweb) 72 614.33 P 3 F -0.16 ( is a perl script that needs the FrameMaker document in a MIF format - it extracts chunks and code) 106.15 614.33 P 0.42 (paragraphs out, and does the requisite tangling \050restoring the order of chunks\051. All chunks with the same) 72 602.33 P 0.35 (name are concatenated in the order they appear in the document.) 72 590.33 P 5 F 0.35 (fmweb) 369.39 590.33 P 3 F 0.35 ( ignores all formatting informa-) 403.54 590.33 P (tion. Source line number information can be optionally output, in a format accepted by) 72 578.33 T 5 F (cc) 453.3 578.33 T 3 F ( \050#line\051.) 466.24 578.33 T 72 535 540 545 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 544 540 544 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 0 612 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (References) 72 549.67 T 3 10 Q (1.) 72 520.33 T 1 (\322Literate Programming\323, Donald Knuth, Center for the Study of Language and Information, Stanford) 90 520.33 P (University) 90 508.33 T (, ISBN 0-937073-80-6) 133.15 508.33 T (2.) 72 494.33 T 0.82 (WEB: http://info.desy) 90 494.33 P 0.82 (.de/user/projects/LitProg/HTML.html - A pointer to all the other good stuf) 183.46 494.33 P 0.82 (f avail-) 509.73 494.33 P (able on the net.) 90 482.33 T 72 439 540 449 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 448 540 448 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 0 612 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (Unpacking the distribution) 72 453.67 T 3 10 Q 0.08 (This document contains an example program \050wc.c\051 written in the format explained above, and the fmweb) 72 424.33 P (script, along with some internal documentation.) 72 412.33 T (Save this \336le as wc.mif. This \336le will be used to test out the fmweb script.) 72 395.33 T -0.04 (T) 72 378.33 P -0.04 (o extract fmweb \050a perl5 script\051, go to Special->Conditional T) 77 378.33 P -0.04 (ext -> Show/Hide..., and hide the conditional) 344.28 378.33 P (tag called \322Fluf) 72 366.33 T (f\323. Only the perl script should be remaining. Save this \336le as text only) 137.4 366.33 T (, and call it fmweb.) 440.12 366.33 T 0.18 (Run fmweb - \322perl5 fmweb < wc.mif\323. This should produce a \336le called wc.c in the local directory) 72 349.33 P 0.18 (. Compile) 497.58 349.33 P (and execute wc, and compare against the system provided \322wc\323, if on a Unix system.) 72 337.33 T 72 294 540 304 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 303 540 303 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 0 612 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (T) 72 308.67 T (oDo) 79.52 308.67 T 3 10 Q (\245) 72 279.33 T (Support multiple \336les) 90 279.33 T (\245) 72 262.33 T (Largish example - map library) 90 262.33 T (\245) 72 245.33 T (Speed up) 90 245.33 T (\245) 72 228.33 T (Look at mml) 90 228.33 T (\245) 72 211.33 T (Accept \336lenames as arguments) 90 211.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "2" 2 %%Page: "3" 3 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 3) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 696 540 706 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 705 540 705 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 0 612 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (Appendix A: \324wc\325: A word count program) 72 710.67 T 3 10 Q 0.28 (This section demonstrates how one can do Literate Programming with FrameMaker) 72 664.33 P 0.28 (. There are only three) 443.28 664.33 P -0.21 (paragraph tags of interest - File \050see \322File:\323 below\051, \322chunk\323 \050all the numbered paragraphs\051 and \322code\323. Any) 72 652.33 P 1.11 (cross reference format can be used - \322chunkref\323 is the name of the format used in the example below) 72 640.33 P 1.11 (.) 537.22 640.33 P -0.05 (Apologies if the example looks like a ransom note - one does tend to get carried away by the availability of) 72 628.33 P (fonts, and the WYSIWIGness of it all.) 72 616.33 T 0.21 (The implementation and comments have been shamelessly lifted from Norman Ramsey\325) 72 599.33 P 0.21 (s noweb distribu-) 464.01 599.33 P 0.1 (tion \050ftp://bellcore.com/pub/norman/www/noweb/intro.html\051. This is just to provide a comparison of the two) 72 587.33 P (approaches. I have modi\336ed some of the comments that do not apply to this approach.) 72 575.33 T (Thanks, Norman.) 72 558.33 T 0 1 1 0 1 0 0 K 0 1 1 0 1 0 0 K 144.97 515.22 72 515.22 2 L 0 1 1 0 1 0 0 K V 1.71 H 0 Z N 0 0 0 1 0 0 0 K 0 1 1 0 1 0 0 K 6 18 Q (File: wc.c) 72 517 T 0 0 0 1 0 0 0 K 3 10 Q 0 0 0 1 0 0 0 K 0.21 (The purpose of) 72 493.33 P 7 F 0.46 (wc) 142.68 493.33 P 3 F 0.21 ( is to count lines, words, and/or characters in a list of \336les. The number of lines in a \336le) 154.68 493.33 P (is the number of newline characters it contains. The number of characters is the \336le length in bytes.) 72 481.33 T 0.42 (A ``word\325) 72 464.33 P 0.42 (\325 is a maximal sequence of consecutive characters other than newline, space, or tab, containing) 112.24 464.33 P (at least one visible ASCII code.) 72 452.33 T (\050W) 72 435.33 T (e assume that the standard ASCII code is in use.\051) 84.59 435.33 T (Most literate C programs share a common structure.) 72 418.33 T 0.13 (It\325) 72 401.33 P 0.13 (s probably a good idea to state the overall structure explicitly at the outset. Here, then, is an overview of) 79.6 401.33 P (the \336le) 72 388 T 5 12 Q (wc.c) 104.24 388 T 3 10 Q ( that is de\336ned by the) 133.06 388 T 5 12 Q (noweb) 230.9 388 T 3 10 Q ( program) 272.04 388 T 5 12 Q (wc.fm) 314.83 388 T 82.08 362.9 72 362.9 2 L V 1.08 H N 1 F (1:) 72 364 T 131.52 362.9 90 362.9 2 L V N (Outline) 90 364 T 8 10 Q (
, \0502:, p. 3\051) 90 345.61 T ( , \0503:, p. 3\051) 90 330.89 T ( , \0504:, p. 4\051) 90 316.16 T ( , \05023:, p. 8\051) 90 301.44 T (
, \0505:, p. 4\051) 131.84 286.72 T 3 F -0.03 (W) 72 269.72 P -0.03 (e must include the standard I/O de\336nitions, since we want to send formatted output to) 81.26 269.72 P 5 F -0.03 (stdout) 461.04 269.72 P 3 F -0.03 ( and) 491.18 269.72 P 5 F -0.03 (stderr) 513.36 269.72 P 82.08 231.28 72 231.28 2 L V N 1 12 Q (2:) 72 232.38 T 220.08 231.28 90 231.28 2 L V N (Header \336les to include) 90 232.38 T 5 10 Q (#include ) 90 214.72 T 82.08 176.28 72 176.28 2 L V N 1 12 Q (3:) 72 177.38 T 149.04 176.28 90 176.28 2 L V N (De\336nitions) 90 177.38 T 5 10 Q (#de\336ne OK 0) 90 159.72 T ( /* status code for successful run */) 90 145.72 T (#de\336ne usage_err) 90 131.72 T (or 1) 176.63 131.72 T ( /* status code for impr) 90 117.72 T (oper syntax */) 202.93 117.72 T (#de\336ne cannot_open_\336le 2) 90 103.72 T ( /* status code for \336le access err) 90 89.72 T (or */) 247.18 89.72 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "3" 3 %%Page: "4" 4 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 4) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 82.08 710.9 72 710.9 2 L 0 X V 1.08 H 0 Z N 1 12 Q (4:) 72 712 T 185.76 710.9 90 710.9 2 L V N (Global variables) 90 712 T 3 10 Q -0.08 (The) 72 694.33 P 5 F -0.08 (status) 91.93 694.33 P 3 F -0.08 ( variable will tell the operating system if the run was successful or not, and) 119.38 694.33 P 5 F -0.08 (pr) 448.83 694.33 P -0.08 (og_name) 458.61 694.33 P 3 F -0.08 ( is used) 505.7 694.33 P (in case there\325) 72 682.33 T (s an error message to be printed.) 131.29 682.33 T 5 F (int status = OK;) 90 651.33 T ( /* exit status of command, initially OK */) 90 637.33 T (char *pr) 90 623.33 T (og_name;) 129.22 623.33 T ( /* who we ar) 90 609.33 T (e */) 158.04 609.33 T 3 F (Now we come to the general layout of the) 72 578.33 T 5 F (main) 258.76 578.33 T 3 F ( function.) 283.07 578.33 T 82.08 539.9 72 539.9 2 L V N 1 12 Q (5:) 72 541 T 132.72 539.9 90 539.9 2 L V N (Main Pr) 90 541 T 171.14 539.9 132.5 539.9 2 L V N (ogram) 132.5 541 T 5 10 Q (main\050ar) 90 523.33 T (gc, ar) 127.85 523.33 T (gv\051) 156.44 523.33 T (int ar) 108 509.33 T (gc;) 132.11 509.33 T (/* number of ar) 108 495.33 T (guments on UNIX command line */) 182.36 495.33 T ( char **ar) 108 481.33 T (gv;) 157.07 481.33 T ( /* the ar) 108 467.33 T (guments, an array of strings */) 150.77 467.33 T ({) 90 453.33 T 8 F ( , \0506:, p. 4\051) 123.05 438.61 T 5 F ( pr) 108 424.61 T (og_name = ar) 120.56 424.61 T (gv[0];) 189.1 424.61 T 8 F ( , \0507:, p. 4\051) 110.77 409.89 T ( , \0508:, p. 5\051) 125.72 395.16 T ( , \05021:, p. 8\051) 273.8 380.44 T 5 F ( exit\050status\051;) 108 366.44 T (}) 90 352.44 T 3 F 0.58 (If the \336rst argument begins with a \324-\325, the user is choosing the desired counts and specifying the order in) 72 321.44 P 0.8 (which they should be displayed. Each selection is given by the initial character \050lines, words, or charac-) 72 309.44 P -0.23 (ters\051. For example, `-cl\325 would cause just the number of characters and the number of lines to be printed, in) 72 297.44 P (that order) 72 285.44 T (.) 114.25 285.44 T -0.07 (W) 72 268.44 P -0.07 (e do not process this string now; we simply remember where it is. It will be used to control the formatting) 81.26 268.44 P (at output time.) 72 256.44 T 82.08 232 72 232 2 L V N 1 12 Q (6:) 72 233.11 T 98.4 232 90 232 2 L V N (V) 90 233.11 T 194.16 232 97.44 232 2 L V N (ariables local to) 97.44 233.11 T 223.33 231.96 194.16 231.96 2 L V 0.7 H N 5 F (main) 194.16 233.11 T 5 10 Q (int \336le_count;) 90 215.44 T ( /* how many \336les ther) 90 201.44 T (e ar) 200.08 201.44 T (e */) 219.15 201.44 T (char *which;) 90 187.44 T ( /* which counts to print */) 90 173.44 T 82.08 135 72 135 2 L V 1.08 H N 1 12 Q (7:) 72 136.11 T 222.24 135 90 135 2 L V N (Set up option selection) 90 136.11 T 5 10 Q (which = \322lwc\323;) 90 118.44 T ( /* if no option is given, print 3 values */) 90 104.44 T (if \050ar) 90 90.44 T (gc > 1 && *ar) 111.45 90.44 T (gv[1] == \324-\325\051 {) 176.57 90.44 T (which = ar) 108 76.44 T (gv[1] + 1;) 158.43 76.44 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "4" 4 %%Page: "5" 5 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 5) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X (ar) 108 713.33 T (gc--;) 117.85 713.33 T (ar) 108 699.33 T (gv++;) 117.85 699.33 T (}) 90 685.33 T (\336le_count = ar) 90 671.33 T (gc - 1;) 158.41 671.33 T 3 F 0.14 (Now we scan the remaining arguments and try to open a \336le, if possible. The \336le is processed and its sta-) 72 637.33 P (tistics are given.) 72 625.33 T (W) 72 608.33 T (e use a do ... while loop because we should read from the standard input if no \336le name is given.) 81.26 608.33 T 82.08 566.9 72 566.9 2 L V 1.08 H 0 Z N 1 12 Q (8:) 72 568 T 100.56 566.9 90 566.9 2 L V N (Pr) 90 568 T 198.26 566.9 100.34 566.9 2 L V N (ocess all the \336les) 100.34 568 T 5 10 Q (ar) 90 550.33 T (gc--;) 99.85 550.33 T (do {) 90 536.33 T 8 F ( , \05011:, p. 5\051) 277.69 521.61 T ( , \05015:, p. 6\051) 113.54 506.89 T ( , \05017:, p. 6\051) 113.54 492.16 T ( , \05019:, p. 7\051) 128.91 477.44 T ( , \05012:, p. 6\051) 110.77 462.72 T ( , \05020:, p. 7\051) 113.54 447.99 T 5 F ( /* even if ther) 108 433.99 T (e is only one \336le */) 176.44 433.99 T (} while \050--ar) 90 419.99 T (gc > 0\051;) 144.14 419.99 T 3 F 1.01 (Here\325) 72 388.99 P 1.01 (s the code to open the \336le. A special trick allows us to handle input from) 95.71 388.99 P 5 F 1.01 (stdin) 435.35 388.99 P 3 F 1.01 ( when no name is) 457.57 388.99 P (given.) 72 376.99 T (Recall that the \336le descriptor to) 72 359.99 T 5 F (stdin) 212.06 359.99 T 3 F ( is 0; that\325) 234.28 359.99 T (s what we use as the default initial value.) 276.9 359.99 T 82.08 318.56 72 318.56 2 L V N 1 12 Q (9:) 72 319.66 T 98.4 318.56 90 318.56 2 L V N (V) 90 319.66 T 223.44 318.56 97.44 318.56 2 L V N (ariables local to main) 97.44 319.66 T 5 10 Q (int fd = 0;) 90 301.99 T ( /* \336le descriptor) 90 287.99 T (, initialized to stdin */) 170.5 287.99 T 88.8 249.56 72 249.56 2 L V N 1 12 Q (10:) 72 250.66 T 149.04 249.56 90 249.56 2 L V N (De\336nitions) 90 250.66 T 5 10 Q (#de\336ne READ_ONL) 90 232.99 T (Y 0) 180.2 232.99 T ( /* r) 90 218.99 T (ead access code for system open */) 109.9 218.99 T 88.8 180.56 72 180.56 2 L V N 1 12 Q (11:) 72 181.66 T 248.4 180.56 90 180.56 2 L V N (If a \336le is given, try to open) 90 181.66 T 284.28 180.51 248.4 180.51 2 L V 0.7 H N 5 F (*\050++ar) 248.4 181.66 T 303.44 180.51 284.29 180.51 2 L V N (gv\051) 284.29 181.66 T 310.16 180.56 303.44 180.56 2 L V 1.08 H N 1 F (;) 303.44 181.66 T 361.99 180.51 310.16 180.51 2 L V 0.7 H N 5 F (continue) 310.16 181.66 T 448.87 180.56 361.99 180.56 2 L V 1.08 H N 1 F ( if unsuccessful) 361.99 181.66 T 5 10 Q (if \050\336le_count > 0) 90 163.99 T (&& \050fd = open\050*\050++ar) 168.47 163.99 T (gv\051, READ_ONL) 271.23 163.99 T (Y\051\051 < 0\051 {) 343.8 163.99 T (fprintf\050stderr) 108 149.99 T (, \322%s: cannot open \336le %s\134n\323, pr) 164.88 149.99 T (og_name, *ar) 330.73 149.99 T (gv\051;) 397.46 149.99 T ( status |= cannot_open_\336le;) 108 135.99 T (\336le_count--;) 108 121.99 T (continue;) 108 107.99 T (}) 90 93.99 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "5" 5 %%Page: "6" 6 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 6) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 88.8 710.9 72 710.9 2 L 0 X V 1.08 H 0 Z N 1 12 Q (12:) 72 712 T 143.04 710.9 90 710.9 2 L V N (Close \336le) 90 712 T 5 10 Q (close\050fd\051;) 90 694.33 T 3 F 0.46 (W) 72 663.33 P 0.46 (e will do some homemade buf) 81.26 663.33 P 0.46 (fering in order to speed things up: Characters will be read into the buf) 216.23 663.33 P 0.46 (fer) 528.33 663.33 P (array before we process them. T) 72 651.33 T (o do this we set up appropriate pointers and counters.) 214.83 651.33 T 88.8 609.9 72 609.9 2 L V N 1 12 Q (13:) 72 611 T 149.04 609.9 90 609.9 2 L V N (De\336nitions) 90 611 T 5 10 Q (#de\336ne buf_size BUFSIZ) 90 593.33 T ( /* stdio.h BUFSIZ chosen for ef) 90 579.33 T (\336ciency */) 236.7 579.33 T 88.8 554.9 72 554.9 2 L V N 1 12 Q (14:) 72 556 T 98.4 554.9 90 554.9 2 L V N (V) 90 556 T 194.16 554.9 97.44 554.9 2 L V N (ariables local to) 97.44 556 T 223.33 554.85 194.16 554.85 2 L V 0.7 H N 5 F (main) 194.16 556 T 5 10 Q (char buf) 90 538.33 T (fer[buf_size];) 131.25 538.33 T ( /* we r) 90 524.33 T (ead the input into this array */) 127.48 524.33 T (r) 90 510.33 T (egister char *ptr;) 92.97 510.33 T ( /* \336rst unpr) 90 496.33 T (ocessed character in buf) 146.82 496.33 T (fer */) 268.54 496.33 T (r) 90 482.33 T (egister char *buf_end;) 92.97 482.33 T ( /* the \336rst unused position in buf) 90 468.33 T (fer */) 248.87 468.33 T (r) 90 454.33 T (egister int c;) 92.97 454.33 T ( /* curr) 90 440.33 T (ent char) 125.46 440.33 T (, or # of chars just r) 165.58 440.33 T (ead */) 254.4 440.33 T (int in_wor) 90 426.33 T (d;) 135.17 426.33 T ( /* ar) 90 412.33 T (e we within a wor) 116.73 412.33 T (d? */) 201.66 412.33 T (long wor) 90 398.33 T (d_count, line_count, char_count;) 131.96 398.33 T ( /* # of wor) 90 384.33 T (ds, lines, and chars so far */) 145.51 384.33 T 88.8 345.9 72 345.9 2 L V 1.08 H N 1 12 Q (15:) 72 347 T 266.16 345.9 90 345.9 2 L V N (Initialize pointers and counters) 90 347 T 5 10 Q (ptr = buf_end = buf) 90 329.33 T (fer;) 182.98 329.33 T (line_count = wor) 90 315.33 T (d_count = char_count = 0;) 169.6 315.33 T (in_wor) 90 301.33 T (d = 0;) 120.91 301.33 T 3 F 0.77 (The grand totals must be initialized to zero at the beginning of the program. If we made these variables) 72 270.33 P 1.58 (local to) 72 258.33 P 5 F 1.58 (main) 109.62 258.33 P 3 F 1.58 (, we would have to do this initialization explicitly; however) 133.93 258.33 P 1.58 (, C\325) 401.04 258.33 P 1.58 (s globals are automatically) 417.44 258.33 P (zeroed. \050Or rather) 72 246.33 T (, ``statically zeroed.\325) 150.92 246.33 T (\325\051 \050Get it?\051) 239.65 246.33 T 88.8 221.9 72 221.9 2 L V N 1 12 Q (16:) 72 223 T 185.76 221.9 90 221.9 2 L V N (Global variables) 90 223 T 5 10 Q (long tot_wor) 90 205.33 T (d_count, tot_line_count,) 150.29 205.33 T ( tot_char_count;) 90 191.33 T ( /* total number of wor) 90 177.33 T (ds, lines, chars */) 202.79 177.33 T 88.8 152.9 72 152.9 2 L V N 1 12 Q (17:) 72 154 T 139.2 152.9 90 152.9 2 L V N (Scan \336le) 90 154 T 3 10 Q 0.43 (This chunk, which does the counting, that is) 72 136.33 P 5 F 0.42 (wc) 271.61 136.33 P 3 F 0.43 (\325) 286.39 136.33 P 0.43 (s) 288.43 136.33 P 4 F 0.43 (raison d\325etre) 296.64 136.33 P 3 F 0.43 (, was actually one of the simplest to write.) 352.08 136.33 P (W) 72 124.33 T (e look at each character and change state if it begins or ends a word.) 81.26 124.33 T 5 F (while \0501\051 {) 90 93.33 T 8 F ( , \05018:, p. 7\051) 233.44 78.61 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "6" 6 %%Page: "7" 7 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 7) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X ( c = *ptr++;) 108 713.33 T ( if \050c > \324 \324 && c < 0177\051 {) 108 699.33 T (/* visible ASCII codes */) 126 685.33 T ( if \050!in_wor) 126 671.33 T (d\051 {) 174.23 671.33 T ( wor) 144 657.33 T (d_count++;) 164.58 657.33 T (in_wor) 144 643.33 T (d = 1;) 174.91 643.33 T (}) 126 629.33 T (continue;) 126 615.33 T (}) 108 601.33 T (if \050c == \324\134n\325\051 line_count++;) 108 587.33 T ( else if \050c != \324 \324 && c != \324\134t\325\051 continue;) 108 573.33 T ( in_wor) 108 559.33 T (d = 0;) 141.68 559.33 T (/* c is newline, space, or tab */) 108 545.33 T (}) 90 531.33 T 3 F (Buf) 72 500.33 T (fered I/O allows us to count the number of characters almost for free.) 86.83 500.33 T 88.8 475.9 72 475.9 2 L V 1.08 H 0 Z N 1 12 Q (18:) 72 477 T 107.76 475.9 90 475.9 2 L V N (Fill) 90 477 T 127.01 475.85 107.76 475.85 2 L V 0.7 H N 5 F (buf) 107.76 477 T 142.22 475.85 127.04 475.85 2 L V N (fer) 127.04 477 T 220.7 475.9 142.22 475.9 2 L V 1.08 H N 1 F ( if it is empty;) 142.22 477 T 232.5 475.85 220.7 475.85 2 L V 0.7 H N 5 F (br) 220.7 477 T 254.47 475.85 232.45 475.85 2 L V N (eak) 232.45 477 T 330.07 475.9 254.47 475.9 2 L V 1.08 H N 1 F ( at end of \336le) 254.47 477 T 5 10 Q (if \050ptr >= buf_end\051 {) 90 459.33 T (ptr = buf) 108 445.33 T (fer;) 148.89 445.33 T (c = r) 108 431.33 T (ead\050fd, ptr) 129.04 431.33 T (, buf_size\051;) 180.61 431.33 T (if \050c <= 0\051 br) 108 417.33 T (eak;) 165.52 417.33 T (char_count += c;) 108 403.33 T (buf_end = buf) 108 389.33 T (fer + c;) 176.16 389.33 T (}) 90 375.33 T 3 F 0.17 (It\325) 72 344.33 P 0.17 (s convenient to output the statistics by de\336ning a new function) 79.6 344.33 P 5 F 0.17 (wc_print) 358.33 344.33 P 3 F 0.17 (; then the same function can be) 399.43 344.33 P -0.05 (used for the totals. Additionally we must decide here if we know the name of the \336le we have processed or) 72 332.33 P (if it was just stdin.) 72 320.33 T 88.8 295.9 72 295.9 2 L V N 1 12 Q (19:) 72 297 T 100.8 295.9 90 295.9 2 L V N (W) 90 297 T 208.09 295.9 100.33 295.9 2 L V N (rite statistics for \336le) 100.33 297 T 5 10 Q (wc_print\050which, char_count, wor) 90 279.33 T (d_count,) 248.66 279.33 T ( line_count\051;) 90 265.33 T (if \050\336le_count\051) 90 251.33 T ( printf\050\322 %s\134n\323, *ar) 90 237.33 T (gv\051; /* not stdin */) 179.74 237.33 T (else) 90 223.33 T ( printf\050\322\134n\323\051; /* stdin */) 90 209.33 T 88.8 170.9 72 170.9 2 L V N 1 12 Q (20:) 72 172 T 205.2 170.9 90 170.9 2 L V N (Update grand totals) 90 172 T 5 10 Q (tot_line_count += line_count;) 90 154.33 T (tot_wor) 90 140.33 T (d_count += wor) 126.14 140.33 T (d_count;) 202.05 140.33 T (tot_char_count += char_count;) 90 126.33 T 3 F (W) 72 78.33 T (e might as well improve a bit on) 81.26 78.33 T 5 F (Unix) 224.09 78.33 T 3 F (\325) 243.54 78.33 T (s) 245.58 78.33 T 5 F (wc) 253.36 78.33 T 3 F ( by displaying the number of \336les too.) 268.14 78.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "7" 7 %%Page: "8" 8 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 8) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 88.8 710.9 72 710.9 2 L 0 X V 1.08 H 0 Z N 1 12 Q (21:) 72 712 T 243.84 710.9 90 710.9 2 L V N (Print the grand totals if ther) 90 712 T 275.9 710.9 243.74 710.9 2 L V N (e wer) 243.74 712 T 358.61 710.9 275.81 710.9 2 L V N (e multiple \336les) 275.81 712 T 5 10 Q (if \050\336le_count > 1\051 {) 90 694.33 T (wc_print\050which, tot_char_count, tot_wor) 108 680.33 T (d_count, tot_line_count\051;) 306.09 680.33 T (printf \050\322 total in %d \336les\134n\323, \336le_count\051;) 108 666.33 T (}) 90 652.33 T 3 F -0.28 (Here now is the function that prints the values according to the speci\336ed options. The calling routine is sup-) 72 621.33 P -0.06 (posed to supply a newline. If an invalid option character is found we inform the user about proper usage of) 72 609.33 P (the command. Counts are printed in 8-digit \336elds so that they will line up in columns.) 72 597.33 T 88.8 572.9 72 572.9 2 L V N 1 12 Q (22:) 72 574 T 149.04 572.9 90 572.9 2 L V N (De\336nitions) 90 574 T 5 10 Q (#de\336ne print_count\050n\051 printf\050\322%8ld\323, n\051) 90 556.33 T 88.8 531.9 72 531.9 2 L V N 1 12 Q (23:) 72 533 T 144.48 531.9 90 531.9 2 L V N (Functions) 90 533 T 5 10 Q (wc_print \050which, char_count, wor) 90 515.33 T (d_count, line_count\051) 251.43 515.33 T (char *which; /* which counts to print */) 108 501.33 T (long char_count, wor) 108 487.33 T (d_count, line_count;) 211.5 487.33 T ( /* given totals */) 108 473.33 T ({) 90 459.33 T (while \050*which\051) 108 445.33 T (switch \050*which++\051 {) 126 431.33 T (case \324l\325: print_count\050line_count\051;) 144 417.33 T (br) 162 403.33 T (eak;) 171.79 403.33 T (case \324w\325: print_count\050wor) 144 389.33 T (d_count\051;) 267.73 389.33 T (br) 162 375.33 T (eak;) 171.79 375.33 T (case \324c\325: print_count\050char_count\051;) 144 361.33 T (br) 162 347.33 T (eak;) 171.79 347.33 T (default:) 144 333.33 T (if \050\050status & usage_err) 162 319.33 T (or\051 == 0\051 {) 265.35 319.33 T (fprintf\050stderr) 180 305.33 T (,) 236.88 305.33 T (\322Usage: %s [-lwc] [\336lename ...]\134n\323,) 198 291.33 T (pr) 366.15 291.33 T (og_name\051;) 375.94 291.33 T (usage_err) 180 277.33 T (or;) 227.5 277.33 T (}) 162 263.33 T (}) 126 249.33 T (}) 90 235.33 T 3 F 0.45 (Incidentally) 72 201.33 P 0.45 (, a test of this program against the system) 121.28 201.33 P 5 F 0.45 (wc) 313.79 201.33 P 3 F 0.45 ( command on a SP) 328.57 201.33 P 0.45 (ARCstation showed that the) 414.69 201.33 P 0.82 (``of) 72 189.33 P 0.82 (\336cial\325) 86.82 189.33 P 0.82 (\325) 108.86 189.33 P 5 F 0.81 (wc) 114.68 189.33 P 3 F 0.82 ( was slightly slower) 129.46 189.33 P 0.82 (. Furthermore, although that) 216.92 189.33 P 5 F 0.81 (wc) 346.92 189.33 P 3 F 0.82 ( gave an appropriate error message for) 361.7 189.33 P (the options `) 72 177.33 T 5 F (abc) 127.03 177.33 T 3 F (\325, it made no complaints about the options `abc\325!) 147.15 177.33 T -0.25 (Dare we suggest that the system routine might have been better if its programmer had used a more literate) 72 160.33 P (approach?) 72 148.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "8" 8 %%Page: "9" 9 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 9) 527.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 696 540 706 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 705 540 705 2 L 1 H 2 Z 0 X 0 0 0 1 0 0 0 K N 0 0 612 792 C 2 14 Q 0 X 0 0 0 1 0 0 0 K (Appendix B:) 72 710.67 T 5 F (fmweb) 158.34 710.67 T 2 F ( source) 206.15 710.67 T 3 10 Q -0.25 (T) 72 681.33 P -0.25 (o extract this source, go to special -> conditional text, and hide the conditional tag named \322Fluf) 77 681.33 P -0.25 (f\323. Save the) 489.37 681.33 P (\336le as a text \336le called fmweb. The \336rst line of this \336le may need changing.) 72 669.33 T 6 12 Q (T) 207.05 646 T (able 1: Important variables in fmweb) 213.95 646 T 3 10 Q (name) 127 621.33 T (Description) 348.49 621.33 T (%chunksByName) 78 599.33 T -0.27 (An array of chunks, whose key is the heading of the chunk, and it\325) 213 599.33 P -0.27 (s value) 500.07 599.33 P (is the entire code in that section.) 213 587.33 T ($currChunkHeading) 78 567.33 T (The current chunk heading) 213 567.33 T (@chunkHeadings) 78 547.33 T (A list of all the chunk headings, in order of appearance. If a heading has) 213 547.33 T (been encountered before, it is not appended to this array) 213 535.33 T (.) 463.52 535.33 T (%markerReferred) 78 515.33 T -0.1 (Keeps track of all those chunk headings that have been referred to \050by a) 213 515.33 P (Frame cross reference\051.) 213 503.33 T (%markerT) 78 483.33 T (oHeading) 123 483.33 T -0.38 (A translation table - Each chunk heading has a text \050the \322heading\323\051 that is) 213 483.33 P (visible, and a marker text that Frame inserts. Unfortunately) 213 471.33 T (, these two) 471.8 471.33 T (are not necessarily identical. This translation is necessary since the) 213 459.33 T -0.3 (script allows more than one chunk to have the same name \050which is then) 213 447.33 P (concatenated\051, but a cross reference can be created to only of these) 213 435.33 T (paragraphs.) 213 423.33 T ($line) 78 403.33 T (Global var that contains the current line from the input MIF \336le.) 213 403.33 T ($currMarkerT) 78 383.33 T (ext) 136.89 383.33 T (While evaluating a chunk paragraph, this keeps track of the current) 213 383.33 T -0.19 (marker text. Subsequently) 213 371.33 P -0.19 (, the text of the paragraph and this marker text) 328.04 371.33 P (are related by %markerT) 213 359.33 T (oHeading) 321.92 359.33 T ($currModeProc) 78 339.33 T -0.06 (A reference to a mode subroutine. Each of these subroutines is part of a) 213 339.33 P (state diagram \050shown below\051.) 213 327.33 T (@lookFor) 78 307.33 T (The set of tokens in which this state is interested.) 213 307.33 T (%chunkReferred) 78 287.33 T (This array \050keyed by chunk heading\051 tracks all chunks that have been) 213 287.33 T (referred to, by other chunks. The chunks that don\325t belong to this cate-) 213 275.33 T (gory are the top-level chunks.) 213 263.33 T 72 635.75 72 256.25 2 L V 0.5 H 0 Z N 207 636.25 207 255.75 2 L V N 540 635.75 540 256.25 2 L V N 71.75 636 540.25 636 2 L V N 72.25 613.25 539.75 613.25 2 L V N 72.25 610.75 539.75 610.75 2 L V N 71.75 580 540.25 580 2 L V N 71.75 560 540.25 560 2 L V N 71.75 528 540.25 528 2 L V N 71.75 496 540.25 496 2 L V N 71.75 416 540.25 416 2 L V N 71.75 396 540.25 396 2 L V N 71.75 352 540.25 352 2 L V N 71.75 320 540.25 320 2 L V N 71.75 300 540.25 300 2 L V N 71.75 256 540.25 256 2 L V N 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "9" 9 %%Page: "10" 10 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 10) 522.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 142.01 709.31 72 709.31 2 L 0 X V 1.02 H 0 Z N 3 14 Q (Description) 72 710.67 T 3 10 Q (fmweb is implemented as a simple state machine, whose state diagram is shown below) 72 691.33 T (.) 457.7 691.33 T 0.26 (Each of the events in the state diagram are mif statements. The subroutines ParaMode, FileMode, Code-) 72 472.33 P 0.82 (Mode, ChunkMode and W) 72 460.33 P 0.82 (asteMode implement the states. If these subs are called without any parame-) 190.25 460.33 P 0.06 (ters, they do the necessary initializations required for that state, such as initializing @lookFor) 72 448.33 P 0.06 (, which is the) 482.01 448.33 P -0.12 (set of lookahead patterns in which the current state is interested. The main loop calls these subs with $line) 72 436.33 P (as the parameter - $line contains some event deemed interesting to the current state.) 72 424.33 T 0.72 (The script \336rst reads in all the chunks and stores them in chunksByName, keyed by the chunk heading.) 72 407.33 P 0.04 (Each chunk may contain embedded cross references to other chunks. In MIF) 72 395.33 P 0.04 (, an XrefSrcT) 412.02 395.33 P 0.04 (ext statement is) 469.89 395.33 P -0.05 (the pointer to the source paragraph - more precisely) 72 383.33 P -0.05 (, the chunk heading that this XrefSrcT) 300.93 383.33 P -0.05 (ext points to, will) 466.8 383.33 P 1.53 (have a corresponding \322MT) 72 371.33 P 1.53 (ext\323 statement with exactly the same string. Since a chunk is simply all the) 192.19 371.33 P 0.51 (\322code\323 paragraph strings concatenated together) 72 359.33 P 0.51 (, cross references are simply embedded into this stream,) 284.71 359.33 P (with a "\134200" character on either end, to identify it later) 72 347.33 T (.) 310.89 347.33 T 1.52 (Finally) 72 330.33 P 1.52 (, each of the top level chunks are taken in order \050top level chunks are those that haven\325t been) 100.15 330.33 P 1.83 (referred to by any other chunk\051, and expanded. The expansion process consists of substituting each) 72 318.33 P 0.94 (embedded reference by the appropriate chunk - this is a recursive process, since the chunk referred to) 72 306.33 P (may itself contain other embedded references.) 72 294.33 T 5 F (#/usr/local/bin/perl5) 90 257.33 T (#forwar) 90 233.33 T (d declarations.) 126.33 233.33 T (sub ParaMode;) 90 221.33 T (sub FileMode;) 90 209.33 T (sub CodeMode;) 90 197.33 T (sub ChunkMode;) 90 185.33 T (sub W) 90 173.33 T (asteMode;) 118.65 173.33 T (Initialize\050\051;) 90 149.33 T (# Start with the W) 90 125.33 T (aste State.) 173.11 125.33 T (W) 90 113.33 T (asteMode\050\051;) 99.1 113.33 T (# Main loop) 90 101.33 T (while \050$line = \051 {) 90 89.33 T (if \050Inter) 108 77.33 T (estingLine\050\051\051 {) 140.82 77.33 T 72 72 540 720 C 109.12 486 502.88 688 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 7 X 0 0 0 1 0 0 0 K 90 450 22 19 342.55 525.33 G 0.5 H 2 Z 0 X 90 450 22 19 342.55 525.33 A 285.55 513.33 334.55 535.33 R 7 X V N 329.43 508.62 326.11 513.78 331.67 511.17 330.55 509.89 4 Y 0 X V 330.56 509.89 330.56 509.89 2 L N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 7 X 90 450 22 19 342.55 584.22 G 0 X 90 450 22 19 342.55 584.22 A 285.55 572.22 334.55 594.22 R 7 X V N 329.43 567.51 326.11 572.67 331.67 570.05 330.55 568.78 4 Y 0 X V 330.56 568.78 330.56 568.78 2 L N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 7 X 90 450 22 19 342.55 644.78 G 0 X 90 450 22 19 342.55 644.78 A 285.55 632.78 334.55 654.78 R 7 X V N 329.43 628.06 326.11 633.22 331.67 630.61 330.55 629.33 4 Y 0 X V 330.56 629.33 330.56 629.33 2 L N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 3 10 Q (W) 130.98 581.45 T (aste) 140.05 581.45 T (Para) 208.55 581.45 T (File) 314.23 640.19 T (Code) 314.23 581.45 T (Chunk) 314.23 522.71 T 187.59 587.31 199.12 584 187.59 580.69 187.59 584 4 Y V 163.12 584 187.59 584 2 L N 5 7 Q (Para) 170.12 589 T 295.43 635.29 307.12 638 298.64 629.51 297.04 632.4 4 Y V 226.12 593 297.04 632.4 2 L N 174.66 571.69 163.12 575 174.66 578.31 174.66 575 4 Y V 174.66 575 199.12 575 2 L N (All other pgf tags) 153.12 565.34 T (PgfT) 226.28 614.83 T (ag File) 239.95 614.83 T (PgfT) 253.28 575.83 T (ag code) 266.95 575.83 T 295.59 587.31 307.12 584 295.59 580.69 295.59 584 4 Y V 235.12 584 295.59 584 2 L N 298.64 535.5 307.12 527 295.43 529.71 297.04 532.61 4 Y V 226.12 572 297.04 532.6 2 L N (PgfT) 226.28 540.34 T (ag chunk) 239.95 540.34 T (String) 334.28 668.83 T (Char T) 301.28 606.83 T (ab, String, Xr) 322.68 606.83 T (efSr) 364.68 606.83 T (cT) 376.98 606.83 T (ext) 384.14 606.83 T (MT) 319.28 546.83 T (ext , String) 328.35 546.83 T 429.2 572.8 441 575 432.16 566.89 430.68 569.84 4 Y V 345 527 430.68 569.84 2 L N 430.97 602.91 439.99 595 428.15 596.93 429.56 599.92 4 Y V 336 644 429.57 599.92 2 L N 426.46 586.31 438 583 426.46 579.69 426.46 583 4 Y V 342 583 426.46 583 2 L N (End of para) 385.28 586.83 T 3 10 Q (W) 443.58 581.45 T (aste) 452.65 581.45 T 72 72 540 720 C 0 0 612 792 C 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "10" 10 %%Page: "11" 11 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 11) 522.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X (# Call the curr) 126 713.33 T (ent mode pr) 193.33 713.33 T (oc \050one of ParaMode,FileMode, CodeMode, ChunkMode;) 253.93 713.33 T (# W) 126 701.33 T (asteMode, or W) 143.41 701.33 T (asteOneStringMode\051) 220.07 701.33 T (&{$currModePr) 126 689.33 T (oc}\050$line\051;) 199.17 689.33 T ( }) 108 677.33 T (}) 90 665.33 T (#All chunks have been slurped in.) 90 641.33 T (# Find out which chunks have been r) 90 617.33 T (eferr) 267.24 617.33 T (ed to by othe r chunks.) 289.36 617.33 T (for) 90 605.33 T (each $k \050keys %markerReferr) 102.66 605.33 T (ed\051 {) 241.57 605.33 T ($chunkReferr) 108 593.33 T (ed {$markerT) 171.5 593.33 T (oHeading{$k}} = 1;) 234.19 593.33 T (}) 90 581.33 T (# Can curr) 90 557.33 T (ently open only one \336le.) 140.67 557.33 T (open \050F) 90 545.33 T (, "> $currFile"\051 || die "Could not open $currFile for writing";) 126.06 545.33 T (# The "tangle" pr) 90 521.33 T (ocess. Expand each top level chunk) 168.23 521.33 T (for) 90 509.33 T (each $c \050@chunkHeadings\051 {) 102.66 509.33 T (if \050! $chunkReferr) 108 497.33 T (ed{$c}\051 {) 188.82 497.33 T (ChunkExpand \050$c\051;) 126 485.33 T ($chunksByName{$c} =~ s/\134\134xd\050[2345]\051 /$xlat[$1]/g; #T) 126 473.33 T (ranslate smart quotes) 385.59 473.33 T ($chunksByName{$c} =~ s/\134\134\134\134/\134\134/g; #Convert \134\134 to \134) 126 461.33 T ($chunksByName{$c} =~ s/\134\134>/>/g; # convert \134> to >) 126 449.33 T (print F $chunksByName{$c}, "\134n";) 126 437.33 T (}) 108 425.33 T (}) 90 413.33 T (close \050F\051;) 90 389.33 T (exit \0500\051;) 90 377.33 T (#--------------------------------------------------------------------------------------------------------------) 90 353.33 T (sub) 90 329.33 T 1 F (ChunkExpand) 109.55 329.33 T 5 F ( {) 177.75 329.33 T ( local \050$heading\051 = @_;) 108 317.33 T ( print "ChunkExpand : $heading \134n" if $debugging;) 108 293.33 T ( if \050de\336ned \050$chunksByName{$heading}\051\051 {) 108 269.33 T (# For each embedded marker found, call CHunkExpand r) 126 257.33 T (ecursively.) 404.69 257.33 T (# Note the /e option below.) 126 245.33 T (1 while) 126 233.33 T ( \050$chunksByName{$heading} =~) 126 221.33 T (s/\134200\050[^\134200]*\051\134200/ChunkExpand\050$markerT) 144 209.33 T (oHeading{$1}\051/e\051;) 364.28 209.33 T (r) 126 197.33 T (etur) 128.97 197.33 T (n $chunksByName{$heading};) 148.16 197.33 T ( } else {) 108 185.33 T (r) 126 173.33 T (etur) 128.97 173.33 T (n "??$heading??"; # T) 148.16 173.33 T (o indicate an unr) 251.12 173.33 T (esolved cr) 334.2 173.33 T (oss r) 384.23 173.33 T (efer) 404.28 173.33 T (ence.) 423.39 173.33 T ( }) 108 161.33 T (}) 90 149.33 T (sub) 90 125.33 T 1 F (W) 109.55 125.33 T (asteMode) 118.05 125.33 T 5 F ( {) 166.85 125.33 T ( local \050$ev\051 = @_;) 108 113.33 T ( if \050! de\336ned $ev\051 {) 108 101.33 T (@lookFor = \050$P) 126 89.33 T (ARA\051;) 195.21 89.33 T ($currModePr) 126 77.33 T (oc = \134&W) 188.09 77.33 T (asteMode;) 235.43 77.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "11" 11 %%Page: "12" 12 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 12) 522.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X (r) 126 713.33 T (etur) 128.97 713.33 T (n;) 148.16 713.33 T ( }) 108 701.33 T (ParaMode\050\051;) 108 677.33 T (}) 90 665.33 T (sub) 90 641.33 T 1 F (ParaMode) 109.55 641.33 T 5 F ( {) 159.95 641.33 T (local \050$ev\051 = @_;) 108 629.33 T (if \050! de\336ned $ev\051 {) 108 617.33 T (@lookFor = \050"^ *$/ \051 {) 108 305.33 T ($currFile = $1;) 126 293.33 T ( } else { # End of para) 108 281.33 T (W) 126 269.33 T (asteMode\050\051;) 135.1 269.33 T (}) 108 257.33 T (}) 90 245.33 T (sub) 90 221.33 T 1 F (CodeMode) 109.55 221.33 T 5 F ( {) 165.15 221.33 T ( local \050$ev, $h\051 = @_;) 108 209.33 T (if \050! de\336ned $ev\051 {) 108 197.33 T (@lookFor = \050"^ *$/\051 {) 108 101.33 T ($chunksByName{$currChunkHeading} .= "$1"; # Concatenate code to curr) 126 89.33 T (ent chunk) 486.22 89.33 T (} elsif \050\050$h\051 = \050$ev =~ /^ *$/\051\051 {) 274.05 77.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "12" 12 %%Page: "13" 13 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 13) 522.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X ($markerReferr) 126 713.33 T (ed{$h} = 1; # Mark this chunk r) 193.48 713.33 T (efer) 336.95 713.33 T (ence as "r) 356.06 713.33 T (eferr) 403.94 713.33 T (ed to") 426.06 713.33 T (# Put the text in as an embedded r) 126 701.33 T (efer) 294.12 701.33 T (ence) 313.23 701.33 T ($chunksByName{$currChunkHeading} .= "\134200$h\134200\134n";) 126 689.33 T (# The next string is the string of the cr) 126 677.33 T (oss r) 301.33 677.33 T (efer) 321.38 677.33 T (ence itself - having embedded the) 340.49 677.33 T (# cr) 126 665.33 T (oss r) 143.75 665.33 T (efer) 163.8 665.33 T (ence itself, we ar) 182.91 665.33 T (e not inter) 265.08 665.33 T (ested in this string.) 314.12 665.33 T (W) 126 653.33 T (asteOneStringMode\050\051;) 135.1 653.33 T ( } elsif \050$ev =~ /$ENDOFP) 108 641.33 T (ARA/o\051 {) 225.1 641.33 T (# Assuming that each line of the code is in one "code" para . T) 126 629.33 T (ime to append a) 426.54 629.33 T (# newline) 126 617.33 T ($chunksByName{$currChunkHeading} .= "\134n";) 126 605.33 T (W) 126 593.33 T (asteMode\050\051;) 135.1 593.33 T ( }) 108 581.33 T (}) 90 569.33 T (sub) 90 545.33 T 1 F (W) 109.55 545.33 T (asteOneStringMode) 118.05 545.33 T 5 F ( {) 214.05 545.33 T (# Called fr) 108 533.33 T (om CodeMode above.) 157.5 533.33 T ( local \050$ev\051 = @_;) 108 521.33 T ( if \050! de\336ned $ev\051 {) 108 509.33 T (@lookFor = \050"^ *$/\051 {) 194.08 305.33 T ($currMarkerT) 126 293.33 T (ext = $1;) 187.44 293.33 T ( } elsif \050$ev =~ /^ *$/ \051 {) 108 281.33 T ($currChunkHeading .= $1;) 126 269.33 T ( } else {) 108 257.33 T (# End of chunk para.) 126 245.33 T (print "ChunkMode : $1 \134n" if $debugging;) 126 233.33 T (if \050! de\336ned $chunksByName{$currChunkHeading}\051 {) 126 221.33 T (# Init the curr) 144 209.33 T (ent chunk with blank code.) 206.12 209.33 T ($chunksByName{$currChunkHeading} = "";) 144 197.33 T (}) 126 185.33 T (if \050! de\336ned $headingSeenBefor) 126 173.33 T (e{$currChunkHeading}\051 {) 279.39 173.33 T (# New chunk heading name seen.) 144 161.33 T ( push \050@chunkHeadings, $currChunkHeading\051;) 144 149.33 T ( $headingSeenBefor) 144 137.33 T (e{$currChunkHeading} = 1;) 242.4 137.33 T (}) 126 125.33 T (if \050$currMarkerT) 126 113.33 T (ext ne ""\051 {) 199.04 113.33 T (# cr) 144 101.33 T (oss r) 161.75 101.33 T (efer) 181.8 101.33 T (ence between marker text and the actual heading) 200.91 101.33 T ($markerT) 144 89.33 T (oHeading{$currMarkerT) 187.06 89.33 T (ext} = $currChunkHeading;) 300.4 89.33 T (}) 126 77.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "13" 13 %%Page: "14" 14 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 0 0 0 1 1 1] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 8 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 10 Q 0 X 0 0 0 1 0 0 0 K (.. 14) 522.5 36 T 0 0 0 1 0 0 0 K 33 54 597 54 2 L 3 H 2 Z 4 X N 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 5 F 0 X (W) 126 713.33 T (asteMode\050\051;) 135.1 713.33 T (}) 108 701.33 T (}) 90 689.33 T (sub) 90 665.33 T 1 F (Inter) 109.55 665.33 T (estingLine) 130.87 665.33 T 5 F ( {) 178.87 665.33 T (# Does the line belong to any of the lookahead tokens?) 108 653.33 T (for) 108 641.33 T (each $l \050@lookFor\051 {) 120.66 641.33 T (if \050$line =~ /$l/\051 {) 126 629.33 T (r) 144 617.33 T (etur) 146.97 617.33 T (n $l;) 166.16 617.33 T (}) 126 605.33 T ( }) 108 593.33 T (r) 108 581.33 T (etur) 110.97 581.33 T (n undef;) 130.16 581.33 T (}) 90 569.33 T (sub) 90 545.33 T 1 F (Initialize) 109.55 545.33 T 5 F ( {) 148.55 545.33 T ($debugging = 0; # Change to 1 to get a trace.) 108 533.33 T ($currFile = "-";) 108 521.33 T (# Output to stdout) 171.33 521.33 T ($P) 108 509.33 T (ARA = \325^ * # end of Para\325;) 152.46 497.33 T (#T) 108 473.33 T (ranslation table for smart quotes.) 117.5 473.33 T ($xlat[2] = "\134"";) 108 461.33 T ($xlat[3] = "\134"";) 108 449.33 T ($xlat[4] = "\134\325";) 108 437.33 T ($xlat[5] = "\134\325";) 108 425.33 T (# Start of) 108 401.33 T (f with a default chunk heading, in case the pr) 150.4 401.33 T (ogrammer starts of) 371.1 401.33 T (f code without) 462.13 401.33 T (# a chunk heading) 108 389.33 T ($currChunkHeading = " DEF) 108 377.33 T (AUL) 264.82 377.33 T (T ";) 282.93 377.33 T ($chunksByName {$currChunkHeading} = "";) 108 365.33 T (push \050@chunkHeadings, $currChunkHeading\051;) 108 353.33 T (}) 90 341.33 T 0 0 0 1 0 0 0 K FMENDPAGE %%EndPage: "14" 14 %%Trailer %%BoundingBox: 0 0 612 792 %%PageOrder: Ascend %%Pages: 14 %%DocumentFonts: Times-Roman %%+ AvantGarde-Demi %%+ Helvetica-Bold %%+ Helvetica %%+ Helvetica-Oblique %%+ AvantGarde-Book %%+ Times-Bold %%+ Courier %%+ AvantGarde-BookOblique %%EOF